Documentação da API

Max ERP Fiscal Platform — emissão e consulta de documentos fiscais (NFS-e) via API REST.

Visão geral

A API pública permite que sistemas de terceiros (ERPs, e-commerces, sistemas de gestão) emitam e consultem documentos fiscais em nome de uma empresa cadastrada na plataforma. Toda comunicação é feita em JSON sobre HTTPS.

Base URL  https://api.maxerp.com.br/v1

Todos os endpoints ficam sob esse domínio. Em ambiente de desenvolvimento local, a API roda por padrão em http://localhost:5037.

Fluxo assíncrono por trás de uma chamada síncrona Ao emitir um documento, ele entra em uma fila de processamento. A API aguarda até 25 segundos pelo resultado antes de responder — na prática, a maioria das emissões retorna já com o resultado final (autorizada ou rejeitada) na própria resposta do POST. Se o processamento demorar mais que isso, a API responde imediatamente com o status "Pendente" e o cliente deve consultar o resultado depois pelo endpoint de consulta.

Autenticação

A autenticação é feita por API Key, enviada em um cabeçalho HTTP em toda requisição:

X-Api-Key: SUA_CHAVE_AQUI

Como obter uma API Key

  1. Acesse o Portal do Cliente da plataforma e entre com seu usuário.
  2. Selecione a empresa (tenant) para a qual deseja emitir documentos.
  3. Vá em API Keys no menu lateral e clique em "+ Gerar nova API Key".
  4. A chave é exibida uma única vez — copie e guarde em local seguro (variável de ambiente, cofre de segredos). Não é possível recuperá-la depois.
Cada API Key pertence a uma única empresa Todos os documentos emitidos com uma chave são automaticamente vinculados ao CNPJ/tenant que a gerou. Não é possível emitir para outra empresa com a mesma chave, nem consultar documentos de terceiros.

Uma API Key pode ser revogada a qualquer momento na mesma tela, sem afetar outras chaves da empresa. Requisições com chave ausente, incorreta ou revogada recebem 401 Unauthorized.

Pré-requisitos antes de emitir

Antes de emitir o primeiro documento pela API, a empresa precisa ter, no Portal do Cliente:

  • Dados fiscais cadastrados — em Painel de Controle > Dados Fiscais, os dados do prestador para o modelo que for usar (Nacional e/ou Municipal): código IBGE, regime tributário, endereço, etc.
  • Certificado digital A1 (.pfx) enviado — em Painel de Controle > Certificado Digital, usado para assinar digitalmente o documento antes de enviar ao governo.

Sem isso, a emissão é aceita pela API (fica em fila) mas retorna Rejeitada com uma mensagem explicando o que falta.

Emitir documento fiscal

POST /v1/documentos-fiscais

Cabeçalhos

CabeçalhoValor
X-Api-KeySua chave de API
Content-Typeapplication/json

Corpo da requisição

O corpo tem sempre o mesmo envelope — só o conteúdo de payload muda conforme o tipo:

{
  "tipo": "NfseNacional",
  "payload": { ... }
}
CampoTipoDescrição
tipo obrigatório string "NfseNacional" ou "NfseMunicipal".
"NFCe" e "NFe" existem no modelo de dados mas ainda não têm emissão implementada — não use por enquanto.
payload obrigatório object Objeto com os dados do documento. Estrutura completa nas seções NFS-e Nacional e NFS-e Municipal abaixo.
Nomes de campo flexíveis (case-insensitive) A API aceita tanto camelCase (numeroDps, razaoSocial) quanto PascalCase (NumeroDps, RazaoSocial) — use o que for mais natural na sua linguagem. Os exemplos desta página usam camelCase.

Respostas

202 Accepted — ainda processando

Devolvida quando o processamento não termina dentro dos 25 segundos de espera. O documento continua em fila — consulte depois pelo GET.

{
  "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "status": "Pendente"
}

200 OK — processamento concluído

{
  "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "status": "Autorizada",
  "numeroProtocolo": "35325042252125180000131000000000000326083321214463",
  "motivoRejeicao": null,
  "xmlGerado": "<?xml version=\"1.0\"?><NFSe>...</NFSe>",
  "linkDanfse": "https://api.maxerp.com.br/v1/documentos-fiscais/3fa85f64-5717-4562-b3fc-2c963f66afa6/danfse"
}
CampoDescrição
idIdentificador único do documento nesta plataforma (use para consultas futuras).
statusUm dos valores da tabela de status.
numeroProtocoloPara NFS-e Nacional: a chave de acesso da nota. Para NFS-e Municipal: o número da nota atribuído pela prefeitura. null se ainda não autorizado.
motivoRejeicaoMensagem de erro do governo/prefeitura quando status é Rejeitada ou Falha. null caso contrário.
xmlGeradoXML do documento. Preenchido tanto em caso de sucesso quanto de rejeição (útil para diagnosticar o motivo de uma rejeição olhando o XML que foi de fato enviado). Pode vir null se a rejeição ocorreu antes de montar o XML.
linkDanfseURL pública para baixar o PDF do DANFSe — não exige X-Api-Key, pode ser repassada direto pro tomador ou embutida em outro sistema (a segurança é o id do documento na URL ser um GUID não adivinhável). Só vem preenchida pra NFS-e Nacional Autorizada (ou cancelada depois de autorizada) — null nos demais casos.

