Skip to content
Registry stack docs v0 · draft

Registry Notary reference

Use this page to look up the Registry Notary config schema, HTTP routes, federation config, disclosure modes, source connector options, and audit event fields. This reference is hand-maintained; the authoritative contract is the upstream repo. The OpenAPI contract is generated: cargo run -p registry-notary-bin -- openapi. (README)

/healthz and /ready are public probe routes. Other routes require authentication through static API-key/bearer-token mode or OIDC mode.

MethodPathPurpose
GET/healthzReturn the liveness probe. Public.
GET/readyReturn the readiness probe. Public.
POST/admin/reloadAdmin-scoped no-op reload endpoint. Returns reloaded: false in the standalone router.
GET/openapi.jsonReturn the Registry Notary OpenAPI 3.1.0 document.
GET/.well-known/evidence-serviceReturn the service capabilities document.
GET/.well-known/evidence/jwks.jsonReturn the public issuer verification keys as a JWKS.
GET/claimsList claim definitions visible to the authenticated principal.
GET/claims/{claim_id}Return one claim definition by ID. Returns 404 if not found.
GET/formatsList supported output format media types.
POST/claims/evaluateEvaluate one or more claims for a single subject.
POST/claims/batch-evaluateEvaluate one or more claims for multiple subjects inline. Accepts Idempotency-Key header.
POST/evidence/renderRender a stored evaluation in a requested format and disclosure level.
POST/credentials/issueIssue an SD-JWT VC credential from a stored evaluation.
GET/.well-known/openid-credential-issuerReturn the OID4VCI Credential Issuer Metadata document.
GET/oid4vci/credential-offerReturn a CredentialOffer for one or more configured credential configurations.
POST/oid4vci/nonceMint a fresh c_nonce for the holder proof of possession JWT.
POST/oid4vci/credentialIssue an SD-JWT VC credential bound to the holder’s did:jwk.
POST/federation/v1/evaluationsEvaluate one configured federation profile for a trusted peer. Mounted only when federation.enabled is true.

HTTP status codes used across routes:

  • 200: success.
  • 400: invalid request body or a disclosure widening attempt.
  • 401: missing or invalid credential.
  • 403: principal is not authorized for the requested claim, purpose, disclosure mode, or format.
  • 404: claim ID or evaluation ID not found.
  • 503: a source registry is unreachable. POST /claims/evaluate returns this with code: source.unavailable in the application/problem+json body.

Federated evaluation uses application/jwt request and response bodies on success. Transport denials use application/problem+json.

Example response body for POST /claims/evaluate (200):

{
"results": [
{
"claim_id": "farmer-under-4ha",
"claim_version": "2026-05",
"subject_ref": "person-1",
"subject_type": "person",
"satisfied": true,
"value": true,
"disclosure": "predicate",
"format": "application/vnd.registry-notary.claim-result+json",
"evaluation_id": "01HX7Y5F2WAJ7ZP0Q4M5K9E8NC",
"issued_at": "2026-05-24T12:00:00Z",
"expires_at": "2026-05-25T12:00:00Z",
"provenance": {
"computed_by": "demo.registry-notary",
"source_count": 1,
"source_versions": {}
}
}
]
}

POST /claims/batch-evaluate wraps each subject’s evaluations in an items[].claim_results[] envelope; the per-claim entries follow the same shape.

Fields of ClaimDefinition.

