Download OpenAPI specification:
Everything a verifier needs, without an account.
The public verification surface: unauthenticated, CDN-cached, and never rate-limited so as to block a checker. It answers three questions, each with a signed statement — is this the real business, is this record what the business published, and did the business ever say this — and serves every key, certificate, projection specification, log checkpoint and proof a verifier needs. Requiring an account to verify is the mistake this surface does not make.
Every lookup about a record requires possession of the record — its bytes or its hash,
never a bare id — so the public surface cannot be used as an oracle for which ids exist. The same paths are also served on api.masterdb.ai.
CORS: every route answers any origin (Access-Control-Allow-Origin: *, the
preflight for POST /v1/verify included) and never allows credentials — the surface is
public and the same for every caller, so a browser page may read the AI policy key, the key
set, a certificate or a vocabulary, and post a record or an ad item to POST /v1/verify.
Returns the ADL certificate of a business or an AI company — a DSSE envelope signed by
MasterDB's issuance key — with its status, the date that status took effect, and the
statement in plain words ("Verified by MasterDB on 25 June 2026."). The certificate says
who the subject is, its legal name and country, that MasterDB verified it and since when,
and its status — never how it was verified. A certificate revoked for compromise says so with the effective
date; a closed business says closed on, and its history stays valid. A certificate
MasterDB withdrew (withdrawn, with its status_reason, e.g. approval_reversed — a
reversed verification approval) no longer stands from its effective date; it is
not a compromise, and seals made before it stay valid. Every earlier
issuance comes with it, newest first, each with its cert_id: a seal names the issuance
it was made under and is judged against the one in force at sealed_at, and a
revocation's effective date may precede its issue. Public by design.
For a person (not part of the API). A browser sending Accept: text/html, or ?format=html, receives a
human-readable page instead; this is not part of the API, and the response below is always the JSON. The page is a simple one:
the legal name, the country, the verification status and since when (and nothing on how the
subject was verified, and no trading name, which MasterDB does not verify), the certificate id,
the issuer and its validity, and how to check
the certificate (a link to the JSON and to docs.masterdb.ai). The page is one self-contained
document: inline CSS, no script and no external request, served with a content-security-policy
that allows nothing else. Every other caller — no Accept, */*, application/json, or
?format=json — gets the JSON below, byte for byte as it was before the page existed. The
response varies by Accept. A browser that asks for the page of an unknown certificate gets
a short HTML page with the same 404.
| uuid required | string (Uuid) ^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][... Example: 0b7d6c3e-2f4a-4c1b-9d8e-7f6a5b4c3d2e A |
{- "subject": "business",
- "status": "active",
- "status_effective_from": "2026-06-25T10:00:00.000Z",
- "statement": "Verified by MasterDB on 25 June 2026.",
- "cert_id": "sha256:9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08",
- "issued_at": "2026-06-25T10:00:00.000Z",
- "certificate": {
- "payloadType": "application/vnd.masterdb.certificate.v1+json",
- "payload": "eyJ2IjoxLCJidXNpbmVzc191dWlkIjoiMGI3ZCJ9",
- "signatures": [
- {
- "keyid": "arnx6499M4j0-dWG9m6Z_VQIDfLERvDlhmiwnAihbdA",
- "sig": "MEUCIQDx"
}
]
}, - "history": [
- {
- "cert_id": "sha256:9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08",
- "status": "active",
- "status_effective_from": "2026-06-25T10:00:00.000Z",
- "issued_at": "2026-06-25T10:00:00.000Z",
- "certificate": {
- "payloadType": "application/vnd.masterdb.certificate.v1+json",
- "payload": "eyJ2IjoxLCJidXNpbmVzc191dWlkIjoiMGI3ZCJ9",
- "signatures": [
- {
- "keyid": "arnx6499M4j0-dWG9m6Z_VQIDfLERvDlhmiwnAihbdA",
- "sig": "MEUCIQDx"
}
]
}
}
]
}A business's public keys beside its certificate, so a seal can be verified
offline from public data alone: every sealing passkey and integration key its register
has held, current and past — an old seal is judged against the key as it was at
sealed_at — each with its key_id (the RFC 7638 thumbprint of the key), purpose
(sealing: a person's passkey; integration: a business system's key), kind, the
public key as a JWK (a passkey also as registered, COSE) and the instants that bound it.
Nothing names a person. signed is a DSSE envelope (business-keys.v1) by MasterDB's
statement key over {v: 1, uuid, cert_id, issued_at, keys}; it is the only part a
verifier trusts (the verifier libraries' verifyPublishedKeys / verify_published_keys,
and publishedKeys / published_keys on the seal check). An AI company's uuid answers
404, as an unknown one does.
| uuid required | string (Uuid) ^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][... Example: 0b7d6c3e-2f4a-4c1b-9d8e-7f6a5b4c3d2e A |
{- "uuid": "0b7d6c3e-2f4a-4c1b-9d8e-7f6a5b4c3d2e",
- "cert_id": "sha256:9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08",
- "issued_at": "2026-10-01T12:00:00.000Z",
- "keys": [
- {
- "key_id": "arnx6499M4j0-dWG9m6Z_VQIDfLERvDlhmiwnAihbdA",
- "purpose": "sealing",
- "kind": "passkey",
- "jwk": {
- "kty": "EC",
- "crv": "P-256",
- "x": "f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU",
- "y": "x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0"
}, - "cose": "pQECAyYgASFYIH_NzidwJ3...",
- "valid_from": "2026-08-01T00:00:00.000Z",
- "valid_until": null,
- "revocation_effective_from": null
}, - {
- "key_id": "7Hs2pQ9vLm4xZk1Nt8Rc5Yw3Bf6Ju0Ea2Di7Go9Ks1M",
- "purpose": "integration",
- "kind": "ed25519",
- "jwk": {
- "kty": "OKP",
- "crv": "Ed25519",
- "x": "11qYAYKxCrfVS_7TyWQHOg7hcvPapiMlrwIaaPcHURo"
}, - "valid_from": "2026-08-15T00:00:00.000Z",
- "valid_until": null,
- "revocation_effective_from": null
}
], - "signed": {
- "payloadType": "application/vnd.masterdb.business-keys.v1+json",
- "payload": "eyJ2IjoxLCJ1dWlkIjoiMGI3ZCJ9",
- "signatures": [
- {
- "keyid": "QmStatementKeyThumbprint0000000000000000000",
- "sig": "c2lnbmF0dXJl"
}
]
}
}MasterDB's signed word on who holds the private half of each of a business's keys,
beside its certificate: hosted — the key MasterDB issued to the verified business and
holds for it (standard publishing: a seal by it proves MasterDB signed on a confirmed
request of a person with a grant, not that a person of the business signed) — or self,
a key the business holds (a person's passkey, an integration key). Each statement is a
DSSE envelope (key-custody.v1) signed, like the certificate, by both halves of MasterDB's
issuance key over {v: 1, business_uuid, key_id, custody, issued_at, effective_from}; it
is the only part a verifier trusts (the verifier libraries' verifyKeyCustodyStatements /
verify_key_custody_statements, and keyCustody / key_custody on the seal check,
which then names the custody of the seal's key at sealed_at). Every issuance is listed,
newest first, each served byte for byte as issued: a statement is re-issued, never edited,
when a key's custody changes, and the one in force at an instant is the latest
effective_from at or before it. A key with no statement is not listed, and a verifier
reports it unstated. A business with none yet answers an empty list; an AI company's
uuid answers 404, as an unknown one does. Custody is a statement of its own because
certificate.v1 admits no new member; certificate v2 carries it (verifier 1.1).
| uuid required | string (Uuid) ^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][... Example: 0b7d6c3e-2f4a-4c1b-9d8e-7f6a5b4c3d2e A |
{- "uuid": "0b7d6c3e-2f4a-4c1b-9d8e-7f6a5b4c3d2e",
- "statements": [
- {
- "key_id": "7Hs2pQ9vLm4xZk1Nt8Rc5Yw3Bf6Ju0Ea2Di7Go9Ks1M",
- "custody": "hosted",
- "effective_from": "2026-10-03T09:00:00.000Z",
- "issued_at": "2026-10-03T09:00:00.000Z",
- "statement_id": "sha256:2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae",
- "statement": {
- "payloadType": "application/vnd.masterdb.key-custody.v1+json",
- "payload": "eyJ2IjoxLCJidXNpbmVzc191dWlkIjoiMGI3ZCJ9",
- "signatures": [
- {
- "keyid": "arnx6499M4j0-dWG9m6Z_VQIDfLERvDlhmiwnAihbdA",
- "sig": "MEUCIQDx"
}, - {
- "keyid": "QmIssuanceMlDsaHalfThumbprint00000000000000",
- "sig": "c2lnbmF0dXJl"
}
]
}
}, - {
- "key_id": "arnx6499M4j0-dWG9m6Z_VQIDfLERvDlhmiwnAihbdB",
- "custody": "self",
- "effective_from": "2026-08-01T00:00:00.000Z",
- "issued_at": "2026-09-20T10:00:00.000Z",
- "statement_id": "sha256:fcde2b2edba56bf408601fb721fe9b5c338d10ee429ea04fae5511b68fbf8fb9",
- "statement": {
- "payloadType": "application/vnd.masterdb.key-custody.v1+json",
- "payload": "eyJ2IjoxLCJidXNpbmVzc191dWlkIjoiMGI3ZCJ9",
- "signatures": [
- {
- "keyid": "arnx6499M4j0-dWG9m6Z_VQIDfLERvDlhmiwnAihbdA",
- "sig": "MEUCIQDy"
}, - {
- "keyid": "QmIssuanceMlDsaHalfThumbprint00000000000000",
- "sig": "c2lnbmF0dXJm"
}
]
}
}
]
}Checks a record you hold against its seal: the seal's signature against the business's
key register as it stood at sealed_at, the hash over the exact bytes (or, for a
pushed record, its inclusion proof in the sealed batch), the certificate in force at
sealed_at, the AI policy version in force at sealed_at, and the scope — the
key's mandate, or with the record's sidecar the person's grant at acceptance. Send an
index row as well and it is checked too: its projection signature, that it came from
these bytes, and — with the sidecar — a re-run of the published projection compared byte
for byte. Send the business's sealed AI policy record (a fetch's ai_policy.record, its
exact bytes, and ai_policy.seal) with the ai_policy_bits a search row carried, and the
bits are checked against the sealed named booleans: the answer's ai_policy_bits. The answer is a statement signed by MasterDB's statement key; a check that fails
is a 200 with valid: false and the reason, the same reason codes the open-source
verifiers use. You must send the record itself; a bare id is never accepted, so nobody
can use this to learn which records exist, and nothing here says whether a record is
served. The log inclusion is the seal's own leaf in the transparency log — a
seal leaf over the SHA-256 of the canonical seal object, as publish appends it —
proven against a signed checkpoint; leaves are sequenced hourly, so a fresh seal is
not_in_log for up to an hour. The seal key's own key_added leaf is checked too
(checks.key_event): recomputed from the business's register and proven from the log, ok
with key_event saying where it is, or missing with a line in warnings — the seal stands,
unless the request says key_events: require, which refuses it (key_event_missing).
Or send an ad pool item alone, exactly as POST /v1/ads/pool served it (ad_item): its sealed bytes, the seal inside its signed row and the row are checked as above, the
answer's ad says whether every text and link the item would show is the sealed one, and
ai_policy_bits checks the advertiser's AI policy the item carries.
object An ad exactly as | |
| record_base64 | string <base64> <= 204800 characters |
object or object (RecordSeal) | |
object An index row as served, to re-run the projection against. | |
object (Envelope) The record version's sidecar ( | |
object (AiPolicyBits) The | |
| key_events | string Enum: "warn" "require" What to do when the seal's key has no |
{- "record_base64": "eyJzY2hlbWEiOiJtYXN0ZXJkYi9wcm9kdWN0cy8xIn0=",
- "seal": {
- "payloadType": "application/vnd.masterdb.seal.v2+json",
- "payload": "eyJ2IjoyfQ==",
- "signatures": [
- {
- "keyid": "0aWsmgFfrC73s0FnNjVRKhUR9B_jfREbJn8DnuxdT1g",
- "sig": "3q2+7w=="
}
]
}
}{- "seal": {
- "valid": true,
- "path": "B",
- "key_id": "0aWsmgFfrC73s0FnNjVRKhUR9B_jfREbJn8DnuxdT1g",
- "cert_id": "sha256:9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08",
- "business_uuid": "0b7d6c3e-2f4a-4c1b-9d8e-7f6a5b4c3d2e",
- "sealed_at": "2026-09-30T08:14:59.120Z",
- "record_type": "products",
- "ai_policy_version": 1,
- "format": 2,
- "checks": {
- "signature": "ok",
- "hash": "ok",
- "inclusion": "not_applicable",
- "schema": "ok",
- "key_validity": "ok",
- "certificate": "ok",
- "ai_policy": "ok",
- "scope": "not_checked"
}
}, - "log_inclusion": {
- "included": false,
- "reason": "log_not_available"
}, - "statement": {
- "payloadType": "application/vnd.masterdb.verify-statement.v1+json",
- "payload": "eyJ2YWxpZCI6dHJ1ZX0=",
- "signatures": [
- {
- "keyid": "arnx6499M4j0-dWG9m6Z_VQIDfLERvDlhmiwnAihbdA",
- "sig": "3q2+7w=="
}
]
}
}Where a source line's verify URL lands (the specification is
): the one line of provenance an AI cites — record, origin,
cert, served, verify. It answers whether the business published a record with
this id and these exact bytes, whether that version was the one served at served_at,
whether the line's certificate is the one the seal named, and the business's
certificate today; for a Business & Brand Identity file served now, its
authorised-endpoints section as MasterDB stands behind it today and when control of
each domain was last confirmed. HTML for a person, JSON for a machine;
the JSON carries the answer signed by the statement key as its own payload type,
application/vnd.masterdb.verify-page.v1+json (never verify-statement, which is
POST /v1/verify's answer alone). An unknown id and a hash that does not match answer the same
404, so the page is no oracle for which records exist. The full cryptographic check
is POST /v1/verify with the record's bytes and its seal.
| record_id required | string (RecordId) ^(?:mdb_[a-z2-7]{26}|(?:bf|evt|job|upd|ad|aip... Example: bf_sqtfovjvveefzuq25eegf2 The record id a source line cites. |
| origin required | string (Sha256) ^sha256:[0-9a-f]{64}$ Example: origin=sha256:9f2c4e1a7b3d5f6e8a0c2b4d6f8e1a3c5b7d9f0e2a4c6b8d0f1e3a5c7b9d2f4e The record's |
| cert | string (Sha256) ^sha256:[0-9a-f]{64}$ The |
| served_at | string <date-time> When the record was served (the receipt's |
| format | string Enum: "html" "json"
|
{- "v": 1,
- "record_id": "bf_sqtfovjvveefzuq25eegf2",
- "adl_origin": "sha256:9f2c4e1a7b3d5f6e8a0c2b4d6f8e1a3c5b7d9f0e2a4c6b8d0f1e3a5c7b9d2f4e",
- "record_type": "business_files",
- "valid": true,
- "status": "current",
- "business": {
- "business_uuid": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
- "name": "Acme Fashion Ltd",
- "certificate_url": "https://verify.masterdb.ai/v1/certificates/7c9e6679-7425-40de-944b-e07fc1f90ae7",
- "certificate": {
- "cert_id": "sha256:3b1f0c9e8d7a6b5c4d3e2f1a0b9c8d7e6f5a4b3c2d1e0f9a8b7c6d5e4f3a2b1c",
- "status": "active",
- "status_effective_from": "2026-09-01T00:00:00.000Z",
- "statement": "Verified by MasterDB on 1 September 2026."
}
}, - "version": {
- "generation": 3,
- "sealed_at": "2026-10-01T08:59:12.000Z",
- "published_at": "2026-10-01T09:00:00.000Z",
- "ended_at": null,
- "sealed_under_cert_id": "sha256:3b1f0c9e8d7a6b5c4d3e2f1a0b9c8d7e6f5a4b3c2d1e0f9a8b7c6d5e4f3a2b1c"
}, - "checks": {
- "cert": "matches",
- "served_at": "within"
}, - "endpoints": {
- "status": "live",
- "domains": [
- {
- "domain": "acme.example",
- "state": "confirmed",
- "last_confirmed_at": "2026-10-02T06:00:00.000Z",
- "expires_on": "2027-02-20T10:00:00.000Z"
}
]
}, - "source_line": "mdb-source/1 record=bf_sqtfovjvveefzuq25eegf2 origin=sha256:9f2c4e1a7b3d5f6e8a0c2b4d6f8e1a3c5b7d9f0e2a4c6b8d0f1e3a5c7b9d2f4e cert=sha256:3b1f0c9e8d7a6b5c4d3e2f1a0b9c8d7e6f5a4b3c2d1e0f9a8b7c6d5e4f3a2b1c served=2026-10-02T10:15:00.000Z verify=https://verify.masterdb.ai/v1/verify/bf_sqtfovjvveefzuq25eegf2?origin=sha256%3A9f2c4e1a7b3d5f6e8a0c2b4d6f8e1a3c5b7d9f0e2a4c6b8d0f1e3a5c7b9d2f4e&cert=sha256%3A3b1f0c9e8d7a6b5c4d3e2f1a0b9c8d7e6f5a4b3c2d1e0f9a8b7c6d5e4f3a2b1c&served_at=2026-10-02T10%3A15%3A00.000Z",
- "full_check": "POST /v1/verify with the record’s exact bytes and its seal checks the seal against the business’s register, its leaf in the transparency log and, with a served row, the projection.",
- "checked_at": "2026-10-02T10:15:03.000Z",
- "statement": {
- "payloadType": "application/vnd.masterdb.verify-page.v1+json",
- "payload": "eyJ2IjoxfQ",
- "signatures": [
- {
- "keyid": "4kX1qYAYKxCrfVS_7TyWQHOg7hcvPapiMlrwIaaPcHU",
- "sig": "MEUCIQDx3q2"
}
]
}
}MasterDB's own public keys — root, issuance, projection, every region's receipt key,
sidecar, statement and the log checkpoint key — past and present, each with its
validity window and any compromise date, as a JWK Set that is itself a signed document,
so an edited file cannot add a key. The signed payload {v, issued_at, keys, certificates} carries every key's certificate: roots certify roots (cross-certified
succession) and issuance keys, issuance keys certify the working keys, so the whole
chain to the pinned trust anchors travels in one document; long-lived links carry both
signature slots, P-256 and ML-DSA-65. A verifier trusts only the signed payload
— keys beside it is a convenience copy — and can check a receipt from any date
against it.
{- "keys": [
- {
- "kty": "OKP",
- "crv": "Ed25519",
- "x": "11qYAYKxCrfVS_7TyWQHOg7hcvPapiMlrwIaaPcHURo",
- "kid": "AV9-a8Wur0g3JAieklLME7UJUaa2lBJSJ2XP9NeAMG4",
- "purpose": "receipt",
- "region": "us-east4",
- "valid_from": "2026-10-01T00:00:00.000Z",
- "valid_until": "2026-11-07T00:00:00.000Z"
}
], - "signed": {
- "payloadType": "application/vnd.masterdb.jwks.v1+json",
- "payload": "eyJrZXlzIjpbXX0=",
- "signatures": [
- {
- "keyid": "arnx6499M4j0-dWG9m6Z_VQIDfLERvDlhmiwnAihbdA",
- "sig": "3q2+7w=="
}
]
}
}The live retrieval public keys of the verified AI companies that chose to be listed
(the AI Portal's setKeyDirectoryListing), with each company's name and certificate,
so a business's site or firewall can recognise their fetches. A company is
listed only while its certificate is active; a key until its revocation takes effect
(a key in its rotation overlap shows when it stops); source: directory_import marks
a key imported from the company's own signature directory. The body is signed by the
statement key as its own payload type, application/vnd.masterdb.key-directory.v1+json.
{- "v": 1,
- "issued_at": "2026-10-02T10:15:00.000Z",
- "companies": [
- {
- "ai_company_uuid": "1c8e7d4f-3a5b-4d2c-8e9f-8a7b6c5d4e3f",
- "name": "Lumen AI Inc",
- "certificate_url": "https://verify.masterdb.ai/v1/certificates/1c8e7d4f-3a5b-4d2c-8e9f-8a7b6c5d4e3f",
- "keys": [
- {
- "key_id": "L1BSyf0VsZoYxYTQE2NWgZhhPww06EQJ73k4cJoVnsI",
- "alg": "Ed25519",
- "public_key": {
- "kty": "OKP",
- "crv": "Ed25519",
- "x": "11qYAYKxCrfVS_7TyWQHOg7hcvPapiMlrwIaaPcHURo"
}, - "source": "directory_import",
- "valid_from": "2026-10-01T14:02:11.482Z",
- "valid_until": null
}
]
}
], - "statement": {
- "payloadType": "application/vnd.masterdb.key-directory.v1+json",
- "payload": "eyJ2IjoxfQ",
- "signatures": [
- {
- "keyid": "4kX1qYAYKxCrfVS_7TyWQHOg7hcvPapiMlrwIaaPcHU",
- "sig": "MEUCIQDx3q2"
}
]
}
}The published, versioned, hash-pinned specification of how a record of one type becomes
its index row: the field map, the canonical form and the row rule, the machine-readable
definition whose RFC 8785 hash every row of that version carries as adl_proj, and
the fields its row signature leaves out. Anyone can re-run it and compare byte for
byte with a row they were served. The path is the one the pinned specification
names (platform/projections/v1.json).
| type required | string^[a-z_]{1,32}$ Example: products |
| version required | string^[1-9][0-9]{0,5}$ Example: 1 |
{- "version": "products/1",
- "spec_version": 1,
- "sha256": "sha256:9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08",
- "record_type": "products",
- "field_map": {
- "product_name": "string(/product_name)",
- "price_{CC}": "number(/prices/*/amount) per /country"
}, - "rules": {
- "row": "One row per record."
}, - "unsigned_fields": [
- "adl_row_sig",
- "sponsored",
- "sponsorship_id",
- "excluded_groups"
], - "serve_time_fields": [
- "freshness_expectation",
- "ai_policy_bits",
- "terms"
], - "definition": {
- "spec_version": 1,
- "type": "products",
- "version": 1
}
}The key to ai_policy_bits, which every search row carries: for each blocked
context its code (bc1–bc10), number, name, plain-English meaning, bit of the blocked
mask and the ai_policy_schema it appeared in — and, beside them, every bit of the use
and action masks by name. A code is never reused or renamed; a retired context keeps its
number. The same key is in the developer documentation and in @masterdb/shared and the
verifier libraries; this read is for a system that decodes bits without them. Public,
unauthenticated, cacheable for a day.
{- "key_version": 1,
- "current_ai_policy_schema": 2,
- "rule": "A bit is set exactly when the sealed boolean of that name is true. …",
- "groups": {
- "use": [
- {
- "name": "cite_as_source",
- "meaning": "Name the business (and MasterDB) as the source.",
- "bit": 0,
- "since_schema": 1
}
], - "action": [
- {
- "name": "answer",
- "meaning": "May use this data to answer.",
- "bit": 0,
- "since_schema": 1
}
]
}, - "blocked": [
- {
- "number": 1,
- "code": "bc1",
- "name": "adult_sexual",
- "meaning": "Adult and sexual content: the business does not want its published data used to build a response in this context. A suppression list, not a rating of the business.",
- "bit": 0,
- "since_schema": 2
}, - {
- "number": 2,
- "code": "bc2",
- "name": "alcohol",
- "meaning": "Alcohol: the business does not want its published data used to build a response in this context. A suppression list, not a rating of the business.",
- "bit": 1,
- "since_schema": 2
}
]
}What a verifier is written from: every envelope payload type MasterDB makes or
accepts, and every hash-pinned document with its version, URL and hash — each projection
type version (the hash every row of it carries as adl_proj, served at
/v1/projections/{type}/{version}) and each vocabulary version. The index also lists the envelope formats' prose
specifications, test vectors and the corpus of deliberately broken records;
test_vectors_url is absent where they are not published.
{- "payload_types": [
- "application/vnd.masterdb.seal.v1+json",
- "application/vnd.masterdb.receipt.v1+json"
], - "specifications": [
- {
- "name": "projection/products",
- "version": 3,
- "sha256": "sha256:9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08"
}, - {
- "name": "vocabulary/countries",
- "version": 1,
- "sha256": "sha256:2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae"
}
]
}One of the platform's controlled vocabularies — the product taxonomy, countries,
currencies, time zones, languages — as a versioned document owned by MasterDB, the
one source the publish service validates against and the portals and SDKs read:
platform/vocabularies/{name}/v{N}.json (time_zones is the timezones file). The latest
version unless you ask for another; conditional requests with the ETag (the RFC 8785 hash
of the version).
| name required | string Enum: "taxonomy" "countries" "subdivisions" "currencies" "time_zones" "languages" Example: countries |
| version | integer >= 1 Example: version=2 |
{- "name": "countries",
- "version": 1,
- "published_at": "2026-09-29",
- "entries": [
- {
- "id": "IE",
- "name": "Ireland"
}, - {
- "id": "US",
- "name": "United States"
}
]
}The transparency log's latest signed checkpoint in the C2SP signed-note format —
origin masterdb.ai/log/v1, tree size and root hash, signed by the masterdb-log
key. Compare checkpoints over time and MasterDB cannot edit or truncate the log without
it showing. A checkpoint is served only once its signature verifies under the
log's key (the log_checkpoint key of /.well-known/keys); before the first one, 404.
masterdb.ai/log/v1 1048576 LCa0a2j/xo/5m0U8HTBBNBNCLXBkg7+g+YpeiGJm564= — masterdb-log Az3grlgtzPICa5OS8npVmf1Myq/5IZniMp+ZJurmRDeOoRDe4URYN7u5/Zhcyv2q1gGzGku9nTo+zyWE+xeMcTOAYQ8=
The inclusion proof of a leaf in the log. For a receipt the proof has two levels: the receipt's path inside its region's one-minute batch, served from the stored leaf list, then that batch root's inclusion in the log. Leaves are typed: seal, receipt batch, certificate, key event, checkpoint.
| leaf required | string (Sha256) ^sha256:[0-9a-f]{64}$ Example: leaf=sha256:2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae The leaf hash. |
| region | string^[a-z]+-[a-z]+[0-9]+$ Example: region=us-east4 For a receipt, with |
| name | string^[0-9]{12}(?:-[A-Za-z0-9_-]{1,64})?$ Example: name=202610010930 For a receipt, with |
{- "leaf": "sha256:2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae",
- "leaf_type": "seal",
- "leaf_index": 734112,
- "tree_size": 1048576,
- "proof": [
- "sha256:9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08"
], - "checkpoint": "masterdb.ai/log/v1\n1048576\nLCa0a2j/xo/5m0U8HTBBNBNCLXBkg7+g+YpeiGJm564=\n"
}The RFC 9162 consistency proof that the log of first leaves is a prefix of the log of
second leaves (default: the latest checkpoint's size, whose signed note is then included).
Anyone holding two checkpoints they fetched at different times can check, with the proof and the
published log_checkpoint key, that MasterDB neither edited nor truncated the log between them. Fetch checkpoints at GET /v1/log/checkpoint; the verifier libraries check the proof
(verifyLogConsistency / verify_log_consistency take the two notes and proof). 404 unless
1 ≤ first ≤ second ≤ the latest size; 400 for a size that is not a positive integer.
| first required | integer >= 1 Example: first=1040000 The older tree size, as the first checkpoint you hold states it. |
| second | integer >= 1 Example: second=1048576 The newer tree size (default the latest). |
{- "from_size": 1040000,
- "to_size": 1048576,
- "proof": [
- "sha256:2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae",
- "sha256:9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08"
], - "checkpoint": "masterdb.ai/log/v1\n1048576\nLCa0a2j/xo/5m0U8HTBBNBNCLXBkg7+g+YpeiGJm564=\n"
}