curl --request DELETE \
--url https://api.verify.privue.ai/verifications/{verification_id}/documents/{document_id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.verify.privue.ai/verifications/{verification_id}/documents/{document_id}"
headers = {"Authorization": "Bearer <token>"}
response = requests.delete(url, headers=headers)
print(response.text)const options = {method: 'DELETE', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.verify.privue.ai/verifications/{verification_id}/documents/{document_id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"id": "6a2f0c91-3b7e-4d15-8c4a-0f9e2b7d1c58",
"mode": "staged",
"status": "open",
"workflow_key": "vendor-verification",
"version": 1,
"mobile": null,
"reference_user_id": "VENDOR-4471",
"context": {},
"return_url": null,
"journey_url": null,
"created_at": "2026-08-27T11:02:09",
"last_activity_at": "2026-08-27T11:05:17",
"expires_after_days": 30,
"run_requested_at": null,
"submitted_at": null,
"completed_at": null,
"cancelled_at": null,
"gated_at": null,
"gated_by_step": null,
"failed_at": null,
"expired_at": null,
"expired_by": null,
"acknowledgement": null,
"callback": null,
"credits_consumed": 0,
"resets": 0,
"progress": {
"total": 5,
"passed": 0,
"failed": 0,
"awaiting": 3,
"enriching": 0,
"error": 0,
"declined": 0,
"not_supplied": 0,
"undetermined": 2,
"not_applicable": 0
},
"steps": [
{
"key": "gst",
"title": "GST certificate",
"label": null,
"type": "gst-certificate",
"required": false,
"state": "awaiting",
"reasons": [],
"gaps": [],
"collected": null,
"documents": [
{
"id": "d1e4a7b2-5c38-4f9e-8a61-2b7c0d3e9f14",
"slot": "gst-certificate",
"kind": "gst-certificate",
"label": "gst_certificate",
"filename": "avesco-gst-certificate.pdf",
"content_type": "application/pdf",
"size_bytes": 203118,
"sha256": "1c8f4e2a9b7d63f05e1a4c8b2d7f9e3a6b5c0d1e2f3a4b5c6d7e8f9a0b1c2d3e",
"received_at": "2026-08-27T11:04:52"
}
]
},
{
"key": "pan",
"title": "PAN card",
"label": null,
"type": "pan-card",
"required": true,
"state": "awaiting",
"reasons": [],
"gaps": [],
"collected": null,
"documents": [
{
"id": "3b9c6e1f-8a24-4d57-b0e3-7f1a5c8d2e69",
"slot": "pan-card",
"kind": "pan-card",
"label": "entity_pan",
"filename": "avesco-pan.jpg",
"content_type": "image/jpeg",
"size_bytes": 87422,
"sha256": "7a2d9c4e1f8b3a6d0e5c2b9f4a7d1e8c3b6a9d2f5e8c1b4a7d0e3f6c9b2a5d8e",
"received_at": "2026-08-27T11:05:17"
}
]
},
{
"key": "bank",
"title": "Bank account",
"label": null,
"type": "bank-account",
"required": true,
"state": "awaiting",
"reasons": [],
"gaps": [],
"collected": null,
"documents": []
},
{
"key": "cross-check-proprietor",
"title": "Proprietor name check",
"label": null,
"type": "name-match",
"required": true,
"state": "undetermined",
"reasons": [],
"gaps": [],
"collected": null,
"documents": []
},
{
"key": "cross-check-business",
"title": "Business name check",
"label": null,
"type": "name-match",
"required": true,
"state": "undetermined",
"reasons": [],
"gaps": [],
"collected": null,
"documents": []
}
]
}{
"code": "unauthenticated",
"detail": "Missing or malformed Authorization header"
}{
"code": "credits-exhausted",
"detail": "the credits for workflow 'merchant-onboarding' are gone; of 500 granted, 500 used"
}{
"code": "environment-mismatch",
"detail": "workflow 'merchant-onboarding' is production and this request is for uat"
}{
"code": "document-not-found",
"detail": "no such document"
}{
"code": "run-in-progress",
"detail": "the checks are running on this submission; reset the verification to change it"
}{
"code": "request-invalid",
"detail": "verification_id: Input should be a valid UUID, invalid character: found `n` at 1"
}{
"code": "rate-limited",
"detail": "Unauthorized: RATE_LIMITED"
}{
"code": "workflow-misconfigured",
"detail": "the output transformation for gst-certificate at 'registration_date' could not be applied"
}{
"code": "auth-unavailable",
"detail": "Auth provider unavailable"
}Withdraw a document
Take back a document you uploaded.
The file stops counting towards its step and its slot has room again, so this is how a wrong upload is corrected without resetting the whole verification. It is refused once you have asked for the checks to run, because the submission is frozen from then until a reset.
curl --request DELETE \
--url https://api.verify.privue.ai/verifications/{verification_id}/documents/{document_id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.verify.privue.ai/verifications/{verification_id}/documents/{document_id}"
headers = {"Authorization": "Bearer <token>"}
response = requests.delete(url, headers=headers)
print(response.text)const options = {method: 'DELETE', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.verify.privue.ai/verifications/{verification_id}/documents/{document_id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"id": "6a2f0c91-3b7e-4d15-8c4a-0f9e2b7d1c58",
"mode": "staged",
"status": "open",
"workflow_key": "vendor-verification",
"version": 1,
"mobile": null,
"reference_user_id": "VENDOR-4471",
"context": {},
"return_url": null,
"journey_url": null,
"created_at": "2026-08-27T11:02:09",
"last_activity_at": "2026-08-27T11:05:17",
"expires_after_days": 30,
"run_requested_at": null,
"submitted_at": null,
"completed_at": null,
"cancelled_at": null,
"gated_at": null,
"gated_by_step": null,
"failed_at": null,
"expired_at": null,
"expired_by": null,
"acknowledgement": null,
"callback": null,
"credits_consumed": 0,
"resets": 0,
"progress": {
"total": 5,
"passed": 0,
"failed": 0,
"awaiting": 3,
"enriching": 0,
"error": 0,
"declined": 0,
"not_supplied": 0,
"undetermined": 2,
"not_applicable": 0
},
"steps": [
{
"key": "gst",
"title": "GST certificate",
"label": null,
"type": "gst-certificate",
"required": false,
"state": "awaiting",
"reasons": [],
"gaps": [],
"collected": null,
"documents": [
{
"id": "d1e4a7b2-5c38-4f9e-8a61-2b7c0d3e9f14",
"slot": "gst-certificate",
"kind": "gst-certificate",
"label": "gst_certificate",
"filename": "avesco-gst-certificate.pdf",
"content_type": "application/pdf",
"size_bytes": 203118,
"sha256": "1c8f4e2a9b7d63f05e1a4c8b2d7f9e3a6b5c0d1e2f3a4b5c6d7e8f9a0b1c2d3e",
"received_at": "2026-08-27T11:04:52"
}
]
},
{
"key": "pan",
"title": "PAN card",
"label": null,
"type": "pan-card",
"required": true,
"state": "awaiting",
"reasons": [],
"gaps": [],
"collected": null,
"documents": [
{
"id": "3b9c6e1f-8a24-4d57-b0e3-7f1a5c8d2e69",
"slot": "pan-card",
"kind": "pan-card",
"label": "entity_pan",
"filename": "avesco-pan.jpg",
"content_type": "image/jpeg",
"size_bytes": 87422,
"sha256": "7a2d9c4e1f8b3a6d0e5c2b9f4a7d1e8c3b6a9d2f5e8c1b4a7d0e3f6c9b2a5d8e",
"received_at": "2026-08-27T11:05:17"
}
]
},
{
"key": "bank",
"title": "Bank account",
"label": null,
"type": "bank-account",
"required": true,
"state": "awaiting",
"reasons": [],
"gaps": [],
"collected": null,
"documents": []
},
{
"key": "cross-check-proprietor",
"title": "Proprietor name check",
"label": null,
"type": "name-match",
"required": true,
"state": "undetermined",
"reasons": [],
"gaps": [],
"collected": null,
"documents": []
},
{
"key": "cross-check-business",
"title": "Business name check",
"label": null,
"type": "name-match",
"required": true,
"state": "undetermined",
"reasons": [],
"gaps": [],
"collected": null,
"documents": []
}
]
}{
"code": "unauthenticated",
"detail": "Missing or malformed Authorization header"
}{
"code": "credits-exhausted",
"detail": "the credits for workflow 'merchant-onboarding' are gone; of 500 granted, 500 used"
}{
"code": "environment-mismatch",
"detail": "workflow 'merchant-onboarding' is production and this request is for uat"
}{
"code": "document-not-found",
"detail": "no such document"
}{
"code": "run-in-progress",
"detail": "the checks are running on this submission; reset the verification to change it"
}{
"code": "request-invalid",
"detail": "verification_id: Input should be a valid UUID, invalid character: found `n` at 1"
}{
"code": "rate-limited",
"detail": "Unauthorized: RATE_LIMITED"
}{
"code": "workflow-misconfigured",
"detail": "the output transformation for gst-certificate at 'registration_date' could not be applied"
}{
"code": "auth-unavailable",
"detail": "Auth provider unavailable"
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Response
The record, without the document.
The whole record of one verification; safe to poll.
The verification's id.
How verifications on this workflow are conducted. hosted: the person being verified walks the journey on our screens and submits it. staged: you create a verification, upload each document against the step it answers, and then ask for the checks to run. instant: you send the whole submission in one request, which runs the checks and answers with the finished record.
A workflow is one of the three, and every endpoint belonging to another is refused on it.
hosted, staged, instant open while the run is live and the user may act, which a step held up by a technical problem does not end; submitted once the user has finished, which they can only do with every step settled, so the result is final from that moment; completed once the checks that follow a submission have run, such as notifying you by callback, and the data is safe to read; failed if the run reached an unrecoverable state, in which case reset it or create a new one; cancelled if you ended the run; gated if a check this workflow puts to a system of yours stopped the journey there, which ends the run where it stood. A check stops it when your system answers terminate or redirect, or when your system gave no answer and the workflow falls back to terminate. Poll until the status is one of completed, cancelled, gated or failed.
expired supersedes all of them once the retention window runs out: the run is of no further use and is kept for your audit alone. It says nothing about how the run had ended, so read completed_at, cancelled_at, gated_at or failed_at for that rather than expecting the status to hold it.
open, submitted, completed, cancelled, gated, expired, failed The workflow this verification runs.
1Which version of the workflow this verification runs. It is the workflow's latest version when the verification was created, and it holds for the verification's whole life: a change published to the workflow afterwards never changes what this verification asks for, which steps it reports or the names its outputs arrive under. Resetting the verification moves it onto the latest version at the time.
x >= 1The user's mobile number, as you provided it. Null on a verification you supplied yourself, and null once the verification has expired.
Your identifier for this verification, echoed back.
The facts you supplied when you created it, unchanged. Empty once the verification has expired.
Where the user is sent after submitting, where one was given.
Where to send your user, on a hosted verification. The same address serves every user of this workflow and carries no credential, so it is safe to send over WhatsApp, SMS, or email, and the user proves who they are by signing in with the mobile number you created the verification with. To open the journey from inside your own app with the user already signed in, create a handoff instead.
Null on a verification you supplied yourself, which opens no journey.
When the verification was created.
When you asked for the checks to run, on a staged verification. From that moment the submission is frozen: uploads, withdrawals and a run request with different values are refused until you reset.
On an instant verification it is when the request carrying the whole submission arrived. Null on a hosted one, and null on a staged one until you ask.
When the verification was submitted, if it has been: by the user on a hosted workflow, by the run of the checks on one you supplied yourself.
When the verification completed, if it has.
When the verification was cancelled, if it was.
When a check of yours stopped the journey, if one did.
The step whose check stopped the journey, if one did. A workflow may put more than one check to you, and this says which of them the run stopped at.
It is set and cleared with gated_at: it stays set once the verification expires or you purge it, so the record still says how the run had ended, and a reset clears both.
When the verification was marked failed, if it was.
When the verification expired, if it has. From that moment it is kept for your audit and nothing else: it holds what each step concluded and nothing the user gave, so no answers, no values read off their documents, and no files. The step states you read are the ones frozen at that moment. Read the other timestamps to see how it had ended before it expired.
What expired the verification. retention when its workflow's retention window ran out; client when you purged it. Null until it expires.
retention, client When the verification was last acted on: by the user on a hosted workflow, by you or by the run of the checks on one you supplied yourself. A verification that is created and never touched reads the moment it was created. expires_after_days is counted from here, so the two together say when a record left untouched expires.
How many days this verification may go without activity before it expires and everything the user provided is deleted, as the version it runs states. It is this verification's own window: a later version of its workflow can state a different one, which reaches the verifications created or reset after it, so read the window here rather than off the workflow. On an expired verification it is the window it was held to.
x >= 1The receipt the user was sent telling them their submission arrived, on a workflow that acknowledges submissions by email. Null wherever nothing has been sent: a workflow that acknowledges nothing, a verification carrying no address to send to, a submission still being finalised, and a send that could not be made.
It names the submission it answers. A reset undoes a submission without unsending its receipt, so read submitted_at here against the record's own to tell a receipt for the submission this record stands in from one for a submission it no longer does.
Show child attributes
Show child attributes
How the callback for this verification's run ended: verification.submitted once it was submitted, or verification.gated once a check of yours stopped it. Null until the callback settles, and on every verification of a workflow with no callback endpoint registered. A verification completes, or stays gated, whether or not its callback was delivered, so read this to tell a result you were told about from one you were not.
Show child attributes
Show child attributes
How many credits this verification has used. A run uses one credit when it first reaches completed, cancelled or expired, whatever the workflow asks for and however many of its checks ran. A run that ends as failed or gated uses none, and one still open or submitted has used nothing yet.
Resetting a verification runs the subject through again, which is a run of its own and uses a credit of its own, so a record reset twice and completed each time reads 3.
How many times this verification has been reset. A reset clears everything the record collected and runs the subject through the checks again, so a verification reading 2 is on its third run and holds what that one has collected.
Each of these opened a run charged a credit of its own where it ended, which is what credits_consumed counts. A reset that cleared a run no credit had paid for also drew one of the workflow's resets: see resets on the workflow.
Every step of the journey counted by where it stands, the ones left out included.
Show child attributes
Show child attributes
The steps this journey has not ruled out, in journey order. A workflow presents the steps that apply to whoever is being verified, so a journey that took one branch reports that branch and not the others; progress.not_applicable says how many are missing from here, and reading the verification with include_not_applicable shows them.
A step is only missing once something has ruled it out. One whose place in the journey turns on a value an earlier step has yet to publish is here, reading undetermined, so a verification you have just created reports every step its workflow declares and they resolve into the other states as it goes on.
Show child attributes
Show child attributes