FieldRequiredTypeDefaultNotes
idYesstringNoneStable claim identifier. Must not be empty.
titleYesstringNoneHuman-readable label.
versionYesstringNoneAPI version string (for example, 2026-05).
subject_typeYesstringNoneKind of entity (for example, person).
value.typeNostring""Value type: date, number, boolean, or string.
value.unitNostringNoneOptional unit (for example, hectare).
inputsNoarray[]Named parameters the caller must supply. Each has name and type.
depends_onNoarray[]IDs of claims that must be evaluated before this one. Must form a DAG.
source_bindingsNomap{}Map of binding name to SourceBindingConfig. Required if rule reads a source.
ruleYesobjectNoneEvaluation rule. See Rule types.
operations.evaluate.enabledNobooltrueWhether POST /claims/evaluate is enabled for this claim.
operations.batch_evaluate.enabledNoboolfalseWhether POST /claims/batch-evaluate is enabled.
operations.batch_evaluate.max_subjectsNonumber100Per-claim subject limit for batch evaluation.
disclosure.defaultNostringredactedDefault disclosure mode.
disclosure.allowedNoarray["redacted"]Modes the caller may request.
disclosure.downgradeNostringdenyAction when caller requests a disallowed mode.
formatsNoarray[]Allowed output media types.
credential_profilesNoarray[]Credential profile IDs that may issue from this claim.
cccev.requirement_typeNostringNoneCCCEV requirement type annotation for JSON-LD rendering.
oots.enabledNoboolNoneOnce-Only Technical System config. Serves as metadata annotations only; not yet enforced.

The same fields described in prose. Use this form when reading the YAML config side by side with the evaluation engine section of the overview.

  • id: stable string identifier used in API requests.
  • title: human-readable label.
  • version: a date-based API version string (for example, 2026-05).
  • subject_type: the kind of entity being evaluated (for example, person).
  • value: the type and optional unit of the claim’s raw value (for example, type: number, unit: hectare).
  • inputs: named parameters the caller must supply (for example, a subject_id string).
  • depends_on: ordered list of claim IDs whose results must be available before this claim evaluates. The config validator rejects dependency cycles at startup.
  • source_bindings: a map of binding names to source binding entries, each specifying which connector and connection to use, the dataset and entity name, a lookup strategy, and the fields to extract.
  • rule: the evaluation rule. See Rule types.
  • disclosure: the per-claim disclosure policy. See Disclosure policy modes.
  • formats: the output media types this claim can produce.
  • credential_profiles: which credential profiles may issue a credential from this claim.
  • cccev: optional Core Criterion and Core Evidence Vocabulary (CCCEV) annotation (for example, requirement_type: InformationRequirement).
  • oots: optional Once-Only Technical System (OOTS) annotation. Fields include enabled, requirement (an IRI), reference_framework, evidence_type_classification, evidence_type_list, languages, and authentication_level_of_assurance. When oots.enabled is true, the claim summary API publishes the block and the CCCEV renderer uses oots.requirement as the cccev:supportsRequirement IRI. There is no dedicated OOTS transport or external OOTS endpoint at this version; the fields serve as metadata annotations only; not yet enforced.
TypeRequired fieldsBehavior
extractsource, fieldReads field from the source binding named source. Returns the raw value.
existssourceReturns true if the source binding found at least one record, false otherwise.
celexpression, optionally bindingsEvaluates a CEL expression. bindings.claims maps variable names to upstream claim IDs. bindings.vars supplies static values.
pluginpluginDeclares an external plugin name. Not yet implemented at reviewed commit.

Fields of SourceBindingConfig.

FieldRequiredNotes
connectorYesregistry_data_api or dci.
connectionYesKey in evidence.source_connections.
required_scopeNoScope the authenticated principal must carry to use this binding.
datasetYesLogical dataset name passed to the source connector.
entityYesLogical entity name passed to the source connector.
lookup.inputYesName from inputs used as the lookup key value.
lookup.fieldYesField name on the source entity to match against.
lookup.opNoComparison operator. Default: eq.
lookup.cardinalityNoExpected record count. Default: one.
fields.<name>.fieldYesSource field name to extract.
fields.<name>.typeNoExpected type: date, number, boolean, string.
fields.<name>.unitNoOptional unit.
fields.<name>.requiredNoIf true, evaluation fails when the field is absent.
  • Kind: Registry Data API
  • YAML value: registry_data_api
  • Protocol: HTTP POST to {base_url}/{dataset}/{entity} with query parameters
  • Request shape: Standard Registry Data API query body
  • Kind: SP DCI
  • YAML value: dci
  • Protocol: HTTP POST to {base_url}{dci.search_path}
  • Request shape: DCI registry/sync/search-shaped request body with query_type and subject ID

SP DCI connector config fields under source_connections.<id>.dci:

