API reference

The complete Veriticity REST API: every endpoint, its credential requirements, scopes, parameters, request and response shapes, and the errors it can return.

18 operations across 5 groups. Everything on this page is generated from the Veriticity OpenAPI document, which you can download and feed to a client generator or an HTTP client:

openapi.json — OpenAPI 3.1, 18 operations, including the outbound webhook contract.

Endpoints at a glance#

MethodPathCredential
POST/v1/purchase-requestsAPI key bound to an agent · purchase:request
GET/v1/purchase-requests/{purchaseRequestId}API key bound to an agent · purchase:read
POST/v1/simulations/current-policiesAPI key of either kind · purchase:check
POST/v1/simulations/draft-policyOrganisation-scoped API key
POST/v1/simulations/policy-versionOrganisation-scoped API key
GET/v1/policiesOrganisation-scoped API key
GET/v1/policies/{policyId}Organisation-scoped API key
GET/v1/policies/{policyId}/versions/{versionId}Organisation-scoped API key
POST/v1/policies/{policyId}/versions/{versionId}/validateOrganisation-scoped API key
GET/v1/agentsOrganisation-scoped API key
GET/v1/webhooksOrganisation-scoped API key
POST/v1/webhooksOrganisation-scoped API key
GET/v1/webhooks/{webhookId}Organisation-scoped API key
PATCH/v1/webhooks/{webhookId}Organisation-scoped API key
DELETE/v1/webhooks/{webhookId}Organisation-scoped API key
GET/v1/webhooks/{webhookId}/deliveriesOrganisation-scoped API key
POST/v1/webhooks/{webhookId}/rotate-secretOrganisation-scoped API key
POST/v1/webhooks/{webhookId}/testOrganisation-scoped API key

Purchases#

Submit a purchase for a decision, and find out what happened to it.

Submit a purchase for a decision#

POST/v1/purchase-requests

API key bound to an agentOAuth: purchase:request

Asks the Trust Engine whether this agent may make this purchase, and records the answer.

All three outcomes — `APPROVED`, `REJECTED` and `REQUIRES_APPROVAL` — are successful calls. Branch on `decision.outcome`, never on the HTTP status code: the status describes whether the question could be answered, and a refusal is an answer.

`REQUIRES_APPROVAL` means a person has been asked and the budget is held until `approval.expiresAt`. Poll `GET /v1/purchase-requests/{purchaseRequestId}` for what they decided.

Requires an API key bound to an agent, or an OAuth connection granted `purchase:request`. An organization-scoped key names no identity to attribute a purchase to and is refused.

Credential: An API key bound to an agent. OAuth connections need `purchase:request`.

Parameters

NameInDescription
Idempotency-KeyheaderMakes a retry safe. The same key with the same body replays the original decision and reserves no further budget, answering 200 rather than 201. The same key with a different body is refused with 409 `idempotency_key_reuse`. This is the only operation that accepts one.

Request body

FieldTypeDescription
amountMinorrequiredstring | integerA whole number of ISO 4217 minor units. Send it as a string: JSON numbers lose precision above 2^53, and this is money. It is always returned as a string.
categorystring | null
currencystring | nullDefaults to the organisation's own currency when omitted.
merchantrequiredstringWho the money would go to, written as a person would name them.
merchantDomainstring | nullRecorded as evidence. Policy is not matched on domains.
metadataobject | nullAnything you want recorded alongside the purchase. No rule reads it.
reasonrequiredstringWhy the agent wants this purchase. Every purchase must say.

Responses

StatusMeaning
200An idempotent replay. The stored decision, returned again; no new budget was reserved. `replayed` is true.
201The purchase was evaluated and a decision recorded.
400invalid_requestmalformed_json
401unauthorizedinvalid_api_keyapi_key_revokedapi_key_expiredwrong_environmentinvalid_token
403connection_unauthorizedorganization_suspendedapi_key_not_bound_to_agentinsufficient_scope
409idempotency_key_reuse
413payload_too_large
415unsupported_media_type
500internal_error

Response body

FieldTypeDescription
approvalrequiredobjectWhether a person still has to answer, and by when. The budget hold behind an escalation is released when the approval lapses.
expiresAtrequiredTimestamp | null
requiredrequiredboolean
decisionrequiredDecision
engineVersionrequiredstring
evaluatedAtrequiredTimestamp
explanationrequiredstringThe sentence a person reads. Not a stable contract.
idrequiredUUID
outcomerequiredAPPROVED | REJECTED | REQUIRES_APPROVALBranch on this, never on the HTTP status code.
reasonCodesrequiredWITHIN_POLICY | MERCHANT_BLOCKED | MERCHANT_NOT_ALLOW_LISTED | AMOUNT_EXCEEDS_MAX | APPROVAL_THRESHOLD_EXCEEDED | DAILY_LIMIT_EXCEEDED | MONTHLY_LIMIT_EXCEEDED | AGENT_DISABLED | NO_APPLICABLE_POLICY | CURRENCY_NOT_COVERED | POLICY_CHANGED_SINCE_ESCALATION[]
policyVersionsrequiredobject[]
applicabilityReasonrequiredstring
policyVersionIdrequiredUUID
purchaseRequestrequiredPurchaseRequestSummary
amountMinorrequiredMinorAmount
currencyrequiredCurrency
idrequiredUUID
statusrequiredEVALUATING | PENDING_APPROVAL | APPROVED | REJECTED | EXPIRED | CANCELLED
replayedrequiredbooleanTrue when this is the stored answer to an earlier identical request. The decision is real and binding either way; what differs is that no new budget was reserved.
ruleEvaluationsrequiredRuleEvaluation[]
currencyCurrency | null
headroomMinorMinorAmount | null
limitMinorMinorAmount | null
messagestring | null
observedMinorMinorAmount | null
outcomerequiredstring
policyMerchantEntryIdUUID | null
policyRuleIdUUID | null
policyVersionIdUUID | null
reasonCodestring | null
rolerequiredstring
rulerequiredstringThe rule type as it was written into the policy version, snapshotted at evaluation time.

Read back a purchase you submitted#

GET/v1/purchase-requests/{purchaseRequestId}

API key bound to an agentOAuth: purchase:read

What happened to a purchase, including the decision in force and the approval if one was opened. This is how you find out what a person decided after a `REQUIRES_APPROVAL`.

A purchase is readable by the credential that submitted it and by nothing else. Another agent's, another connection's, another tenant's and a malformed id are all the same 404.

