userExternalId: escolhendo um identificador que você não vai querer trocar

Entre os campos obrigatórios de uma transação, userExternalId é o mais fácil de preencher no automático e o mais caro de corrigir depois. Ele aceita qualquer texto, ninguém valida o formato, e o valor que você mandar no primeiro dia funciona. O que a documentação não deixa óbvio é o papel que ele exerce: é por ele que a API agrupa tudo o que uma pessoa fez e é ele que endereça o cadastro biométrico dela. Trocá-lo mais tarde não renomeia coisa alguma — cria um segundo usuário, vazio, ao lado do primeiro. Este guia mostra o que ele governa e como escolher um valor com o qual você vai conseguir conviver.

Recomendação, para quem só quer o resumo: use a chave primária imutável do seu banco, prefixada com a origem — cliente-8812, matricula-4471. Não use e-mail, telefone nem CPF. O campo é texto livre, mas se comporta como chave primária, e não existe operação de renomeação.

Um campo obrigatório que ninguém valida

Toda criação de transação ou sessão exige signer.userExternalId:

{ "signer": { "name": "Ana Ribeiro Costa", "userExternalId": "cliente-8812", // obrigatório, texto livre "cpf": "12345678901", "email": "ana@exemplo.com.br" } }

Sem ele, a criação falha com signer.userExternalId is required. Com qualquer valor, ela passa: não há restrição de formato, de tamanho ou de conjunto de caracteres. É essa combinação — obrigatório, mas irrestrito — que faz o campo ser preenchido no reflexo, com o que estiver à mão.

O que ele realmente governa

1. O histórico da pessoa

A plataforma agrupa as transações por esse identificador. É a resposta para "o que essa pessoa já assinou na minha conta" — usada em suporte, em auditoria interna e em qualquer tela que mostre o histórico de um cliente.

Dois valores diferentes para a mesma pessoa produzem dois históricos, e nada na API indica que eles se referem ao mesmo indivíduo.

2. O cadastro biométrico

Este é o vínculo mais concreto, porque o identificador está no próprio caminho da rota:

PUT /v1/users/{userExternalId}/enrollment GET /v1/users/{userExternalId}/enrollment DELETE /v1/users/{userExternalId}/enrollment

O cadastro da foto de referência é endereçado por ele. Mudar o identificador de uma pessoa desconecta o cadastro biométrico dela — a consulta responde 404 e a próxima assinatura com comparação facial falha por falta de referência, num ponto do fluxo que não tem nada a ver com a mudança que causou o problema.

O que acontece quando o valor muda

Nada é migrado. Vale ser literal sobre a sequência, porque a intuição sugere renomeação e não é isso que acontece:

// Janeiro — a pessoa assina como "ana@exemplo.com.br" userExternalId: "ana@exemplo.com.br" → 4 transações, 1 cadastro biométrico // Junho — ela troca de e-mail e o sistema atualiza o campo userExternalId: "ana.costa@exemplo.com.br" → 0 transações, 0 cadastro // O histórico antigo não sumiu. Ele está no identificador antigo, // que ninguém mais consulta porque ninguém mais sabe que ele existe.

Não há endpoint de fusão nem de renomeação. A correção é reprocessar do seu lado: descobrir o valor antigo, recadastrar a biometria sob o novo, e manter em algum lugar a informação de que os dois identificadores são a mesma pessoa. Todo esse trabalho é evitável com dez minutos de decisão no início.

Duas identidades, e por que ambas existem

Uma dúvida frequente é por que a API pede dois identificadores — este e o CPF ou CNPJ, que também é obrigatório. Eles respondem a perguntas diferentes:

userExternalId CPF / CNPJ
Responde Quem é essa pessoa no seu sistema Quem é essa pessoa perante o registro público
Quem define Você A pessoa (e o Estado)
Escopo Sua conta Universal
Endereça o cadastro biométrico Sim Não
Entra na evidência Sim Sim

Isso explica por que usar o CPF como userExternalId costuma ser a escolha errada, embora funcione. O CPF já é indexado separadamente como identificador da pessoa natural, então repeti-lo aqui não acrescenta capacidade de busca alguma — só espalha um dado pessoal por mais um campo, que aparece em log de aplicação, no caminho da URL das rotas de cadastro biométrico e no seu próprio banco. Ganha-se nada e amplia-se a superfície.

Escolhas ruins, e por quê

Valor Problema
E-mail Muda. Pessoas trocam de e-mail, empresas trocam de domínio, e o campo parece um identificador natural exatamente até o dia em que muda
Telefone Muda mais que o e-mail, e é reaproveitado por operadoras entre pessoas diferentes
CPF Estável, mas redundante com o campo que já existe, e espalha dado pessoal
Nome, ou nome normalizado Não é único, e muda por casamento, nome social e correção de grafia
Número de contrato ou de pedido Identifica o negócio, não a pessoa: cada novo contrato criaria um usuário novo, e o histórico nunca se acumula
UUID gerado na hora Estável e inútil — se você não o guarda do seu lado, cada transação vira uma pessoa diferente

A penúltima linha merece atenção porque é um erro sutil: usar o identificador do documento no campo do signatário não gera erro nenhum na API. Tudo funciona, e o histórico simplesmente nunca se forma.

A escolha que envelhece bem

cliente-8812 // PK de clientes matricula-4471 // PK de funcionários fornecedor-221 // PK de fornecedores associado-90310 // PK de associados

Três propriedades a buscar:

  • Imutável por construção. Chave primária de banco não muda porque a pessoa mudou de e-mail — é justamente para isso que ela existe.
  • Legível em investigação. Quando o suporte lê cliente-8812 num registro, sabe onde procurar. Com um UUID opaco, precisa de uma consulta a mais só para saber de que tabela veio.
  • Sem dado pessoal. O identificador aparece em caminho de URL e em log; um valor que não carrega dado pessoal simplifica a vida.

O prefixo resolve um problema real quando várias tabelas alimentam a mesma integração: sem ele, o cliente 8812 e o fornecedor 8812 colidiriam no mesmo identificador — e a API os trataria, corretamente do ponto de vista dela, como a mesma pessoa.

Decisões de borda

A mesma pessoa em dois papéis. Se ela é cliente e também fornecedor, e o seu sistema mantém dois cadastros, use dois identificadores — os históricos ficam separados, o que costuma ser o desejado. Se quiser o histórico unificado, use um. As duas escolhas são legítimas; o que causa problema é oscilar entre elas ao longo do tempo.

Signatário que não é seu cliente. O avalista, o representante da outra parte, a testemunha — pessoas que não têm cadastro no seu sistema. Crie um cadastro mínimo e use a chave dele, ou adote um prefixo próprio (externo-…) com um identificador que você controle. O que não funciona é improvisar um valor diferente a cada vez: aí a mesma pessoa, que pode voltar a assinar, nunca acumula histórico.

Migração de outra plataforma. Reaproveitar o identificador da plataforma antiga é tentador e amarra você a ela. Se o mapeamento existe do seu lado, use o seu próprio identificador desde o começo.

Antes da primeira transação em produção

  1. Escolha a fonte do valor — qual tabela, qual coluna — e escreva isso na documentação interna da integração.
  2. Prefixe por origem se mais de uma tabela alimenta a integração.
  3. Confirme que a coluna é imutável. Se a área de negócio consegue renumerar aquilo, não serve.
  4. Não derive de dado pessoal. Nem e-mail, nem telefone, nem CPF.
  5. Se usar biometria, teste o ciclo completo: cadastrar sob o identificador, consultar e assinar. É onde um identificador instável se revela primeiro — ver os prazos do cadastro biométrico.

Para o modelo em que esse identificador se encaixa, veja transação, sessão ou envelope: qual usar.

Perguntas Frequentes

O que exatamente o userExternalId governa?

Duas coisas. É a chave pela qual as transações de uma pessoa são agrupadas — o histórico dela na sua conta — e é o endereço do cadastro biométrico: as rotas de enrollment são literalmente /v1/users/{userExternalId}/enrollment. Mudar o valor muda os dois de uma vez.

Existe alguma restrição de formato?

Não. É texto livre e obrigatório na criação de qualquer transação ou sessão; a API não impõe padrão, tamanho ou conjunto de caracteres. Toda a disciplina é sua — o que é conveniente no primeiro dia e é exatamente por isso que vale decidir com cuidado.

O que acontece se eu mudar o valor de uma pessoa?

Nada é migrado. As transações antigas continuam apontando para o identificador antigo e as novas começam a apontar para o novo; a consulta pelo valor atual devolve um histórico que começa do zero. O cadastro biométrico, endereçado pelo identificador, também deixa de ser encontrado — e a próxima assinatura com comparação facial falha por falta de referência.

Posso usar o CPF como userExternalId?

Funciona, mas costuma ser a escolha errada. O CPF já é indexado separadamente pela plataforma como identificador da pessoa natural; usá-lo também aqui não acrescenta capacidade de busca e espalha um dado pessoal por mais um campo, que vai parar em log, em URL de rota de enrollment e no seu banco. Prefira o identificador interno que você já tem.

Então como a API sabe que duas pessoas são a mesma?

Por dois caminhos independentes e complementares: o userExternalId responde "quem é essa pessoa no seu sistema" e o CPF ou CNPJ responde "quem é essa pessoa perante o registro público". Os dois são obrigatórios, e é justamente por serem diferentes que ambos existem.

E se o mesmo indivíduo aparece em dois papéis?

Se o seu sistema o trata como dois cadastros — cliente e fornecedor, por exemplo — e você quer os históricos separados, use dois identificadores. Se quer o histórico unificado, use um. A decisão é sua e a API acompanha; o erro é oscilar entre as duas abordagens ao longo do tempo.

Qual é a recomendação prática?

Use a chave primária imutável do seu banco, com um prefixo que diga de que tabela ela veio — cliente-8812, matricula-4471, fornecedor-221. É estável por construção, legível numa investigação de suporte e não expõe dado pessoal. Evite e-mail, telefone, CPF e qualquer número que a área de negócio possa renumerar.

Escolha o identificador antes da primeira transação em produção

É um campo de texto livre com efeito de chave primária. Vale gastar dez minutos decidindo agora — teste as duas opções no sandbox gratuito e veja o histórico se agrupar.

Criar credenciais de homologação Fale com o time comercial