Skip to content

API reference ​

This page is rendered at build time from the machine-readable contract, contract/openapi.json (OpenAPI 3.1). That file is generated from the API's own zod request schemas by packages/agent-skill/scripts/build-contract.ts, and a test (packages/agent-skill/test/contract.test.ts) fails if the committed contract drifts from the code.

It covers the agent-facing action contract (the three base operations submit, status and resume, plus cancel, receipt and delegation), the provider interface used by the embedded SDK, the policy simulator, and the reconciliation lookup that a provider implements. Console, Control and public service endpoints are listed in the Control API. Errors use the codes in Errors and reason codes.

Two behaviours the schema cannot express:

  • POST /v1/actions answers 202 whenever the action is pending_approval or approved, including a replay of an existing pending action with the same operation key. 200 is a replay of an action in any other state; 201 is a newly created action that completed or closed synchronously (including a recorded denial).
  • An action ID alone never proves permission: status, resume, cancel and receipt return 404 to any agent other than the original one.

Sectigo Axiom action contract · contract version 2026-11-14 · OpenAPI 3.1 · servers https://api.sectigoaxiom.com, http://localhost:8787

Authentication schemes

SchemeHTTP schemeDescription
dpopDPoPAuthorization: DPoP <token> plus a DPoP header proof bound to method, URL and token hash (ath) on every request
projectApiKeybearerProject API key (axk_…) with provider:authorize

Headers

HeaderMeaning
Idempotency-KeyOperation key, forwarded to upstreams on dispatch
Axiom-Action-IdAction ID, forwarded to upstreams
Axiom-Root-Action-IdRoot action ID for delegated child operations
Axiom-AuthorizationCompact JWS (typ axiom-dispatch+jws, grant key) stating exactly what was authorised
axiom-outcomeProvider response header: compact JWS (typ axiom-outcome+jws) of axiom.outcome.v1

Agent operations

Called by the agent with a DPoP-bound access token

POST/oauth/token

client_credentials with private_key_jwt (RFC 7523) and a DPoP proof (RFC 9449)

Operation ID getToken · authentication: None

Parameters

NameInTypeRequiredDescription
DPoPheaderstringyesProof with htm=POST, htu=token endpoint

Request body

application/x-www-form-urlencoded · object
grant_type"client_credentials"required
client_idstringrequiredStable agent ID
client_assertion_type"urn:ietf:params:oauth:client-assertion-type:jwt-bearer"required
client_assertionstringrequiredJWT signed by the enrolled key: iss=sub=agent ID, aud=token endpoint, jti, exp <= 10 min
scopestringoptionaldefault "actions:submit actions:read"
resourcestringoptional

Responses

StatusDescriptionBody
200DPoP-bound access token (5 minutes)TokenResponse
400OAuth error (RFC 6749 §5.2)
401invalid_client or invalid_dpop_proof

POST/v1/actions

Submit an action; returns its durable ID and state

Operation ID submitAction · authentication: dpop

Request body

application/json · SubmitActionRequest

Responses

StatusDescriptionBody
200Replay of an existing action with the same operation key and requestActionStatus
201Created and completed (or closed) synchronouslyActionStatus
202pending_approval or approved: persist the ID and waitActionStatus
403Denied before an action was created (e.g. tenant_mismatch)Problem
409idempotency_conflict: same operation key, different material request; see changed_fieldsProblem
422validation_failedProblem

GET/v1/actions/{action_id}

Authenticated status read (the only source of truth)

Operation ID getActionStatus · authentication: dpop

Parameters

NameInTypeRequiredDescription
action_idpathstringyes

Responses

StatusDescriptionBody
200Current statusActionStatus
404Not found, or not visible to this callerProblem

POST/v1/actions/{action_id}/resume

Resume an approved action as the original agent with the approved params

Operation ID resumeAction · authentication: dpop

Parameters

NameInTypeRequiredDescription
action_idpathstringyes

Request body

application/json · ResumeActionRequest

Responses

StatusDescriptionBody
200Final or closed stateActionStatus
202executing: track by status reads onlyActionStatus
403wrong_resume_actor or a policy recheck failedProblem
409invalid_state (not yet approved; honour retry_after_seconds) or conflict (params differ from the approval)Problem

POST/v1/actions/{action_id}/cancel

Operation ID cancelAction · authentication: dpop

Parameters

NameInTypeRequiredDescription
action_idpathstringyes

Responses

StatusDescriptionBody
200Cancelled (or already closed)ActionStatus

GET/v1/actions/{action_id}/receipt

Signed receipt bundle; verify offline with the embedded key snapshot

Operation ID getReceipt · authentication: dpop

Parameters

NameInTypeRequiredDescription
action_idpathstringyes
revealquerystringnoComma-separated fields to disclose

Responses

StatusDescriptionBody
200Receipt bundleReceiptBundle
404Not foundProblem

POST/v1/grants/{grant_id}/delegate

