TheOrdem Fiscal

API de integração

Emita NF-e, NFC-e e NFS-e a partir do seu sistema. Você envia os dados da venda em JSON; a API monta, assina com o certificado em custódia, transmite e responde na mesma chamada. A especificação em formato OpenAPI 3.1 está em /api/v1/openapi.json.

URL base: https://fiscal.theordem.com.br/api/v1. Não há ambiente de testes separado: o campo ambiente de cada chamada decide (1 produção, 2 homologação), e a produção de cada emitente precisa ser liberada antes.

Autenticação

Toda chamada leva Authorization: Bearer tof_live_…. A chave é criada no painel, em Chaves de API, por um administrador da conta, e aparece uma única vez. Ela pertence a uma conta: a conta vem sempre da chave, nunca do corpo da requisição.

Chame a API a partir de um servidor. Não há CORS para integradores, e a chave nunca deve ir em código de navegador ou de aplicativo instalado.

Escopos

A chave só faz o que os escopos dela permitem, e nenhum escopo implica outro. Fora do escopo a rota responde 403 escopo_insuficiente. Criar ou revogar chaves, gerir a equipe e alterar a alçada são ações só do painel.

EscopoPermite
ingestaoRegistrar notas emitidas fora da nuvem
leituraConsultar notas, baixar XML e DANFE
emissaoEmitir NF-e, NFC-e e NFS-e; enviar a nota por e-mail; consultar alçada e cota
eventosCancelar, corrigir e inutilizar
emitentesCadastrar e consultar emitentes e numeração
certificadoEnviar o certificado A1
producaoLiberar o ambiente de produção de um emitente
dfeBuscar as notas recebidas de fornecedores e manifestar ciência

Idempotência

Envie uma idempotencyKey sua em cada emissão (obrigatória na NF-e e na NFC-e). A mesma chave nunca gera duas notas para o mesmo emitente: a repetição devolve ja_emitida com a nota original.

Se a resposta for 202, a API continua conciliando a nota com a SEFAZ sozinha; para saber o desfecho, repita a chamada com a mesma chave ou consulte a nota. Se a conexão cair antes da resposta, repita com a mesma chave. Nunca troque a chave para tentar de novo.

Erros

Todo erro vem em JSON com erro (texto para pessoas) e, quase sempre, codigo (estável, para o seu sistema tratar).

StatusQuandoCorpo
400Validação da API{ erro, codigo } — codigo é o nome do campo (ex.: itens[0].ncm)
401Chave inválida ou revogada{ erro }
403Escopo, licença ou produção não liberada{ erro, codigo } — escopo_insuficiente, licenca_…, PRODUCAO_NAO_LIBERADA
404O recurso não existe nesta conta{ erro }
409Operação em andamento ou conflito de estado{ erro, codigo }
422Rejeição da SEFAZ/SEFIN ou regra fiscal{ erro, codigo?, cStat?, xMotivo? }
429Limite por minuto ou cota mensal{ erro, codigo, tentarEmSegundos } e cabeçalho Retry-After
500Erro interno{ erro: "Erro interno", ref } — informe a ref ao suporte

Limites

Os limites valem por chave de API. Ao estourar, a resposta é 429 com Retry-After. Nota rejeitada não gasta a cota mensal.

Leitura (GET)300 por minuto
Escrita60 por minuto
Emissão600 por minuto, e 30 por minuto por emitente
Eventos e inutilização20 por minuto

Webhooks

Cadastre no painel, em Webhooks, um endereço https:// do seu sistema para ser avisado quando uma nota for autorizada, rejeitada, cancelada ou corrigida. O aviso vale para o que acontece por qualquer caminho: pela API, pelo painel ou pela conciliação automática.

EventoQuando
nota.autorizadaA SEFAZ ou a SEFIN autorizou a nota.
nota.rejeitadaA nota foi rejeitada ou denegada.
nota.canceladaO cancelamento foi registrado.
nota.corrigidaUma carta de correção foi registrada.

O corpo leva só referências. Para os dados da nota, consulte GET /documentos/:id com a sua chave.

POST https://seu-sistema.com.br/fiscal/avisos
Content-Type: application/json
X-TheOrdem-Evento: nota.autorizada
X-TheOrdem-Entrega: 5f0c2b1e-8a3d-4f6e-9b7a-2c1d0e9f8a7b
X-TheOrdem-Assinatura: t=1791979200,v1=9f2c…

{
  "id": "5f0c2b1e-8a3d-4f6e-9b7a-2c1d0e9f8a7b",
  "evento": "nota.autorizada",
  "criadoEm": "2026-10-14T12:00:00.000Z",
  "dados": { "documentoId": "0b9f6d3e-…", "clienteId": "…", "modelo": "nfce", "ambiente": 1 }
}

Confira a assinatura antes de confiar no aviso: calcule o HMAC-SHA256 de <t>.<corpo exato recebido> com o segredo do webhook e compare com v1; recuse se t for mais velho que cinco minutos.

import { createHmac, timingSafeEqual } from "node:crypto";

function avisoValido(segredo, corpoBruto, cabecalho) {
  const m = /^t=(\d+),v1=([0-9a-f]{64})$/.exec(cabecalho);
  if (!m || Math.abs(Date.now() / 1000 - Number(m[1])) > 300) return false;
  const esperado = createHmac("sha256", segredo).update(m[1] + "." + corpoBruto).digest();
  return timingSafeEqual(esperado, Buffer.from(m[2], "hex"));
}

