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.jsRequisitos
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.
<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:
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ção | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| apiKey | string | Sim | Chave da integração de parceiro. |
| doctor.phone | string | Sim | Telefone do médico com DDD, usado no envio do código de acesso. |
| doctor.full_name | string | Não | Nome completo; evita digitação no onboarding. |
| doctor.email | string | Não | E-mail do profissional. |
| doctor.crm | string | Não | Número do CRM, validado no CFM. |
| doctor.crm_uf | string | Não | UF do CRM (ex.: SP). |
| doctor.specialty | string | Não | Especialidade exibida no documento. |
| patient | object | Não | Dados do paciente para abrir a prescrição já preenchida (ver seção Paciente pré-preenchido). |
| onReady | function | Não | Widget carregado e pronto. |
| onPrescriptionCreated | function | Não | Documento criado (ainda não assinado). |
| onPrescriptionSigned | function | Não | Documento assinado com ICP-Brasil. |
| onPrescriptionSent | function | Não | Documento enviado ao paciente. |
| onOnboardingComplete | function | Não | Cadastro do médico finalizado. |
| onClose | function | Não | Widget fechado pelo usuário. |
| onError | function | Não | Falha de autenticação, sessão ou assinatura. |
Métodos
| Método | Descriçã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
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á abertoSeçõ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.
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:.
| Evento | Quando dispara | O que fazer |
|---|---|---|
| prescri:ready | Widget carregado | Liberar a interface do seu lado |
| prescri:prescription_created | Documento criado | Registrar rascunho no atendimento |
| prescri:prescription_signed | Assinatura concluída | Anexar ao prontuário e liberar download |
| prescri:prescription_sent | Envio ao paciente concluído | Registrar a entrega |
| prescri:onboarding_complete | Cadastro do médico finalizado | Salvar os dados profissionais |
| prescri:open_url | Compartilhamento nativo indisponível | Abrir a URL recebida em nova aba |
| prescri:error | Falha de autenticação ou assinatura | Exibir mensagem e permitir nova tentativa |
| prescri:close | Widget fechado | Atualizar a tela do atendimento |
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.
{
"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:
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
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.
Logo da clínica nas receitas
- Envie a logo em API e Integrações › Minha conta › Logo nas receitas (PNG ou JPG, até 500 KB).
- O SDK aplica a logo automaticamente via evento
prescri:branding. Não é preciso alterar código nem o endereço do widget. - A logo aparece no canto superior direito das receitas e documentos comuns.
- Notificações SNCR (receitas azul e amarela) mantêm o modelo oficial e não exibem logo.
- Sem logo cadastrada, o documento segue o layout padrão.
Erros comuns
| Mensagem | Causa | Como resolver |
|---|---|---|
| apiKey é obrigatório | SDK instanciado sem chave | Passe apiKey no construtor |
| dados do médico com telefone são obrigatórios | doctor.phone ausente | Envie o telefone com DDD |
| Origin não autorizada | Domínio fora das origens permitidas | Cadastre o domínio na sua integração |
| Erro na autenticação | Chave inválida, expirada ou fora do período de teste | Verifique a chave e a validade do trial |
| Código inválido ou expirado | OTP errado ou vencido | Reenvie o código após 60 segundos |
| Compartilhamento indisponível | Iframe 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.
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.
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.