Documentação técnica

Documentação do SDK de prescrição médica

O SDK embarca a experiência completa da Prescri dentro do seu sistema por meio de um iframe seguro: o médico monta a receita, escolhe o paciente, assina com certificado ICP-Brasil e envia por WhatsApp sem sair da sua tela. Integração em poucas linhas de JavaScript, sem construir o PDF.

Visão geral

O SDK carrega um iframe hospedado pela Prescri em uma camada sobre a sua página. Toda a autenticação do médico, a montagem do documento e a assinatura acontecem dentro do iframe; o seu sistema recebe apenas eventos de status por postMessage.

Script

https://prescri.com.br/sdk/prescri-sdk.js

Requisitos

API Key de parceiro, domínio cadastrado nas origens permitidas e telefone do médico.

Instalação

Inclua o script e instancie o SDK. O uso mínimo exige apenas a chave e o telefone do médico — o restante do cadastro é coletado no onboarding.

index.html
<script src="https://prescri.com.br/sdk/prescri-sdk.js"></script>
<script>
  const prescri = new Prescri({
    apiKey: 'SUA_API_KEY',
    doctor: { phone: '11999999999' },
    onPrescriptionSigned: (data) => console.log('Assinada:', data),
    onClose: () => console.log('Widget fechado'),
  });

  document
    .querySelector('#btn-prescrever')
    .addEventListener('click', () => prescri.open());
</script>

Passando os dados completos do médico, o onboarding é pulado:

uso completo
const prescri = new Prescri({
  apiKey: 'SUA_API_KEY',
  doctor: {
    full_name: 'Dr. João Silva',
    email: 'joao@clinica.com',
    phone: '11999999999',
    crm: '123456',
    crm_uf: 'SP',
    specialty: 'Clínica Geral'
  },
  onPrescriptionCreated: (data) => {},
  onPrescriptionSigned: (data) => {},
  onPrescriptionSent: (data) => {},
  onError: (error) => {},
});

prescri.open();

Opções do construtor

OpçãoTipoObrigatórioDescrição
apiKeystringSimChave da integração de parceiro.
doctor.phonestringSimTelefone do médico com DDD, usado no envio do código de acesso.
doctor.full_namestringNãoNome completo; evita digitação no onboarding.
doctor.emailstringNãoE-mail do profissional.
doctor.crmstringNãoNúmero do CRM, validado no CFM.
doctor.crm_ufstringNãoUF do CRM (ex.: SP).
doctor.specialtystringNãoEspecialidade exibida no documento.
patientobjectNãoDados do paciente para abrir a prescrição já preenchida (ver seção Paciente pré-preenchido).
onReadyfunctionNãoWidget carregado e pronto.
onPrescriptionCreatedfunctionNãoDocumento criado (ainda não assinado).
onPrescriptionSignedfunctionNãoDocumento assinado com ICP-Brasil.
onPrescriptionSentfunctionNãoDocumento enviado ao paciente.
onOnboardingCompletefunctionNãoCadastro do médico finalizado.
onClosefunctionNãoWidget fechado pelo usuário.
onErrorfunctionNãoFalha de autenticação, sessão ou assinatura.

Métodos

MétodoDescrição
authenticate()Autentica a chave e o médico antecipadamente; retorna uma Promise. Chamado automaticamente por open().
open(options?)Abre o widget. Aceita { section: 'home' | 'models' | 'patients' | 'history' } e { patient }.
navigateTo(section)Troca a seção com o widget já aberto.
close()Fecha o widget e dispara onClose.
destroy()Remove o iframe e os listeners; use ao desmontar o componente.

Seções do widget

navegação
prescri.open();                        // Início (nova prescrição)
prescri.open({ section: 'models' });   // Meus modelos
prescri.open({ section: 'patients' }); // Meus pacientes
prescri.open({ section: 'history' });  // Histórico de documentos

prescri.navigateTo('history');         // com o widget já aberto