Responda 2xx em até 8 segundos. Qualquer outra resposta, inclusive redirecionamento, conta como falha e o aviso é tentado de novo com espera crescente, por até sete vezes. O mesmo aviso pode chegar mais de uma vez: use o id para ignorar repetição. Depois de 20 falhas seguidas o endereço é desativado.

Emitentes

GET/emitentesListar emitentesemitentes

Chave com o escopo emitentes. No painel, papel mínimo: leitor.

Parâmetros de consulta

documentoCNPJ ou CPF completo, com ou sem máscara. Filtra pela igualdade.
buscaTrecho da razão social, do nome fantasia ou início do documento.
limiteItens por página (padrão 50).
cursorproximoCursor da página anterior.

Exemplo de chamada

curl -X GET "https://fiscal.theordem.com.br/api/v1/emitentes" \
  -H "Authorization: Bearer $TOF_CHAVE"

Respostas

200 — Página de emitentes.

{
  "emitentes": [
    {
      "id": "0b9f6d3e-6f6b-4c1e-9d55-1d6d8f3a2c11",
      "documento": "39543895000146",
      "razaoSocial": "Empresa Exemplo LTDA",
      "nomeFantasia": null,
      "codigoMunicipio": "4314407",
      "status": "ativo",
      "certificado": {
        "situacao": "ativo",
        "naoDepois": "2027-09-15T18:40:13+00:00"
      }
    }
  ],
  "proximoCursor": null
}
POST/emitentesCadastrar emitenteemitentes

O dígito verificador do CNPJ/CPF é validado. A produção nunca é liberada no cadastro.

Chave com o escopo emitentes. No painel, papel mínimo: operador.

Exemplo de chamada

curl -X POST "https://fiscal.theordem.com.br/api/v1/emitentes" \
  -H "Authorization: Bearer $TOF_CHAVE" \
  -H "Content-Type: application/json" \
  -d '{
  "documento": "39543895000146",
  "razaoSocial": "Empresa Exemplo LTDA",
  "nomeFantasia": "Exemplo",
  "codigoMunicipio": "4314407",
  "config": {
    "nfe": {
      "ie": "0960000000",
      "crt": 1,
      "endereco": {
        "uf": "RS",
        "codigoMunicipio": "4314407",
        "cep": "96020152",
        "logradouro": "Avenida Exemplo",
        "numero": "130",
        "bairro": "Centro",
        "municipio": "Pelotas"
      },
      "series": {
        "nfe": 1,
        "nfce": 1
      }
    }
  }
}'

Respostas

201 — Criado.

{
  "id": "0b9f6d3e-6f6b-4c1e-9d55-1d6d8f3a2c11"
}

409 — Documento já cadastrado na conta (traz o id do existente) ou limite de emitentes do plano.

{
  "erro": "Já existe um emitente com este documento nesta conta.",
  "codigo": "documento_ja_cadastrado",
  "id": "0b9f6d3e-6f6b-4c1e-9d55-1d6d8f3a2c11"
}
POST/emitentes/importacaoCadastrar emitentes em loteemitentes

Até 200 linhas por chamada; cada linha tem o seu resultado.

Chave com o escopo emitentes. No painel, papel mínimo: operador.

Exemplo de chamada

curl -X POST "https://fiscal.theordem.com.br/api/v1/emitentes/importacao" \
  -H "Authorization: Bearer $TOF_CHAVE" \
  -H "Content-Type: application/json" \
  -d '{
  "emitentes": [
    {
      "documento": "39543895000146",
      "razaoSocial": "Empresa Exemplo LTDA"
    }
  ]
}'

Respostas

200 — Resultado por linha.

{
  "resumo": {
    "total": 1,
    "criados": 1,
    "jaExistentes": 0,
    "erros": 0
  },
  "resultados": [
    {
      "indice": 0,
      "status": "criado",
      "id": "0b9f6d3e-6f6b-4c1e-9d55-1d6d8f3a2c11"
    }
  ]
}
GET/emitentes/:idDetalhe do emitenteemitentes

Chave com o escopo emitentes. No painel, papel mínimo: leitor.

Exemplo de chamada

curl -X GET "https://fiscal.theordem.com.br/api/v1/emitentes/<id>" \
  -H "Authorization: Bearer $TOF_CHAVE"

Respostas

200 — Cadastro e config.

{
  "id": "0b9f6d3e-6f6b-4c1e-9d55-1d6d8f3a2c11",
  "tipoDoc": "CNPJ",
  "documento": "39543895000146",
  "inscricaoMunicipal": null,
  "razaoSocial": "Empresa Exemplo LTDA",
  "nomeFantasia": null,
  "codigoMunicipio": "4314407",
  "status": "ativo",
  "config": {
    "nfe": {
      "ie": "0960000000",
      "crt": 1,
      "producao": false
    }
  }
}
PATCH/emitentes/:idAtualizar emitenteemitentes

config entra por merge: mande só o que mudou. documento e tipoDoc são imutáveis. Mudar config.nfe.producao ou config.nfse.producao exige o escopo producao (na sessão: admin com código de e-mail recente).

Chave com o escopo emitentes. No painel, papel mínimo: operador.

Exemplo de chamada

