Para conhecer os corredores de pagamento compatíveis, consulte Payout network.
Este tutorial mostra como usar os endpoints de identidade do Identity Management v3 para:
- Criar uma nova identidade
- Recuperar uma identidade por ID (e por versão)
- Listar identidades com filtros e paginação
- Atualizar os dados de uma identidade
- Desativar uma identidade
Ele parte do modelo descrito em Identidades do pagamento e foca no schema de identidade v3.
Um comportamento central da v3 é que no máximo uma identidade ACTIVE no seu ambiente pode usar um determinado internalId. Tentativas de criar ou atualizar uma identidade de modo que o internalId dela colida com o de outra identidade ACTIVE resultam em 409 Conflict.
Para seguir estes exemplos, você precisa de:
- URL base do Identity Management (por exemplo,
https://{base-url}) - Um token de acesso com os seguintes escopos (ou equivalentes):
participants:createpara criar identidadesparticipants:readpara ler e listar identidadesparticipants:updatepara atualizar e desativar identidades
- O modelo de identidade v3 de Identidades do pagamento (INDIVIDUAL vs BUSINESS e ORIGINATOR vs BENEFICIARY)
Em todos os exemplos abaixo, substitua:
{base-url}pela sua URL base de PII real<access_token>por um token de acesso OAuth2 válido{identity-id}por umidentityIdreal retornado pela API
Use POST /v3/identities para criar uma nova identidade.
No mínimo, você precisa informar:
identityType– INDIVIDUAL ou BUSINESSpaymentRole– ORIGINATOR ou BENEFICIARY- Os dados de pessoa física ou de empresa, conforme o
identityType internalIdpara identidades ORIGINATOR
Para identidades BENEFICIARY, o internalId é opcional, mas recomendado se você quiser vincular beneficiários aos seus próprios registros de clientes.
O Identity Management v3 garante que no máximo uma identidade ACTIVE por organização possa usar um determinado internalId.
- Se você tentar criar uma identidade e o
internalIdinformado já estiver em uso por outra identidade ACTIVE, a requisição falha com 409 Conflict. - Você pode tratar esse erro na sua integração para sinalizar situações de “cliente duplicado” ou orientar os usuários a reutilizar a identidade existente.
Alguns corredores exigem o número da conta do próprio ordenante. Envie-o em originatorAccountNumber, e não em internalId. Em uma identidade de ordenante validada em relação a CN_CFXPS (pagamentos em USD à China), omitir originatorAccountNumber falha com 400 Bad Request (USR_111), e um UUID gerado aleatoriamente ou outra referência arbitrária faz o payout ser rejeitado.
Consulte O número da conta do ordenante.
Se a sua organização estiver configurada para a jurisdição do Brasil (BR), identityDocuments é obrigatório em toda identidade ORIGINATOR, em todos os corredores, inclusive naqueles que de outra forma não o exigiriam. Omiti-lo falha com 400 Bad Request (USR_111).
Isso vale tanto para atualizações quanto para criações. Uma atualização valida o corpo que você envia, não o registro já armazenado, portanto uma atualização que omita identityDocuments falha mesmo quando você está alterando algo não relacionado.
Consulte Requisitos por jurisdição.
Opcionalmente, você também pode:
- Definir um
nickNameamigável etags - Adicionar
validatePayoutRailspara validar a identidade contra payment rails específicos (por exemplo,US_ACH,BR_PIX,MX_SPEI)
Exemplo: criar um INDIVIDUAL ORIGINATOR
curl -X POST "https://{base-url}/v3/identities" \
-H "Authorization: Bearer <access_token>" \
-H "Content-Type: application/json" \
-d '{
"identityType": "INDIVIDUAL",
"paymentRole": "ORIGINATOR",
"internalId": "customer-12345-uuid",
"nickName": "Alice Sender USD",
"tags": ["sender", "priority"],
"validatePayoutRails": ["US_ACH"],
"individual": {
"firstName": "Alice",
"lastName": "Chen",
"dateOfBirth": "1990-05-14",
"citizenship": "US",
"address": {
"streetAddress": ["123 Main Street"],
"city": "San Francisco",
"stateOrProvince": "CA",
"postalCode": "94105",
"country": "US"
}
}
}'Resposta (201 Created)
{
"identityId": "99254c4f-f207-4792-a846-06928825018c",
"version": "1"
}Se você enviar outro POST /v3/identities com o mesmo internalId enquanto esta identidade ainda estiver ACTIVE, o serviço retorna:
- 409 Conflict – indicando que outra identidade ACTIVE já usa esse
internalId.
Trate o 409 como um sinal de que você deve localizar e reutilizar a identidade existente em vez de criar uma duplicada.
Exemplo: criar um BUSINESS BENEFICIARY
curl -X POST "https://{base-url}/v3/identities" \
-H "Authorization: Bearer <access_token>" \
-H "Content-Type: application/json" \
-d '{
"identityType": "BUSINESS",
"paymentRole": "BENEFICIARY",
"internalId": "counterparty-7890",
"nickName": "Widgets Org MX",
"tags": ["beneficiary", "mx"],
"validatePayoutRails": ["MX_SPEI"],
"business": {
"businessName": "Widgets Org",
"incorporationCountry": "US",
"registration": [
{
"number": "123ABC",
"type": "INCORPORATION_CERTIFICATE"
}
],
"email": "fake@example.com",
"phone": "+1234567890",
"address": {
"streetAddress": ["123 Example MA"],
"city": "Boston",
"stateOrProvince": "MS",
"postalCode": "12345",
"country": "US"
}
}
}'Resposta (201 Created)
{
"identityId": "0116bacc-ffbf-4fa2-a29c-ecd9ea346806",
"version": "1"
}Se algum dado de PII obrigatório estiver ausente ou inválido para os rails em validatePayoutRails, a API retorna um erro 400 descrevendo quais campos falharam na validação.
Exemplo: falha de validação por campos obrigatórios ausentes
Se você tentar criar uma identidade com validatePayoutRails: ["US_ACH"] mas omitir campos obrigatórios como identityDocuments, receberá:
Resposta (400 Bad Request)
{
"code": "VALIDATION_ERROR",
"title": "Identity validation failed",
"description": "The identity is missing required fields for the specified payment rails.",
"details": [
{
"field": "individual.identityDocuments",
"message": "At least one identity document (SSN or Tax ID) is required for US_ACH beneficiary identities"
}
]
}Para corrigir isso, adicione os campos ausentes e envie a requisição novamente.
Exemplo: falha de validação por tipo de documento não compatível
Alguns corredores aceitam apenas um subconjunto do enum idType (pessoa física) ou registration.type (empresa), e a API rejeita os tipos não compatíveis com um erro 400. Por exemplo, ordenantes KR_KFTC aceitam apenas PASSPORT, portanto enviar NATIONAL_ID_NUMBER falha:
Resposta (400 Bad Request)
{
"code": "VALIDATION_ERROR",
"title": "Identity validation failed",
"description": "The identity uses a document type that is not supported for the specified payment rails.",
"details": [
{
"field": "individual.identityDocuments.idType",
"message": "Document type NATIONAL_ID_NUMBER is not accepted for KR_KFTC originator identities. Accepted values: PASSPORT."
}
]
}Para ver os tipos de documento aceitos por corredor e papel, consulte Tipos de documento aceitos por corredor.
Quando você cria ou atualiza uma identidade com um internalId que já está em uso por outra identidade ACTIVE, a API retorna 409 Conflict.
Este é um recurso de deduplicação que evita que você crie acidentalmente várias identidades para o mesmo cliente.
Requisição:
curl -X POST "https://{base-url}/v3/identities" \
-H "Authorization: Bearer <access_token>" \
-H "Content-Type: application/json" \
-d '{
"identityType": "INDIVIDUAL",
"paymentRole": "BENEFICIARY",
"internalId": "customer-12345-uuid",
"individual": {
"firstName": "Bob",
"lastName": "Smith",
"address": {
"streetAddress": ["456 Oak Ave"],
"city": "Austin",
"stateOrProvince": "TX",
"postalCode": "78701",
"country": "US"
}
}
}'Resposta (409 Conflict)
{
"code": "CONFLICT",
"title": "Identity conflict",
"description": "An identity with the provided internalId already exists.",
"details": [
{
"field": "internalId",
"message": "An ACTIVE identity with internalId 'customer-12345-uuid' already exists (identityId: 99254c4f-f207-4792-a846-06928825018c)"
}
]
}Quando você receber um 409 Conflict:
- Localize a identidade existente usando o
identityIdda mensagem de erro - Reutilize a identidade existente em vez de criar uma nova
- Atualize a identidade existente se necessário (por exemplo, para adicionar novos dados de PII ou alterar
validatePayoutRails) - Investigue os seus sistemas upstream se estiver recebendo conflitos inesperados (isso pode indicar registros de clientes duplicados no seu CRM ou banco de dados)
Exemplo: localizar a identidade existente
curl -X GET "https://{base-url}/v3/identities/99254c4f-f207-4792-a846-06928825018c" \
-H "Authorization: Bearer <access_token>"Se a identidade existente estiver correta, use-a na criação do seu pagamento ou instrumento financeiro. Se ela precisar de atualizações, use PUT /v3/identities/{identity-id} para modificá-la.
Requisição:
curl -X PUT "https://{base-url}/v3/identities/1d927c62-45fa-4f42-b9f8-8210e1a111bb" \
-H "Authorization: Bearer <access_token>" \
-H "Content-Type: application/json" \
-d '{
"internalId": "customer-99999"
}'Se customer-99999 já estiver em uso por uma identidade ACTIVE diferente:
Resposta (409 Conflict)
{
"code": "CONFLICT",
"title": "Identity conflict",
"description": "The provided internalId already exists on a different identity.",
"details": [
{
"field": "internalId",
"message": "An ACTIVE identity with internalId 'customer-99999' already exists (identityId: 7ea3399c-1234-5678-8d8f-d320ea406630)"
}
]
}- Use chaves upstream estáveis – use o ID de cliente do seu CRM, o ID de cliente do core bancário ou o ID do registro mestre de KYC como
internalId - Mantenha-o como a sua própria chave – você não precisa adaptar o
internalIdpara nenhum corredor. Os corredores que precisam do número da conta do ordenante leemoriginatorAccountNumber. Consulte O número da conta do ordenante - Implemente uma lógica de criação idempotente – ao criar identidades, capture os erros 409 e localize a identidade existente em vez de falhar
- Evite PII no
internalId– não use e-mails, telefones ou documentos nacionais diretamente; use identificadores opacos - Monitore os conflitos – acompanhe os erros 409 nos seus logs para identificar problemas de qualidade de dados nos sistemas upstream
Use GET /v3/identities/{identity-id} para recuperar uma identidade específica.
- Se você omitir o parâmetro de consulta version, a versão mais recente é retornada.
- Para recuperar uma versão específica, inclua
?version={version-number}.
Exemplo: obter a versão mais recente
curl -X GET "https://{base-url}/v3/identities/9d839f58-7fd3-4913-a27e-48d31973d3f9" \
-H "Authorization: Bearer <access_token>"Resposta (200 OK)
{
"identityId": "9d839f58-7fd3-4913-a27e-48d31973d3f9",
"identityState": "ACTIVE",
"nickName": "nickName",
"tags": ["tag1"],
"version": "2",
"schemaVersion": "1.0.0",
"createdAt": "2025-10-01T18:46:41.833Z",
"updatedAt": "2025-10-01T18:46:47.430Z",
"identityType": "BUSINESS",
"paymentRole": "BENEFICIARY",
"internalId": "counterparty-7890",
"business": {
"businessName": "Widgets Org",
"address": {
"streetAddress": ["123 Example MA"],
"country": "US",
"city": "Boston",
"stateOrProvince": "MS",
"postalCode": "12345"
},
"email": "fake@example.com",
"phone": "+1234567890",
"registration": [
{
"number": "123ABC",
"type": "INCORPORATION_CERTIFICATE"
}
],
"incorporationCountry": "US"
}
}Exemplo: obter uma versão específica
curl -X GET "https://{base-url}/v3/identities/9d839f58-7fd3-4913-a27e-48d31973d3f9?version=1" \
-H "Authorization: Bearer <access_token>"Use consultas versionadas quando precisar:
- Comparar mudanças ao longo do tempo para auditoria
- Conciliar pagamentos que usaram uma versão anterior de uma identidade
Se a identidade ou a versão não existir, o serviço retorna 404 Not Found.
Use GET /v3/identities/by-internal-id/{internal-id} para localizar uma identidade diretamente pelo internalId fornecido por você, sem precisar saber antes o identityId gerado pelo servidor.
Este endpoint é especialmente útil para:
- Resolver o
identityIdde uma identidade de cliente existente quando você tem apenas a sua própria referência (por exemplo, um ID de cliente do CRM). - Implementar fluxos idempotentes de criar-ou-buscar sem armazenar o
identityIdseparadamente. - Tratar respostas 409 Conflict localizando imediatamente a identidade conflitante.
Exemplo: localizar uma identidade pelo ID interno
curl -X GET "https://{base-url}/v3/identities/by-internal-id/customer-12345-uuid" \
-H "Authorization: Bearer <access_token>"Resposta (200 OK)
{
"identityId": "99254c4f-f207-4792-a846-06928825018c",
"identityState": "ACTIVE",
"identityType": "INDIVIDUAL",
"paymentRole": "ORIGINATOR",
"internalId": "customer-12345-uuid",
"nickName": "Alice Sender USD",
"tags": ["sender", "priority"],
"version": "1",
"schemaVersion": "1.0.0",
"createdAt": "2025-10-01T18:46:41.833Z",
"updatedAt": "2025-10-01T18:46:47.430Z",
"individual": {
"firstName": "Alice",
"lastName": "Chen",
"dateOfBirth": "1990-05-14",
"citizenship": "US",
"address": {
"streetAddress": ["123 Main Street"],
"city": "San Francisco",
"stateOrProvince": "CA",
"postalCode": "94105",
"country": "US"
}
}
}Este endpoint retorna a identidade apenas se ela estiver ACTIVE no momento. Se a identidade existir mas tiver sido desativada ou bloqueada, o serviço retorna 404 Not Found.
A consulta é restrita à sua organização. Valores de internalId de outras organizações não geram conflito.
Respostas de erro:
- 404 Not Found – não existe nenhuma identidade ACTIVE com o
internalIdespecificado na sua organização
Use GET /v3/identities para recuperar as identidades da sua organização com filtros e paginação opcionais.
Parâmetros de consulta compatíveis:
payment-role– filtra por papel de pagamento (ORIGINATOR ou BENEFICIARY)nick-name– filtra por apelido (correspondência exata)limit– número máximo de identidades a retornar (de 1 a 100, padrão 10)next-token– token opaco retornado em uma resposta anterior, usado para buscar a próxima página
Exemplo: listar identidades por papel
curl -X GET "https://{base-url}/v3/identities?payment-role=BENEFICIARY&limit=2" \
-H "Authorization: Bearer <access_token>"Resposta (200 OK)
{
"data": [
{
"identityId": "0116bacc-ffbf-4fa2-a29c-ecd9ea346806",
"identityType": "BUSINESS",
"paymentRole": "BENEFICIARY",
"createdAt": "2025-10-01T16:14:13.200Z",
"updatedAt": "2025-10-01T16:14:15.763Z",
"identityState": "ACTIVE",
"nickName": "testNickName",
"tags": ["tag1"],
"version": 2,
"schemaVersion": "1.0.0",
"internalId": "counterparty-7890"
},
{
"identityId": "1d927c62-45fa-4f42-b9f8-8210e1a111bb",
"identityType": "INDIVIDUAL",
"paymentRole": "ORIGINATOR",
"createdAt": "2025-10-01T17:20:05.111Z",
"updatedAt": "2025-10-01T17:20:06.500Z",
"identityState": "ACTIVE",
"nickName": "Alice Originator",
"tags": ["sender", "priority"],
"version": 1,
"schemaVersion": "1.0.0",
"internalId": "customer-12345-uuid"
}
],
"nextToken": "eyJrZXkxIjoidmFsdWUifQ=="
}Se você receber um nextToken, devolva-o como next-token para buscar a próxima página:
curl -X GET "https://{base-url}/v3/identities?payment-role=BENEFICIARY&limit=2&next-token=eyJrZXkxIjoidmFsdWUifQ==" \
-H "Authorization: Bearer <access_token>"Se nenhuma identidade corresponder aos seus filtros, o serviço retorna 404 Not Found.
Use PUT /v3/identities/{identity-id} para atualizar uma identidade existente.
Cada atualização bem-sucedida cria uma nova versão da identidade. O identityId nunca muda, e as versões anteriores continuam disponíveis para consulta e auditoria. O corpo da requisição aceita atualizações parciais. Inclua apenas os campos que você quer alterar.
Você pode atualizar:
- Metadados:
nickName,tags - PII: qualquer campo dentro de
individualoubusiness internalId(precisa continuar único entre todas as identidades ACTIVE)validatePayoutRails(revalida o PII contra os rails especificados)
O identityType e o paymentRole não podem ser alterados após a criação.
Para ver exemplos completos, tratamento de erros e orientações sobre a atualização de identidades BLOCKED, consulte Atualizar uma identidade.
Use DELETE /v3/identities/{identity-id} para desativar uma identidade.
A desativação:
- Define o estado da identidade como DEACTIVATED
- Desativa os instrumentos financeiros associados à identidade
- Impede que novos pagamentos usem esta identidade
- Mantém as versões históricas disponíveis para auditoria
A desativação é permanente; não é possível reativar uma identidade desativada.
Exemplo: desativar uma identidade
curl -X DELETE "https://{base-url}/v3/identities/146f3c51-c313-47ce-b6f2-691c5a238b3e" \
-H "Authorization: Bearer <access_token>"Resposta (204 No Content) – a identidade foi desativada com sucesso.
Respostas de erro:
- 400 Bad Request – requisição malformada ou formato inválido de
identityId - 404 Not Found – a identidade não existe
- 422 Unprocessable Entity – a identidade já está desativada ou não pode ser desativada (por exemplo, por restrições internas)
Todos os endpoints de identidade usam um schema padrão de resposta de erro com:
- code – código de erro legível por máquina
- title – resumo curto legível por humanos
- description – explicação detalhada e sugestões de correção
Casos comuns:
- 400 – campos ausentes ou inválidos na requisição, ou identidade reprovada nas regras de validação específicas do corredor
- 404 – identidade não encontrada (para um ID, versão ou consulta específicos)
- 409 – conflito de
internalId(outra identidade ACTIVE já usa o mesmointernalId) - 422 – transição de ciclo de vida inválida (por exemplo, tentar desativar uma identidade já desativada)
- 500 – erro interno de processamento; tente novamente ou entre em contato com o suporte se persistir
Consulte a seção geral de Tratamento de erros da documentação da API para ver a lista completa de códigos de erro.
- Para uma explicação mais aprofundada do modelo de identidade, consulte Identidades do pagamento.
- Para ver exemplos completos de atualização e orientações sobre versionamento imutável, validação de payment rail e reativação de identidades BLOCKED, consulte Atualizar uma identidade.
- Para saber como vincular dados de conta de payout às identidades (contas bancárias, carteiras, payment rails locais), continue com Criar e gerenciar instrumentos financeiros.