Seções inválidas caem em home com um aviso no console.

Paciente pré-preenchido (opcional)

Envie os dados do paciente e o widget abre direto na nova prescrição, com o paciente já selecionado. O campo é opcional: integrações existentes continuam funcionando sem nenhuma alteração.

javascript
prescri.open({
  patient: {
    full_name: 'Maria Souza',       // obrigatório dentro de patient
    cpf: '12345678901',             // obrigatório: identifica o paciente na base
    phone: '11988887777',           // recomendado (envio ao paciente)
    birth_date: '1985-04-12',       // AAAA-MM-DD
    gender: 'female',
    email: 'maria@exemplo.com',
    address_street: 'Rua das Flores',
    address_number: '100',
    address_neighborhood: 'Centro',
    address_city: 'São Paulo',
    address_state: 'SP',
    address_cep: '01000000'
  }
});

// também aceito no construtor, valendo para todas as aberturas:
const prescri = new Prescri({ apiKey: 'SUA_API_KEY', doctor: {...}, patient: {...} });

Comportamento: o CPF é a chave do paciente. Se já existir na base, o cadastro é reaproveitado e vinculado ao médico que está prescrevendo; caso contrário, é criado com os dados enviados. Os dados enviados passam a valer como a versão daquele médico (ficam no vínculo médico-paciente); o cadastro central, compartilhado por CPF, só é completado onde estava vazio — assim um parceiro nunca sobrescreve os dados usados por outro médico. Sem nome ou sem CPF válido (11 dígitos), o pré-preenchimento é ignorado e o widget abre normalmente.

Eventos

Além dos callbacks, o iframe envia mensagens por postMessage para a página hospedeira. Todas começam com o prefixo prescri:.

EventoQuando disparaO que fazer
prescri:readyWidget carregadoLiberar a interface do seu lado
prescri:prescription_createdDocumento criadoRegistrar rascunho no atendimento
prescri:prescription_signedAssinatura concluídaAnexar ao prontuário e liberar download
prescri:prescription_sentEnvio ao paciente concluídoRegistrar a entrega
prescri:onboarding_completeCadastro do médico finalizadoSalvar os dados profissionais
prescri:open_urlCompartilhamento nativo indisponívelAbrir a URL recebida em nova aba
prescri:errorFalha de autenticação ou assinaturaExibir mensagem e permitir nova tentativa
prescri:closeWidget fechadoAtualizar a tela do atendimento
listener manual
window.addEventListener('message', (event) => {
  if (!event.data || !String(event.data.type || '').startsWith('prescri:')) return;
  if (event.data.type === 'prescri:prescription_signed') {
    anexarAoProntuario(event.data.payload);
  }
});

Autenticação do médico

O SDK chama o endpoint embed-auth com a sua API Key e os dados do médico. Em seguida o profissional confirma um código de 6 dígitos enviado por WhatsApp. A sessão fica válida por até 7 dias no mesmo navegador, com nova tentativa liberada a cada 60 segundos.

POST /embed-auth
{
  "api_key": "SUA_API_KEY",
  "doctor": {
    "phone": "11999999999",
    "full_name": "Dr. João Silva",
    "crm": "123456",
    "crm_uf": "SP"
  }
}

O token nunca é exposto para a página que hospeda o iframe.

Onboarding e validação no CFM

Quando o cadastro do médico está incompleto, o SDK exibe um formulário curto pedindo CRM, UF, especialidade e CPF, com validação automática no CFM. Concluído o onboarding, o evento prescri:onboarding_complete devolve os dados para você guardar do seu lado e pular essa etapa nas próximas aberturas.

Origens permitidas e iframe

O SDK só carrega em domínios cadastrados como origens permitidas na sua integração. Cadastre produção e homologação. O iframe criado pelo SDK precisa da permissão de compartilhamento nativo:

permissões do iframe
allow="web-share; clipboard-write"

