Recebimentos de webhook
Cada chamada que o sistema externo faz em POST /api/webhooks/solicitacoes — sucesso, payload inválido, token errado ou reentrega idempotente.
Carregando...
Logs em tempo real
Documentação do sistema
O que o Autorização Cannacare faz, de ponta a ponta.
Visão geral
O Autorização Cannacare emite a Autorização de Importação Excepcional de produtos à base de canabidiol (RDC ANVISA 660/2022) no gov.br, de forma automatizada. Ele recebe de um sistema externo (o agendamento) os dados de cada paciente já prontos, organiza uma fila e preenche a solicitação no portal da ANVISA por automação de navegador (RPA), devolvendo o resultado e o comprovante em PDF ao sistema de origem.
Em uma frase: é uma ponte automática entre o sistema de agendamento e o formulário da ANVISA no gov.br — o que uma pessoa faria preenchendo o site à mão, o sistema faz sozinho.
Tipo de sistema e tecnologias
É uma aplicação de servidor (backend) com automação de navegador, escrita em Node.js + TypeScript. Não é um site institucional nem um app de celular — é um serviço que roda 24/7 num servidor, exposto por uma API e por este painel web.
Em produção roda num VPS Ubuntu, com os processos gerenciados por pm2, atrás do nginx com HTTPS. O banco PostgreSQL roda em contêiner Docker. O Chrome usado na automação fica acessível remotamente por VNC no navegador (noVNC), protegido por senha, para o login humano no gov.br.
Arquitetura (as 3 partes)
- API + Painel — recebe as solicitações pelo webhook, expõe o painel de acompanhamento e as ações (aprovar, reprocessar, ligar/desligar o robô).
- Banco de dados (PostgreSQL) — guarda cada solicitação, seus dados, documentos, histórico de situações e o comprovante emitido.
- Worker RPA — o robô que pega as solicitações da fila e preenche o formulário da ANVISA no gov.br, uma por vez.
Como o sistema acessa o gov.br
O acesso à ANVISA é feito pela conta gov.br do solicitante, num Google Chrome real que fica aberto no servidor. O login é feito por uma pessoa, uma vez, via VNC — e a sessão continua válida enquanto a janela permanece aberta.
O robô não abre um navegador próprio: ele se conecta a esse mesmo Chrome já logado e o dirige para preencher o formulário. O formulário da ANVISA roda dentro de um iframe (aplicação anvisa.servicos.gov.br embutida na página solicitacao.servicos.gov.br) — todos os campos são localizados dentro desse iframe. O sistema também verifica se a sessão continua válida antes de processar; se o acesso caiu, pausa a fila e sinaliza.
Fluxo de ponta a ponta
- Recebimento: o agendamento envia a solicitação (paciente, produtos, prescritor e documentos) para o webhook.
- Registro e aprovação: o sistema valida os dados, salva no banco e libera a solicitação para a fila.
- Emissão no gov.br: o robô preenche o assistente de 3 passos do formulário da ANVISA e envia a solicitação.
- Comprovante: baixa o comprovante/autorização em PDF na tela de confirmação e lê dele o número do protocolo (“CADASTRO Nº …”).
- Retorno: notifica o agendamento do resultado, enviando o comprovante em PDF quando aprovada.
Recebimento de solicitações (webhook)
O sistema externo chama POST /api/webhooks/solicitacoes (autenticado por token) com os dados estruturados em JSON e os documentos em base64. O corpo traz:
idExterno— identificador da solicitação no sistema de origem, usado como chave de idempotência.paciente— bloco de dados do paciente (ver abaixo).produtos— lista com um ou mais produtos.medico— dados do prescritor.aceiteDeclaracao— precisa virtrue(consentimento do titular; sem isso não emite).documentos— arquivos (identificação, vínculo e receita) em base64.
Se o mesmo idExterno chegar de novo, o sistema reconhece e não duplica a solicitação.
Bloco 1 — Solicitante (fixo)
O solicitante/representante legal é sempre a mesma pessoa (a titular da conta gov.br). Não vem no webhook — fica configurado no próprio servidor e é aplicado automaticamente em toda emissão. No formulário, CPF, nome, sexo, data de nascimento, estado e e-mail já vêm preenchidos pela conta logada; o sistema completa o restante.
Campos: CPF · nome completo · sexo · data de nascimento · endereço · estado · município · CEP · celular · telefone fixo (opcional) · e-mail. O Tipo de Solicitação é sempre “Inicial”.
Bloco 2 — Paciente (campos mapeados)
Todos vindos do webhook e preenchidos no formulário:
| Nome completo | texto |
| Data de nascimento | data |
| CPF | texto |
| Nº do documento de identificação | texto |
| Endereço | preenchido automaticamente pelo CEP |
| Estado / Município | seleção (Município depende do Estado) |
| CEP | dispara o preenchimento de endereço/município |
| Celular | 11 dígitos (DDD + 9) |
| Telefone fixo | 10 ou 11 dígitos (opcional) |
| texto |
Bloco 3 — Produtos (campos mapeados)
Uma solicitação pode ter vários produtos. Cada item traz:
| Nome comercial | chave de busca no catálogo oficial (nome exato) |
| Nome do produto | texto |
| Composição | preenchida automaticamente pelo catálogo |
| Empresa / fabricante | preenchida automaticamente pelo catálogo |
O sistema não digita composição e empresa: eles são carregados pelo próprio formulário ao selecionar o produto no catálogo da ANVISA.
Bloco 4 — Prescritor (campos mapeados)
| Nome | texto |
| Nº do CRM | texto |
| UF do CRM | 2 letras — também é o “Estado do prescritor” |
| Município | vem do sistema externo |
| Especialidade | texto |
| Telefone fixo | obrigatório (10 ou 11 dígitos) |
| Celular | opcional |
| texto |
Bloco 5 — Documentos
Anexados no formulário, um a um, esperando cada upload concluir:
- Documento de identificação do paciente — obrigatório.
- Comprovação de vínculo — obrigatório.
- Receita médica — obrigatório.
Ao final, o sistema marca a Declaração e o Termo exigidos antes do envio.
Mapeamento técnico dos campos (de-para no código)
Cada campo percorre esta cadeia até chegar ao formulário da ANVISA:
webhookSchema.ts (valida) → dadosMapper.ts (payload → nome interno) → seletores.ts (nome interno → id do campo no gov.br) → autorizacaoPage.ts (preenche).
Os identificadores do formulário seguem prefixos por bloco: SOL_ Solicitante · PAC_ Paciente · PRO_ Produto · MED_ Prescritor · PRE_ / TER_ Documentos e Termo.
Solicitante
| Nome / Sexo / Nascimento | #SOL_NOM · #SOL_SEXO · #SOL_DAT_TXT |
| Estado / E-mail | #SOL_EST · #SOL_EMA |
| Endereço / Município / CEP | #SOL_ENDERECO · #SOL_MUN · #SOL_CEP |
| Celular / Telefone fixo | #SOL_CEL · #SOL_TEL |
| Confirmar dados / Tipo de Solicitação | #input_Sim · #TIP_SOL (opção #TIP_SOL_0 = “Inicial”) |
Paciente
| Nome / Nascimento / CPF | #PAC_NOM · #PAC_DAT_TXT · #PAC_CPF |
| Nº do documento de identificação | #PAC_DOC_NUM |
| Endereço / Estado / Município / CEP | #PAC_ENDERECO · #PAC_EST · #PAC_MUN · #PAC_CEP |
| Celular / Telefone fixo / E-mail | #PAC_CEL · #PAC_TEL · #PAC_EMA |
| Anexo identificação / Comprovação de vínculo | #input__PAC_DOC_ANE · #input__PAC_VIN |
Produto (catálogo)
| Abrir busca do catálogo | #PRO_NOME_lookup |
| Campo de busca (dentro do modal) | #PRO_NOME__lookup-modal |
| Nome Comercial (preenchido pelo catálogo) | #PRO_NOME |
| Adicionar produto na tabela | #CREATE |
Prescritor
| Nome / CRM nº / UF (Estado) | #MED_NOM · #MED_CRM · #MED_EST |
| Município / Especialidade | #MED_MUN · #MED_ESP |
| Telefone fixo / Celular / E-mail | #MED_TEL · #MED_CEL · #MED_EMA |
Documentos, Termo e navegação
| Receita médica | #input__PRE_REC |
| Declaração / Termo | PRE_DECLARACAO-form-* · TER_CON-form-* |
| Avançar etapa / Enviar Solicitação | #aprovar (reaproveitado em todas as etapas) |
| Download da autorização (PDF) | link em #input__ANA_AUT |
O número do protocolo não é um campo da tela — é lido de dentro do PDF baixado (“CADASTRO Nº …”).
O que o robô faz no gov.br (passo a passo)
- Abre a área logada e clica em “Iniciar” uma nova solicitação.
- Passo 1 de 3: confirma os dados do Solicitante, escolhe o Município, define o Tipo de Solicitação (“Inicial”), preenche CEP e contatos; preenche todo o bloco do Paciente; anexa identificação e comprovação de vínculo → “Prosseguir para o passo 2”.
- Passo 2 de 3: para cada produto, busca pelo nome comercial no catálogo, seleciona a linha correta (isso preenche composição/empresa) e adiciona à tabela; preenche o Prescritor; anexa a receita; aceita a Declaração → “Prosseguir para o passo 3”.
- Passo 3 de 3 (revisão): aceita o Termo e clica em “Enviar Solicitação”.
- Na tela de confirmação, baixa o comprovante/autorização em PDF e lê dele o número do protocolo.
Catálogo de produtos da ANVISA
O nome, a composição e a empresa do produto não são texto livre no formulário: existem num catálogo oficial. O sistema busca o produto pelo nome comercial exato, seleciona a linha correspondente e deixa o próprio formulário preencher composição e empresa. Se o nome não existir no catálogo, ou se houver ambiguidade entre produtos diferentes, o sistema sinaliza em vez de escolher errado.
Fila e processamento
As solicitações aprovadas entram numa fila e são processadas uma por vez. O worker:
- Respeita um limite diário de emissões e aplica intervalos entre as solicitações.
- Faz novas tentativas automáticas (com espera crescente) quando algo falha de forma recuperável.
- Pode ser ligado/desligado pelo painel e alterna entre Modo Automático e Manual, mostrando sempre o estado atual.
Tratamento de instabilidades do gov.br
O formulário da ANVISA é lento e às vezes instável; o sistema é feito para lidar com isso sem intervenção:
- Espera o carregamento real de cada etapa antes de interagir.
- Trata travas de concorrência do backend (“Activity Instance Locked”) e o spinner “Aguarde! Carregando…”.
- Confirma seleções por teclado quando o clique não registra (autocompletes, catálogo, checkboxes).
- Reconcilia CEP × Município × Endereço, que se sobrescrevem entre si.
- Confere de verdade se a etapa avançou, evitando falsos positivos.
Retorno para o sistema de agendamento (callback)
A cada mudança de situação, o sistema faz um POST autenticado no webhook do agendamento, traduzindo a situação interna para um status externo:
- em_analise — recebida, na fila ou sendo processada.
- aprovada — concluída, acompanhada do comprovante em PDF (base64).
- erro — com a mensagem do que aconteceu.
O contrato do agendamento aceita chamadas repetidas para a mesma solicitação sem duplicar nada, então o retorno é enviado em toda transição.
Painel de acompanhamento
Este painel mostra tudo em tempo real (atualiza sozinho a cada 5 segundos):
- Lista de solicitações com filtro por situação.
- Detalhe de cada solicitação: todos os dados capturados, documentos (com download) e o histórico de situações.
- Editar dados (paciente, produtos, prescritor) diretamente pelo painel quando necessário.
- Aprovar e iniciar a emissão de uma solicitação.
- Reprocessar uma solicitação e Reenviar para teste (duplicar uma já concluída).
- Iniciar / Parar o robô e alternar entre Modo Automático e Manual.
- Verificar sessão do gov.br a qualquer momento.
- Download do comprovante das solicitações concluídas.
- Abas 📬 Webhooks (recebimentos), 📜 Logs (tempo real) e 📖 Documentação (esta).
Situações de uma solicitação
- aguardando_aprovacao recebida, aguardando liberação para a fila.
- pendente na fila, aguardando o robô.
- processando sendo preenchida no gov.br.
- concluido emitida, com número de protocolo e comprovante.
- erro precisa de atenção; pode ser reprocessada.
- aguardando_sessao aguardando renovação do acesso ao gov.br.
Validações automáticas
- Telefones — celular precisa ter 11 dígitos (DDD + 9) e telefone fixo 10 ou 11, exatamente o que a máscara do gov.br exige.
- Consentimento —
aceiteDeclaracaotem que virtrue. - Documentos obrigatórios — exige identificação, vínculo e receita.
- Produto no catálogo — recusa nome comercial inexistente ou ambíguo.
- Idempotência — o mesmo
idExternonão gera solicitação duplicada. - Duplicidade por paciente — evita processar em paralelo duas solicitações ativas do mesmo paciente.
Acesso e segurança
- O painel exige login (usuário e senha).
- O webhook aceita chamadas apenas com o token de autenticação combinado com o sistema externo — o mesmo token vale nos dois sentidos (intake e callback).
- O acesso ao Chrome do servidor (VNC) é protegido por senha e servido por HTTPS.
- Documentos e comprovantes ficam armazenados por solicitação; toda ação relevante é registrada nos logs.