Reads nothing into the audit trail and re-evaluates nothing.

Credential: An API key bound to an agent. OAuth connections need `purchase:read`.

Parameters

NameInDescription
purchaseRequestIdrequiredpathThe purchase request to read.

Responses

StatusMeaning
200The purchase, as its submitter may see it.
401unauthorizedinvalid_api_keyapi_key_revokedapi_key_expiredwrong_environmentinvalid_token
403connection_unauthorizedorganization_suspendedapi_key_not_bound_to_agentinsufficient_scope
404not_found
500internal_error

Response body

FieldTypeDescription
purchaserequiredPurchaseReadback
agentrequiredobject
idrequiredUUID
namerequiredstring
statusrequiredENABLED | DISABLED | ARCHIVED
amountMinorrequiredMinorAmount
approvalobject | null
commentrequiredstring | null
escalationReasonCodesrequiredWITHIN_POLICY | MERCHANT_BLOCKED | MERCHANT_NOT_ALLOW_LISTED | AMOUNT_EXCEEDS_MAX | APPROVAL_THRESHOLD_EXCEEDED | DAILY_LIMIT_EXCEEDED | MONTHLY_LIMIT_EXCEEDED | AGENT_DISABLED | NO_APPLICABLE_POLICY | CURRENCY_NOT_COVERED | POLICY_CHANGED_SINCE_ESCALATION[]
expiresAtrequiredTimestamp
isPendingrequiredboolean
resolvedAtrequiredTimestamp | null
resolvedByrequiredobject | null
staterequiredPENDING | APPROVED | REJECTED | EXPIRED | CANCELLED
categorystring | null
currencyrequiredCurrency
decisionobject | null
engineVersionrequiredstring
evaluatedAtrequiredTimestamp
explanationrequiredstring
kindrequiredstringINITIAL, or APPROVAL_REEVALUATION once a person answered.
outcomerequiredAPPROVED | REJECTED | REQUIRES_APPROVAL
reasonCodesrequiredWITHIN_POLICY | MERCHANT_BLOCKED | MERCHANT_NOT_ALLOW_LISTED | AMOUNT_EXCEEDS_MAX | APPROVAL_THRESHOLD_EXCEEDED | DAILY_LIMIT_EXCEEDED | MONTHLY_LIMIT_EXCEEDED | AGENT_DISABLED | NO_APPLICABLE_POLICY | CURRENCY_NOT_COVERED | POLICY_CHANGED_SINCE_ESCALATION[]
idrequiredUUID
initiatedByobject | null
namerequiredstring
merchantrequiredstring
merchantDomainstring | null
originDASHBOARD | API | MCP | null
reasonrequiredstring
requestedAtrequiredTimestamp
resolvedAtTimestamp | null
statusrequiredEVALUATING | PENDING_APPROVAL | APPROVED | REJECTED | EXPIRED | CANCELLED
submittedViaobject | object | null

Simulations#

Ask what would happen, without anything happening. Simulations create no records and consume no budget.

Ask what would happen right now#

POST/v1/simulations/current-policies

API key of either kindOAuth: purchase:check

Runs the same evaluation `POST /v1/purchase-requests` would run, against the policies currently in force, and changes nothing: no purchase request, no decision, no budget reservation, no audit evidence, and no budget consumed.

This is how an agent finds out what it may spend before committing to asking.

Both API-key kinds reach it, and they behave differently: - an organization-scoped key must send `agentId` - an agent-bound key must not, and simulates as itself - an OAuth connection must not, and simulates as its agent

Credential: An API key of either kind. OAuth connections need `purchase:check`.

Request body

FieldTypeDescription
agentIdUUID | nullRequired for an organization-scoped key. Must be omitted by an agent-bound key or an OAuth connection, which simulate as themselves — a credential choosing which agent it asks about would be choosing its own authority.
amountMinorrequiredstring | integerA whole number of ISO 4217 minor units. Send it as a string: JSON numbers lose precision above 2^53, and this is money. It is always returned as a string.
categorystring | null
currencystring | nullDefaults to the organisation's own currency when omitted.
merchantrequiredstringWho the money would go to, written as a person would name them.
merchantDomainstring | nullRecorded as evidence. Policy is not matched on domains.
reasonrequiredstringWhy the agent wants this purchase. Every purchase must say.

Responses

StatusMeaning
200What would have happened. Nothing was changed.
400invalid_requestmalformed_json
401unauthorizedinvalid_api_keyapi_key_revokedapi_key_expiredwrong_environmentinvalid_token
403connection_unauthorizedorganization_suspendedinsufficient_scope
404not_found
413payload_too_large
415unsupported_media_type
500internal_error

Response body

FieldTypeDescription
agentrequiredobject | null
idUUID
namestring
statusENABLED | DISABLED | ARCHIVED
budgetsrequiredSimulatedBudget[]
budgetCounterIdUUID | null
currencyCurrency
currentobject
committedMinorMinorAmount
heldMinorMinorAmount
openingBalanceMinorMinorAmount
reservedMinorMinorAmount
limitsobject[]
effectBLOCK | REQUIRE_APPROVAL
limitMinorMinorAmount
policyRuleIdUUID
remainingAfterMinorMinorAmountNegative reads as "over by".
remainingBeforeMinorMinorAmount
wouldExceedboolean
periodEndTimestamp
periodKeystring
periodKindstring
periodStartTimestamp
policyIdUUID
policyNamestring
policyVersionIdUUID
simulatedobject
projectedMinorMinorAmount
requestedMinorMinorAmount
wouldExceedboolean
policiesConsideredrequiredobject[]
applicabilityReasonstring
currenciesCurrency[]
currencyScopestring | null
policyIdUUID
policyNamestring
policyStatusACTIVE | DISABLED | ARCHIVED
policyVersionIdUUID
scopeTypeORGANIZATION | AGENT
versionNumberinteger
versionStatusDRAFT | ACTIVE | ARCHIVED
policiesExcludedByCurrencyScoperequiredobject[]Candidates that govern this agent but declared a currency scope excluding this purchase. They changed nothing, and omitting them would make a NO_APPLICABLE_POLICY answer impossible to act on.
currenciesCurrency[]
currencyScopestring | null
policyIdUUID
policyNamestring
policyVersionIdUUID
requestCurrencyCurrency
versionNumberinteger
purchaserequiredobject
amountMinorMinorAmount
categorystring | null
currencyCurrency
currencyExponentinteger
merchantstring
merchantDomainstring | null
merchantKeystring
ruleEvaluationsrequiredRuleEvaluation[]
currencyCurrency | null
headroomMinorMinorAmount | null
limitMinorMinorAmount | null
messagestring | null
observedMinorMinorAmount | null
outcomerequiredstring
policyMerchantEntryIdUUID | null
policyRuleIdUUID | null
policyVersionIdUUID | null
reasonCodestring | null
rolerequiredstring
rulerequiredstringThe rule type as it was written into the policy version, snapshotted at evaluation time.
policyIdUUID | null
policyNamestring | null
simulatedDecisionrequiredobject
explanationrequiredstring
outcomerequiredAPPROVED | REJECTED | REQUIRES_APPROVAL
reasonCodesrequiredWITHIN_POLICY | MERCHANT_BLOCKED | MERCHANT_NOT_ALLOW_LISTED | AMOUNT_EXCEEDS_MAX | APPROVAL_THRESHOLD_EXCEEDED | DAILY_LIMIT_EXCEEDED | MONTHLY_LIMIT_EXCEEDED | AGENT_DISABLED | NO_APPLICABLE_POLICY | CURRENCY_NOT_COVERED | POLICY_CHANGED_SINCE_ESCALATION[]
wouldRequireApprovalrequiredboolean
simulationrequiredobject
disclaimerrequiredstring
engineVersionrequiredstring
isSimulationrequiredtrueAlways true. The field exists so its absence is a signal.
moderequiredstring
simulatedAtrequiredTimestamp