400 Bad Request

{ "erro": "Tipo de documento 'Nfse' inválido." }

Ocorre quando tipo não é reconhecido ou payload está ausente/nulo.

401 Unauthorized

API Key ausente, incorreta ou revogada.

Consultar documento fiscal

GET /v1/documentos-fiscais/{id}
ParâmetroLocalDescrição
idPathO id retornado na emissão (GUID).
X-Api-KeyHeaderMesma API Key usada na emissão — só é possível consultar documentos da própria empresa.

Resposta — 200 OK

Mesmo formato do POST acima (id, status, numeroProtocolo, motivoRejeicao, xmlGerado) — use para acompanhar um documento que ficou Pendente.

404 Not Found

Documento inexistente, ou pertencente a outra empresa (a API nunca revela a existência de documentos de terceiros).

Baixar DANFSe

GET /v1/documentos-fiscais/{id}/danfse
Este endpoint é público — não exige X-Api-Key Ao contrário dos outros dois endpoints, este pode ser chamado direto de um navegador, embutido em outro sistema, ou repassado pro tomador do serviço sem precisar carregar credenciais. A segurança é o id ser um GUID praticamente impossível de adivinhar — mesmo modelo de "link de compartilhamento" usado por outros sistemas de nota fiscal.
ParâmetroLocalDescrição
idPathO id retornado na emissão, ou o valor do campo linkDanfse da resposta.

Resposta

200 OK — PDF do DANFSe (Content-Type: application/pdf).

400 Bad Request

Documento não é do tipo NfseNacional — DANFSe hoje só é gerado para esse tipo (NFS-e Municipal usa o link próprio da prefeitura, retornado no mesmo campo linkDanfse quando disponível).

404 Not Found

Documento inexistente, ou ainda não autorizado (DANFSe só existe depois da autorização).

Municípios aceitos

Cobertura nacional: praticamente todo o Brasil Segundo o painel oficial do governo federal (Monitoramento das Adesões à NFS-e, gov.br), 5.571 entes federados já aderiram ao Sistema Nacional NFS-e — 100% da população brasileira, 100% da arrecadação nacional de serviços, todas as capitais e todos os municípios com mais de 500 mil habitantes. Na prática, tipo: "NfseNacional" funciona pra praticamente qualquer cidade do país sem nenhuma configuração extra. São Paulo e Brasília, descritos abaixo, são apenas os dois casos que exigem um formato de payload diferente — não uma lista fechada do que é aceito.

A plataforma trabalha com dois modelos de documento diferentes (tipo no payload), e dentro do modelo Nacional existem duas formas de transmissão. Nos três casos, o payload que você monta é decidido pelo tipo — a plataforma escolhe o caminho de transmissão certo sozinha, sem exigir nada extra na maioria dos casos.

1. Ambiente Nacional compartilhado (ADN) — tipo: "NfseNacional"

O caminho padrão e mais comum, cobrindo os 5.571 entes federados aderentes citados acima. Basta informar o código IBGE correto em codigoCidadePrestacao — a plataforma detecta e usa o caminho certo automaticamente. → ver exemplo de payload.

Consulta rápida — seu município está aderente?

Busque abaixo (dados oficiais do gov.br, atualizados em 08/09/2026). Aderente = "Sim" significa que a prefeitura já compartilha dados com o Ambiente Nacional; use o código IBGE do município em codigoCidadePrestacao normalmente.

MunicípioUFAderente ao Ambiente Nacional

Fonte: Monitoramento das Adesões à NFS-e (gov.br). Lista sujeita a mudanças semanais pelo governo federal — em caso de dúvida sobre um lançamento específico, a página oficial é sempre a fonte mais atual.

2. Webservice próprio da prefeitura, mesmo schema Nacional — tipo: "NfseNacional"

Este NÃO passa pelo ADN. Alguns municípios ainda não aderiram ao ambiente compartilhado e mantêm o próprio sistema de recebimento — mas usando o mesmo schema/formato de documento (DPS) do Ambiente Nacional, só que a plataforma manda direto pro webservice da prefeitura em vez de passar pela infraestrutura do governo federal. O tipo no payload continua sendo "NfseNacional" (é o mesmo documento) — só muda, por trás dos panos, pra onde ele é enviado.

MunicípioCódigo IBGEWebservice próprio
Brasília/DF5300108ISS.NET. Exige servico.evento.codigoCidade preenchido para itens da lista 12 (eventos/diversões públicas) — ver aviso na seção de campos. → ver exemplo de payload.

Precisa de outro município nessa situação? Entre em contato com o time responsável pela sua instalação — a integração é adicionada caso a caso, conforme o comunicado oficial da prefeitura.

3. NFS-e Municipal (ABRASF) — tipo: "NfseMunicipal"

Modelo totalmente diferente do Nacional — schema/documento próprio (padrão ABRASF), usado por municípios que ainda não migraram pra Reforma. Hoje, testado e validado em produção apenas para:

MunicípioCódigo IBGEProvedor
São Paulo/SP3550308ISSSaoPaulo — Layout 1 (padrão) e Layout 2 (Reforma Tributária/IBS-CBS), conforme o payload informe ou não o bloco ibsCbs. → Layout 1 · Layout 2.