FieldDefault
search_path/registry/sync/search
sender_idregistry-notary
query_typeidtype-value
records_path/message/search_response/0/data/reg_records
max_results2
registry_typeNone
record_typeNone
field_paths{} (map of local field name to JSON path in record)
ModeYAML valueWhat the caller receives
Full valuevalueThe evaluated claim value (date, number, boolean, or string).
PredicatepredicateBoolean satisfaction result only. The underlying value is not returned.
RedactedredactedNo value and no predicate. The result slot is present but carries no data.

Downgrade strategies (disclosure.downgrade):

StrategyYAML valueBehavior when disallowed mode is requested
DenydenyReturns DisclosureNotAllowed error. Default.
DefaultdefaultFalls back to disclosure.default.
RedactedredactedForces the result to Redacted.

Registry Notary supports three output media types: native claim result JSON (application/vnd.registry-notary.claim-result+json), CCCEV JSON-LD (application/ld+json; profile="cccev"), and SD-JWT VC (application/dc+sd-jwt, only via /credentials/issue).

Fields of CredentialProfileConfig.

FieldRequiredDefaultNotes
formatYesNoneMust be application/dc+sd-jwt.
issuerYesNoneIssuer DID (for example, did:web:example.gov).
issuer_key_envYesNoneName of the environment variable holding the Ed25519 OKP JWK.
issuer_kidNoNoneKey ID to include in the credential header.
vctYesNoneVerifiable Credential Type URI.
validity_secondsNo7776000 (90 days)Credential validity window.
holder_binding.modeNoNoneBinding mode. Currently did.
holder_binding.proof_of_possessionNoNonerequired enforces holder proof. Only did:jwk is supported when set to required.
holder_binding.allowed_did_methodsNo[]Permitted DID methods for holder binding.
allowed_claimsNo[]Claim IDs that this profile may issue.
disclosure.allowedNoNoneDisclosure modes permitted in issued credentials.

Registry Notary emits OpenID for Verifiable Credential Issuance (OID4VCI) Draft 13 compatible routes when oid4vci.enabled is true in config. The wider OID4VCI spec alignment is aligns_with; the four routes below emit the wire shapes the spec defines.

Returns the Credential Issuer Metadata document.

  • Auth: public.
  • Response media type: application/json.
  • Response body fields: credential_issuer, credential_endpoint, nonce_endpoint (optional), authorization_servers (optional), credential_configurations_supported (map of configuration id to metadata, including format, scope, cryptographic_binding_methods_supported, credential_signing_alg_values_supported, proof_types_supported, display, vct).

Returns a CredentialOffer for one or all configured credential configurations.

  • Auth: public.
  • Query parameter: credential_configuration_id (optional). If omitted, the offer lists every configuration the server knows about.
  • Response media type: application/json.
  • Response body fields: credential_issuer, credential_configuration_ids, grants (currently the authorization_code grant with an issuer_state nonce).

Mints a fresh c_nonce used by the holder when signing the proof-of-possession JWT.

  • Auth: public. Only enabled when oid4vci.nonce.enabled is true.
  • Request media type: application/json (body may be empty).
  • Request body fields: credential_configuration_id (optional).
  • Response media type: application/json.
  • Response body fields: c_nonce, c_nonce_expires_in (seconds).

Issues an SD-JWT VC credential bound to the holder’s did:jwk.

  • Auth: bearer access token sourced from the configured authorization server (for example, eSignet). Self-attestation principals only.
  • Request media type: application/json.
  • Request body fields: format (must be dc+sd-jwt), credential_configuration_id or credential_identifier, proof.proof_type (must be jwt), proof.jwt (signed with the holder’s did:jwk; aud equals the configured credential_issuer; nonce is the value from POST /oid4vci/nonce).
  • Response media type: application/json.
  • Response body fields: credential (the SD-JWT VC as a single compact-serialization string), c_nonce (next nonce, optional), c_nonce_expires_in (optional).

Proof JWT validation comes from Registry Platform OID4VCI helpers; the credential signing key is the same Ed25519 OKP JWK loaded by the credential profile that backs the configuration. Holder binding requires did:jwk; other DID methods are rejected at config validation.

