Preview — not for production reliance
Documentation

Docs API reference

Schemas

The named request and response schemas of the API.

Every named schema in the OpenAPI description. Field types link here from the operation pages.

ErrorCode

Type: one of "invalid_request", "unauthenticated", "forbidden", "not_found", "step_up_required", "provider_unavailable", "conflict", "semantic_check_failed", "rate_limited", "unavailable"

Machine-readable error code. The HTTP status is fixed per code except where noted on invalid_request.

FieldError

Type: object

FieldTypeRequiredDescription
fieldstringYesThe offending field, a dotted or indexed path (details.type, files[0].size) or a header name.
messagestringYes

Error

Type: object

The error model returned by every failing request.

FieldTypeRequiredDescription
codeErrorCodeYes
messagestringYesHuman-readable. Not stable; branch on code.
request_idstringYesEchoes the x-request-id response header.
pattern ^req_[0-9a-z]{26}$
field_errorsarray of FieldErrorNoPresent only when specific fields are at fault.

CursorExpired

Type: object

The 410 body of the change feed. It follows the error model, but code is cursor_expired, which is not one of the ErrorCode values, and it adds resync instructions and the current head cursor.

FieldTypeRequiredDescription
code"cursor_expired"Yes
messagestringYes
request_idstringYes
resyncstringYesWhat to do.
next_cursorstringYesThe current head of the feed; resume from here after re-resolving.

Timestamp

Type: string (date-time)

ISO 8601 UTC timestamp.

OrganizationId

Type: string; pattern ^org_[0-9a-z]{26,32}$

Example

json
"org_7k3m9q2x8d5f1h4j6n0p2r4t8v"

ClaimId

Type: string; pattern ^clm_[0-9a-z]{26,32}$

Example

json
"clm_4c8e2g6k0m3q7s1w5y9a2d6f8h"

BindingId

Type: string; pattern ^bnd_[0-9a-z]{26,32}$

Example

json
"bnd_9r2t5w8z1b4d7f0h3k6n9q2s5v"

DelegationId

Type: string; pattern ^dlg_[0-9a-z]{26,32}$

Example

json
"dlg_2b5d8f1h4k7n0q3s6w9y2a5c8e"

TrustDomain

Type: string; 1 to 255 characters; pattern ^[a-z0-9._-]+$

An exact SPIFFE trust domain, lowercase, no spiffe://.

Example

json
"agents.payments.example.com"

WorkloadScope

Type: array of string; 1 to 64 items; unique items

Workload path prefixes. 1 to 64 distinct prefixes; each starts with /, has at least one segment, and each segment is [A-Za-z0-9._-]+ (no . or .., no percent-encoding).

Example

json
[
  "/agent/checkout",
  "/agent/refunds"
]

BundleDigest

Type: string; pattern ^[A-Za-z0-9_-]{42}[AEIMQUYcgkosw048]$

Unpadded base64url SHA-256 of the exact bundle bytes (43 characters).

Example

json
"q7Yd3nXk0aV2pLw9sT4uHc8BzE1mR6fJ5gN0oIxK2tA"

OrgRole

Type: one of "organization_owner", "issuer_administrator", "domain_administrator", "viewer"

ServiceTokenScope

Type: one of "issuer_administrator", "domain_administrator", "viewer"

PermittedAction

Type: one of "authorize_issuer", "delegate", "manage_domain"

What a reviewed representative authority permits.

ClaimState

Type: one of "pending_domain", "pending_identity", "pending_authority", "verified", "needs_information", "rejected", "disputed", "expired", "suspended", "withdrawn"

Health

Type: object

FieldTypeRequiredDescription
status"ok"Yes
environmentstringYesThe deployment environment name.

ObservationSummary

Type: object

The latest TLS observation in a domain list entry.

FieldTypeRequiredDescription
statusstringYesObservation status; unchecked until the first observation.
observed_atstring (date-time) or nullYes

DomainSummary

Type: object