Outros municípios ABRASF podem funcionar (a biblioteca de base suporta dezenas de provedores), mas não foram testados nesta plataforma — recomendamos validar em homologação antes de emitir em produção.

Campos — NFS-e Nacional

Use quando tipo = "NfseNacional". Os dados do prestador (sua empresa) não entram no payload — vêm do cadastro em Dados Fiscais.

Cobertura do schema Este payload cobre o schema oficial da DPS (Ambiente Nacional) quase por completo — inclui tudo que varia entre os regimes tributários (Simples Nacional, Lucro Presumido, Lucro Real): retenções federais completas, desconto, dedução, isenção/imunidade de ISS, exigibilidade suspensa, benefício fiscal — e também os blocos específicos de alguns ramos de negócio: comércio exterior, locação de infraestrutura, obra de construção civil, evento, exploração rodoviária (pedágio), intermediário do serviço, substituição de DPS e o detalhamento completo de códigos de situação/classificação tributária do IBS/CBS (reforma tributária). Também trata automaticamente municípios com webservice próprio (ex.: Distrito Federal) — ver aviso mais abaixo.

Objeto raiz

CampoTipoObrigatórioDescrição
numeroDpsinteirosimNúmero sequencial da DPS (Declaração de Prestação de Serviço) na sua série.
serieDpsstringsimSérie da DPS. Ex.: "00001".
tomadorobjetosimDados do tomador do serviço — ver tabela abaixo.
servicoobjetosimDados do serviço prestado — ver tabela abaixo.
intermediarioobjetonãoDados do intermediário do serviço (ex.: plataforma/marketplace), quando houver. Mesma forma de tomador. O prestador continua sendo quem assina a DPS.
substituicaoobjetonãoPreencha quando esta DPS substitui uma anterior. Ver tabela abaixo.
ibsCbsobjetonãoBloco raso do IBS/CBS (reforma tributária). Ver tabela abaixo.

tomador

CampoTipoObrigatórioDescrição
cpfCnpjstringsimCPF (11 dígitos) ou CNPJ (14 dígitos) do tomador, só números.
razaoSocialstringsimRazão social ou nome completo do tomador.
inscricaoMunicipalstringnãoInscrição municipal do tomador, se houver.
codigoCidadestringnãoCódigo IBGE da cidade do tomador.
cepstringnãoCEP, só números.
enderecostringnãoLogradouro.
numerostringnãoNúmero do endereço.
bairrostringnãoBairro.
telefonestringnãoTelefone de contato.
emailstringnãoE-mail do tomador. Usado para o envio automático do XML/DANFSe, se a empresa tiver notificação por e-mail ativada.

servico

CampoTipoObrigatórioDescrição
codigoItemListaServicostringsimCódigo do item da Lista de Serviços (LC 116/2003). Ex.: "010701".
discriminacaostringsimDescrição do serviço prestado.
valorServicosdecimalsimValor total do serviço, em reais.
aliquotaIssdecimalnãoAlíquota do ISS em percentual (ex.: 5 para 5%). Não envie este campo (omita ou envie null) se o prestador é optante do Simples Nacional apurando o ISS pelo próprio Simples sem retenção, ou se o prestador não é optante do Simples e presta serviço no seu próprio município de emissão — nos dois casos o governo já tem a alíquota parametrizada e rejeita (E0617/E0625) se ela vier preenchida. Ver regra completa abaixo.
codigoCidadePrestacaostringsimCódigo IBGE da cidade onde o serviço foi prestado. Alguns municípios (ex.: Distrito Federal) usam webservice próprio em vez do Ambiente Nacional compartilhado — a plataforma detecta isso automaticamente pelo cadastro do prestador, sem exigir nada extra no payload. Ver nota abaixo.
codigoNbsstringnãoCódigo NBS (Nomenclatura Brasileira de Serviços), se aplicável.
codigoTribMunicipalstringnãoCódigo de tributação municipal do ISSQN (cTribMun) — complementar ao código nacional, até 10 dígitos numéricos. Opcional no schema nacional, mas algumas prefeituras (ex.: Manaus) validam esse código pra certos tipos de serviço mesmo assim.
informacoesComplementaresstringnãoTexto livre adicional (ex.: número de pedido/OS).
tipoRetIssinteironão (padrão 1)1 = não retido  ·  2 = retido pelo tomador  ·  3 = retido pela administração pública.
tipoCststringnãoCódigo de Situação Tributária, quando aplicável.
valorPercAliqSNdecimalnão (ver aviso)Percentual total de tributos do Simples Nacional (a alíquota do DAS, não só o ISS) — vira o pTotTribSN da nota. Obrigatório quando o prestador é ME/EPP optante do Simples Nacional (não confundir com MEI) — o governo rejeita com E0712 se vier o indicador de transparência fiscal em vez deste percentual. Nesse caso não preencha aliquotaIss.
descontoIncondicionaldecimalnãoDesconto incondicional em reais.
descontoCondicionaldecimalnãoDesconto condicional em reais.
issqnOperacaostringnão (padrão "Tributavel")"Tributavel" · "Imunidade" · "ExportacaoServico" · "NaoIncidencia".
exigibilidadeSuspensaTipostringnão"Judicial" ou "Administrativo" — exige exigibilidadeSuspensaProcesso junto.
exigibilidadeSuspensaProcessostringnãoNúmero do processo judicial/administrativo.
beneficioMunicipalNumerostringnãoNúmero do benefício fiscal municipal concedido ao prestador.
beneficioMunicipalValorReducaodecimalnãoValor da redução concedida pelo benefício, em reais.
beneficioMunicipalPercentualReducaodecimalnãoPercentual de redução concedido pelo benefício.
retencoesFederaisobjetonãoRetenção de IRRF/CSLL/INSS/PIS/COFINS. Ver tabela abaixo.
deducaoobjetonãoDedução/redução da base de cálculo. Ver tabela abaixo.
comercioExteriorobjetonãoServiço prestado para o exterior. Ver tabela abaixo.
locacaoobjetonãoLocação de infraestrutura (postes, dutos, ferrovia...). Ver tabela abaixo.
obraobjetonãoServiço vinculado a obra de construção civil. Ver tabela abaixo.
eventoobjetonãoServiço vinculado a um evento. Ver tabela abaixo.
exploracaoRodoviariaobjetonãoPedágio/exploração rodoviária. Ver tabela abaixo.
Quando NÃO informar aliquotaIss (regra descoberta em produção real)