POST /federation/v1/evaluations accepts one compact JWS request and returns one signed evaluation response. The route is not mounted unless federation.enabled is true.

Request requirements:

  • Request media type: application/jwt.
  • Compact JWS serialization only.
  • Header fields: typ = registry-notary-request+jwt, alg = EdDSA, and a kid found in the configured peer JWKS.
  • Required payload claims: iss, sub, aud, iat, nbf, exp, jti, protocol, action, profile, purpose, and request.
  • protocol must be registry-notary-federation/v0.1.
  • action must be evaluate.
  • purpose must be an HTTPS URI allowed by the peer policy.
  • jti must be a ULID string and is retained in the replay store until exp + clock_leeway.

Response shape:

  • Success media type: application/jwt.
  • Header fields: typ = registry-notary-response+jwt, alg = EdDSA, and serving Notary kid.
  • Payload fields include iss, sub, aud, iat, nbf, exp, jti, request_jti, protocol, action, profile, and either result or error.
  • result.subject_ref.hash is a pairwise hmac-sha256: handle. The raw subject identifier is not returned.
  • Stale source observations return HTTP 200 with a signed top-level error object.
  • Replay, policy, signature, body-limit, and audience failures return unsigned RFC 7807-style denial bodies.

The serving Notary validates the request before source reads. Audit write failure prevents a successful signed response.

EvidenceAuditEvent fields. Events are serialized as Registry Platform audit envelopes in JSON Lines (JSONL) to stdout or a file.

FieldTypeNotes
event_idstringUnique identifier for this audit record.
occurred_atstringRFC 3339 timestamp.
principal_idstringIdentifier of the authenticated caller.
decisionstringOutcome of the request.
methodstringHTTP method.
pathstringRequest path.
statusnumberHTTP response status code.
verification_idstring or nullVerification context identifier. May be omitted for redacted results.
claim_hashstring or nullHash of the evaluated claim set. May be omitted for redacted results.
row_countnumber or nullNumber of source records read.
error_codestring or nullError code if the request failed.
federation_peer_id_hashstring or nullHashed peer node id for federated evaluation audit records.
federation_issuerstring or nullRequesting peer issuer for federated evaluation audit records.
federation_profilestring or nullEvaluation profile id used for federated evaluation.
federation_purposestring or nullPurpose URI accepted for federated evaluation.
federation_request_jtistring or nullRequest JWT jti for replay and audit correlation.
federation_subject_ref_hashstring or nullPairwise subject reference hash emitted in the signed response.

StandaloneRegistryNotaryConfig top-level keys.

Default bind: 127.0.0.1:8081. The standalone demo config in demo/config/registry-notary.yaml overrides this to 127.0.0.1:4255. The Lab topology overrides it to 0.0.0.0:8080 inside the container (mapped to host ports 4321-4324).

KeyDefaultNotes
modeapi_keyapi_key for static API key and bearer-token lists, or oidc for inbound bearer JWT verification.
api_keys[]Static credentials array of {id, hash_env, scopes}. hash_env names an env var containing a sha256:<64 hex> fingerprint.
bearer_tokens[]Static bearer credentials array of {id, hash_env, scopes}.
oidcNoneRequired when mode: oidc; see OIDC auth config.

Fields under auth.oidc.

KeyDefaultNotes
issuerNoneExpected JWT iss. Required.
jwks_uriNoneJWKS endpoint used by the platform OIDC verifier. Required.
audiences[]Accepted JWT audiences. At least one is required.
allowed_clients[]Optional allowed azp/client identifiers.
allowed_algorithms["EdDSA"]Accepted JOSE algorithms.
allowed_typ["JWT"]Accepted JOSE typ headers.
scope_claimscopeClaim used to extract scopes.
scope_separatorspaceSingle-character scope separator.
scope_map{}Optional mapping from incoming scopes to Notary scopes.
principal_claimsubClaim used as the Notary principal ID.
leeway_seconds60Clock skew tolerance.
allow_insecure_localhostfalseAllows local insecure JWKS URLs for development.
KeyDefaultNotes
sinkstdoutstdout, file, or jsonl.
pathNoneRequired when sink: file or sink: jsonl.
hash_secret_envNoneRequired. Names an env var containing deployment-specific audit hash secret material.
KeyDefaultNotes
enabledfalseMust be true. Config validation fails otherwise.
service_idregistry-notaryService identity string in responses.
api_version2026-05API version label.
api_base_url/Base URL for self-links in the service document.
inline_batch_limit100Global maximum subjects per batch request.
claims[]Array of claim definitions.
credential_profiles{}Map of profile ID to CredentialProfileConfig.
source_connections{}Map of connection ID to SourceConnectionConfig.

