SmartCerts API v1

Documentação da API

REST + JSON. Tudo o que o painel faz para emitir e verificar, pelo seu sistema.

Base: https://smartcerts.co/api/v1 · Formato: JSON (UTF-8) · Datas: AAAA-MM-DD

Quickstart

  1. No painel, em API, crie uma chave (planos Profissional, Escala e o teste grátis).
  2. Crie uma emissão no painel ou pela API e anote o id.
  3. Emita:
curl -X POST https://smartcerts.co/api/v1/issuances/42/credentials \
  -H "Authorization: Bearer $SMARTCERTS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"recipient_name":"Ana Beatriz Souza","recipient_email":"ana@exemplo.com","external_id":"aluno-1287","send_email":true}'

A resposta traz o code e a url pública da credencial.

Autenticação

Envie a chave no cabeçalho Authorization: Bearer <chave>. A chave é da organização (não de uma pessoa) e aparece uma única vez ao ser criada. Revogue no painel as que não usar.

Emissões

Uma emissão é o curso, evento ou certificação: tipo, título, edição, carga horária, modelo, assinatura e e-mail de entrega.

MétodoCaminho
GET/issuancesLista (paginada: page, per_page até 100)
GET/issuances/{id}Uma emissão
POST/issuancesCria. Campos: title (obrigatório), type, template (classico, moderno, minimal), edition, hours, location, title_url, description, signer, signer_role, email_subject, email_body

Tipos: participation, completion, professional, training, workshop, event, recognition, other.

Emitir credenciais

POST /issuances/{id}/credentials

Campo
recipient_nameObrigatório
recipient_emailPara entrega por e-mail e busca
external_idO ID no seu sistema. Idempotência: repetir com o mesmo valor devolve a credencial existente (200) em vez de criar outra
titleTítulo do documento (padrão: pelo tipo, ex.: "Certificado de Conclusão")
extra_infoTexto adicional (nota, módulo, observação)
issued_on, expires_onDatas (padrão de emissão: hoje; sem validade)
send_emailtrue envia o e-mail de entrega na hora

Sem external_id, o mesmo e-mail na mesma emissão não gera uma segunda credencial. Resposta: 201 (criada) ou 200 (já existia), com o objeto credencial.

Em lote (até 500 por chamada): envie {"credentials": [ {...}, {...} ], "send_email": false}. A resposta separa created, existing e over_quota.

Consultar

MétodoCaminho
GET/credentialsFiltros: issuance_id, email, external_id; paginada
GET/credentials/{code}Uma credencial da sua organização

Revogar

POST /credentials/{code}/revoke com {"reason": "..."} (opcional). A página pública passa a mostrar "revogada" e o motivo.

Verificar (pública)

GET /verify/{code}, sem chave: devolve o que a página pública mostra (sem o e-mail do destinatário). Útil para quem recebe um certificado e quer conferir por sistema.

curl https://smartcerts.co/api/v1/verify/k7m2p9x4w3qa

Objeto credencial

{
  "code": "k7m2p9x4w3qa",
  "state": "valid",               // valid | expired | revoked
  "url": "https://smartcerts.co/certificate/k7m2p9x4w3qa",
  "pdf_url": "https://smartcerts.co/certificate/k7m2p9x4w3qa/pdf",
  "title": "Certificado de Conclusão",
  "recipient": { "name": "Ana Beatriz Souza", "email": "ana@exemplo.com" },
  "issuer": { "name": "Instituto Exemplo", "website": "https://..." },
  "issuance": { "id": 42, "type": "completion", "title": "Gestão de Projetos na Prática", "edition": "Turma de setembro", "hours": "40 horas" },
  "extra_info": null,
  "external_id": "aluno-1287",
  "issued_on": "2026-09-15",
  "expires_on": null,
  "revoked_at": null,
  "revocation_reason": null,
  "sent_at": "2026-09-15T14:02:11-03:00",
  "views": 3,
  "downloads": 1
}

Erros e limites

Erros vêm sempre como {"error": {"code": "...", "message": "...", "fields": {...}}}.

HTTPcode
401unauthorizedChave ausente ou inválida
402quota_exceededLimite do teste grátis atingido
403plan_requiredPlano sem API
404not_foundNão existe ou é de outra organização
422invalidCampos inválidos (detalhes em fields)
429Mais de 120 chamadas por minuto por chave (a verificação pública: 60 por minuto por IP)

Ainda não há webhooks nem sandbox. Para testar, use o teste grátis ou uma emissão de teste e revogue depois.