Explicit delegation: a narrower child grant for another agent, bound to one root action

Operation ID delegate · authentication: dpop

Parameters

NameInTypeRequiredDescription
grant_idpathstringyes

Request body

application/json · DelegateRequest

Responses

StatusDescriptionBody
201Child grantDelegationResult
403Delegation not permittedProblem

Provider operations

Called by the receiving application with a project API key (embedded SDK)

POST/v1/authorize

Embedded SDK: forward the agent's DPoP token and proof plus authoritative action fields

Operation ID authorize · authentication: projectApiKey

Request body

application/json · AuthorizeRequest

Responses

StatusDescriptionBody
200DecisionAuthorizeResponse

POST/v1/actions/{action_id}/outcome

Embedded SDK: report the provider-signed axiom.outcome.v1 attestation

Operation ID reportOutcome · authentication: projectApiKey

Parameters

NameInTypeRequiredDescription
action_idpathstringyes

Request body

application/json · OutcomeRequest

Responses

StatusDescriptionBody
200Closed with the attested outcomeActionStatus
403Attestation rejectedProblem

POST/v1/projects/{project_id}/simulate

Policy simulator: expected allow / deny / approval with the rule trace; creates nothing

Operation ID simulatePolicy · authentication: projectApiKey

Parameters

NameInTypeRequiredDescription
project_idpathstringyes

Request body

application/json · SimulateRequest

Responses

StatusDescriptionBody
200Decision and trace

Provider-implemented operations

Implemented by the receiving application; called by Axiom

GET/.well-known/axiom/operations/{operation_key}

Reconciliation lookup Axiom calls on the provider after an unknown outcome

Operation ID lookupOperation · authentication: None

Parameters

NameInTypeRequiredDescription
operation_keypathstringyes
Axiom-Authorizationheaderstringyesaxiom.dispatch.v1 JWS for the same operation key

Responses

StatusDescriptionBody
200Committed resultobject
404The operation key never committed

Discovery operations

GET/v1/capabilities

Supported wait modes, warm-wait bound, retry interval and endpoints

Operation ID getCapabilities · authentication: None

Responses

StatusDescriptionBody
200CapabilitiesCapabilities

GET/.well-known/jwks.json

Every Axiom signing key ever used, annotated with axiom:role and axiom:status

Operation ID getJwks · authentication: None

Responses

StatusDescriptionBody
200JWK set

Webhooks (called by Axiom)

POSTwakeEvent

Signed, data-minimised wake event. Verify with the issuer JWKS (role event), drop seq <= last processed, then read status.

Body application/jose: Compact JWS, typ axiom-event+jws; payload is WakeEvent

Schemas

The same schemas are published individually as JSON Schema 2020-12 documents under /contract/schemas/.

SubmitActionRequest

Submit an action

FieldTypeRequiredNotes
operation_keystringyesClient-provided idempotency key, stable across retries. min length 8, max length 200
operationstringyesmin length 1, max length 128
servicestringyesmin length 1
tenantstringyesmin length 1
resourceobjectyes
paramsmap of Jsonyes
not_afterstring (date-time)no
parent_action_idstringno
intentstringnomax length 500
payloadmap of Jsonno
executebooleannodefault true

ResumeActionRequest

Resume an approved action as the original agent

FieldTypeRequiredNotes
operation_keystringyesmin length 8, max length 200
resourceobjectyes
paramsmap of Jsonyes
payloadmap of Jsonno

DelegateRequest

FieldTypeRequiredNotes
child_agentstringyes
root_action_idstringyes
operationsstring[]yes
resourcesobject[]yes
expires_atstring (date-time)yes

AuthorizeRequest

FieldTypeRequiredNotes
agentobjectyes
actionobjectyes

OutcomeRequest

FieldTypeRequiredNotes
attestationstringyesCompact JWS of an axiom.outcome.v1 document signed by a registered provider key

SimulateRequest

FieldTypeRequiredNotes
service_idstringyes
operationstringyes
tenant_idstringyes
agent_idstringno
grant_idstringno
resourceobjectyes
paramsmap of anyyes
environmentstringno
candidateobjectno

ActionStatus

Authoritative action status

FieldTypeRequiredNotes
action_idstringyes
root_action_idstringyes
parent_action_idstringno
stateActionStateyes
reason_codeReasonCodeyes
progress"delivery_pending" | "waiting_on_person" | "decision_readback_unavailable" | "awaiting_agent_resume" | "reconciling"no
operationstringyes
operation_keystringyes
tenantstringyes
servicestringyes
grant_idstringno
request_digeststringyessha-256 digest of the canonical action the approver saw
summarystringyes
status_urlstringyes
resume_urlstringyes
receipt_urlstringno
decision_deadlinestringnoDeadline to receive a verified decision
resume_deadlinestringnoLast time to resume an approved action
expires_atstringnoRFC 3339 timestamp
retry_after_secondsintegernoPoll no sooner than this. ≥ 0, ≤ 9007199254740991
supported_modes"poll" | "webhook" | "mcp_task" | "sse"[]yes
resume_actor"original_agent"yes
approvalsobject[]no
outcomeobjectno
created_atstringyesRFC 3339 timestamp
updated_atstringyesRFC 3339 timestamp

