approved or declined. No document is asked for, and there is no waiting for a reviewer.
Re-verifications are not billed.
When to use it
Use it when a person verified once, and later you want to be sure the same person is back:- Before an exam or an assessment. A student passes a full ID verification when they enrol. Before each exam, you send a re-verification, so that someone else is less likely to sit it.
- Before a high-value action, such as a payout, a change of bank details or a password reset.
- When something looks off, such as a new device or an unusual location. A re-verification is quick and cheap enough to send again.
What you need
The reference is the earlier verification you compare with. It must be:- in the same workspace, test or live, as the re-verification;
approved;- a verification that read an ID document: an Identity (KYC) verification, or an age verification done with an ID document. A facial age estimation cannot be a reference, and neither can another re-verification. Always point to the original verification.
- still holding its face. ProofAge keeps the face of a verification for 12 months after its decision, or for the workspace’s retention period if that is longer, and deletes it sooner when the verification is erased.
How it works
1
Create the session
Your server calls
POST /v1/verifications with reference_verification_id, the id of the earlier verification. You get a verification back with a url, as for any other session.2
The person opens the link
Send the person to
url. They accept a short consent text written for this check, then take a selfie with the liveness check your workspace uses. There is no document step.3
ProofAge decides
The new selfie is compared with the face of the reference verification. If the person is live and the faces match, the verification is
approved. If the faces do not match, it is declined with the reason reference.face.mismatch. A doubtful match is declined too: there is no manual review.4
You get the result
Your webhook URL receives the decision, as for any verification. The webhook and the API both carry a
reauth object that names the reference. The decision is the answer: no score is returned.409 REAUTH_HOSTED_ONLY.
Create a re-verification
Sign the request as for any call. This is the body:201 verification, plus reauth:
external_id, external_metadata, metadata and callback_url work as for any verification. external_id is your own: ProofAge does not copy it from the reference and does not compare the two. If your users have one external_id each, send the same one, and check on your side that the reference belongs to that user.
The reauth object
Only a re-verification has a reauth object. Every other verification has no reauth key at all, in the API and in webhooks, so test for the key, not for a type.
ProofAge compares the faces and applies its own threshold. The threshold is ProofAge’s, is not exposed and cannot be changed per workspace, and ProofAge may tune it as it learns from real data. No similarity score is returned: decide from
status and reason.
Nothing from the reference’s document comes back: no names, no date of birth, no document number. A re-verification has no age result, and its webhook has no fingerprint_signals. The document object of its webhook is there, with every field null.
The result
The webhook is the decision webhook, with areauth object. An approved re-check:
approved
status and reason:
declined (faces do not match)
document, external_id, external_metadata and timestamp fields are as in the first example. You can also read the same result with GET /v1/verifications/{id}.
These are the statuses and reasons to handle:
A live re-verification never goes to
review. Attempts are limited, as for any verification: when they run out, it is declined with the last attempt’s reason.
A decline is a reason to look closer, not proof of cheating. Poor light, a different haircut or new glasses can make a genuine match fail. The usual next step is to send another re-verification. You can create up to 10 against the same reference in 24 hours (see Limits).
Errors
These come fromPOST /v1/verifications when you send reference_verification_id. Every body is {"error": {"code": "...", "message": "..."}}, except the 402, which is the flat billing error.
A person who opens a re-verification with the calls for your own capture UI gets
409 REAUTH_HOSTED_ONLY from consent, upload and submit.
Test workspaces
A test workspace analyses nothing, so there is no face to compare. It works like any test verification:- Create it as above. The reference must still exist in the same test workspace, be approved and be a document verification. In a test workspace, approve a test KYC first with a test outcome.
- The reference does not need to hold a face.
- When the person submits, the re-verification waits in
review, and you set its outcome with the console, the MCP toolset-test-verification-outcomeorPOST /v1/verifications/{id}/test-outcome. set-test-verification-outcome(or the console, or the test-outcome call) decides it:approved, ordeclined. No faces are compared and no score is produced.
Limits
- 10 re-verifications per reference in 24 hours. The 11th answers
429 REAUTH_RATE_LIMITED, until the oldest one is 24 hours old. UnlikeRATE_LIMIT, it carries noRetry-Afterand does not clear within seconds, so do not retry it in a loop. This stops re-verifications from being used as a free selfie check. - Hosted page only. The person completes the check at the
urlyou send them. - One reference per re-verification, in the same workspace. A reference from another workspace is not found, even in the same organization.
- Face retention. A reference works for 12 months after its decision, or for the workspace’s retention period if that is longer. After that, create a new ID verification.
- No billing. A re-verification is never billed and never uses your free verifications, in live workspaces too.
What does not run
A re-verification only checks live presence and the match with the reference. It does not run duplicate detection, the face blocklist, device checks or any document check, and it does not collect a device fingerprint. A person on a shared exam computer is never declined or blocklisted because of the device. Webhook subscriptions created withPOST /v1/webhook-subscriptions (Zapier, for example) do not receive re-verifications, so an automation like “on declined, suspend the user” does not fire on a failed re-check. Your workspace’s webhook URL does receive them.
In the console and with MCP
- The console cannot create a re-verification. In the verifications list a re-verification has a Re-check badge and a link to its reference. The reference’s page lists its Re-checks, with date and result.
- The MCP tool
create-verificationtakesreference_verification_idand follows the same rules and error codes, which is handy for an AI agent that integrates for you.get-verificationandlist-verificationsreturn thereauthobject. - Re-verifications are left out of the dashboard’s conversion and approval figures, which count the verifications that people take as a first check.