Ir para o conteúdo principal
ShieldID

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.

Todas as requisições desta referência pressupõem estas duas condições.
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çãoX-Api-Key: <sua chave>, em toda requisição, exceto nos dois endpoints públicos indicados abaixo.
Prefixo da chave sandboxvk_sand_… — as sessões criadas com esta chave são marcadas com environment: "sandbox" e nunca são cobradas.
Prefixo da chave de produçãovk_live_… — as mesmas requisições, cobradas conforme o seu plano.
Tipo de conteúdoapplication/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.

Endpoints JSON em /v1.
EndpointAuthWhat it does
POST /v1/sessionsX-Api-KeyCria 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-KeyStatus e campos principais de uma sessão: status, confidence, environment.
GET /v1/sessions/{id}/resultX-Api-KeyO 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-KeyCancela 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 — publicVerifica 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-KeyPreços por país para um código de país ISO 3166-1 de duas letras.
Páginas para as quais você cria links, não JSON que você processa.
/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.
/docsA 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.

bash
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" }
  }'

POST /v1/sessions — campos da requisição.
return_urlstring, obrigatório — Para onde o solicitante é redirecionado ao terminar. Deve ser http ou https.
webhook_urlstring, obrigatório — Para onde o resultado assinado é entregue. Veja Webhooks abaixo.
expected_namestring, obrigatório — O nome que você espera no documento, usado para conferir o que o documento de identidade realmente diz.
expected_dob / expected_addressstring, opcional — Conferido com o documento quando informado; não é obrigatório para executar uma verificação.
localestring, opcional — "en" ou "fr". Define o idioma da página hospedada que o solicitante vê.
metadataobjeto, 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.

Campos de nível superior.
session_idO id que você criou.
statusPENDING, IN_PROGRESS, VERIFIED, FAILED ou EXPIRED.
environment"sandbox" ou "production", de acordo com a chave que criou a sessão.
personOs campos lidos do documento: nome, data de nascimento, tipo de documento, país e jurisdição do documento, endereço.
checksUm veredito por verificação — veja abaixo. Nunca uma única pontuação opaca.
confidenceUm ú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_untilPor quanto tempo o resultado é considerado atual, em uma sessão VERIFIED.
failure_reasonDefinido em uma sessão FAILED — por exemplo FACE_MATCH_BELOW_THRESHOLD ou CANCELLED_BY_API. null nos demais casos.
metadataO que você enviou ao criar a sessão, sem alterações.
json
{
  "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.

Valores de status, em ordem.
PENDINGCriada. Ninguém abriu a verification_url ainda.
IN_PROGRESSO solicitante abriu o link e está em algum ponto do fluxo de captura.
VERIFIEDTodas as verificações foram executadas e o resultado está pronto. Estado final — chame o endpoint de resultado ou leia o webhook.
FAILEDPelo 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.
EXPIREDNingué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 HTTP, código de erro e o que significa.
StatusCodeMeaning
401UNAUTHORIZEDO cabeçalho X-Api-Key está ausente.
401INVALID_KEY_FORMATA chave não começa com vk_sand_ ou vk_live_, ou não corresponde a nenhuma chave da conta.
403FORBIDDENA chave é válida, mas não tem acesso à sessão ou ao recurso solicitado.
404NOT_FOUNDNão existe nenhuma sessão, credencial ou recurso com esse id.
409CONFLICTA sessão não está em um estado que permita a ação — por exemplo, cancelar uma sessão que já está VERIFIED.
422VALIDATION_ERRORUm 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

javascript
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.