Manual técnico · Integração via API

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.

Versão 1.0 · agosto de 2026 Referência completa /docs (Swagger)

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.

  1. 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.
  2. Conta de IntegraçãoA equipe Softmente cria uma conta do tipo Integração, associada ao plano correspondente.
  3. Geração da chaveUm admin da plataforma gera a API Key pelo painel administrativo e a compartilha com você por um canal seguro combinado.
Atenção

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.

Importante

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." }
StatusSignificado
400Validação ou regra de negócio (campo obrigatório, formato inválido).
401Chave ausente, inválida ou revogada.
403Acesso negado — inclui conta suspensa (code: "ACCOUNT_SUSPENDED").
404Recurso não encontrado (ou não pertence à sua conta).
429Limite de requisições atingido.
500Erro interno — se persistir, contate o suporte com o horário exato.
Nota

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

PacientesReceitasAtestados / DeclaraçõesLaudosRelatórios Pedidos de exameEncaminhamentosAgendaProntuário Modelos de receitaTalonáriosMédicos (cadastro)Assistentes (cadastro) Medicamentos (DCB)Diagnósticos (CID)BuscaTickets de suporte NotificaçõesAuditoriaMétricas

Só com login interativo (JWT) — não aceita API Key

Portal do pacientePortal da farmáciaChat ao vivo Configurações da conta (tenant)Plano & cobrançaPainel administrativo

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.

Leia antes de planejar a integração

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:

  1. 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.
  2. 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.

POST /v1/patients X-API-Key

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", ... } }
POST /v1/prescriptions X-API-Key

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", ... } }
Aqui a API Key para

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.

GET /v1/prescriptions/{id} X-API-Key

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"
  }
}
GET /v1/verify/{token} Público

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.

GET/v1/patientsX-API-Key

Lista/busca pacientes. Filtros comuns: search (nome/CPF), externalId, mais page/limit pra paginar.

POST/v1/patientsX-API-Key
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.
GET/v1/patients/{id}X-API-Key
PATCH/v1/patients/{id}X-API-Key

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).

GET/v1/prescriptionsX-API-Key

Filtros úteis: status (DRAFT / SIGNED / CANCELLED), patientId, prescriberId.

POST/v1/prescriptionsX-API-Key
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.
GET/v1/prescriptions/{id}X-API-Key
PATCH/v1/prescriptions/{id}Sessão do médico (JWT)
POST/v1/prescriptions/{id}/signSessão do médico (JWT)
POST/v1/prescriptions/{id}/cancelX-API-Key

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.

DocumentoBase 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

GET/v1/agendaX-API-Key

Consultas por profissional e período — útil pra sincronizar disponibilidade com um sistema de agendamento externo.

POST/v1/agendaX-API-Key
GET/v1/prontuariosX-API-Key

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.

GET/v1/verify/{token}Público

Confirma que o token é válido e devolve um resumo do documento.

POST/v1/verify/{token}Público

Com o CPF do paciente no corpo, devolve os dados completos e o pdfUrl.

GET/v1/verify/{token}/pdfPúblico

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.