Ask what a draft policy version would decide#

POST/v1/simulations/draft-policy

Organisation-scoped API keyNo OAuth caller admitted

Evaluates a purchase against one `DRAFT` policy version as it is currently written — the question you ask before activating it.

Organization-scoped API keys only. An agent may not read or simulate the guardrails being drafted for it, and no OAuth scope reaches this.

Credential: An organization-scoped API key. No OAuth scope reaches this operation.

Request body

FieldTypeDescription
amountMinorrequiredstring | integerA whole number of ISO 4217 minor units. Send it as a string: JSON numbers lose precision above 2^53, and this is money. It is always returned as a string.
categorystring | null
currencystring | nullDefaults to the organisation's own currency when omitted.
merchantrequiredstringWho the money would go to, written as a person would name them.
merchantDomainstring | nullRecorded as evidence. Policy is not matched on domains.
policyVersionIdrequiredUUIDThe draft version to evaluate. Name the version, not the policy.
reasonrequiredstringWhy the agent wants this purchase. Every purchase must say.

Responses

StatusMeaning
200What that draft would have decided.
400invalid_requestmalformed_json
401unauthorizedinvalid_api_keyapi_key_revokedapi_key_expiredwrong_environmentinvalid_token
403connection_unauthorizedorganization_suspendedapi_key_not_organization_scopedoauth_not_permitted
404not_found
413payload_too_large
415unsupported_media_type
500internal_error

Response body

FieldTypeDescription
agentrequiredobject | null
idUUID
namestring
statusENABLED | DISABLED | ARCHIVED
budgetsrequiredSimulatedBudget[]
budgetCounterIdUUID | null
currencyCurrency
currentobject
committedMinorMinorAmount
heldMinorMinorAmount
openingBalanceMinorMinorAmount
reservedMinorMinorAmount
limitsobject[]
effectBLOCK | REQUIRE_APPROVAL
limitMinorMinorAmount
policyRuleIdUUID
remainingAfterMinorMinorAmountNegative reads as "over by".
remainingBeforeMinorMinorAmount
wouldExceedboolean
periodEndTimestamp
periodKeystring
periodKindstring
periodStartTimestamp
policyIdUUID
policyNamestring
policyVersionIdUUID
simulatedobject
projectedMinorMinorAmount
requestedMinorMinorAmount
wouldExceedboolean
policiesConsideredrequiredobject[]
applicabilityReasonstring
currenciesCurrency[]
currencyScopestring | null
policyIdUUID
policyNamestring
policyStatusACTIVE | DISABLED | ARCHIVED
policyVersionIdUUID
scopeTypeORGANIZATION | AGENT
versionNumberinteger
versionStatusDRAFT | ACTIVE | ARCHIVED
policiesExcludedByCurrencyScoperequiredobject[]Candidates that govern this agent but declared a currency scope excluding this purchase. They changed nothing, and omitting them would make a NO_APPLICABLE_POLICY answer impossible to act on.
currenciesCurrency[]
currencyScopestring | null
policyIdUUID
policyNamestring
policyVersionIdUUID
requestCurrencyCurrency
versionNumberinteger
purchaserequiredobject
amountMinorMinorAmount
categorystring | null
currencyCurrency
currencyExponentinteger
merchantstring
merchantDomainstring | null
merchantKeystring
ruleEvaluationsrequiredRuleEvaluation[]
currencyCurrency | null
headroomMinorMinorAmount | null
limitMinorMinorAmount | null
messagestring | null
observedMinorMinorAmount | null
outcomerequiredstring
policyMerchantEntryIdUUID | null
policyRuleIdUUID | null
policyVersionIdUUID | null
reasonCodestring | null
rolerequiredstring
rulerequiredstringThe rule type as it was written into the policy version, snapshotted at evaluation time.
policyIdUUID | null
policyNamestring | null
simulatedDecisionrequiredobject
explanationrequiredstring
outcomerequiredAPPROVED | REJECTED | REQUIRES_APPROVAL
reasonCodesrequiredWITHIN_POLICY | MERCHANT_BLOCKED | MERCHANT_NOT_ALLOW_LISTED | AMOUNT_EXCEEDS_MAX | APPROVAL_THRESHOLD_EXCEEDED | DAILY_LIMIT_EXCEEDED | MONTHLY_LIMIT_EXCEEDED | AGENT_DISABLED | NO_APPLICABLE_POLICY | CURRENCY_NOT_COVERED | POLICY_CHANGED_SINCE_ESCALATION[]
wouldRequireApprovalrequiredboolean
simulationrequiredobject
disclaimerrequiredstring
engineVersionrequiredstring
isSimulationrequiredtrueAlways true. The field exists so its absence is a signal.
moderequiredstring
simulatedAtrequiredTimestamp

Ask what a specific policy version would decide#

POST/v1/simulations/policy-version

Organisation-scoped API keyNo OAuth caller admitted

Evaluates a purchase against one `ACTIVE` or `ARCHIVED` policy version exactly as it was frozen — the question you ask about a decision that was already made, or about a version you are thinking of reinstating.

