Verify again

code
POST /api/kyc/verifications/:id/rerun

Asks the applicant to redo a finished verification: the same workflow, the same person reference, and a link to send them. Use it when a document has expired, a check failed on something fixable, or your own policy asks for periodic re-verification. This is the API twin of the dashboard's "Verify again" button, and the same operation as sending a verification back with Decide a verification. All of them run one core.

The verification keeps its id. When the applicant resubmits, what they send becomes the next attempt of this same verification, not a second verification. What the earlier attempt found is kept rather than overwritten: it is listed under attempts on the result and shown on the verification's timeline in your dashboard. You hold one id per applicant per check, and your webhook handler keeps updating the record it already has.

Calling it sets the verification's status to awaiting_resubmission and sends verification.status_updated. Any link sent earlier for the same verification stops working, so the applicant can only ever use the latest one.

Authentication: Authorization: Bearer sk_… (secret key required). The response contains a live verification credential. A publishable key receives 403 secret_key_required. Content type: application/json. Production note: sk_live_ keys require an approved business.

Redo only what failed

By default the applicant walks the whole flow again. Pass steps to narrow the redo to specific sections instead: a selfie that did not match does not require the applicant to re-photograph a perfectly good document.

json
{ "steps": ["liveness"], "message": "Your selfie was too dark to match. Please retake it in good light." }

The applicant then walks only the ticked steps, with your message shown when they open the link. Everything they are not asked to redo is kept from the earlier attempt. Valid step names:

StepWhat the applicant redoes
id-typeID type selection
id-inputTyping their ID number
document-captureDocument photos
livenessSelfie and liveness
proof-of-addressProof of address
nfcChip scan
email-verificationEmail confirmation
phone-verificationPhone confirmation
business-detailsBusiness details (KYB)
business-key-peopleDirectors and owners (KYB)
business-documentsBusiness documents (KYB)
questionnaireQuestionnaire

An unknown step name is refused with 400 invalid_steps rather than ignored. A silently dropped typo would turn a targeted redo into a full one, which is the one failure you could not see happening.

Pass email and we send the link to the applicant for you, in your organisation's name. The link is still returned in the response, and delivery tells you whether the email went out. Leave email out to deliver the link yourself: we hold no contact details for your users.

json
{ "steps": ["liveness"], "email": "ada@example.com" }

Request body

FieldTypeRequiredDescription
stepsstring[]noSections to redo, from the table above. Absent or empty means the whole flow.
messagestringnoShown to the applicant on a narrowed flow, up to 500 characters. Write it for them, not for your logs.
policystringnooriginal runs the workflow version the applicant walked the first time; latest runs today's published version. Absent follows the workflow's own setting, which is original unless you changed it.
emailstringnoSend the link to this address as well as returning it.

Request

shell
curl "https://trust.myaza.app/api/kyc/verifications/ver_abc123/rerun" \
  -H "Authorization: Bearer $MYAZA_SECRET_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "steps": ["liveness"], "email": "ada@example.com" }'

Response 201 Created

json
{
  "session": {
    "sessionId": "cmt1gfjce05g547grqbmjsiqf",
    "url": "https://trust.myaza.co/verify/pXk3...",
    "shortCode": "7K9F-2QHM",
    "expiresAt": "2026-08-22T12:00:00.000Z",
    "kind": "individual",
    "workflow": { "id": "wf_AbC123dEf456", "name": "Identity verification", "version": 3 }
  },
  "retryOf": "ver_abc123",
  "attempt": 1,
  "steps": ["liveness"],
  "full": false,
  "delivery": { "emailed": true, "reason": null }
}
FieldDescription
sessionThe link to send the applicant, the same shape creating a session returns. session.url is a credential: whoever opens it verifies as this applicant.
retryOfThe verification being redone. The applicant's resubmission is recorded against this id.
attemptThe attempt the verification holds now. The applicant's resubmission becomes attempt attempt + 1.
stepsThe plan the link was minted with, in flow order.
fulltrue when the whole flow will run, which is what absent or empty steps produces.
deliveryWhen you passed email: { emailed, reason }. emailed: false with reason: "send_failed" means the email could not be sent. The link still works, so send it yourself. Null when you passed no email.

When the applicant resubmits

Their resubmission is checked like any submission and completes the same verification. verification.completed (or verification.failed) arrives with the same verificationId and attempt counted up, and Get verification status reports the new result. You are charged for the steps the applicant redoes, not for the ones they keep.

A link stops working once it has been used, or once something newer replaces it. The applicant sees why when they submit:

CodeWhen
verification_in_progressA resubmission for this verification is still being checked.
resubmission_supersededThis verification has already been resubmitted.
resubmission_withdrawnThe verification was decided, or sent back again, after this link was sent. Only the newest link works.

Errors

StatusCodeMeaning
400invalid_inputThe body is malformed, for example email is not a valid address.
400invalid_stepsA step name is not in the table above. The message lists the valid names.
404verification_not_foundNo verification with that id in your organisation and environment.
409verification_in_progressThe verification has not finished. A pending check may still come back clean.
422no_workflowThe verification did not run a workflow, so there is no flow to repeat. Start the person again from your own integration.
422workflow_not_availableThe workflow behind the verification is no longer published, so it cannot be redone.
429rate_limitedToo many sessions started this hour. Try again shortly.

Verifying again is allowed from any finished status, including a passed verification. Re-verifying someone whose document is about to expire is the same operation as retrying a failure.