curl -X PATCH "https://fiscal.theordem.com.br/api/v1/emitentes/<id>" \
  -H "Authorization: Bearer $TOF_CHAVE" \
  -H "Content-Type: application/json" \
  -d '{
  "config": {
    "nfe": {
      "producao": true
    }
  }
}'

Respostas

200 — Atualizado.

{
  "atualizado": true
}
POST/emitentes/:id/certificadoEnviar o certificado A1certificado

Chave privada e certificado em PEM; a API nunca recebe .pfx nem senha. O CNPJ/CPF do certificado precisa ser o do emitente (CNPJ confere pela raiz). Na sessão exige código de e-mail recente.

Chave com o escopo certificado. No painel, papel mínimo: admin.

Exemplo de chamada

curl -X POST "https://fiscal.theordem.com.br/api/v1/emitentes/<id>/certificado" \
  -H "Authorization: Bearer $TOF_CHAVE" \
  -H "Content-Type: application/json" \
  -d '{
  "chavePem": "-----BEGIN PRIVATE KEY-----\n…\n-----END PRIVATE KEY-----",
  "certPem": "-----BEGIN CERTIFICATE-----\n…\n-----END CERTIFICATE-----"
}'

Respostas

201 — Guardado em custódia; só metadados voltam.

{
  "id": "0b9f6d3e-6f6b-4c1e-9d55-1d6d8f3a2c11",
  "fingerprintSha256": "06:42:56:…",
  "titularCn": "EMPRESA EXEMPLO LTDA:39543895000146",
  "naoDepois": "2027-09-15T18:40:13+00:00"
}

422 — Recusado: chave_invalida, certificado_invalido, par_invalido, certificado_vencido, titular_nao_identificado ou titular_divergente.

{
  "erro": "O certificado é de outro CNPJ.",
  "codigo": "titular_divergente"
}
GET/emitentes/:id/certificadoSituação do certificadoemitentes

Chave com o escopo emitentes. No painel, papel mínimo: leitor.

Exemplo de chamada

curl -X GET "https://fiscal.theordem.com.br/api/v1/emitentes/<id>/certificado" \
  -H "Authorization: Bearer $TOF_CHAVE"

Respostas

200 — Metadados do A1 ativo.

{
  "id": "0b9f6d3e-6f6b-4c1e-9d55-1d6d8f3a2c11",
  "fingerprintSha256": "06:42:56:…",
  "titularCn": "EMPRESA EXEMPLO LTDA:39543895000146",
  "naoAntes": "2026-09-15T18:40:13+00:00",
  "naoDepois": "2027-09-15T18:40:13+00:00",
  "status": "ativo",
  "vencido": false,
  "diasParaVencer": 337
}

404 — Emitente sem certificado ativo.

GET/emitentes/:id/numeracaoConsultar a numeração de uma sérieemitentes

Chave com o escopo emitentes. No painel, papel mínimo: leitor.

Parâmetros de consulta

modelo (obrigatório)55 (NF-e) ou 65 (NFC-e).
serie (obrigatório)1 a 889.
ambiente (obrigatório)1 produção, 2 homologação.

Exemplo de chamada

curl -X GET "https://fiscal.theordem.com.br/api/v1/emitentes/<id>/numeracao" \
  -H "Authorization: Bearer $TOF_CHAVE"

Respostas

200 — Contador atual.

{
  "modelo": 65,
  "serie": 1,
  "ambiente": 1,
  "ultimoNumero": 482,
  "proximoNumero": 483
}
PUT/emitentes/:id/numeracaoInformar a numeração inicial de uma sérieemitentes

Para quem já emite por outro sistema. O contador só anda para a frente; a próxima nota sai com ultimoNumero + 1. Repetir o mesmo valor responde 200.

Chave com o escopo emitentes. No painel, papel mínimo: admin.

Exemplo de chamada

curl -X PUT "https://fiscal.theordem.com.br/api/v1/emitentes/<id>/numeracao" \
  -H "Authorization: Bearer $TOF_CHAVE" \
  -H "Content-Type: application/json" \
  -d '{
  "modelo": 65,
  "serie": 1,
  "ambiente": 1,
  "ultimoNumero": 482
}'

Respostas

200 — Contador posicionado.

{
  "modelo": 65,
  "serie": 1,
  "ambiente": 1,
  "ultimoNumero": 482,
  "proximoNumero": 483
}

409 — O contador já passou do valor pedido.

{
  "erro": "A numeração desta série já está em 500.",
  "codigo": "numeracao_menor",
  "modelo": 65,
  "serie": 1,
  "ambiente": 1,
  "ultimoNumero": 500,
  "proximoNumero": 501
}

Emissão

POST/documentos/nfeEmitir NF-e (modelo 55)emissao

A API monta, assina e transmite o XML e responde na mesma chamada. Dados do emitente (IE, regime, endereço, série) vêm do cadastro. idempotencyKey é obrigatória e vale por emitente. Acima da alçada da conta, envie confirmacaoValor igual ao total.

Chave com o escopo emissao. No painel, papel mínimo: operador.

Exemplo de chamada