Fields of FederationConfig.

KeyDefaultNotes
enabledfalseWhen true, mounts /federation/v1/evaluations.
node_id""Serving Notary node id. MVP requires did:web.
issuer""Serving Notary HTTPS issuer. Host must bind to node_id.
jwks_uri""HTTPS JWKS URL for this Notary federation signing keys.
federation_api""Public federation API base URL.
supported_protocol_versions[]Must include registry-notary-federation/v0.1 when enabled.
inbound_body_limit_bytes16384Maximum compact JWS request body size.
max_request_lifetime_seconds300Maximum exp - iat for request JWTs.
clock_leeway_seconds60Clock skew tolerance for time checks and replay retention.
signing.kid""Key id placed in signed response JWT headers.
signing.key_env""Env var containing the Ed25519 OKP JWK used to sign responses.
signing.algEdDSAOnly EdDSA is accepted for the MVP.
pairwise_subject_hash.secret_env""Dedicated secret for pairwise subject handles. Do not reuse audit or signing secrets.
replay.storagein_process_single_instance_onlyMVP replay store. Not safe for active-active serving deployments.
replay.max_entries10000Maximum in-process replay entries before oldest-entry eviction.
replay.evictionexpire_oldestExpires old entries, then evicts oldest inserted entries when full.
response_shaping.minimum_denial_latency_ms250Minimum latency floor for denied federation requests.
emergency_denylist.node_ids[]Locally denied peer node ids.
emergency_denylist.kids[]Locally denied request signing key ids.
peers[]Static trusted peer policies. At least one is required when enabled.
evaluation_profiles[]Local evaluation profiles. At least one is required when enabled.

Fields of FederationPeerConfig.

KeyNotes
node_idTrusted peer node id. MVP requires did:web.
issuerTrusted peer HTTPS issuer. Host must bind to node_id.
jwks_uriPeer JWKS URL used by the request verifier.
allow_insecure_localhostDevelopment-only opt-in for local JWKS URLs.
allowed_protocol_versionsMust include registry-notary-federation/v0.1.
allowed_purposesHTTPS purpose URI allowlist.
allowed_profilesEvaluation profile IDs this peer may request.
source_scopesInternal source scopes granted to this peer after policy passes.

Fields of FederationEvaluationProfileConfig.

KeyNotes
idLocal profile id referenced by peer allowed_profiles and request profile.
rulesetPublic ruleset id that can match Registry Manifest evaluation_profiles[].ruleset.
claim_idEvidence claim evaluated for this profile.
subject_id_typeRequired request subject id type.
max_source_observed_age_secondsOptional freshness limit; stale source observations return a signed evaluation error.

Fields of SourceConnectionConfig.

KeyDefaultNotes
base_urlNoneUpstream source registry base URL. Required.
allow_insecure_localhostfalseDevelopment-only opt-in for HTTP localhost source registries.
allow_insecure_private_networkfalseDevelopment/demo opt-in for HTTP private-network source registries, while cloud metadata endpoints remain blocked.
token_envNoneEnvironment variable containing the outbound bearer token used when Notary calls the source registry. Required.
dciDCI defaultsOptional DCI connector settings such as search_path, query_type, records_path, and field_paths.
max_in_flight8Per-connection cap on concurrent outbound source requests.
bulk_modenoneConnector-specific bulk-read mode. Values include none, rda_in_filter, and dci_batched_search.
bulk_mode_lookup_uniquefalseRequired operator attestation for rda_in_filter.
bulk_timeout_max_ms30000Upper bound on the per-call timeout for bulk source reads.