curl --request POST \
--url https://api.verify.privue.ai/verifications/instant \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"context": {
"channel": "field-sales",
"state": "MH"
},
"documents": [
{
"content": "/9j/4AAQSkZJRgABAQAAAQ...",
"content_type": "image/jpeg",
"filename": "pan-card.jpg",
"step_key": "pan"
},
{
"content": "JVBERi0xLjQKJeLjz9MKMy...",
"content_type": "application/pdf",
"filename": "gst-certificate.pdf",
"step_key": "gst"
}
],
"reference_user_id": "merchant-42",
"steps": {
"bank": {
"account_number": "50100234567890",
"ifsc": "HDFC0001234"
}
},
"workflow_key": "merchant-onboarding"
}
'import requests
url = "https://api.verify.privue.ai/verifications/instant"
payload = {
"context": {
"channel": "field-sales",
"state": "MH"
},
"documents": [
{
"content": "/9j/4AAQSkZJRgABAQAAAQ...",
"content_type": "image/jpeg",
"filename": "pan-card.jpg",
"step_key": "pan"
},
{
"content": "JVBERi0xLjQKJeLjz9MKMy...",
"content_type": "application/pdf",
"filename": "gst-certificate.pdf",
"step_key": "gst"
}
],
"reference_user_id": "merchant-42",
"steps": { "bank": {
"account_number": "50100234567890",
"ifsc": "HDFC0001234"
} },
"workflow_key": "merchant-onboarding"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
context: {channel: 'field-sales', state: 'MH'},
documents: [
{
content: '/9j/4AAQSkZJRgABAQAAAQ...',
content_type: 'image/jpeg',
filename: 'pan-card.jpg',
step_key: 'pan'
},
{
content: 'JVBERi0xLjQKJeLjz9MKMy...',
content_type: 'application/pdf',
filename: 'gst-certificate.pdf',
step_key: 'gst'
}
],
reference_user_id: 'merchant-42',
steps: {bank: {account_number: '50100234567890', ifsc: 'HDFC0001234'}},
workflow_key: 'merchant-onboarding'
})
};
fetch('https://api.verify.privue.ai/verifications/instant', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"id": "0b4d7c62-9a15-4e38-b7f0-3c8e1d05a94b",
"mode": "instant",
"status": "completed",
"workflow_key": "vendor-check",
"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:06:40",
"expires_after_days": 30,
"run_requested_at": "2026-08-27T11:06:40",
"submitted_at": "2026-08-27T11:07:52",
"completed_at": "2026-08-27T11:07:52",
"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": 0,
"progress": {
"total": 5,
"passed": 5,
"failed": 0,
"awaiting": 0,
"enriching": 0,
"error": 0,
"declined": 0,
"not_supplied": 0,
"undetermined": 0,
"not_applicable": 0
},
"steps": [
{
"key": "gst",
"title": "GST certificate",
"label": null,
"type": "gst-certificate",
"required": false,
"state": "passed",
"reasons": [],
"gaps": [],
"collected": {
"answer": {},
"outputs": {
"gstin": "27AABCA1234F1Z5",
"legal_name": "ACME TRADERS PRIVATE LIMITED",
"trade_name": "Acme Traders",
"registration_status": "Active",
"registration_date": "2020-01-13",
"business_constitution": "Private Limited Company",
"taxpayer_type": "Regular",
"e_invoice_mandated": true,
"aggregate_turnover": "Slab: Rs. 5 Cr. to 25 Cr.",
"authorized_signatories": [
"Rahul Mehta",
"Priya Mehta"
],
"nature_of_business_activities": [
"Wholesale Business",
"Warehouse / Depot"
],
"business_details": {
"goods_details": [
{
"goods_description": "Filtering machinery",
"hsn_code": "84212190"
}
],
"service_details": []
},
"filings": [
{
"return_type": "GSTR1",
"financial_year": "2026-2027",
"tax_period": "May",
"status": "Filed",
"filing_date": "2026-06-04",
"mode_of_filing": "ONLINE"
},
{
"return_type": "GSTR3B",
"financial_year": "2026-2027",
"tax_period": "May",
"status": "Filed",
"filing_date": "2026-06-23",
"mode_of_filing": "ONLINE"
},
{
"return_type": "GSTR9",
"financial_year": "2024-2025",
"tax_period": "Annual",
"status": "Filed",
"filing_date": "2025-12-18",
"mode_of_filing": "ONLINE"
}
],
"business_pan": "AABCA1234F",
"sole_proprietor_pan": null,
"addresses": [
{
"address": "12 Industrial Estate, Pune, Maharashtra 411026",
"tag": "Principal Business Address"
}
],
"primary_business_address": {
"street": "12 Industrial Estate",
"city": "Pune",
"state": "Maharashtra",
"country": "India",
"postal_code": "411026"
},
"other_business_address": null,
"names": [
{
"name": "ACME TRADERS PRIVATE LIMITED",
"tag": "Legal Name"
},
{
"name": "Acme Traders",
"tag": "Trade Name"
}
],
"promoters": [
"Rahul Mehta",
"Priya Mehta"
],
"business_email": "accounts@acmetraders.in",
"business_mobile": "9820011223"
}
},
"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": "passed",
"reasons": [],
"gaps": [],
"collected": {
"answer": {},
"outputs": {
"pan": "AABCA1234F",
"name": "ACME TRADERS PRIVATE LIMITED",
"date_of_birth_or_incorporation": "2011-06-14",
"card_document_id": "4fd79a54-a8a7-4e07-b902-a2e75af3e467",
"status": "valid",
"aadhaar_seeded": null,
"names": [
{
"name": "ACME TRADERS PRIVATE LIMITED",
"tag": "PAN Holder"
}
]
}
},
"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": "passed",
"reasons": [],
"gaps": [],
"collected": {
"answer": {
"source": "typed",
"account_number": "50100234567890",
"ifsc": "HDFC0001234"
},
"outputs": {
"source": "typed",
"account_number": "50100234567890",
"ifsc": "HDFC0001234",
"registered_name": "ACME TRADERS PRIVATE LIMITED",
"names": [
{
"name": "ACME TRADERS PRIVATE LIMITED",
"tag": "Bank Account Holder"
}
],
"bank_name": null,
"branch": null
}
},
"documents": []
},
{
"key": "cross-check-proprietor",
"title": "Proprietor name check",
"label": null,
"type": "name-match",
"required": true,
"state": "passed",
"reasons": [],
"gaps": [],
"collected": {
"answer": {},
"outputs": {
"reference": [
{
"name": "AVESCO HOSPITEX PRIVATE LIMITED",
"tag": "Legal Name"
}
],
"matches": [
{
"check": "Bank account holder",
"name": "AVESCO HOSPITEX PRIVATE LIMITED",
"matched_to_tag": "Legal Name",
"score": 100,
"matched": true
}
]
}
},
"documents": []
},
{
"key": "cross-check-business",
"title": "Business name check",
"label": null,
"type": "name-match",
"required": true,
"state": "passed",
"reasons": [],
"gaps": [],
"collected": {
"answer": {},
"outputs": {
"reference": [
{
"name": "AVESCO HOSPITEX PRIVATE LIMITED",
"tag": "Legal Name"
}
],
"matches": [
{
"check": "Bank account holder",
"name": "AVESCO HOSPITEX PRIVATE LIMITED",
"matched_to_tag": "Legal Name",
"score": 100,
"matched": true
}
]
}
},
"documents": []
}
]
}{
"code": "context-incomplete",
"detail": "workflow 'merchant-onboarding' requires context fields that were not supplied: state"
}{
"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": "workflow-not-runnable",
"detail": "workflow 'merchant-onboarding' is hosted, so it is not run in a single request"
}{
"code": "document-too-large",
"detail": "documents.0: the file exceeds the 20 MB limit"
}{
"code": "document-type-not-allowed",
"detail": "'Storefront' does not take pdf files"
}{
"code": "step-invalid",
"detail": "pan: nothing was supplied for this step"
}{
"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"
}Run an instant verification
Verify someone from the documents you hold, in a single call, and read the result in the reply.
Everything a verification takes arrives at once: the workflow, your reference for the subject, the context you hold, the values the steps take and every document, each naming the step it answers. The checks run before this call returns, so the record you get back is the finished one, with every step’s verdict on it. There is nothing to poll and no callback to wait for.
Name each document’s step, and its slot only where the step has more than one; the workflow’s intake names both. Where a slot names several kinds of document, name which of them yours is. Send several documents to the same slot where it takes several, as a certificate whose pages arrive as separate images does; the files in one slot are all of the same kind. The documents themselves are read as they arrive and stored nowhere, so they cannot be downloaded from the record afterwards: what it keeps is each file’s name, type and hash, as the record of what was checked.
A submission that cannot be run as it stands is refused before anything runs, naming every step at fault, so a document you left out is answered here rather than by a verification that never finishes. Nothing is checked and nothing is charged for; correct it and send it again.
Every call runs the checks. Sending the same subject again, with the same documents or different ones, is a second verification of them and answers on what that second call carried; nothing is reused from the first. reference_user_id is your label for the subject rather than a key, so several records may carry it, and reading them back by that reference lists every time you asked.
A check whose source could not be reached, or which there was no time left to make, leaves its step reading error rather than a verdict, and the rest of the record stands. Send the request again to have another go at those.
curl --request POST \
--url https://api.verify.privue.ai/verifications/instant \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"context": {
"channel": "field-sales",
"state": "MH"
},
"documents": [
{
"content": "/9j/4AAQSkZJRgABAQAAAQ...",
"content_type": "image/jpeg",
"filename": "pan-card.jpg",
"step_key": "pan"
},
{
"content": "JVBERi0xLjQKJeLjz9MKMy...",
"content_type": "application/pdf",
"filename": "gst-certificate.pdf",
"step_key": "gst"
}
],
"reference_user_id": "merchant-42",
"steps": {
"bank": {
"account_number": "50100234567890",
"ifsc": "HDFC0001234"
}
},
"workflow_key": "merchant-onboarding"
}
'import requests
url = "https://api.verify.privue.ai/verifications/instant"
payload = {
"context": {
"channel": "field-sales",
"state": "MH"
},
"documents": [
{
"content": "/9j/4AAQSkZJRgABAQAAAQ...",
"content_type": "image/jpeg",
"filename": "pan-card.jpg",
"step_key": "pan"
},
{
"content": "JVBERi0xLjQKJeLjz9MKMy...",
"content_type": "application/pdf",
"filename": "gst-certificate.pdf",
"step_key": "gst"
}
],
"reference_user_id": "merchant-42",
"steps": { "bank": {
"account_number": "50100234567890",
"ifsc": "HDFC0001234"
} },
"workflow_key": "merchant-onboarding"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
context: {channel: 'field-sales', state: 'MH'},
documents: [
{
content: '/9j/4AAQSkZJRgABAQAAAQ...',
content_type: 'image/jpeg',
filename: 'pan-card.jpg',
step_key: 'pan'
},
{
content: 'JVBERi0xLjQKJeLjz9MKMy...',
content_type: 'application/pdf',
filename: 'gst-certificate.pdf',
step_key: 'gst'
}
],
reference_user_id: 'merchant-42',
steps: {bank: {account_number: '50100234567890', ifsc: 'HDFC0001234'}},
workflow_key: 'merchant-onboarding'
})
};
fetch('https://api.verify.privue.ai/verifications/instant', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"id": "0b4d7c62-9a15-4e38-b7f0-3c8e1d05a94b",
"mode": "instant",
"status": "completed",
"workflow_key": "vendor-check",
"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:06:40",
"expires_after_days": 30,
"run_requested_at": "2026-08-27T11:06:40",
"submitted_at": "2026-08-27T11:07:52",
"completed_at": "2026-08-27T11:07:52",
"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": 0,
"progress": {
"total": 5,
"passed": 5,
"failed": 0,
"awaiting": 0,
"enriching": 0,
"error": 0,
"declined": 0,
"not_supplied": 0,
"undetermined": 0,
"not_applicable": 0
},
"steps": [
{
"key": "gst",
"title": "GST certificate",
"label": null,
"type": "gst-certificate",
"required": false,
"state": "passed",
"reasons": [],
"gaps": [],
"collected": {
"answer": {},
"outputs": {
"gstin": "27AABCA1234F1Z5",
"legal_name": "ACME TRADERS PRIVATE LIMITED",
"trade_name": "Acme Traders",
"registration_status": "Active",
"registration_date": "2020-01-13",
"business_constitution": "Private Limited Company",
"taxpayer_type": "Regular",
"e_invoice_mandated": true,
"aggregate_turnover": "Slab: Rs. 5 Cr. to 25 Cr.",
"authorized_signatories": [
"Rahul Mehta",
"Priya Mehta"
],
"nature_of_business_activities": [
"Wholesale Business",
"Warehouse / Depot"
],
"business_details": {
"goods_details": [
{
"goods_description": "Filtering machinery",
"hsn_code": "84212190"
}
],
"service_details": []
},
"filings": [
{
"return_type": "GSTR1",
"financial_year": "2026-2027",
"tax_period": "May",
"status": "Filed",
"filing_date": "2026-06-04",
"mode_of_filing": "ONLINE"
},
{
"return_type": "GSTR3B",
"financial_year": "2026-2027",
"tax_period": "May",
"status": "Filed",
"filing_date": "2026-06-23",
"mode_of_filing": "ONLINE"
},
{
"return_type": "GSTR9",
"financial_year": "2024-2025",
"tax_period": "Annual",
"status": "Filed",
"filing_date": "2025-12-18",
"mode_of_filing": "ONLINE"
}
],
"business_pan": "AABCA1234F",
"sole_proprietor_pan": null,
"addresses": [
{
"address": "12 Industrial Estate, Pune, Maharashtra 411026",
"tag": "Principal Business Address"
}
],
"primary_business_address": {
"street": "12 Industrial Estate",
"city": "Pune",
"state": "Maharashtra",
"country": "India",
"postal_code": "411026"
},
"other_business_address": null,
"names": [
{
"name": "ACME TRADERS PRIVATE LIMITED",
"tag": "Legal Name"
},
{
"name": "Acme Traders",
"tag": "Trade Name"
}
],
"promoters": [
"Rahul Mehta",
"Priya Mehta"
],
"business_email": "accounts@acmetraders.in",
"business_mobile": "9820011223"
}
},
"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": "passed",
"reasons": [],
"gaps": [],
"collected": {
"answer": {},
"outputs": {
"pan": "AABCA1234F",
"name": "ACME TRADERS PRIVATE LIMITED",
"date_of_birth_or_incorporation": "2011-06-14",
"card_document_id": "4fd79a54-a8a7-4e07-b902-a2e75af3e467",
"status": "valid",
"aadhaar_seeded": null,
"names": [
{
"name": "ACME TRADERS PRIVATE LIMITED",
"tag": "PAN Holder"
}
]
}
},
"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": "passed",
"reasons": [],
"gaps": [],
"collected": {
"answer": {
"source": "typed",
"account_number": "50100234567890",
"ifsc": "HDFC0001234"
},
"outputs": {
"source": "typed",
"account_number": "50100234567890",
"ifsc": "HDFC0001234",
"registered_name": "ACME TRADERS PRIVATE LIMITED",
"names": [
{
"name": "ACME TRADERS PRIVATE LIMITED",
"tag": "Bank Account Holder"
}
],
"bank_name": null,
"branch": null
}
},
"documents": []
},
{
"key": "cross-check-proprietor",
"title": "Proprietor name check",
"label": null,
"type": "name-match",
"required": true,
"state": "passed",
"reasons": [],
"gaps": [],
"collected": {
"answer": {},
"outputs": {
"reference": [
{
"name": "AVESCO HOSPITEX PRIVATE LIMITED",
"tag": "Legal Name"
}
],
"matches": [
{
"check": "Bank account holder",
"name": "AVESCO HOSPITEX PRIVATE LIMITED",
"matched_to_tag": "Legal Name",
"score": 100,
"matched": true
}
]
}
},
"documents": []
},
{
"key": "cross-check-business",
"title": "Business name check",
"label": null,
"type": "name-match",
"required": true,
"state": "passed",
"reasons": [],
"gaps": [],
"collected": {
"answer": {},
"outputs": {
"reference": [
{
"name": "AVESCO HOSPITEX PRIVATE LIMITED",
"tag": "Legal Name"
}
],
"matches": [
{
"check": "Bank account holder",
"name": "AVESCO HOSPITEX PRIVATE LIMITED",
"matched_to_tag": "Legal Name",
"score": 100,
"matched": true
}
]
}
},
"documents": []
}
]
}{
"code": "context-incomplete",
"detail": "workflow 'merchant-onboarding' requires context fields that were not supplied: state"
}{
"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": "workflow-not-runnable",
"detail": "workflow 'merchant-onboarding' is hosted, so it is not run in a single request"
}{
"code": "document-too-large",
"detail": "documents.0: the file exceeds the 20 MB limit"
}{
"code": "document-type-not-allowed",
"detail": "'Storefront' does not take pdf files"
}{
"code": "step-invalid",
"detail": "pan: nothing was supplied for this step"
}{
"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.
Body
A whole verification in one request: the subject, the values its steps take, and every document.
Which of your workflows the verification runs. Its mode must be instant.
1Your own label for the subject of this verification. It is echoed back on every response, and together with the workflow key it is the handle that survives once the verification has expired, so make it something you can reconcile against your own records.
It is a label rather than a key: every call runs the checks and is charged for, so sending the same one again is a second verification of that subject and several records may carry it. Listing by it reads back every time you asked.
1 - 255Facts you already know about the user, as a flat JSON object. Workflow conditions and step inputs can read these values to decide what the verification asks for.
A field one of the workflow's required steps cannot run without is refused if you leave it out. Fields no step reads are yours to use as you like and are echoed back untouched.
Values for the steps that take them, keyed by step key. Each step's intake.values on the workflow names the values it takes; a step whose intake.values is empty takes none and has no entry here.
Leave a step out and it is answered from the documents you sent for it. Leave out an optional step entirely, sending no document for it either, and it is recorded as not provided. A step that takes both, such as a bank account, is answered with one or the other: sending values and a document for the same step is refused.
Show child attributes
Show child attributes
{
"bank": {
"account_number": "50100234567890",
"ifsc": "HDFC0001234"
}
}
Every document the workflow asks for, at most 12 of them, each naming the step it answers. Send several for one slot where that slot takes several, as a certificate whose pages arrive as separate images does.
A PDF may be up to 20 MB and an image up to 10 MB, and the documents together may total 25 MB once decoded.
12Show child attributes
Show child attributes
Response
The finished record, with every step checked and its verdict on it.
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
