Documentação técnica
API REST & webhooks do RNTP
Integre seu site, ERP, Make/Zapier/n8n ou sistema interno com o Registro Nacional de Terapeutas e Psicanalistas. Esta documentação cobre os endpoints públicos da API /v1/* e o caminho para receber webhooks autenticados.
Para sistemas internos
ERP, CRM, sistema interno do parceiro. Use webhooks + API REST.
Para sites HTML
Página pública mostra selo + perfil. Widget iframe + selo SVG.
Para painel parceiro
Admin do parceiro consulta membros para validar. API REST.
Integração com sistema interno
Cenário: o parceiro tem um ERP/CRM/banco próprio e quer ter os membros RNTP refletidos lá automaticamente. Combine 3 ferramentas:
- Webhook outbound — cadastrar endpoint em
/admin/integrations/endpointsescolhendo os eventos (ex:member.approved,candidacy.approved,card.issued). Toda mudança chega no parceiro com HMAC. - Transformer de payload (opcional) — se o parceiro tem schema próprio, configure o template no endpoint. Ex:
{ "external_id": "{{$.payload.userId}}" }. - Backfill / replay — na primeira conexão, dispare
Sincronizar membros ativos. Cada membro existente vira ummember.snapshotentregue só pra esse endpoint, usando o mesmo template.
Site HTML — widget e selo verificável
Cenário: escola, clínica ou empresa com Chancela RNTP quer mostrar numa página pública que um profissional é certificado. Sem código.
Selo (SVG)
Cache 5 minutos no CDN. Atualiza automaticamente quando o status do membro muda.
<img
src="https://profissionais.rntp.com.br/api/v1/badges/member/RNTP1234567.svg"
alt="Profissional verificado RNTP"
width="320" height="100"
/>Widget completo (iframe)
Mostra foto, nome, registro e localidade. Embedável em qualquer site.
<iframe
src="https://profissionais.rntp.com.br/embed/member/RNTP1234567"
width="100%" height="200"
style="border: 0;"
loading="lazy"
></iframe>Verificação por código (carteirinha)
<iframe
src="https://profissionais.rntp.com.br/embed/verify/AB12CD34"
width="100%" height="220"
style="border: 0;"
></iframe>Painel parceiro — consulta via API
Cenário: parceiro tem um admin onde lista/valida membros (check-in de evento, qualificação pra escola). Use a API REST autenticada.
curl "https://profissionais.rntp.com.br/api/v1/members?state=SP&specialty=psicanalise&limit=50" \
-H "Authorization: Bearer rntp_<prefix>.<secret>"Crie a chave em /admin/api-keys com scope members.read. A API só retorna membros ativos que aceitaram exibição pública (LGPD).
Autenticação e chaves
Endpoints autenticados exigem uma chave gerada em /admin/api-keys. Formato:
rntp_<prefix>.<secret>Envie em um dos cabeçalhos abaixo:
Authorization: Bearer rntp_<prefix>.<secret>
# ou
X-RNTP-Api-Key: rntp_<prefix>.<secret>O secret é mostrado UMA vez na criação — guarde em cofre. Caso seja comprometido, rotacione pelo painel admin.
LGPD: Listagem e perfil individual de membros exigem scope members.read. Verificação de carteirinha é pública mas retorna apenas os campos necessários para atestar validade — sem foto, CPF, contato ou perfil profissional completo.
Verificar carteirinha
Público — não exige chave. Use para confirmar que um profissional está registrado e em dia.
curl https://profissionais.rntp.com.br/api/v1/cards/verify/AB12CD34Resposta (200):
{
"valid": true,
"status": "active",
"name": "Maria da Silva",
"registrationNumber": "RNTP1234567",
"issuedAt": "2024-05-01T13:00:00.000Z",
"expiresAt": "2026-05-01T13:00:00.000Z",
"revokedAt": null
}valid é true apenas para carteirinhas com status="active" dentro da validade. Estados possíveis: active, expired, revoked, not_found.
Consultar membros
Scope members.read. Retorna apenas membros com status=active que optaram por perfil público (is_public=true).
GET /v1/members/:rntpNumber
curl https://profissionais.rntp.com.br/api/v1/members/RNTP1234567 \
-H "Authorization: Bearer rntp_<prefix>.<secret>"GET /v1/members?state=SP&specialty=psicanalise
Filtros: state (UF), city, specialty (ilike). Paginação: limit (1–100, default 20), offset.
curl "https://profissionais.rntp.com.br/api/v1/members?state=SP&limit=20" \
-H "X-RNTP-Api-Key: rntp_<prefix>.<secret>"Publicações (blog)
Público — não exige chave. Retorna posts publicados com visibilidade pública.
curl "https://profissionais.rntp.com.br/api/v1/publications?category=noticias&limit=10"Regiões
Público — devolve a contagem de membros ativos (com perfil público) por UF. Útil para mapas/landings de parceiros.
curl https://profissionais.rntp.com.br/api/v1/regionsReceber webhooks do portal (outbound)
Crie um endpoint em /admin/integrations/endpoints e escolha os eventos que quer receber (member.registered, candidacy.approved, publication.published, etc.). Cada entrega traz o cabeçalho:
X-RNTP-Signature: v1,t=<timestampMs>,s=<hmacSha256 hex>
X-RNTP-Event: <tipo do evento>
X-RNTP-Delivery: <id único da entrega>Validação: HMAC_SHA256(secret, "v1." + timestampMs + "." + rawBody). Recomendamos tolerância de até 5 minutos entre o timestamp e o relógio do servidor. Tentativas falhas são repetidas com backoff (30s, 2min, 10min, 30min, 2h, 6h) até 6 tentativas.
Transformer opcional: cada endpoint pode mandar o envelope cru ou aplicar um template JSON com {{$.payload.email}} pra entregar no schema esperado pelo parceiro. Backfill: pra parceiros novos use Sincronizar membros — cada membro existente vira um member.snapshot entregue só nesse endpoint.
Enviar webhooks para o portal (inbound)
Cadastre uma integração em /admin/integrations/inbound. Cada integração recebe um slug único e um secret. URL pública:
POST https://profissionais.rntp.com.br/api/integrations/inbound/<slug>Autenticação à sua escolha:
- HMAC SHA-256 — mesmo esquema do outbound; envie
X-RNTP-Signature. - Bearer —
Authorization: Bearer <secret>. Mais simples para Make/Zapier.
Para generic_inbound você define regras de mapeamento que convertem o payload externo em eventos tipados do portal (members, candidacy, publications…). Use {{$.path.to.value}} em templates.
Códigos de erro
400 bad_request— parâmetro ausente ou malformado.401 api_key_malformed | unknown | mismatch | expired | revoked | disabled— autenticação falhou.403 scope_missing— chave válida, mas sem o scope exigido pelo endpoint.404 not_found— recurso não existe ou foi filtrado por visibilidade pública.422 payload_validation_failed— webhook inbound com mapping resultando em payload inválido para o DomainEvent.429 rate_limited— exceto Retry-After no cabeçalho.