O Ambiente Nacional rejeita a DPS se a alíquota vier preenchida em qualquer um destes dois casos — nos dois, quem calcula o imposto não é o campo que você envia:

CasoCondiçãoO que enviar
ME/EPP optante do Simples Nacional apurando pelo próprio Simples, sem retenção Prestador é ME/EPP (não MEI) e tipoRetIss = 1 (não retido) Omita aliquotaIss · preencha valorPercAliqSN com o percentual do DAS (erro se faltar: E0712)
Prestador não optante do Simples Nacional, prestando no próprio município de emissão codigoCidadePrestacao igual ao município de emissão do prestador Omita aliquotaIss — a alíquota já está parametrizada no Sistema Nacional NFS-e (erro se enviar mesmo assim: E0617)

Fora desses dois casos (ex.: Lucro Presumido/Real prestando para outro município, ou MEI), envie aliquotaIss normalmente.

Municípios com webservice próprio (ex.: Distrito Federal/Brasília)

A maioria dos municípios usa o Ambiente Nacional compartilhado (ADN) para receber a DPS. Alguns — hoje, o Distrito Federal — mantêm o próprio sistema (no caso do DF, a plataforma ISS.NET) com o mesmo schema, mas endpoint e algumas validações próprias. A API detecta isso automaticamente pelo codigoCidadePrestacao/cadastro do prestador — o payload não muda para o caso comum.

Uma exceção: se o codigoItemListaServico for da lista 12 (diversões públicas — shows, espetáculos, parques de diversão etc.), o DF exige o bloco servico.evento preenchido (rejeita com E0390 sem ele). Nesse caso preencha também evento.cep/evento.logradouro com o endereço completo do evento, e obrigatoriamente evento.codigoCidade — sem esse campo específico, o webservice do DF rejeita com um erro genérico de schema (E160) que não indica qual campo falta. Veja o exemplo completo mais abaixo.

servico.retencoesFederais

CampoTipoObrigatórioDescrição
valorIrrfdecimalnãoValor retido de IRRF.
valorCslldecimalnãoValor retido de CSLL.
valorInssdecimalnãoValor retido de INSS (contribuição previdenciária).
pisCofinsCststringnãoCódigo de Situação Tributária do PIS/COFINS — nome do código conforme a tabela oficial (ex.: "AliquotaBasica", "AliquotaZero", "IsentaContribuicao"). Obrigatório se informar valorPis ou valorCofins.
valorBaseCalculoCofinsdecimalnãoBase de cálculo do COFINS.
aliquotaPisdecimalnãoAlíquota do PIS em percentual.
aliquotaCofinsdecimalnãoAlíquota do COFINS em percentual.
valorPisdecimalnãoValor retido/apurado de PIS.
valorCofinsdecimalnãoValor retido/apurado de COFINS.
tipoRetencaoPisCofinsCsllstringnãoCombinação de retenção — um de: PisCofinsCsllNaoRetidos, PisCofinsRetidos, PisCofinsNaoRetidos, PisCofinsCsllRetidos, PisCofinsRetidosCsllNaoRetido, PisRetidoCofinsCsllNaoRetidos, CofinsRetidoPisCSllNaoRetidos, PisNaoRetidoCofinsCsllRetidos, PisCofinsNaoRetidosCsllRetido, CofinsNaoRetidoPisCSllRetidos.

servico.deducao

CampoTipoObrigatórioDescrição
percentualdecimalnãoPercentual de dedução/redução sobre a base de cálculo.
valordecimalnãoValor de dedução/redução em reais.
documentoslista de objetosnãoDocumentos que embasam a dedução (materiais, subempreitada etc.) — cada item: numeroDocumento, dataEmissao, valorDedutivelRedutivel, valorReducaoDeducao, tipo (AlimentacaoBebidasFrigobar · Materiais · ProducaoExterna · ReembolsoDespesas · RepasseConsorciado · RepassePlanSaude · Servicos · SubempreitadaMaoObra · Outras), descricao (opcional), fornecedor (opcional, mesma forma de tomador).

