Verificar a identidade de um usuário no mundo real é uma daquelas tarefas que parecem simples no papel, mas se transformam em um projeto de meses no momento em que você começa a construí-lo. Você precisa de captura de documentos, OCR, reconhecimento facial, detecção de vida (liveness detection), sinais de fraude e cobertura para dezenas de tipos de documentos de identidade em diversos países. A API Stripe Identity empacota tudo isso em uma única integração, para que você possa implementar um fluxo de verificação de identidade pronto para produção em uma tarde, em vez de um trimestre.
Este guia descreve cada etapa que um desenvolvedor precisa para implementar o Stripe Identity: ativá-lo no painel, criar uma VerificationSession, escolher entre o redirecionamento hospedado e o componente Stripe.js incorporado, lidar com webhooks e ler as saídas verificadas. Você verá exemplos em curl e Node, padrões de tratamento de erros e como testar todo o fluxo localmente com Apidog. Se você estiver avaliando alternativas primeiro, dê uma olhada em nosso resumo das melhores APIs KYC antes de se comprometer.
O Stripe Identity é uma solução natural para equipes que já usam o Stripe para pagamentos, mas também funciona como um produto autônomo. A documentação oficial do Stripe Identity cobre a superfície do produto, e esta publicação preenche as lacunas da experiência do desenvolvedor: o que acontece na rede, quais campos importam e onde estão os pontos de atenção comuns.
Em resumo
- O Stripe Identity verifica usuários com um documento de identidade governamental e uma verificação de vida (liveness check) por selfie; o preço começa em US$ 1,50 por verificação nos EUA.
- O primitivo central é o objeto
VerificationSession; você cria um no lado do servidor e, em seguida, redireciona o usuário ou monta o componente Stripe.js. - Solicite os campos de que precisa através de
options.document.require_matching_selfie,require_id_numbereallowed_types. - Ouça os webhooks
identity.verification_session.verifiedeidentity.verification_session.requires_inputpara gerenciar o estado do seu aplicativo. - As saídas verificadas (nome, data de nascimento, endereço, número do documento de identidade) são expostas apenas quando você define
verified_outputsna criação da sessão. - O Stripe Identity cobre mais de 35 países com suporte a documentos localizados.
O que é a API Stripe Identity?
O Stripe Identity é um produto de verificação de identidade construído sobre a superfície da API principal do Stripe. Ele oferece uma única família de endpoints (/v1/identity/verification_sessions) que orquestra a captura de documentos, extração de dados, reconhecimento facial e pontuação de fraude. A saída é um registro assinado e estruturado em que você pode confiar: um nome completo verificado, data de nascimento, endereço e número de documento de identidade opcional, emparelhado com as imagens originais do documento armazenadas no cofre do Stripe.
Por debaixo dos panos, o Stripe usa o mesmo padrão de sessão mais webhook que você já conhece do Checkout e Payment Intents. Você cria uma sessão no lado do servidor, o Stripe lida com a interface de captura voltada para o usuário, e você é notificado quando o resultado está pronto. Se você já construiu um fluxo de Checkout antes, o Identity parecerá familiar em minutos.
Autenticação e configuração
Antes de chamar a API, ative o Stripe Identity no painel. Vá para Painel > Configurações > Identidade, aceite os termos e preencha os detalhes da empresa que o Stripe precisa para conformidade com KYC de sua parte. A alternância ativa o Identity para o modo de teste e modo ativo em sua conta.
A autenticação usa sua chave secreta padrão do Stripe. As chaves de teste começam com sk_test_ e as chaves ativas começam com sk_live_. O Stripe Identity não requer uma credencial separada, o que mantém a superfície de integração pequena.
Instale o SDK do Node:
npm install stripe
Em seguida, inicialize um cliente. Fixe a versão da API para que o Stripe nunca o surpreenda com uma mudança de esquema:
import Stripe from "stripe";
const stripe = new Stripe(process.env.STRIPE_SECRET_KEY, {
apiVersion: "2024-06-20",
});
Agora você pode chamar todos os endpoints em stripe.identity.verificationSessions.
Endpoints principais
Criando uma VerificationSession
A VerificationSession é o único objeto que você cria por tentativa de verificação do usuário. Ela controla quais tipos de documentos são aceitos, se uma selfie é necessária e quais campos são retornados ao seu backend.
Com curl:
curl https://api.stripe.com/v1/identity/verification_sessions \
-u "$STRIPE_SECRET_KEY:" \
-d "type=document" \
-d "options[document][require_matching_selfie]=true" \
-d "options[document][require_id_number]=true" \
-d "options[document][allowed_types][]=driving_license" \
-d "options[document][allowed_types][]=passport" \
-d "verified_outputs[]=first_name" \
-d "verified_outputs[]=last_name" \
-d "verified_outputs[]=dob" \
-d "verified_outputs[]=address" \
-d "verified_outputs[]=id_number" \
-d "metadata[user_id]=usr_7f3k2"
Com o SDK do Node:
const session = await stripe.identity.verificationSessions.create({
type: "document",
options: {
document: {
require_matching_selfie: true,
require_id_number: true,
allowed_types: ["driving_license", "passport", "id_card"],
},
},
verified_outputs: [
"first_name",
"last_name",
"dob",
"address",
"id_number",
],
metadata: { user_id: "usr_7f3k2" },
});
// Send one of these to the client:
// session.url -> hosted redirect
// session.client_secret -> Stripe.js embedded component
Alguns campos merecem atenção. type: "document" informa ao Stripe para executar uma verificação de documento; a alternativa, id_number, realiza uma consulta de estilo SSN (somente nos EUA) sem coletar um documento de identidade. allowed_types restringe quais categorias de documentos o usuário pode carregar, o que é importante para programas de conformidade que aceitam apenas documentos de identidade com foto emitidos pelo governo. verified_outputs é a lista de permissões dos campos que você deseja que sejam retornados; o Stripe não exporá nenhum dado que você não tenha solicitado, o que mantém sua postura de minimização de dados limpa.
Redirecionamento de verificação hospedado vs. Stripe.js incorporado
O Stripe oferece duas formas de integração. O redirecionamento hospedado é o caminho mais rápido: envie o usuário para session.url, o Stripe lida com toda a experiência de captura em um domínio stripe.com, e o usuário retorna para sua return_url. Você escreve aproximadamente dez linhas de código.
O fluxo incorporado usa Stripe.js e o pacote `@stripe/stripe-js` para montar um modal de verificação dentro do seu próprio aplicativo. Você passa session.client_secret para o frontend e chama stripe.verifyIdentity(clientSecret). Isso mantém os usuários em seu produto e lhe dá controle de design sobre a página circundante. Escolha-o quando a verificação ocorre no meio do fluxo em uma etapa de inscrição ou KYC; escolha o redirecionamento quando a verificação é uma tarefa discreta.
Webhooks
Nunca dependa do redirecionamento do cliente para informar que uma verificação foi bem-sucedida; sempre confirme no backend via webhooks. Registre um endpoint em Painel > Desenvolvedores > Webhooks e assine:
identity.verification_session.verifiedé acionado quando todas as verificações são aprovadas e os dados verificados estão prontos.identity.verification_session.requires_inputé acionado quando o usuário falha em uma verificação ou carrega um documento ilegível. Você pode redirecioná-los de volta para tentar novamente.identity.verification_session.processingé acionado enquanto o Stripe executa verificações assíncronas; útil para exibir estados de carregamento (spinners).identity.verification_session.canceledé acionado se você cancelar a sessão programaticamente.
app.post("/webhooks/stripe", express.raw({ type: "application/json" }), async (req, res) => {
const event = stripe.webhooks.constructEvent(
req.body,
req.headers["stripe-signature"],
process.env.STRIPE_WEBHOOK_SECRET
);
if (event.type === "identity.verification_session.verified") {
const session = event.data.object;
await markUserVerified(session.metadata.user_id, session.id);
}
if (event.type === "identity.verification_session.requires_input") {
await notifyUserToRetry(event.data.object.metadata.user_id);
}
res.json({ received: true });
});
Recuperando saídas verificadas
O payload do webhook informa que a sessão foi verificada, mas não inclui os campos sensíveis. Para ler as saídas verificadas, chame verificationSessions.retrieve com expand: ["verified_outputs"]:
const session = await stripe.identity.verificationSessions.retrieve(
"vs_1N...",
{ expand: ["verified_outputs"] }
);
const { first_name, last_name, dob, address, id_number } = session.verified_outputs;
O Stripe retorna o id_number apenas uma vez; armazene-o criptografado do seu lado imediatamente. As próprias imagens dos documentos permanecem no cofre do Stripe e são acessíveis através do painel para auditoria.
Erros comuns e limites de taxa
A falha mais frequente é verification_session.requires_input com um código como document_unverified_other ou selfie_face_mismatch. Lide com isso exibindo uma interface de usuário amigável para tentar novamente; a mesma sessão pode ser reutilizada chamando verificationSessions.cancel e criando uma nova, ou redirecionando para a mesma session.url enquanto ela ainda estiver aberta.
O Stripe aplica limites de taxa de API padrão de 100 requisições por segundo no modo ativo e 25 por segundo no modo de teste. Os endpoints `/identity/verification_sessions` se enquadram na mesma categoria que o restante da API. Se você atingir os limites, verá um HTTP 429 com um cabeçalho `Retry-After`; use o recuo exponencial e respeite o cabeçalho.
Outros erros a serem observados: unsupported_document_type quando o usuário carrega um documento de identidade fora da sua lista de allowed_types, e country_not_supported quando alguém tenta um documento de um dos países que o Stripe Identity ainda não cobre.
Preços do Stripe Identity
O Stripe Identity custa US$ 1,50 por verificação nos Estados Unidos. Os preços internacionais variam; a maioria dos países europeus fica em torno de US$ 1,50 a US$ 2,00, e o Stripe publica o detalhamento completo por país em sua página de preços. Uma tentativa de verificação que termina em requires_input não conta como um evento faturável; apenas as sessões verified concluídas são cobradas.
Para clientes com grande volume, o Stripe oferece preços personalizados que podem reduzir significativamente a taxa por verificação. Se você estiver processando mais de 10.000 verificações por mês, converse com a equipe de vendas.
Testando o Stripe Identity com Apidog
Ambientes de teste de API superam a criação manual de comandos curl em todos os momentos, especialmente ao iterar sobre payloads de webhook. O Apidog importa diretamente a especificação OpenAPI do Stripe, então cada campo no objeto VerificationSession aparece com documentação inline. Você pode disparar requisições reais para o ambiente de teste do Stripe, inspecionar a resposta e reproduzi-la quantas vezes precisar.
O lado do teste de webhook é onde o Apidog economiza mais tempo. Você pode simular eventos identity.verification_session.verified localmente, dispará-los para o seu servidor de desenvolvimento e depurar seu manipulador sem a necessidade de uma verificação real ser concluída. Se você estiver comparando fluxos de trabalho, nosso guia sobre teste de API sem Postman em 2026 oferece uma análise mais aprofundada. Baixe o Apidog para obter o cliente de desktop.
Perguntas Frequentes
- Qual é a diferença entre Stripe Identity e o KYC regular do Stripe? O KYC integrado do Stripe verifica proprietários de empresas para contas Connect e de Pagamentos. O Stripe Identity é uma API autônoma para verificar seus usuários finais; os dois sistemas não compartilham resultados de verificação.
- Posso reutilizar uma identidade verificada em várias sessões? Sim. Uma vez que uma sessão é verificada, os
verified_outputssão permanentes nesse objeto de sessão. Se você precisar verificar novamente para um novo evento, crie uma nova sessão e a vincule ao registro do usuário do seu lado. - O Stripe Identity funciona fora dos pagamentos? Absolutamente. Muitos clientes o usam puramente como uma camada KYC e nunca utilizam a superfície de pagamentos do Stripe. Se você precisar de uma triagem de sanções mais ampla além da verificação de identidade, combine-o com uma API de triagem AML dedicada.
- Como o Stripe Identity se compara ao Plaid Identity Verification? O Stripe se concentra em documento mais selfie; o Plaid se apoia em dados de identidade verificados por bancos. Veja nosso guia da API Plaid para a outra abordagem.
- A detecção de vida (liveness) por selfie é obrigatória? Não. Defina
options.document.require_matching_selfiecomofalsese você precisar apenas de uma verificação de documento. A maioria das equipes de fraude a mantém ativada, pois a detecção passiva de vida captura muitos ataques de baixo esforço. - Quais países o Stripe Identity cobre? Mais de 35 países na América do Norte, Europa e partes da Ásia-Pacífico, com analisadores de documentos localizados para cada um. O Stripe publica a lista de países atualizada em sua documentação e adiciona novos mercados regularmente.