curl -X POST "https://fiscal.theordem.com.br/api/v1/documentos/nfe" \
  -H "Authorization: Bearer $TOF_CHAVE" \
  -H "Content-Type: application/json" \
  -d '{
  "clienteId": "0b9f6d3e-6f6b-4c1e-9d55-1d6d8f3a2c11",
  "idempotencyKey": "venda-123",
  "ambiente": 2,
  "presenca": 1,
  "naturezaOperacao": "Venda de mercadoria",
  "destinatario": {
    "documento": "12345678000195",
    "nome": "Cliente Exemplo LTDA",
    "indIEDest": 9,
    "endereco": {
      "uf": "RS",
      "codigoMunicipio": "4314902",
      "cep": "90000000",
      "logradouro": "Rua Exemplo",
      "numero": "100",
      "bairro": "Centro",
      "municipio": "Porto Alegre"
    }
  },
  "itens": [
    {
      "codigo": "1",
      "descricao": "Produto exemplo",
      "ncm": "61091000",
      "cfop": "5102",
      "unidade": "UN",
      "quantidade": 1,
      "valorUnitario": 19.9
    }
  ],
  "pagamentos": [
    {
      "meio": "01",
      "valor": 19.9
    }
  ],
  "informacoesComplementares": "Texto livre opcional"
}'

Respostas

200 — Autorizada, ou ja_emitida quando a idempotencyKey já gerou esta nota.

{
  "tipo": "autorizada",
  "documentoId": "0b9f6d3e-6f6b-4c1e-9d55-1d6d8f3a2c11",
  "chaveAcesso": "43261039543895000146550010000001231123456789",
  "numero": 123,
  "protocolo": "143260000012345",
  "autorizadaEm": "2026-10-13T14:30:07-03:00"
}

202 — Sem resposta da SEFAZ. Não é erro: a API segue conciliando a nota sozinha, e repetir com a mesma idempotencyKey devolve o desfecho.

{
  "status": "em_processamento",
  "documentoId": "0b9f6d3e-6f6b-4c1e-9d55-1d6d8f3a2c11",
  "chaveAcesso": "43261039543895000146550010000001231123456789",
  "numero": 123,
  "mensagem": "A SEFAZ não respondeu. Repita a chamada com a mesma idempotencyKey."
}

409 — Outra chamada com a mesma idempotencyKey está em andamento.

{
  "erro": "Já existe uma emissão em andamento para esta chave.",
  "codigo": "EMISSAO_EM_ANDAMENTO"
}

422 — Rejeição ou denegação da SEFAZ, ou regra fiscal da API (NFE_NAO_CONFIGURADO, UF_NAO_SUPORTADA).

{
  "erro": "Rejeitada pela SEFAZ.",
  "documentoId": "0b9f6d3e-6f6b-4c1e-9d55-1d6d8f3a2c11",
  "chaveAcesso": "43261039543895000146550010000001231123456789",
  "numero": 123,
  "cStat": "539",
  "xMotivo": "Rejeição: Duplicidade de NF-e, com diferença na Chave de Acesso"
}
POST/documentos/nfceEmitir NFC-e (modelo 65)emissao

Mesmo corpo da NF-e; o destinatário é opcional. A resposta traz também qrCode e urlChave, para o cupom.

Chave com o escopo emissao. No painel, papel mínimo: operador.

Exemplo de chamada

curl -X POST "https://fiscal.theordem.com.br/api/v1/documentos/nfce" \
  -H "Authorization: Bearer $TOF_CHAVE" \
  -H "Content-Type: application/json" \
  -d '{
  "clienteId": "0b9f6d3e-6f6b-4c1e-9d55-1d6d8f3a2c11",
  "idempotencyKey": "venda-123",
  "ambiente": 2,
  "presenca": 1,
  "naturezaOperacao": "Venda de mercadoria",
  "itens": [
    {
      "codigo": "1",
      "descricao": "Produto exemplo",
      "ncm": "61091000",
      "cfop": "5102",
      "unidade": "UN",
      "quantidade": 1,
      "valorUnitario": 19.9
    }
  ],
  "pagamentos": [
    {
      "meio": "01",
      "valor": 19.9
    }
  ],
  "informacoesComplementares": "Texto livre opcional"
}'

Respostas

200 — Autorizada, ou ja_emitida quando a idempotencyKey já gerou esta nota.

{
  "tipo": "autorizada",
  "documentoId": "0b9f6d3e-6f6b-4c1e-9d55-1d6d8f3a2c11",
  "chaveAcesso": "43261039543895000146550010000001231123456789",
  "numero": 123,
  "protocolo": "143260000012345",
  "autorizadaEm": "2026-10-13T14:30:07-03:00",
  "qrCode": "https://www.sefaz.rs.gov.br/NFCE/NFCE-COM.aspx?p=…",
  "urlChave": "www.sefaz.rs.gov.br/nfce/consulta"
}

202 — Sem resposta da SEFAZ. Não é erro: a API segue conciliando a nota sozinha, e repetir com a mesma idempotencyKey devolve o desfecho.

{
  "status": "em_processamento",
  "documentoId": "0b9f6d3e-6f6b-4c1e-9d55-1d6d8f3a2c11",
  "chaveAcesso": "43261039543895000146550010000001231123456789",
  "numero": 123,
  "mensagem": "A SEFAZ não respondeu. Repita a chamada com a mesma idempotencyKey."
}

409 — Outra chamada com a mesma idempotencyKey está em andamento.

{
  "erro": "Já existe uma emissão em andamento para esta chave.",
  "codigo": "EMISSAO_EM_ANDAMENTO"
}

