# Como consultar NFS-e pela chave de acesso via API

> Consulte uma NFS-e do padrão nacional só com a chave de acesso de 50 dígitos, sem certificado digital. Dados da nota em JSON e, se quiser, o PDF do DANFSe.

URL: https://docs.fiscalapi.com.br/docs/nfse/consultar-nfse
Atualizado em 09/11/2026

Para consultar uma NFS-e pela chave de acesso, chame `GET /api/consultar-nfse?chave=<50 dígitos>` com a sua chave de API: a FiscalAPI devolve a nota em JSON (emitente, tomador, serviço, ISSQN, tributos federais e tipo de geração) e, com `danfse=true`, o PDF do DANFSe. Não precisa de certificado digital, e quem consulta não precisa ser o emitente nem o tomador.

* **Custo por nota entregue:** de R$ 0,05 (Enterprise) a R$ 2,01 (Lite). Chave inválida, nota não encontrada e falha não são cobradas.
* **Uso típico:** o contas a pagar confere a nota de serviço recebida (valores, retenções e ISS) sem pedir PDF ou XML ao prestador.
* **Comece:** [crie a conta e a chave de API](https://app.fiscalapi.com.br?utm_source=docs\&utm_medium=docs\&utm_campaign=nfse). A consulta sai pela API ou no [painel da FiscalAPI](https://app.fiscalapi.com.br/dashboard/nfse-por-chave?utm_source=docs\&utm_medium=docs\&utm_campaign=nfse), sem programar.

## ## Resumo

| Item                    | Valor                                                                |
| ----------------------- | -------------------------------------------------------------------- |
| Endpoint                | `GET https://api.fiscalapi.com.br/api/consultar-nfse`                |
| Você envia              | `chave` (50 dígitos) e, opcional, `danfse=true`                      |
| Volta                   | Dados da NFS-e em JSON e, opcional, o PDF do DANFSe em base64        |
| Quais notas             | NFS-e do padrão nacional ([cobertura](#cobertura))                   |
| Notas por requisição    | 1                                                                    |
| Tempo                   | 30 a 60 s em geral, até cerca de 90 s ([detalhes](#limites-e-tempo)) |
| Precisa de certificado? | Não                                                                  |
| XML da NFS-e?           | Não. A resposta é JSON (e o PDF, se pedido).                         |

## ## Quanto custa cada chamada

| Chamada                                                             | Lite                  | Starter               | Pro                    | Enterprise            |
| ------------------------------------------------------------------- | --------------------- | --------------------- | ---------------------- | --------------------- |
| NFS-e entregue (`200`), na franquia do plano                        | R$ 2,01 (3 consultas) | R$ 0,30 (3 consultas) | R$ 0,195 (3 consultas) | R$ 0,05 (2 consultas) |
| NFS-e entregue (`200`), na recarga                                  | —                     | R$ 0,36               | R$ 0,21                | R$ 0,05               |
| Chave inválida, nota não encontrada, limite ou falha (`4xx`, `5xx`) | Não cobra             | Não cobra             | Não cobra              | Não cobra             |

É o mesmo preço do [XML de NF-e sem certificado](/docs/nfe/consultar-nfe-xml-sem-certificado). O plano Lite não tem recarga. Veja [Planos e limites](/docs/referencia/plans-and-limits).

## ## Cobrança

* **Só a resposta `200` é cobrada**, com ou sem o PDF do DANFSe. Pedir o PDF não muda o preço.
* **Pela API, a resposta do cache também cobra** (`cached: true`). O resultado de cada chave fica guardado por até 24 horas, e qualquer consulta à mesma chave nesse período volta na hora e é cobrada pelo mesmo preço.
* **No painel**, repetir a mesma chave em até 24 horas na mesma conta não cobra de novo.
* **Não cobra:** chave inválida (`400`), nota não encontrada (`404`), saldo, termos ou limite (`402`, `409`, `429`) e falha (`500`, `502`, `503`, `504`).
* A chave é validada **antes** de qualquer cobrança: tamanho, só números e dígito verificador.
* **Pela API, pede plano ou saldo.** Sem eles, a resposta é `402`. As 10 consultas grátis do mês valem só no painel.

## ## Limites e tempo

* **Uma chave por requisição.** Para várias notas, faça uma requisição por chave.
* **Até 2 consultas de NFS-e em andamento** por conta ao mesmo tempo. A terceira recebe `429 CONSULTAS_SIMULTANEAS` (`Retry-After: 5`).
* **Por minuto:** 5 no Lite, 20 no Starter e 30 no Pro e no Enterprise, contados à parte das outras rotas.
* **Tempo:** em geral, 30 a 60 s numa nota ainda não consultada; com nova tentativa, até cerca de 90 s. Configure o timeout do seu cliente HTTP para **pelo menos 100 segundos**: a consulta é encerrada em 95.
* **Cache:** a mesma chave consultada de novo em até 24 horas volta na hora, com `cached: true` (veja [Cobrança](#cobrança)). Uma chave que deu `404` volta `404` na hora por 6 horas.
* **PDF depois:** se a primeira consulta foi sem o PDF, pedir de novo com `danfse=true` também é rápido.

## ## Autenticação

Envie sua chave no header `X-API-Key`. Veja [Autenticação](/docs/getting-started/authentication) para detalhes.

## ## Parâmetros de consulta

| Parâmetro | Tipo    | Obrigatório | Descrição                                                                                                                                     |
| --------- | ------- | ----------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
| `chave`   | string  | Sim         | Chave de acesso da NFS-e, 50 dígitos. Espaços, pontos, traços e barras são ignorados, e o prefixo `NFS` (do atributo `Id` do XML) é removido. |
| `danfse`  | boolean | Não         | `true` inclui o PDF do DANFSe em base64 no campo `danfse_pdf_base64`. Padrão: `false`.                                                        |

## ## Exemplos

Os exemplos usam uma chave **fictícia**, com dígito verificador válido: `35503082211222333000181000000000012326100000045676`. Troque pela chave da sua nota.

### ### Consultar a NFS-e pela chave

<Tabs items="[&#x22;curl&#x22;, &#x22;Node.js&#x22;, &#x22;Python&#x22;, &#x22;PHP&#x22;]">
  <Tab value="curl">
    ```bash
    curl --max-time 100 \
      "https://api.fiscalapi.com.br/api/consultar-nfse?chave=35503082211222333000181000000000012326100000045676" \
      -H "X-API-Key: fapi_sua_chave_aqui"
    ```
  </Tab>

  <Tab value="Node.js">
    ```javascript
    // Node.js 18+ (fetch nativo)
    const params = new URLSearchParams({
      chave: "35503082211222333000181000000000012326100000045676",
    });
    const response = await fetch(
      `https://api.fiscalapi.com.br/api/consultar-nfse?${params}`,
      {
        headers: { "X-API-Key": "fapi_sua_chave_aqui" },
        signal: AbortSignal.timeout(100_000),
      }
    );
    if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
    const nota = await response.json();
    console.log(nota.situacao?.descricao, nota.tributacao_municipal?.valor_issqn);
    ```
  </Tab>

  <Tab value="Python">
    ```python
    import requests

    response = requests.get(
        "https://api.fiscalapi.com.br/api/consultar-nfse",
        headers={"X-API-Key": "fapi_sua_chave_aqui"},
        params={"chave": "35503082211222333000181000000000012326100000045676"},
        timeout=100,
    )
    response.raise_for_status()
    nota = response.json()
    print((nota.get("situacao") or {}).get("descricao"))
    print((nota.get("tributacao_municipal") or {}).get("valor_issqn"))
    ```
  </Tab>

  <Tab value="PHP">
    ```php
    <?php
    $url = 'https://api.fiscalapi.com.br/api/consultar-nfse?' . http_build_query([
        'chave' => '35503082211222333000181000000000012326100000045676',
    ]);
    $ch = curl_init($url);
    curl_setopt_array($ch, [
        CURLOPT_HTTPHEADER => ['X-API-Key: fapi_sua_chave_aqui'],
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_TIMEOUT => 100,
    ]);
    $corpo = curl_exec($ch);
    $status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);
    if ($status !== 200) {
        throw new RuntimeException("FiscalAPI respondeu HTTP $status: $corpo");
    }
    $nota = json_decode($corpo, true);
    echo $nota['situacao']['descricao'] ?? '';
    ```
  </Tab>
</Tabs>

### ### Consultar e salvar o PDF do DANFSe

<Tabs items="[&#x22;curl&#x22;, &#x22;Node.js&#x22;, &#x22;Python&#x22;, &#x22;PHP&#x22;]">
  <Tab value="curl">
    ```bash
    # Precisa do jq para extrair o campo do JSON
    curl --max-time 100 -s \
      "https://api.fiscalapi.com.br/api/consultar-nfse?chave=35503082211222333000181000000000012326100000045676&danfse=true" \
      -H "X-API-Key: fapi_sua_chave_aqui" \
      | jq -r '.danfse_pdf_base64 // empty' | base64 --decode > danfse.pdf
    ```
  </Tab>

  <Tab value="Node.js">
    ```javascript
    import { writeFile } from "node:fs/promises";

    const params = new URLSearchParams({
      chave: "35503082211222333000181000000000012326100000045676",
      danfse: "true",
    });
    const response = await fetch(
      `https://api.fiscalapi.com.br/api/consultar-nfse?${params}`,
      {
        headers: { "X-API-Key": "fapi_sua_chave_aqui" },
        signal: AbortSignal.timeout(100_000),
      }
    );
    if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
    const nota = await response.json();
    if (nota.danfse_pdf_base64) {
      await writeFile("danfse.pdf", Buffer.from(nota.danfse_pdf_base64, "base64"));
    } else {
      console.log(nota.aviso);
    }
    ```
  </Tab>

  <Tab value="Python">
    ```python
    import base64
    import requests

    response = requests.get(
        "https://api.fiscalapi.com.br/api/consultar-nfse",
        headers={"X-API-Key": "fapi_sua_chave_aqui"},
        params={
            "chave": "35503082211222333000181000000000012326100000045676",
            "danfse": "true",
        },
        timeout=100,
    )
    response.raise_for_status()
    nota = response.json()
    if nota.get("danfse_pdf_base64"):
        with open("danfse.pdf", "wb") as f:
            f.write(base64.b64decode(nota["danfse_pdf_base64"]))
    else:
        print(nota.get("aviso"))
    ```
  </Tab>

  <Tab value="PHP">
    ```php
    <?php
    $url = 'https://api.fiscalapi.com.br/api/consultar-nfse?' . http_build_query([
        'chave' => '35503082211222333000181000000000012326100000045676',
        'danfse' => 'true',
    ]);
    $ch = curl_init($url);
    curl_setopt_array($ch, [
        CURLOPT_HTTPHEADER => ['X-API-Key: fapi_sua_chave_aqui'],
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_TIMEOUT => 100,
    ]);
    $corpo = curl_exec($ch);
    $status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);
    if ($status !== 200) {
        throw new RuntimeException("FiscalAPI respondeu HTTP $status: $corpo");
    }
    $nota = json_decode($corpo, true);
    if (!empty($nota['danfse_pdf_base64'])) {
        file_put_contents('danfse.pdf', base64_decode($nota['danfse_pdf_base64']));
    } else {
        echo $nota['aviso'] ?? '';
    }
    ```
  </Tab>
</Tabs>

## ## Resposta

Campo que não aparece na nota volta `null`. Valores em reais e alíquotas são números (`aliquota: 2.0` = 2%). Datas vêm em ISO 8601, com o fuso (`2026-10-15T14:32:10-03:00`), quando o formato é reconhecido; senão, como constam na nota.

### ### Campos de nível superior

| Campo                        | Tipo           | Descrição                                                                                                                                                                                                                |
| ---------------------------- | -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `request_id`                 | string         | Identificador único da requisição.                                                                                                                                                                                       |
| `chave`                      | string         | Chave de acesso consultada, já normalizada (50 dígitos).                                                                                                                                                                 |
| `numero_nfse`                | string         | Número da NFS-e.                                                                                                                                                                                                         |
| `codigo_municipio_emissor`   | string         | Código IBGE do município emissor (7 dígitos).                                                                                                                                                                            |
| `data_geracao`               | string         | Data e hora de geração da NFS-e.                                                                                                                                                                                         |
| `versao`                     | string         | Versão do leiaute da NFS-e.                                                                                                                                                                                              |
| `dps`                        | object         | Declaração de Prestação de Serviço que originou a nota: `numero`, `serie`, `data_emissao`.                                                                                                                               |
| `situacao`                   | object         | Tipo de geração da nota: `codigo` e `descricao`. `100` gerada, `101` de substituição, `102` por decisão judicial, `103` avulsa. O campo `situacao` não indica cancelamento: cancelamento é um evento registrado à parte. |
| `emitente`                   | object         | Prestador do serviço. Veja abaixo.                                                                                                                                                                                       |
| `tomador`                    | object \| null | Tomador do serviço: `cpf_cnpj`, `inscricao_municipal`, `nome`.                                                                                                                                                           |
| `intermediario`              | object \| null | Intermediário, quando houver (mesmos campos do tomador).                                                                                                                                                                 |
| `servico`                    | object         | Serviço prestado. Veja abaixo.                                                                                                                                                                                           |
| `tributacao_municipal`       | object         | ISSQN. Veja abaixo.                                                                                                                                                                                                      |
| `tributacao_federal`         | object         | PIS, COFINS e retenções federais. Veja abaixo.                                                                                                                                                                           |
| `total_tributos`             | array          | Totais aproximados de tributos informados na nota: lista de `{ "descricao", "valor" }`. A `descricao` diz se o `valor` é em reais ou percentual.                                                                         |
| `informacoes_complementares` | string \| null | Texto livre do emitente.                                                                                                                                                                                                 |
| `ambiente_gerador`           | string         | Ambiente que gerou a nota.                                                                                                                                                                                               |
| `cached`                     | boolean        | `true` quando a resposta veio do cache (a mesma chave já consultada nas últimas 24 horas). Veja [Cobrança](#cobrança).                                                                                                   |
| `danfse_pdf_base64`          | string \| null | PDF do DANFSe em base64. Só com `danfse=true`.                                                                                                                                                                           |
| `aviso`                      | string \| null | Preenchido quando o PDF foi pedido mas não pôde ser gerado naquele momento. Os dados da nota vêm normalmente; tente o PDF de novo em instantes.                                                                          |

### ### `emitente`

| Campo                        | Tipo           | Descrição                                                                  |
| ---------------------------- | -------------- | -------------------------------------------------------------------------- |
| `razao_social`               | string         | Nome ou razão social do prestador.                                         |
| `cpf_cnpj`                   | string         | CPF ou CNPJ, só números.                                                   |
| `inscricao_municipal`        | string \| null | Inscrição municipal.                                                       |
| `situacao_simples_nacional`  | string \| null | Situação no Simples Nacional informada na nota.                            |
| `regime_especial_tributacao` | string \| null | Regime especial de tributação do ISSQN.                                    |
| `endereco`                   | object \| null | `logradouro`, `numero`, `complemento`, `bairro`, `cep`, `municipio`, `uf`. |

### ### `servico`

| Campo                        | Tipo           | Descrição                                   |
| ---------------------------- | -------------- | ------------------------------------------- |
| `pais`                       | string \| null | País da prestação.                          |
| `municipio`                  | string \| null | Município da prestação.                     |
| `codigo_tributacao_nacional` | string \| null | Código de tributação nacional do serviço.   |
| `descricao_codigo`           | string \| null | Descrição do código de tributação.          |
| `item_nbs`                   | string \| null | Item da NBS, quando informado.              |
| `descricao`                  | string \| null | Descrição do serviço escrita pelo emitente. |

### ### `tributacao_municipal`

| Campo                     | Tipo           | Descrição                                                     |
| ------------------------- | -------------- | ------------------------------------------------------------- |
| `tributacao_issqn`        | string \| null | Tipo de tributação do ISSQN (ex.: `1 - Operação Tributável`). |
| `municipio_incidencia`    | string \| null | Município onde o ISSQN incide.                                |
| `valor_servico`           | number \| null | Valor do serviço, em reais.                                   |
| `desconto_incondicionado` | number \| null | Desconto incondicionado, em reais.                            |
| `deducoes`                | number \| null | Deduções e reduções, em reais.                                |
| `beneficio_municipal`     | number \| null | Benefício municipal, em reais.                                |
| `base_calculo`            | number \| null | Base de cálculo do ISSQN, em reais.                           |
| `aliquota`                | number \| null | Alíquota do ISSQN em percentual (`2.0` = 2%).                 |
| `valor_issqn`             | number \| null | Valor do ISSQN, em reais.                                     |
| `retencao`                | string \| null | Se o ISSQN foi retido (ex.: `1 - Não Retido`).                |

### ### `tributacao_federal`

| Campo                                | Tipo           | Descrição                                     |
| ------------------------------------ | -------------- | --------------------------------------------- |
| `situacao_pis_cofins`                | string \| null | Situação tributária do PIS/COFINS.            |
| `base_calculo_pis_cofins`            | number \| null | Base de cálculo do PIS/COFINS, em reais.      |
| `aliquota_pis`, `aliquota_cofins`    | number \| null | Alíquotas em percentual.                      |
| `valor_pis`, `valor_cofins`          | number \| null | Valores em reais.                             |
| `irrf`                               | number \| null | IRRF retido, em reais.                        |
| `contribuicoes_sociais_retidas`      | number \| null | Contribuições sociais retidas, em reais.      |
| `contribuicao_previdenciaria_retida` | number \| null | Contribuição previdenciária retida, em reais. |

### ### Exemplo de resposta

Dados fictícios. Os textos (como `tributacao_issqn` e `retencao`) vêm como estão na nota e podem variar de uma nota para outra.

```json
{
  "request_id": "550e8400-e29b-41d4-a716-446655440000",
  "chave": "35503082211222333000181000000000012326100000045676",
  "numero_nfse": "123",
  "codigo_municipio_emissor": "3550308",
  "data_geracao": "2026-10-15T14:32:10-03:00",
  "versao": "1.01",
  "dps": {
    "numero": "123",
    "serie": "00001",
    "data_emissao": "2026-10-15T14:32:02-03:00"
  },
  "situacao": { "codigo": "100", "descricao": "NFS-e Gerada" },
  "emitente": {
    "razao_social": "EMPRESA EXEMPLO SERVICOS LTDA",
    "cpf_cnpj": "11222333000181",
    "inscricao_municipal": "1234567",
    "situacao_simples_nacional": "Microempresa ou Empresa de Pequeno Porte (ME/EPP)",
    "regime_especial_tributacao": "Nenhum",
    "endereco": {
      "logradouro": "RUA EXEMPLO",
      "numero": "100",
      "complemento": null,
      "bairro": "CENTRO",
      "cep": "01001000",
      "municipio": "São Paulo",
      "uf": "SP"
    }
  },
  "tomador": {
    "cpf_cnpj": "99888777000166",
    "inscricao_municipal": null,
    "nome": "CLIENTE EXEMPLO S.A."
  },
  "intermediario": null,
  "servico": {
    "pais": "Brasil",
    "municipio": "São Paulo/SP",
    "codigo_tributacao_nacional": "010401",
    "descricao_codigo": "Elaboração de programas de computadores, inclusive de jogos eletrônicos, independentemente da arquitetura construtiva da máquina em que o programa será executado, incluindo tablets, smartphones e congêneres.",
    "item_nbs": null,
    "descricao": "Licenciamento de software - outubro/2026"
  },
  "tributacao_municipal": {
    "tributacao_issqn": "1 - Operação Tributável",
    "municipio_incidencia": "São Paulo/SP",
    "valor_servico": 1500.0,
    "desconto_incondicionado": 0.0,
    "deducoes": 0.0,
    "beneficio_municipal": 0.0,
    "base_calculo": 1500.0,
    "aliquota": 2.0,
    "valor_issqn": 30.0,
    "retencao": "1 - Não Retido"
  },
  "tributacao_federal": {
    "situacao_pis_cofins": "Não informado",
    "base_calculo_pis_cofins": 0.0,
    "aliquota_pis": 0.0,
    "valor_pis": 0.0,
    "aliquota_cofins": 0.0,
    "valor_cofins": 0.0,
    "irrf": 0.0,
    "contribuicoes_sociais_retidas": 0.0,
    "contribuicao_previdenciaria_retida": 0.0
  },
  "total_tributos": [
    {
      "descricao": "Valor percentual aproximado do total dos tributos da alíquota do Simples Nacional",
      "valor": 6.0
    }
  ],
  "informacoes_complementares": null,
  "ambiente_gerador": "2 - Sefin Nacional NFS-e",
  "cached": false,
  "danfse_pdf_base64": null,
  "aviso": null
}
```

Com `danfse=true`, `danfse_pdf_base64` vem com o PDF (começa com `JVBERi0`, que é `%PDF-` em base64).

## ## Estrutura da chave de acesso da NFS-e

A chave da NFS-e do padrão nacional tem **50 dígitos**. Na chave fictícia dos exemplos:

| Posição | Tamanho | Campo                                                                  | Exemplo                  |
| ------- | ------- | ---------------------------------------------------------------------- | ------------------------ |
| 1–7     | 7       | Código IBGE do município emissor                                       | `3550308` (São Paulo)    |
| 8       | 1       | Ambiente gerador                                                       | `2`                      |
| 9       | 1       | Tipo de inscrição do emitente (`1` = CPF, `2` = CNPJ)                  | `2`                      |
| 10–23   | 14      | CPF ou CNPJ do emitente                                                | `11222333000181`         |
| 24–36   | 13      | Número da NFS-e                                                        | `0000000000123`          |
| 37–40   | 4       | Ano e mês de emissão (AAMM)                                            | `2610` (outubro de 2026) |
| 41–49   | 9       | Código numérico                                                        | `000004567`              |
| 50      | 1       | Dígito verificador (módulo 11, pesos 2 a 9 da direita para a esquerda) | `6`                      |

A chave aparece no DANFSe e no XML da nota (atributo `Id`, depois do prefixo `NFS`). A API aceita a chave formatada, com espaços ou pontos, e com o prefixo `NFS`.

## ## Cobertura

A consulta cobre **NFS-e do padrão nacional**: notas emitidas no Emissor Nacional ou compartilhadas com o Ambiente de Dados Nacional. Nota de município que usa sistema próprio e não compartilha com o padrão nacional pode voltar `404 NFSE_NAO_ENCONTRADA`, mesmo que exista.

Notas com chave de 44 dígitos são NF-e, não NFS-e: use [XML de NF-e sem certificado](/docs/nfe/consultar-nfe-xml-sem-certificado).

## ## Códigos de erro

Os erros seguem o formato [RFC 7807](/docs/referencia/error-handling): o código fica no campo `title`. &#x2A;*Nenhum deles é cobrado.**

| Código                               | HTTP Status | Descrição                                                                                                                                                                   |
| ------------------------------------ | ----------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `PARAMETRO_AUSENTE`                  | 400         | Chave de acesso não informada.                                                                                                                                              |
| `CHAVE_INVALIDA`                     | 400         | Chave com tamanho diferente de 50, com letras ou com dígito verificador que não confere. A mensagem diz o motivo.                                                           |
| `LIMITE_ATINGIDO`                    | 402         | Saldo insuficiente no plano e na recarga, ou conta sem plano nem saldo.                                                                                                     |
| `API_KEY_ERROR`                      | 403         | Chave de API ausente, inválida ou revogada.                                                                                                                                 |
| `NFSE_NAO_ENCONTRADA`                | 404         | Não há NFS-e do padrão nacional para essa chave. Confira a chave. A mesma chave volta `404` na hora por 6 horas.                                                            |
| `TERMS_UPDATE_REQUIRED`              | 409         | Os Termos de Uso foram atualizados. Aceite a nova versão no painel para continuar.                                                                                          |
| `RATE_LIMIT_EXCEEDED`                | 429         | Limite de requisições por minuto excedido. Aguarde o tempo do header `Retry-After`. Pode vir como `{"error", "message"}` (limite da rota) ou em RFC 7807 (limite do plano). |
| `CONSULTAS_SIMULTANEAS`              | 429         | A conta já tem 2 consultas de NFS-e em andamento. Aguarde alguma terminar (`Retry-After: 5`).                                                                               |
| `LIMITE_FALHAS_DIARIO`               | 429         | Muitas consultas de NFS-e sem resultado no dia. Tente de novo depois do horário do header `Retry-After`.                                                                    |
| `ERRO_INTERNO`                       | 500         | Erro inesperado no servidor.                                                                                                                                                |
| `FONTE_INDISPONIVEL`                 | 502         | A fonte oficial não respondeu como esperado. Tente de novo em alguns minutos.                                                                                               |
| `FONTE_TEMPORARIAMENTE_INDISPONIVEL` | 503         | Instabilidade momentânea na fonte oficial. Tente de novo depois do `Retry-After` (30 s).                                                                                    |
| `CONSULTA_EM_ANDAMENTO`              | 503         | A mesma chave já está sendo consultada, ou há muitas consultas ao mesmo tempo. Tente de novo depois do `Retry-After` (15 s).                                                |
| `FEATURE_UNDER_REVIEW`               | 503         | Funcionalidade temporariamente indisponível.                                                                                                                                |
| `TIMEOUT`                            | 504         | A consulta passou de 95 segundos. Tente de novo. Corpo: `{"request_id", "error": "TIMEOUT", "message"}`, sem o formato RFC 7807.                                            |

## ## Integração com ERPs

A chamada é um `GET` com o header `X-API-Key`, em geral na entrada da nota de serviço ou na conferência do contas a pagar. Não existe conector pronto.

| Sistema                      | Como chamar a API REST                                                                                      |
| ---------------------------- | ----------------------------------------------------------------------------------------------------------- |
| TOTVS Protheus               | Num fonte ADVPL/TLPP, com a classe `FWRest` ou a função `HttpGet`.                                          |
| SAP (ECC, S/4HANA)           | Em ABAP, com `cl_http_client`, ou por um fluxo no SAP Integration Suite.                                    |
| Sankhya, Senior, Omie, Bling | Por um serviço intermediário (script, n8n, Make) que chama a FiscalAPI e grava o resultado pela API do ERP. |
| Odoo                         | Num módulo próprio em Python, com `requests`.                                                               |

## ## Perguntas frequentes

### ### Como consultar uma NFS-e pela chave de acesso?

Chame `GET https://api.fiscalapi.com.br/api/consultar-nfse?chave=<50 dígitos>` com o header `X-API-Key`. A resposta traz emitente, tomador, serviço, ISSQN e tributos federais da nota em JSON. Sem programar, a mesma consulta sai no painel da FiscalAPI. Com `danfse=true`, vem também o PDF do DANFSe em base64.

### ### Precisa de certificado digital para consultar NFS-e?

Não. Basta a chave de acesso de 50 dígitos. Quem consulta não precisa ser o emitente nem o tomador da nota.

### ### Quanto custa consultar uma NFS-e por API?

Por nota entregue: R$ 2,01 no Lite, R$ 0,30 no Starter, R$ 0,195 no Pro e R$ 0,05 no Enterprise. Chave inválida, nota não encontrada e falha não são cobradas.

### ### A API devolve o XML da NFS-e?

Não. A resposta é JSON com os dados da nota e, se pedido com `danfse=true`, o PDF do DANFSe em base64.

### ### Quanto tempo leva a consulta de NFS-e?

Em geral, 30 a 60 s; com nova tentativa, até cerca de 90 s. Uma chave já consultada nas últimas 24 horas volta na hora. Configure o timeout do cliente HTTP para pelo menos 100 segundos.

### ### Quantos dígitos tem a chave de acesso da NFS-e?

50 dígitos: código IBGE do município emissor (7), ambiente gerador (1), tipo de inscrição (1), CPF ou CNPJ do emitente (14), número da NFS-e (13), ano e mês de emissão (4), código numérico (9) e dígito verificador (1).

### ### A consulta mostra se a NFS-e foi cancelada?

Não. O campo `situacao` traz o tipo de geração da nota: `100` gerada, `101` de substituição, `102` por decisão judicial, `103` avulsa. O campo `situacao` não indica cancelamento: cancelamento é um evento registrado à parte. Não use esse campo como prova de que a nota não foi cancelada.

### ### A consulta funciona para NFS-e de qualquer município?

Funciona para NFS-e do padrão nacional: notas emitidas no Emissor Nacional ou compartilhadas com o Ambiente de Dados Nacional. Nota de município com sistema próprio que não compartilha com o padrão nacional pode voltar `404`, e esse `404` não é cobrado.

### ### Dá para consultar várias NFS-e de uma vez?

Faça uma requisição por chave. A conta pode ter até 2 consultas de NFS-e em andamento ao mesmo tempo, dentro do limite por minuto do plano.
