API reference · Enrolment

Prove you hold the key

POST/v1/enrollments/{invitationId}/proof

Sends the proof of possession. Once accepted, the key waits for Anis staff to record its fingerprint and confirm it.

PermissionNone
AuthenticationEnrolment token
Staff-set limits it counts towardNone
.NET SDKenrollment.ProveAsync(submitted, key)
  • A proof that does not verify, or comes more than about 30 minutes after the key submission, is not refused: the answer says proofState: "failed". Check for "accepted".
  • After five failed proofs, further proofs are refused as rate_limited until Anis staff restart the enrolment.

Parameters

NameInTypeNotes
invitationIdrequiredpathUUIDA UUID, lower-case with hyphens.

Request

Authorised with Authorization: Enrollment <token>; not signed.

Headers: Accept-Language (optional). The SDKs set all of them for you.

Body: EnrollmentProofRequest, as JSON.

FieldTypeNotes
keyIdrequiredUUIDThe key id from the key submission.
challengeGenerationrequiredintegerThe challenge generation you are answering.
signaturerequiredstringECDSA P-256/SHA-256 over the proof message, 64 bytes (not DER), base64url without padding.

Responses

StatusMeaningBody
200Success.EnrollmentStatus
401Refused: not authenticated.Problem
404Refused: not found, or not yours.Problem
409Refused: conflicts with the current state.Problem
422Refused: the request breaks a rule.Problem
429Refused: a limit was reached.Problem
503No decision: a dependency was unavailable.Problem

Every answer is signed by Anis; the SDKs check it before you see it.

Refusals

Every refusal is a signed problem. Branch on its code; each links to what it means and what to do.

ErrorCodeStatus
Invitation invalidinvitation_invalid401
Not foundresource_not_found404
Validation failedvalidation_failed422
Challenge replacedchallenge_expired409
Rate limitedrate_limited429
Service unavailabledependency_unavailable503
Request timeoutrequest_timeout504
Internal errorinternal_error500

Types

EnrollmentProofRequest

FieldTypeNotes
keyIdrequiredUUIDThe key id from the key submission.
challengeGenerationrequiredintegerThe challenge generation you are answering.
signaturerequiredstringECDSA P-256/SHA-256 over the proof message, 64 bytes (not DER), base64url without padding.

EnrollmentStatus

FieldTypeNotes
keyIdUUIDYour key id.
challengeGenerationintegerThe current challenge generation.
proofStatestringpending, accepted or failed — a proof that did not verify or came too late. After five failed proofs, ask Anis staff to restart the enrolment.
approvalStatestringpending while Anis staff have not confirmed the key, approved once it is active, notApplicable otherwise.
statestringpendingProof, pendingApproval, active — the key signs requests — or unavailable (revoked, expired or replaced).
expiresAtstring (date-time)When the current step expires.