verification.resolved#A verification reached an assurance level
You get the level reached and the evidence bundle reference.
What you receive
id
string
requiredThe event's identifier, starting with evt_, the same on a webhook delivery and on the module's events list, such as GET /v1/payroll/events. It never changes: a redelivery carries the same id, so you can recognise an event you have already handled.
type
string
requiredWhat happened, as module.resource.past_tense_verb, for example run.payslip.calculated. Pick your handler on it; data takes the shape this type promises.
schema_version
integer · minimum 1
requiredThe version of the shape data takes for this type, starting at 1. A change to the shape raises it, so check it before you read data.
org_id
string
requiredThe organisation the event belongs to, by its id, which starts with org_: the one POST /v1/registrations gave you and GET /v1/me returns. You only ever receive events for your own organisation.
sequence
integer · minimum 0
requiredPer organisation and per stream. It is how a consumer tells a replay from a new event, and it is what the delivery guarantee rests on.
occurred_at
string · date-time
requiredWhen the event happened, as an RFC 3339 timestamp in UTC. Not when it was delivered: a redelivery carries the original value.
request_id
string
optionalThe request that caused this event, where one did: the Droomwork-Request-Id that request returned, starting with req_. Absent for an event a schedule raised, such as an engagement lapsing on its end date.
livemode
boolean
requiredWhich realm the event happened in. False is the sandbox.
mocked
boolean
requiredWhether a mock produced this fact, rather than an engine computing it. Recorded on the event when it was appended and never worked out afterwards from the realm: the two answers agree while every module is on its mock and part on the day the first engine ships. See ADR-0011.
source
string
requiredWhich part of Droomwork is the authority for this fact: anchor (identity), proof (credentials), rail (engagements), flow (sourcing), match (allocation), run (payroll), remit (remittance), route (payouts), gateway (the API's front door), iam (accounts and API keys), ledger (the books), registry (rule packs), delivery (webhooks and messages), documents (rendered payslips and instruments) or intelligence (AI decisions). Read the fact from there when it matters; your own copy is never the authority.
anchorproofrailflowmatchrunremitroutegatewayiamledgerregistrydeliverydocumentsintelligencedata
Verification
required16 fields of Verification
id
string
requiredThe verification's identifier, starting with anchor_pro_verification_. POST /v1/identity/verifications returns it and it never changes; pass it as verification_id wherever a call names this verification.
object
always "identity_verification"
requiredAlways identity_verification. Tells you which kind of record you are looking at, so one handler can read any response.
livemode
boolean
requiredWhich realm this record is in: false is the sandbox, true is live. Read it before you act on anything.
mocked
boolean
requiredWhere these figures came from: true when they were mocked, false when they were computed for real. Not the inverse of livemode: each record carries the answer that was true for it.
outcome
string
requiredunresolved is a real outcome and never a rejection. A source that did not answer proves nothing either way. Don't treat silence as a pass.
pendingresolvedunresolvedblockedorigin
string
requiredHow the claim arrived. The behaviour is the same whichever way it came in.
partner_apiself_serveassisted_enrolmentsubject_ref
string
requiredYour opaque reference to the person being verified, exactly as you sent subject_ref at POST /v1/identity/verifications. Not a name and not an identifier.
consent_token_id
string
optionalThe consent token this verification ran under, as you sent it at POST /v1/identity/verifications: the id starting with anchor_pro_consent_ that POST /v1/identity/consent_tokens returned for this subject, purpose and checks.
target_assurance
string
optionalWhat was actually established. DAL-3 and DAL-4 are documented and not delivered in this release.
dal_0dal_1dal_2dal_3dal_4assurance_reached
one of
optionalThe level the evidence actually established, which can be lower than target_assurance. null when nothing has been established yet.
AssuranceLevelorpassport_id
string · nullable
optionalThe id of the Passport this verification resolved to, starting with anchor_pro_passport_: what every module checks before it acts. Read it at GET /v1/identity/passports/{passport_id}; null until outcome is resolved.
evidence_bundle_id
string · nullable
optionalThe id of the bundle listing every source consulted and what each said. Read it at GET /v1/identity/verifications/{verification_id}/evidence_bundle using this verification's id; null while there is nothing to show yet.
unresolved_source
string · nullable
optionalNamed when the outcome is unresolved. Silence always names its source.
retry_after
string · date-time · nullable
optionalWhen to try again, as an RFC 3339 timestamp in UTC. Set when the outcome is unresolved; null otherwise.
blocked_because
string · nullable
optionalWhy outcome is blocked: no_consent (no active token), consent_scope_insufficient (the token doesn't cover what was asked) or subject_blocklisted. The subject is entitled to know which; null for any other outcome.
no_consentconsent_scope_insufficientsubject_blocklistednullcreated_at
string · date-time
optionalWhen the record was created, as an RFC 3339 timestamp in UTC.
What you answer
Return 200 within 5 seconds. Anything else is retried.