422 — Rejeição ou denegação da SEFAZ, ou regra fiscal da API (NFE_NAO_CONFIGURADO, UF_NAO_SUPORTADA).

{
  "erro": "Rejeitada pela SEFAZ.",
  "documentoId": "0b9f6d3e-6f6b-4c1e-9d55-1d6d8f3a2c11",
  "chaveAcesso": "43261039543895000146550010000001231123456789",
  "numero": 123,
  "cStat": "539",
  "xMotivo": "Rejeição: Duplicidade de NF-e, com diferença na Chave de Acesso"
}
POST/documentos/nfseEmitir NFS-e (padrão nacional)emissao

Vale para municípios aderentes ao padrão nacional. idempotencyKey é recomendada e vale por emitente. Desde a competência 10/2026 a SEFIN exige o IBS/CBS (servico.ibscbs: cIndOp, cst, cClassTrib, pela correlação oficial do item da LC 116 e da NBS); sem ele, vale o padrão do cadastro do emitente. Quando o IBS/CBS incide no domicílio do tomador, tomador.endereco é obrigatório.

Chave com o escopo emissao. No painel, papel mínimo: operador.

Exemplo de chamada

curl -X POST "https://fiscal.theordem.com.br/api/v1/documentos/nfse" \
  -H "Authorization: Bearer $TOF_CHAVE" \
  -H "Content-Type: application/json" \
  -d '{
  "clienteId": "0b9f6d3e-6f6b-4c1e-9d55-1d6d8f3a2c11",
  "ambiente": 2,
  "idempotencyKey": "os-987",
  "tomador": {
    "documento": "11122233344",
    "tipo": "CPF",
    "nome": "Fulano de Tal",
    "endereco": {
      "codigoMunicipio": "4314407",
      "cep": "96010140",
      "logradouro": "Rua Andrade Neves",
      "numero": "100",
      "complemento": "Sala 2",
      "bairro": "Centro"
    }
  },
  "servico": {
    "cTribNac": "170101",
    "descricao": "Serviço prestado",
    "cNBS": "114011900",
    "codMunicipio": "4314407",
    "valor": 150,
    "ibscbs": {
      "cIndOp": "100301",
      "cst": "000",
      "cClassTrib": "000001"
    }
  }
}'

Respostas

200 — Autorizada, ou ja_emitida.

{
  "tipo": "autorizada",
  "documentoId": "0b9f6d3e-6f6b-4c1e-9d55-1d6d8f3a2c11",
  "chaveAcesso": "4314407239543895000146000000000000126101234567890",
  "numeroNfse": "12"
}

202 — Sem resposta da SEFIN: repita com a mesma idempotencyKey.

{
  "status": "em_recuperacao",
  "documentoId": "0b9f6d3e-6f6b-4c1e-9d55-1d6d8f3a2c11",
  "mensagem": "A SEFIN não respondeu."
}

422 — Rejeitada pela SEFIN.

{
  "erro": "Rejeitada pela SEFIN.",
  "documentoId": "0b9f6d3e-6f6b-4c1e-9d55-1d6d8f3a2c11",
  "codigos": [
    {
      "codigo": "E0001",
      "descricao": "…"
    }
  ]
}

Depois da emissão

POST/documentos/:id/eventosCancelar ou corrigir NF-e/NFC-eeventos

tipo: "cancelamento" com justificativa, ou tipo: "cce" com correcao (15 a 255 caracteres; a NFC-e não tem carta de correção). Só para notas emitidas pela nuvem.

Chave com o escopo eventos. No painel, papel mínimo: operador.

Exemplo de chamada

curl -X POST "https://fiscal.theordem.com.br/api/v1/documentos/<id>/eventos" \
  -H "Authorization: Bearer $TOF_CHAVE" \
  -H "Content-Type: application/json" \
  -d '{
  "tipo": "cancelamento",
  "justificativa": "Cliente desistiu da compra antes da entrega"
}'

Respostas

200 — cancelada, ja_cancelada ou corrigida (com sequencia).

{
  "tipo": "cancelada",
  "chave": "43261039543895000146550010000001231123456789",
  "protocolo": "243260000000001"
}

409 — Já há um evento em andamento para a nota.

{
  "erro": "Já existe uma operação em andamento.",
  "codigo": "OPERACAO_EM_ANDAMENTO"
}

422 — Recusa da SEFAZ, com cStat e xMotivo.

{
  "erro": "A SEFAZ recusou o evento (501): Rejeição: Prazo de Cancelamento Superior ao Previsto",
  "codigo": "SEFAZ_501",
  "cStat": "501",
  "xMotivo": "Rejeição: Prazo de Cancelamento Superior ao Previsto"
}
POST/documentos/:id/cancelamentoCancelar NFS-eeventos

Chave com o escopo eventos. No painel, papel mínimo: operador.

Exemplo de chamada

curl -X POST "https://fiscal.theordem.com.br/api/v1/documentos/<id>/cancelamento" \
  -H "Authorization: Bearer $TOF_CHAVE" \
  -H "Content-Type: application/json" \
  -d '{
  "motivo": 1,
  "justificativa": "Serviço não prestado conforme combinado",
  "tipo": "101101"
}'

Respostas

200 — cancelada, ou em_analise quando o pedido vai à análise da prefeitura (tipo: "101103").

