API reference · Anis signing keys
Anis’s public signing keys
GET
/.well-known/partner-signing-keys.jsonEvery 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 SDK
Fetched 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
| Status | Meaning | Body |
|---|---|---|
| 200 | Success. | SigningKeySet |
| 503 | No 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.
| Error | Code | Status |
|---|---|---|
| Service unavailable | dependency_unavailable | 503 |
Types
SigningKeySet
| Field | Type | Notes |
|---|---|---|
keysalways present | list of PublishedSigningKey | Published active, next and retired public signing keys. Retired keys remain listed for 90 days after retiredAt; compromised keys are excluded. |
revokedalways present | list of RevokedSigningKey | Compromised keys, listed for 90 days after compromisedAt. Anis announces compromise within 24 hours by email and here. |
PublishedSigningKey
| Field | Type | Notes |
|---|---|---|
ktyalways present | string | Always EC. Values: EC |
crvalways present | string | Always P-256. Values: P-256 |
xalways present | string | Exactly 32 bytes, base64url without padding. |
yalways present | string | Exactly 32 bytes, base64url without padding. |
kidalways present | string | Opaque key name used in the answer’s keyid. |
usealways present | string | Always sig. |
algalways present | string | Always ES256. |
statusalways present | string | active, next or retired. Use it when verifying the signature’s created time. Values: active, next, retired |
notBeforealways present | string (date-time) | RFC3339 start time; reject any key — active, next or retired — when created is earlier. |
retiredAt | string (date-time) | Optional RFC3339 time it stopped signing; reject a retired key when created is later. |
purpose | string | Optional 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
| Field | Type | Notes |
|---|---|---|
kidalways present | string | Compromised key id: reject its answers as key_compromised. |
compromisedAtalways present | string (date-time) | RFC3339 compromise time. Answers signed after it are void. |