Endpoints

Todos os endpoints são prefixados com https://platform.notaas.com.br/api/v1 e requerem o header x-api-key.

Emissão NFS-e

POST/emitir🔑 x-api-key

Enfileira uma NFS-e para emissão assíncrona. Retorna 202 com invoiceId para polling.

Body (JSON)

CampoTipoReq?Descrição
tomador.cnpjstringsimCNPJ do tomador (14 dígitos, sem formatação). Obrigatório pelo XSD — use CNPJ ou CPF.
tomador.cpfstringnãoCPF do tomador (11 dígitos). Alternativo ao CNPJ.
tomador.nomestringsimNome ou razão social do tomador. Obrigatório pelo XSD (TCInfoPessoa.xNome).
tomador.emailstringnãoE-mail do tomador para envio da nota
tomador.telefonestringnãoTelefone do tomador (apenas dígitos)
tomador.endereco.logradourostringnãoLogradouro do tomador
tomador.endereco.numerostringnãoNúmero do endereço
tomador.endereco.complementostringnãoComplemento do endereço
tomador.endereco.bairrostringnãoBairro do tomador
tomador.endereco.cidadestringnãoNome da cidade — resolvido para código IBGE automaticamente. Obrigatório se endereco for informado.
tomador.endereco.ufstringnãoSigla do estado (ex: "SP"). Obrigatório se endereco for informado.
tomador.endereco.cepstringnãoCEP do tomador (apenas dígitos). Recomendado — XSD exige CEP no endereço nacional.
servico.descricaostringsimDescrição do serviço prestado
servico.codigostringnãocTribNac LC 116/2003 — 6 dígitos numéricos (ex: "010700"). Opcional: usa o Código de Tributação padrão do projeto se omitido. ❌ "1.07" → ✅ "010700". Não aplicável para São Paulo. Códigos do Item 99 (ex: "990101" — sem incidência de ISSQN/ICMS): informar aliquotaIss: 0.
servico.codigoServicostringnãoCódigo de serviço SP (4–5 dígitos, ex: "07498"). Opcional para projetos em SP — usa padrão do projeto se omitido.
servico.localPrestacaostringnãoCódigo IBGE 7 dígitos do local de prestação. Opcional — padrão: município do projeto.
servico.nbsstringnãoCódigo NBS — Nomenclatura Brasileira de Serviços (9 dígitos numéricos, ex: "100401000"). Opcional — aplicável apenas para SNNFSE federal (ignorado para SP e ABRASF). Retorna 400 se informado com formato inválido.
valores.totalnumbersimValor bruto do serviço em reais (ex: 1500.00)
valores.aliquotaIssnumbersimAlíquota ISS em % (ex: 2.0 para 2%). Para serviços sem incidência de ISSQN/ICMS (cTribNac do Item 99, ex: "990101"), informar 0. Ignorado automaticamente quando a tributação ISSQN do projeto está configurada como Não Incidência, Imunidade ou Exportação (Settings → Tributação ISSQN).
valores.issRetidobooleannãoISS retido pelo tomador (padrão: false)
valores.totaisTributosAproximadosobjectnãoTotais aproximados de tributos por esfera — Lei 12.741/2012 (Transparência Fiscal). Campo opcional. Exclusivo para SNNFSE federal. Envie percentuais OU valores em R$, nunca ambos (retorna 400 se misturado). Omitido: Simples Nacional usa alíquota DAS do projeto; demais regimes omitem o campo no XML.
↳ percentualTributacaoFederalnumbernãoOpção A (percentual): tributos federais aproximados em % (ex: 4.50). Requer também percentualTributacaoEstadual e percentualTributacaoMunicipal.
↳ percentualTributacaoEstadualnumbernãoOpção A (percentual): tributos estaduais aproximados em % (ex: 0.00 — serviços geralmente sem tributo estadual).
↳ percentualTributacaoMunicipalnumbernãoOpção A (percentual): tributos municipais (ISS) aproximados em % (ex: 2.00).
↳ valorTributacaoFederalnumbernãoOpção B (valor R$): tributos federais em reais (ex: 45.00). Requer também valorTributacaoEstadual e valorTributacaoMunicipal.
↳ valorTributacaoEstadualnumbernãoOpção B (valor R$): tributos estaduais em reais (ex: 0.00).
↳ valorTributacaoMunicipalnumbernãoOpção B (valor R$): tributos municipais (ISS) em reais (ex: 20.00).
competenciastringnãoCompetência no formato YYYY-MM (padrão: mês atual)
referenciastringnãoIdentificador externo opcional (seu sistema)
{
  "tomador": {
    "nome": "Empresa Tomadora Ltda",
    "cnpj": "12345678000195",
    "email": "[email protected]",
    "endereco": {
      "logradouro": "Rua das Flores",
      "numero": "100",
      "bairro": "Centro",
      "cidade": "Londrina",
      "uf": "PR",
      "cep": "86010010"
    }
  },
  "servico": {
    "descricao": "Desenvolvimento de software sob demanda",
    "codigo": "010302"
  },
  "valores": {
    "total": 1000.00,
    "aliquotaIss": 2.0,
    "issRetido": false,
    "totaisTributosAproximados": {
      "percentualTributacaoFederal": 6.00,
      "percentualTributacaoEstadual": 0.00,
      "percentualTributacaoMunicipal": 2.00
    }
  },
  "competencia": "2026-04",
  "referencia": "OS-2026-001"
}
{
  "queued": true,
  "invoiceId": "inv_abc123",
  "status": "queued",
  "pollUrl": "/api/v1/invoices/inv_abc123/status"
}
POST/cancelar🔑 x-api-key

