Reused verifications API
Let an applicant who already passed a Certivant verification elsewhere reuse it with you. Create a consent link, receive a single-use share token, and redeem it into a new approved verification.
Applicants who already completed an approved verification — an individual one, or a business (KYB) one — with another Certivant organization can share it with yours. You create a link, the applicant proves it is theirs and consents, and you redeem a single-use share token into a new, already-approved verification of your organization. Data and document files are copied into your own records and storage.
Endpoints live under /api/v1/kyc/reuse and use an API key (Authorization: Bearer ck_live_…). You need the Reused Verifications plan feature and Accept reused verifications (individuals) and/or Accept reused business verifications (businesses) turned on in Settings → KYC; the two are switched, aged and priced separately. See Authentication.
A key restricted to specific forms cannot use these endpoints (403 form_not_allowed) — a reused verification isn't created through a form. Use an unrestricted key, or offer reuse on your public form instead (see below).
Flow
sequenceDiagram
participant You as Your system
participant C as Certivant
participant A as Applicant
You->>C: POST /reuse/invitations
C-->>You: inviteUrl
You->>A: send inviteUrl
A->>C: verification ID + emailed code
A->>C: consent ("Share my verified identity with you")
C-->>A: redirect to redirectUrl?certivant_share=krs_…
A->>You: lands on your page with the token
You->>C: POST /reuse/redeem { shareToken }
C-->>You: new approved verification
Create an invitation
POST /api/v1/kyc/reuse/invitations — scope kyc:write.
| Field | Type | Notes |
|---|---|---|
externalRef | string, optional | Your reference; copied onto the new verification. |
redirectUrl | URL, optional | Where the applicant returns after consenting. The share token is added as ?certivant_share=…. |
shareTtlMinutes | integer, optional | Lifetime of the share token: default 30, max 1440 (24 h). |
inviteTtlMinutes | integer, optional | Lifetime of the link itself: default 60, 5 minutes to 7 days. |
type | INDIVIDUAL | BUSINESS, optional | What is shared; default INDIVIDUAL. The applicant can only share a verification of this type (source_not_individual / source_not_business otherwise). BUSINESS needs Accept reused business verifications. |
{
"id": "clx…",
"inviteUrl": "https://app.certivant.com/reuse/kri_…",
"inviteExpiresAt": "2026-10-24T13:00:00.000Z",
"shareTtlMinutes": 30
}
Follow an invitation
GET /api/v1/kyc/reuse/invitations/:id — scope kyc:read. The response also carries type (INDIVIDUAL or BUSINESS). status is invited, code_sent, verified, consented (a token is waiting), redeemed, expired or revoked. When redeemed, requestId is the new verification. The share token is never returned here; it reaches you through the applicant's redirect.
Redeem a share token
POST /api/v1/kyc/reuse/redeem — scope kyc:write.
{ "shareToken": "krs_…" }
{
"requestId": "clx…",
"applicantId": "clx…",
"status": "APPROVED",
"type": "INDIVIDUAL",
"externalRef": "crm-7",
"reused": true,
"verifiedAt": "2026-09-30T15:12:00.000Z",
"sourceAgeDays": 24,
"documentsCopied": 2,
"chargedCents": 0
}
Rules:
- A token is single use, expires after its lifetime, and works only for the organization the link was created by. Any other caller gets
404 invalid_token. - The call creates a verification already approved, with copies of the applicant data, the extracted document fields and the document files (in your storage location). If your organization keeps no documents after a decision, no files are copied.
- For a business share (
type: "BUSINESS"in the response) the new verification is aBUSINESSrequest that also carries the company record and registry result, the directors and beneficial owners (without the links to the source's own UBO verifications), the representative's verified identity and their match to the directors, and the authorization document if one exists. Read it with the usual KYB endpoints (GET /v1/kyc/requests/:id/kyb). - The new verification records the API key that redeemed it. If that key is restricted to workflows, only those workflows run for it (see Workflow restriction).
- Your usual webhooks fire: a
kyc.request.approvedevent withdata.reason: "reused_verification". - A failed copy gives the token back (until it expires) and leaves nothing behind.
Errors
| Status | error.code | Meaning |
|---|---|---|
| 402 | plan_feature_required | Your plan doesn't include Reused Verifications. |
| 402 | credit_needed | A reuse price is set and the wallet can't cover it. |
| 403 | reuse_not_enabled | The accept switch for that type (individual / business) is off. |
| 404 | invalid_token | Unknown token, or it belongs to another organization. |
| 409 | token_already_used | Already redeemed. |
| 410 | token_expired | The token's lifetime elapsed. |
| 422 | reuse_refused | error.reason: source_not_approved, source_not_individual, source_not_business, source_expired, source_too_old, source_sharing_disabled, same_tenant or residency_mismatch. |
| 502 | copy_failed | Try again while the token is valid. |
Residency
Both organizations must have the same storage region, database region and AI-processing residency (an unset region only matches another unset one). Otherwise the share is refused with residency_mismatch — nothing is copied across a region boundary.
On a public form
When your organization accepts reused verifications of a kind, a public KYC form (individual) or KYB form (business) offers "Already verified with Certivant?" at its start. The applicant proves ownership (emailed code) and consents exactly as above, the form is pre-filled from the shared verification (they review and can correct everything; no documents are asked for), and the submission is filed against the new, already-approved reused verification. Combined KYC + KYB forms, invitation links (?kyc=) and non-verification forms don't offer it.
The form's own endpoints (public, no API key) are, for reference when you embed a form yourself:
| Call | Purpose |
|---|---|
GET /api/kyc/public/forms/:slug/reuse/options | { available, kind } — whether the entry is offered. |
POST /api/kyc/public/forms/:slug/reuse/start | Opens an invitation for this form → { token, kind }; the proof and consent then use /api/kyc/public/reuse/:token/…. |
POST /api/kyc/public/forms/:slug/reuse/prefill | { shareToken } → { kind, prefill, verified } without redeeming. |
POST /api/kyc/public/forms/:slug/reuse/submit | { shareToken, data } → redeems the share and files the submission ({ success, reused, submissionId, kycRequestId, kybRequestId }). |
A form protected by a secret key must send it as the X-Form-Key header on each call. A share created for a form can only be redeemed by that form's submit — not with POST /reuse/redeem (404 invalid_token) — and the new verification is attributed to the form.
Billing
Free by default. A Reused verification price (individuals) and a Reused business verification price (businesses) in Billing Prices (or a per-customer override) are charged to the receiving organization once per redeemed share; the call is idempotent per share.
Audit
The receiving organization's audit log records reuse.invitation_created, reuse.consent_received and reuse.redeemed. The source organization records reuse.consent_recorded and reuse.shared. The source organization's identity is never exposed to you.
Age check API
Estimate whether someone is old enough from a selfie, with a fall back to an ID date of birth when the estimate is too close to the limit.
Webhooks setup
Step-by-step guide to registering a Certivant webhook endpoint, storing the signing secret, sending a test event, rotating secrets, and configuring per-form overrides.