Skip to content

Server discovery

Stable

Generated from capsule-server/openapi.json, the OpenAPI 3.2 document capsule-server emits and mise run openapi-check-kynos keeps current. To change a description on this page, change the annotation on the handler or model it comes from and regenerate — this file is build output. The auth model, error contract, and conventions common to every endpoint are on the REST API overview.

Serve this server’s storage-attestation keys and their append-only history.

Cacheable and unauthenticated. It changes only when a key rotates, and a client that pinned a stale copy still resolves every receipt signed before it fetched — which is the property the append-only ordering buys.

Authentication: none.

StatusBodyDescription
200AttestationKeysResponse
application/json
OK. Headers: X-Capsule-Min-Client-Build, X-Capsule-Protocol-Max, X-Capsule-Protocol-Min.
413the request body exceeds the configured limit. Headers: X-Capsule-Min-Client-Build, X-Capsule-Protocol-Max, X-Capsule-Protocol-Min.

Serve the announced deprecation cutoffs.

The same announcements server-info carries, at their own path because that is the URL the Warning: header on a below-cutoff response points a human at, and because a client polling for a cutoff should not have to refetch the whole discovery record to find one.

Authentication: none.

StatusBodyDescription
200DeprecationsResponse
application/json
OK. Headers: X-Capsule-Min-Client-Build, X-Capsule-Protocol-Max, X-Capsule-Protocol-Min.
413the request body exceeds the configured limit. Headers: X-Capsule-Min-Client-Build, X-Capsule-Protocol-Max, X-Capsule-Protocol-Min.

Serve the federation capability revocation list.

Bounded by at most 24 hours of revocations, because an entry past the token’s own exp is pruned and a capability token cannot be minted to live longer than that. Public: a peer checking whether a token it holds is still good is, by construction, not yet authenticated here, and the record names no user — only opaque jtis.

Returns 503 if the revocation list cannot be read. Deliberately not an empty list: an empty list is the strongest possible claim this endpoint can make — nothing is revoked — and serving it on a storage failure would turn an outage into a silent un-revocation of every token, which is exactly what the peer-side fail-closed rule exists to prevent.

Authentication: none.

StatusBodyDescription
200RevokedJtiResponse
application/json
OK. Headers: X-Capsule-Min-Client-Build, X-Capsule-Protocol-Max, X-Capsule-Protocol-Min.
413the request body exceeds the configured limit. Headers: X-Capsule-Min-Client-Build, X-Capsule-Protocol-Max, X-Capsule-Protocol-Min.
503CodedProblem
application/problem+json
Revocation list unavailable. Headers: X-Capsule-Min-Client-Build, X-Capsule-Protocol-Max, X-Capsule-Protocol-Min.

Serve this server’s public, server-scoped facts.

Unauthenticated by contract: a client deciding whether it can talk to this server at all has no credential yet, and a peer resolving the key that verifies a capability token must not need one from the server whose claims it is checking.

Authentication: none.

StatusBodyDescription
200ServerInfoResponse
application/json
OK. Headers: X-Capsule-Min-Client-Build, X-Capsule-Protocol-Max, X-Capsule-Protocol-Min.
413the request body exceeds the configured limit. Headers: X-Capsule-Min-Client-Build, X-Capsule-Protocol-Max, X-Capsule-Protocol-Min.

The models these endpoints carry. A field whose type names another model links to it when this page documents that model, which it does when some path from an operation reaches it within 4 references. A model only ever reached deeper than that is named without being expanded.

The .well-known/capsule/attestation-keys record.

FieldTypeDescription
server_idstringRequired. This server’s canonical origin — the other half of the binding that refuses a cross-server replay.
keysPublishedKeyResponse[]Required. Every key this server has signed with, oldest first, the active one last.

The auth ceremony’s endpoints.

FieldTypeDescription
loginstringRequired. Where a session is opened.
refreshstringRequired. Where an access token is rotated.
logoutstringRequired. Where a session is ended.
oidcOidcEndpointsResponse | nullWhere a sign-in through an external identity provider begins and ends, or null when this deployment has none. Always present, so a client reads one field rather than probing for one.

An RFC 9457 problem detail.

FieldTypeDescription
typestringRequired.
titlestring
statusintegerRequired.
detailstring
instancestring
codestringRequired. The stable error.* catalog code. The client localizes this; detail stays English. Present on every problem this server renders.

One announced deprecation cutoff.

FieldTypeDescription
min_protocol_versionstringRequired. The lowest protocol_version that remains accepted after the cutoff.
announced_atstringRequired. When the announcement was first published, RFC 3339.
cutoffstringRequired. When versions below min_protocol_version stop being accepted, RFC 3339.
detail_urlstring | nullWhere a human reads what to do about it.

The .well-known/capsule/deprecation record.

FieldTypeDescription
announcementsDeprecationResponse[]Required. Every announced cutoff, in announcement order.

The OIDC ceremony’s endpoints (slice S-N1).

FieldTypeDescription
authorizestringRequired. Where a client asks for an authorization URL.
callbackstringRequired. Where a client presents the state and code the provider’s redirect carried.

The accepted protocol_version range.

FieldTypeDescription
minstringRequired. The oldest version still accepted for writes.
maxstringRequired. The newest version this server speaks.

One published attestation key.

FieldTypeDescription
key_idstringRequired. The fingerprint a receipt’s server_key_id selects on, lowercase hex.
publicstringRequired. The hybrid public key, base64 (Ed25519ML-DSA-65).
algorithmstringRequired. The signature algorithm this key is used with.
active_fromstringRequired. When it began signing, RFC 3339.
active_tostring | nullWhen it stopped, or absent while it is the active key.

The .well-known/capsule/revoked-jti record.

FieldTypeDescription
generated_atstringRequired. When this snapshot was taken, RFC 3339. Part of the record rather than left to an HTTP Date, because the staleness rule a peer applies is a property of the list’s content — a verifier reasoning from a transport header would be trusting a cache to be honest about its own age.
max_staleness_secondsintegerRequired. How stale a cached copy of this list may be before it stops being usable, in seconds. Published so the rule is discoverable rather than a constant every peer implementation has to have read the same document to know.
revokedRevokedTokenResponse[]Required. Every revoked jti not yet past its own expiry, soonest expiry first.

One revoked capability token.

FieldTypeDescription
jtistringRequired. The token’s jti claim.
expires_atstringRequired. The token’s own exp, RFC 3339. After this the entry is pruned.

The .well-known/capsule/server-info record.

Server-scoped facts only. The registry’s rule — never a user list — is structural here: this type holds no user-shaped field, so there is nothing for a future edit to leak through.

FieldTypeDescription
server_idstringRequired. This server’s canonical origin.
api_base_urlstringRequired. Where the versioned API lives.
authAuthEndpointsResponseRequired. Where a client performs the auth ceremony.
federation_urlstring | nullWhere federated peers talk to this server. Absent when it does not federate.
protocol_versionProtocolWindowResponseRequired. The protocol_version range accepted for writes today, both ends inclusive.
signing_keystringRequired. The raw Ed25519 public key this server’s tokens verify under, base64.
signing_algorithmstringRequired. The signature algorithm that key is used with.
deprecationsDeprecationResponse[]Required. Announced deprecation cutoffs, in announcement order. Empty when none is pending.