Organization-scoped API keys only.

Credential: An organization-scoped API key. No OAuth scope reaches this operation.

Request body

FieldTypeDescription
amountMinorrequiredstring | integerA whole number of ISO 4217 minor units. Send it as a string: JSON numbers lose precision above 2^53, and this is money. It is always returned as a string.
categorystring | null
currencystring | nullDefaults to the organisation's own currency when omitted.
merchantrequiredstringWho the money would go to, written as a person would name them.
merchantDomainstring | nullRecorded as evidence. Policy is not matched on domains.
policyVersionIdrequiredUUIDThe active or archived version to evaluate.
reasonrequiredstringWhy the agent wants this purchase. Every purchase must say.

Responses

StatusMeaning
200What that version would have decided.
400invalid_requestmalformed_json
401unauthorizedinvalid_api_keyapi_key_revokedapi_key_expiredwrong_environmentinvalid_token
403connection_unauthorizedorganization_suspendedapi_key_not_organization_scopedoauth_not_permitted
404not_found
413payload_too_large
415unsupported_media_type
500internal_error

Response body

FieldTypeDescription
agentrequiredobject | null
idUUID
namestring
statusENABLED | DISABLED | ARCHIVED
budgetsrequiredSimulatedBudget[]
budgetCounterIdUUID | null
currencyCurrency
currentobject
committedMinorMinorAmount
heldMinorMinorAmount
openingBalanceMinorMinorAmount
reservedMinorMinorAmount
limitsobject[]
effectBLOCK | REQUIRE_APPROVAL
limitMinorMinorAmount
policyRuleIdUUID
remainingAfterMinorMinorAmountNegative reads as "over by".
remainingBeforeMinorMinorAmount
wouldExceedboolean
periodEndTimestamp
periodKeystring
periodKindstring
periodStartTimestamp
policyIdUUID
policyNamestring
policyVersionIdUUID
simulatedobject
projectedMinorMinorAmount
requestedMinorMinorAmount
wouldExceedboolean
policiesConsideredrequiredobject[]
applicabilityReasonstring
currenciesCurrency[]
currencyScopestring | null
policyIdUUID
policyNamestring
policyStatusACTIVE | DISABLED | ARCHIVED
policyVersionIdUUID
scopeTypeORGANIZATION | AGENT
versionNumberinteger
versionStatusDRAFT | ACTIVE | ARCHIVED
policiesExcludedByCurrencyScoperequiredobject[]Candidates that govern this agent but declared a currency scope excluding this purchase. They changed nothing, and omitting them would make a NO_APPLICABLE_POLICY answer impossible to act on.
currenciesCurrency[]
currencyScopestring | null
policyIdUUID
policyNamestring
policyVersionIdUUID
requestCurrencyCurrency
versionNumberinteger
purchaserequiredobject
amountMinorMinorAmount
categorystring | null
currencyCurrency
currencyExponentinteger
merchantstring
merchantDomainstring | null
merchantKeystring
ruleEvaluationsrequiredRuleEvaluation[]
currencyCurrency | null
headroomMinorMinorAmount | null
limitMinorMinorAmount | null
messagestring | null
observedMinorMinorAmount | null
outcomerequiredstring
policyMerchantEntryIdUUID | null
policyRuleIdUUID | null
policyVersionIdUUID | null
reasonCodestring | null
rolerequiredstring
rulerequiredstringThe rule type as it was written into the policy version, snapshotted at evaluation time.
policyIdUUID | null
policyNamestring | null
simulatedDecisionrequiredobject
explanationrequiredstring
outcomerequiredAPPROVED | REJECTED | REQUIRES_APPROVAL
reasonCodesrequiredWITHIN_POLICY | MERCHANT_BLOCKED | MERCHANT_NOT_ALLOW_LISTED | AMOUNT_EXCEEDS_MAX | APPROVAL_THRESHOLD_EXCEEDED | DAILY_LIMIT_EXCEEDED | MONTHLY_LIMIT_EXCEEDED | AGENT_DISABLED | NO_APPLICABLE_POLICY | CURRENCY_NOT_COVERED | POLICY_CHANGED_SINCE_ESCALATION[]
wouldRequireApprovalrequiredboolean
simulationrequiredobject
disclaimerrequiredstring
engineVersionrequiredstring
isSimulationrequiredtrueAlways true. The field exists so its absence is a signal.
moderequiredstring
simulatedAtrequiredTimestamp

Policies#

Read the spending rules in force. Policies are authored by a person in the dashboard, never by an API credential.

List spending policies#

GET/v1/policies

Organisation-scoped API keyNo OAuth caller admitted

Your organisation's spending policies, newest first.

Organization-scoped API keys only. An agent may not read the policies it is judged against — it learns what it may spend by asking `POST /v1/simulations/current-policies` instead. No OAuth scope reaches this.

Credential: An organization-scoped API key. No OAuth scope reaches this operation.

Parameters

NameInDescription
statusqueryReturn only policies in this state.
searchqueryFree-text match on the policy name. Trimmed, capped at 200 characters, and treated as absent when empty.
pagequery1-based page number. A page beyond the end returns an empty page rather than a 404, because a filtered set shrinking under a paging UI is normal.
pageSizequeryRows per page. Clamped to 100 rather than refused: a caller asking for everything gets the maximum. A malformed value is refused, because it means the client believes something untrue.

Responses

StatusMeaning
200A page of policies, and where it sits in the collection.
400invalid_request
401unauthorizedinvalid_api_keyapi_key_revokedapi_key_expiredwrong_environmentinvalid_token
403connection_unauthorizedorganization_suspendedapi_key_not_organization_scopedoauth_not_permitted
500internal_error

Response body