servico.comercioExterior

CampoTipoObrigatórioDescrição
modostringsimTransfronteirico · ConsumoBrasil · PresencaComercialExterior · MovimentoTemporarioPessoasFisicas.
vinculostringnão (padrão SemVinculo)SemVinculo · Controlada · Controladora · Coligada · Matriz · Filial · Outro.
codigoMoedainteironãoCódigo numérico ISO 4217 da moeda estrangeira (ex.: 220 = USD).
valorServicoMoedaEstrangeiradecimalnãoValor do serviço na moeda estrangeira.
numeroDeclaracaoImportacaostringnãoNúmero da Declaração de Importação, se aplicável.
numeroRegistroExportacaostringnãoNúmero do Registro de Exportação, se aplicável.
compartilharMdicstringnão (padrão NaoEnviar)NaoEnviar ou Enviar — compartilhar os dados com o MDIC.

servico.locacao

CampoTipoObrigatórioDescrição
categoriastringsimLocacao · Sublocacao · Arrendamento · DireitoPassagem · PermissaoUso.
objetostringsimFerrovia · Rodovia · Postes · Cabos · Dutos · Condutos.
extensaoTotalMetrosinteironãoExtensão total do objeto locado, em metros.
numeroPostesinteironãoNúmero de postes, quando aplicável.

servico.obra

CampoTipoObrigatórioDescrição
inscricaoImobiliariastringnãoInscrição imobiliária do imóvel/obra.
codigoObrastringnãoCódigo da obra (CEI ou equivalente).
codigoCibstringnãoCódigo CIB (Cadastro Imobiliário Brasileiro), se houver.
cep, logradouro, numero, complemento, bairrostringnãoEndereço da obra — informe pelo menos cep ou logradouro para o bloco ser incluído.

servico.evento

CampoTipoObrigatórioDescrição
descricaostringsimDescrição do evento.
dataIniciodata/horasimInício do evento (ISO 8601).
dataFimdata/horasimFim do evento (ISO 8601).
idEventostringnãoIdentificador do evento, se cadastrado em algum sistema de gestão de eventos.
cep, logradouro, numero, bairrostringnãoEndereço do evento — informe pelo menos cep ou logradouro para o bloco ser incluído.
codigoCidadestringcondicionalCódigo IBGE do município do evento. Obrigatório para municípios com webservice próprio (ex.: Distrito Federal/Brasília) — sem ele, o webservice desses municípios rejeita com erro genérico de schema (E160), mesmo com o resto do payload correto. Nos municípios que usam o Ambiente Nacional padrão, fica sem uso.

servico.exploracaoRodoviaria

CampoTipoObrigatórioDescrição
categoriastringsimCategoria do veículo — ex.: AutomovelCaminhoneteFurgao, MotocicletasMotonetasBicicletasMotorizadas, VeiculoIsento (ver enum CategoriaVeiculo do OpenAC.Net para a lista completa).
numeroEixosinteirosimNúmero de eixos do veículo.
tipoRodagemstringsimSimples ou Dupla.
placastringnãoPlaca do veículo.
codigoAcessoPedagiostringnãoCódigo de acesso/tag de pedágio.
codigoContratostringnãoCódigo do contrato de exploração rodoviária.
orientacaoPesageminteironãoOrientação de pesagem, quando exigida.

substituicao

CampoTipoObrigatórioDescrição
chaveSubstituidastringsimChave de acesso da NFS-e que está sendo substituída.
codigoMotivostringsimDesenquadramentoSimplesNacional · EnquadramentoSimplesNacional · InclusaoRetroativaImunidadeIsencao · ExclusaoRetroativaImunidadeIsencao · RejeicaoNFSeTomadorIntermediario · Outros.
motivostringnãoDescrição livre do motivo da substituição.

ibsCbs

Reforma tributária (Lei Complementar 214/2025) Preencha somente se o seu município/ambiente já exigir o detalhamento do IBS/CBS — a reforma ainda está em transição. As tabelas de códigos abaixo são publicadas oficialmente pela administração; usamos as mesmas do manual de integração do DF (tabela de CST/Classificação Tributária e tabela de Indicadores de Operação).
CampoTipoObrigatórioDescrição
indicadorUsoFinalstringsimSim (consumo pessoal, art. 57) ou Nao.
codigoIndicadorOperacaostringsimCódigo de 6 dígitos do indicador de operação de fornecimento. "100301" = demais serviços em operação onerosa (caso genérico mais comum). "030101" = serviço físico prestado sobre pessoa (ex.: eventos/entretenimento).
indicadorDestinatariostringsimProprioTomador (o tomador da NFS-e é o próprio destinatário do serviço — caso mais comum) ou Outro (destinatário é pessoa diferente do tomador).
codigoSituacaoTributariastringsimCST do IBS/CBS, 3 dígitos. "000" = tributação integral (caso comum, sem isenção/redução).
codigoClassificacaoTributariastringsimClassificação Tributária, 6 dígitos. "000001" = situações tributadas integralmente pelo IBS e CBS. "200048" = Parques de Diversão (alíquota reduzida 40%) — exemplo real usado em produção.
tipoOperacaostringnãoFornecimentoPagamentoPosterior · RecebimentoPagamentoFornecimentoRealizado · FornecimentoPagamentoRealizado · RecebimentoPagamentoFornecimentoPosterior · FornecimentoRecebimentoConcomitante.

