Referência: Exportações
Em breveAtualizado em
Nesta página
A exportação contábil gera, por competência, um ZIP com XMLs, PDFs e uma planilha no layout do seu sistema contábil. Hoje ela é feita pelo painel; a rota pública na API está planejada.
Alternativa 1: exportar pelo painel#
- Abra a tela de exportação contábil no painel (permissão
export:run). - Escolha o layout, a competência e o que incluir: planilha no layout, ZIP de XMLs e ZIP de PDFs.
- Opcionalmente, inclua as notas canceladas.
- Aguarde o processamento e baixe o arquivo.
O link de download vale por 24 horas e o arquivo fica disponível por 7 dias. Quando o arquivo fica pronto, o evento de webhook export.completed é disparado (veja o catálogo).
Formato dos layouts e exemplos em Exportação por layout. Para mandar tudo ao contador todo mês, sem ação manual, veja Envio ao contador.
Alternativa 2: montar a exportação pela API#
Com o escopo nfse:read, você reproduz a exportação no seu sistema:
- Liste as notas da competência com
GET /nfse?competencia=AAAA-MM. - Baixe o XML de cada nota com
GET /nfse/{id}/xml. - Gere a planilha a partir dos campos do objeto NFS-e.
cURL
# 1. Liste as notas autorizadas de novembro (repita com o cursor até has_more = false)
curl "https://emitra.com.br/api/v1/integracao/nfse?competencia=2026-11&status=authorized&limit=200" \
-H "Authorization: Bearer $EMITRA_API_KEY"
# 2. Baixe o XML de cada nota
curl -L -o 42.xml \
https://emitra.com.br/api/v1/integracao/nfse/3c9b7e1a-6d42-4f8e-a0b3-7e2f5d1c9a84/xml \
-H "Authorization: Bearer $EMITRA_API_KEY"Python
import os, requests, zipfile
API = "https://emitra.com.br/api/v1/integracao"
H = {"Authorization": f"Bearer {os.environ['EMITRA_API_KEY']}"}
with zipfile.ZipFile("nfse-2026-11.zip", "w") as zf:
params = {"competencia": "2026-11", "status": "authorized", "limit": 200}
while True:
data = requests.get(f"{API}/nfse", headers=H, params=params, timeout=30).json()["data"]
for nota in data["items"]:
xml = requests.get(f"{API}/nfse/{nota['id']}/xml", headers=H, timeout=60)
zf.writestr(f"{nota['chave_acesso']}.xml", xml.content)
if not data["has_more"]:
break
params["cursor"] = data["next_cursor"]JavaScript
import { writeFile } from "node:fs/promises";
const API = "https://emitra.com.br/api/v1/integracao";
const headers = { Authorization: `Bearer ${process.env.EMITRA_API_KEY}` };
const params = new URLSearchParams({ competencia: "2026-11", status: "authorized", limit: "200" });
while (true) {
const { data } = await (await fetch(`${API}/nfse?${params}`, { headers })).json();
for (const nota of data.items) {
const xml = await fetch(`${API}/nfse/${nota.id}/xml`, { headers });
await writeFile(`${nota.chave_acesso}.xml`, Buffer.from(await xml.arrayBuffer()));
}
if (!data.has_more) break;
params.set("cursor", data.next_cursor);
}PHP
<?php
$api = "https://emitra.com.br/api/v1/integracao";
$headers = ["Authorization: Bearer " . getenv("EMITRA_API_KEY")];
$params = ["competencia" => "2026-11", "status" => "authorized", "limit" => 200];
do {
$ch = curl_init("$api/nfse?" . http_build_query($params));
curl_setopt_array($ch, [CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true]);
$data = json_decode(curl_exec($ch), true)["data"];
foreach ($data["items"] as $nota) {
$ch = curl_init("$api/nfse/{$nota['id']}/xml");
curl_setopt_array($ch, [CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => true]);
file_put_contents("{$nota['chave_acesso']}.xml", curl_exec($ch));
}
$params["cursor"] = $data["next_cursor"];
} while ($data["has_more"]);Cada XML conta como uma chamada no rate limit. Para muitas notas, prefira a exportação do painel, que gera o ZIP de uma vez.
Próximos passos#
Esta página foi útil?