FieldTypeDescription
paginationrequiredPagination
pagerequiredinteger
pageSizerequiredinteger
totalrequiredinteger
totalPagesrequiredintegerAt least 1 even when nothing matched, so a client can render "1 of 1" for an empty result and never divide by zero.
policiesrequiredPolicySummary[]
activeVersionrequiredPolicyVersionSummary | null
activatedAtTimestamp | null
archivedAtTimestamp | null
createdAtrequiredTimestamp
currenciesrequiredCurrency[]The currencies this version covers. A purchase in any other currency is refused with CURRENCY_NOT_COVERED: Veriticity performs no currency conversion.
currencyScopestring | null
idrequiredUUID
merchantCountrequiredintegerHow many merchant entries this version carries.
ruleCountrequiredintegerHow many rules this version carries, without fetching them.
statusrequiredDRAFT | ACTIVE | ARCHIVED
versionNumberrequiredintegerAllocated by Veriticity. Never chosen by a caller.
archivedAtTimestamp | null
createdAtrequiredTimestamp
descriptionstring | null
idrequiredUUID
inForcerequiredbooleanWhether the Trust Engine is actually reading this policy right now. "Has a live version" and "is being enforced" are different facts: a DISABLED policy keeps its ACTIVE version but the engine skips it.
namerequiredstring
scopeTyperequiredORGANIZATION | AGENT
statusrequiredACTIVE | DISABLED | ARCHIVED
updatedAtrequiredTimestamp

Read one policy#

GET/v1/policies/{policyId}

Organisation-scoped API keyNo OAuth caller admitted

One policy with its version history and the agents it governs.

Organization-scoped API keys only. An agent may not read the policies it is judged against — it learns what it may spend by asking `POST /v1/simulations/current-policies` instead. No OAuth scope reaches this.

Credential: An organization-scoped API key. No OAuth scope reaches this operation.

Parameters

NameInDescription
policyIdrequiredpathThe policy to read.

Responses

StatusMeaning
200The policy.
401unauthorizedinvalid_api_keyapi_key_revokedapi_key_expiredwrong_environmentinvalid_token
403connection_unauthorizedorganization_suspendedapi_key_not_organization_scopedoauth_not_permitted
404not_found
500internal_error

Response body

FieldTypeDescription
policyrequiredPolicySummary
activeVersionrequiredPolicyVersionSummary | null
activatedAtTimestamp | null
archivedAtTimestamp | null
createdAtrequiredTimestamp
currenciesrequiredCurrency[]The currencies this version covers. A purchase in any other currency is refused with CURRENCY_NOT_COVERED: Veriticity performs no currency conversion.
currencyScopestring | null
idrequiredUUID
merchantCountrequiredintegerHow many merchant entries this version carries.
ruleCountrequiredintegerHow many rules this version carries, without fetching them.
statusrequiredDRAFT | ACTIVE | ARCHIVED
versionNumberrequiredintegerAllocated by Veriticity. Never chosen by a caller.
archivedAtTimestamp | null
createdAtrequiredTimestamp
descriptionstring | null
idrequiredUUID
inForcerequiredbooleanWhether the Trust Engine is actually reading this policy right now. "Has a live version" and "is being enforced" are different facts: a DISABLED policy keeps its ACTIVE version but the engine skips it.
namerequiredstring
scopeTyperequiredORGANIZATION | AGENT
statusrequiredACTIVE | DISABLED | ARCHIVED
updatedAtrequiredTimestamp
agentIdsUUID[]
versionsPolicyVersionSummary[]
activatedAtTimestamp | null
archivedAtTimestamp | null
createdAtrequiredTimestamp
currenciesrequiredCurrency[]The currencies this version covers. A purchase in any other currency is refused with CURRENCY_NOT_COVERED: Veriticity performs no currency conversion.
currencyScopestring | null
idrequiredUUID
merchantCountrequiredintegerHow many merchant entries this version carries.
ruleCountrequiredintegerHow many rules this version carries, without fetching them.
statusrequiredDRAFT | ACTIVE | ARCHIVED
versionNumberrequiredintegerAllocated by Veriticity. Never chosen by a caller.

Read one policy version#

GET/v1/policies/{policyId}/versions/{versionId}

Organisation-scoped API keyNo OAuth caller admitted

A policy version in full, including its rules and merchant lists, exactly as the Trust Engine reads it.

Organization-scoped API keys only. An agent may not read the policies it is judged against — it learns what it may spend by asking `POST /v1/simulations/current-policies` instead. No OAuth scope reaches this.

Credential: An organization-scoped API key. No OAuth scope reaches this operation.

Parameters

NameInDescription
policyIdrequiredpathThe policy the version belongs to.
versionIdrequiredpathThe version to read.

Responses

StatusMeaning
200The version.
401unauthorizedinvalid_api_keyapi_key_revokedapi_key_expiredwrong_environmentinvalid_token
403connection_unauthorizedorganization_suspendedapi_key_not_organization_scopedoauth_not_permitted
404not_found
500internal_error

Response body

FieldTypeDescription
versionrequiredPolicyVersion
activatedAtTimestamp | null
archivedAtTimestamp | null
createdAtrequiredTimestamp
currenciesrequiredCurrency[]The currencies this version covers. A purchase in any other currency is refused with CURRENCY_NOT_COVERED: Veriticity performs no currency conversion.
currencyScopestring | null
idrequiredUUID
merchantCountrequiredintegerHow many merchant entries this version carries.
ruleCountrequiredintegerHow many rules this version carries, without fetching them.
statusrequiredDRAFT | ACTIVE | ARCHIVED
versionNumberrequiredintegerAllocated by Veriticity. Never chosen by a caller.
merchantsrequiredPolicyMerchantEntry[]
idrequiredUUID
labelrequiredstringThe merchant as a person wrote it.
listTyperequiredALLOW | BLOCK
merchantKeyrequiredstringThe normalised form the engine matches on. Veriticity derives it from the label; it is never supplied directly.
policyIdrequiredUUID
rulesrequiredPolicyRule[]
amountMinorrequiredMinorAmount
currencyCurrency | null
effectrequiredBLOCK | REQUIRE_APPROVALBLOCK refuses outright. REQUIRE_APPROVAL holds the budget and waits for a person.
idrequiredUUID
periodKindrequiredPER_REQUEST | DAY | MONTHPER_REQUEST for a single-purchase cap; DAY or MONTH for a window, resolved against the organisation's own timezone.
ruleTyperequiredAMOUNT_LIMIT | SPEND_LIMITAMOUNT_LIMIT caps a single purchase. SPEND_LIMIT caps the total across a period.

Check whether a version could be activated#

POST/v1/policies/{policyId}/versions/{versionId}/validate

Organisation-scoped API keyNo OAuth caller admitted

Runs activation's own check as a dry run, and changes nothing.

Answers 200 even when the draft is unacceptable — `valid` carries the verdict and `issues` carries the reasons. A 4xx would mean the question could not be answered, and it was.

`budgetImpact` is empty in the ordinary case. A non-empty one means activating this version would start a limit from a total that already includes spending nobody reserved against.

This is a `POST` that writes nothing, and it is the only policy operation on `/v1` that is not a plain read.