Exemplo completo — NFS-e Nacional (Ambiente Nacional/ADN)

{
  "tipo": "NfseNacional",
  "payload": {
    "numeroDps": 42,
    "serieDps": "00001",
    "tomador": {
      "cpfCnpj": "58639313000174",
      "razaoSocial": "EMPRESA TOMADORA LTDA",
      "inscricaoMunicipal": "73341",
      "codigoCidade": "5107909",
      "cep": "78555440",
      "endereco": "AVENIDA EXEMPLO",
      "numero": "1668",
      "bairro": "CENTRO",
      "telefone": "6533334444",
      "email": "financeiro@empresatomadora.com.br"
    },
    "servico": {
      "codigoItemListaServico": "010701",
      "discriminacao": "Desenvolvimento de sistema sob demanda — OS 1234",
      "valorServicos": 2500.00,
      "aliquotaIss": 0,
      "codigoCidadePrestacao": "3532504",
      "codigoNbs": "115013000",
      "informacoesComplementares": "Ordem de Serviço 1234",
      "tipoRetIss": 1,
      "valorPercAliqSN": 6.0
    }
  }
}

Exemplo — Lucro Presumido/Real com retenções federais e desconto

{
  "tipo": "NfseNacional",
  "payload": {
    "numeroDps": 43,
    "serieDps": "00001",
    "tomador": {
      "cpfCnpj": "58639313000174",
      "razaoSocial": "EMPRESA TOMADORA LTDA",
      "codigoCidade": "5107909"
    },
    "servico": {
      "codigoItemListaServico": "010701",
      "discriminacao": "Consultoria técnica especializada — Contrato 987",
      "valorServicos": 10000.00,
      "aliquotaIss": 5,
      "codigoCidadePrestacao": "3532504",
      "descontoIncondicional": 500.00,
      "retencoesFederais": {
        "valorIrrf": 150.00,
        "valorCsll": 100.00,
        "valorInss": 0,
        "pisCofinsCst": "AliquotaBasica",
        "valorBaseCalculoCofins": 9500.00,
        "aliquotaPis": 0.65,
        "aliquotaCofins": 3.00,
        "valorPis": 61.75,
        "valorCofins": 285.00,
        "tipoRetencaoPisCofinsCsll": "PisCofinsRetidos"
      }
    }
  }
}

Este exemplo não informa valorPercAliqSN porque o prestador não é optante do Simples Nacional — nesse caso a API preenche automaticamente o indicador de transparência fiscal (totTrib) exigido pela Lei 12.741/2012.

Exemplo — Brasília/DF, evento (item 12) e IBS/CBS

Prestador optante do Simples Nacional (por isso sem aliquotaIss, com valorPercAliqSN) emitindo em Brasília para um evento — item da lista 12 (diversões públicas), que exige o bloco evento nesse município (ver aviso acima). O tomador aqui é pessoa física (CPF).

{
  "tipo": "NfseNacional",
  "payload": {
    "numeroDps": 3,
    "serieDps": "3",
    "tomador": {
      "cpfCnpj": "00000000000",
      "razaoSocial": "NOME DO TOMADOR",
      "cep": "15123012",
      "endereco": "RUA EXEMPLO",
      "numero": "45",
      "bairro": "CENTRO",
      "email": "contato@tomador.com.br"
    },
    "servico": {
      "codigoItemListaServico": "120501",
      "codigoTribMunicipal": "1205",
      "discriminacao": "Show musical - Festival de Verao",
      "valorServicos": 5000.00,
      "codigoCidadePrestacao": "5300108",
      "codigoNbs": "125079000",
      "tipoRetIss": 1,
      "valorPercAliqSN": 6.0,
      "evento": {
        "descricao": "Show Musical / Festival de Verao",
        "dataInicio": "2026-08-27T00:00:00",
        "dataFim": "2026-08-27T23:59:59",
        "codigoCidade": "5300108",
        "cep": "71608900",
        "logradouro": "Aeroporto Internacional de Brasilia Juscelino Kubitschek",
        "numero": "S/N",
        "bairro": "Setor de Habitacoes Individuais Sul"
      }
    },
    "ibsCbs": {
      "indicadorUsoFinal": "Nao",
      "codigoIndicadorOperacao": "030101",
      "indicadorDestinatario": "ProprioTomador",
      "codigoSituacaoTributaria": "200",
      "codigoClassificacaoTributaria": "200048"
    }
  }
}

Este payload corresponde a uma emissão real autorizada em produção. codigoClassificacaoTributaria: "200048" é o código de Parques de Diversão (alíquota reduzida) — troque pelo código correto da tabela oficial para o seu tipo de serviço.

Campos — NFS-e Municipal

Use quando tipo = "NfseMunicipal" (padrão ABRASF). Os dados do prestador também vêm do cadastro, não do payload.

Objeto raiz

CampoTipoObrigatórioDescrição
numeroRpsstringsimNúmero do RPS (Recibo Provisório de Serviços).
serieRpsstringsimSérie do RPS.
tomadorobjetosimDados do tomador — ver tabela abaixo.
servicoobjetosimDados do serviço — ver tabela abaixo.