{
  "tipo": "cancelada",
  "documentoId": "0b9f6d3e-6f6b-4c1e-9d55-1d6d8f3a2c11"
}
POST/emitentes/:id/inutilizacaoInutilizar uma faixa de númeroseventos

Irreversível. A faixa não pode começar depois do próximo número da série; se passa do contador, o contador avança junto. ambiente: 1 exige a produção liberada.

Chave com o escopo eventos. No painel, papel mínimo: admin.

Exemplo de chamada

curl -X POST "https://fiscal.theordem.com.br/api/v1/emitentes/<id>/inutilizacao" \
  -H "Authorization: Bearer $TOF_CHAVE" \
  -H "Content-Type: application/json" \
  -d '{
  "modelo": 55,
  "serie": 1,
  "ambiente": 2,
  "inicio": 483,
  "fim": 485,
  "justificativa": "Numeracao pulada por falha no sistema de origem"
}'

Respostas

200 — inutilizada, ou ja_inutilizada na repetição do mesmo pedido.

{
  "tipo": "inutilizada",
  "modelo": 55,
  "serie": 1,
  "ambiente": 2,
  "inicio": 483,
  "fim": 485,
  "protocolo": "143260000000100"
}

409 — Já há um pedido em andamento para a série.

{
  "erro": "Já existe uma inutilização em andamento para esta série.",
  "codigo": "OPERACAO_EM_ANDAMENTO"
}

422 — FAIXA_ALEM_DA_NUMERACAO, NFE_NAO_CONFIGURADO ou recusa da SEFAZ com cStat/xMotivo.

{
  "erro": "A numeração desta série está em 480: a faixa não pode começar depois de 481.",
  "codigo": "FAIXA_ALEM_DA_NUMERACAO"
}
GET/documentos/:id/xmlBaixar o XML autorizado ou o XML de um eventoleitura

Sem parâmetros: o nfeProc (NF-e/NFC-e) ou o XML da SEFIN (NFS-e). Com evento: o procEventoNFe.

Chave com o escopo leitura. No painel, papel mínimo: leitor.

Parâmetros de consulta

eventocancelamento ou cce.
sequenciaSequência da carta de correção, 1 a 20 (padrão 1).

Exemplo de chamada

curl -X GET "https://fiscal.theordem.com.br/api/v1/documentos/<id>/xml" \
  -H "Authorization: Bearer $TOF_CHAVE"

Respostas

200 — O XML, exatamente como foi guardado.

404 — Nota sem XML autorizado ou sem o evento pedido.

{
  "erro": "Nota sem XML autorizado.",
  "codigo": "xml_indisponivel"
}
GET/documentos/:id/danfeDANFE em PDF (NF-e e NFC-e)leitura

A4 para a NF-e, bobina de 80 mm para a NFC-e, desenhado a partir do XML autorizado. Nota cancelada sai marcada.

Chave com o escopo leitura. No painel, papel mínimo: leitor.

Exemplo de chamada

curl -X GET "https://fiscal.theordem.com.br/api/v1/documentos/<id>/danfe" \
  -H "Authorization: Bearer $TOF_CHAVE"

Respostas

200 — O PDF.

422 — A nota é NFS-e: use /danfse.

{
  "erro": "O DANFE existe para NF-e e NFC-e.",
  "codigo": "modelo_sem_danfe"
}
POST/documentos/:id/envioEnviar a nota por e-mail ao destinatárioemissao

Um destinatário por chamada. O e-mail tem texto fixo e leva o XML em anexo e, na NF-e e na NFC-e, o DANFE em PDF. Só nota autorizada e emitida pela API (nota de ingestão responde 422 nota_de_ingestao). Conta no limite de eventos.

Chave com o escopo emissao. No painel, papel mínimo: operador.

Exemplo de chamada

curl -X POST "https://fiscal.theordem.com.br/api/v1/documentos/<id>/envio" \
  -H "Authorization: Bearer $TOF_CHAVE" \
  -H "Content-Type: application/json" \
  -d '{
  "email": "cliente@exemplo.com.br"
}'

Respostas

200 — Aceito pelo provedor de e-mail.

{
  "enviado": true,
  "email": "cliente@exemplo.com.br",
  "anexos": [
    "nfe-43261039543895000146550010000001231123456789.xml",
    "nfe-43261039543895000146550010000001231123456789.pdf"
  ]
}

502 — O provedor de e-mail não aceitou o envio. Pode repetir.

{
  "erro": "O e-mail não pôde ser enviado agora. Tente novamente em instantes.",
  "codigo": "email_nao_enviado"
}
GET/documentos/:id/danfseDados do DANFSe (NFS-e)leitura

Dados estruturados para desenhar o DANFSe; não é PDF.

Chave com o escopo leitura. No painel, papel mínimo: leitor.

Exemplo de chamada

curl -X GET "https://fiscal.theordem.com.br/api/v1/documentos/<id>/danfse" \
  -H "Authorization: Bearer $TOF_CHAVE"

Respostas

200 — Campos do DANFSe lidos do XML.

{
  "danfse": {
    "numero": "12",
    "chaveAcesso": "…"
  }
}

Consultas

GET/documentosListar e localizar notasleitura

Para localizar uma nota: chave (44 posições, ou 50 dígitos na NFS-e), ou idempotencyKey junto de clienteId e modelo. Lista vazia na consulta por idempotência significa que a chave nunca foi usada por esse emitente.