Organization-scoped API keys only. An agent may not read the policies it is judged against — it learns what it may spend by asking `POST /v1/simulations/current-policies` instead. No OAuth scope reaches this.

Credential: An organization-scoped API key. No OAuth scope reaches this operation.

Parameters

NameInDescription
policyIdrequiredpathThe policy the version belongs to.
versionIdrequiredpathThe version to check.

Responses

StatusMeaning
200The verdict. `valid` is false when the version could not be activated; this is still a 200.
401unauthorizedinvalid_api_keyapi_key_revokedapi_key_expiredwrong_environmentinvalid_token
403connection_unauthorizedorganization_suspendedapi_key_not_organization_scopedoauth_not_permitted
404not_found
500internal_error

Response body

FieldTypeDescription
budgetImpactrequiredobject[]
attributableMinorMinorAmount
currencyCurrency
limitsobject[]
effectstring
limitMinorMinorAmount
remainingMinorMinorAmount
openingBalanceMinorMinorAmount
periodKeystring
periodKindstring
reservedMinorMinorAmount
issuesrequiredPolicyIssue[]
coderequiredstring
messagerequiredstring
pathstring
validrequiredboolean
versionrequiredPolicyVersion
activatedAtTimestamp | null
archivedAtTimestamp | null
createdAtrequiredTimestamp
currenciesrequiredCurrency[]The currencies this version covers. A purchase in any other currency is refused with CURRENCY_NOT_COVERED: Veriticity performs no currency conversion.
currencyScopestring | null
idrequiredUUID
merchantCountrequiredintegerHow many merchant entries this version carries.
ruleCountrequiredintegerHow many rules this version carries, without fetching them.
statusrequiredDRAFT | ACTIVE | ARCHIVED
versionNumberrequiredintegerAllocated by Veriticity. Never chosen by a caller.
merchantsrequiredPolicyMerchantEntry[]
idrequiredUUID
labelrequiredstringThe merchant as a person wrote it.
listTyperequiredALLOW | BLOCK
merchantKeyrequiredstringThe normalised form the engine matches on. Veriticity derives it from the label; it is never supplied directly.
policyIdrequiredUUID
rulesrequiredPolicyRule[]
amountMinorrequiredMinorAmount
currencyCurrency | null
effectrequiredBLOCK | REQUIRE_APPROVALBLOCK refuses outright. REQUIRE_APPROVAL holds the budget and waits for a person.
idrequiredUUID
periodKindrequiredPER_REQUEST | DAY | MONTHPER_REQUEST for a single-purchase cap; DAY or MONTH for a window, resolved against the organisation's own timezone.
ruleTyperequiredAMOUNT_LIMIT | SPEND_LIMITAMOUNT_LIMIT caps a single purchase. SPEND_LIMIT caps the total across a period.
warningsrequiredPolicyIssue[]
coderequiredstring
messagerequiredstring
pathstring

Agents#

The identities that spend.

List this organisation's agents#

GET/v1/agents

Organisation-scoped API keyNo OAuth caller admitted

The agents in your organisation, with their status.

Organization-scoped API keys only. An agent-bound credential is refused: a roster of an organisation's other agents is a map of the identities a compromised agent might try to impersonate.

Read-only. Agents are created in the dashboard.

Credential: An organization-scoped API key. No OAuth scope reaches this operation.

Responses

StatusMeaning
200Every agent in the organisation.
401unauthorizedinvalid_api_keyapi_key_revokedapi_key_expiredwrong_environmentinvalid_token
403connection_unauthorizedorganization_suspendedapi_key_not_organization_scopedoauth_not_permitted
500internal_error

Response body

FieldTypeDescription
agentsrequiredobject[]
createdAtrequiredTimestamp
descriptionstring | null
idrequiredUUID
namerequiredstring
statusrequiredENABLED | DISABLED | ARCHIVED
updatedAtrequiredTimestamp

Webhooks#

Receive events when purchases are decided, budgets move, or connections change.

List webhook endpoints#

GET/v1/webhooks

Organisation-scoped API keyNo OAuth caller admitted

Every webhook endpoint on the account, including revoked ones — the delivery history against a revoked endpoint is the answer to "where were our events going in March".

Never carries a signing secret.

Organization-scoped API keys only. An agent-bound credential must not be able to decide where the whole account's events go, and no OAuth scope reaches this at all — admitting a connection would let an AI assistant point your event stream at a URL of its own choosing.

Credential: An organization-scoped API key. No OAuth scope reaches this operation.

Responses

StatusMeaning
200The account's endpoints.
401unauthorizedinvalid_api_keyapi_key_revokedapi_key_expiredwrong_environmentinvalid_token
403connection_unauthorizedorganization_suspendedapi_key_not_organization_scopedoauth_not_permitted
500internal_error

Response body

FieldTypeDescription
itemsrequiredWebhookEndpoint[]
apiVersionrequiredstringThe webhook contract version this endpoint receives. Pinned when the endpoint is created and changed only by PATCH.
consecutiveFailuresrequiredintegerVeriticity does not disable a failing endpoint, so this is the number that tells you a receiver has been refusing events. Any success resets it.
createdAtrequiredTimestamp
descriptionstring | null
disabledAtTimestamp | null
idrequiredUUID
lastFailureAtTimestamp | null
lastSuccessAtTimestamp | null
revokedAtTimestamp | null
statusrequiredACTIVE | DISABLED | REVOKED
subscribedTypesrequiredWebhookEventType[]
urlrequiredstring

Create a webhook endpoint#

POST/v1/webhooks

Organisation-scoped API keyNo OAuth caller admitted

Registers a URL to receive events, and returns the signing secret.

The secret is shown once. Veriticity cannot show it again — store it before you close the response. If you lose it, rotate.

The URL must be HTTPS on port 443, must be a hostname rather than an IP literal, must carry no userinfo, and must resolve to a publicly routable address. This is checked now and again before every delivery. A URL that fails answers `webhook_url_not_permitted`.

New endpoints are created on the current webhook API version.

Organization-scoped API keys only. An agent-bound credential must not be able to decide where the whole account's events go, and no OAuth scope reaches this at all — admitting a connection would let an AI assistant point your event stream at a URL of its own choosing.

Credential: An organization-scoped API key. No OAuth scope reaches this operation.

Request body

FieldTypeDescription
descriptionstring | nullFor your own reference. Never sent anywhere.
subscribedTypesrequiredWebhookEventType[]Choose at least one event to receive.
urlrequiredstring

