Documentação da API

Versão 1 · Base: https://api.suacnd.com/v1

Autenticação

Gere uma chave no painel e envie em todas as chamadas:

Authorization: Bearer scnd_live_...

1. Solicitar uma certidão

curl -X POST https://api.suacnd.com/v1/emissoes \
  -H "Authorization: Bearer $CHAVE" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: pedido-123" \
  -d '{"portal":"fgts-caixa","documento":"12.345.678/0001-95","referencia_externa":"cliente-42"}'

Resposta 202: a emissão entra na fila e o valor do portal é debitado do saldo.

{ "id": "8f1c…", "portal": "fgts-caixa", "status": "na_fila", ... }

Idempotency-Key (opcional) evita cobrar duas vezes se você repetir o pedido. webhook_url (opcional) substitui o webhook da conta só para esse pedido.

2. Acompanhar

curl https://api.suacnd.com/v1/emissoes/{id} -H "Authorization: Bearer $CHAVE"
statussignificado
na_filaaguardando um robô
processandoo robô está no portal
emitidacertidão negativa (ou positiva com efeito de negativa) em certidao.pdf_url
pendenciao portal não emitiu (débito, irregularidade); motivo e print em pendencia
errofalha técnica (portal fora do ar etc.) após as novas tentativas; valor estornado

Os links de PDF valem 15 minutos. Para um link novo, consulte a emissão de novo ou use GET /v1/emissoes/{id}/pdf.

3. Webhook

Quando a emissão termina enviamos um POST com o mesmo corpo de GET /v1/emissoes/{id} e o cabeçalho:

X-SuaCND-Assinatura: t=1760112000,v1=<hmac_sha256_hex>

Para validar: calcule HMAC-SHA256(segredo_do_webhook, t + "." + corpo_bruto) e compare com v1. O segredo está no painel. Responda 2xx; caso contrário tentamos de novo por até 24 horas.

Outras rotas

GET /v1/portaisportais disponíveis e preços (sem autenticação)
GET /v1/emissoes?status=&limite=&antes=lista paginada (use proxima_pagina em antes)
GET /v1/emissoes/{id}/pdfredireciona para o PDF
GET /v1/contasaldo e dados da conta

Portais

portalcertidãopreço
fgts-caixaCRF – Certificado de Regularidade do FGTSR$ 1,00
linhares-esCND Municipal – Linhares/ESR$ 1,00

Erros

{ "erro": { "codigo": "saldo_insuficiente", "mensagem": "..." } }

401 chave inválida · 402 saldo insuficiente · 403 e-mail não confirmado ou conta bloqueada · 404 não encontrada · 422 dados inválidos · 429 muitas requisições (limite: 120/min por chave)