tomador

CampoTipoObrigatórioDescrição
cpfCnpjstringsimCPF ou CNPJ do tomador, só números.
razaoSocialstringsimRazão social ou nome do tomador.
inscricaoMunicipalstringnãoInscrição municipal do tomador.
enderecostringnãoLogradouro.
numerostringnãoNúmero do endereço.
bairrostringnãoBairro.
codigoMunicipioIbgestringnãoCódigo IBGE da cidade do tomador.
ufstringnãoSigla do estado (ex.: "SP").
cepstringnãoCEP, só números.
telefonestringnãoTelefone de contato.
emailstringnãoE-mail do tomador, usado na notificação automática se ativada.

servico

CampoTipoObrigatórioDescrição
itemListaServicostringsimCódigo do item da Lista de Serviços (LC 116/2003).
discriminacaostringsimDescrição do serviço prestado.
valorServicosdecimalsimValor total do serviço.
aliquotadecimalnãoAlíquota do ISS em percentual. Quando informada, o sistema calcula automaticamente o valor do ISS e o valor líquido.
codigoTributacaoMunicipiostringnãoCódigo de tributação municipal específico da prefeitura, se exigido.
cnaestringnãoCNAE do prestador, quando conhecido fora do bloco ibsCbs (ex.: registro histórico). Para emissão real em Layout 2, o CNAE efetivo é o de dentro de ibsCbs.
ibsCbsobjetonãoPresente = ativa automaticamente o Layout 2 (Reforma Tributária/IBS-CBS) do provedor, quando suportado (hoje, São Paulo). Ausente = Layout 1 (padrão). Ver exemplo abaixo.

servico.ibsCbs (Municipal)

CampoTipoObrigatórioDescrição
codigoCnaestringsimCNAE do prestador, 7 dígitos.
codigoNbsstringsimCódigo NBS do serviço.
codigoIndicadorOperacaostringsimCódigo de 6 dígitos do indicador de operação — mesma tabela oficial usada no Nacional.
codigoClassificacaoTributariastringsimClassificação Tributária do IBS/CBS, 6 dígitos.
codigoSituacaoTributariastringsimCST do IBS/CBS, 3 dígitos.

Exemplo — NFS-e Municipal (São Paulo, Layout 1)

{
  "tipo": "NfseMunicipal",
  "payload": {
    "numeroRps": "1042",
    "serieRps": "1",
    "tomador": {
      "cpfCnpj": "58639313000174",
      "razaoSocial": "EMPRESA TOMADORA LTDA",
      "endereco": "AVENIDA EXEMPLO",
      "numero": "1668",
      "bairro": "CENTRO",
      "codigoMunicipioIbge": "5107909",
      "uf": "MT",
      "cep": "78555440",
      "telefone": "6533334444",
      "email": "financeiro@empresatomadora.com.br"
    },
    "servico": {
      "itemListaServico": "0107",
      "discriminacao": "Consultoria em TI — OS 1234",
      "valorServicos": 1800.00,
      "aliquota": 3.0
    }
  }
}

O município que processa a nota é sempre o cadastrado na sua empresa (prestador) — não há campo de cidade do prestador no payload. Este exemplo funciona em qualquer instalação com prestador cadastrado em São Paulo.

Exemplo — NFS-e Municipal (São Paulo, Layout 2 / IBS-CBS)

Mesmo payload, acrescido do bloco ibsCbs — ativa automaticamente o Layout 2 da prefeitura de São Paulo. Payload real usado em produção.

{
  "tipo": "NfseMunicipal",
  "payload": {
    "numeroRps": "8605",
    "serieRps": "6",
    "tomador": {
      "cpfCnpj": "58639313000174",
      "razaoSocial": "EMPRESA TOMADORA LTDA",
      "email": "financeiro@empresatomadora.com.br"
    },
    "servico": {
      "itemListaServico": "08117",
      "discriminacao": "Ingresso - evento cultural",
      "valorServicos": 320.00,
      "aliquota": 5.0,
      "ibsCbs": {
        "codigoCnae": "9321200",
        "codigoNbs": "125079000",
        "codigoIndicadorOperacao": "030101",
        "codigoClassificacaoTributaria": "200048",
        "codigoSituacaoTributaria": "200"
      }
    }
  }
}
Cancelamento ainda não disponível por API O cancelamento de documentos (Nacional ou Municipal) hoje só é feito pelo Portal do Cliente, na tela de detalhe do documento. Não há endpoint público para isso ainda.

Status possíveis

PendenteDocumento recebido, aguardando processamento na fila.
ProcessandoEm processamento pelo worker (assinando, enviando ao governo).
AutorizadaDocumento autorizado. numeroProtocolo e xmlGerado preenchidos.
RejeitadaRejeitado pelo governo/prefeitura. Veja motivoRejeicao para o erro exato retornado.
ErroTemporarioFalha temporária de infraestrutura (ex.: webservice do governo fora do ar). Pode valer a pena tentar novamente mais tarde.
FalhaFalha inesperada no processamento — veja motivoRejeicao.
CanceladaDocumento cancelado (ação feita pelo Portal do Cliente).
CancelamentoPendenteCancelamento solicitado, aguardando confirmação do governo.