Solicita o cancelamento assíncrono de uma NFS-e já emitida (status issued).

Body (JSON)

CampoTipoReq?Descrição
invoiceIdstringsimID da nota a cancelar
motivostringnãoMotivo do cancelamento (texto livre, max 255 chars)

Status & Polling

GET/invoices/{id}/status🔑 x-api-key

Retorna o status atual de uma NFS-e individual.

Resposta

CampoTipoReq?Descrição
statusstringnãoqueued | processing | issued | error | cancelled
chNFSestringnãoChave/código de verificação da NFS-e (disponível quando status=issued)
numeroNfestringnãoNúmero da NFS-e (disponível quando status=issued)
emittedAtstring (ISO 8601)nãoTimestamp de emissão (disponível quando status=issued)
ambientestringnão"producao" ou "homologacao" (disponível quando status=issued)
pdfUrlstring (URL)nãoURL pública CDN do PDF (disponível quando documentsCached=true). Acesso direto, sem autenticação.
xmlUrlstring (URL)nãoURL pública CDN do XML (disponível quando documentsCached=true). Acesso direto, sem autenticação.
documentsCachedbooleannãotrue quando XML e PDF foram armazenados no CDN. URLs disponíveis em pdfUrl e xmlUrl.
errorCodestringnãoCódigo do erro (disponível quando status=error)
errorMessagestringnãoMensagem de erro legível (disponível quando status=error)
errorsarraynãoArray detalhado de erros da SEFAZ [{Codigo, Descricao, Complemento}] (disponível quando status=error)
cancelledAtstring (ISO 8601)nãoTimestamp do cancelamento (disponível quando status=cancelled)
cancelXmlUrlstring (URL)nãoURL pública CDN do XML de cancelamento (disponível quando status=cancelled e documentsCached=true)

Documentos da NFS-e

GET/invoices/{id}/xml🔑 x-api-key

Retorna o XML da NFS-e. Sem parâmetros, retorna o XML de emissão. Com ?type=cancel, retorna o XML de cancelamento.

Query Parameters

CampoTipoReq?Descrição
typestringnãoTipo de XML: "emission" (default) ou "cancel". O tipo "cancel" retorna o XML de cancelamento — disponível apenas para notas com status cancelled.

Comportamento

CampoTipoReq?Descrição
Cache R2 (302)redirectnãoQuando cacheado no CDN, redireciona para URL pública (cache immutable).
Fallback (200)application/xmlnãoQuando não cacheado, retorna o XML do banco com Content-Type application/xml.

Erros

CampoTipoReq?Descrição
409ConflictnãoInvoice ainda não emitida (status ≠ issued ou cancelled)
409Conflictnão?type=cancel: nota não está cancelada
404Not FoundnãoXML não disponível para esta nota
GET/invoices/{id}/pdf🔑 x-api-key

Retorna o PDF (DANFSE) da NFS-e. Se cacheado no R2, redireciona (302) para a URL pública CDN. Caso contrário, busca ao vivo no portal municipal.

Comportamento

CampoTipoReq?Descrição
Cache R2 (302)redirectnãoQuando documentsCached=true, redireciona para URL pública CDN (cache immutable).
SNNFSE federal200 PDFnãoFallback: proxy mTLS → ADN Federal (adn.nfse.gov.br) → PDF inline.
Pronim (Cidade360)200 PDFnãoFallback: consulta portal Cidade360 e retorna PDF inline.
São Paulo (SP)302 redirectnãoFallback: redireciona para o portal da Prefeitura SP.
WebISS200 PDF / 302nãoFallback: GET no portal WebISS (público ou mTLS).

