Referência da API
A referência da API de verificação de identidade.
Todos os endpoints que você pode chamar, todos os campos que você verá nas respostas e o que fazer com um webhook quando ele chegar. Para os tipos exatos dos campos, considere o documento OpenAPI ativo em /docs, na origem da sua própria API, como fonte de verdade — esta página é a versão em linguagem simples.
URL base e ambientes
Uma URL base. Dois ambientes.
Toda requisição vai para o mesmo host. O ambiente em que você está é definido inteiramente pela chave de API que você envia.
| URL base (esta documentação) | https://api.shieldid.ca — illustrative; your production API origin is published together with your API keys. |
|---|---|
| Cabeçalho de autenticação | X-Api-Key: <sua chave>, em toda requisição, exceto nos dois endpoints públicos indicados abaixo. |
| Prefixo da chave sandbox | vk_sand_… — as sessões criadas com esta chave são marcadas com environment: "sandbox" e nunca são cobradas. |
| Prefixo da chave de produção | vk_live_… — as mesmas requisições, cobradas conforme o seu plano. |
| Tipo de conteúdo | application/json em todo corpo de requisição e resposta. |
Endpoints
Toda a superfície da v1.
Seis endpoints JSON, mais uma página hospedada e uma verificação pública de credencial que não são JSON — você apenas cria um link para eles.
| Endpoint | Auth | What it does |
|---|---|---|
| POST /v1/sessions | X-Api-Key | Cria uma sessão de verificação. Exige return_url e webhook_url. Retorna session_id, verification_url e status: "PENDING". |
| GET /v1/sessions/{id} | X-Api-Key | Status e campos principais de uma sessão: status, confidence, environment. |
| GET /v1/sessions/{id}/result | X-Api-Key | O resultado completo quando uma sessão chega a VERIFIED ou FAILED: pessoa, veredictos por verificação, confidence, verified_until. |
| DELETE /v1/sessions/{id} | X-Api-Key | Cancela uma sessão que ainda está PENDING ou IN_PROGRESS. Uma sessão que já está em VERIFIED, FAILED ou EXPIRED não pode ser cancelada. |
| GET /v1/credentials/{token} | None — public | Verifica se uma credencial verificada é válida no momento. Não exige chave de API, então pode ser chamada de um navegador. Observação: hoje a resposta também inclui o nome da pessoa verificada e o tipo/país do documento, não apenas um indicador de válido/inválido — não compartilhe este link com um terceiro que você não quer que veja isso. |
| GET /v1/pricing/{country} | X-Api-Key | Preços por país para um código de país ISO 3166-1 de duas letras. |
| /v/{session_id} | A página de verificação hospedada — a verification_url que uma sessão retorna. No desktop, mostra um QR code; ao escaneá-lo, o celular do solicitante recebe o mesmo link para capturar o documento e a selfie. |
|---|---|
| /c/{session_id} | Uma página pública de verificação de credencial, sem autenticação, para uma sessão verificada. Observação: hoje a resposta também inclui o nome da pessoa verificada e o tipo/país do documento, não apenas um indicador de válido/inválido — não compartilhe este link com um terceiro que você não quer que veja isso. |
| /docs | A referência OpenAPI interativa e ativa para a origem da API da sua conta. |
Criando uma sessão
POST /v1/sessions, de ponta a ponta.
A requisição e exatamente o que ela retorna.
curl -X POST https://api.shieldid.ca/v1/sessions \
-H "X-Api-Key: vk_sand_your_key" \
-H "Content-Type: application/json" \
-d '{
"return_url": "https://yourapp.example/verified",
"webhook_url": "https://yourapp.example/hooks/shieldid",
"expected_name": "Jordan Smith",
"locale": "en",
"metadata": { "application_id": "app_9182" }
}'| return_url | string, obrigatório — Para onde o solicitante é redirecionado ao terminar. Deve ser http ou https. |
|---|---|
| webhook_url | string, obrigatório — Para onde o resultado assinado é entregue. Veja Webhooks abaixo. |
| expected_name | string, obrigatório — O nome que você espera no documento, usado para conferir o que o documento de identidade realmente diz. |
| expected_dob / expected_address | string, opcional — Conferido com o documento quando informado; não é obrigatório para executar uma verificação. |
| locale | string, opcional — "en" ou "fr". Define o idioma da página hospedada que o solicitante vê. |
| metadata | objeto, opcional — Seus próprios dados de referência — um id de solicitação, um id de tenant, qualquer coisa que você queira receber de volta sem alterações no resultado e no webhook. |
O resultado
GET /v1/sessions/{id}/result — formato da resposta.
O mesmo formato é entregue no payload do webhook, então você raramente precisa consultar este endpoint por polling.
| session_id | O id que você criou. |
|---|---|
| status | PENDING, IN_PROGRESS, VERIFIED, FAILED ou EXPIRED. |
| environment | "sandbox" ou "production", de acordo com a chave que criou a sessão. |
| person | Os campos lidos do documento: nome, data de nascimento, tipo de documento, país e jurisdição do documento, endereço. |
| checks | Um veredito por verificação — veja abaixo. Nunca uma única pontuação opaca. |
| confidence | Um único valor geral para a verificação. As verificações individuais, incluindo a correspondência facial, continuam sendo informadas separadamente em relação a um limite de decisão fixo — este campo não as substitui. |
| verified_until | Por quanto tempo o resultado é considerado atual, em uma sessão VERIFIED. |
| failure_reason | Definido em uma sessão FAILED — por exemplo FACE_MATCH_BELOW_THRESHOLD ou CANCELLED_BY_API. null nos demais casos. |
| metadata | O que você enviou ao criar a sessão, sem alterações. |
{
"session_id": "ses_9f2c1a",
"status": "VERIFIED",
"environment": "sandbox",
"person": {
"name": "Jordan Smith",
"dob": "1994-03-11",
"document_type": "drivers_licence",
"document_country": "CA",
"document_jurisdiction": "ON"
},
"checks": {
"document": "PASS",
"liveness": "PASS",
"antispoof": "PASS",
"face_match": "PASS"
},
"confidence": 88,
"verified_until": "2027-03-11T00:00:00Z",
"failure_reason": null,
"metadata": { "application_id": "app_9182" }
}Add-onchecks.document, checks.liveness, checks.antispoof e checks.face_match resultam cada um em PASS, FAIL ou SKIPPED. A triagem de listas de restrição (checks.sanctions — CLEAR, MATCH ou SKIPPED) é um complemento e só aparece para contas que o ativarem.
Ciclo de vida da sessão
Cinco estados, um caminho.
Uma sessão avança por conta própria; você não controla a máquina de estados, apenas a consulta.
| PENDING | Criada. Ninguém abriu a verification_url ainda. |
|---|---|
| IN_PROGRESS | O solicitante abriu o link e está em algum ponto do fluxo de captura. |
| VERIFIED | Todas as verificações foram executadas e o resultado está pronto. Estado final — chame o endpoint de resultado ou leia o webhook. |
| FAILED | Pelo menos uma verificação não passou. failure_reason informa qual. Em breve: uma nova tentativa que redefine a sessão para PENDING — até lá, trate FAILED como estado final e crie uma nova sessão se o solicitante quiser tentar novamente. |
| EXPIRED | Ninguém concluiu a tempo. As sessões expiram automaticamente após um prazo padrão (30 minutos); crie uma nova para tentar novamente. |
DELETE /v1/sessions/{id} cancela antecipadamente uma sessão PENDING ou IN_PROGRESS. Uma sessão que já chegou a VERIFIED, FAILED ou EXPIRED não pode ser cancelada — ela já foi concluída.
Erros
O que você deve prever.
Esta é a lista resumida que vale a pena tratar no código hoje. O conjunto completo e atualizado de códigos de erro e payloads está documentado no OpenAPI ativo em /docs.
| Status | Code | Meaning |
|---|---|---|
| 401 | UNAUTHORIZED | O cabeçalho X-Api-Key está ausente. |
| 401 | INVALID_KEY_FORMAT | A chave não começa com vk_sand_ ou vk_live_, ou não corresponde a nenhuma chave da conta. |
| 403 | FORBIDDEN | A chave é válida, mas não tem acesso à sessão ou ao recurso solicitado. |
| 404 | NOT_FOUND | Não existe nenhuma sessão, credencial ou recurso com esse id. |
| 409 | CONFLICT | A sessão não está em um estado que permita a ação — por exemplo, cancelar uma sessão que já está VERIFIED. |
| 422 | VALIDATION_ERROR | Um campo obrigatório está ausente ou malformado — por exemplo, return_url não é uma URL http ou https válida. |
Webhooks
Assinado, entregue, reenviado.
Quando uma sessão chega a VERIFIED ou FAILED, o ShieldID envia por POST o formato documentado acima para o seu webhook_url.
- Entregue como um POST com corpo JSON no formato do resultado acima.
- Assinado com HMAC-SHA256 sobre o corpo bruto da requisição, enviado em um cabeçalho X-Bio-Signature. Verifique-o com o segredo do seu webhook antes de confiar no payload.
- Reenviado até três vezes, com backoff linear, se o seu endpoint não responder com um status 2xx.
- Em breve: uma nova tentativa de sessão FAILED que entrega um segundo webhook quando for resolvida. Hoje, considere um webhook por sessão como regra.
- Os nomes dos campos aqui correspondem a esta referência. Se o que realmente chegar for diferente, confie no payload real em vez desta página e nos avise — a lista de campos acompanha a API, e não o contrário.
Verifique a assinatura
import crypto from "node:crypto";
function isValidShieldIdSignature(rawBody, signatureHeader, secret) {
const expected = crypto.createHmac("sha256", secret).update(rawBody).digest("hex");
const provided = signatureHeader || "";
const a = Buffer.from(expected, "hex");
const b = Buffer.from(provided, "hex");
return a.length === b.length && crypto.timingSafeEqual(a, b);
}
// rawBody must be the exact, unparsed request body
app.post("/hooks/shieldid", express.raw({ type: "application/json" }), (req, res) => {
const ok = isValidShieldIdSignature(req.body, req.headers["x-bio-signature"], process.env.SHIELDID_WEBHOOK_SECRET);
if (!ok) return res.status(401).send("invalid signature");
const result = JSON.parse(req.body);
// result.session_id, result.status, result.checks, …
res.status(200).send("ok");
});Idempotência e novas tentativas
Crie handlers que possam ser executados duas vezes com segurança.
Ainda não há uma chave de idempotência dedicada, nem na criação de sessões nem na entrega de webhooks.
- Uma entrega de webhook reenviada pode chegar mais de uma vez para a mesma sessão. Use session_id + status como chave no seu handler e torne idempotente a gravação do resultado.
- Não repita POST /v1/sessions às cegas após um timeout — verifique antes se a sessão foi criada, ou você pode acabar com duas sessões para um mesmo solicitante.
- Um cabeçalho Idempotency-Key dedicado para a criação de sessões está planejado.
Em breveSuporte a Idempotency-Key na criação de sessões
Fique por dentro
Esta referência muda. Acompanhe o changelog.
Novos campos, novos códigos de erro e mudanças em endpoints são anunciados lá antes de chegarem aqui.
Perguntas
Perguntas frequentes sobre a referência.
Próximo
Coloque esta referência em prática.
Siga o guia de início rápido para ir de uma chave sandbox a uma sessão verificada e a um webhook assinado, em ordem.