Emissor Fiscal · todos os modelos
NFS-e em mais de 5.000 municípios
+15 milhõesde documentos fiscais por mês
Conheça as soluções Webmania® para o seu negócio e escolha a ideal para sua operação.
Agendar demonstraçãoConsulte condições e serviços disponíveis.
Utilize a REST API da Webmania® para emitir guias de recolhimento de tributos estaduais (GNRE) junto à Secretaria Estadual da Fazenda (SEFAZ) de forma automatizada, com suporte a múltiplas UFs, múltiplos documentos de origem, múltiplas receitas e pagamento via PIX. Deseja emitir outros modelos? Ver documentação
O que é a GNRE? A Guia Nacional de Recolhimento de Tributos Estaduais é o documento usado para recolher, à UF de destino, o ICMS devido em operações interestaduais: o diferencial de alíquotas (DIFAL), o Fundo de Combate à Pobreza (FCP) e o ICMS por substituição tributária (ICMS-ST). Cada guia é emitida por UF favorecida e por receita: uma operação que gera DIFAL e FCP produz duas guias separadas, cada uma com o seu próprio código de barras e a sua própria cobrança.
Na emissão a partir de notas fiscais, esta API deriva sozinha as guias de DIFAL e FCP. As parcelas de ICMS-ST e de FCP-ST são diferidas: a emissão por notas não as deriva e as devolve como recusadas — veja Itens — portanto, nesse caso, emita a guia por valor direto informando a receita.
Atenção: São Paulo e Espírito Santo não são aceitos pela API GNRE. São Paulo não publica receitas GNRE e recolhe o DIFAL e o ICMS-ST pela REST API DARE-ICMS SP; o Espírito Santo não publica as receitas de DIFAL/FCP compostas por esta API e recolhe pela REST API DUA-ES.
Todas as requisições na API devem ser realizadas em ambiente criptografado HTTPS através da URL https://api.webmania.com.br/. O prefixo /2/gnre deve ser adicionado na URL em todas as requisições.
GET /2/gnre/config-uf/{uf} para descobrir as receitas habilitadas e os campos que ela exige.POST /2/gnre/notas/preview — quando emitir a partir de notas fiscais. A prévia não emite nada e não consome cota do plano.POST /2/gnre/emissao informando url_notificacao. A resposta é imediata e traz o uuid.GET /2/gnre/status/{uuid} (sempre disponível) — o recibo SEFAZ chega no identificador do webhook e no provider_identifier do status; opcionalmente consulte o recibo em POST /2/gnre/consulta.POST /2/gnre/consulta, informando no campo recibo o valor obtido no passo anterior.A tabela abaixo lista todos os endpoints disponíveis na API:
| URL | HTTP Verb | Função |
|---|---|---|
/2/gnre/emissao | POST | Emitir lote de guias — por valor direto, por período de notas ou por chaves/UUIDs (retorna uuid para acompanhamento) |
/2/gnre/notas/preview | POST | Prever a seleção de notas e as guias derivadas, sem emitir |
/2/gnre/consulta | POST | Consultar o lote pelo recibo e obter linha digitável, código de barras, PIX e PDF |
/2/gnre/consulta-guias | POST | Consultar guias já emitidas |
/2/gnre/consulta-guias-resultado | POST | Consultar o resultado de um lote de consulta de guias pelo recibo |
/2/gnre/config-uf/{uf} | GET | Consultar receitas habilitadas e campos exigidos pela UF |
/2/gnre/status/{uuid} | GET | Consultar o status da emissão pelo UUID |
Sempre envie o corpo da requisição no formato JSON, e o cabeçalho Content-Type deve estar definido como application/json.
A resposta da API estará sempre no formato JSON, o padrão da estrutura da resposta está disponível nesta seção da documentação.
O webhook é o canal principal de notificação de resultado da API GNRE. Todo payload de emissão deve informar a URL de callback no parâmetro url_notificacao.
O que é o UUID? O UUID (Universally Unique Identifier) é um identificador único de 36 caracteres, no formato 8-4-4-4-12, que a Webmania® atribui a cada emissão. Ele é gerado assim que a requisição é aceita pela API da Webmania® — antes de qualquer transmissão à SEFAZ.
Uma vez gerado, o UUID é definitivo: não muda em retentativas, contingência ou reenvio. O recibo SEFAZ (provider_identifier), o número da guia e o código de barras são campos diferentes, só existem após o processamento e podem mudar — por isso o UUID, e não eles, deve ser a sua referência no banco de dados.
url_notificacao é obrigatória. A emissão retorna HTTP 422 se a URL não for enviada ou for inválida. Quando a guia atingir um status terminal — aprovado ou rejeitado — a Webmania® envia uma requisição POST para a url_notificacao com o resultado completo.
Exemplo do payload enviado pelo webhook na emissão por valores:
{
"uuid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"modelo": "gnre",
"status": "aprovado",
"ambiente": 2,
"identificador": "12345678901234"
} O webhook é aditivo: além dos campos base, esse mesmo payload pode receber os blocos da tabela abaixo, sem alterá-los. A presença de cada bloco depende do modo de emissão e está indicada na respectiva descrição — origem, notas[], notas_ignoradas[] e parcelas_recusadas[] aparecem apenas na emissão por notas (origem = periodo ou chaves), enquanto guias[] também está presente nas emissões por valores quando o resultado contém guias (uma ou mais). Os blocos nunca são enviados vazios — quando não há o que reportar, a chave é simplesmente omitida.
| Campo | Tipo | Descrição |
|---|---|---|
origem | string | A origem da emissão: periodo ou chaves. Presente apenas em emissões por notas. |
notas[] | object | Uma linha por combinação de nota e receita: document_key, valor_icms_st e valor_difal (strings decimais), motivo_ignorado (null se não ignorada) e receita (null sem receita derivada). Nota com DIFAL e FCP gera duas linhas com o mesmo document_key e receitas diferentes. Presente apenas em emissões por notas. |
notas_ignoradas[] | object | Linhas de notas[] com motivo_ignorado preenchido — notas não liquidadas (ex.: st_requer_ie_substituto, sem_icms_st_nem_difal, uf_fora_escopo, nota_cancelada). Permanecem em notas[]. Omitido quando nada foi ignorado. |
guias[] | object | Artefatos de pagamento de cada guia do lote: situacao_guia, uf_favorecida, receita, codigo_barras, codigo_barra_48, linha_digitavel e qrcode_payload (PIX). Saiba mais. Presente quando o resultado do lote já está armazenado; omitido enquanto não há resultado. |
parcelas_recusadas[] | object | Parcelas vST/vFCPST recusadas, fora do total das guias: document_key, receita, parcela, motivo e valor (string decimal). Recolha-as à parte. Presente apenas em emissões por notas; omitido quando nada foi recusado. |
Os campos aditivos descrevem a mesma trilha exposta no endpoint de status e, quando aplicáveis, acompanham qualquer status terminal — inclusive payloads rejeitado, que além deles carregam motivos_rejeicao.
Exemplo de payload de emissão por notas (status aprovado):
{
"uuid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"modelo": "gnre",
"status": "aprovado",
"ambiente": 2,
"identificador": "12345678901234",
"origem": "periodo",
"notas": [
{
"document_key": "35210412345678000123550010000012341123456780",
"valor_icms_st": "250.00",
"valor_difal": "140.25",
"motivo_ignorado": null,
"receita": "100102"
},
{
"document_key": "35210412345678000123550010000012341123456780",
"valor_icms_st": "250.00",
"valor_difal": "140.25",
"motivo_ignorado": null,
"receita": "100129"
},
{
"document_key": "35210412345678000123550010000012341123456780",
"valor_icms_st": "250.00",
"valor_difal": "140.25",
"motivo_ignorado": null,
"receita": "100099"
},
{
"document_key": "35210412345678000123550010000012341123456781",
"valor_icms_st": null,
"valor_difal": null,
"motivo_ignorado": "st_requer_ie_substituto",
"receita": null
}
],
"notas_ignoradas": [
{
"document_key": "35210412345678000123550010000012341123456781",
"valor_icms_st": null,
"valor_difal": null,
"motivo_ignorado": "st_requer_ie_substituto",
"receita": null
}
],
"guias": [
{
"situacao_guia": 0,
"uf_favorecida": "MG",
"receita": "100102",
"codigo_barras": "85840000002 5 99990123021 1 23456789012 7",
"codigo_barra_48": "8584000000259999012302112345678901270000000099999",
"linha_digitavel": "85840.00000 00025.999901 23021.123456 8 9012700000000 99999",
"qrcode_payload": "00020101021226870014br.gov.bcb.pix..."
},
{
"situacao_guia": 0,
"uf_favorecida": "MG",
"receita": "100129",
"codigo_barras": "85850000002 6 99990123021 0 34567890123 7",
"codigo_barra_48": "8585000000269999012302103456789012370000000099999",
"linha_digitavel": "85850.00000 00026.999901 23021.034567 8 9012370000000 99999",
"qrcode_payload": "00020101021226870014br.gov.bcb.pix..."
}
],
"parcelas_recusadas": [
{
"document_key": "35210412345678000123550010000012341123456780",
"receita": "100099",
"parcela": "vST",
"motivo": "st_requer_ie_substituto",
"valor": "250.00"
}
]
} O identificador é o recibo SEFAZ do lote — o mesmo valor exposto em provider_identifier no endpoint de status — e pode ser usado no POST /2/gnre/consulta para obter o resultado guia a guia. Quando status é rejeitado, o payload inclui motivos_rejeicao (lista de {codigo, mensagem}) com o motivo da rejeição.
Nas emissões originadas de notas fiscais (origem periodo ou chaves), o payload inclui também o bloco notas — uma linha por combinação de nota e receita, com document_key, valor_icms_st, valor_difal, motivo_ignorado e receita — e, quando há notas não liquidadas, o bloco notas_ignoradas com as mesmas linhas que carregam motivo_ignorado.
valor_icms_st e valor_difal são totais da nota, repetidos em cada linha. Uma nota que financia mais de uma receita aparece em mais de uma linha — cada uma identificada pelo seu receita — e todas repetem os mesmos totais: não some o array. Para valores agregados por guia, use o bloco guias descrito a seguir.
Quando o processamento do lote termina e o resultado guia a guia está disponível, o payload do webhook e a resposta de GET /2/gnre/status/{uuid} incluem o bloco guias, com um registro de pagamento por guia do lote:
| Parâmetro | Tipo | Descrição |
|---|---|---|
guias[].situacao_guia | number | Situação da guia no retorno da SEFAZ — 0 = processada com sucesso; os demais valores seguem a enumeração da consulta de lote. |
guias[].uf_favorecida | string | UF favorecida da guia. |
guias[].receita | string | Código da receita que a guia quita; presente quando a guia corresponde a uma única receita. |
guias[].codigo_barras | string | Código de barras da guia (44 posições). |
guias[].codigo_barra_48 | string | Código de barras expandido (48 posições). |
guias[].linha_digitavel | string | Linha digitável para pagamento. |
guias[].qrcode_payload | string | Payload do PIX (copia e cola) quando a UF/receita aceitar pagamento via PIX. |
Diferença em relação à consulta de lote: a resposta de POST /2/gnre/consulta documenta os campos situacao_guia, dados, linha_digitavel, codigo_barras, qrcode_payload e motivos_rejeicao. Os campos codigo_barra_48, uf_favorecida e receita existem somente no webhook e no endpoint de status — não os procure na resposta da consulta.
O webhook não dispara para processando nem para erro_comunicacao. O status erro_comunicacao indica que o resultado junto à SEFAZ ficou incerto: a API não reenvia a emissão automaticamente, e a resolução é manual — consulte GET /2/gnre/status/{uuid}, que retorna uma mensagem orientando a conferência com a SEFAZ. Só reemita após confirmar que a guia não foi gerada, para evitar documento fiscal em duplicidade.
Se a comunicação com a SEFAZ falhar e a API esgotar as tentativas sem obter um identificador (recibo), a guia será marcada como rejeitada e o webhook será chamado com a mensagem explicando que houve instabilidade nos servidores da SEFAZ. Nessa situação, o integrador pode tentar emitir novamente.
Para casos em que o webhook não puder ser recebido, acompanhe GET /2/gnre/status/{uuid} como fallback de consulta manual.
A tabela abaixo resume os valores possíveis de status e o comportamento da notificação em cada um:
| Status | Terminal | Dispara webhook | Ação recomendada |
|---|---|---|---|
processando | Não | Não | Aguarde a notificação. Não reenvie a requisição. |
aprovado | Sim | Sim | Guia gerada. Obtenha os artefatos de pagamento (linha digitável, código de barras, PIX e PDF). |
rejeitado | Sim | Sim | A SEFAZ recusou a guia. Consulte o motivo no payload (motivos_rejeicao) e corrija antes de reemitir. |
erro_comunicacao | Sim | Não | O resultado junto à SEFAZ ficou incerto e nenhum webhook é disparado: consulte GET /2/gnre/status/{uuid}. Confirme que a guia não foi gerada antes de reemitir, para evitar documento fiscal em duplicidade. |
O endpoint POST /2/gnre/emissao aceita dois modos de origem, mutuamente exclusivos:
| Valor direto | A partir de notas fiscais | |
|---|---|---|
| Quando usar | Você já sabe o valor e a receita da guia | Você emite NF-e pela Webmania® e quer a guia das operações do período |
| Campo de origem | guias[] | periodo ou documentos[] |
| Quem calcula o valor | Você | A API, a partir das parcelas declaradas na NF-e |
| Quem escolhe a receita | Você | A API, derivando das parcelas — com receita_override opcional |
| Limite | 100 guias por lote, 100 itens por guia, 1.000 itens por lote | 100 notas por requisição |
| Confere antes de emitir | — | POST /2/gnre/notas/preview |
Emissão a partir de notas fiscais. Informe uma janela de emissão em periodo (data_inicio e data_fim) ou uma lista de até 100 identificadores em documentos[]. A API localiza as notas, lê as parcelas de imposto declaradas em cada uma e compõe as guias sozinha — você não precisa calcular nada nem saber qual receita usar.
documentos[] aceita a chave de acesso ou o UUID da nota. O UUID é o mesmo identificador que a REST API de NF-e da Webmania® devolve na emissão e que você já tem gravado no seu banco. Você pode misturar chaves de 44 dígitos e UUIDs no mesmo array: "documentos": [
"35260800000000000000550010000012341123456789",
"8f14e45f-ceea-4d3e-a2e0-123456789012"
] POST /2/gnre/notas/preview executa exatamente a mesma seleção, a mesma derivação de receitas e as mesmas validações da emissão, e devolve as guias que seriam criadas — sem emitir, sem ocupar o lote diário e sem consumir cota do plano. Use a prévia à vontade durante a integração.HTTP 429. Emissões por valor direto não contam para esse limite, que se aplica apenas à emissão por notas. Teste a REST API de GNRE sem escrever uma linha de código e acelere a sua integração com as ferramentas oficiais da Webmania®.
Para acessar os recursos da API, é necessário autenticar as requisições por meio do cabeçalho HTTP (HTTP headers). A autenticação deve ser feita utilizando o cabeçalho Authorization, no seguinte formato:
Authorization: Bearer {Access-Token} O Access-Token da API 2.0 é encontrado no painel Webmania® e deve ser incluído em todas as requisições.
Mantenha suas credenciais em segurança. Nunca publique o Access Token nem a senha do certificado no código-fonte do site, aplicativo ou sistema onde ele possa ser facilmente acessado por terceiros.
Para aplicativos móveis (iOS e Android), recomendamos que a consulta à API seja realizada no servidor (back-end). O código-fonte do aplicativo deve apenas enviar a requisição enquanto o processamento da consulta deve ocorrer no seu servidor.
Todas as respostas da API seguem um padrão e estão no formato JSON, garantindo clareza e facilidade de interpretação.
A tabela abaixo apresenta os códigos de status HTTP que a API pode retornar com suas respectivas descrições. Esses códigos indicam o resultado da operação solicitada e ajudam a entender se a requisição foi bem-sucedida ou se ocorreu alguma falha.
| Código | Significado | Sucesso | Descrição |
|---|---|---|---|
200 | OK | ✅ | Operações bem-sucedidas (GET). |
201 | Created | ✅ | Criação de recursos (POST). |
400 | Bad Request | ❌ | A requisição está incorreta ou possui parâmetros inválidos no corpo (body) da requisição. |
401 | Unauthorized | ❌ | Falha na autenticação. Verifique o token de acesso enviado. |
403 | Forbidden | ❌ | Acesso negado. Não possui permissão para realizar a operação. |
404 | Not Found | ❌ | A guia não foi encontrada para o uuid informado em GET /2/gnre/status/{uuid}. |
422 | Unprocessable Entity | ❌ | Validação dos dados de entrada falhou (ex.: campo obrigatório, formato inválido). |
503 | Service Unavailable | ❌ | Certificado A1 do transmissor ou outro recurso necessário está indisponível. |
Legenda: ✅ a operação foi concluída · ❌ a operação não foi concluída e nada foi criado.
O código 429 (Too Many Requests) não aparece nesta tabela: ele é específico do controle de volume e está descrito em Limite de requisições.
Limite diário do modo por notas: as emissões de GNRE a partir de notas fiscais somam um limite diário de 1.000 guias por empresa. Ao atingir o teto, novas emissões por notas retornam 429 com a mensagem "Limite diário de 1000 emissões por notas atingido. Novas emissões por notas serão liberadas no próximo dia." O limite é renovado à meia-noite (horário de Brasília) e a emissão com valor direto não consome esse limite.
Os códigos abaixo são retornados pela Fazenda dentro do campo situacao_recepcao.codigo (recepção) ou situacao_process.codigo (processamento):
| Código | Descrição | Ação recomendada |
|---|---|---|
100 | Lote recebido com sucesso. | Acompanhe o resultado em GET /2/gnre/status/{uuid} ou no webhook. |
101 | Lote já cadastrado. | O lote já foi recebido — consulte o resultado pelo recibo devolvido. |
102 | Lote com sintaxe inválida. | Revise a estrutura do lote enviado e reenvie corrigido. |
103 | Lote ultrapassa o tamanho máximo permitido. | Divida o lote em partes menores e reenvie. |
104 | Lote com encoding inválido. | Reenvie o lote em UTF-8. |
105 | Lote com schema inválido. | Revise os campos conforme esta documentação e reenvie. |
106 | Lote com versão do schema inválida. | Revise a versão do schema e reenvie. |
107 | Lote com versão dos dados inválida. | Revise os formatos de dados conforme esta documentação e reenvie. |
108 | Lote com identificação do ambiente inválida. | Use ambiente 1 (produção) ou 2 (homologação). |
401 | Lote em processamento. | Aguarde alguns instantes e consulte novamente. |
402 | Lote processado com sucesso. | Confira o resultado individual de cada guia em guias[]. |
403 | Lote processado com pendência. | Verifique as guias com pendência em guias[] e acompanhe o desfecho. |
404 | Lote não localizado. | Confira o número do recibo informado. |
450 | Erro no processamento do lote. | Revise os dados do lote e reenvie. |
501 | Erro no schema do lote. | Revise a estrutura do lote e reenvie. |
502 | Erro na formação do lote. | Revise os dados do lote e reenvie. |
503 | Erro no processamento. | Aguarde e tente novamente — falha transitória do processamento. |
504 | Erro de conexão. | Falha de comunicação com a Fazenda — tente novamente. |
601 | Erro no schema do resultado. | Tente consultar o resultado novamente. |
602 | Número do recibo não cadastrado. | Confira o número do recibo informado. |
603 | Erro no processamento do resultado. | Tente consultar novamente em instantes. |
604 | Erro de conexão no resultado. | Falha de comunicação — tente novamente. |
situacao_recepcao.codigo (recepção) e situacao_process.codigo (processamento). Não os confunda com o campo situacao_consulta, exclusivo de GET /2/gnre/config-uf/{uf}: naquele espaço, os códigos 450–455 descrevem o resultado da consulta de configuração (ex.: 450 = consulta realizada com sucesso), enquanto nesta tabela o 450 indica erro no processamento do lote. Os códigos de situacao_consulta estão listados na seção Configuração de UF. Exemplo de resposta para uma requisição com erro:
{
"error": "Parâmetro inválido: uf_favorecida. O valor XX não é uma UF válida."
}
Emite um lote de guias GNRE junto à Secretaria Estadual da Fazenda (SEFAZ). A emissão é assíncrona: a API retorna imediatamente, processa o lote em background e notifica o resultado final pelo webhook informado em url_notificacao. O acompanhamento individual da guia é feito por GET /2/gnre/status/{uuid} — Saiba mais.
O que é um lote? Uma requisição de emissão envia um lote, que contém uma ou mais guias; cada guia contém um ou mais itens (documentos de origem ou receitas), e cada item carrega os valores a recolher. O lote é transmitido de uma vez à SEFAZ e recebe um recibo único; cada guia, porém, é um documento pagável independente e é contada individualmente na cobrança.
| Limite | Valor |
|---|---|
| Guias por lote | 100 |
| Itens por guia | 100 |
| Itens por lote | 1.000 |
SP e ES não emitem via GNRE e são rejeitadas com HTTP 422 na validação:SP não é aceito na API GNRE. Utilize a API DARE-ICMS SP (/2/dare).ES não é aceito na API GNRE. Utilize a API DUA-ES (/2/dua).uf_favorecida do lote é SP ou ES. 0 - Guia Simples: uma guia com um item e uma receita.1 - Múltiplos Documentos de Origem: uma guia com vários documentos de origem (até 100 itens).2 - Múltiplas Receitas: uma guia com várias receitas diferentes.Parâmetros da requisição:
| Parâmetro | Obrigatório | Tipo | Tam. | Descrição |
|---|---|---|---|---|
ambiente | Obrigatório | number | 1 | Ambiente da emissão.1 = Produção |
url_notificacao | Obrigatório | URL | 500 | URL do webhook que receberá a notificação quando a guia atingir status terminal (aprovado ou rejeitado). |
guias | Obrigatório | array | 1-100 | Lista de guias do lote. Cada lote pode conter até 100 guias. |
ambiente aceita 1 (produção) e 2 (homologação). Em homologação, as requisições de emissão são limitadas a 1 por segundo por empresa — acima disso a API responde HTTP 429 com Retry-After: 1. Em produção (ambiente: 1) não há esse limite. Para guias do tipo 0 (simples), informe uma única guia com um único item.
| Parâmetro | Obrigatório | Tipo | Tam. | Descrição |
|---|---|---|---|---|
uf_favorecida | Obrigatório | string | 2 | UF favorecida (ex.: MG, RJ, BA). |
tipo_gnre | Obrigatório | number | 1 | Tipo da guia.0 = Simples |
contribuinte_emitente | Obrigatório | object | - | Dados do contribuinte emitente. Saiba mais |
itens | Obrigatório | array | 1-100 | Itens da guia. Saiba mais |
valor_gnre | Opcional | number | 12,2 | Valor total da guia. Se omitido, será calculado pela soma dos itens. |
data_pagamento | Opcional | date | 10 | Data de pagamento no formato yyyy-MM-dd. |
identificador_guia | Opcional | string | 1-10 | Identificador externo da guia. |
O campo tipo_gnre define a estrutura da guia: 0 = guia simples (um item, uma receita); 1 = guia de múltiplos documentos (cada item é um documento de origem diferente, até 100 itens); 2 = guia de múltiplas receitas (cada item é uma receita diferente, até 100 itens). Todos os itens de uma guia compartilham a mesma data de vencimento e o mesmo contribuinte emitente.
tipo_gnre = 1)Para guias do tipo 1, cada item representa um documento de origem diferente que financia a mesma receita (até 100 itens por guia). Use esse tipo quando uma obrigação é composta por vários documentos — por exemplo, várias NF-e de saída recolhendo DIFAL para a mesma UF sob a mesma receita. Cada item informa o próprio documento_origem e os seus valores; os demais campos do item podem repetir-se ou variar conforme a exigência da UF.
Exemplo — estrutura de uma guia tipo 1 dentro de guias[], dois documentos sob a mesma receita 100102:
{
"uf_favorecida": "MG",
"tipo_gnre": 1,
"itens": [
{ "receita": "100102", "documento_origem": { "numero": "3526071234567890123455900012345678", "tipo": "01" }, "data_vencimento": "2026-08-20", "valores": [ { "tipo": 11, "valor": 100.00 } ] },
{ "receita": "100102", "documento_origem": { "numero": "3526071234567890123455900087654321", "tipo": "01" }, "data_vencimento": "2026-08-20", "valores": [ { "tipo": 11, "valor": 250.00 } ] }
]
} tipo_gnre = 2)Para guias do tipo 2, cada item representa uma receita diferente dentro da mesma guia (até 100 itens por guia). Nem toda UF aceita este tipo de guia: a lista de tipos permitidos é publicada por receita em tipos_gnre na Configuração de UF, e uma combinação não publicada é recusada com HTTP 422.
Exemplo — estrutura de uma guia tipo 2 dentro de guias[], DIFAL e FCP na mesma guia:
{
"uf_favorecida": "GO",
"tipo_gnre": 2,
"itens": [
{ "receita": "100102", "data_vencimento": "2026-08-20", "valores": [ { "tipo": 11, "valor": 350.00 } ] },
{ "receita": "100129", "data_vencimento": "2026-08-20", "valores": [ { "tipo": 12, "valor": 12.30 } ] }
]
} Cada item da guia contém a receita, o documento de origem, os valores, a referência e dados do destinatário quando exigido.
Receitas compostas por esta API. O código da receita identifica qual tributo está sendo recolhido. As receitas abaixo são as que a emissão desta API trata quando publicadas pela UF favorecida: a disponibilidade de cada código é por UF, e a relação vigente é a que a UF publica na Configuração de UF (GET /2/gnre/config-uf/{uf}) — consulte-a antes de emitir, pois ela é a lista autoritativa. O 100002 está disponível somente nas UFs que o relacionam nessa resposta; receita que a UF favorecida não publica é recusada com HTTP 422 na emissão.
| Receita | Nome | Origem |
|---|---|---|
100102 | ICMS DIFAL de destino — por Operação (EC 87/15) | Derivada de vICMSUFDest |
100129 | Fundo de Combate à Pobreza — por Operação (EC 87/15) | Derivada de vFCPUFDest |
100002 | ICMS CONSUMIDOR FINAL NÃO CONTRIBUINTE | Somente por valor direto |
100099 | ICMS Substituição Tributária | Somente por valor direto — não emite por notas (saiba por quê) |
100110 | ICMS DIFAL de destino — por Apuração | Somente via receita_override |
100137 | Fundo de Combate à Pobreza — por Apuração | Somente via receita_override |
As receitas "por Apuração" (100110 e 100137) nunca são derivadas automaticamente das notas: elas só entram na guia por receita_override (descrito mais abaixo) e, como qualquer substituição, continuam sujeitas à validação de configuração da UF — uma receita que a UF não publica é recusada com HTTP 422.
| Parâmetro | Obrigatório | Tipo | Tam. | Descrição |
|---|---|---|---|---|
receita | Obrigatório | string | 6 | Código da receita (ex.: 100002). |
detalhamento_receita | Opcional | string | 6 | Detalhamento da receita quando a UF exige. Aceita exatamente 6 dígitos — envie o código publicado em config-uf sem remover os zeros à esquerda. |
documento_origem | Opcional | object | - | Documento de origem. Saiba mais |
produto | Opcional | string | 1-4 | Código do produto. |
referencia | Opcional | object | - | Período de referência. Saiba mais |
data_vencimento | Obrigatório | date | 10 | Data de vencimento no formato yyyy-MM-dd. |
valores | Obrigatório | array | 1-10 | Valores do item. Saiba mais |
convenio | Opcional | string | 30 | Número do convênio quando exigido. |
contribuinte_destinatario | Opcional | object | - | Dados do destinatário quando exigido pela UF. Saiba mais |
campos_extras | Opcional | array | 0-3 | Campos extras definidos pela UF. Saiba mais |
numero_controle | Opcional | string | 1-20 | Número de controle do item. |
numero_controle_fecp | Opcional | string | 1-20 | Número de controle FECP. |
| Parâmetro | Obrigatório | Tipo | Tam. | Descrição |
|---|---|---|---|---|
numero | Obrigatório | string | 1-44 | Número do documento de origem. |
tipo | Obrigatório | string | 2 | Tipo do documento de origem, com 2 dígitos (ex.: 01). Os códigos válidos são publicados por UF em tipos_documentos_origem na resposta de GET /2/gnre/config-uf/{uf}; a API repassa o valor sem catálogo próprio. |
Cada valor é composto pelo tipo e pelo valor monetário. Os tipos de valor seguem a tabela abaixo:
| Tipo | Descrição |
|---|---|
11 | Principal ICMS |
12 | Principal Fundo de Combate à Pobreza (FCP) |
21 | Total ICMS |
22 | Total FCP |
31 | Multa ICMS |
32 | Multa FCP |
41 | Juros ICMS |
42 | Juros FCP |
51 | Atualização Monetária ICMS |
52 | Atualização Monetária FCP |
| Parâmetro | Obrigatório | Tipo | Tam. | Descrição |
|---|---|---|---|---|
tipo | Obrigatório | number | 2 | Tipo do valor conforme tabela acima. |
valor | Obrigatório | number | 12,2 | Valor monetário. |
Período de referência para pagamento do imposto.
| Parâmetro | Obrigatório | Tipo | Tam. | Descrição |
|---|---|---|---|---|
periodo | Opcional | number | 1 | Período de referência.0 = Mensal |
mes | Opcional | number | 1-2 | Mês de referência (1 a 12). |
ano | Opcional | number | 4 | Ano de referência (ex.: 2026). |
parcela | Opcional | number | 1-3 | Número da parcela (1 a 999). |
Dados de identificação do contribuinte emitente da guia.
| Parâmetro | Obrigatório | Tipo | Tam. | Descrição |
|---|---|---|---|---|
tipo_identificacao | Obrigatório | number | 1 | Tipo de identificação.1 = CNPJ |
cnpj | Obrigatório quando tipo_identificacao = 1 | string | 14 | CNPJ do emitente. |
cpf | Obrigatório quando tipo_identificacao = 2 | string | 11 | CPF do emitente. |
inscricao_estadual | Opcional | string | 2-16 | Inscrição estadual. |
razao_social | Opcional | string | 60 | Razão social. |
endereco | Opcional | string | 60 | Endereço. |
municipio | Opcional | string | 5 | Cinco primeiras posições do código IBGE do município (ex.: 35503 para São Paulo, cujo código completo é 3550308). |
uf | Opcional | string | 2 | UF. |
cep | Opcional | string | 8 | CEP (somente números). |
telefone | Opcional | string | 6-11 | Telefone (somente números). |
Dados do contribuinte destinatário, obrigatório quando a UF exigir.
| Parâmetro | Obrigatório | Tipo | Tam. | Descrição |
|---|---|---|---|---|
tipo_identificacao | Obrigatório | number | 1 | Tipo de identificação.1 = CNPJ |
cnpj | Obrigatório quando tipo_identificacao = 1 | string | 14 | CNPJ do destinatário. |
cpf | Obrigatório quando tipo_identificacao = 2 | string | 11 | CPF do destinatário. |
inscricao_estadual | Opcional | string | 2-16 | Inscrição estadual. |
razao_social | Opcional | string | 60 | Razão social. |
endereco | Opcional | string | 60 | Endereço. |
municipio | Opcional | string | 5 | Cinco primeiras posições do código IBGE do município (ex.: 35503 para São Paulo, cujo código completo é 3550308). |
uf | Opcional | string | 2 | UF. |
cep | Opcional | string | 8 | CEP. |
telefone | Opcional | string | 6-11 | Telefone. |
Campos extras definidos pela configuração da UF, quando uma receita da UF os exige. Cada item aceita no máximo 3 campos extras; o codigo é um inteiro e o valor, uma string de até 100 caracteres. Você descobre que a UF exige campos extras pelo sinalizador exige_campos_adicionais: "S" na configuração da receita, em GET /2/gnre/config-uf/{uf}; a relação de códigos é publicada no portal nacional do GNRE.
| Parâmetro | Obrigatório | Tipo | Tam. | Descrição |
|---|---|---|---|---|
codigo | Obrigatório | integer | - | Código do campo extra. |
valor | Obrigatório | string | 100 | Valor do campo extra. |
curl -X POST \
-H "Authorization: Bearer SEU_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
https://api.webmania.com.br/2/gnre/emissao
{
"ambiente": 2,
"url_notificacao": "https://seudominio.com.br/webhook/gnre",
"guias": [
{
"uf_favorecida": "MG",
"tipo_gnre": 0,
"contribuinte_emitente": {
"tipo_identificacao": 1,
"cnpj": "12345678000195",
"inscricao_estadual": "123456789012",
"razao_social": "EMPRESA EXEMPLO LTDA",
"endereco": "RUA EXEMPLO 100",
"municipio": "35503",
"uf": "SP",
"cep": "01001000",
"telefone": "11999999999"
},
"itens": [
{
"receita": "100002",
"detalhamento_receita": "000001",
"documento_origem": {
"numero": "3526071234567890123455900012345678",
"tipo": "01"
},
"data_vencimento": "2026-07-20",
"valores": [
{ "tipo": 11, "valor": 100.00 }
],
"referencia": {
"periodo": 0,
"mes": 7,
"ano": 2026
},
"contribuinte_destinatario": {
"tipo_identificacao": 1,
"cnpj": "11222333000181",
"inscricao_estadual": "987654321098",
"razao_social": "DESTINATARIO EXEMPLO LTDA",
"endereco": "RUA DESTINO 200",
"municipio": "35503",
"uf": "SP",
"cep": "01002000"
}
}
],
"data_pagamento": "2026-07-20"
}
]
} Resposta da Webmania®:
{
"status": "processando",
"message": "Emissão em processamento. Consulte novamente em alguns instantes.",
"uuid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
} uuid retornado. O resultado final será enviado para a url_notificacao quando a guia atingir aprovado ou rejeitado. Para acompanhar a qualquer momento, consulte GET /2/gnre/status/{uuid} — quando o lote já tiver sido processado, o campo provider_identifier traz o recibo SEFAZ, que pode ser usado no POST /2/gnre/consulta para obter o resultado guia a guia. O POST /2/gnre/emissao — o mesmo endpoint da emissão por valor direto — também aceita a origem por notas. Além do valor direto (guias), o GNRE pode ser emitido a partir de notas fiscais já emitidas, informando uma janela de emissão (periodo) ou uma lista de identificadores (documentos). Os dois modos são mutuamente exclusivos entre si e não podem ser combinados com guias.
As receitas de cada guia são derivadas das parcelas de imposto declaradas na própria NF-e — veja a derivação de receitas: uma nota que carrega DIFAL e FCP gera duas guias separadas, e cada guia é um documento pagável contado individualmente na cobrança.
Na origem por notas, o lote é composto pela API: os campos abaixo são informados na raiz da requisição e copiados para cada guia/item composto.
POST /2/gnre/notas/preview (saiba mais), que executa as mesmas validações da emissão. Parâmetros da requisição (origem por notas):
| Parâmetro | Obrigatório | Tipo | Tam. | Descrição |
|---|---|---|---|---|
ambiente | Obrigatório | number | 1 | Ambiente da emissão.1 = Produção |
url_notificacao | Obrigatório | URL | 500 | URL do webhook que receberá a notificação quando a guia atingir status terminal (aprovado ou rejeitado). |
periodo.data_inicioperiodo.data_fim | Obrigatório quando a origem for por período | date | 10 | Janela de emissão das notas, no formato yyyy-MM-dd. Mutuamente exclusivo com documentos e com guias. |
documentos | Obrigatório quando a origem for por chaves | array | 1-100 | Chaves de acesso (44 dígitos) ou UUIDs das notas, sem duplicatas. Máximo de 100 documentos. Mutuamente exclusivo com periodo e com guias. |
data_vencimento | Obrigatório | date | 10 | Vencimento do lote, no formato yyyy-MM-dd. A política de vencimento é do contribuinte e a API não arbitra um vencimento padrão. |
data_pagamento | Obrigatório | date | 10 | Data de pagamento, no formato yyyy-MM-dd. É escolha do contribuinte e define a validade da guia — a API não arbitra uma data padrão. |
convenio | Opcional* | string | 30 | Convênio/Protocolo ICMS que autoriza a substituição tributária no par (UF, receita). *A obrigatoriedade segue o estado publicado na configuração GNRE da UF para o par (exige_convenio na Configuração de UF), na escala N/S/O: N = não exigido, S = opcional (aceito, nunca obrigatório) e O = exigido — somente o O torna o envio obrigatório; quando exigido e ausente, a emissão recusa com HTTP 422 nomeando o campo. Não é derivável de nota alguma e nunca é inventado pela API. |
referencia | Opcional | object | - | Competência do fato gerador {periodo, mes, ano, parcela} — derivada da data de emissão da nota: nas receitas por operação (100102/100129) a competência é o mês de emissão e o período é cota única. Informe apenas para sobrescrever a derivação; nunca é obrigatória. |
receita_override | Opcional | object | - | Mapa receita derivada → receita substituta (códigos de 6 dígitos), ex.: {"100102": "100110"} emite o DIFAL por Apuração em vez de por Operação. Substitui a derivação mas não dispensa a validação de configuração da UF — veja Overrides. |
detalhamento_receita_override | Opcional | object | - | Mapa receita → código de detalhamento, ex.: {"100129": "009888"}. É o único caminho para emitir por notas nos pares em que o detalhamento é obrigatório e não consta da nota (MT nas receitas 100102/100129; AL na 100129) — sem o override, a emissão recusa com HTTP 422 nomeando UF, receita e a lista de opções publicada pela própria UF. |
Exemplo — período de emissão:
curl -X POST \
-H "Authorization: Bearer SEU_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
https://api.webmania.com.br/2/gnre/emissao
{
"ambiente": 2,
"url_notificacao": "https://seudominio.com.br/webhook/gnre",
"data_vencimento": "2026-08-20",
"data_pagamento": "2026-08-20",
"periodo": {
"data_inicio": "2026-07-01",
"data_fim": "2026-07-31"
}
} Exemplo — chaves de acesso / UUIDs, com override e convênio opcionais:
curl -X POST \
-H "Authorization: Bearer SEU_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
https://api.webmania.com.br/2/gnre/emissao
{
"ambiente": 2,
"url_notificacao": "https://seudominio.com.br/webhook/gnre",
"data_vencimento": "2026-08-20",
"data_pagamento": "2026-08-20",
"documentos": [
"35260700000000000000550010000012341123456789",
"8f14e45f-ceea-4d3e-a2e0-123456789012"
],
"convenio": "123456789012345678901234567890",
"receita_override": { "100102": "100110" },
"detalhamento_receita_override": { "100129": "009888" }
} Resposta da Webmania® (emissão enfileirada — o processamento é assíncrono):
{
"status": "processando",
"message": "Emissão em processamento. Consulte novamente em alguns instantes.",
"uuid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"parcelas_recusadas": [
{
"document_key": "35260700000000000000550010000012441123456790",
"receita": "100099",
"parcela": "vST",
"motivo": "st_requer_ie_substituto",
"valor": "45.00",
"mensagem": "ICMS-ST (receita 100099) não pode ser emitido por notas: depende da inscrição estadual de substituto tributário do contribuinte na UF de destino, que não consta da nota. Emita esta guia por valor direto informando a receita."
}
]
} O bloco parcelas_recusadas aparece somente quando uma nota selecionada carrega uma parcela recusada — a ausência do bloco significa que a emissão cobriu tudo o que selecionou. O resultado final chega pelo webhook em url_notificacao e pode ser acompanhado em GET /2/gnre/status/{uuid} (saiba mais).
Informe data_vencimento (AAAA-MM-DD) para emissão de GNRE por notas. A política de vencimento é do contribuinte e a API não arbitra um vencimento padrão.Informe data_pagamento (AAAA-MM-DD) para emissão de GNRE por notas. A data de pagamento é escolha do contribuinte e define a validade da guia; a API não arbitra uma data padrão.Nenhuma nota elegível para emissão de GNRE. com notas_ignoradas listando cada nota recusada e seu motivo_ignorado.vST/vFCPST são ignoradas com st_requer_ie_substituto / fcp_st_requer_ie_substituto; quando a nota tem outras parcelas emitíveis e carrega uma parcela de ST, ela aparece em parcelas_recusadas. Em ambos os casos, emita essas parcelas por valor direto informando a receita (e o detalhamento, quando aplicável)./2/dare) e ES não publica as receitas que esta API compõe, 100102/100110/100129/100137 (use a API DUA-ES, /2/dua).451 receita não cadastrada, 452 receita não relacionada a esta UF, 453 UF não cadastrada no ambiente, 454 UF não habilitada no ambiente, 455 nenhuma receita habilitada — e 422 também para receita ausente da lista da UF). Se a configuração não puder ser obtida (SEFAZ indisponível, falha de certificado), a emissão responde 503: a API nunca emite sem validar.POST /2/gnre/notas/preview antecipa, sem emitir nada, a seleção de notas que POST /2/gnre/emissao faria para a mesma origem (periodo ou documentos) e o mesmo ambiente. A prévia executa o mesmo motor de seleção, a derivação de receitas e toda a validação de configuração de UF da emissão — inclusive as mesmas recusas com as mesmas mensagens — e devolve as guias previstas antes de qualquer confirmação.
HTTP 429. Emissões por valor direto não contam para esse limite, que se aplica apenas à emissão por notas. Os parâmetros de origem são os mesmos da Emissão por Notas: ambiente e a origem (periodo ou documentos, mutuamente exclusivos). O url_notificacao não se aplica a este endpoint.
Campos da resposta:
| Parâmetro | Tipo | Descrição |
|---|---|---|
tipo | string | Sempre gnre neste endpoint. |
selecionadas[] | array | Notas elegíveis: fiscal_document_uuid, document_key, valor_icms_st, valor_difal e as parcelas individuais (valor_icms_st_proprio, valor_fcp_st, valor_icms_uf_dest, valor_fcp_uf_dest), uf_destino e guia_indicado. |
ignoradas[] | array | Notas recusadas, com motivo_ignorado e, quando aplicável, guia_indicado e mensagem (motivos de ICMS-ST/FCP-ST, abaixo). |
totais | object | Somas em texto decimal: icms_st, difal e total. |
total_encontradastotal_omitidaslimite_por_requisicao | integer | Somente na origem por periodo: total de notas encontradas na janela, quantas ficaram de fora e o limite de notas por requisição — sempre 100 notas. Um período acima desse limite responde 422 com a mesma contabilização da emissão, sem emitir nada. |
guias_previstas[] | array | Uma entrada por guia derivada: uf_favorecida, receita, tipo_gnre, quantidade_notas e valor — com detalhamento_receita e/ou documento_origem quando presentes. tipo_gnre é 0 quando a guia prevista tem um único item (uma nota) e 1 quando agrupa várias notas sob a mesma (UF, receita) — nunca 2: receitas diferentes são sempre guias separadas. |
parcelas_recusadas[] | array | Presente somente quando há parcelas recusadas: document_key, receita, parcela (vST ou vFCPST), motivo, valor e mensagem. |
Exemplo de requisição:
curl -X POST \
-H "Authorization: Bearer SEU_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
https://api.webmania.com.br/2/gnre/notas/preview
{
"ambiente": 2,
"periodo": {
"data_inicio": "2026-07-01",
"data_fim": "2026-07-31"
}
} Exemplo de resposta:
{
"tipo": "gnre",
"selecionadas": [
{
"fiscal_document_uuid": "8f14e45f-ceea-4d3e-a2e0-123456789012",
"document_key": "35260700000000000000550010000012341123456789",
"valor_icms_st": "0.00",
"valor_difal": "362.30",
"valor_icms_st_proprio": "0.00",
"valor_fcp_st": "0.00",
"valor_icms_uf_dest": "350.00",
"valor_fcp_uf_dest": "12.30",
"uf_destino": "GO",
"guia_indicado": "gnre"
}
],
"ignoradas": [
{
"fiscal_document_uuid": "9d32fa10-bb21-4e7c-9100-987654321098",
"document_key": "35260700000000000000550010000012441123456790",
"valor_icms_st": null,
"valor_difal": null,
"motivo_ignorado": "st_requer_ie_substituto",
"mensagem": "ICMS-ST (receita 100099) não pode ser emitido por notas: depende da inscrição estadual de substituto tributário do contribuinte na UF de destino, que não consta da nota. Emita esta guia por valor direto informando a receita."
}
],
"totais": { "icms_st": "0.00", "difal": "362.30", "total": "362.30" },
"total_encontradas": 2,
"total_omitidas": 0,
"limite_por_requisicao": 100,
"guias_previstas": [
{ "uf_favorecida": "GO", "receita": "100102", "tipo_gnre": 0, "quantidade_notas": 1, "valor": "350.00" },
{ "uf_favorecida": "GO", "receita": "100129", "tipo_gnre": 0, "quantidade_notas": 1, "valor": "12.30" }
]
} Para cada nota, a receita GNRE é derivada das próprias parcelas de imposto declaradas na NF-e. Uma nota que carrega as duas parcelas abaixo gera duas guias previstas separadas — nunca dois itens de uma mesma guia — e cada guia é um documento pagável: a emissão confirma 2 guias e a cobrança conta 2 (uma unidade por guia). No exemplo acima, os totais refletem essa soma: totais.difal e totais.total totalizam 350.00 + 12.30 = 362.30, exatamente a soma de guias_previstas[].valor. Quando essa mesma nota também carrega uma parcela de substituição tributária (vST/vFCPST), a parcela é recusada com motivo próprio e aparece como uma terceira linha no bloco parcelas_recusadas[] da resposta — nunca é somada às guias derivadas e nunca é descartada em silêncio:
| Parcela da NF-e | Receita derivada | Descrição |
|---|---|---|
vICMSUFDest | 100102 | ICMS DIFAL de destino — por Operação (EC 87/15). |
vFCPUFDest | 100129 | Fundo de Combate à Pobreza — por Operação (EC 87/15). |
Os códigos "por Apuração" (100110 para DIFAL e 100137 para FCP) nunca substituem os acima automaticamente; para usá-los, informe o receita_override descrito mais abaixo.
vST (receita 100099) e a parcela vFCPST são recusadas com motivo próprio nas respostas (motivo_ignorado/motivo: st_requer_ie_substituto e fcp_st_requer_ie_substituto). O motivo é o mesmo da emissão: a emissão de ICMS-ST depende da inscrição estadual de substituto tributário do contribuinte na UF de destino, que não consta da NF-e; e, para o FCP de ST, a distinção entre FCP por operação (EC 87/15) e FCP de substituição tributária é feita pelo detalhamento da receita, que também não consta da nota — emitir sob a receita 100129 sem detalhamento quitaria o tributo errado. Para essas parcelas, emita a guia por valor direto informando a receita (e o detalhamento, quando aplicável). As recusas aparecem em duas superfícies diferentes:
ignoradas[], com motivo_ignorado: a nota inteira ficou de fora da seleção. É o caso da nota que só carrega as parcelas de ST — sem DIFAL nem FCP emitíveis, ela não seleciona no endpoint.parcelas_recusadas[], com motivo, parcela e valor: a parcela recusada pertence a uma nota selecionada — a nota emitiu suas guias derivadas e a parcela de ST ficou de fora, declarada aberta em vez de mergulhada no total. É por isso que o mesmo par pode aparecer duas vezes na resposta: uma nota com vFCPUFDest e vFCPST figura nas guias previstas sob a receita 100129 e, sob a mesma document_key e a mesma receita 100129, no bloco de recusadas — o que distingue as duas linhas é o campo parcela.No corpo de sucesso da emissão por notas, o bloco parcelas_recusadas[] também é anexado, quando existe recusa — o total da guia não cobre essas parcelas, e a resposta é o único lugar onde você fica sabendo disso no momento da emissão.
As notas cuja UF de destino é SP ou ES não são selecionadas para GNRE, e as duas recusas são fatos distintos:
guia_indicado: "dare": utilize a API DARE-ICMS SP (/2/dare).100102/100110/100129/100137). Notas com destino ES são indicadas com guia_indicado: "dua": utilize a API DUA-ES (/2/dua).Duas chaves opcionais permitem substituir a composição derivada (valores de 6 dígitos), tanto na emissão quanto na prévia. A substituição nunca recria uma parcela recusada (ICMS-ST/FCP-ST) e nunca pula a validação de configuração da UF:
| Parâmetro | Tipo | Descrição |
|---|---|---|
receita_override | object | Mapa receita derivada → receita substituta, ex.: {"100102": "100110"} emite o DIFAL por Apuração em vez de por Operação. |
detalhamento_receita_override | object | Mapa receita → código de detalhamento, ex.: {"100129": "009888"} informa o detalhamento que distingue, p. ex., FCP por operação de FCP de substituição tributária. Cada valor aceita exatamente 6 dígitos, como publicado em config-uf (detalhamentos_receita) — os zeros à esquerda fazem parte do código. O detalhamento aceito aparece em guias_previstas[].detalhamento_receita. |
Consulta o resultado do processamento de um lote de guias GNRE a partir do número do recibo SEFAZ. Com a emissão assíncrona, o recibo não é mais retornado na resposta imediata: ele fica disponível no campo identificador do webhook e no campo provider_identifier de GET /2/gnre/status/{uuid}.
Para consultar o resultado de um lote, envie uma requisição POST para /2/gnre/consulta.
| Parâmetro | Obrigatório | Tipo | Tam. | Descrição |
|---|---|---|---|---|
ambiente | Obrigatório | number | 1 | Ambiente da consulta.1 = Produção |
recibo | Obrigatório | string | 10/14 | Número do recibo SEFAZ com 10 ou 14 dígitos — use exatamente o valor recebido (campo identificador do webhook ou provider_identifier do status), sem remover ou completar zeros. |
incluir_pdf_guias | Opcional | string | 1 | Incluir PDF das guias.S = Sim |
incluir_arquivo_pagamento | Opcional | string | 1 | Incluir arquivo de pagamento. |
incluir_noticias | Opcional | string | 1 | Incluir notícias. |
curl -X POST \
-H "Authorization: Bearer SEU_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
https://api.webmania.com.br/2/gnre/consulta
{
"ambiente": 2,
"recibo": "12345678901234",
"incluir_pdf_guias": "S"
} A resposta contém a situação do processamento e o resultado de cada guia do lote.
| Parâmetro | Tipo | Descrição |
|---|---|---|
situacao_process.codigo | number | Código da situação do processamento — a lista completa está em Códigos de erro da GNRE. |
situacao_process.descricao | string | Descrição da situação. |
guias | array | Lista de guias processadas — presente somente quando o lote já foi processado (situacao_process.codigo = 402). Enquanto o lote estiver em processamento (401), o campo não é retornado. |
guias[].situacao_guia | number | Situação da guia:0 = Processada com sucesso1 = Invalidada no portal2 = Invalidada na UF3 = Erro de comunicação4 = PendênciaPode vir null quando a guia ainda não tem desfecho na SEFAZ — trate como "processamento em andamento". |
guias[].dados | object | Dados da guia retornados pela Fazenda (eco da emissão enviada). |
guias[].linha_digitavel | string | Linha digitável para pagamento. |
guias[].codigo_barras | string | Código de barras (44 posições). |
guias[].qrcode_payload | string | Payload PIX para pagamento. |
guias[].motivos_rejeicao | array | Motivos de rejeição quando aplicável. |
pdf_guias | string | PDF das guias em base64 (quando incluir_pdf_guias=S). |
arquivo_pagamento | string | Arquivo de pagamento quando disponível. |
noticias | array | Notícias retornadas pela Fazenda. |
Exemplo de resposta:
{
"situacao_process": {
"codigo": 402,
"descricao": "Lote processado com sucesso"
},
"guias": [
{
"situacao_guia": 0,
"dados": {
"uf_favorecida": "MG",
"tipo_gnre": 0,
"valor_gnre": "150.00",
"contribuinte_emitente": {
"identificacao": "00000000000000",
"razao_social": "Empresa Exemplo LTDA"
},
"itens_gnre": {
"item": [
{
"receita": "100102",
"detalhamento_receita": "000001",
"valor": "150.00"
}
]
},
"identificador_guia": "100102000000000"
},
"linha_digitavel": "123456789012345678901234567890123456789012345678",
"codigo_barras": "12345678901234567890123456789012345678901234",
"qrcode_payload": "0002012658...",
"motivos_rejeicao": []
}
],
"pdf_guias": "JVBERi0xLjQKJdPr6eEK...",
"noticias": []
} Quando a guia for processada com sucesso, a consulta pode retornar:
linha_digitavel: linha digitável de 48 posições para pagamento em qualquer banco.codigo_barras: código de barras de 44 posições.qrcode_payload: payload do PIX (copia e cola) quando a UF/receita aceitar pagamento via PIX.pdf_guias: guia em formato PDF codificado em base64 quando incluir_pdf_guias=S.incluir_pdf_guias=S apenas quando necessário. Consulta o status de uma emissão GNRE pelo uuid retornado na resposta imediata da emissão. Endpoint: GET /2/gnre/status/{uuid}. Prefira a notificação por webhook — ela chega assim que o desfecho existe.
| Parâmetro | Obrigatório | Tipo | Tam. | Descrição |
|---|---|---|---|---|
uuid | Obrigatório | string | 36 | UUID retornado na emissão (parâmetro de rota). |
A resposta base é:
{
"status": "processando",
"uuid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"provider_identifier": null
} Os campos variam conforme o status:
| Status | Campos adicionais |
|---|---|
processando | Nenhum. provider_identifier passa a conter o recibo SEFAZ assim que o lote é enviado. |
aprovado | response: payload completo do resultado da emissão (guia a guia). |
rejeitado | motivos_rejeicao: lista de {codigo, mensagem}; last_error_code: código do último erro. |
erro_comunicacao | message: orientação de reconciliação manual com a SEFAZ (ver exemplo abaixo). |
Além dos campos por status, a resposta inclui campos adicionais ligados à origem da emissão, quando presentes:
| Campo | Quando aparece | Conteúdo |
|---|---|---|
origem | Emissões originadas por notas. | periodo (seleção por período) ou chaves (seleção por chaves) — identifica o modo de emissão. |
notas | Emissões originadas por notas. | Trilha nota a nota: uma linha por nota × receita derivada, com document_key (chave da NF-e), valor_icms_st, valor_difal, motivo_ignorado (preenchido quando a nota ficou de fora) e receita (código GNRE financiado por aquela linha). |
notas_ignoradas | Quando alguma nota ficou fora da emissão. | Índice das linhas de notas que têm motivo_ignorado preenchido. Nada é removido de notas. |
guias | Lotes GNRE, quando o resultado do lote já existe — em qualquer status. | Uma entrada de pagamento por guia do lote (linha digitável, código de barras e PIX de cada guia), inclusive em lotes por valor direto com múltiplas guias. |
parcelas_recusadas | Quando a derivação recusou parcelas ICMS-ST/FCP-ST das notas. | Uma entrada por parcela recusada (document_key, receita, parcela, motivo, valor). Esses valores não são cobertos pela guia emitida. |
Exemplo — status erro_comunicacao (resultado incerto; não dispara webhook):
{
"status": "erro_comunicacao",
"uuid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"provider_identifier": null,
"message": "Status incerto. A guia pode ter sido emitida antes da falha de comunicação. Consulte a SEFAZ manualmente. Não reenvie a emissão antes dessa confirmação, para evitar um documento fiscal em duplicidade."
} 400 (requisição inválida — tipo de guia não reconhecido), 401 (empresa não autenticada — token ausente ou inválido) e 404 quando o uuid não existe, pertence a outra empresa ou não é deste produto. O webhook continua sendo o canal principal de resultado terminal; este endpoint é o fallback e a única superfície para guias em erro_comunicacao, que não disparam webhook. Consulta as configurações de uma UF para emissão de GNRE, incluindo receitas habilitadas, campos exigidos, tipos de guia aceitos e quantidades máximas.
Para consultar a configuração de uma UF, envie uma requisição GET para /2/gnre/config-uf/{uf}.
| Parâmetro | Obrigatório | Tipo | Tam. | Descrição |
|---|---|---|---|---|
uf (path) | Obrigatório | string | 2 | UF de destino (ex.: MG, RJ, BA). |
ambiente (query) | Obrigatório | number | 1 | Ambiente da consulta.1 = Produção |
receita (query) | Opcional | string | 6 | Filtrar pela receita específica (código de 6 dígitos). |
curl -X GET \
-H "Authorization: Bearer SEU_ACCESS_TOKEN" \
"https://api.webmania.com.br/2/gnre/config-uf/MG?ambiente=2" Resposta:
{
"ambiente": 2,
"uf": "MG",
"situacao_consulta": {
"codigo": 450,
"descricao": "Consulta realizada com sucesso"
},
"receitas": [
{
"codigo": "100002",
"nome": "ICMS CONSUMIDOR FINAL NÃO CONTRIBUINTE",
"exige_contribuinte_emitente": "S",
"exige_detalhamento_receita": "N",
"exige_periodo_referencia": "S",
"valor_exigido": "P",
"exige_documento_origem": "S",
"tipos_documentos_origem": ["01", "02"],
"exige_contribuinte_destinatario": "S",
"exige_data_vencimento": "S",
"exige_data_pagamento": "N",
"exige_convenio": "N",
"exige_campos_adicionais": "S",
"aceita_pg_pix": "S",
"tipos_gnre": [0, 1]
}
],
"qtd_maximas": {
"guias_por_lote": 100,
"itens_por_guia": 100,
"itens_por_lote": 1000
},
"tipos_gnre_da_uf": [0, 1, 2]
} A resposta traz a configuração completa da UF. Campos de nível superior:
| Campo | Tipo | Descrição |
|---|---|---|
ambiente | number | Ambiente da consulta (eco da requisição).1 = Produção |
uf | string | UF consultada (eco da requisição). |
situacao_consulta | object | Resultado da consulta: codigo (number) + descricao (string). 450 = consulta realizada com sucesso |
receitas | array | Configuração de cada receita habilitada na UF (campos na tabela abaixo). |
qtd_maximas | object | Tetos publicados pela SEFAZ para a UF: guias_por_lote, itens_por_guia e itens_por_lote. |
tipos_gnre_da_uf | array | Tipos de guia aceitos pela UF para qualquer receita (ver distinção abaixo). |
Cada entrada de receitas descreve os requisitos daquela receita na UF consultada:
| Campo | Tipo | Descrição |
|---|---|---|
codigo | string | Código da receita (6 dígitos). |
nome | string | Nome da receita na GNRE. |
exige_contribuinte_emitente | string | S/N — se S, a guia exige os dados do contribuinte emitente. |
exige_detalhamento_receita | string | S/N — se S, a guia exige detalhamento_receita; os valores aceitos vêm em detalhamentos_receita. |
exige_periodo_referencia | string | S/N — se S, a guia exige o período de referência. |
valor_exigido | string | Quais valores de imposto a receita exige (legenda abaixo). |
exige_documento_origem | string | S/N — se S, a guia exige o documento de origem. |
tipos_documentos_origem | array | Códigos de tipo de documento de origem aceitos pela receita nesta UF. |
exige_contribuinte_destinatario | string | S/N — se S, a guia exige os dados do contribuinte destinatário. |
exige_data_vencimento | string | S/N — se S, a guia exige data_vencimento. |
exige_data_pagamento | string | S/N — se S, a guia exige a data de pagamento. |
exige_convenio | string | N/S/O — N = não exigido, S = opcional (aceito, nunca obrigatório), O = exigido: somente O torna convenio obrigatório na guia. |
exige_valor_fecp | string | N/S/O — N = não exigido, S = opcional (aceito, nunca obrigatório), O = exigido: somente O torna o valor do FECP obrigatório na guia. |
exige_campos_adicionais | string | S/N — se S, a emissão exige campos_extras (no máximo 3 campos, codigo inteiro e valor com até 100 caracteres). |
aceita_pg_pix | string | S/N — se S, a guia pode ser paga via PIX. |
tipos_gnre | array | Tipos de guia aceitos para esta receita nesta UF (ver distinção abaixo). |
Legenda dos campos de exigência: S = Sim (a receita exige ou aceita o campo), N = Não — exceto exige_convenio e exige_valor_fecp, que publicam a escala N/S/O descrita na tabela acima. Valores de valor_exigido:
P = PrincipalT = TotalA = AmbosN = NenhumPO = Principal ou OutrosTO = Total ou OutrosAO = Ambos ou Outrostipos_gnre × tipos_gnre_da_uf: tipos_gnre (dentro de cada receita) diz quais tipos de guia aquela receita aceita; tipos_gnre_da_uf (no nível superior) é a lista de permissão da UF. Na emissão, cada guia é validada contra a união das duas listas, e o lote contra os tetos de qtd_maximas. Valores: 0 = GNRE Simples (guia com um único item)
1 = Guia Múltiplos Documentos (vários itens de origem, mesma receita)
2 = Guia Múltiplas Receitas
Consulta guias GNRE já emitidas por código de barras, número de controle ou documento de origem.
Para realizar a consulta, envie uma requisição POST para /2/gnre/consulta-guias.
| Parâmetro | Obrigatório | Tipo | Tam. | Descrição |
|---|---|---|---|---|
ambiente | Obrigatório | number | 1 | Ambiente da consulta.1 = Produção |
consultas | Obrigatório | array | 1-50 | Lista de consultas (máximo 50). |
consultas[].uf | Obrigatório | string | 2 | UF da guia. |
consultas[].tipo_consulta | Obrigatório | string | 1-2 | Tipo de consulta.C = Código de barrasOs tipos CR e NR do padrão GNRE (combinações com o código da receita) não são suportados por esta API: a requisição não possui um campo de código da receita, então essas consultas não podem ser expressas de ponta a ponta. |
consultas[].cod_barras | Obrigatório quando tipo_consulta = C ou CD | string | 44/48 | Identificador da guia: código de barras (44 dígitos) ou linha digitável (48 dígitos) — ambos os tamanhos são aceitos. |
consultas[].num_controle | Obrigatório quando tipo_consulta = N ou ND | string | 10-16 | Número de controle da guia (10 a 16 dígitos, sem remover ou completar zeros). |
consultas[].doc_origem | Obrigatório quando tipo_consulta = D, CD ou ND | object | - | Documento de origem da guia. |
consultas[].doc_origem.numero | Obrigatório quando doc_origem é enviado | string | - | Número do documento de origem. |
consultas[].doc_origem.tipo | Obrigatório quando doc_origem é enviado | string | 2 | Tipo do documento de origem, com 2 dígitos (ex.: 01). Os códigos válidos por UF estão em tipos_documentos_origem no retorno de GET /2/gnre/config-uf/{uf}. |
curl -X POST \
-H "Authorization: Bearer SEU_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
https://api.webmania.com.br/2/gnre/consulta-guias
{
"ambiente": 2,
"consultas": [
{
"uf": "MG",
"tipo_consulta": "C",
"cod_barras": "12345678901234567890123456789012345678901234"
}
]
} A resposta imediata confirma o recebimento do lote de consultas — ela ainda não contém o resultado de cada consulta:
{
"status": "processando",
"recibo": "12345678901234",
"data_hora_recibo": "2026-08-24T14:32:10-03:00",
"tempo_estimado_proc": 5
} O resultado das consultas é obtido depois, com POST /2/gnre/consulta-guias-resultado — ver Consulta de Guias • Resultado.
Consulta o resultado do processamento de um lote de consulta de guias a partir do recibo devolvido no envio. Envie uma requisição POST para /2/gnre/consulta-guias-resultado.
| Parâmetro | Obrigatório | Tipo | Tam. | Descrição |
|---|---|---|---|---|
ambiente | Obrigatório | number | 1 | Ambiente da consulta.1 = Produção |
recibo | Obrigatório | string | 10/14 | Recibo devolvido no envio do lote de consultas — 10 ou 14 dígitos, sem remover ou completar zeros. |
curl -X POST \
-H "Authorization: Bearer SEU_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
https://api.webmania.com.br/2/gnre/consulta-guias-resultado
{
"ambiente": 2,
"recibo": "12345678901234"
} A resposta traz situacao_process.codigo e situacao_process.descricao e, quando o lote já foi processado, resultado.guia[] com uma entrada por consulta enviada. Cada guia carrega os campos documentados na tabela de resultado da consulta de lote — situacao_guia, dados (eco da consulta), linha_digitavel, codigo_barras, qrcode_payload e motivos_rejeicao. Enquanto situacao_process.codigo for 401 (lote em processamento), o bloco resultado não é retornado.
Os servidores da Webmania® estão localizados na Amazon AWS, líder global em cloud computing, na região us-east-1 (Leste dos EUA) com ponto de presença em sa-east-1 (São Paulo). Manter a sua estrutura perto de uma dessas duas localidades, garante um menor tempo de resposta nas requisições na API.
Utilizamos uma infraestrutura na Amazon AWS anycast de alta disponibilidade, o que significa que ao se comunicar com a API da Webmania® a requisição será redirecionada para o servidor mais próximo da sua localidade. As requisições dos endpoints são gerenciadas através de IPs estáticos, caso necessite autorize no firewall a comunicação com os IPs abaixo.
IPs estáticos de entrada:A API da Webmania® aplica limites de solicitação por método HTTP para evitar o mal uso da API e a sobrecarga dos servidores. Quando o limite é excedido, a requisição retorna erro 429 (Too Many Requests). Segue abaixo as especificações para uma correta integração:
https://webmania.com.br/api/ ou https://api.webmania.com.br retorne 403 Erro Forbidden por engano, por favor, entre em contato para liberarmos o IP do seu servidor.