Como consultar inscrição estadual no Google Sheets?
Script pronto para colar: cria o menu FiscalAPI e grava o resultado como valor, sem fórmula que recalcula e cobra de novo.
Atualizado em
Cole o script pronto desta página no Apps Script da planilha: ele cria o menu FiscalAPI, consulta a inscrição estadual de cada CNPJ da coluna A nos 27 estados e grava o resultado como valor nas colunas ao lado. Você não escreve código, e nada é consultado (nem cobrado) sem você clicar no menu.
- Custo: 1 consulta por CNPJ, de R$ 0,025 a R$ 0,67 conforme o plano (tabela).
- Grátis para testar a API: 10 consultas por mês de IE em um estado e de CNPJ; a consulta nos 27 estados usada neste guia é paga (condições).
- Comece: crie a conta e a chave de API (no painel, em Chave API).
1. Monte a planilha
Crie uma aba chamada Documentos com este cabeçalho na linha 1:
| A | B | C | D | E |
|---|---|---|---|---|
| CNPJ | Status | Inscrições | Completo | Consultado em |
Cole os CNPJs na coluna A, a partir da linha 2. Formate a coluna A como texto (Formatar > Número > Texto simples) para não perder zeros à esquerda.
2. Guarde a chave fora do código
- Na planilha, abra Extensões > Apps Script.
- No editor, clique em Configurações do projeto (ícone de engrenagem).
- Em Propriedades do script, adicione a propriedade
FISCALAPI_KEYcom a sua chave de API.
Assim, a chave não aparece no código para quem pode ler o script.
3. Cole o script
Volte ao Editor, apague o conteúdo de Código.gs e cole:
// FiscalAPI: consulta de inscrição estadual pelo menu, gravando valores.
const ABA = 'Documentos';
const PRIMEIRA_LINHA = 2; // linha 1 é o cabeçalho
// Pausa entre chamadas, pelo limite por minuto do plano:
// 12000 no Lite e sem plano, 3000 no Starter, 1000 no Pro, 500 no Enterprise.
const PAUSA_MS = 3000;
// Para bem antes do limite de 6 min por execução: uma consulta já cobrada
// precisa ter tempo de ser gravada.
const TEMPO_MAX_MS = 3 * 60 * 1000;
const CACHE_SEGUNDOS = 21600; // 6 horas, o máximo do CacheService
function onOpen() {
SpreadsheetApp.getUi()
.createMenu('FiscalAPI')
.addItem('Consultar IE das linhas pendentes', 'consultarPendentes')
.addToUi();
}
function consultarPendentes() {
const ui = SpreadsheetApp.getUi();
const chave = PropertiesService.getScriptProperties().getProperty('FISCALAPI_KEY');
if (!chave) {
ui.alert('Cadastre FISCALAPI_KEY em Configurações do projeto > Propriedades do script.');
return;
}
const aba = SpreadsheetApp.getActive().getSheetByName(ABA);
const ultima = aba.getLastRow();
if (ultima < PRIMEIRA_LINHA) return;
const linhas = aba.getRange(PRIMEIRA_LINHA, 1, ultima - PRIMEIRA_LINHA + 1, 2).getValues();
const cache = CacheService.getDocumentCache();
const inicio = Date.now();
let feitas = 0;
for (let i = 0; i < linhas.length; i++) {
// Mantém as letras: desde julho de 2026 o CNPJ pode ser alfanumérico.
const cnpj = String(linhas[i][0]).replace(/[^0-9A-Za-z]/g, '').toUpperCase();
const status = linhas[i][1];
if (!cnpj || status) continue; // linha vazia ou já consultada
if (Date.now() - inicio > TEMPO_MAX_MS) {
ui.alert('Parei por tempo depois de ' + feitas + ' linhas. Clique no menu de novo para continuar.');
return;
}
const linha = PRIMEIRA_LINHA + i;
if (!cnpjValido(cnpj)) {
// CNPJ com dígito errado seria consultado e cobrado: não chama a API.
aba.getRange(linha, 2, 1, 4).setValues([['CNPJ inválido (não consultado)', '', '', new Date()]]);
continue;
}
const guardado = cache.get(cnpj);
if (guardado !== null) {
gravar(aba, linha, 200, guardado); // mesmo CNPJ consultado há pouco: não chama a API
continue;
}
const resposta = chamarApi(chave, cnpj, inicio);
gravar(aba, linha, resposta.codigo, resposta.texto);
SpreadsheetApp.flush();
if (resposta.codigo === 402) {
ui.alert('Acabaram as consultas do mês e não há saldo de recarga. Parei aqui.');
return;
}
if (resposta.codigo === 403) {
ui.alert('A chave foi recusada (inválida ou revogada). Confira FISCALAPI_KEY.');
return;
}
if (resposta.codigo === 200) {
try {
cache.put(cnpj, resposta.texto, CACHE_SEGUNDOS);
} catch (e) {} // resposta grande demais para o cache: só não guarda
}
feitas++;
Utilities.sleep(PAUSA_MS);
}
ui.alert('Pronto: ' + feitas + ' consulta(s) feita(s).');
}
function chamarApi(chave, cnpj, inicio) {
const url = 'https://api.fiscalapi.com.br/api/consultar-ie-todos?cnpj=' + encodeURIComponent(cnpj);
for (let tentativa = 1; ; tentativa++) {
let r;
try {
r = UrlFetchApp.fetch(url, {
method: 'get',
headers: { 'X-API-Key': chave },
muteHttpExceptions: true, // devolve 4xx/5xx em vez de interromper o script
});
} catch (e) {
return { codigo: 0, texto: '' }; // falha de rede ou tempo esgotado
}
const codigo = r.getResponseCode();
if (codigo !== 429) return { codigo: codigo, texto: r.getContentText() };
// Passou do limite por minuto: espera o Retry-After, no máximo 2 vezes e só se der tempo.
const espera = segundosDeEspera(r) * 1000;
if (tentativa > 2 || Date.now() - inicio + espera > TEMPO_MAX_MS) {
return { codigo: 429, texto: '' };
}
Utilities.sleep(espera);
}
}
function segundosDeEspera(resposta) {
const headers = resposta.getHeaders();
for (const nome in headers) {
if (nome.toLowerCase() === 'retry-after') return Math.min(Number(headers[nome]) || 60, 60);
}
return 60;
}
// Dígitos verificadores, também do CNPJ alfanumérico.
function cnpjValido(cnpj) {
if (!/^[0-9A-Z]{12}[0-9]{2}$/.test(cnpj) || /^(.)\1+$/.test(cnpj)) return false;
const v = cnpj.split('').map(function (c) { return c.charCodeAt(0) - 48; });
for (const n of [12, 13]) {
let soma = 0;
for (let i = 0; i < n; i++) soma += v[i] * (((n - 1 - i) % 8) + 2);
const resto = soma % 11;
if (v[n] !== (resto < 2 ? 0 : 11 - resto)) return false;
}
return true;
}
function gravar(aba, linha, codigo, texto) {
let status;
let inscricoes = '';
let completo = '';
if (codigo === 200) {
const json = JSON.parse(texto);
const lista = [];
json.results.forEach(function (estado) {
estado.results.forEach(function (ie) {
lista.push(estado.uf + ': ' + ie.inscricao_estadual + ' (' + ie.situacao_ie + ')');
});
});
status = 'OK';
inscricoes = lista.length ? lista.join('; ') : 'nenhuma IE encontrada';
completo = json.complete ? 'sim' : 'não: algum estado não respondeu';
} else {
let mensagem = '';
try {
const erro = JSON.parse(texto);
mensagem = erro.message || erro.detail || '';
} catch (e) {}
status = (codigo === 0 ? 'Falha de conexão' : 'Erro ' + codigo) + (mensagem ? ': ' + mensagem : '');
}
aba.getRange(linha, 2, 1, 4).setValues([[status, inscricoes, completo, new Date()]]);
}Salve (Ctrl+S) e recarregue a planilha. O menu FiscalAPI aparece ao lado de Ajuda.
4. Rode
- Clique em FiscalAPI > Consultar IE das linhas pendentes.
- Na primeira vez, o Google pede autorização para o script acessar a planilha e se conectar a um serviço externo. Autorize com a sua conta.
- As colunas B a E são preenchidas linha a linha.
O script pula as linhas que já têm Status. Para consultar uma linha de novo (por exemplo, depois de um erro 503 ou falha de conexão), apague o Status dela e rode o menu.
Por que menu, e não uma fórmula =IE()
Numa fórmula, quem decide quando consultar é o Google Sheets, e cada chamada é uma consulta cobrada:
- A fórmula roda de novo quando você a edita ou muda a célula que ela usa. Copiar, arrastar ou colar a fórmula cria novas chamadas.
- Cada célula é uma chamada separada, com limite de 30 segundos; passou disso,
#ERROR!(Google). A consulta nos 27 estados pode passar disso. - Uma função personalizada só escreve na própria célula; o próprio Google indica um menu para editar outras.
O menu grava valores: depois de gravados, eles não mudam nem cobram de novo.
Como o script controla o custo e o limite
- Só linhas pendentes. Linha com Status preenchido não é consultada de novo.
- CNPJ conferido antes. Na consulta nos 27 estados, a API não confere o dígito verificador: CNPJ errado seria cobrado. O script marca a linha como inválida sem chamar a API.
- Cache de 6 horas. CNPJ repetido na lista usa a resposta guardada no
CacheService. O Google pode apagar o cache antes (CacheService): economiza, mas não garante. - Pausa por plano.
PAUSA_MSmantém o ritmo no limite da conta (somando todas as chaves): 5 por minuto no Lite e sem plano, 20 no Starter, 60 no Pro e 120 no Enterprise. - 429. Se passar do limite, espera o
Retry-Aftere tenta de novo, no máximo duas vezes. 429 não é cobrado. - 402 e 403. Sem consultas no mês e sem recarga, ou chave recusada: o script para na hora e avisa.
- 6 minutos. Uma execução do Apps Script dura no máximo 6 minutos (cotas). O script para de começar consultas aos 3 minutos; clique no menu de novo para continuar. A cota diária de chamadas externas é de 20.000 em contas Google gratuitas e 100.000 no Workspace.
Quanto custa
| Lite | Starter | Pro | Enterprise | |
|---|---|---|---|---|
| Consulta de IE (1 UF ou 27 UFs) | R$ 0,67 | R$ 0,10 | R$ 0,065 | R$ 0,025 |
| Consultas por minuto | 5 | 20 | 60 | 120 |
Valores por consulta dentro da franquia mensal. Cada linha consultada é uma consulta. Resposta com erro HTTP (400, 402, 429, 500) não é cobrada. Veja Planos e limites.
Grátis para testar: conta que nunca assinou plano, sem recarga e com e-mail confirmado, tem 10 consultas por mês de IE em um estado e de CNPJ, no painel e pela API. O script usa a consulta nos 27 estados, que é paga (plano ou recarga). Criar conta.
Prefere não usar script? O painel aceita uma planilha .xlsx de até 20.000 linhas e devolve o resultado em Excel: veja consulta de IE em massa.
Perguntas frequentes
Como consultar inscrição estadual no Google Sheets?
Cole no Apps Script da planilha um script que cria um menu, chama GET /api/consultar-ie-todos da FiscalAPI para cada CNPJ e grava o resultado nas células. O script completo está nesta página.
Posso criar uma fórmula =IE() no Google Sheets?
Pode, mas não compensa: cada célula com a fórmula é uma chamada à API, o Sheets recalcula quando a fórmula ou a célula de origem muda, e copiar a fórmula cria novas chamadas. Cada chamada é cobrada. A função também tem limite de 30 segundos. O menu grava valores e só consulta quando você manda.
Abrir a planilha de novo cobra as consultas outra vez?
Com o script desta página, não. O resultado fica gravado como valor, e o script só consulta as linhas sem Status.
Onde coloco a chave da API no Apps Script?
Em Configurações do projeto > Propriedades do script, com o nome FISCALAPI_KEY. O script lê a chave com PropertiesService.getScriptProperties().
Quantos CNPJs dá para consultar por vez?
O limite é o do seu plano por minuto (5, 20, 60 ou 120) e o de 6 minutos por execução do Apps Script. Em listas grandes, rode o menu de novo até acabar, ou suba a planilha no painel.
Esta pagina foi util?
Como consultar inscrição estadual no Excel?
Dois caminhos: suba a planilha no painel e baixe o resultado (até 20.000 linhas, sem programar), ou traga a consulta para dentro da sua planilha com o Power Query.
Como consultar CNPJ e inscrição estadual no n8n?
Instale o nó da comunidade n8n-nodes-fiscalapi, ou use o nó HTTP Request, para consultar CNPJ e inscrição estadual pela FiscalAPI nos seus workflows do n8n.