Ir para conteúdo
  • Cadastre-se

Recommended Posts

Postado

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
Postado

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                    

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.  ícone Discórdia Discord   

  • 1 mês depois ...
Postado (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 por joaovictorsp
Postado

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

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

Postado (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 por claudio.ferreira
Postado
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.

image.thumb.png.8e2047201aa2a85a00f999bc8dabb5cf.png

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
Postado

é fácil de conseguir as credenciais de acesso?

 

Consultora ACBr Pro

Juliomar Marchetti

Ajude o Projeto ACBr crescer - Seja Pro

discord: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br

 

MVP_NewLogo_100x100_Transparent-02.png
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 !!

  • 3 semanas depois ...
Postado

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. 

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

 

Postado
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"
}
Postado
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
Postado
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

 

Consultora ACBr Pro

Juliomar Marchetti

Ajude o Projeto ACBr crescer - Seja Pro

discord: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br

 

MVP_NewLogo_100x100_Transparent-02.png
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 !!

Postado (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 por joaovictorsp
Postado
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.

 

  • 3 semanas depois ...
Postado
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

image.png.9f82e5c6605496fa77c7194da9227bf9.png

ou seja bloqueado por Firewall.  Voce consegue Aí ?

 

  • 3 semanas depois ...
  • Consultores
Postado
Em 03/12/2025 at 18:03, claudio.ferreira disse:

Testei seu Código. Obtive esse erro ao tentar pegar o Token

image.png.9f82e5c6605496fa77c7194da9227bf9.png

ou seja bloqueado por Firewall.  Voce consegue Aí ?

 

é isso ou credenciais?

 

Consultora ACBr Pro

Juliomar Marchetti

Ajude o Projeto ACBr crescer - Seja Pro

discord: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br

 

MVP_NewLogo_100x100_Transparent-02.png
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 !!

Postado
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
Postado
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?

 

Consultora ACBr Pro

Juliomar Marchetti

Ajude o Projeto ACBr crescer - Seja Pro

discord: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br

 

MVP_NewLogo_100x100_Transparent-02.png
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 !!

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 conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.