API Receivia

REST + JSON. HMAC-SHA256 para autenticação. Webhooks para entrega assíncrona.

📘 Guia operacional de homologação SNCR/Anvisa: Gov.br, sandbox, virada de chave.Abrir guia →

Autenticação

Toda chamada exige três headers:

  • X-Api-Key: chave criada em Integrações.
  • X-Timestamp: epoch em segundos (tolerância ±5min).
  • X-Signature: hex(HMAC-SHA256(secret, timestamp + "." + body))

Base URL: https://app.receivia.com.br/api/public/v1

POST /prescriptions — criar receita

Envia uma receita para análise. Retorna ID e estado pending; o resultado chega via webhook prescription.analyzed.

Payload
{
  "file_base64": "<base64 do PDF ou imagem>",
  "file_name": "receita-12345.pdf",
  "file_type": "pdf",
  "buyer_name": "José da Silva",
  "buyer_cpf": "12345678900",
  "metadata": { "erp_id": "12345" }
}
cURL
curl -X POST https://app.receivia.com.br/api/public/v1/prescriptions \
  -H "X-Api-Key: rcv_pk_xxx" \
  -H "X-Timestamp: $(date +%s)" \
  -H "X-Signature: <hmac-sha256-hex>" \
  -H "X-Format: canonical" \
  -H "Content-Type: application/json" \
  -d '{   "file_base64": "<base64 do PDF ou imagem>",   "file_name": "receita-12345.pdf",   "file_type": "pdf",   "buyer_name": "José da Silva",   "buyer_cpf": "12345678900",   "metadata": { "erp_id": "12345" } }'

Resposta 202 Accepted

{
  "id": "uuid",
  "status": "pending",
  "created_at": "2026-06-05T14:30:00Z"
}

GET /prescriptions/:id — consultar

curl https://app.receivia.com.br/api/public/v1/prescriptions/<id> \
  -H "X-Api-Key: rcv_pk_xxx" \
  -H "X-Timestamp: $(date +%s)" \
  -H "X-Signature: <hmac>"

Resposta 200

{
  "id": "uuid",
  "status": "approved",
  "patient_name": "Maria",
  "analysis": {
    "compliance_score": 94,
    "has_controlled": true,
    "medications": [{ "nome": "Clonazepam 2mg", "classe": "B1" }]
  },
  "sncr": { "submission_id": "uuid", "status": "accepted", "protocol": "SP-2025-08742" }
}

Webhooks

Eventos disponíveis:

  • prescription.analyzed
  • prescription.approved
  • prescription.rejected
  • sncr.submitted
  • sncr.accepted
  • sncr.rejected
  • sngpc.generated

Header enviado: X-Lovable-Signature: t=<ts>,v1=<hex(hmac-sha256(secret, ts + "." + body))>

Verificação em Node.js

import { createHmac, timingSafeEqual } from "node:crypto";

export function verify(rawBody, header, secret) {
  const [tPart, vPart] = header.split(",");
  const t = tPart.split("=")[1];
  const v = vPart.split("=")[1];
  const expected = createHmac("sha256", secret).update(t + "." + rawBody).digest("hex");
  const a = Buffer.from(v); const b = Buffer.from(expected);
  return a.length === b.length && timingSafeEqual(a, b);
}

Códigos de erro

HTTPCódigoSignificado
401invalid_signatureHMAC inválido ou timestamp fora da janela
403key_revokedAPI key revogada ou suspensa
422invalid_payloadSchema inválido — ver campo errors
429rate_limitedLimite por chave excedido
500internal_errorErro interno — reportar com request_id

Postman

Coleção pronta para importar: receivia-api.postman.json