ActionState

Action lifecycle state (brief §5 state table)

"pending_approval" | "approved" | "executing" | "succeeded" | "failed" | "outcome_unknown" | "denied" | "expired" | "revoked" | "cancelled"

ReasonCode

Why the action is in its state

"allowed_by_grant" | "approval_required" | "finance_approval_required" | "second_approver_required" | "awaiting_delivery" | "awaiting_decision" | "decision_readback_unavailable" | "awaiting_agent_resume" | "no_grant" | "grant_expired" | "grant_revoked" | "grant_scope_mismatch" | "tenant_mismatch" | "audience_mismatch" | "resource_not_permitted" | "operation_not_permitted" | "agent_suspended" | "agent_retired" | "credential_revoked" | "issuer_not_trusted" | "ceiling_exceeded" | "policy_deny" | "emergency_deny" | "delegation_not_permitted" | "delegation_expands_scope" | "delegation_depth_exceeded" | "wrong_resume_actor" | "material_change" | "approval_denied" | "approval_expired" | "approver_ineligible" | "separation_of_duties" | "policy_stale" | "status_stale" | "quota_exceeded" | "invalid_request" | "dispatched" | "target_confirmed" | "target_failed" | "target_timeout" | "gateway_observed_success" | "gateway_observed_failure" | "resume_expired" | "reconciled" | "cancelled_by_requester"

Problem

RFC 9457 problem details

FieldTypeRequiredNotes
typestringyes
titlestringyes
statusintegeryes≥ -9007199254740991, ≤ 9007199254740991
code"unauthenticated" | "invalid_token" | "invalid_dpop_proof" | "forbidden" | "not_found" | "conflict" | "idempotency_conflict" | "invalid_state" | "precondition_failed" | "invalid_request" | "validation_failed" | "rate_limited" | "quota_exceeded" | "upstream_error" | "upstream_timeout" | "internal"yes
detailstringno
reason_codeReasonCodeno
changed_fieldsstring[]noMaterial fields that differ (idempotency conflicts)
action_idstringno
issuesobject[]no
retry_after_secondsintegerno≥ -9007199254740991, ≤ 9007199254740991

Capabilities

Capability discovery: read before choosing how to wait

FieldTypeRequiredNotes
api_version"2026-11-14"yes
issuerstringyes
supported_modes"poll" | "webhook" | "mcp_task" | "sse"[]yes
mcpobjectyes
max_warm_wait_secondsintegeryes≥ -9007199254740991, ≤ 9007199254740991
default_retry_after_secondsintegeryes≥ -9007199254740991, ≤ 9007199254740991
resume_actor"original_agent"yes
jwks_uristringyes
token_endpointstringyes
receipt_format"axiom.receipt.v1"yes
canonical_format"axiom.action.v1"yes
delegationobjectyes

WakeEvent

Payload of a signed wake event (compact JWS, typ axiom-event+jws). Never authority: read status after it.

FieldTypeRequiredNotes
v"axiom.event.v1"yes
event_idstringyes
type"action.changed" | "agent.suspended" | "grant.revoked" | "policy.updated"yes
action_idstringno
tenantstringyes
occurred_atstringyesRFC 3339 timestamp
seqintegeryesMonotonic per action; drop events with seq <= the last processed. ≥ -9007199254740991, ≤ 9007199254740991

ReceiptBundle

Signed receipt bundle (JWS general serialization + salted disclosures + key snapshot)

FieldTypeRequiredNotes
type"axiom.receipt.bundle.v1"yes
receiptobjectyes
disclosuresmap of objectyes
keysobject[]yes
statusobjectno

TokenResponse

OAuth token response for agents (client_credentials + private_key_jwt + DPoP)

FieldTypeRequiredNotes
access_tokenstringyes
token_type"DPoP"yes
expires_inintegeryes≥ -9007199254740991, ≤ 9007199254740991
scopestringyes

DelegationResult

FieldTypeRequiredNotes
grant_idstringyes
parent_grant_idstringyes
root_action_idstringyes
agentstringyes
operationsstring[]yes
resourcesobject[]yes
expires_atstringyes
depthintegeryes≥ -9007199254740991, ≤ 9007199254740991

AuthorizeResponse

Embedded-SDK authorize result; execute only when decision is execute

FieldTypeRequiredNotes
decision"execute" | "completed" | "pending" | "in_progress" | "stop"yes
statusActionStatusyes
claimobjectno

Json

string | number | boolean | null | Json[] | map of Json

Developer preview. Contract version 2026-11-14.