meta object with reviewer-safe context.
There are three webhook kinds:
profile_status_updatedis sent by Minerva screening and fires when a screening profile changes status, for example when findings appear or a reviewer decides.idvis sent by Minerva identity verification and fires as a session progresses; an artifact is captured, an assessment completes, or a reviewer decides.onboardingis sent by Minerva screening and fires when a combined screening and identity verification onboarding run changes state or completes.
event.kind.
Configure webhooks
Create and manage destinations from the Developers page (Administration > Developers) in the Minerva dashboard. The API Keys page walks through the UI. Configuration is also available through the Admin API, where it lives under/v2/webhooks/screening (a historical path that manages all three kinds): Create screening webhook.
Each destination holds a name, a destination URL, an event subscription list, and a webhook key. Each workspace can keep up to 10 destinations by default. Enterprise customers can request more.
The envelope
Every delivery uses the same envelope:webhookIdis the destination’s unique ID.webhookNameis the name you assigned, echoed back so you can route deliveries.event.kindisprofile_status_updated,idv, oronboarding.event.valueis the specific event that fired (see the per-kind sections below).event.metacarries the event context. Its fields and value types differ per kind;idvdelivers every value as a string.
Profile status updates (profile_status_updated)
Fires when a screening profile changes status. Subscribable values:escalation and in_review are not subscribable: a profile moving into those states does not trigger a delivery of this kind.
The meta object for this kind:
The status that changed is
event.value; there is no status field in the
meta object for this kind. This kind’s meta also carries no tenantId.Identity verification lifecycle (idv)
Fires as an IDV session moves through capture, assessment, and review. The IDV Integration Guide covers the full session lifecycle. Subscribable values:idv.document.capturedfires when a capture image or supporting document finishes uploading;meta.capturedKindnames the artifact kind, for exampleid_front.idv.session.completedfires when an assessment reaches a terminal state, alongside exactly one ofidv.session.approved,idv.session.failed, oridv.session.requires_review.idv.session.approvedfires when the session passed without a human decision (meta.reviewStatusisautomatic_pass) or a reviewer accepted it (meta.reviewStatusisaccepted).idv.session.requires_reviewfires when the assessment refused to auto-decide and a reviewer must look at it.idv.session.rejectedfires when a reviewer rejected the session. A model rejection never sends this value; it arrives asidv.session.requires_reviewinstead.idv.session.failedfires when the assessment itself failed.
automatic_passis a clean pass with no human review.requires_reviewmeans the service held the session for a human decision.escalationmeans a reviewer bumped it up while keeping it open.acceptedandrejectedare terminal human decisions.
meta object for this kind. All values are strings, so booleans arrive quoted ("true", not true):
Example delivery:
Profile onboarding (onboarding)
Fires for combined screening and identity verification onboarding runs. Subscribable values:profile_onboarding.review_requiredfires when the run needs review before it can complete, for example when screening findings appear or an IDV session is held for review.profile_onboarding.completedfires when the run finishes. Theoutcomefield says how:automatic_pass,accepted,rejected, orescalation.profile_onboarding.failedfires when the run failed.
meta object for this kind:
Example delivery:
A completed run is never reported while an enabled component is still pending,
and
review_required can arrive once per run. Deliveries are at-least-once
and can arrive out of order.Delivery, retries, and dedupe
Every delivery is a JSON POST withContent-Type: application/json and the X-Webhook-Key header carrying the destination’s webhook key. Screening and onboarding kinds also send X-Webhook-Delivery-ID, a stable ID for the delivery that they repeat across retries.
Delivery is at-least-once. A delivery can be attempted more than once and deliveries can arrive out of order, so make your handler idempotent.
profile_status_updated and onboarding deliveries:
- Each dispatch makes up to 3 attempts in process (about 100 ms, then 300 ms between them), retrying on
408,429,502,503,504, and transport errors; a429response’sRetry-Afteris honored up to 3 seconds. - A delivery is attempted at most 6 times: 1 inline attempt plus durable retries after 5 minutes, 15 minutes, 45 minutes, 2 hours 15 minutes, and 6 hours 45 minutes, scheduled by a 5-minute sweeper.
idv deliveries:
- Up to 6 attempts with waits of 30, 60, 120, 240, and 480 seconds.
- Transport errors and
5xxresponses are retried;3xxand4xxresponses are permanent rejections (redirects are never followed), and exhausted deliveries are dead-lettered.
2xx response and process it asynchronously. Anything else is treated as a failure and retried or dropped according to the schedule above. Keep the response body small: an idv delivery whose response body exceeds 64 KiB is aborted as a policy violation.
Dedupe guidance:
- For
profile_status_updatedandonboarding, dedupe onX-Webhook-Delivery-ID. - For
idv, there is no delivery ID on the wire. Dedupe on the natural event key (sessionId,event.value,occurredAt, pluscapturedKindforidv.document.captured) or make your handler idempotent.
Test a destination
The Admin API’s test endpoint sends a simulated payload to your destination URL so you can confirm the endpoint is reachable and your receiver validates the key. The test send carries only theX-Webhook-Key header and generates its payload server-side, so the mock structure mirrors production but the values are not a replay of a real event.
Security
- Validate
X-Webhook-Keyon every delivery and reject mismatches before processing the body. - Store the webhook key in a secrets manager, and rotate it by recreating the destination if it leaks.
- Destination URLs must be public HTTPS endpoints you control. For
idvdeliveries, Minerva checks the destination and refuses loopback, private, link-local, and cloud metadata addresses; it sends only to HTTPS endpoints. Screening and onboarding deliveries do not perform that address check, so hold their destinations to the same standard yourself. - Deliveries are designed to be reviewer-safe: payloads carry IDs, statuses, and counts, not document contents, OCR text, or raw model output. Treat the endpoint itself as sensitive anyway, because the fields are only safe in the context of your own workspace.