MasterDB Public Verification API (1.0.0)

Download OpenAPI specification:

URL: https://docs.masterdb.ai License: LicenseRef-MasterDB

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.

Certificates

Is this the real business, or the real AI company?

Read a certificate

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.

path Parameters
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 business_uuid or an ai_company_uuid.

Responses

Response samples

Content type
application/json
{
  • "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": {
    },
  • "history": [
    ]
}

Read a business's public sealing and integration keys

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.

path Parameters
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 business_uuid.

Responses

Response samples

Content type
application/json
{
  • "uuid": "0b7d6c3e-2f4a-4c1b-9d8e-7f6a5b4c3d2e",
  • "cert_id": "sha256:9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08",
  • "issued_at": "2026-10-01T12:00:00.000Z",
  • "keys": [
    ],
  • "signed": {
    }
}

Read who holds each of a business's keys

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).

path Parameters
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 business_uuid.

Responses

Response samples

Content type
application/json
{
  • "uuid": "0b7d6c3e-2f4a-4c1b-9d8e-7f6a5b4c3d2e",
  • "statements": [
    ]
}

Verification

Is this record what the business published, and did it ever say this?

Verify a record and its seal

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.

Request Body schema: application/json
required
object

An ad exactly as POST /v1/ads/pool served it (retrieval API PoolAd), posted alone. Its record_base64 is the record, the seal inside its signed row (adl_origin_seal) is the seal, row is the row; the answer's ad is the whole item checked as the SDKs' verifyAdItem checks it (the creative shown is the sealed one), and ai_policy_bits checks the advertiser's AI policy the item carries against the bits on its row.

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 (sidecar.v2, or sidecar.v1; signed by MasterDB's sidecar key), as GET /v1/records/{id} returns it.

object (AiPolicyBits)

The ai_policy_bits a search row carried. Checked against this record, which must then be the business's sealed AI policy record; the answer's ai_policy_bits.

key_events
string
Enum: "warn" "require"

What to do when the seal's key has no key_added leaf proven in the transparency log, as the verifier libraries' keyEvents. warn (the default) keeps the seal and says so (checks.key_event: missing, a line in warnings); require refuses it, key_event_missing. A key added in the last hour has a staged leaf but no proof yet.

Responses

Request samples

Content type
application/json
{
  • "record_base64": "eyJzY2hlbWEiOiJtYXN0ZXJkYi9wcm9kdWN0cy8xIn0=",
  • "seal": {
    }
}

Response samples

Content type
application/json
{
  • "seal": {
    },
  • "log_inclusion": {
    },
  • "statement": {
    }
}

Check a source line (the verify page)

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.

path Parameters
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.

query Parameters
origin
required
string (Sha256) ^sha256:[0-9a-f]{64}$
Example: origin=sha256:9f2c4e1a7b3d5f6e8a0c2b4d6f8e1a3c5b7d9f0e2a4c6b8d0f1e3a5c7b9d2f4e

The record's adl_origin — SHA-256 of its exact bytes. Possession of the record, never a bare id.

cert
string (Sha256) ^sha256:[0-9a-f]{64}$

The cert_id the source line carries (a row's adl_origin_cert); checked against the one the record's seal named.

served_at
string <date-time>

When the record was served (the receipt's served_at); checked against when this version was the one served.

format
string
Enum: "html" "json"

html or json; without it, a browser's Accept: text/html gets the page and anything else the JSON.

Responses

Response samples

Content type
{
  • "v": 1,
  • "record_id": "bf_sqtfovjvveefzuq25eegf2",
  • "adl_origin": "sha256:9f2c4e1a7b3d5f6e8a0c2b4d6f8e1a3c5b7d9f0e2a4c6b8d0f1e3a5c7b9d2f4e",
  • "record_type": "business_files",
  • "valid": true,
  • "status": "current",
  • "business": {
    },
  • "version": {
    },
  • "checks": {
    },
  • "endpoints": {
    },
  • "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": {
    }
}

Keys

MasterDB's own keys and signing-key directories.

Read MasterDB's signed key set

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.

Responses

Response samples

Content type
application/json
{
  • "keys": [
    ],
  • "signed": {
    }
}

Read MasterDB's key directory of AI companies

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.

Responses

Response samples

Content type
application/json
{
  • "v": 1,
  • "issued_at": "2026-10-02T10:15:00.000Z",
  • "companies": [
    ],
  • "statement": {
    }
}

Specifications

Projection specifications, envelope specifications and vocabularies.

Read a projection specification

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).

path Parameters
type
required
string^[a-z_]{1,32}$
Example: products
version
required
string^[1-9][0-9]{0,5}$
Example: 1

Responses

Response samples

Content type
application/json
{
  • "version": "products/1",
  • "spec_version": 1,
  • "sha256": "sha256:9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08",
  • "record_type": "products",
  • "field_map": {
    },
  • "rules": {
    },
  • "unsigned_fields": [
    ],
  • "serve_time_fields": [
    ],
  • "definition": {
    }
}

Read the key to the AI policy bits

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.

Responses

Response samples

Content type
application/json
{
  • "key_version": 1,
  • "current_ai_policy_schema": 2,
  • "rule": "A bit is set exactly when the sealed boolean of that name is true. …",
  • "groups": {
    },
  • "blocked": [
    ]
}

Read the envelope specifications and test vectors

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.

Responses

Response samples

Content type
application/json
{}

Read a controlled vocabulary

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).

path Parameters
name
required
string
Enum: "taxonomy" "countries" "subdivisions" "currencies" "time_zones" "languages"
Example: countries
query Parameters
version
integer >= 1
Example: version=2

Responses

Response samples

Content type
application/json
{
  • "name": "countries",
  • "version": 1,
  • "published_at": "2026-09-29",
  • "entries": [
    ]
}

Transparency log

The log's checkpoints and inclusion proofs.

Read the latest log checkpoint

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.

Responses

Response samples

Content type
text/plain
masterdb.ai/log/v1
1048576
LCa0a2j/xo/5m0U8HTBBNBNCLXBkg7+g+YpeiGJm564=

— masterdb-log Az3grlgtzPICa5OS8npVmf1Myq/5IZniMp+ZJurmRDeOoRDe4URYN7u5/Zhcyv2q1gGzGku9nTo+zyWE+xeMcTOAYQ8=

Read an inclusion proof

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.

query Parameters
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, its region — known from the receipt itself — so the receipt index is not consulted.

name
string^[0-9]{12}(?:-[A-Za-z0-9_-]{1,64})?$
Example: name=202610010930

For a receipt, with region, its minute list's name (YYYYMMDDHHmm of served_at, or that with -{instance}).

Responses

Response samples

Content type
application/json
{
  • "leaf": "sha256:2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae",
  • "leaf_type": "seal",
  • "leaf_index": 734112,
  • "tree_size": 1048576,
  • "proof": [
    ],
  • "checkpoint": "masterdb.ai/log/v1\n1048576\nLCa0a2j/xo/5m0U8HTBBNBNCLXBkg7+g+YpeiGJm564=\n"
}

Read a consistency proof between two tree sizes

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.

query Parameters
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).

Responses

Response samples

Content type
application/json
{
  • "from_size": 1040000,
  • "to_size": 1048576,
  • "proof": [
    ],
  • "checkpoint": "masterdb.ai/log/v1\n1048576\nLCa0a2j/xo/5m0U8HTBBNBNCLXBkg7+g+YpeiGJm564=\n"
}