Referência de erros HTTP

CódigoQuando ocorre
400 Bad Requesttipo inválido ou payload ausente/nulo.
401 UnauthorizedCabeçalho X-Api-Key ausente, chave incorreta ou revogada.
404 Not Found(Só no GET) Documento inexistente ou pertencente a outra empresa.

Exemplo — cURL

curl -X POST "https://api.maxerp.com.br/v1/documentos-fiscais" \
  -H "X-Api-Key: SUA_CHAVE_AQUI" \
  -H "Content-Type: application/json" \
  -d '{
    "tipo": "NfseNacional",
    "payload": {
      "numeroDps": 42,
      "serieDps": "00001",
      "tomador": {
        "cpfCnpj": "58639313000174",
        "razaoSocial": "EMPRESA TOMADORA LTDA",
        "email": "financeiro@empresatomadora.com.br"
      },
      "servico": {
        "codigoItemListaServico": "010701",
        "discriminacao": "Servico prestado",
        "valorServicos": 2500.00,
        "aliquotaIss": 5,
        "codigoCidadePrestacao": "3532504"
      }
    }
  }'

# Consultar depois:
curl "https://api.maxerp.com.br/v1/documentos-fiscais/3fa85f64-5717-4562-b3fc-2c963f66afa6" \
  -H "X-Api-Key: SUA_CHAVE_AQUI"

Exemplo — PHP

<?php

$apiKey = 'SUA_CHAVE_AQUI';
$baseUrl = 'https://api.maxerp.com.br/v1/documentos-fiscais';

$payload = [
    'tipo' => 'NfseNacional',
    'payload' => [
        'numeroDps' => 42,
        'serieDps' => '00001',
        'tomador' => [
            'cpfCnpj' => '58639313000174',
            'razaoSocial' => 'EMPRESA TOMADORA LTDA',
            'email' => 'financeiro@empresatomadora.com.br',
        ],
        'servico' => [
            'codigoItemListaServico' => '010701',
            'discriminacao' => 'Servico prestado',
            'valorServicos' => 2500.00,
            'aliquotaIss' => 5,
            'codigoCidadePrestacao' => '3532504',
        ],
    ],
];

$ch = curl_init($baseUrl);
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => json_encode($payload),
    CURLOPT_HTTPHEADER => [
        'X-Api-Key: ' . $apiKey,
        'Content-Type: application/json',
    ],
]);

$respostaBruta = curl_exec($ch);
$statusHttp = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

$resposta = json_decode($respostaBruta, true);

if ($statusHttp === 200 || $statusHttp === 202) {
    echo "Documento: {$resposta['id']} — status: {$resposta['status']}\n";

    if ($resposta['status'] === 'Pendente') {
        // Consultar novamente mais tarde:
        // GET https://api.maxerp.com.br/v1/documentos-fiscais/{$resposta['id']}
    }
} else {
    echo "Erro ({$statusHttp}): " . ($resposta['erro'] ?? $respostaBruta) . "\n";
}

Exemplo — JavaScript (fetch)

const resposta = await fetch('https://api.maxerp.com.br/v1/documentos-fiscais', {
  method: 'POST',
  headers: {
    'X-Api-Key': 'SUA_CHAVE_AQUI',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    tipo: 'NfseNacional',
    payload: {
      numeroDps: 42,
      serieDps: '00001',
      tomador: {
        cpfCnpj: '58639313000174',
        razaoSocial: 'EMPRESA TOMADORA LTDA',
        email: 'financeiro@empresatomadora.com.br',
      },
      servico: {
        codigoItemListaServico: '010701',
        discriminacao: 'Servico prestado',
        valorServicos: 2500.00,
        aliquotaIss: 5,
        codigoCidadePrestacao: '3532504',
      },
    },
  }),
});

const dados = await resposta.json();

if (resposta.ok) {
  console.log(`Documento ${dados.id} — status: ${dados.status}`);
} else {
  console.error(`Erro (${resposta.status}):`, dados.erro ?? dados);
}

Boas práticas

  • Trate o 202 como normal, não como erro. Documentos que demoram mais para autorizar (ex.: webservice do governo lento) retornam 202 — sua integração deve consultar o GET periodicamente até sair de Pendente/Processando.
  • Guarde sempre o id retornado, mesmo em caso de rejeição — ele é sua referência para consultar o documento depois ou para abrir um chamado de suporte.
  • Não reenvie o mesmo número de DPS/RPS em caso de dúvida. Se não tiver certeza se uma emissão foi recebida, consulte pelo id antes de reenviar — reemitir o mesmo número pode ser rejeitado pelo governo como duplicidade.
  • Homologação vs. Produção é uma configuração do ambiente da própria plataforma (não um parâmetro da requisição) — confirme com o time responsável pela instalação em qual ambiente sua API Key está operando antes de emitir documentos reais.
  • Nunca exponha sua API Key em código client-side (JavaScript rodando no navegador, apps mobile). Chame a API sempre a partir do seu backend.

Suporte

Dúvidas sobre a integração, credenciais ou comportamento inesperado da API: entre em contato com o time responsável pela sua instalação da Max ERP Fiscal Platform.