Erros

CampoTipoReq?Descrição
409ConflictnãoInvoice ainda não emitida (status ≠ issued)
422UnprocessablenãoDados insuficientes: certificado A1 ausente, chave de acesso inválida
501Not ImplementednãoSistema municipal não suporta download de PDF (DSF, Centi)
502Bad GatewaynãoPortal externo retornou erro

Lote (Batch)

POST/emitir/batch🔑 x-api-key

Emite múltiplas NFS-e de forma assíncrona. Retorna batchId para acompanhamento.

Body (JSON)

CampoTipoReq?Descrição
itemsarraysimArray de objetos com o mesmo formato do POST /emitir
GET/invoices/batch/{batchId}/status🔑 x-api-key

Retorna o progresso de um lote: total, processados, emitidos, erros.

Resposta

CampoTipoReq?Descrição
batchIdstringnãoID do lote
statusstringnãoprocessing | completed | partial | failed
totalnumbernãoTotal de itens no lote
processednumbernãoItens já processados
issuednumbernãoItens emitidos com sucesso
errorsnumbernãoItens com erro
items[].invoiceIdstringnãoID da invoice
items[].statusstringnãoStatus individual do item
items[].pdfUrlstring (URL)nãoURL para download do PDF (disponível quando status=issued)
items[].chNFSestringnãoChave/código de verificação (disponível quando status=issued)
items[].errorCodestringnãoCódigo do erro (disponível quando status=error)

Endpoints de Webhook

POST/webhooks/endpoints🔑 x-api-key

Cadastra um novo endpoint de webhook para a organização/projeto.

Body (JSON)

CampoTipoReq?Descrição
urlstringsimURL HTTPS que receberá o POST
eventsstring[]simEx: ["nfse.issued", "nfse.error", "nfse.cancelled", "nfse.documents_ready", "batch.completed"]
secretstringnãoSecret para assinatura HMAC-SHA256 via X-Notaas-Signature (opcional)
GET/webhooks/endpoints🔑 x-api-key

Lista todos os endpoints de webhook configurados.

PATCH/webhooks/endpoints/{id}🔑 x-api-key

Atualiza URL, eventos ou status ativo/inativo de um endpoint.

DELETE/webhooks/endpoints/{id}🔑 x-api-key

Remove um endpoint de webhook.

POST/webhooks/endpoints/{id}/test🔑 x-api-key

Envia um payload de teste para validar a configuração do endpoint.

GET/webhooks/deliveries🔑 x-api-key

Lista o histórico de entregas de webhook com status e tentativas.

Eventos Suportados

Eventos

CampoTipoReq?Descrição
nfse.issuedeventnãoNFS-e emitida com sucesso. Payload inclui número da nota e código de verificação.
nfse.erroreventnãoFalha na emissão. Payload inclui código e mensagem de erro.
nfse.cancelledeventnãoNFS-e cancelada com sucesso. Payload inclui invoiceId, numeroNfse e cancelledAt.
nfse.documents_readyeventnãoDocumentos cacheados no CDN. Payload inclui xmlUrl, pdfUrl, cancelXmlUrl (para notas canceladas) e documentStatus.
batch.completedeventnãoTodos os itens de um lote foram processados.

⚠️ nfse.documents_ready — comportamento de entrega

Este evento pode ser disparado até 2 vezes para a mesma invoice:

  • 1ª chamada: documentStatus: "partial" — XML pronto, PDF pode estar indisponível (pdfUrl: null)
  • 2ª chamada (até 10 min depois): documentStatus: "complete" — XML e PDF prontos. Se o retry esgotar sem sucesso, nenhum webhook adicional é enviado.

Use o campo documentStatus para determinar se todos os documentos estão disponíveis.

Para notas canceladas, o payload inclui o campo adicional cancelXmlUrl com a URL do XML de cancelamento. cancelXmlUrl é null para notas emitidas.

Em engines que não emitem PDF (ex.: dsf, centi), o evento chega uma única vez com pdfUrl: null e documentStatus: "complete".

ℹ️ Compatibilidade de Webhook

Campos adicionais podem ser incluídos nos payloads de webhook sem aviso prévio. Seu código deve ignorar campos desconhecidos para manter compatibilidade futura (Postel's Law).