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.
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.
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
- Acesse o Portal do Cliente da plataforma e entre com seu usuário.
- Selecione a empresa (tenant) para a qual deseja emitir documentos.
- Vá em API Keys no menu lateral e clique em "+ Gerar nova API Key".
- 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.
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
Cabeçalhos
| Cabeçalho | Valor |
|---|---|
X-Api-Key | Sua chave de API |
Content-Type | application/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": { ... }
}
| Campo | Tipo | Descriçã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. |
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"
}
| Campo | Descrição |
|---|---|
id | Identificador único do documento nesta plataforma (use para consultas futuras). |
status | Um dos valores da tabela de status. |
numeroProtocolo | Para 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. |
motivoRejeicao | Mensagem de erro do governo/prefeitura quando status é Rejeitada ou Falha. null caso contrário. |
xmlGerado | XML 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. |
linkDanfse | URL 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
| Parâmetro | Local | Descrição |
|---|---|---|
id | Path | O id retornado na emissão (GUID). |
X-Api-Key | Header | Mesma 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
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âmetro | Local | Descrição |
|---|---|---|
id | Path | O 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
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ípio | UF | Aderente 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ípio | Código IBGE | Webservice próprio |
|---|---|---|
| Brasília/DF | 5300108 | ISS.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ípio | Código IBGE | Provedor |
|---|---|---|
| São Paulo/SP | 3550308 | ISSSaoPaulo — 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.
Objeto raiz
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
numeroDps | inteiro | sim | Número sequencial da DPS (Declaração de Prestação de Serviço) na sua série. |
serieDps | string | sim | Série da DPS. Ex.: "00001". |
tomador | objeto | sim | Dados do tomador do serviço — ver tabela abaixo. |
servico | objeto | sim | Dados do serviço prestado — ver tabela abaixo. |
intermediario | objeto | não | Dados do intermediário do serviço (ex.: plataforma/marketplace), quando houver. Mesma forma de tomador. O prestador continua sendo quem assina a DPS. |
substituicao | objeto | não | Preencha quando esta DPS substitui uma anterior. Ver tabela abaixo. |
ibsCbs | objeto | não | Bloco raso do IBS/CBS (reforma tributária). Ver tabela abaixo. |
tomador
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
cpfCnpj | string | sim | CPF (11 dígitos) ou CNPJ (14 dígitos) do tomador, só números. |
razaoSocial | string | sim | Razão social ou nome completo do tomador. |
inscricaoMunicipal | string | não | Inscrição municipal do tomador, se houver. |
codigoCidade | string | não | Código IBGE da cidade do tomador. |
cep | string | não | CEP, só números. |
endereco | string | não | Logradouro. |
numero | string | não | Número do endereço. |
bairro | string | não | Bairro. |
telefone | string | não | Telefone de contato. |
email | string | não | E-mail do tomador. Usado para o envio automático do XML/DANFSe, se a empresa tiver notificação por e-mail ativada. |
servico
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
codigoItemListaServico | string | sim | Código do item da Lista de Serviços (LC 116/2003). Ex.: "010701". |
discriminacao | string | sim | Descrição do serviço prestado. |
valorServicos | decimal | sim | Valor total do serviço, em reais. |
aliquotaIss | decimal | não | Alí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. |
codigoCidadePrestacao | string | sim | Có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. |
codigoNbs | string | não | Código NBS (Nomenclatura Brasileira de Serviços), se aplicável. |
codigoTribMunicipal | string | não | Có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. |
informacoesComplementares | string | não | Texto livre adicional (ex.: número de pedido/OS). |
tipoRetIss | inteiro | não (padrão 1) | 1 = não retido · 2 = retido pelo tomador · 3 = retido pela administração pública. |
tipoCst | string | não | Código de Situação Tributária, quando aplicável. |
valorPercAliqSN | decimal | nã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. |
descontoIncondicional | decimal | não | Desconto incondicional em reais. |
descontoCondicional | decimal | não | Desconto condicional em reais. |
issqnOperacao | string | não (padrão "Tributavel") | "Tributavel" · "Imunidade" · "ExportacaoServico" · "NaoIncidencia". |
exigibilidadeSuspensaTipo | string | não | "Judicial" ou "Administrativo" — exige exigibilidadeSuspensaProcesso junto. |
exigibilidadeSuspensaProcesso | string | não | Número do processo judicial/administrativo. |
beneficioMunicipalNumero | string | não | Número do benefício fiscal municipal concedido ao prestador. |
beneficioMunicipalValorReducao | decimal | não | Valor da redução concedida pelo benefício, em reais. |
beneficioMunicipalPercentualReducao | decimal | não | Percentual de redução concedido pelo benefício. |
retencoesFederais | objeto | não | Retenção de IRRF/CSLL/INSS/PIS/COFINS. Ver tabela abaixo. |
deducao | objeto | não | Dedução/redução da base de cálculo. Ver tabela abaixo. |
comercioExterior | objeto | não | Serviço prestado para o exterior. Ver tabela abaixo. |
locacao | objeto | não | Locação de infraestrutura (postes, dutos, ferrovia...). Ver tabela abaixo. |
obra | objeto | não | Serviço vinculado a obra de construção civil. Ver tabela abaixo. |
evento | objeto | não | Serviço vinculado a um evento. Ver tabela abaixo. |
exploracaoRodoviaria | objeto | não | Pedágio/exploração rodoviária. Ver tabela abaixo. |
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:
| Caso | Condição | O 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.
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
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
valorIrrf | decimal | não | Valor retido de IRRF. |
valorCsll | decimal | não | Valor retido de CSLL. |
valorInss | decimal | não | Valor retido de INSS (contribuição previdenciária). |
pisCofinsCst | string | não | Có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. |
valorBaseCalculoCofins | decimal | não | Base de cálculo do COFINS. |
aliquotaPis | decimal | não | Alíquota do PIS em percentual. |
aliquotaCofins | decimal | não | Alíquota do COFINS em percentual. |
valorPis | decimal | não | Valor retido/apurado de PIS. |
valorCofins | decimal | não | Valor retido/apurado de COFINS. |
tipoRetencaoPisCofinsCsll | string | não | Combinação de retenção — um de: PisCofinsCsllNaoRetidos, PisCofinsRetidos, PisCofinsNaoRetidos, PisCofinsCsllRetidos, PisCofinsRetidosCsllNaoRetido, PisRetidoCofinsCsllNaoRetidos, CofinsRetidoPisCSllNaoRetidos, PisNaoRetidoCofinsCsllRetidos, PisCofinsNaoRetidosCsllRetido, CofinsNaoRetidoPisCSllRetidos. |
servico.deducao
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
percentual | decimal | não | Percentual de dedução/redução sobre a base de cálculo. |
valor | decimal | não | Valor de dedução/redução em reais. |
documentos | lista de objetos | não | Documentos 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
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
modo | string | sim | Transfronteirico · ConsumoBrasil · PresencaComercialExterior · MovimentoTemporarioPessoasFisicas. |
vinculo | string | não (padrão SemVinculo) | SemVinculo · Controlada · Controladora · Coligada · Matriz · Filial · Outro. |
codigoMoeda | inteiro | não | Código numérico ISO 4217 da moeda estrangeira (ex.: 220 = USD). |
valorServicoMoedaEstrangeira | decimal | não | Valor do serviço na moeda estrangeira. |
numeroDeclaracaoImportacao | string | não | Número da Declaração de Importação, se aplicável. |
numeroRegistroExportacao | string | não | Número do Registro de Exportação, se aplicável. |
compartilharMdic | string | não (padrão NaoEnviar) | NaoEnviar ou Enviar — compartilhar os dados com o MDIC. |
servico.locacao
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
categoria | string | sim | Locacao · Sublocacao · Arrendamento · DireitoPassagem · PermissaoUso. |
objeto | string | sim | Ferrovia · Rodovia · Postes · Cabos · Dutos · Condutos. |
extensaoTotalMetros | inteiro | não | Extensão total do objeto locado, em metros. |
numeroPostes | inteiro | não | Número de postes, quando aplicável. |
servico.obra
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
inscricaoImobiliaria | string | não | Inscrição imobiliária do imóvel/obra. |
codigoObra | string | não | Código da obra (CEI ou equivalente). |
codigoCib | string | não | Código CIB (Cadastro Imobiliário Brasileiro), se houver. |
cep, logradouro, numero, complemento, bairro | string | não | Endereço da obra — informe pelo menos cep ou logradouro para o bloco ser incluído. |
servico.evento
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
descricao | string | sim | Descrição do evento. |
dataInicio | data/hora | sim | Início do evento (ISO 8601). |
dataFim | data/hora | sim | Fim do evento (ISO 8601). |
idEvento | string | não | Identificador do evento, se cadastrado em algum sistema de gestão de eventos. |
cep, logradouro, numero, bairro | string | não | Endereço do evento — informe pelo menos cep ou logradouro para o bloco ser incluído. |
codigoCidade | string | condicional | Có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
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
categoria | string | sim | Categoria do veículo — ex.: AutomovelCaminhoneteFurgao, MotocicletasMotonetasBicicletasMotorizadas, VeiculoIsento (ver enum CategoriaVeiculo do OpenAC.Net para a lista completa). |
numeroEixos | inteiro | sim | Número de eixos do veículo. |
tipoRodagem | string | sim | Simples ou Dupla. |
placa | string | não | Placa do veículo. |
codigoAcessoPedagio | string | não | Código de acesso/tag de pedágio. |
codigoContrato | string | não | Código do contrato de exploração rodoviária. |
orientacaoPesagem | inteiro | não | Orientação de pesagem, quando exigida. |
substituicao
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
chaveSubstituida | string | sim | Chave de acesso da NFS-e que está sendo substituída. |
codigoMotivo | string | sim | DesenquadramentoSimplesNacional · EnquadramentoSimplesNacional · InclusaoRetroativaImunidadeIsencao · ExclusaoRetroativaImunidadeIsencao · RejeicaoNFSeTomadorIntermediario · Outros. |
motivo | string | não | Descrição livre do motivo da substituição. |
ibsCbs
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
indicadorUsoFinal | string | sim | Sim (consumo pessoal, art. 57) ou Nao. |
codigoIndicadorOperacao | string | sim | Có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). |
indicadorDestinatario | string | sim | ProprioTomador (o tomador da NFS-e é o próprio destinatário do serviço — caso mais comum) ou Outro (destinatário é pessoa diferente do tomador). |
codigoSituacaoTributaria | string | sim | CST do IBS/CBS, 3 dígitos. "000" = tributação integral (caso comum, sem isenção/redução). |
codigoClassificacaoTributaria | string | sim | Classificaçã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. |
tipoOperacao | string | não | FornecimentoPagamentoPosterior · 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
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
numeroRps | string | sim | Número do RPS (Recibo Provisório de Serviços). |
serieRps | string | sim | Série do RPS. |
tomador | objeto | sim | Dados do tomador — ver tabela abaixo. |
servico | objeto | sim | Dados do serviço — ver tabela abaixo. |
tomador
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
cpfCnpj | string | sim | CPF ou CNPJ do tomador, só números. |
razaoSocial | string | sim | Razão social ou nome do tomador. |
inscricaoMunicipal | string | não | Inscrição municipal do tomador. |
endereco | string | não | Logradouro. |
numero | string | não | Número do endereço. |
bairro | string | não | Bairro. |
codigoMunicipioIbge | string | não | Código IBGE da cidade do tomador. |
uf | string | não | Sigla do estado (ex.: "SP"). |
cep | string | não | CEP, só números. |
telefone | string | não | Telefone de contato. |
email | string | não | E-mail do tomador, usado na notificação automática se ativada. |
servico
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
itemListaServico | string | sim | Código do item da Lista de Serviços (LC 116/2003). |
discriminacao | string | sim | Descrição do serviço prestado. |
valorServicos | decimal | sim | Valor total do serviço. |
aliquota | decimal | não | Alíquota do ISS em percentual. Quando informada, o sistema calcula automaticamente o valor do ISS e o valor líquido. |
codigoTributacaoMunicipio | string | não | Código de tributação municipal específico da prefeitura, se exigido. |
cnae | string | não | CNAE 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. |
ibsCbs | objeto | não | Presente = 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)
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
codigoCnae | string | sim | CNAE do prestador, 7 dígitos. |
codigoNbs | string | sim | Código NBS do serviço. |
codigoIndicadorOperacao | string | sim | Código de 6 dígitos do indicador de operação — mesma tabela oficial usada no Nacional. |
codigoClassificacaoTributaria | string | sim | Classificação Tributária do IBS/CBS, 6 dígitos. |
codigoSituacaoTributaria | string | sim | CST 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"
}
}
}
}
Status possíveis
numeroProtocolo e xmlGerado preenchidos.motivoRejeicao para o erro exato retornado.motivoRejeicao.Referência de erros HTTP
| Código | Quando ocorre |
|---|---|
400 Bad Request | tipo inválido ou payload ausente/nulo. |
401 Unauthorized | Cabeç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
idretornado, 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
idantes 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.