Pular para conteúdo

Chaves de API com escopo e webhooks assinados

Novas integrações devem usar chaves de API nomeadas e com escopo. Cada chave pode ser revogada sem interromper outras integrações e recebe apenas as permissões de que precisa. Chaves secretas de API legadas da organização permanecem compatíveis durante a migração.

Criar uma chave de API com escopo

Um Administrador cria chaves a partir das configurações de desenvolvedor da organização. O token completo é exibido apenas uma vez. Tokens de produção começam com exm_live.; tokens do ambiente de testes de desenvolvedor começam com exm_test.. Armazene cada token em um gerenciador de segredos no servidor.

Escopo Permite
examinees:read Ler registros de candidatos por meio dos endpoints existentes
examinees:write Criar, atualizar e fazer upsert em lote de candidatos
exams:read Ler definições de exames
exams:write Enviar, configurar, etiquetar e excluir exames
groups:read Ler grupos e seus membros
groups:write Criar grupos e alterar membros
assignments:read Ler atribuições de exames
assignments:write Criar, alterar e excluir atribuições não iniciadas
results:read Ler resultados concluídos e resumos em papel
sessions:write Criar URLs de inicialização de exame de uso único
webhooks:read Listar endpoints e histórico de entregas
webhooks:write Criar endpoints, desativar endpoints e tentar entregas novamente

Autentique-se usando o esquema Bearer:

curl --request GET \
  --header "Authorization: Bearer $EXAMINA_API_KEY" \
  --header "Accept: application/json" \
  "https://www.examina.io/api/v1/results?page=1&pageSize=25"

Não coloque chaves de API em código do navegador, aplicativos para celular, capturas de tela, controle de versão ou logs de suporte.

As chaves de API são vinculadas ao ambiente. Uma chave exm_live. funciona apenas na API de produção. Uma chave exm_test. funciona apenas em https://sandbox.examina.io/api/v1. A autenticação básica legada é aceita apenas pela API de produção.

Torne as mutações idempotentes

Endpoints de criação e atualização exigem o cabeçalho Idempotency-Key. Gere um valor exclusivo para a operação lógica e reutilize-o apenas ao tentar novamente essa mesma requisição:

curl --request POST \
  --header "Authorization: Bearer $EXAMINA_API_KEY" \
  --header "Content-Type: application/json" \
  --header "Idempotency-Key: candidate-import-2026-08-23-0001" \
  --data '{"code":"CANDIDATE-42","passcode":"temporary-secret","firstName":"Ada","lastName":"Okafor"}' \
  "https://www.examina.io/api/v1/examinees"

A chave é mantida por pelo menos 24 horas. Repeti-la com um corpo idêntico retorna o recurso original. Reutilizá-la com dados diferentes retorna HTTP 409.

Configurar um webhook assinado

Crie um endpoint inscrito em result.completed:

curl --request POST \
  --header "Authorization: Bearer $EXAMINA_API_KEY" \
  --header "Content-Type: application/json" \
  --header "Idempotency-Key: webhook-results-v1" \
  --data '{"url":"https://integrator.example/webhooks/examina","events":["result.completed"]}' \
  "https://www.examina.io/api/v1/webhook-endpoints"

A resposta inclui um signingSecret que começa com whsec_. Ele é exibido apenas uma vez. As URLs de webhook devem usar HTTPS público e não devem ser resolvidas para um endereço privado, de loopback, link-local ou multicast.

Cada entrega contém um evento JSON. A requisição também inclui:

O envelope do evento inclui livemode e environment. Entregas do ambiente de testes usam "livemode": false e "environment": "test"; entregas de produção usam true e "live". Rejeite um ambiente inesperado antes de processar os dados.

Cabeçalho Significado
X-Examina-Event-Id Identificador estável de evento para desduplicação
X-Examina-Timestamp Timestamp Unix usado na assinatura
X-Examina-Signature v1= seguido pela assinatura hexadecimal HMAC-SHA256

Concatene o timestamp, um ponto e o corpo bruto exato da requisição. Calcule o HMAC-SHA256 com o segredo de assinatura e compare-o com a assinatura v1 usando uma comparação de tempo constante:

signed_content = timestamp + "." + raw_request_body
expected = hex(HMAC_SHA256(signing_secret, signed_content))

Retorne uma resposta 2xx rapidamente e coloque em fila o processamento mais longo. Use o ID do evento para desduplicar o processamento e, em seguida, recupere o resultado definitivo de GET /results/{assignmentId}.

Inspecionar e tentar entregas novamente

curl --header "Authorization: Bearer $EXAMINA_API_KEY" \
  "https://www.examina.io/api/v1/webhook-endpoints/deliveries?page=1&pageSize=25"

curl --request POST \
  --header "Authorization: Bearer $EXAMINA_API_KEY" \
  "https://www.examina.io/api/v1/webhook-endpoints/deliveries/DELIVERY_ID/retry"

O callback de formulário em nível de organização antigo permanece disponível para integrações existentes, mas está obsoleto. Novas integrações devem usar recursos de endpoint assinados porque eles fornecem IDs de eventos, assinaturas, estado de entrega e retransmissão.

Rotacionar ou revogar credenciais

Crie uma chave de substituição, implante-a em cada consumidor, verifique as chamadas bem-sucedidas e, em seguida, revogue a chave anterior. Como as chaves são independentes, a rotação não exige uma transição simultânea. Revogue uma chave imediatamente se ela puder ter sido exposta.