Chave com o escopo leitura. No painel, papel mínimo: leitor.

Parâmetros de consulta

chaveChave de acesso.
idempotencyKeyExige clienteId e modelo.
clienteIdEmitente.
modelonfe, nfce ou nfse.
statusrascunho, assinada, transmitida, autorizada, rejeitada, cancelada ou erro.
origemcloud (emitida pela API) ou ingestao.
deData inicial, AAAA-MM-DD.
ateData final, AAAA-MM-DD.
limiteItens por página (padrão 50).
cursorproximoCursor da página anterior.

Exemplo de chamada

curl -X GET "https://fiscal.theordem.com.br/api/v1/documentos" \
  -H "Authorization: Bearer $TOF_CHAVE"

Respostas

200 — Página de notas.

{
  "documentos": [
    {
      "id": "0b9f6d3e-6f6b-4c1e-9d55-1d6d8f3a2c11",
      "modelo": "nfce",
      "origem": "cloud",
      "numero": "123",
      "serie": "1",
      "status": "autorizada",
      "valorTotal": 19.9,
      "emitidaEm": "2026-10-13T17:30:05+00:00",
      "createdAt": "2026-10-13T17:30:04+00:00",
      "chave": "43261039543895000146550010000001231123456789"
    }
  ],
  "proximoCursor": null
}
GET/documentos/:idDetalhe da notaleitura

Inclui a linha do tempo dos eventos. Não devolve XML.

Chave com o escopo leitura. No painel, papel mínimo: leitor.

Exemplo de chamada

curl -X GET "https://fiscal.theordem.com.br/api/v1/documentos/<id>" \
  -H "Authorization: Bearer $TOF_CHAVE"

Respostas

200 — A nota.

{
  "id": "0b9f6d3e-6f6b-4c1e-9d55-1d6d8f3a2c11",
  "clienteId": "0b9f6d3e-6f6b-4c1e-9d55-1d6d8f3a2c11",
  "modelo": "nfe",
  "origem": "cloud",
  "ambiente": 1,
  "numero": "123",
  "serie": "1",
  "status": "autorizada",
  "valorTotal": 19.9,
  "emitidaEm": "2026-10-13T17:30:05+00:00",
  "createdAt": "2026-10-13T17:30:04+00:00",
  "chave": "43261039543895000146550010000001231123456789",
  "protocolo": "143260000012345",
  "motivoRejeicao": null,
  "eventos": []
}

Notas recebidas

POST/emitentes/:id/dfe/buscaBuscar na SEFAZ as notas emitidas contra o CNPJdfe

Consulta a distribuição de DF-e do Ambiente Nacional (só produção) com o A1 do emitente e guarda o que veio. Não altera nada na SEFAZ. Ao chegar ao fim da fila, a SEFAZ só aceita nova busca em 1 hora: antes disso a rota responde 429 DFE_AGUARDE sem consultar.

Chave com o escopo dfe. No painel, papel mínimo: operador.

Exemplo de chamada

curl -X POST "https://fiscal.theordem.com.br/api/v1/emitentes/<id>/dfe/busca" \
  -H "Authorization: Bearer $TOF_CHAVE"

Respostas

200 — Busca feita. novas é quantas notas entraram na caixa.

{
  "novas": 3,
  "proximaConsulta": "2026-10-13T19:00:00.000Z"
}

409 — Já há uma busca em andamento para o emitente.

{
  "erro": "Já existe uma busca em andamento para este emitente.",
  "codigo": "OPERACAO_EM_ANDAMENTO"
}

429 — Dentro da espera imposta pela SEFAZ.

{
  "erro": "A SEFAZ só aceita uma nova busca depois deste horário.",
  "codigo": "DFE_AGUARDE",
  "proximaConsulta": "2026-10-13T19:00:00.000Z",
  "tentarEmSegundos": 1800
}
GET/emitentes/:id/dfeListar as notas recebidasdfe

O que já está na caixa, mais recentes primeiro; não fala com a SEFAZ. estado: resumo (só o cabeçalho), ciencia (manifestada, XML ainda não veio) ou completa (XML disponível).

Chave com o escopo dfe. No painel, papel mínimo: leitor.

Exemplo de chamada

curl -X GET "https://fiscal.theordem.com.br/api/v1/emitentes/<id>/dfe" \
  -H "Authorization: Bearer $TOF_CHAVE"

Respostas

200 — Notas e horários de consulta.

{
  "notas": [
    {
      "chave": "43261039543895000146550010000001231123456789",
      "emitente": {
        "documento": "12345678000190",
        "nome": "Fornecedor Exemplo LTDA"
      },
      "emissao": "2026-10-10",
      "valor": 350.9,
      "situacao": "autorizada",
      "estado": "resumo"
    }
  ],
  "ultimaConsulta": "2026-10-13T18:00:00.000Z",
  "proximaConsulta": "2026-10-13T19:00:00.000Z"
}
POST/emitentes/:id/dfe/cienciaManifestar ciência de uma nota e trazer o XMLdfe

Registra na SEFAZ a Ciência da Operação (evento 210210) e pede o XML completo. É um ato fiscal em nome do emitente; não confirma a compra. A nota precisa estar na lista.

Chave com o escopo dfe. No painel, papel mínimo: operador.