Responses

StatusMeaning
201Created. **Carries the signing secret, once.**
400invalid_requestmalformed_jsonwebhook_url_not_permitted
401unauthorizedinvalid_api_keyapi_key_revokedapi_key_expiredwrong_environmentinvalid_token
403connection_unauthorizedorganization_suspendedapi_key_not_organization_scopedoauth_not_permitted
409webhook_limit_reached
413payload_too_large
415unsupported_media_type
500internal_error
503webhook_not_configured

Response body

FieldTypeDescription
apiVersionrequiredstringThe webhook contract version this endpoint receives. Pinned when the endpoint is created and changed only by PATCH.
consecutiveFailuresrequiredintegerVeriticity does not disable a failing endpoint, so this is the number that tells you a receiver has been refusing events. Any success resets it.
createdAtrequiredTimestamp
descriptionstring | null
disabledAtTimestamp | null
idrequiredUUID
lastFailureAtTimestamp | null
lastSuccessAtTimestamp | null
revokedAtTimestamp | null
statusrequiredACTIVE | DISABLED | REVOKED
subscribedTypesrequiredWebhookEventType[]
urlrequiredstring
secretrequiredstringThe signing secret, shown exactly once. Veriticity cannot show it again. Store it before you close the response.

Read a webhook endpoint#

GET/v1/webhooks/{webhookId}

Organisation-scoped API keyNo OAuth caller admitted

One endpoint, including its operational health. `consecutiveFailures` is the number that tells you a receiver has been refusing events since Tuesday; any success resets it.

Never carries a signing secret.

Organization-scoped API keys only. An agent-bound credential must not be able to decide where the whole account's events go, and no OAuth scope reaches this at all — admitting a connection would let an AI assistant point your event stream at a URL of its own choosing.

Credential: An organization-scoped API key. No OAuth scope reaches this operation.

Parameters

NameInDescription
webhookIdrequiredpathThe endpoint to read.

Responses

StatusMeaning
200The endpoint.
401unauthorizedinvalid_api_keyapi_key_revokedapi_key_expiredwrong_environmentinvalid_token
403connection_unauthorizedorganization_suspendedapi_key_not_organization_scopedoauth_not_permitted
404not_found
500internal_error

Response body

FieldTypeDescription
apiVersionrequiredstringThe webhook contract version this endpoint receives. Pinned when the endpoint is created and changed only by PATCH.
consecutiveFailuresrequiredintegerVeriticity does not disable a failing endpoint, so this is the number that tells you a receiver has been refusing events. Any success resets it.
createdAtrequiredTimestamp
descriptionstring | null
disabledAtTimestamp | null
idrequiredUUID
lastFailureAtTimestamp | null
lastSuccessAtTimestamp | null
revokedAtTimestamp | null
statusrequiredACTIVE | DISABLED | REVOKED
subscribedTypesrequiredWebhookEventType[]
urlrequiredstring

Update a webhook endpoint#

PATCH/v1/webhooks/{webhookId}

Organisation-scoped API keyNo OAuth caller admitted

Changes the URL, description, subscriptions, status or API version. Send at least one field.

Omitting `description` leaves it alone; sending `null` clears it.

`status` accepts `ACTIVE` and `DISABLED` only. Revoking destroys key material and cannot be undone, so it is its own verb: `DELETE /v1/webhooks/{webhookId}`.

The secret is never changed here — use rotate-secret.

Organization-scoped API keys only. An agent-bound credential must not be able to decide where the whole account's events go, and no OAuth scope reaches this at all — admitting a connection would let an AI assistant point your event stream at a URL of its own choosing.

Credential: An organization-scoped API key. No OAuth scope reaches this operation.

Parameters

NameInDescription
webhookIdrequiredpathThe endpoint to update.

Request body

FieldTypeDescription
apiVersionstring
descriptionstring | null
statusACTIVE | DISABLED
subscribedTypesWebhookEventType[]
urlstring

Responses

StatusMeaning
200The updated endpoint.
400invalid_requestmalformed_jsonwebhook_url_not_permitted
401unauthorizedinvalid_api_keyapi_key_revokedapi_key_expiredwrong_environmentinvalid_token
403connection_unauthorizedorganization_suspendedapi_key_not_organization_scopedoauth_not_permitted
404not_found
409webhook_endpoint_revoked
413payload_too_large
415unsupported_media_type
500internal_error

Response body

FieldTypeDescription
apiVersionrequiredstringThe webhook contract version this endpoint receives. Pinned when the endpoint is created and changed only by PATCH.
consecutiveFailuresrequiredintegerVeriticity does not disable a failing endpoint, so this is the number that tells you a receiver has been refusing events. Any success resets it.
createdAtrequiredTimestamp
descriptionstring | null
disabledAtTimestamp | null
idrequiredUUID
lastFailureAtTimestamp | null
lastSuccessAtTimestamp | null
revokedAtTimestamp | null
statusrequiredACTIVE | DISABLED | REVOKED
subscribedTypesrequiredWebhookEventType[]
urlrequiredstring

Revoke a webhook endpoint#

DELETE/v1/webhooks/{webhookId}

Organisation-scoped API keyNo OAuth caller admitted

Stops delivery permanently and destroys the endpoint's signing secrets. Revocation is terminal — it cannot be undone, and a revoked endpoint cannot be re-enabled. Create a new one instead.

Returns the endpoint in its revoked state rather than `204`: the row is not gone, it still appears in listings, and its delivery history survives.

Organization-scoped API keys only. An agent-bound credential must not be able to decide where the whole account's events go, and no OAuth scope reaches this at all — admitting a connection would let an AI assistant point your event stream at a URL of its own choosing.

Credential: An organization-scoped API key. No OAuth scope reaches this operation.

Parameters

NameInDescription
webhookIdrequiredpathThe endpoint to revoke.

Responses

StatusMeaning
200The endpoint, now revoked.
401unauthorizedinvalid_api_keyapi_key_revokedapi_key_expiredwrong_environmentinvalid_token
403connection_unauthorizedorganization_suspendedapi_key_not_organization_scopedoauth_not_permitted
404not_found
409webhook_endpoint_revoked
500internal_error

Response body

