curl --request POST \
--url https://api.verify.privue.ai/verifications/{verification_id}/reset \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.verify.privue.ai/verifications/{verification_id}/reset"
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, headers=headers)
print(response.text)const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.verify.privue.ai/verifications/{verification_id}/reset', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"id": "3f2504e0-4f89-41d3-9a0c-0305e82c3301",
"mode": "hosted",
"status": "open",
"workflow_key": "merchant-onboarding",
"version": 2,
"mobile": "+919876543210",
"reference_user_id": "merchant-42",
"context": {
"channel": "field-sales",
"state": "MH"
},
"return_url": "https://yourapp.com/kyc/done",
"journey_url": "https://verify.privue.ai/acme/merchant-onboarding",
"created_at": "2026-08-10T14:02:11",
"last_activity_at": "2026-08-10T15:20:09",
"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": 1,
"resets": 1,
"progress": {
"total": 12,
"passed": 0,
"failed": 0,
"awaiting": 8,
"enriching": 0,
"error": 0,
"declined": 0,
"not_supplied": 0,
"undetermined": 4,
"not_applicable": 0
},
"steps": [
{
"key": "contact",
"title": "Before we start",
"label": "contact_email",
"type": "form",
"required": true,
"state": "awaiting",
"reasons": [],
"gaps": [],
"collected": null,
"documents": []
},
{
"key": "gst",
"title": "GST certificate",
"label": "tax_registration",
"type": "gst-certificate",
"required": true,
"state": "awaiting",
"reasons": [],
"gaps": [],
"collected": null,
"documents": []
},
{
"key": "pan",
"title": "PAN card",
"label": "entity_pan",
"type": "pan-card",
"required": true,
"state": "undetermined",
"reasons": [],
"gaps": [],
"collected": null,
"documents": []
},
{
"key": "identity",
"title": "Identity",
"label": null,
"type": "digilocker",
"required": false,
"state": "awaiting",
"reasons": [],
"gaps": [],
"collected": null,
"documents": []
},
{
"key": "selfie",
"title": "Selfie",
"label": null,
"type": "selfie",
"required": false,
"state": "awaiting",
"reasons": [],
"gaps": [],
"collected": null,
"documents": []
},
{
"key": "bank",
"title": "Bank account",
"label": "payout_account",
"type": "bank-account",
"required": true,
"state": "awaiting",
"reasons": [],
"gaps": [],
"collected": null,
"documents": []
},
{
"key": "trade-licence",
"title": "Trade licence",
"label": null,
"type": "documents",
"required": false,
"state": "awaiting",
"reasons": [],
"gaps": [],
"collected": null,
"documents": []
},
{
"key": "premises",
"title": "Premises photos",
"label": null,
"type": "premises-photos",
"required": false,
"state": "awaiting",
"reasons": [],
"gaps": [],
"collected": null,
"documents": []
},
{
"key": "premises-proof",
"title": "Proof of premises",
"label": null,
"type": "address-proof",
"required": false,
"state": "undetermined",
"reasons": [],
"gaps": [],
"collected": null,
"documents": []
},
{
"key": "alt-business-proof",
"title": "Alternative proof of business",
"label": null,
"type": "documents",
"required": true,
"state": "undetermined",
"reasons": [],
"gaps": [],
"collected": null,
"documents": []
},
{
"key": "addresses",
"title": "Tag the addresses",
"label": null,
"type": "address-tagging",
"required": false,
"state": "undetermined",
"reasons": [],
"gaps": [],
"collected": null,
"documents": []
},
{
"key": "review",
"title": "Review",
"label": "applicant_signoff",
"type": "review",
"required": true,
"state": "awaiting",
"reasons": [],
"gaps": [],
"collected": null,
"documents": []
}
]
}{
"code": "context-incomplete",
"detail": "workflow 'merchant-onboarding' requires context fields that were not supplied: region"
}{
"code": "unauthenticated",
"detail": "Missing or malformed Authorization header"
}{
"code": "resets-exhausted",
"detail": "this verification cannot be reset because workflow 'merchant-onboarding' has no resets left (50 used); contact us to add more"
}{
"code": "environment-mismatch",
"detail": "workflow 'merchant-onboarding' is production and this request is for uat"
}{
"code": "verification-not-found",
"detail": "no verification 3f2504e0-4f89-41d3-9a0c-0305e82c3301 for this client"
}{
"code": "verification-expired",
"detail": "this verification has expired and its data is deleted, so create a new one instead"
}{
"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": "workflow 'merchant-onboarding' cannot ask its gate check 'gst-onboarded': the workflow registers no endpoint to ask its checks at"
}{
"code": "auth-unavailable",
"detail": "Auth provider unavailable"
}Reset a verification
Clear a verification and run the subject through again.
Every answer and every file is cleared, and on a staged verification so is the request that ran the checks, stopping any run still in progress. The verification reopens on the latest version of the workflow, whatever status it had reached and whichever version it ran before, so its version moves on with it. Its retention window starts again from the reset. This is the only operation that clears what was collected without deleting the record’s data for good.
The context a verification was created with stays as it was. Where the latest version reads a context field this verification does not carry, or one in a shape it cannot use, the reset is refused with 400 and the verification is left on the version it had. Purge it and create a new verification with that context instead.
Once a verification has expired, this is refused with 409: the subject’s data went with the rest, so there is nothing a reopened verification could pick up. Start a new verification for that subject instead, under the same reference_user_id - an expired record no longer holds it.
Running the subject through again is a run of its own and uses a credit of its own when it ends, so a reset is refused with 402 on a workflow with none left. The record’s credits_consumed counts every run of it, not the record.
Resetting an open or submitted verification clears a run no credit has paid for, and those resets draw on an allowance the workflow holds: resets.remaining on the workflow is how many are left. Once it reads zero they are refused with 402 until it is topped up. Resetting a completed or cancelled verification draws nothing and is never refused this way, the run you clear having been charged and the one it opens being charged in turn, and neither does resetting a failed one, which is a run we could not carry through.
A verification of an instant workflow is refused with 409. It was answered in the request that made it, so there is no journey to reopen and nothing that could finish one; ask about that subject again instead.
curl --request POST \
--url https://api.verify.privue.ai/verifications/{verification_id}/reset \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.verify.privue.ai/verifications/{verification_id}/reset"
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, headers=headers)
print(response.text)const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.verify.privue.ai/verifications/{verification_id}/reset', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"id": "3f2504e0-4f89-41d3-9a0c-0305e82c3301",
"mode": "hosted",
"status": "open",
"workflow_key": "merchant-onboarding",
"version": 2,
"mobile": "+919876543210",
"reference_user_id": "merchant-42",
"context": {
"channel": "field-sales",
"state": "MH"
},
"return_url": "https://yourapp.com/kyc/done",
"journey_url": "https://verify.privue.ai/acme/merchant-onboarding",
"created_at": "2026-08-10T14:02:11",
"last_activity_at": "2026-08-10T15:20:09",
"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": 1,
"resets": 1,
"progress": {
"total": 12,
"passed": 0,
"failed": 0,
"awaiting": 8,
"enriching": 0,
"error": 0,
"declined": 0,
"not_supplied": 0,
"undetermined": 4,
"not_applicable": 0
},
"steps": [
{
"key": "contact",
"title": "Before we start",
"label": "contact_email",
"type": "form",
"required": true,
"state": "awaiting",
"reasons": [],
"gaps": [],
"collected": null,
"documents": []
},
{
"key": "gst",
"title": "GST certificate",
"label": "tax_registration",
"type": "gst-certificate",
"required": true,
"state": "awaiting",
"reasons": [],
"gaps": [],
"collected": null,
"documents": []
},
{
"key": "pan",
"title": "PAN card",
"label": "entity_pan",
"type": "pan-card",
"required": true,
"state": "undetermined",
"reasons": [],
"gaps": [],
"collected": null,
"documents": []
},
{
"key": "identity",
"title": "Identity",
"label": null,
"type": "digilocker",
"required": false,
"state": "awaiting",
"reasons": [],
"gaps": [],
"collected": null,
"documents": []
},
{
"key": "selfie",
"title": "Selfie",
"label": null,
"type": "selfie",
"required": false,
"state": "awaiting",
"reasons": [],
"gaps": [],
"collected": null,
"documents": []
},
{
"key": "bank",
"title": "Bank account",
"label": "payout_account",
"type": "bank-account",
"required": true,
"state": "awaiting",
"reasons": [],
"gaps": [],
"collected": null,
"documents": []
},
{
"key": "trade-licence",
"title": "Trade licence",
"label": null,
"type": "documents",
"required": false,
"state": "awaiting",
"reasons": [],
"gaps": [],
"collected": null,
"documents": []
},
{
"key": "premises",
"title": "Premises photos",
"label": null,
"type": "premises-photos",
"required": false,
"state": "awaiting",
"reasons": [],
"gaps": [],
"collected": null,
"documents": []
},
{
"key": "premises-proof",
"title": "Proof of premises",
"label": null,
"type": "address-proof",
"required": false,
"state": "undetermined",
"reasons": [],
"gaps": [],
"collected": null,
"documents": []
},
{
"key": "alt-business-proof",
"title": "Alternative proof of business",
"label": null,
"type": "documents",
"required": true,
"state": "undetermined",
"reasons": [],
"gaps": [],
"collected": null,
"documents": []
},
{
"key": "addresses",
"title": "Tag the addresses",
"label": null,
"type": "address-tagging",
"required": false,
"state": "undetermined",
"reasons": [],
"gaps": [],
"collected": null,
"documents": []
},
{
"key": "review",
"title": "Review",
"label": "applicant_signoff",
"type": "review",
"required": true,
"state": "awaiting",
"reasons": [],
"gaps": [],
"collected": null,
"documents": []
}
]
}{
"code": "context-incomplete",
"detail": "workflow 'merchant-onboarding' requires context fields that were not supplied: region"
}{
"code": "unauthenticated",
"detail": "Missing or malformed Authorization header"
}{
"code": "resets-exhausted",
"detail": "this verification cannot be reset because workflow 'merchant-onboarding' has no resets left (50 used); contact us to add more"
}{
"code": "environment-mismatch",
"detail": "workflow 'merchant-onboarding' is production and this request is for uat"
}{
"code": "verification-not-found",
"detail": "no verification 3f2504e0-4f89-41d3-9a0c-0305e82c3301 for this client"
}{
"code": "verification-expired",
"detail": "this verification has expired and its data is deleted, so create a new one instead"
}{
"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": "workflow 'merchant-onboarding' cannot ask its gate check 'gst-onboarded': the workflow registers no endpoint to ask its checks at"
}{
"code": "auth-unavailable",
"detail": "Auth provider unavailable"
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Path Parameters
Response
The record, cleared and open again.
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
