FiscalAPI
Guias

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:

ABCDE
CNPJStatusInscriçõesCompletoConsultado 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

  1. Na planilha, abra Extensões > Apps Script.
  2. No editor, clique em Configurações do projeto (ícone de engrenagem).
  3. Em Propriedades do script, adicione a propriedade FISCALAPI_KEY com 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

  1. Clique em FiscalAPI > Consultar IE das linhas pendentes.
  2. 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.
  3. 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_MS manté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-After e 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

LiteStarterProEnterprise
Consulta de IE (1 UF ou 27 UFs)R$ 0,67R$ 0,10R$ 0,065R$ 0,025
Consultas por minuto52060120

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.

Planos e preços

Esta pagina foi util?

On this page