FieldTypeDescription
apiVersionrequiredstringThe webhook contract version this endpoint receives. Pinned when the endpoint is created and changed only by PATCH.
consecutiveFailuresrequiredintegerVeriticity does not disable a failing endpoint, so this is the number that tells you a receiver has been refusing events. Any success resets it.
createdAtrequiredTimestamp
descriptionstring | null
disabledAtTimestamp | null
idrequiredUUID
lastFailureAtTimestamp | null
lastSuccessAtTimestamp | null
revokedAtTimestamp | null
statusrequiredACTIVE | DISABLED | REVOKED
subscribedTypesrequiredWebhookEventType[]
urlrequiredstring

Read an endpoint's delivery history#

GET/v1/webhooks/{webhookId}/deliveries

Organisation-scoped API keyNo OAuth caller admitted

Recent delivery attempts, newest first — what was sent, what your server answered, and when the next attempt is due.

`hasMore` rather than a total: what a debugging session wants is "is there anything older", and counting a table that only grows costs a scan to answer a question nobody asks.

This is a third pagination model, distinct from the page/pageSize used by `GET /v1/policies`.

Organization-scoped API keys only. An agent-bound credential must not be able to decide where the whole account's events go, and no OAuth scope reaches this at all — admitting a connection would let an AI assistant point your event stream at a URL of its own choosing.

Credential: An organization-scoped API key. No OAuth scope reaches this operation.

Parameters

NameInDescription
webhookIdrequiredpathThe endpoint whose deliveries these are.
limitqueryHow many attempts to return.

Responses

StatusMeaning
200A page of delivery attempts.
400invalid_request
401unauthorizedinvalid_api_keyapi_key_revokedapi_key_expiredwrong_environmentinvalid_token
403connection_unauthorizedorganization_suspendedapi_key_not_organization_scopedoauth_not_permitted
404not_found
500internal_error

Response body

FieldTypeDescription
hasMorerequiredboolean
itemsrequiredWebhookDelivery[]
attemptCountrequiredinteger
createdAtrequiredTimestamp
deliveredAtTimestamp | null
eventIdrequiredUUIDThe logical event, and your deduplication key. Identical to the Veriticity-Webhook-Id header, and identical at every endpoint subscribed to this event.
eventTyperequiredDeliverableWebhookEventType
idrequiredUUIDThis delivery: one endpoint's attempt stream for one event.
lastAttemptAtTimestamp | null
lastDurationMsinteger | null
lastErrorClassstring | null
lastResponseSnippetstring | null
lastStatusCodeinteger | null
nextAttemptAtTimestamp | null
occurredAtrequiredTimestampWhen it happened in the domain, not when it was sent.
statusrequiredstring

Rotate an endpoint's signing secret#

POST/v1/webhooks/{webhookId}/rotate-secret

Organisation-scoped API keyNo OAuth caller admitted

Issues a new signing secret and returns it once.

By default the old secret keeps signing for 24 hours alongside the new one, so every delivery in that window carries two signatures and a receiver verifying with either succeeds. That is what lets you deploy the new secret without coordinating a cutover.

Send `{"retireImmediately": true}` to kill the old secret at once, which is what a leak calls for.

The body is optional: an absent body means the defaults. This is the only operation on the API that does not require a JSON body when it takes one.

Organization-scoped API keys only. An agent-bound credential must not be able to decide where the whole account's events go, and no OAuth scope reaches this at all — admitting a connection would let an AI assistant point your event stream at a URL of its own choosing.

Credential: An organization-scoped API key. No OAuth scope reaches this operation.

Parameters

NameInDescription
webhookIdrequiredpathThe endpoint to rotate.

Request body (optional)

FieldTypeDescription
retireImmediatelybooleanRetire the old secret now instead of after 24 hours. Deliveries signed with it stop verifying immediately.

Responses

StatusMeaning
200Rotated. **Carries the new signing secret, once.**
400invalid_requestmalformed_json
401unauthorizedinvalid_api_keyapi_key_revokedapi_key_expiredwrong_environmentinvalid_token
403connection_unauthorizedorganization_suspendedapi_key_not_organization_scopedoauth_not_permitted
404not_found
409webhook_endpoint_revoked
500internal_error
503webhook_not_configured

Response body

FieldTypeDescription
apiVersionrequiredstringThe webhook contract version this endpoint receives. Pinned when the endpoint is created and changed only by PATCH.
consecutiveFailuresrequiredintegerVeriticity does not disable a failing endpoint, so this is the number that tells you a receiver has been refusing events. Any success resets it.
createdAtrequiredTimestamp
descriptionstring | null
disabledAtTimestamp | null
idrequiredUUID
lastFailureAtTimestamp | null
lastSuccessAtTimestamp | null
revokedAtTimestamp | null
statusrequiredACTIVE | DISABLED | REVOKED
subscribedTypesrequiredWebhookEventType[]
urlrequiredstring
secretrequiredstringThe signing secret, shown exactly once. Veriticity cannot show it again. Store it before you close the response.

Send a test event#

POST/v1/webhooks/{webhookId}/test

Organisation-scoped API keyNo OAuth caller admitted

Queues a real `webhook.test` event through the real pipeline: signed with your real secret, recorded as a real delivery, retried on the real schedule. There is no verification handshake — this is better, because it proves the thing you actually care about on every request rather than once.

Answers 202, not 200: the event is queued rather than delivered. Use the returned ids to find it in the delivery history.

Delivered regardless of what the endpoint subscribes to.

Organization-scoped API keys only. An agent-bound credential must not be able to decide where the whole account's events go, and no OAuth scope reaches this at all — admitting a connection would let an AI assistant point your event stream at a URL of its own choosing.

Credential: An organization-scoped API key. No OAuth scope reaches this operation.

Parameters

NameInDescription
webhookIdrequiredpathThe endpoint to send a test to.

Responses

StatusMeaning
202Queued. Look in the delivery history for what happened.
401unauthorizedinvalid_api_keyapi_key_revokedapi_key_expiredwrong_environmentinvalid_token
403connection_unauthorizedorganization_suspendedapi_key_not_organization_scopedoauth_not_permitted
404not_found
409webhook_endpoint_revoked
500internal_error
503webhook_not_configured

Response body

FieldTypeDescription
deliveryIdrequiredUUID
eventIdrequiredUUID
statusrequired"queued"

Using the OpenAPI document#

The document is OpenAPI 3.1, so its schemas are JSON Schema 2020-12 and can be used directly by a validator. It is generated from the application’s own constants and regenerated on every build, so it cannot describe an endpoint that does not exist or omit an error code the API can return.

Fetch the document
curl -s https://docs.veriticity.com/openapi.json -o veriticity.json