Sem web-share, o compartilhamento do PDF no celular cai no evento prescri:open_url, que você deve tratar abrindo a URL em nova aba.

Exemplo em React

PrescriButton.tsx
import { useEffect, useRef } from "react";

export function PrescriButton({ doctor }) {
  const ref = useRef<any>(null);

  useEffect(() => {
    const script = document.createElement("script");
    script.src = "https://prescri.com.br/sdk/prescri-sdk.js";
    script.onload = () => {
      ref.current = new (window as any).Prescri({
        apiKey: import.meta.env.VITE_PRESCRI_KEY,
        doctor,
        onPrescriptionSigned: (data) => console.log(data),
      });
    };
    document.body.appendChild(script);
    return () => {
      ref.current?.destroy();
      script.remove();
    };
  }, [doctor]);

  return <button onClick={() => ref.current?.open()}>Prescrever</button>;
}

Receitas controladas e numeração SNCR (RDC 1.000/2025)

Notificações de Receita (A, B, B2, retinoides, talidomida), Receita de Controle Especial e receitas sujeitas a retenção exigem numeração oficial do SNCR da Anvisa. O widget cuida de tudo: sua plataforma não precisa integrar o SNCR.

  • O médico conecta a conta gov.br dele uma vez na Prescri e carrega as numerações liberadas pela Vigilância Sanitária na carteira dele.
  • Ao escolher um tipo controlado no widget, o próximo número da carteira é reservado automaticamente e impresso no documento.
  • Se a carteira estiver vazia, o widget exibe um aviso com o botão de conectar ao gov.br. Como o gov.br não abre dentro de iframe, o login é feito em nova aba e o médico volta ao widget sem perder o que digitou.
  • Esses tipos exigem assinatura qualificada ICP-Brasil (VIDaaS ou Bird ID); a assinatura simples fica indisponível neles.

Não existe API Key do SNCR: a Anvisa autoriza por login gov.br do médico, com token de uso único válido por 30 segundos. Por isso o carregamento acontece na Prescri, no domínio prescri.com.br.

Se você monta o PDF no seu próprio sistema (API REST, sem o widget), a numeração pode ser impressa de duas formas: sncr_stamp em POST /api-signatures-create, em que a Prescri desenha o quadro oficial no PDF enviado (posição configurável), ou POST /api-sncr-reserve, em que você reserva o número antes e imprime no seu layout. O saldo do médico pode ser conferido em GET /api-sncr-balance. Detalhes na documentação da API.

Erros comuns

MensagemCausaComo resolver
apiKey é obrigatórioSDK instanciado sem chavePasse apiKey no construtor
dados do médico com telefone são obrigatóriosdoctor.phone ausenteEnvie o telefone com DDD
Origin não autorizadaDomínio fora das origens permitidasCadastre o domínio na sua integração
Erro na autenticaçãoChave inválida, expirada ou fora do período de testeVerifique a chave e a validade do trial
Código inválido ou expiradoOTP errado ou vencidoReenvie o código após 60 segundos
Compartilhamento indisponívelIframe sem allow="web-share"Trate prescri:open_url abrindo em nova aba

Perguntas frequentes

Pronto para embarcar a prescrição?

Solicite sua chave e teste o SDK por 10 dias, sem custo.

Assinatura Online - API de assinatura eletrônica simples e avançada

Do mesmo grupo Mobipar

Precisa de assinatura simples via API?

Para o paciente aceitar um termo, testemunhas ou contratos sem certificado digital, use a API da Assinatura Online: assinatura eletrônica simples e avançada por link, WhatsApp, e-mail ou SMS.

Conhecer a Assinatura Online

Prescri — assinatura qualificada ICP-Brasil

Médico assina receitas, atestados e notificações SNCR com VIDaaS, BirdID ou A1.

Assinatura Online — assinatura simples

Paciente, testemunhas e empresas assinam por link, sem certificado digital.