Verificação de identidade

A API cria uma prova independente de conta para proteger redefinição de senha, reset de segundo fator, transação de alto valor ou outra ação sensível. O backend do banco cria a jornada para um CPF, entrega o link ao correntista e consome a aprovação uma única vez antes de concluir a ação.

Use a master, não a credencial da conta

Esta superfície é para a credencial master M2M do internet banking. A credencial filha, delegada para uma única conta, não pode criar, consultar nem consumir verificações. Nunca envie a master ao navegador ou ao app.

Pré-requisitos

  • token client_credentials da master;
  • host https://client.api.corpx.com e os três headers de assinatura;
  • X-Tenant-Id;
  • escopo identity_verification.manage;
  • feature identity_verification habilitada para criar jornadas;
  • callbackUri previamente cadastrada, com comparação exata.

O download de evidências usa o escopo dedicado kyc.read.

Criar

curl -X POST "https://client.api.corpx.com/v1/identity-verifications" \
-H "Authorization: Bearer $TOKEN" \
-H "X-Tenant-Id: $TENANT_ID" \
-H "X-Request-Timestamp: $TS" \
-H "X-Content-SHA256: $BODY_SHA256" \
-H "X-Request-Signature: $SIGNATURE" \
-H "Content-Type: application/json" \
-d '{
"document": "12345678909",
"purpose": "second_factor_reset",
"referenceId": "reset_01J8Y6N7M8P9Q0R1S2T3",
"displayMessage": "Confirme sua identidade para cadastrar o novo dispositivo.",
"callbackUri": "https://ib.example.com/identity-verification/return",
"ttlMinutes": 30,
"consumeTtlMinutes": 10
}'

document é um CPF de 11 dígitos. referenceId é obrigatório e identifica a ação no seu sistema. As finalidades aceitas são password_reset, second_factor_reset, high_value_transaction e sensitive_action. displayMessage é texto simples opcional de até 240 caracteres. ttlMinutes tem padrão 30 e consumeTtlMinutes, 10; ambos têm máximo 60.

Não envie Idempotency-Key: cada POST abre intencionalmente uma prova nova e consome uma unidade da cota quando responde 201.

Resposta 201:

{
"verificationId": "idv_01J8Y7C8D9E0F1G2H3J4",
"status": "PENDING",
"verificationLink": "https://tenant.api.corpx.com/v1/identity-verifications/verify#capability-redacted",
"expiresAt": "2026-09-24T14:30:00Z"
}
Dez por tenant, não por conta

A cota fixa é de 10 respostas 201 por tenant por mês-calendário BRT, somando todas as jornadas do internet banking. Cada 201 conta e nunca é estornado, mesmo se a jornada falhar, expirar ou não for consumida. Cota fechada responde HTTP 429 com identity_verification_monthly_limit_exceeded; o erro rate_limited também usa HTTP 429, mas é um limite de tráfego separado.

Consultar

curl "https://client.api.corpx.com/v1/identity-verifications/$VERIFICATION_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "X-Tenant-Id: $TENANT_ID" \
-H "X-Request-Timestamp: $TS" \
-H "X-Content-SHA256: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" \
-H "X-Request-Signature: $SIGNATURE"
StatusPróximo passo
PENDINGAguarde; verificationLink continua presente
APPROVEDConsuma antes de consumableUntil
FAILEDNão execute a ação; leia failureReason
EXPIREDCrie outra jornada se ainda for necessário

A resposta inclui purpose, referenceId, document, provider, expiresAt, failureReason, completedAt, consumableUntil e consumedAt quando aplicáveis. verificationLink só existe em PENDING.

Consumir

curl -X POST \
"https://client.api.corpx.com/v1/identity-verifications/$VERIFICATION_ID/consume" \
-H "Authorization: Bearer $TOKEN" \
-H "X-Tenant-Id: $TENANT_ID" \
-H "X-Request-Timestamp: $TS" \
-H "X-Content-SHA256: $BODY_SHA256" \
-H "X-Request-Signature: $SIGNATURE" \
-H "Content-Type: application/json" \
-d '{
"purpose": "second_factor_reset",
"referenceId": "reset_01J8Y6N7M8P9Q0R1S2T3"
}'

A finalidade e a referência precisam coincidir exatamente com a criação. A primeira chamada válida grava consumedAt. Repetir o mesmo id e o mesmo corpo é idempotente; finalidade/referência diferentes, consumo concorrente, estado não aprovado ou janela vencida respondem 409.

Consuma no backend imediatamente antes da ação protegida. Ver APPROVED no GET não reserva a prova e, sozinho, não impede reutilização concorrente.

Callback e webhook

A callbackUri só devolve o navegador. Ela precisa ser idêntica à URI cadastrada — sem wildcard, prefixo ou normalização — e não prova o resultado.

identity.verification.completed é enviado para APPROVED, FAILED e EXPIRED, com X-Signature. Valide os bytes brutos e deduplique pelo id do envelope. Exemplo completo em Webhooks da conta.

Evidências

GET /v1/identity-verifications/{verificationId}/artifacts exige kyc.read no lugar do escopo de gerenciamento e a feature kyc_artifacts. Assine a chamada como qualquer outra no host client. O retorno pode conter biometria e evidências do provedor; não registre URLs nem conteúdo em logs.

Erros principais

HTTPerrorCodeSignificado
400invalid_document, invalid_purpose, invalid_reference_idCampo de criação inválido
400invalid_display_message, invalid_verification_ttl, invalid_consume_ttlTexto ou intervalo inválido
400invalid_callback_uriA URI não coincide exatamente com o cadastro
403feature_disabledFeature desligada
403insufficient_scopeFalta identity_verification.manage ou kyc.read
403forbiddenA chamada não veio da master M2M
404verification_not_foundId inexistente neste tenant
409verification_not_consumableEstado, janela ou vínculo de consumo incompatível
409reference_already_consumedOutra prova já autorizou esta finalidade/referência
429identity_verification_monthly_limit_exceededDez criações 201 já usadas no mês BRT
429rate_limitedLimite de tráfego, separado da cota