API reference · Anis signing keys

Anis’s public signing keys

GET/.well-known/partner-signing-keys.json

Every public key that may sign Anis’s answers — including the next one before a rotation and the previous one after it. The only route that needs no signature. Clients keep it for at most 5 minutes and fetch it again when an answer names a key they have not seen — at most once every 30 seconds.

PermissionNone
AuthenticationPublic
Anis’s answerNot signed
Staff-set limits it counts towardNone
.NET SDKFetched and cached by the SDK
  • Answers HTTP 503, dependency_unavailable, when the key list cannot be read or Anis has not refreshed it for 9 minutes. Keep your cached copy until its original expiry (at most 5 minutes after fetching it), and retry with backoff. The calls whose answers are not signed keep working.

Request

No authentication.

Body: none.

Responses

StatusMeaningBody
200Success.SigningKeySet
503No decision: a dependency was unavailable.Problem

This answer is not signed: it is the document you verify Anis’s other answers with. Fetch it over TLS only.

Refusals

A refusal of this call is a problem without a signature. Branch on its code; each links to what it means and what to do.

ErrorCodeStatus
Service unavailabledependency_unavailable503

Types

SigningKeySet

FieldTypeNotes
keysalways presentlist of PublishedSigningKeyPublished active, next and retired public signing keys. Retired keys remain listed for 90 days after retiredAt; compromised keys are excluded.
revokedalways presentlist of RevokedSigningKeyCompromised keys, listed for 90 days after compromisedAt. Anis announces compromise within 24 hours by email and here.

PublishedSigningKey

FieldTypeNotes
ktyalways presentstringAlways EC. Values: EC
crvalways presentstringAlways P-256. Values: P-256
xalways presentstringExactly 32 bytes, base64url without padding.
yalways presentstringExactly 32 bytes, base64url without padding.
kidalways presentstringOpaque key name used in the answer’s keyid.
usealways presentstringAlways sig.
algalways presentstringAlways ES256.
statusalways presentstringactive, next or retired. Use it when verifying the signature’s created time. Values: active, next, retired
notBeforealways presentstring (date-time)RFC3339 start time; reject any key — active, next or retired — when created is earlier.
retiredAtstring (date-time)Optional RFC3339 time it stopped signing; reject a retired key when created is later.
purposestringOptional in the schema for compatibility, but always emitted by Anis. answer identifies API answer keys; webhook identifies notification keys. Require the purpose appropriate to the message. Values: answer, webhook

RevokedSigningKey

FieldTypeNotes
kidalways presentstringCompromised key id: reject its answers as key_compromised.
compromisedAtalways presentstring (date-time)RFC3339 compromise time. Answers signed after it are void.