ISCC Discovery Protocol#
| IEP: | 0013 |
|---|---|
| Title: | ISCC Discovery Protocol |
| Author: | Titusz Pan tp@iscc.io |
| Comments: | https://github.com/iscc/iscc-ieps/issues/18 |
| Status: | Draft |
| Type: | Core |
| Standard: | IEP |
| License: | CC-BY-4.0 |
| Created: | 2022-09-28 |
| Updated: | 2026-07-03 |
Note
This document is a DRAFT intended as input to ISO TC 46/SC 9/WG 18 for a future revision of ISO 24138.
1. Introduction#
This proposal defines the ISCC Discovery Protocol (IDP), an open and federated protocol that associates content identified by ISCC-CODEs with declaring parties, metadata, and services.
An ISCC-CODE is derived deterministically from digital content. Two parties that process the same content independently derive the same ISCC-CODE. Identity, rights, and provenance information cannot be inferred from the code itself - it has to be declared. The IDP provides the protocol surface for such declarations in a way that is:
- cryptographically attributable to the declarer (Ed25519 signature);
- verifiable independently of any single server (signed receipts and transparency logs);
- replay-protected (hub-bound nonces and hub-issued timestamps).
This document specifies the protocol framework and the message formats IsccNote and
IsccNoteDelete. The transparency log is specified in IEP-0014. The ISCC-ID
identifier is specified in IEP-0011.
2. Terminology#
Declarer : The entity that creates and signs an IsccNote.
ISCC-HUB : A server that accepts signed declarations, issues ISCC-IDs, and maintains a transparency log.
Gateway : An external service that resolves ISCC-IDs to metadata and service descriptors.
HUB-LIST : The mapping of HUB-IDs to ISCC-HUB base URLs, scoped per realm.
JCS : JSON Canonicalization Scheme as defined in RFC 8785.
Multihash : Self-describing hash format. In this specification, multihash always denotes BLAKE3
with prefix 1e20 followed by 32 digest bytes in lowercase hexadecimal (68 characters total).
Multibase : Self-describing base-encoding format. In this specification, multibase strings use
the z prefix indicating base58-btc encoding.
3. Architecture#
The IDP is operated by a federation of independent ISCC-HUBs. Each ISCC-HUB is identified by a HUB-ID within a realm and listed in the HUB-LIST together with its base URL. An ISCC-HUB shall publish its Ed25519 public key as a verification method in the DID document of its domain, resolved via the did:web method. Key rotation and revocation are managed in the DID document in accordance with Controlled Identifiers v1.0.
A declaration proceeds as follows:
- The declarer computes an ISCC-CODE and a BLAKE3
datahashfor the content. - The declarer selects a target ISCC-HUB from the HUB-LIST and constructs an
IsccNotewhosenonceis bound to the target HUB-ID. - The declarer canonicalizes and signs the
IsccNoteand submits it to the ISCC-HUB. - The ISCC-HUB validates the
IsccNote, atomically issues an ISCC-ID, and appends the declaration to its transparency log. - The declarer retrieves a signed
IsccReceiptas durable proof of the declaration.
ISCC-HUBs do not store descriptive metadata. Metadata is hosted at gateways referenced by the declaration; the declaration may commit to metadata only by hash.
4. Messages#
JSON schemas for IDP messages are published under the http://purl.org/iscc/schema/ namespace. Each
message identifies the schema version it conforms to in its $schema field.
4.1 Field Encodings#
The following encodings apply to all message fields:
| Encoding | Definition |
|---|---|
| multihash | 1e20 followed by 64 lowercase hexadecimal characters (BLAKE3, 256-bit digest) |
| nonce | 32 lowercase hexadecimal characters (128 bits) |
| timestamp | RFC 3339 UTC timestamp YYYY-MM-DDTHH:MM:SS.sssZ with exactly 3-digit milliseconds |
| multibase | z followed by base58-btc encoded bytes |
| ISCC values | canonical form as specified in IEP-0001 |
4.2 IsccSignature#
An IsccSignature is an ISCC signature object as specified in IEP-0019. Within the
IDP, pubkey shall be present (signature types SELF_VERIFYING or IDENTITY_BOUND), so that signed
messages remain verifiable from the transparency log alone.
4.3 IsccNote#
An IsccNote is a signed claim by a declarer that an ISCC-CODE applies to the content identified by
datahash:
| Field | Presence | Type | Definition |
|---|---|---|---|
$schema |
mandatory | URI | Shall equal the published IsccNote schema URI |
iscc_code |
mandatory | ISCC-CODE | The composite ISCC-CODE being declared |
datahash |
mandatory | multihash | Hash of the content bytes |
nonce |
mandatory | nonce | Replay-protection value bound to the target hub |
signature |
mandatory | IsccSignature | Declarer signature over the canonical IsccNote |
timestamp |
optional | timestamp | Declarer-supplied UTC timestamp |
gateway |
optional | URI | Service endpoint for metadata resolution |
metahash |
optional | multihash | Hash commitment to associated metadata |
units |
recommended | array | 1 to 4 ISCC-UNITs of the declared ISCC-CODE |
An IsccNote shall satisfy the following constraints:
$schemashall equal the URI of a published IsccNote schema.iscc_codeshall be a composite ISCC-CODE, not an individual ISCC-UNIT.units, if present, shall not include the Instance-Code. The provided units together with the Instance-Code derived fromdatahashshall reconstruct the declarediscc_code.gateway, if present, shall be an absolute HTTPS URL or an RFC 6570 URI template using only the variables{iscc_id},{iscc_code}, and{datahash}, without userinfo, query, or fragment components. Template variables expand to lowercase values without theISCC:prefix.metahash, if present, shall equal the Meta-Hash of the seed metadata it commits to, generated according to IEP-0002 - Meta-Hash processing.- Fields not listed above shall not be present.
An IsccNote should include the ISCC-UNITs of the declared iscc_code, each with a length of 256
bits. Services that match or index declarations across ISCC-HUBs may disregard declarations that do
not include 256-bit ISCC-UNITs.
NOTE 1: A composite ISCC-CODE carries only truncated ISCC-UNIT digests. Full-length ISCC-UNITs substantially reduce false positives in similarity matching at global scale.
NOTE 2: The metahash commitment cannot be verified by the ISCC-HUB, which does not receive the metadata. Verification is performed by consumers that retrieve the metadata, for example via the gateway.
IsccNote example (live declaration ISCC:MEIGKV5N6NTVF4AB)
{
"$schema": "http://purl.org/iscc/schema/iscc-note-0.8.0.json",
"iscc_code": "ISCC:KADT6NPTBFIU53VEUP3BSQ4YHYFYD3C5RT5EQPSTES3V5G2VJ52JAJOPS65J2VAOK5SQ",
"datahash": "1e20cf97ba9d540e5765f8e47fb42136fb4ff667e8f20d439bcd7ead098fad095a92",
"metahash": "1e20388260ef011e520c6514f29d68039d8b0c5af12f20b3b72a2f2117068483ea64",
"nonce": "0010000063727970746f62696f736973",
"timestamp": "2026-06-30T16:14:39.067Z",
"gateway": "https://titusz.org/iscc/gateway/{iscc_id}.json",
"units": [
"ISCC:AADT6NPTBFIU53VEZGINV746IGBOTLM77N7JXIC7DALQS3N7NWBZEPI",
"ISCC:CAD2H5QZIOMD4C4BV55BM33UVL3TTI47NSYXNYD2KXGCCQLICVGCK6Q",
"ISCC:EAD6YXMM7JED4UZECPWP5SS7T3YVDDJYI4WPQJ7BI3HIZ55KQEZ7N6Q",
"ISCC:GAD3OXU3KVHXJEBFGCDJSCY5R2SRDFDNSTBZ2DBPTRXHLFXMWH3GMEQ"
],
"signature": {
"version": "ISCC-SIG v1.0",
"controller": "did:web:titusz.org",
"keyid": "iscc",
"pubkey": "z6MkwXToTYfY3rdjWYjD8hvhXWJqsBaghga7QU9PSn3xW9gA",
"proof": "zYZ1aqJVqBXKKssC1fcwa5gU9TpxC3MUmdt6tyxSyFF1DLfHNTDuyU7HCv8NcJQkqSaFfkf3h66jeZhnvcZrX1qg"
}
}
4.4 IsccNoteDelete#
An IsccNoteDelete is a signed request to delete a previously committed declaration:
| Field | Presence | Type | Definition |
|---|---|---|---|
$schema |
mandatory | URI | Shall equal the published IsccNoteDelete schema URI |
iscc_id |
mandatory | ISCC-ID | The ISCC-ID being deleted |
nonce |
mandatory | nonce | Replay-protection value bound to the target hub |
signature |
mandatory | IsccSignature | Declarer signature over the canonical IsccNoteDelete |
timestamp |
optional | timestamp | Declarer-supplied UTC timestamp |
An IsccNoteDelete shall satisfy the following constraints:
$schemashall equal the URI of a published IsccNoteDelete schema.signature.pubkeyshall equal thesignature.pubkeyof the originalIsccNotethat produced theiscc_id.- Fields not listed above shall not be present.
IsccNoteDelete example
{
"$schema": "http://purl.org/iscc/schema/iscc-note-delete-0.8.0.json",
"iscc_id": "ISCC:MAIGKJIY75NUVAAB",
"nonce": "001d17437f53f6899ed01ecb8659118b",
"timestamp": "2026-05-22T08:15:00.000Z",
"signature": {
"version": "ISCC-SIG v1.0",
"controller": "did:web:example.com",
"pubkey": "z6MkmeDbeC5BecFmVnTHA5PWEBaVUrGLdB3weGE2KYnXfHso",
"proof": "z5j9nrpPw3oYSAN4XbCvk2sUtkwrueTD6V2Y35gS1KFTode2ED2YQWokPmoXw6QBYtYEFxtAQfzBhdNyr8PMwP79G"
}
}
4.5 Canonicalization and Signing#
All signed objects shall be canonicalized with JCS (RFC 8785) and encoded as UTF-8.
An IsccNote or IsccNoteDelete shall be signed and verified in accordance with
IEP-0019.
5. Hub Interface#
A conforming ISCC-HUB shall expose the following HTTP endpoints:
| Endpoint | Function |
|---|---|
POST /declaration |
Submit an IsccNote |
GET /declaration/{iscc_id}/receipt |
Retrieve the signed IsccReceipt for a declaration |
DELETE /declaration/{iscc_id} |
Submit an IsccNoteDelete |
GET /{iscc_id} |
Resolve an ISCC-ID to its declaration record |
5.1 Declaration#
Upon receiving an IsccNote, an ISCC-HUB shall:
- Validate the structure of the
IsccNoteagainst the schema referenced by its$schemafield and the constraints of this document. - Verify that the first 12 bits of the
nonceequal its own HUB-ID. - Verify the declarer signature.
- Verify that the
noncehas not been used in a previously accepted message. - Within a single atomic transaction: assign a microsecond timestamp strictly greater than the most recent prior timestamp, compose the ISCC-ID from the timestamp and its HUB-ID in accordance with IEP-0011, and append the declaration to its transparency log with a gapless zero-based sequence number.
- Return the assigned ISCC-ID and sequence number.
If any verification step fails, the ISCC-HUB shall reject the submission and shall report an error.
An ISCC-HUB may enforce additional acceptance policies (for example declarer identity verification). Such policies shall only narrow what the published schemas permit.
5.2 Receipt#
An ISCC-HUB shall make a signed IsccReceipt retrievable for every accepted declaration. The
IsccReceipt is a W3C Verifiable Credential issued by the ISCC-HUB that contains the sequence
number, the assigned ISCC-ID, and the verbatim IsccNote. Any party holding the receipt and the
ISCC-HUB public key from the ISCC-HUB's DID document can verify the declaration without contacting
the ISCC-HUB.
5.3 Deletion#
Upon receiving an IsccNoteDelete, an ISCC-HUB shall validate it in accordance with this document,
verify that its signature.pubkey equals the signature.pubkey of the original declaration, and
append a deletion entry to its transparency log. The original declaration entry shall remain in the
log. Subsequent resolution of the deleted ISCC-ID shall reflect the deletion.
6. Replay Protection#
The nonce provides replay protection in two dimensions:
- Cross-hub: The first 12 bits of the
nonceshall equal the HUB-ID of the target ISCC-HUB. A message signed for one ISCC-HUB is therefore not acceptable to any other. - Per-hub: An ISCC-HUB shall reject any message whose
noncewas used in a previously accepted message.
Declarers shall generate the remaining 116 bits of the nonce from a cryptographically secure
random source.
7. Security Considerations#
Implementations shall use a well-reviewed Ed25519 library and shall reject signatures with malleable encodings (RFC 8032). JCS-canonicalized bytes are the integrity anchor of every signed object; implementations should verify their JCS implementation against the test vectors of RFC 8785. A compromised declarer key permits declaration and deletion on the declarer's behalf; mitigation is key rotation in the declarer's controller document. A compromised ISCC-HUB key permits forged receipts; the transparency log (IEP-0014) and key rotation in the ISCC-HUB's DID document limit the impact.
8. References#
8.1 Normative#
- IEP-0001 - ISCC Structure and Format
- IEP-0002 - ISCC Meta-Code
- IEP-0011 - ISCC-ID
- IEP-0014 - ISCC Transparency Log
- IEP-0019 - ISCC Signature
- RFC 3339 - Date and Time on the Internet: Timestamps
- RFC 6570 - URI Template
- RFC 8032 - Edwards-Curve Digital Signature Algorithm (EdDSA)
- RFC 8785 - JSON Canonicalization Scheme (JCS)
- CID 1.0 - Controlled Identifiers v1.0
- did:web - did:web Method Specification
8.2 Informative#
- ISO 24138:2024 - International Standard Content Code
- Reference implementation: https://github.com/iscc/iscc-hub