Exemplo de chamada

curl -X POST "https://fiscal.theordem.com.br/api/v1/emitentes/<id>/dfe/ciencia" \
  -H "Authorization: Bearer $TOF_CHAVE" \
  -H "Content-Type: application/json" \
  -d '{
  "chave": "43261039543895000146550010000001231123456789"
}'

Respostas

200 — XML disponível em /dfe/xml.

{
  "tipo": "completa",
  "chave": "43261039543895000146550010000001231123456789"
}

202 — Ciência registrada, mas a SEFAZ ainda não liberou o XML. Repita mais tarde.

{
  "tipo": "aguardando",
  "chave": "43261039543895000146550010000001231123456789"
}

422 — NOTA_DESCONHECIDA, NOTA_SEM_VALOR (cancelada ou denegada) ou recusa da SEFAZ com cStat/xMotivo.

{
  "erro": "Essa nota não está na lista. Busque as notas de novo.",
  "codigo": "NOTA_DESCONHECIDA"
}
GET/emitentes/:id/dfe/xmlBaixar o XML de uma nota recebidadfe

Chave com o escopo dfe. No painel, papel mínimo: leitor.

Parâmetros de consulta

chave (obrigatório)Chave de acesso, 44 dígitos.

Exemplo de chamada

curl -X GET "https://fiscal.theordem.com.br/api/v1/emitentes/<id>/dfe/xml" \
  -H "Authorization: Bearer $TOF_CHAVE"

Respostas

200 — O nfeProc da nota do fornecedor.

404 — A nota ainda não tem XML na caixa: manifeste a ciência antes.

{
  "erro": "O XML desta nota ainda não está disponível.",
  "codigo": "xml_indisponivel"
}

Ingestão

POST/documentos/ingestaoRegistrar uma nota emitida fora da nuvemingestao

Para o sistema que emite localmente e quer a nota na conta. A chave de acesso impede duplicar; série e número são lidos dela. protocolo é obrigatório quando status é autorizada. O XML vai até 1 MB e precisa conter a chave.

Chave com o escopo ingestao. No painel, papel mínimo: operador.

Exemplo de chamada

curl -X POST "https://fiscal.theordem.com.br/api/v1/documentos/ingestao" \
  -H "Authorization: Bearer $TOF_CHAVE" \
  -H "Content-Type: application/json" \
  -d '{
  "clienteId": "0b9f6d3e-6f6b-4c1e-9d55-1d6d8f3a2c11",
  "modelo": "nfce",
  "ambiente": 1,
  "status": "autorizada",
  "chave": "43261039543895000146650010000001231123456789",
  "protocolo": "143260000012345",
  "emitidaEm": "2026-10-13T14:30:00-03:00",
  "valorTotal": 19.9,
  "xmlAutorizado": "<nfeProc …>…</nfeProc>"
}'

Respostas

201 — Registrada.

{
  "tipo": "registrada",
  "documentoId": "0b9f6d3e-6f6b-4c1e-9d55-1d6d8f3a2c11",
  "chave": "43261039543895000146550010000001231123456789"
}

200 — ja_registrada (mesma chave, mesmo status) ou atualizada (autorizada que chega como cancelada).

{
  "tipo": "ja_registrada",
  "documentoId": "0b9f6d3e-6f6b-4c1e-9d55-1d6d8f3a2c11",
  "chave": "43261039543895000146550010000001231123456789"
}

409 — Mudança de status não permitida.

{
  "erro": "Transição de status não permitida para esta nota.",
  "codigo": "transicao_invalida"
}
POST/documentos/ingestao/loteRegistrar notas em loteingestao

Até 50 notas e 4 MB por chamada. Uma nota ruim não derruba as outras; reenviar o lote inteiro é seguro.

Chave com o escopo ingestao. No painel, papel mínimo: operador.

Exemplo de chamada

curl -X POST "https://fiscal.theordem.com.br/api/v1/documentos/ingestao/lote" \
  -H "Authorization: Bearer $TOF_CHAVE" \
  -H "Content-Type: application/json" \
  -d '{
  "documentos": [
    "(mesmo corpo da rota unitária)"
  ]
}'

Respostas

200 — resumo e resultados por índice.

{
  "resumo": {
    "total": 2,
    "registradas": 1,
    "jaRegistradas": 1,
    "atualizadas": 0,
    "erros": 0
  },
  "resultados": [
    "(um resultado por nota, na ordem enviada)"
  ]
}

Conta

GET/contaPlano, alçada e saldo da cotaemissao

Chave com o escopo emissao. No painel, papel mínimo: leitor.

Exemplo de chamada

curl -X GET "https://fiscal.theordem.com.br/api/v1/conta" \
  -H "Authorization: Bearer $TOF_CHAVE"

Respostas

200 — uso.saldoMensal é quanto ainda cabe na cota do mês (null = plano sem cota).

{
  "nome": "Conta Exemplo",
  "slug": "conta-exemplo",
  "alcadaValor": 100000,
  "plano": {
    "estado": "ativa",
    "validade": "2026-12-31",
    "maxEmitentes": 300,
    "maxUsuarios": 5,
    "cotaMensal": 10000
  },
  "uso": {
    "emitentes": 42,
    "usuarios": 3,
    "emissoesNoMes": 1730,
    "saldoMensal": 8270
  }
}