Identity verification
This API is billed separately.
The API creates an account-independent proof for password resets, second-factor resets, high-value transactions, or another sensitive action. The bank backend creates a journey for a CPF, gives the link to the account holder, and consumes the approval once before completing the action.
This surface is for the internet-banking master M2M credential. A child credential delegated to one account cannot create, read, or consume verifications. Never send the master credential to a browser or app.
Prerequisites
- a
client_credentialstoken from the master; - the
https://client.api.corpx.comhost and all three signing headers; X-Tenant-Id;- the
identity_verification.managescope; - the
identity_verificationtenant feature for creation; - a
callbackUriregistered under Identity verifications in the panel, compared exactly.
Downloading evidence uses the dedicated kyc.read scope.
Create
document is an 11-digit CPF. referenceId is required and identifies the
action in your system. Accepted purposes are password_reset,
second_factor_reset, high_value_transaction, and sensitive_action.
displayMessage is optional plain text up to 240 characters. ttlMinutes
defaults to 30 and consumeTtlMinutes to 10; both have a maximum of 60.
Do not send Idempotency-Key: every POST intentionally creates a fresh
proof and consumes one quota unit when it returns 201.
201 response:
The fixed quota is 10 201 responses per tenant per BRT calendar month,
across every internet-banking journey. Every 201 counts and is never
refunded, even if the journey fails, expires, or is not consumed. A closed quota
returns HTTP 429 with identity_verification_monthly_limit_exceeded; the
rate_limited error also uses HTTP 429, but it is a separate traffic limit.
Retrieve
The response includes purpose, referenceId, document, provider,
expiresAt, failureReason, completedAt, consumableUntil, and
consumedAt when applicable. verificationLink exists only while PENDING.
Consume
Purpose and reference must exactly match creation. The first valid call writes
consumedAt. Retrying the same ID and body is idempotent; a different
purpose/reference, competing consumption, non-approved state, or elapsed window
returns 409.
Consume from the backend immediately before the protected action. Seeing
APPROVED on GET does not reserve the proof and, by itself, does not prevent
concurrent reuse.
Callback and webhook
callbackUri only returns the browser. It must be identical to the registered
URI—no wildcard, prefix, or normalization—and is not proof of the outcome.
identity.verification.completed is delivered for APPROVED, FAILED, and
EXPIRED, with X-Signature. Verify the raw bytes and deduplicate on the
envelope id. See the complete example in
Account webhooks.
Evidence
GET /v1/identity-verifications/{verificationId}/artifacts requires kyc.read
instead of the management scope and the kyc_artifacts feature. Sign it like
every other call on the client host. The response may contain biometrics and
provider evidence; do not log URLs or contents.