Integrando com o Prescreve
Como conectar um sistema externo (HIS, prontuário próprio, plataforma de saúde) ao Softmente Prescreve usando uma API Key — autenticação, convenções, limitações reais e um fluxo de exemplo ponta a ponta.
Visão geral
A API do Prescreve permite que um sistema externo crie e consulte pacientes, receitas e documentos em nome de uma clínica ou médico — sem passar pela interface web.
Esse acesso é pensado pra sistemas de terceiros: HIS, prontuário eletrônico próprio, ou qualquer plataforma de saúde que já tenha os dados do paciente e queira emitir receitas eletrônicas com validade jurídica através do Prescreve, sem exigir que o usuário final abra o Prescreve separadamente.
Este documento cobre autenticação, convenções e — igualmente importante — o que a API não faz hoje, pra você planejar a integração com expectativas corretas. Para a forma exata de cada campo (tipos, obrigatoriedade, enums), use o Swagger em /docs, gerado a partir do código real da API.
Como obter acesso
O acesso via API não é self-service — é provisionado pela equipe Softmente.
- ContatoNo cadastro do Prescreve (
/register), a opção "Quer integrar o Prescreve ao seu sistema via API?" abre um formulário que chega direto pro time comercial. - Conta de IntegraçãoA equipe Softmente cria uma conta do tipo Integração, associada ao plano correspondente.
- Geração da chaveUm admin da plataforma gera a API Key pelo painel administrativo e a compartilha com você por um canal seguro combinado.
A chave completa fica visível pra qualquer admin da plataforma sempre que a lista de integrações é aberta — não é exibida uma única vez como costuma ser padrão em outras APIs. Trate a chave como segredo do seu lado (variável de ambiente, secret manager) e peça revogação + reemissão se ela vazar; não há hoje uma tela de "rotação" self-service.
Autenticação
Toda requisição autenticada leva a chave no cabeçalho X-API-Key — não é Authorization: Bearer.
GET /v1/patients HTTP/1.1
Host: api.prescreve.app
X-API-Key: rcp_a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4
O formato da chave é rcp_ seguido de 32 caracteres hexadecimais. Uma chave inválida ou revogada retorna 401; uma conta suspensa (trial expirado, pagamento em atraso) retorna 403 com code: "ACCOUNT_SUSPENDED" — vale tratar esse código especificamente no seu lado, já que ele indica um problema de conta, não de requisição.
URL base
Todas as rotas ficam sob o prefixo /v1. Combine o domínio exato com o time Softmente no momento do provisionamento.
Modelo de segurança
Uma API Key equivale ao login completo da clínica — não existe escopo reduzido.
A chave não tem permissões parciais. Ela dá acesso de leitura e escrita a todos os pacientes, receitas e documentos daquela conta — o mesmo nível de acesso que o administrador da clínica tem ao fazer login pela tela normal. Não há como emitir uma chave "somente leitura" ou restrita a um recurso específico hoje. Projete sua integração levando isso em conta (ex: não incorpore a chave em código que roda no navegador do usuário final).
Isso também significa que uma chave nunca representa um médico ou assistente específico — todas as ações feitas com ela aparecem como sendo da clínica/conta como um todo, não de uma pessoa. Se seu sistema precisa saber "quem fez o quê" de forma auditável por usuário individual, isso precisa ser controlado no seu lado, não no Prescreve.
Convenções da API
Formato de resposta, paginação e erros são consistentes em toda a API.
Respostas de sucesso
{ "success": true, "data": { "id": "...", "name": "..." } }
Listas paginadas
Paginação é opcional — omita page/limit pra receber a lista inteira. Informando os dois, a resposta ganha um bloco meta:
GET /v1/patients?page=1&limit=20
{
"success": true,
"data": [ ... ],
"meta": { "total": 143, "page": 1, "limit": 20, "totalPages": 8 }
}
limit é sempre limitado a 100, mesmo se um valor maior for enviado.
Erros
{ "error": "Paciente não encontrado." }
| Status | Significado |
|---|---|
400 | Validação ou regra de negócio (campo obrigatório, formato inválido). |
401 | Chave ausente, inválida ou revogada. |
403 | Acesso negado — inclui conta suspensa (code: "ACCOUNT_SUSPENDED"). |
404 | Recurso não encontrado (ou não pertence à sua conta). |
429 | Limite de requisições atingido. |
500 | Erro interno — se persistir, contate o suporte com o horário exato. |
Fora ACCOUNT_SUSPENDED, praticamente nenhum erro tem um code estruturado — a distinção é só pela mensagem em error, que é em português e pode mudar de texto. Não faça parsing de string da mensagem em produção; trate por status HTTP.
Limite de requisições
200 requisições por minuto, por IP — o mesmo limite vale para tráfego de API Key e de login normal.
Não há um limite maior liberado especificamente pra chaves de integração hoje. Se sua integração faz sincronização em lote (ex: importar um histórico grande de pacientes), espace as chamadas ou entre em contato pra combinar uma janela de importação. Ao exceder o limite, a resposta é 429 com uma mensagem indicando pra tentar novamente em breve — não há cabeçalho Retry-After hoje, então um backoff exponencial simples do seu lado é a abordagem mais segura.
Recursos disponíveis
A API Key funciona na maior parte dos recursos clínicos — mas não em tudo.
Acessível com API Key
Só com login interativo (JWT) — não aceita API Key
Essas áreas são login-only por natureza — o portal do paciente e o de farmácia são experiências de outra pessoa (paciente/farmacêutico) logando com a própria conta, e cobrança/configurações da conta são ações que fazem mais sentido vindas de um humano autenticado interativamente do que de uma integração automatizada.
Público, sem autenticação
Verificação de documentos (/v1/verify/*) e o formulário de contato são públicos por design — não precisam de chave nenhuma.
Assinatura digital — a limitação mais importante
A API Key cria e gerencia documentos, mas não consegue assiná-los.
Assinar um documento (receita, atestado, laudo, relatório, pedido de exame, encaminhamento) exige um certificado ICP-Brasil vinculado ao médico, obtido por um fluxo OAuth interativo no navegador (o médico autentica com o provedor do certificado — VIDaaS, BirdID, SafeID). Esse vínculo é por sessão e não pode ser obtido nem renovado via API Key.
Na prática, isso divide o fluxo em duas partes:
- Sua integração cria o rascunhoVia API Key: paciente, receita/documento com os medicamentos ou conteúdo, tudo como rascunho — sem validade jurídica ainda.
- O médico assina no PrescreveO médico precisa logar normalmente (navegador) e assinar o rascunho pelo painel — seja abrindo o Prescreve diretamente, seja através de um link que sua integração gere apontando pra tela de edição do documento.
Em receitas especificamente, isso também aparece no Swagger: as rotas de listar/criar/consultar receitas aceitam API Key, mas PATCH /v1/prescriptions/:id (editar) e POST /v1/prescriptions/:id/sign (assinar) exigem sessão JWT do médico — API Key não é aceita nessas duas.
Eventos e polling
O Prescreve não envia webhooks — sua integração precisa consultar o status periodicamente.
Não existe hoje um mecanismo de notificação push (webhook) pra avisar sua integração quando, por exemplo, um médico termina de assinar um documento criado por você. O padrão recomendado é fazer polling do recurso específico:
GET /v1/prescriptions/{id}
→ verifique o campo "status": "DRAFT" | "SIGNED" | "CANCELLED"
Pra evitar polling excessivo, filtre por status ao listar (ex: GET /v1/prescriptions?status=SIGNED) e use um intervalo razoável (30–60s) em vez de consultar em loop apertado — lembre do limite de 200 req/min por IP.
Fluxo de exemplo: do paciente à receita assinada
A sequência mínima de chamadas pra emitir uma receita a partir de um sistema externo.
Cria o paciente (ou reaproveita um já existente, se o corpo incluir um externalId que já foi usado antes — o Prescreve trata isso como upsert pelo seu identificador).
{
"externalId": "pac_38210",
"name": "Maria da Silva",
"cpf": "000.000.000-00",
"birthDate": "1990-04-12",
"phone": "11999998888"
}
→ 201 { "success": true, "data": { "id": "b7e1...", "name": "Maria da Silva", ... } }
Cria a receita como rascunho, vinculada ao médico e ao paciente.
{
"prescriberId": "d92a...",
"patientId": "b7e1...",
"prescriptionType": "SIMPLES",
"medications": [
{ "name": "Amoxicilina 500mg", "dosage": "1 cápsula", "frequency": "de 8 em 8h por 7 dias" }
]
}
→ 201 { "success": true, "data": { "id": "f0c3...", "status": "DRAFT", ... } }
A partir daqui, o médico precisa entrar no Prescreve e assinar o rascunho f0c3... — não há chamada de API que conclua essa etapa. Uma boa prática é sua integração já deixar pronto um link direto pra tela da receita, pra reduzir o atrito do médico.
Faça polling deste endpoint (ou liste com filtro de status) até status virar "SIGNED". A resposta assinada já traz o link de verificação e o PDF:
→ 200 {
"success": true,
"data": {
"id": "f0c3...",
"status": "SIGNED",
"verifyToken": "8f2c1a9b",
"pdfUrl": "https://.../v1/verify/8f2c1a9b/pdf"
}
}
Endpoint público de verificação — o mesmo que o QR code do PDF aponta. Não precisa de chave, e é seguro compartilhar esse link com o paciente.
Referência rápida — Pacientes
Schemas completos (tipos, obrigatoriedade) estão no Swagger; aqui vai só a visão geral prática.
Lista/busca pacientes. Filtros comuns: search (nome/CPF), externalId, mais page/limit pra paginar.
- name
- Nome completo. obrigatório
- cpf
- CPF do paciente.
- externalId
- Identificador do paciente no seu sistema — usado como chave de upsert em chamadas futuras.
- birthDate, phone, email, address...
- Demais campos cadastrais, todos opcionais.
Referência rápida — Receitas
Criação e consulta aceitam API Key; edição e assinatura exigem sessão do médico (ver Assinatura digital).
Filtros úteis: status (DRAFT / SIGNED / CANCELLED), patientId, prescriberId.
- prescriberId
- Médico que vai assinar. obrigatório
- patientId
- Paciente. obrigatório
- medications[]
- Lista de medicamentos (nome, dosagem, frequência...). obrigatório
- prescriptionType
- Simples, Controle Especial, Notificação A/B/B2, Retinoide, Talidomida. Tipos de controle especial exigem um talonário com numeração disponível.
- validUntil, notes
- Opcionais.
Referência rápida — Outros documentos
Atestados, declarações, laudos, relatórios, pedidos de exame e encaminhamentos seguem o mesmo padrão das receitas: criar/consultar via API Key, assinar exige o médico logado.
| Documento | Base da rota |
|---|---|
| Atestado / Declaração | /v1/documentos |
| Laudo médico | /v1/laudos |
| Relatório médico | /v1/relatorios |
| Pedido de exame | /v1/pedidos-exame |
| Encaminhamento | /v1/encaminhamentos |
Cada um segue o padrão POST / (criar rascunho), GET / e GET /:id (consultar), PATCH /:id (editar rascunho), POST /:id/sign (assinar — requer o médico logado), POST /:id/cancel.
Referência rápida — Agenda e Prontuário
Consultas por profissional e período — útil pra sincronizar disponibilidade com um sistema de agendamento externo.
Anotações de prontuário por paciente.
Referência rápida — Verificação pública
Sem autenticação — são as rotas por trás do QR code impresso em cada PDF.
Confirma que o token é válido e devolve um resumo do documento.
Com o CPF do paciente no corpo, devolve os dados completos e o pdfUrl.
Bytes do PDF diretamente — é o link que o QR code do documento impresso abre.
Suporte
Para dúvidas de integração, problemas com a chave, ou solicitar aumento do limite de requisições pra uma importação pontual, abra um ticket pela Central de Ajuda dentro do Prescreve ou fale com o time comercial pelo mesmo canal do provisionamento inicial.