claudio.ferreira Postado 5 Setembro, 2025 Postado 5 Setembro, 2025 ATENÇÃO, Foi lançada ontem por uma nota da ANVISA a nova API de envio de arquivos SNGPC com as interfaces no swagger. A Anvisa diz que isso é a documentação, porém muito pobre e sem exemplos práticos. Testei e não obtiver sucesso, até porque alguns parâmetros não estão claros no que passar. Ou seja carece de maiores detalhes. Se alguém conseguir algum teste positivo, favor informar aqui. Segue o link do informe e o do nova API Informe : https://www.gov.br/anvisa/pt-br/assuntos/noticias-anvisa/2025/sngpc-anvisa-disponibiliza-nova-ferramenta-para-envio-de-informacoes API : https://sngpc-api.anvisa.gov.br/swagger/index.html
Consultores valterpatrick Postado 8 Setembro, 2025 Consultores Postado 8 Setembro, 2025 Na publicação tem um link para uma documentação além da api que é o manual do desenvolvedor. Nele não tem mais informações que podem ser utéis? Link: https://www.gov.br/anvisa/pt-br/assuntos/fiscalizacao-e-monitoramento/sngpc/desenvolvedores/desenvolvedores Valter Patrick Gerente de Projetos na empresa CTEC Consultor ACBr (33)98400-0936 GitHub: https://github.com/valterpatrick Ajude o Projeto ACBr crescer - Assine o Clube PRO (15) 2105-0750 (15)99790-2976. Discord
claudio.ferreira Postado 8 Setembro, 2025 Autor Postado 8 Setembro, 2025 Esse link que voce postou, Valter é da versão 1.0 e 2.0 de 2013. Não há nada novo.
joaovictorsp Postado 17 Outubro, 2025 Postado 17 Outubro, 2025 (editado) Alguém sabe como deve ser enviado o XML no endpoint /v1/FileXml/EnviarArquivoXmlSNGPC ? Só da pra saber que deve enviar uma string. Será que é pra enviar o conteúdo do XML? Enviar o arquivo em base64? ... Documentação incompleta. Editado 17 Outubro, 2025 por joaovictorsp
joaovictorsp Postado 17 Outubro, 2025 Postado 17 Outubro, 2025 (editado) Encontrei a documentação. Tive que fazer login com a conta do gov.br. Fica em: https://api.anvisa.gov.br/sngpc/docs Editado 17 Outubro, 2025 por joaovictorsp
claudio.ferreira Postado 17 Outubro, 2025 Autor Postado 17 Outubro, 2025 Bom, tá melhorando a documentação, mas ainda tá ruim. Falta exemplos práticos. Por exemplo : 1 - É para usar o primeiro Endpoint para pegar o Token em seguida o segundo (por usuário) ? ou podemos escolher um dos dois ? 2 - Depois de obter o Token o que fazer com ele ? não tem parâmetros no Envio de XML para passar o Token Quem conseguir transmitir avisa aí..
joaovictorsp Postado 17 Outubro, 2025 Postado 17 Outubro, 2025 3 horas atrás, claudio.ferreira disse: Bom, tá melhorando a documentação, mas ainda tá ruim. Falta exemplos práticos. Por exemplo : 1 - É para usar o primeiro Endpoint para pegar o Token em seguida o segundo (por usuário) ? ou podemos escolher um dos dois ? 2 - Depois de obter o Token o que fazer com ele ? não tem parâmetros no Envio de XML para passar o Token Quem conseguir transmitir avisa aí.. Imagino que primeiro chame o endpoint para pegar o token e depois na hora de fazer o post no outro endpoint para enviar o XML, esse token seja setado como Bearer Token. Colocando um header com nome: Authorization e valor: Bearer TOKEN_RECEBIDO_NO_OUTRO_ENDPOINT Tenho que testar ainda, poderia ter uma versão de homologação dessa API para poder enviar algo pra testar.
claudio.ferreira Postado 17 Outubro, 2025 Autor Postado 17 Outubro, 2025 Sim. um versão para homologar seria o ideal.
joaovictorsp Postado 21 Outubro, 2025 Postado 21 Outubro, 2025 Alguém tem um exemplo de resposta da API do envio de XML? Não tem exemplo na documentação e não tem API de homologação pra descobrir por tentativa e erro.
claudio.ferreira Postado 24 Outubro, 2025 Autor Postado 24 Outubro, 2025 (editado) Ao testar no navegador o exemplo dele para obter o Token pela URL : https://sngpc-api.anvisa.gov.br/api/Auth/ObterTokenKeycloak?code=123456789 Obtive o retorno que o código é invalido. Ninguém sabe que código é esse, já tentei CNPJ de farmácia e CPF de farmaceutico mas retorna sempre o mesmo erro: Token exchange failed: {"error":"invalid_grant","error_description":"Code not valid"} Editado 24 Outubro, 2025 por claudio.ferreira
claudio.ferreira Postado 24 Outubro, 2025 Autor Postado 24 Outubro, 2025 Testei a segunda opção enviando usuário e senha mas o firewall deles deve estar bloqueando porque tá retornando erro 413 - Acesso negado.
tiagohelfer Postado 28 Outubro, 2025 Postado 28 Outubro, 2025 Em 24/10/2025 at 11:27, claudio.ferreira disse: Testei a segunda opção enviando usuário e senha mas o firewall deles deve estar bloqueando porque tá retornando erro 413 - Acesso negado. Também estou com o mesmo problema. Só funciona pelo Swagger. Detalhe que no Swagger o endereço de consumo é 'https://sngpc-api.anvisa.gov.br/v1/Authentication/GetToken', já quando entra na conta Gov, nas API da ANVISA, o endereço de consumo muda para ' https://sngpc-api.anvisa.gov.br/swagger/v1/api/v1/Authentication/GetToken'. De qualquer forma nenhum dos dois funciona. O primeiro retorna 'Unauthorized' e o segundo 'Not Found'.
Consultores Juliomar Marchetti Postado 28 Outubro, 2025 Consultores Postado 28 Outubro, 2025 é fácil de conseguir as credenciais de acesso? Juliomar Marchetti Ajude o Projeto ACBr crescer - Seja Pro discord: juliomar telegram: juliomar e-mail: [email protected] http://www.juliomarmarchetti.com.br Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil Participe de nosso canal no Discord e fique ainda mais próximo da Comunidade !!
Jorge Gamboa Postado 14 Novembro, 2025 Postado 14 Novembro, 2025 Alguém já conseguiu enviar a xml ? Já consegui gerar o token e consultar o as informações do arquivo, mas enviar a xml não. Na documentação não explica o formato a ser enviado.
tiagohelfer Postado 17 Novembro, 2025 Postado 17 Novembro, 2025 Em 14/11/2025 at 18:28, Jorge Victor Rodrigues Gamboa (Jorge Gamboa) disse: Alguém já conseguiu enviar a xml ? Já consegui gerar o token e consultar o as informações do arquivo, mas enviar a xml não. Na documentação não explica o formato a ser enviado. Qual erro você está recebendo de retorno? Eu não cheguei a receber o sucesso da requisição, pois não tem ambiente de homologação e não posso enviar com os dados do cliente, mas consegui receber o retorno de que os dados dentro de XML são inválidos. O formato que enviei é o mesmo que eu enviava no WS anterior. O que não explica na documentação é que tem que enviar o bytea do arquivo compactado na requisição. Em curl fica assim: curl.exe -v -X POST "https://sngpc-api.anvisa.gov.br/v1/FileXml/EnviarArquivoXmlSNGPC" ` -H "accept: application/json" ` -H "Content-Type: application/json" ` -H "Authorization: Bearer SEU BEARER" ` -H "User-Agent: Mozilla/5.0" ` --data-binary '\"BYTEA DO COMPACTADO DO XML\"' Outra coisa, a partir de hoje comecei a ser bloqueado pelo CLOUDFIRE: "You can email the site owner to let them know you were blocked. Please include what you were doing when this page came up and the Cloudflare Ray ID found at the bottom of this page.", semana passada não estava ocorrendo isso nas requisições diretas pelo CURL no POWERSHELL.
Jorge Gamboa Postado 17 Novembro, 2025 Postado 17 Novembro, 2025 27 minutos atrás, tiagohelfer disse: Qual erro você está recebendo de retorno? Eu não cheguei a receber o sucesso da requisição, pois não tem ambiente de homologação e não posso enviar com os dados do cliente, mas consegui receber o retorno de que os dados dentro de XML são inválidos. O formato que enviei é o mesmo que eu enviava no WS anterior. O que não explica na documentação é que tem que enviar o bytea do arquivo compactado na requisição. Em curl fica assim: curl.exe -v -X POST "https://sngpc-api.anvisa.gov.br/v1/FileXml/EnviarArquivoXmlSNGPC" ` -H "accept: application/json" ` -H "Content-Type: application/json" ` -H "Authorization: Bearer SEU BEARER" ` -H "User-Agent: Mozilla/5.0" ` --data-binary '\"BYTEA DO COMPACTADO DO XML\"' Outra coisa, a partir de hoje comecei a ser bloqueado pelo CLOUDFIRE: "You can email the site owner to let them know you were blocked. Please include what you were doing when this page came up and the Cloudflare Ray ID found at the bottom of this page.", semana passada não estava ocorrendo isso nas requisições diretas pelo CURL no POWERSHELL. Enviando pelo postman o último retorno que tive foi este. { "type": "https://tools.ietf.org/html/rfc9110#section-15.5.1", "title": "One or more validation errors occurred.", "status": 400, "errors": { "$": [ "'P' is an invalid start of a value. Path: $ | LineNumber: 0 | BytePositionInLine: 0." ], "arquivo": [ "The arquivo field is required." ] }, "traceId": "00-e22fac63a322ba9becba9db2adf7c2b7-28a49f7f4ec716ba-01" }
tiagohelfer Postado 17 Novembro, 2025 Postado 17 Novembro, 2025 (editado) Você está enviando o BODY no formato errado. Tem que ser o base64 do XML compactado. Editado 17 Novembro, 2025 por tiagohelfer
Jorge Gamboa Postado 17 Novembro, 2025 Postado 17 Novembro, 2025 18 minutos atrás, tiagohelfer disse: Você está enviando o BODY no formato errado. Tem que ser o base64 do XML compactado. Pelo postman consegui, retornou a mensagem de validação da xml, mas no delphi utilizando o rest client, ele retorna Response: 415 - Unsupported Media Type.
Consultores Juliomar Marchetti Postado 17 Novembro, 2025 Consultores Postado 17 Novembro, 2025 39 minutos atrás, Jorge Gamboa disse: Pelo postman consegui, retornou a mensagem de validação da xml, mas no delphi utilizando o rest client, ele retorna Response: 415 - Unsupported Media Type. tu tem que definir o content type . ou ainda os parametros como noencondig Juliomar Marchetti Ajude o Projeto ACBr crescer - Seja Pro discord: juliomar telegram: juliomar e-mail: [email protected] http://www.juliomarmarchetti.com.br Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil Participe de nosso canal no Discord e fique ainda mais próximo da Comunidade !!
joaovictorsp Postado 17 Novembro, 2025 Postado 17 Novembro, 2025 (editado) Consegui fazer a integração com a nova API. Abaixo está a função que utilizo pra obter o token pra autenticar na API. function GetTokenSNGPC(username, password: string): string; var url: string; Req: IRequest; Resp: IResponse; begin Result := ''; try url := API_BASE_URL + '/v1/Authentication/GetToken'; Req := CreateRequest(url, False); Req.AddBody('{"username":"' + username + '", "password": "' + password + '"}'); Resp := Req.Post; LogResponse(Resp, 'Obtendo token para autenticação na API do SNGPC'); if Resp.StatusCode = 200 then Result := Trim(Req.Post.Content).Replace('"', ''); except on E: Exception do begin Logger.Error('Erro ao obter token para autenticar na API do SNGPC.'); end; end; end; O arquivo a ser enviado continua sendo no mesmo formato de antes Pra autenticar na API seria algo assim (utilizando RestRequest4D) // Função que utilizo pra criar requisição function CreateRequest(url: string; authenticated: Boolean): IRequest; var Request: IRequest; begin Request := TRequest.New; if authenticated then Request.TokenBearer(BEARER_TOKEN); // TOKEN obtido chamando a função GetTokenSNGPC passando usuário e senha Request.BaseURL(url); Request.ContentType('application/json'); Result := Request; end; Pra enviar o arquivo a função que utilizo é a seguinte: function EnviarXmlSngpc(Arquivo, AToken: string): String; var lRequest: IRequest; lResponse: IResponse; JSONBody: TJSONObject; JSONData, EncodedXml, Base64String, Base64XMLFile: String; Bytes: TBytes; begin { Envia o mesmo arquivo que enviava pra API antiga } Result := ''; try { Cria a requisição } BEARER_TOKEN := AToken; lRequest := CreateRequest(API_BASE_URL + '/v1/FileXml/EnviarArquivoXmlSNGPC', True); lRequest.Accept('application/json'); { Monta o JSON conforme a nova API do SNGPC } { Lê o arquivo XML } Bytes := TFile.ReadAllBytes(Arquivo); { Codifica em Base64 } Base64String := TNetEncoding.Base64.EncodeBytesToString(Bytes); Base64String := StringReplace(Base64String, '#13', '', [rfReplaceAll]); Base64String := StringReplace(Base64String, '#10', '', [rfReplaceAll]); Base64String := StringReplace(Base64String, sLineBreak, '', [rfReplaceAll]); Base64XMLFile := '"' + Base64String + '"'; Logger.Info('JSON enviado à API SNGPC: ' + Base64XMLFile); lResponse := lRequest.AddBody(Base64XMLFile).Post(); LogResponse(lResponse, 'Enviando XML para o SNGPC'); { Verifica a resposta } if lResponse.StatusCode = 200 then begin Logger.Info('Arquivo enviado com sucesso!'); Logger.Info('Resposta da API: ' + lResponse.Content); Result := Trim(lResponse.Content); end else begin Logger.Error('Falha no envio do arquivo. Status Code: ' + lResponse.StatusCode.ToString); Logger.Error('Resposta da API: ' + lResponse.Content); end; except on E: Exception do begin Logger.Error('Erro ao enviar o arquivo: ' + E.Message); Logger.Error(E.StackTrace); end; end; end; Editado 17 Novembro, 2025 por joaovictorsp
claudio.ferreira Postado 17 Novembro, 2025 Autor Postado 17 Novembro, 2025 5 minutos atrás, joaovictorsp disse: Consegui fazer a integração com a nova API. Abaixo está a função que utilizo pra obter o token pra autenticar na API. function GetTokenSNGPC(username, password: string): string; var url: string; Req: IRequest; Resp: IResponse; begin Result := ''; try url := API_BASE_URL + '/v1/Authentication/GetToken'; Req := CreateRequest(url, False); Req.AddBody('{"username":"' + username + '", "password": "' + password + '"}'); Resp := Req.Post; LogResponse(Resp, 'Obtendo token para autenticação na API do SNGPC'); if Resp.StatusCode = 200 then Result := Trim(Req.Post.Content).Replace('"', ''); except on E: Exception do begin Logger.Error('Erro ao obter token para autenticar na API do SNGPC.'); end; end; end; O arquivo a ser enviado continua sendo no mesmo formato de antes Pra autenticar na API seria algo assim (utilizando RestRequest4D) // Função que utilizo pra criar requisição function CreateRequest(url: string; authenticated: Boolean): IRequest; var Request: IRequest; begin Request := TRequest.New; if authenticated then Request.TokenBearer(BEARER_TOKEN); // TOKEN obtido chamando a função GetTokenSNGPC passando usuário e senha Request.BaseURL(url); Request.ContentType('application/json'); Result := Request; end; Pra enviar o arquivo a função que utilizo é a seguinte: function EnviarXmlSngpc(Arquivo, AToken: string): String; var lRequest: IRequest; lResponse: IResponse; JSONBody: TJSONObject; JSONData, EncodedXml, Base64String, Base64XMLFile: String; Bytes: TBytes; begin { Envia o mesmo arquivo que enviava pra API antiga } Result := ''; try { Cria a requisição } BEARER_TOKEN := AToken; lRequest := CreateRequest(API_BASE_URL + '/v1/FileXml/EnviarArquivoXmlSNGPC', True); lRequest.Accept('application/json'); { Monta o JSON conforme a nova API do SNGPC } { Lê o arquivo XML } Bytes := TFile.ReadAllBytes(Arquivo); { Codifica em Base64 } Base64String := TNetEncoding.Base64.EncodeBytesToString(Bytes); Base64String := StringReplace(Base64String, '#13', '', [rfReplaceAll]); Base64String := StringReplace(Base64String, '#10', '', [rfReplaceAll]); Base64String := StringReplace(Base64String, sLineBreak, '', [rfReplaceAll]); Base64XMLFile := '"' + Base64String + '"'; Logger.Info('JSON enviado à API SNGPC: ' + Base64XMLFile); lResponse := lRequest.AddBody(Base64XMLFile).Post(); LogResponse(lResponse, 'Enviando XML para o SNGPC'); { Verifica a resposta } if lResponse.StatusCode = 200 then begin Logger.Info('Arquivo enviado com sucesso!'); Logger.Info('Resposta da API: ' + lResponse.Content); Result := Trim(lResponse.Content); end else begin Logger.Error('Falha no envio do arquivo. Status Code: ' + lResponse.StatusCode.ToString); Logger.Error('Resposta da API: ' + lResponse.Content); end; except on E: Exception do begin Logger.Error('Erro ao enviar o arquivo: ' + E.Message); Logger.Error(E.StackTrace); end; end; end; Grande !! muito bom, Vou testar aqui. Qual versão do Delphi ? 2 minutos atrás, claudio.ferreira disse: Grande !! muito bom, Vou testar aqui. Qual versão do Delphi ? Parece ser uma versão mais nova do Delphi, em vista dos sistemas legados que temos aqui ainda em D7, seria interessante portar para ele.
claudio.ferreira Postado 3 Dezembro, 2025 Autor Postado 3 Dezembro, 2025 Em 17/11/2025 at 15:18, joaovictorsp disse: Consegui fazer a integração com a nova API. Abaixo está a função que utilizo pra obter o token pra autenticar na API. function GetTokenSNGPC(username, password: string): string; var url: string; Req: IRequest; Resp: IResponse; begin Result := ''; try url := API_BASE_URL + '/v1/Authentication/GetToken'; Req := CreateRequest(url, False); Req.AddBody('{"username":"' + username + '", "password": "' + password + '"}'); Resp := Req.Post; LogResponse(Resp, 'Obtendo token para autenticação na API do SNGPC'); if Resp.StatusCode = 200 then Result := Trim(Req.Post.Content).Replace('"', ''); except on E: Exception do begin Logger.Error('Erro ao obter token para autenticar na API do SNGPC.'); end; end; end; O arquivo a ser enviado continua sendo no mesmo formato de antes Pra autenticar na API seria algo assim (utilizando RestRequest4D) // Função que utilizo pra criar requisição function CreateRequest(url: string; authenticated: Boolean): IRequest; var Request: IRequest; begin Request := TRequest.New; if authenticated then Request.TokenBearer(BEARER_TOKEN); // TOKEN obtido chamando a função GetTokenSNGPC passando usuário e senha Request.BaseURL(url); Request.ContentType('application/json'); Result := Request; end; Pra enviar o arquivo a função que utilizo é a seguinte: function EnviarXmlSngpc(Arquivo, AToken: string): String; var lRequest: IRequest; lResponse: IResponse; JSONBody: TJSONObject; JSONData, EncodedXml, Base64String, Base64XMLFile: String; Bytes: TBytes; begin { Envia o mesmo arquivo que enviava pra API antiga } Result := ''; try { Cria a requisição } BEARER_TOKEN := AToken; lRequest := CreateRequest(API_BASE_URL + '/v1/FileXml/EnviarArquivoXmlSNGPC', True); lRequest.Accept('application/json'); { Monta o JSON conforme a nova API do SNGPC } { Lê o arquivo XML } Bytes := TFile.ReadAllBytes(Arquivo); { Codifica em Base64 } Base64String := TNetEncoding.Base64.EncodeBytesToString(Bytes); Base64String := StringReplace(Base64String, '#13', '', [rfReplaceAll]); Base64String := StringReplace(Base64String, '#10', '', [rfReplaceAll]); Base64String := StringReplace(Base64String, sLineBreak, '', [rfReplaceAll]); Base64XMLFile := '"' + Base64String + '"'; Logger.Info('JSON enviado à API SNGPC: ' + Base64XMLFile); lResponse := lRequest.AddBody(Base64XMLFile).Post(); LogResponse(lResponse, 'Enviando XML para o SNGPC'); { Verifica a resposta } if lResponse.StatusCode = 200 then begin Logger.Info('Arquivo enviado com sucesso!'); Logger.Info('Resposta da API: ' + lResponse.Content); Result := Trim(lResponse.Content); end else begin Logger.Error('Falha no envio do arquivo. Status Code: ' + lResponse.StatusCode.ToString); Logger.Error('Resposta da API: ' + lResponse.Content); end; except on E: Exception do begin Logger.Error('Erro ao enviar o arquivo: ' + E.Message); Logger.Error(E.StackTrace); end; end; end; Testei seu Código. Obtive esse erro ao tentar pegar o Token ou seja bloqueado por Firewall. Voce consegue Aí ?
Consultores Juliomar Marchetti Postado 24 Dezembro, 2025 Consultores Postado 24 Dezembro, 2025 Em 03/12/2025 at 18:03, claudio.ferreira disse: Testei seu Código. Obtive esse erro ao tentar pegar o Token ou seja bloqueado por Firewall. Voce consegue Aí ? é isso ou credenciais? Juliomar Marchetti Ajude o Projeto ACBr crescer - Seja Pro discord: juliomar telegram: juliomar e-mail: [email protected] http://www.juliomarmarchetti.com.br Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil Participe de nosso canal no Discord e fique ainda mais próximo da Comunidade !!
claudio.ferreira Postado 25 Dezembro, 2025 Autor Postado 25 Dezembro, 2025 18 horas atrás, Juliomar Marchetti disse: é isso ou credenciais? As credenciais que tenho são válidas, por isso suponho que seja do firewall. Outros tiveram o mesmo problema por caminhos diferentes, postman, curl ..
Consultores Juliomar Marchetti Postado 25 Dezembro, 2025 Consultores Postado 25 Dezembro, 2025 1 minuto atrás, claudio.ferreira disse: As credenciais que tenho são válidas, por isso suponho que seja do firewall. Outros tiveram o mesmo problema por caminhos diferentes, postman, curl .. certo como tu sabe isso? rodou em outra internet ou outro local para ter certeza? Juliomar Marchetti Ajude o Projeto ACBr crescer - Seja Pro discord: juliomar telegram: juliomar e-mail: [email protected] http://www.juliomarmarchetti.com.br Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil Participe de nosso canal no Discord e fique ainda mais próximo da Comunidade !!
Recommended Posts
Crie uma conta ou entre para comentar
Você precisar ser um membro para fazer um comentário
Criar uma conta
Crie uma nova conta em nossa comunidade. É fácil!
Crie uma nova contaEntrar
Já tem uma conta? Faça o login.
Entrar Agora