FieldTypeRequiredDescription
domainstringYesCanonical domain name.
display_namestringYes
registrable_domainstringYes
statusstringYesunclaimed, claimed, or another status shown raw (never silently mapped to claimed).
rankinteger or nullYesCurrent popularity rank: the rank from the most recent snapshot that lists the domain among the newest snapshot of each source (snapshot recency is the source list's creation date). A domain left out of the newest snapshot of its source has no current rank from it, and with no current listing anywhere it is null (unranked, browsed after ranked domains). Every snapshot's rank stays in sources.
observationObservationSummaryYes

SourceList

Type: object

FieldTypeRequiredDescription
dataarray of objectYes
data[].snapshot_idstringYes
data[].sourcestringYes
data[].snapshotstringYesThe source's own snapshot identifier (a Tranco list ID, an archive date).
data[].snapshot_datestring (date-time) or nullYesWhen the source list was created, if known.
data[].retrieved_atstring (date-time)Yes
data[].row_limitintegerYesHow many leading rows of the list were imported.
data[].checksumstringYessha256: of the imported slice.
data[].source_file_sha256string or nullYesSHA-256 of the full upstream file.
data[].psl_versionstringYesPublic Suffix List version used to canonicalize names.
data[].attributionstringYes
data[].licensestring or nullYes
data[].countsobjectYes
data[].counts.source_rowsinteger or nullYes
data[].counts.unique_domainsinteger or nullYes
data[].counts.invalid_rowsinteger or nullYes
data[].counts.merged_rowsinteger or nullYes
data[].coverageobject or nullYesNull until first computed.
data[].coverage.observedinteger or nullYes
data[].coverage.unreachableinteger or nullYes
data[].coverage.unknowninteger or nullYes
data[].coverage.pendinginteger or nullYes
data[].coverage.as_ofstring (date-time) or nullYes
as_ofstring (date-time)Yes

PublicOrganization

Type: object

FieldTypeRequiredDescription
idstringYes
legal_namestringYes
jurisdictionstringYesISO 3166-1 alpha-2, optionally with an ISO 3166-2 subdivision.
registration_referencestring or nullYesRegistry number, reviewed together with the legal name.
verificationobjectYes
verification.status"verified"Yes
verification.first_verified_atstring (date-time) or nullYes
verification.last_reviewed_atstring (date-time) or nullYes
verification.expires_atstring (date-time) or nullYesWhen the latest identity approval lapses.
evidenceobjectYesFive independent indicators. There is no combined score.
evidence.organization_identityobjectYes
evidence.organization_identity.statusone of "reviewed", "lapsed"No
evidence.organization_identity.reviewed_atstring (date-time) or nullNo
evidence.organization_identity.expires_atstring (date-time) or nullNo
evidence.domain_controlobjectYes
evidence.domain_control.verified_domainsintegerNo
evidence.domain_control.listed_domainsintegerNo
evidence.representative_authorityobjectYes
evidence.representative_authority.currentintegerNo
evidence.representative_authority.listed_domainsintegerNo
evidence.representative_authority.earliest_expirystring (date-time) or nullNo
evidence.issuer_authorizationobjectYes
evidence.issuer_authorization.activeintegerNo
evidence.issuer_authorization.suspendedintegerNo
evidence.certificate_observationobjectYes
evidence.certificate_observation.observed_domainsintegerNo
evidence.certificate_observation.listed_domainsintegerNo
evidence.certificate_observation.latest_observed_atstring (date-time) or nullNo
evidence.certificate_observation.status_checkedfalseNo
domainsarray of objectYesDomains with a verified or suspended claim of this organization (at most 200).
domains[].domainstringYes
domains[].claim_stateone of "verified", "suspended"Yes
domains[].verified_checksarray of one of "domain", "identity", "authority"Yes
domains[].domain_verified_atstring (date-time) or nullYesLast successful DNS check.
domains[].domain_control_recheck_duestring (date-time) or nullYes90 days after the last DNS check.
domains[].identity_verified_atstring (date-time) or nullYes
domains[].authority_verified_atstring (date-time) or nullYes
domains[].authority_expires_atstring (date-time) or nullYes
domains[].observationobjectYes
domains[].observation.statusstringNo
domains[].observation.observed_atstring (date-time) or nullNo
domains[].observation.classstring or nullNo
issuer_bindingsarray of objectYesPublished (active or suspended) bindings of an environment this deployment publishes.
issuer_bindings[].trust_domainTrustDomainYes
issuer_bindings[].profilestringYes
issuer_bindings[].workload_scopearray of stringYes
issuer_bindings[].statusone of "active", "suspended"Yes
issuer_bindings[].verified_domainstring or nullYes
issuer_bindings[].current_versionintegerYes
issuer_bindings[].bundle_sha256string or nullYesDigest of the served bundle version (the value assertions pin).
issuer_bindings[].effective_atstring (date-time) or nullYes
issuer_bindings[].expires_atstring (date-time) or nullYes
issuer_bindings[].bundle_urlstring or nullYes
delegationsobjectYes
delegations.givenarray of PublicDelegationYes
delegations.receivedarray of PublicDelegationYes
as_ofstring (date-time)Yes

PublicDelegation

Type: object

FieldTypeRequiredDescription
child_domainstringYes
parent_domainstringYes
organizationobjectYesThe other organization. id is set only when it is itself verified.
organization.namestringYes
organization.idstring or nullYes
actionsarray of stringYes
workload_scopearray of stringYes
activated_atstring (date-time) or nullYes
expires_atstring (date-time)Yes

DomainPage

Type: object

FieldTypeRequiredDescription
dataarray of DomainSummaryYes
next_cursorstring or nullYesOpaque; pass as cursor for the next page. Null on the last page.
as_ofTimestampYes

Observation

Type: object

The latest TLS observation. Always a historical observation with status_checked: false; it is never a trust verdict and revocation status is not checked.

FieldTypeRequiredDescription
statusstringYes
observed_atstring (date-time) or nullYes
classstring or nullYesCertificate validation class (DV, OV, EV, ...) if observed.
labelstringYes
policy_oidsarray of stringYes
policy_versionstring or nullYes
trust_store_versionstring or nullYes
status_checkedfalseYes
path_validboolean or nullYes
sans_countinteger or nullYes
issuer_cnstring or nullYes
not_beforestring (date-time) or nullYes
not_afterstring (date-time) or nullYes
error_codestring or nullYes
wildcard_matchboolean or nullYesTrue when the name matched the certificate only through a wildcard SAN (*.parent), false for an exact SAN, null when unknown.

DomainDetail

Type: object

FieldTypeRequiredDescription
domainstringYes
display_namestringYes
registrable_domainstringYes
statusstringYes
rankinteger or nullYes
observationObservationYes
unclaimedbooleanYes
sourcesarray of objectYesImported lists that contain the domain, one row per snapshot (newest first), each with the attribution and license recorded for that snapshot. The rows are the domain's rank history; nothing is removed when a newer snapshot omits it.
sources[].sourcestringYes
sources[].snapshotstringYes
sources[].rankinteger or nullYes
sources[].original_namestring or nullYes
sources[].snapshot_datestring (date-time) or nullYesWhen the source list was created, if known.
sources[].attributionstringYesAttribution text the source requires; show it wherever the data is shown.
sources[].licensestring or nullYesTerms the snapshot is used under, as stated when it was staged.
enrollmentobject or nullYesSet when the domain was added by enrollment (POST /v1/domains) rather than from a source list. Never names who asked.
enrollment.source"enrollment"Yes
enrollment.validated_atTimestampYes
enrollment.notestringYes
claimsarray of objectYesVerified claims only.
claims[].organization_namestringYes
claims[].organization_idstring or nullYesThe organization's public record, GET /v1/organizations/{id}/public (null unless the organization is verified).
claims[].state"verified"Yes
claims[].verified_checksarray of one of "domain", "identity", "authority"YesThe checks that are currently valid (empty if the claim has lapsed).
pending_claimsintegerYesCount of claims in progress. Never names the organizations.
delegationsarray of objectYesActive delegations under or onto this domain (at most 100).
delegations[].child_domainstringYes
delegations[].parent_domainstringYes
delegations[].organization_namestringYes
delegations[].organization_idstring or nullYesThe recipient's public record id, when it is a verified organization.
delegations[].expires_atTimestampYes
issuer_bindingsarray of objectYes
issuer_bindings[].trust_domainTrustDomainYes
issuer_bindings[].statusone of "active", "suspended"Yes
as_ofTimestampYes

ResolveActive

Type: object

FieldTypeRequiredDescription
trust_domainTrustDomainYes
status"active"Yes
assertionstringYesA compact JWS (header.payload.signature). Protected header: alg ES256, typ art-resolution+jwt;v=1, kid (the RFC 7638 thumbprint of the signing key, found in /.well-known/jwks.json). The payload is ResolutionAssertionPayload.
expires_atTimestampYes
checked_atTimestampYes

ResolveInactive

Type: object

FieldTypeRequiredDescription
trust_domainTrustDomainYes
statusstringYesThe binding status (suspended, expired, withdrawn), or inactive when a resolution rule failed.
reasonstringYesA stable reason code: binding_<status>, no_published_binding, no_effective_version, organization_missing, claim_missing, delegation_missing, expiring, or a failed resolution rule such as evidence_expired, claim_not_verified, organization_not_verified, domain_control_missing, evidence_missing:<kind>, superseded_by_more_specific_claim, or delegation_*. New codes may be added.
assertionnullYes
checked_atTimestampYes

ResolveResponse

Type: one of: ResolveActive; ResolveInactive

The resolution result. Discriminate on status.

ResolutionAssertionPayload

Type: object

The decoded JWS payload of ResolveActive.assertion. Not a response body: it exists inside the signed token.

JWS protected header: {"alg":"ES256","typ":"art-resolution+jwt;v=1","kid":"<thumbprint>"}. Verify the signature with the JWKS key whose kid matches, require alg ES256 and the exact typ, require iss to be the directory origin you resolved from and aud to equal workload-directory-resolver-v1, and honour nbf/exp with at most 30 seconds of clock skew. Reject any assertion past its exp; do not cache beyond it. Lifetime is at most 300 seconds and is shortened to the earliest expiry of the binding, the claim, the 90-day domain-control freshness window and every piece of evidence (and, for a delegated binding, the delegation and the parent authority). Check bundle_sha256 against the bytes you fetch from bundle_url. The payload is at most 8192 bytes.

FieldTypeRequiredDescription
issstringYesThe directory origin, for example https://svid.io., format: uri
aud"workload-directory-resolver-v1"Yes
iatintegerYesSeconds since the epoch; the time of the authoritative database read.
nbfintegerYesEqual to iat.
expintegerYesExpiry; at most iat + 300.
schema_version1Yes
binding_idBindingIdYes
binding_versionintegerYesminimum 1
status"active"Yes
organization_idOrganizationIdYes
organization_namestringYesThe verified legal name.
verified_domainstringYesThe domain the organization verified (for a delegated binding, the delegated child domain).
trust_domainTrustDomainYes
profile"spiffe-x509"YesThe only supported profile.
workload_scopeWorkloadScopeYes
bundle_urlstring (uri)YesWhere to fetch the approved bundle (/v1/issuer-bindings/{id}/versions/{version}/bundle).
bundle_sha256BundleDigestYes
evidence_summaryobjectYes
evidence_summary.domain_control"verified"Yes
evidence_summary.organization_identity"reviewed"Yes
evidence_summary.representative_authority"verified"Yes
policy_version"directory-policy-v1"Yes

Example

json
{
  "iss": "https://svid.io",
  "aud": "workload-directory-resolver-v1",
  "iat": 1791201600,
  "nbf": 1791201600,
  "exp": 1791201900,
  "schema_version": 1,
  "binding_id": "bnd_9r2t5w8z1b4d7f0h3k6n9q2s5v",
  "binding_version": 1,
  "status": "active",
  "organization_id": "org_7k3m9q2x8d5f1h4j6n0p2r4t8v",
  "organization_name": "Example Payments, Inc.",
  "verified_domain": "payments.example.com",
  "trust_domain": "agents.payments.example.com",
  "profile": "spiffe-x509",
  "workload_scope": [
    "/agent/checkout",
    "/agent/refunds"
  ],
  "bundle_url": "https://svid.io/v1/issuer-bindings/bnd_9r2t5w8z1b4d7f0h3k6n9q2s5v/versions/1/bundle",
  "bundle_sha256": "q7Yd3nXk0aV2pLw9sT4uHc8BzE1mR6fJ5gN0oIxK2tA",
  "evidence_summary": {
    "domain_control": "verified",
    "organization_identity": "reviewed",
    "representative_authority": "verified"
  },
  "policy_version": "directory-policy-v1"
}

Jwk

Type: object

A public ES256 signing key. Private members are never published.

FieldTypeRequiredDescription
kty"EC"Yes
crv"P-256"Yes
xstringYes
ystringYes
kidstringYesRFC 7638 thumbprint.
use"sig"Yes
alg"ES256"Yes

Jwks

Type: object

FieldTypeRequiredDescription
keysarray of JwkYesat least 1 items

SpiffeBundle

Type: object

A SPIFFE trust bundle in the SPIFFE federation (JWKS) format, exactly as the issuer submitted and the reviewers approved it.

FieldTypeRequiredDescription
spiffe_sequenceintegerNominimum 0
spiffe_refresh_hintintegerNominimum 0
keysarray of objectYes1 to 32 items
keys[].useone of "x509-svid", "jwt-svid"No
keys[].ktystringNo
keys[].crvstringNo
keys[].xstringNo
keys[].ystringNo
keys[].kidstringNo
keys[].x5carray of stringNoat most 1 items

ChangeEvent

Type: object

A public lifecycle event. subject is {trust_domain} for binding events and {domain} for delegation, claim and domain.added events. domain.added: an unlisted domain was added after live DNS and TLS validation (POST /v1/domains); its data is {state: unclaimed, registrable_domain, source: enrollment, observed_at, certificate_class, wildcard_match} and never names who asked. At most 100 domain.added events per UTC hour are published; additions beyond that are summarised, after the hour, by one domain.added.batch event with subject: {period_start} and data: {period_end, count, source}. data carries only the allow-listed public fields below, and fields not known for an event are omitted.

FieldTypeRequiredDescription
idstringYesStable event id. Deduplicate on it.
event_typeone of "binding.activated", "binding.rotated", "binding.resumed", "binding.suspended", "binding.withdrawn", "binding.expired", "delegation.activated", "delegation.withdrawn", "delegation.expired", "delegation.revoked", "claim.state_changed", "domain.added", "domain.added.batch"Yes
atTimestampYes
subjectone of: object; object; objectYes
dataobjectYesEvent payload (public allow-list).
data.binding_idBindingIdNo
data.delegation_idDelegationIdNo
data.claim_idClaimIdNo
data.organization_idOrganizationIdNo
data.statestringNoThe new state.
data.previous_statestringNo
data.effective_atTimestampNo
data.expires_atTimestampNo
data.binding_versionintegerNo
data.previous_binding_versionintegerNo
data.rotation_kindRotationKindNo
data.bundle_sha256BundleDigestNo
data.previous_bundle_sha256BundleDigestNo
data.overlap_untilTimestampNo
data.profilestringNo
data.workload_scopearray of stringNo
data.parent_domainstringNo
data.actionsarray of stringNo
data.registrable_domainstringNo
data.sourcestringNo
data.observed_atTimestampNo
data.certificate_classstring or nullNo
data.wildcard_matchbooleanNo
data.period_endTimestampNo
data.countintegerNo

ChangeFeedPage

Type: object

FieldTypeRequiredDescription
eventsarray of ChangeEventYes
next_cursorstringYesOpaque. Persist after processing the page and pass it as cursor next time. It advances past every row read, including rows not in the public projection, so a page can have fewer events than limit even when has_more is true.
has_morebooleanYes

AuthProviders

Type: object

FieldTypeRequiredDescription
githubbooleanYes
googlebooleanYes
test_loginbooleanYes
test_login_key_requiredbooleanYes

TestLoginRequest

Type: object

FieldTypeRequiredDescription
subjectstringYespattern ^[A-Za-z0-9._@-]{1,128}$
emailstring (email)Yesat most 254 characters

TestLoginResponse

Type: object

FieldTypeRequiredDescription
principal_idstringYes
has_passkeybooleanYes
mfafalseYes

SessionInfo

Type: object

FieldTypeRequiredDescription
principalobjectYes
principal.idstringYes
principal.idpstringYesgithub, google or test.
principal.emailstring or nullYes
principal.display_namestring or nullYes
mfabooleanYesWhether a passkey assertion has been completed in this session.
mfa_atstring (date-time) or nullYesThe last passkey assertion; step-up needs this within 300 seconds.
has_passkeybooleanYes
csrf_tokenstringYesSend as x-art-csrf on mutations.
rolesobjectYes
roles.platformarray of stringYesPlatform roles (internal staff). Empty for organization users.
roles.organizationsarray of objectYes
roles.organizations[].organization_idOrganizationIdYes
roles.organizations[].roleOrgRoleYes
expires_atTimestampYes

WebAuthnOptions

Type: object

WebAuthn PublicKeyCredentialCreationOptionsJSON or PublicKeyCredentialRequestOptionsJSON, as produced by SimpleWebAuthn. Pass to the browser's WebAuthn API unchanged.

PasskeyCeremonyRequest

Type: object

FieldTypeRequiredDescription
responseobjectYesThe RegistrationResponseJSON or AuthenticationResponseJSON from the browser.

PasskeyRegistered

Type: object

FieldTypeRequiredDescription
credential_idstringYes
mfatrueYes
mfa_atTimestampYes

PasskeyAuthenticated

Type: object

FieldTypeRequiredDescription
mfatrueYes
mfa_atTimestampYes

RecoveryState

Type: one of "pending", "approved", "rejected", "expired", "withdrawn", "superseded_by_recovery"

pending until the reviewers approve (approved), one rejects, the requester withdraws, 30 days pass (expired), or another recovery of the organization is approved (superseded_by_recovery). All but pending are terminal.

RecoveryRequest

Type: object

FieldTypeRequiredDescription
idstringYes
organizationobjectYes
organization.idstringNo
organization.legal_namestringNo
stateRecoveryStateYes
versionintegerYes
created_atstring (date-time)Yes
updated_atstring (date-time)Yes
expires_atstring (date-time)Yes
domain_rechecked_atstring (date-time) or nullYesWhen you passed the fresh DNS challenge for this request.
approvalsintegerYesDistinct reviewers who approved the current version.
required_approvalsintegerYes
verified_domainsarray of stringYesThe organization's verified domains (where a recovery challenge may be issued).
challengeobject or nullYesThe live DNS challenge, never its value.
challenge.idstringNo
challenge.dns_namestringNo
challenge.expires_atstring (date-time)No
challenge.attemptsintegerNo
challenge.remainingintegerNo
required_domainsarray of objectYesEvery domain this recovery must re-prove, and whether you have (within 7 days).
required_domains[].domainstringNo
required_domains[].provenbooleanNo
owner_objectionobject or nullNo
owner_objection.atstring (date-time)No
earliest_decision_atstring (date-time)YesThe earliest time the final approval can be recorded (the owners' notice period).
reasonstring or nullNoWhat you wrote (private). Only in GET responses; null after the retention period.
contact_detailsstring or nullNoWhat you wrote (private). Only in GET responses; null after the retention period.
next_actionsarray of one of "request_dns_challenge", "publish_txt_record_and_verify", "await_independent_review"Yes

Organization

Type: object

FieldTypeRequiredDescription
idOrganizationIdYes
legal_namestringYes
jurisdictionstringYesISO 3166-1 alpha-2 country, optionally with an ISO 3166-2 subdivision., examples: [US, US-DE]
registration_referencestring or nullYes
verification_statusstringYesdraft until identity is verified, then verified.
versionintegerYesOptimistic concurrency token (expected_version).
minimum 1
created_atTimestampYes
updated_atTimestampYes
my_rolesarray of stringNoThe caller's roles (a service token's scopes). Present on create, get, update and list.

CreateOrganizationRequest

Type: object

FieldTypeRequiredDescription
legal_namestringYesNFC-normalized, trimmed, 1 to 200 code points, no control or bidi characters.
1 to 200 characters
jurisdictionstringYesISO 3166-1 alpha-2 country, optionally with an ISO 3166-2 subdivision (for example US or US-DE)., examples: [US-DE]
registration_referencestring or nullNoat most 100 characters

UpdateOrganizationRequest

Type: object

FieldTypeRequiredDescription
expected_versionintegerYesminimum 1
legal_namestringNo1 to 200 characters
jurisdictionstringNo
registration_referencestring or nullNonull or "" clears it.
at most 100 characters

OrganizationList

Type: object

FieldTypeRequiredDescription
organizationsarray of OrganizationYes

ClaimSummary

Type: object

FieldTypeRequiredDescription
idClaimIdYes
domainstringYes
stateClaimStateYes
resume_stateone of: ClaimState; nullYes
versionintegerYes
created_atTimestampYes
updated_atTimestampYes
authority_expires_atstring (date-time) or nullYes
permitted_actionsarray of PermittedActionYes

ClaimList

Type: object

FieldTypeRequiredDescription
claimsarray of ClaimSummaryYes

IssuerBindingSummary

Type: object

FieldTypeRequiredDescription
idBindingIdYes
trust_domainTrustDomainYes
verified_domainstring or nullYes
mappingone of "dns", "explicit", nullYes
profile"spiffe-x509"Yes
workload_scopeWorkloadScopeYes
environmentone of "production", "test"Yes
statusBindingStatusYes
versionintegerYes
current_versionintegerYesThe served bundle version; 0 until first activation.
expires_atstring (date-time) or nullYes
created_atTimestampYes
updated_atTimestampYes
latest_versioninteger or nullYes

IssuerBindingList

Type: object

FieldTypeRequiredDescription
issuer_bindingsarray of IssuerBindingSummaryYes

Member

Type: object

FieldTypeRequiredDescription
principal_idstringYes
roleOrgRoleYes
statusstringYes
versionintegerYesUse as expected_version.
display_namestring or nullYes
idpstringYes
emailstring or nullNoOnly shown to owners, and only for active members.
created_atTimestampYes
updated_atTimestampYes

MemberList

Type: object

FieldTypeRequiredDescription
membersarray of MemberYes

UpdateMemberRequest

Type: object

FieldTypeRequiredDescription
roleOrgRoleYes
expected_versionintegerYesminimum 1

RemoveMemberRequest

Type: object

expected_version is required when removing another member and optional when leaving (me).

FieldTypeRequiredDescription
expected_versionintegerNominimum 1

CreateInvitationRequest

Type: object

FieldTypeRequiredDescription
emailstring (email)Yesat most 254 characters
roleOrgRoleYes

InvitationCreated

Type: object

FieldTypeRequiredDescription
invitation_idstringYes
organization_idOrganizationIdYes
roleOrgRoleYes
status"pending"Yes
expires_atTimestampYes

OrganizationInvitationList

Type: object

FieldTypeRequiredDescription
invitationsarray of objectYes
invitations[].idstringYes
invitations[].roleOrgRoleYes
invitations[].status"pending"Yes
invitations[].invited_bystringYes
invitations[].created_atTimestampYes
invitations[].expires_atTimestampYes

MyInvitationList

Type: object

FieldTypeRequiredDescription
invitationsarray of objectYes
invitations[].idstringYes
invitations[].organizationobjectYes
invitations[].organization.idOrganizationIdYes
invitations[].organization.legal_namestringYes
invitations[].roleOrgRoleYes
invitations[].created_atTimestampYes
invitations[].expires_atTimestampYes

InvitationAccepted

Type: object

FieldTypeRequiredDescription
organization_idOrganizationIdYes
roleOrgRoleYes
status"active"Yes

CreateServiceTokenRequest

Type: object

FieldTypeRequiredDescription
namestringYes1 to 100 characters
scopesarray of ServiceTokenScopeYesat least 1 items; unique items
expires_in_daysintegerNo1 to 90; default 30

ServiceToken

Type: object

FieldTypeRequiredDescription
idstringYes
namestringYes
scopesarray of ServiceTokenScopeYes
expires_atTimestampYes
created_bystringYes
created_atTimestampYes
revoked_atstring (date-time) or nullYes
last_used_atstring (date-time) or nullYes

ServiceTokenCreated

Type: ServiceToken and object

ServiceTokenList

Type: object

FieldTypeRequiredDescription
service_tokensarray of ServiceTokenYes

Claim

Type: object

FieldTypeRequiredDescription
idClaimIdYes
organization_idOrganizationIdYes
domainstringYes
stateClaimStateYes
resume_stateone of: ClaimState; nullYesThe pending step to return to after needs_information, a dispute or a rejection.
versionintegerYesOptimistic concurrency token.
minimum 1
claimant_idstringYes
created_atTimestampYes
updated_atTimestampYes
expires_atstring (date-time) or nullYes
domain_verified_atstring (date-time) or nullYes
identity_verified_atstring (date-time) or nullYes
authority_verified_atstring (date-time) or nullYes
authority_expires_atstring (date-time) or nullYes
permitted_actionsarray of PermittedActionYesWhat the reviewed representative authority permits.

ClaimEnvelope

Type: object

FieldTypeRequiredDescription
claimClaimYes

CreateClaimRequest

Type: object

FieldTypeRequiredDescription
organization_idOrganizationIdYes
domainstringYesAn exact hostname. It is canonicalized; a name that is not a valid registrable-domain hostname is a field error carrying the reason.

DnsChallenge

Type: object

FieldTypeRequiredDescription
idstringYes
purpose"recheck"NoPresent only on recheck challenges.
dns_namestringYesWhere to publish the TXT record., examples: [_workload-directory.payments.example.com]
record_type"TXT"Yes
expires_atTimestampYes
max_attemptsintegerYes
attemptsintegerNoPresent on recheck challenges.
valuestring or nullYesThe exact TXT value (art-verify=<token>), shown once. null in an idempotent replay (with value_redacted: true).
value_redactedtrueNo

ClaimCreated

Type: object

FieldTypeRequiredDescription
claimClaimYes
challengeDnsChallengeYes
instructionsstringYes

ChallengeCreated

Type: object

FieldTypeRequiredDescription
challengeDnsChallengeYes
instructionsstringYes

ChallengeStatus

Type: object

A challenge as shown after creation: status only, never the value.

FieldTypeRequiredDescription
idstringYes
purposeone of "claim", "recheck"Yes
principal_idstringYes
dns_namestringYes
expires_atTimestampYes
consumed_atstring (date-time) or nullYes
attemptsintegerYes
statusone of "pending", "consumed", "failed", "expired", "superseded", "cancelled"Yes
last_failurestring or nullYes
last_checked_atstring (date-time) or nullYes
created_atTimestampYes

ClaimEvidence

Type: object

Evidence as the organization may see it. description, details and files appear only for the organization's own submitted rows.

FieldTypeRequiredDescription
idstringYes
kindstringYes
resultstringYes
observed_atTimestampYes
expires_atstring (date-time) or nullYes
descriptionstring or nullNo
detailsobject or nullNo
filesarray of objectNo
files[].idstringYes
files[].namestringYes
files[].content_typeEvidenceContentTypeYes
files[].sizeintegerYes
files[].statusEvidenceFileStatusYes
files[].rejection_reasonstring or nullYes
files[].sha256string or nullYes
files[].uploaded_atstring (date-time) or nullYes

ClaimDetail

Type: object

FieldTypeRequiredDescription
claimClaimYes
information_requestobject or nullYesWhile the claim is needs_information: what the reviewer asked the organization to provide. message is the reviewer's organization-visible request text (null if none was given). The reviewer's private reason and identity are never returned.
information_request.checkone of "identity", "authority"Yes
information_request.messagestring or nullYesat most 2000 characters
information_request.requested_atTimestampYes
checksobjectYes
checks.domain_controlone of "passed", "pending"Yes
checks.organization_identityone of "passed", "pending"Yes
checks.representative_authorityone of "passed", "pending"Yes
challengesarray of ChallengeStatusYesThe five most recent, newest first.
evidencearray of ClaimEvidenceYesUp to 50, newest first.
failed_checksarray of objectYes
failed_checks[].check"domain_control"Yes
failed_checks[].challenge_idstringYes
failed_checks[].reasonstringYes
failed_checks[].attemptsintegerYes
failed_checks[].atstring (date-time) or nullYes
next_actionsarray of stringYesSuggested next steps (stable codes such as publish_txt_record_and_verify, request_new_challenge, submit_organization_identity_evidence, submit_representative_authority_evidence, provide_requested_information, await_review, await_dispute_review, complete_domain_recheck, request_domain_recheck, file_a_new_claim).
domain_recheckobject or nullYesPresent when a 90-day recheck challenge is open.
domain_recheck.challenge_idstringYes
domain_recheck.dns_namestringYes
domain_recheck.record_type"TXT"Yes
domain_recheck.expires_atTimestampYes
domain_recheck.domain_control_fresh_untilstring (date-time) or nullYes
domain_recheck.valuenullYes
domain_recheck.revealstringYesThe request that reveals a (rotated) value.

JobAccepted

Type: object

FieldTypeRequiredDescription
job_idstringYes
statusJobStateYes
challenge_idstringYes

JobState

Type: one of "queued", "running", "retry", "done", "failed", "cancelled"

Job

Type: object

FieldTypeRequiredDescription
idstringYes
kindstringYes
stateJobStateYes
attemptsintegerYes
resultobject or nullYesThe job outcome once done. verify_dns: outcome is verified, no_match, rejected or not_pending. domain_enroll: added (with domain_id and the observation summary), present, or rejected (with reason and a plain-words message).
created_atTimestampYes
updated_atTimestampYes

AppealRequest

Type: object

FieldTypeRequiredDescription
reasonstringYesPlain text, no control characters. Kept in the audit trail for the reviewer; never public.
1 to 2000 characters
expected_versionintegerNoIf sent, must equal the claim's current version.

ExpectedVersionRequest

Type: object

FieldTypeRequiredDescription
expected_versionintegerYesThe version you last read; a stale value is 409.
minimum 1

WithdrawRequest

Type: object

FieldTypeRequiredDescription
expected_versionintegerYesThe version you last read; a stale value is 409.
reasonstringNoFree text (newlines allowed, no other control characters).
at most 2000 characters

WithdrawBindingRequest

Type: object

FieldTypeRequiredDescription
expected_versionintegerYesThe version you last read; a stale value is 409.
reasonstringYesRequired. Free text (newlines allowed, no other control characters); audit log only, never public.
1 to 2000 characters

EvidenceContentType

Type: one of "application/pdf", "image/png", "image/jpeg"

EvidenceFileStatus

Type: one of "awaiting_upload", "uploading", "stored", "rejected"

EvidenceDetails

Type: object

Kind-specific structured details. Allowed keys depend on kind: organization_identity accepts type (ca_certificate, registry_record, other), certificate_reference, registry_url, registry_number, registry_name; representative_authority accepts type (independent_contact, delegated_authority_letter, company_email, other), contact_name, contact_role, contact_channel, company_email. Unknown keys are rejected. See the operation for which keys each type requires.

FieldTypeRequiredDescription
typestringYes
certificate_referencestringNoat most 500 characters
registry_urlstring (uri)NoAn https URL.
at most 500 characters
registry_numberstringNoat most 100 characters
registry_namestringNoat most 200 characters
contact_namestringNoat most 200 characters
contact_rolestringNoat most 200 characters
contact_channelstringNoat most 200 characters
company_emailstring (email)Noat most 254 characters

DeclaredFile

Type: object

FieldTypeRequiredDescription
namestringYesA file name; / and \ are rejected.
1 to 200 characters
content_typeEvidenceContentTypeYes
sizeintegerYesExact size in bytes (at most 10 MiB).
1 to 10485760

SubmitEvidenceRequest

Type: object

FieldTypeRequiredDescription
kindone of "organization_identity", "representative_authority"Yes
descriptionstringYesPlain text for the reviewer.
1 to 2000 characters
detailsEvidenceDetailsYes
filesarray of DeclaredFileNoat most 5 items

EvidenceSubmitted

Type: object

FieldTypeRequiredDescription
evidenceobjectYes
evidence.idstringYes
evidence.claim_idClaimIdYes
evidence.kindone of "organization_identity", "representative_authority"Yes
evidence.result"submitted"Yes
evidence.created_atTimestampYes
evidence.filesarray of objectYes
evidence.files[].idstringYes
evidence.files[].namestringYes
evidence.files[].content_typeEvidenceContentTypeYes
evidence.files[].sizeintegerYes
evidence.files[].status"awaiting_upload"Yes
evidence.files[].upload_expires_atTimestampYes
evidence.files[].uploadobjectYesHow to upload this file. The token is shown once (null and upload_redacted: true in an idempotent replay).
evidence.files[].upload_redactedtrueNo

EvidenceFileStored

Type: object

FieldTypeRequiredDescription
idstringYes
evidence_idstringYes
status"stored"Yes
sizeintegerYes
sha256stringYesHex SHA-256 of the stored bytes.

BindingStatus

Type: string

draft, pending_review, active, suspended, withdrawn or expired. Other terminal values may appear.

CreateIssuerBindingRequest

Type: object

FieldTypeRequiredDescription
claim_idClaimIdYes
trust_domainTrustDomainYes
profile"spiffe-x509"YesThe only supported profile. Needs at least one x509-svid key.
bundle_endpointstring (uri)Yeshttps, port 443, DNS host (no IP literal), no credentials or fragment. Must be at or under the verified domain.
at most 2048 characters
bundlestringYesThe exact SPIFFE bundle JSON text (a string, not an object), UTF-8, no BOM, at most 64 KiB and 32 keys. The directory stores and hashes these exact bytes.
at most 65536 characters
workload_scopeWorkloadScopeYes
environmentone of "production", "test"NoProduction deployments accept only production.
default "production"
mappingone of "dns", "explicit"Nodns: the trust domain is the claim's domain or a DNS name under it. explicit: a single-label trust domain (no dots) mapped by a reviewer.
default "dns"

BindingVersion

Type: object

FieldTypeRequiredDescription
versionintegerYesminimum 1
statusstringYesproposed, active, superseded, rejected, quarantined or replaced.
endpointstring (uri)Yes
bundle_sha256BundleDigestYes
bundle_sizeintegerYes
keysarray of objectYesA summary of the keys in the bundle (type, curve and use; no key material).
created_atTimestampYes
approved_atstring (date-time) or nullYes
effective_atstring (date-time) or nullYes
endpoint_checked_atstring (date-time) or nullYes
overlap_untilstring (date-time) or nullYes
superseded_byinteger or nullYes
rotation_ofinteger or nullYes
overlap_secondsinteger or nullYes
rotation_kindone of: RotationKind; nullYesThe kind of rotation this version is (null for a first registration).
issuer_controlobject or nullYesThe issuer-control evidence behind this version.
ceremony_componentsarray of objectYes

BindingRotation

Type: object

A rotation in flight (version N+1 proposed against the served version N).

FieldTypeRequiredDescription
versionintegerYes
rotation_ofintegerYes
kindone of: RotationKind; nullYesNull for a proposal made before kinds existed.
overlap_secondsintegerYes
continuitybooleanYesThe new bundle shares at least one x509-svid authority with the served version.
required_approvalsone of 1, 2Yes
ceremony_completebooleanYes

Binding

Type: object

FieldTypeRequiredDescription
idBindingIdYes
organization_idOrganizationIdYes
claim_idClaimIdYes
delegation_idone of: DelegationId; nullYes
trust_domainTrustDomainYes
verified_domainstring or nullYes
mappingone of "dns", "explicit", nullYes
profile"spiffe-x509"Yes
workload_scopeWorkloadScopeYes
environmentone of "production", "test"Yes
required_approvalsintegerYesIndependent reviewer approvals this binding needs in the current deployment.
statusBindingStatusYes
status_reasonstring or nullYes
versionintegerYesOptimistic concurrency token (expected_version).
minimum 1
current_versionintegerYesThe served bundle version; 0 until first activation.
minimum 0
expires_atstring (date-time) or nullYes
created_atTimestampYes
updated_atTimestampYes
endpoint_driftbooleanYesThe federation endpoint no longer serves the approved keys.
endpoint_drift_atstring (date-time) or nullYes
rotationone of: BindingRotation; nullYes
versionsarray of BindingVersionYes
next_actionsarray of stringYesSuggested next steps (complete_issuer_control_ceremony, submit_new_version, await_review, await_rotation_review, rotate, rotate_to_endpoint_keys_or_restore_endpoint).

BindingEnvelope

Type: object

FieldTypeRequiredDescription
bindingBindingYes

Ceremony

Type: object

Human-readable instructions for the issuer-control ceremony of one binding version.

FieldTypeRequiredDescription
versionintegerYes
bundle_sha256BundleDigestYes
challengestringYes
requiredarray of stringYes
methodsobjectYesInstructions keyed by proof method.
methods.federation_endpointstringNo
methods.x509_svidstringNo
methods.signed_statementstringNo
afterstringYes

BindingWithCeremony

Type: object

FieldTypeRequiredDescription
bindingBindingYes
ceremonyCeremonyYes

CreateBindingVersionRequest

Type: object

FieldTypeRequiredDescription
expected_versionintegerYesThe binding's version.
bundlestringYesThe exact SPIFFE bundle JSON text.
at most 65536 characters
bundle_endpointstring (uri)NoDefaults to the previous version's endpoint.
at most 2048 characters

RotationKind

Type: one of "add", "remove", "renewal", "emergency"

See POST /v1/issuer-bindings/{id}/rotate for the rules of each kind.

RotateBindingRequest

Type: object

FieldTypeRequiredDescription
expected_versionintegerYesThe binding's version.
bundlestringYesThe exact SPIFFE bundle JSON text of the new version.
at most 65536 characters
bundle_endpointstring (uri)NoDefaults to the served version's endpoint.
at most 2048 characters
overlap_secondsintegerYesThe overlap recorded on an add step: the earliest a later remove step may drop the old authorities (activation + this). 330 s to 7 days; at least 86400 s for an add step in production. Required for every kind.
330 to 604800
emergencybooleanNoDeclare an emergency rotation (compromise response): replaces or drops authorities at once, always 2 approvals. Needs reason.
default false
reasonstringNoRequired with emergency: true, refused otherwise. Newlines allowed, no other control characters.
1 to 2000 characters

RotationPreviewRequest

Type: object

The body of RotateBindingRequest, with expected_version optional.

FieldTypeRequiredDescription
expected_versionintegerNo
bundlestringYesat most 65536 characters
bundle_endpointstring (uri)Noat most 2048 characters
overlap_secondsintegerYes330 to 604800
emergencybooleanNodefault false
reasonstringNo1 to 2000 characters

RotationPreview

Type: object

FieldTypeRequiredDescription
allowedbooleanYesWhether rotate would accept this body now.
dry_runtrueYes
refusalobject or nullYes
refusal.codestringYes
refusal.statusintegerYes
refusal.messagestringYes
refusal.field_errorsarray of FieldErrorYes
rotationobject or nullYes
rotation.versionintegerNo
rotation.rotation_ofintegerNo
rotation.kindRotationKindNo
rotation.overlap_secondsintegerNo
rotation.continuitybooleanNo
rotation.renewalbooleanNo
rotation.emergencybooleanNo
rotation.shared_authoritiesarray of stringNo
rotation.added_authoritiesarray of stringNo
rotation.removed_authoritiesarray of stringNo
rotation.required_approvalsone of 1, 2No
rotation.bundle_sha256BundleDigestNo
rotation.bundle_endpointstringNo
rotation.replaces_pending_versioninteger or nullNoA proposal not yet activated that the submit would replace.
rotation.overlap_until_if_activated_nowstring (date-time) or nullNo
overlap_rulesobjectYes
overlap_rules.min_overlap_secondsintegerNo
overlap_rules.max_overlap_secondsintegerNo
overlap_rules.min_add_overlap_secondsintegerNo86400 in a production deployment.
overlap_rules.served_overlap_untilstring (date-time) or nullNo
overlap_rules.earliest_remove_atstring (date-time)No
overlap_rules.assertion_bound_secondsintegerNo
next_stepsarray of stringYes

RotationProposed

Type: object

FieldTypeRequiredDescription
bindingBindingYes
rotationobjectYes
rotation.versionintegerYes
rotation.rotation_ofintegerYes
rotation.kindRotationKindYes
rotation.overlap_secondsintegerYes
rotation.continuitybooleanYes
rotation.renewalbooleanYesThe new bundle is byte-identical to the served one (kind is renewal).
rotation.emergencybooleanYeskind is emergency.
rotation.shared_authoritiesarray of stringYesFingerprints of x509-svid authorities in both bundles.
rotation.added_authoritiesarray of stringYesFingerprints only in the new bundle.
rotation.removed_authoritiesarray of stringYesFingerprints only in the served bundle.
rotation.required_approvalsone of 1, 2Yes
ceremonyCeremonyYes

ControlChallengeStatus

Type: object

FieldTypeRequiredDescription
challengeobject or nullYesThe live challenge's status (never its nonce), or null if none is usable.
challenge.idstringYes
challenge.versionintegerYes
challenge.bundle_sha256BundleDigestYes
challenge.expires_atTimestampYes
challenge.attemptsintegerYes
challenge.max_attemptsintegerYes
challenge.noncenullYes
challenge.value_redactedtrueYes
issuestringYesThe request that issues a challenge.
ceremonyCeremonyYes

ControlChallengeIssued

Type: object

FieldTypeRequiredDescription
challengeobjectYes
challenge.idstringYes
challenge.versionintegerYes
challenge.bundle_sha256BundleDigestYes
challenge.expires_atTimestampYes
challenge.max_attemptsintegerYes
challenge.noncestring or nullYesThe one-time nonce, shown once. null in an idempotent replay.
challenge.challenge_kidstring or nullYesThe kid the federation endpoint must publish: art-challenge-<nonce>.
challenge.value_redactedtrueNo
ceremonyCeremonyYes

ControlProofRequest

Type: object

FieldTypeRequiredDescription
methodone of "federation_endpoint", "x509_svid", "signed_statement"Yes
svidsarray of stringNoRequired for x509_svid and forbidden otherwise. One PEM chain (leaf first) per x509-svid CA in the bundle.
statementsarray of stringNoRequired for signed_statement and forbidden otherwise. One compact JWS per jwt-svid key (1 to 32).
1 to 32 items
expected_versionintegerNoIf sent, must equal the binding's version.

ControlProofResult

Type: object

FieldTypeRequiredDescription
bindingBindingYes
componentobjectYesThe proof component just recorded, with a public summary of what it showed.
component.idstringYes
component.kindone of "issuer_surface", "ca_possession", "jwt_key_possession"Yes
component.result"pass"Yes
ceremony_statusobjectYes
ceremony_status.challenge_idstringYes
ceremony_status.requiredarray of one of "issuer_surface", "ca_possession", "jwt_key_possession"Yes
ceremony_status.passedarray of one of "issuer_surface", "ca_possession", "jwt_key_possession"Yes
ceremony_status.completebooleanYes

BindingWithdrawn

Type: object

FieldTypeRequiredDescription
statusBindingStatusYes
committed_atTimestampYes
assertion_bound_seconds330YesWorst case, in seconds after committed_at, that an assertion signed before the commit may still be accepted (300 s lifetime plus 30 s verifier clock skew).
bindingBindingYes

CreateDelegationRequest

Type: object

FieldTypeRequiredDescription
parent_claim_idClaimIdYes
child_domainstringYesA strict DNS descendant of the parent claim's domain.
recipient_organization_idOrganizationIdYes
scopeWorkloadScopeYes
actionsarray of one of "authorize_issuer", "manage_domain"YesWhat the recipient may do. delegate (redelegation) is refused.
at least 1 items; unique items
expires_atstring (date-time)YesISO 8601 with a time zone; more than 1 minute and at most 1 year ahead, and not after the parent's representative authority.

Delegation

Type: object

FieldTypeRequiredDescription
idDelegationIdYes
statusone of "pending_review", "active", "rejected", "withdrawn", "expired", "revoked"Yes
status_reasonstring or nullYes
versionintegerYesOptimistic concurrency token (expected_version).
minimum 1
directionone of "outgoing", "incoming"Yesoutgoing from the parent's side, incoming from the recipient's.
parentobjectYes
parent.organization_idOrganizationIdYes
parent.organization_namestringYes
parent.claim_idClaimIdYes
parent.domainstringYes
child_domainstringYes
recipientobjectYes
recipient.organization_idOrganizationIdYes
recipient.organization_namestringYes
actionsarray of stringYes
workload_scopeWorkloadScopeYes
expires_atTimestampYes
created_atTimestampYes
accepted_atstring (date-time) or nullYes
activated_atstring (date-time) or nullYes
ended_atstring (date-time) or nullYes
reviewobjectYes
review.statusone of "pending", "approved", "rejected", "not_applicable"Yes
dependent_bindingsintegerYesDraft, pending or active issuer bindings that depend on this delegation.
next_actionsarray of stringYesaccept, await_recipient_acceptance, await_review, register_issuers_under_child_domain, withdraw.

DelegationEnvelope

Type: object

FieldTypeRequiredDescription
delegationDelegationYes

DelegationList

Type: object

FieldTypeRequiredDescription
delegationsarray of DelegationYes