Documentação da API

Max ERP Fiscal Platform — emissão e consulta de documentos fiscais (NFS-e e NFC-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 Configurações > Dados fiscais, um cadastro só vale para NFS-e Nacional, NFS-e Municipal, NF-e e NFC-e: endereço, inscrições, regime tributário, séries e CSC. Preenchido uma vez, o sistema usa os mesmos dados em cada tipo de nota. A inscrição municipal habilita a NFS-e Municipal (obrigatória em São Paulo) e a inscrição estadual habilita NF-e e NFC-e.
  • Certificado digital A1 (.pfx) enviado — em Configurações > Certificado digital ou pela API (Subir certificado digital), usado para assinar digitalmente o documento antes de enviar ao governo.

Para NF-e e NFC-e, o mesmo cadastro precisa ter inscrição estadual, regime tributário (CRT), série e, só para a NFC-e, o CSC (ID + código, gerado no portal da SEFAZ da sua UF — homologação e produção são diferentes). Detalhes em NFC-e e NF-e. Para criar a empresa e subir o certificado por integração, veja Cadastrar empresa.

Sem isso, a emissão é aceita pela API (fica em fila) mas retorna Rejeitada com uma mensagem explicando o que falta. No caso da NFC-e, a API já responde 400 na hora quando o cadastro da NFC-e não foi preenchido.

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", "NfseMunicipal", "NFCe" ou "NFe".
Qual usar para NFS-e? Cada cidade emite por um modelo: NfseMunicipal para São Paulo/SP (Nota Paulistana); NfseNacional para as cidades do padrão Nacional e para Brasília/DF (ver lista). O corpo muda conforme o tipo — não misture os nomes dos campos.
payload obrigatório object Objeto com os dados do documento. Estrutura completa nas seções NFS-e Nacional, NFS-e Municipal, NFC-e e NF-e 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 e NFC-e: a chave de acesso da nota (44 dígitos na NFC-e). 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.
chaveAcessoSó NFC-e. Chave de acesso de 44 dígitos (mesmo valor de numeroProtocolo).
numero / serieSó NFC-e. Número e série da NFC-e — úteis quando você não informou numero e a plataforma reservou o próximo da sequência.
linkDanfceSó NFC-e. URL pública do cupom (DANFCE) em PDF, sem X-Api-Key. Só vem preenchida com a nota Autorizada (ou cancelada depois de autorizada).

400 Bad Request

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

Ocorre quando tipo não é reconhecido ou payload está ausente/nulo. Para "NFCe", também quando a empresa ainda não preencheu o cadastro da NFC-e (Dados fiscais) ou o payload não pôde ser lido.

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. Depois de autorizada, a resposta também traz:

CampoDescrição
numeroNúmero da nota. NFS-e: o número da nota na prefeitura/Ambiente Nacional (ex.: "19400"). NF-e e NFC-e: o número reservado.
serieSérie (do RPS na NFS-e Municipal; da nota na NF-e/NFC-e).
chaveAcessoChave de acesso: 44 dígitos na NF-e/NFC-e; chave da nota nacional na NFS-e (São Paulo devolve a ChaveNotaNacional).
codigoVerificacaoCódigo de verificação da NFS-e, quando a prefeitura devolve (ex.: "P6DZLPF9").
alertasLista [{ "codigo", "descricao" }] de avisos informativos da prefeitura. Não são rejeição — a nota foi gerada. Ex.: 1259 (serviço de diversões públicas: ISS recolhido pelo SDPE).
linkDanfse · linkDanfce · linkDanfeLinks do documento auxiliar de cada tipo (os que não se aplicam vêm null).

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).

Baixar DANFCE (NFC-e)

GET /v1/documentos-fiscais/{id}/danfce
Endpoint público — não exige X-Api-Key Igual ao DANFSe: a segurança é o id ser um GUID não adivinhável. Pode ser aberto direto no navegador ou entregue ao consumidor.
ParâmetroLocalDescrição
idPathO id retornado na emissão, ou o valor do campo linkDanfce da resposta.

Resposta

200 OK — PDF do DANFCE (Content-Type: application/pdf): cupom de 80 mm com itens, totais, formas de pagamento, chave de acesso, protocolo de autorização e QR Code de consulta. Notas canceladas saem com a faixa "NFC-e CANCELADA"; em homologação o cupom traz o aviso "sem valor fiscal".

400 Bad Request

O documento não é uma NFC-e.

404 Not Found

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

Parceiros: cadastrar empresas

POST /v1/empresas
Token exclusivo de parceiro: as rotas /v1/empresas usam o token do parceiro, no header X-Parceiro-Token. Ele é gerado pela MaxERP para empresas marcadas como parceiro de negócio e só serve para provisionar empresas — não emite documentos (para isso vale a X-Api-Key de cada empresa). Somente parceiros conseguem cadastrar empresas.

Como funciona a responsabilidade:

  • O parceiro é responsável pelas empresas que cria: a cobrança delas vai para o responsável financeiro do parceiro.
  • Cada empresa criada é uma emissão separada, com API Key, certificado, numeração e documentos próprios. O mesmo CNPJ pode ser cadastrado por parceiros diferentes, sem nenhuma ligação entre as empresas.
  • O parceiro só enxerga e altera as empresas que ele mesmo criou.

O e-mail do cliente é obrigatório e validado: precisa ser de alguém que já tem login no Portal do Cliente. Ele ganha acesso de administrador à empresa no Portal (quem paga continua sendo o responsável do parceiro).

curl -X POST https://api.maxerp.com.br/v1/empresas \
  -H "X-Parceiro-Token: SEU_TOKEN_DE_PARCEIRO" \
  -H "Content-Type: application/json" \
  -d '{ "cnpj": "27.529.641/0001-94", "razaoSocial": "IMPULSO PARK - SP", "emailCliente": "rogerio@cliente.com.br" }'
CampoObrig.Descrição
cnpjsimCNPJ da empresa, com ou sem máscara. Os dígitos verificadores são conferidos.
razaoSocialsimRazão social.
emailClientesimE-mail do cliente no Portal do Cliente. Ganha acesso de administrador à empresa.

201 Created

{ "empresaId": "4dd1be5c-1e31-457f-b6e6-6d55b6ea86c2", "cnpj": "27529641000194", "razaoSocial": "IMPULSO PARK - SP",
  "emailCliente": "rogerio@cliente.com.br", "nomeCliente": "Rogério Salvieri", "jaExistia": false,
  "apiKey": "…mostrada só nesta resposta…" }

A apiKey da empresa (para emitir notas) só aparece na criação — guarde-a; se perder, gere outra em Gerar nova API Key. Se o seu parceiro já cadastrou esse CNPJ, a resposta é 200 OK com jaExistia: true: nada é duplicado, só se garante o acesso do cliente, e nenhuma chave nova é gerada.

Erros

HTTPerroQuando
401—Header X-Parceiro-Token ausente, inválido, revogado, ou parceiro desativado.
403parceiro_invalido · parceiro_suspensoA empresa dona do token não é (mais) parceiro de negócio, ou está suspensa.
422cnpj_invalido · razao_social_obrigatoriaDados da empresa inválidos.
422email_cliente_obrigatorio · email_cliente_invalidoE-mail não informado ou malformado.
404cliente_nao_encontradoNenhum cliente do Portal com esse e-mail — a empresa não é criada.
409cliente_inativoCliente desativado.
409parceiro_sem_responsavel_financeiroO parceiro ainda não tem responsável financeiro definido pela MaxERP.
409limite_de_empresas_atingidoO parceiro atingiu o limite de empresas combinado.

Listar e consultar as empresas do parceiro

GET /v1/empresas
GET /v1/empresas/{empresaId}

Mesmo header X-Parceiro-Token. Só aparecem as empresas criadas pelo parceiro; uma empresa de outro parceiro responde 404 empresa_nao_encontrada.

[ { "empresaId": "…", "cnpj": "27529641000194", "razaoSocial": "IMPULSO PARK - SP", "status": "Ativo",
    "temCertificado": true, "certificadoValidoAte": "2027-04-06T17:10:00Z", "ultimoUsoApiKey": "2026-10-20T21:30:00Z" } ]

Gerar nova API Key da empresa

POST /v1/empresas/{empresaId}/api-key

Como a chave só é mostrada na criação, o parceiro pode gerar outra para uma empresa dele. As chaves anteriores da empresa deixam de valer na hora.

curl -X POST https://api.maxerp.com.br/v1/empresas/{empresaId}/api-key \
  -H "X-Parceiro-Token: SEU_TOKEN_DE_PARCEIRO"

200 OK

{ "empresaId": "…", "apiKey": "…mostrada só nesta resposta…", "chavesRevogadas": 1 }

Subir certificado digital

POST /v1/empresas/{empresaId}/certificado
POST /v1/certificado

Envia (ou substitui) o certificado digital A1 (.pfx) da empresa. A primeira rota usa o token do parceiro (X-Parceiro-Token) e vale para as empresas que ele criou; a segunda usa a X-Api-Key da própria empresa e envia o certificado dela. As duas aceitam as mesmas formas de envio:

Multipart (arquivo)

curl -X POST https://api.maxerp.com.br/v1/empresas/{empresaId}/certificado \
  -H "X-Parceiro-Token: SEU_TOKEN_DE_PARCEIRO" \
  -F "arquivo=@certificado.pfx" -F "senha=SENHA_DO_CERTIFICADO"

JSON (base64)

{ "arquivoBase64": "MIIK…", "nomeArquivo": "certificado.pfx", "senha": "SENHA_DO_CERTIFICADO" }

200 OK

{ "empresaId": "…", "nomeArquivo": "certificado.pfx", "validoAte": "2027-04-06T17:10:00Z",
  "titular": "IMPULSO PARK - BRASILIA:27529641000780", "cnpjCertificado": "27529641000780", "substituiu": false }

O sistema abre o arquivo com a senha antes de salvar. A senha é guardada criptografada. O certificado precisa estar dentro da validade, ter a chave privada e ser do CNPJ da empresa (a raiz de 8 dígitos é aceita, então o certificado da matriz vale para a filial).

Erros

HTTPerroQuando
404empresa_nao_encontradaempresaId inexistente ou de outro parceiro.
422arquivo_obrigatorio · senha_obrigatoria · base64_invalidoCorpo incompleto.
422certificado_ilegivelSenha incorreta ou arquivo que não é um .pfx.
422certificado_vencido · certificado_sem_chave_privadaCertificado inutilizável.
409certificado_de_outro_cnpjO CNPJ do certificado não é o da empresa.
413arquivo_grande_demaisMais de 5 MB.

Consultar e listar notas (NFS-e)

Só consulta: estas rotas nunca emitem nem alteram nada (exceto o pedido de cancelamento, que é um POST à parte). Autenticação: X-Api-Key da empresa. Datas em ISO 8601 e valores numéricos com ponto decimal.

Referência externa na emissão

No POST /v1/documentos-fiscais informe, ao lado de tipo e payload, o campo opcional referenciaExterna (texto de até 40 caracteres, por exemplo o número do pedido no ERP):

{ "tipo": "NfseNacional", "referenciaExterna": "PED-000123", "payload": { … } }
  • Idempotente: se já existe uma nota não cancelada e não rejeitada com a mesma referência, a API não emite outra: devolve a nota existente (200 OK). Se a anterior foi cancelada ou rejeitada, a emissão segue normalmente.
  • Mais de 40 caracteres: 400 com code: "referencia_invalida".
  • A referência volta em todas as consultas (referenciaExterna).

Recuperar uma nota pela referência

GET /v1/documentos-fiscais?referenciaExterna=PED-000123

Devolve a nota (ou items: []) sem depender do id, para recuperar o resultado quando a resposta da emissão se perdeu (timeout).

Listagem paginada

GET /v1/documentos-fiscais
ParâmetroDescrição
dataEmissaoDe, dataEmissaoAteAAAA-MM-DD, inclusive, no horário de Brasília.
statusPendente, Processando, Autorizada, Rejeitada, Cancelada (também CancelamentoPendente, Falha, ErroTemporario).
tipoNfseNacional ou NfseMunicipal. Sem o filtro, vêm as duas.
cpfCnpjTomadorCom ou sem máscara.
referenciaExternaReferência informada na emissão.
numeroDpsNúmero da DPS (Nacional) ou do RPS (Municipal).
atualizadoDesdeData/hora ISO 8601 (ex.: 2026-11-06T10:00:00-03:00). Traz só o que mudou desde então — inclusive cancelamentos feitos no portal — em ordem cronológica de atualização, para sincronizar o ERP.
page, pageSizePadrão 1 e 50; pageSize máximo 200. A resposta traz page, pageSize, total e items.

Observação: cpfCnpjTomador e numeroDps são filtrados sobre as 5.000 notas mais recentes que atendem aos demais filtros; combine com um período (dataEmissaoDe) em bases grandes.

curl "https://api.maxerp.com.br/v1/documentos-fiscais?status=Autorizada&dataEmissaoDe=2026-11-01&page=1&pageSize=50" \
  -H "X-Api-Key: SUA_API_KEY"

Exemplo de resposta (200 OK)

{
  "page": 1,
  "pageSize": 50,
  "total": 1,
  "items": [
    {
      "id": "0f355f99-f80b-4801-8e0f-2c804990f33f",
      "status": "Autorizada",
      "numeroProtocolo": "13026032203160760000154000000000084926105150126468",
      "motivoRejeicao": null,
      "linkDanfse": "https://api.maxerp.com.br/v1/documentos-fiscais/0f355f99-f80b-4801-8e0f-2c804990f33f/danfse",
      "chaveAcesso": "13026032203160760000154000000000084926105150126468",
      "numero": "849",
      "serie": "1",
      "codigoVerificacao": null,
      "alertas": [],
      "linkDanfce": null,
      "linkDanfe": null,
      "tipo": "NfseNacional",
      "motivo": null,
      "numeroNota": "849",
      "numeroDps": "647",
      "serieDps": "1",
      "dataEmissao": "2026-10-23T15:44:25Z",
      "dataAutorizacao": "2026-10-23T15:45:25Z",
      "dataCancelamento": null,
      "atualizadoEm": "2026-10-23T15:45:31.208Z",
      "valorServicos": 2180.0,
      "valorIss": 109.0,
      "aliquota": 5.0,
      "valorLiquido": 2071.0,
      "tomador": {
        "cpfCnpj": "11892491000149",
        "razaoSocial": "SOUZA E VASCONCELOS LTDA",
        "email": "a@b.com"
      },
      "servico": {
        "codigoItemListaServico": "080201",
        "discriminacao": "CLUBE"
      },
      "referenciaExterna": "PED-000123",
      "links": {
        "pdf": "https://api.maxerp.com.br/v1/documentos-fiscais/0f355f99-f80b-4801-8e0f-2c804990f33f/danfse",
        "xml": "https://api.maxerp.com.br/v1/documentos-fiscais/0f355f99-f80b-4801-8e0f-2c804990f33f/xml"
      }
    }
  ]
}

Detalhe de uma nota

GET /v1/documentos-fiscais/{id}

Mesmo formato dos itens da listagem, mais xmlGerado (o XML autorizado, ou o enviado quando houve rejeição).

Exemplo de resposta (200 OK)

{
  "id": "0f355f99-f80b-4801-8e0f-2c804990f33f",
  "status": "Autorizada",
  "numeroProtocolo": "13026032203160760000154000000000084926105150126468",
  "motivoRejeicao": null,
  "xmlGerado": "<NFSe …>…</NFSe>",
  "linkDanfse": "https://api.maxerp.com.br/v1/documentos-fiscais/0f355f99-f80b-4801-8e0f-2c804990f33f/danfse",
  "chaveAcesso": "13026032203160760000154000000000084926105150126468",
  "numero": "849",
  "serie": "1",
  "codigoVerificacao": null,
  "alertas": [],
  "linkDanfce": null,
  "linkDanfe": null,
  "tipo": "NfseNacional",
  "motivo": null,
  "numeroNota": "849",
  "numeroDps": "647",
  "serieDps": "1",
  "dataEmissao": "2026-10-23T15:44:25Z",
  "dataAutorizacao": "2026-10-23T15:45:25Z",
  "dataCancelamento": null,
  "atualizadoEm": "2026-10-23T15:45:31.208Z",
  "valorServicos": 2180.0,
  "valorIss": 109.0,
  "aliquota": 5.0,
  "valorLiquido": 2071.0,
  "tomador": {
    "cpfCnpj": "11892491000149",
    "razaoSocial": "SOUZA E VASCONCELOS LTDA",
    "email": "a@b.com"
  },
  "servico": {
    "codigoItemListaServico": "080201",
    "discriminacao": "CLUBE"
  },
  "referenciaExterna": "PED-000123",
  "links": {
    "pdf": "https://api.maxerp.com.br/v1/documentos-fiscais/0f355f99-f80b-4801-8e0f-2c804990f33f/danfse",
    "xml": "https://api.maxerp.com.br/v1/documentos-fiscais/0f355f99-f80b-4801-8e0f-2c804990f33f/xml"
  }
}

Campos devolvidos

CampoDescrição
id, tipo, statusIdentificação e situação. status: Pendente, Autorizada, Rejeitada, Cancelada…
motivoMensagem de rejeição/erro, quando houver (motivoRejeicao continua disponível).
numeroNota, numeroDps, serieDps, codigoVerificacao, chaveAcessoNumeração e chaves. numeroNota só existe depois da autorização.
dataEmissao, dataAutorizacao, dataCancelamento, atualizadoEmISO 8601 em UTC. dataCancelamento é null se não cancelada.
valorServicos, valorIss, aliquota, valorLiquidoValores da nota (da autorização; antes dela, calculados do que foi enviado).
tomadorcpfCnpj, razaoSocial, email.
servicocodigoItemListaServico, discriminacao.
referenciaExternaReferência do ERP.
links.pdfDANFSe em PDF — link público (abre sem X-Api-Key).
links.xmlXML autorizado — link público (abre sem X-Api-Key): GET /v1/documentos-fiscais/{id}/xml.

Cancelar uma nota

POST /v1/documentos-fiscais/{id}/cancelar
curl -X POST https://api.maxerp.com.br/v1/documentos-fiscais/{id}/cancelar \
  -H "X-Api-Key: SUA_API_KEY" -H "Content-Type: application/json" \
  -d '{ "motivo": "Nota emitida com valor incorreto" }'

Só para nota autorizada. O cancelamento é assíncrono: a API responde 202 Accepted com a nota em CancelamentoPendente; acompanhe pela consulta até Cancelada (se o governo recusar, a nota volta a Autorizada e o motivo da recusa aparece em motivo). No Ambiente Nacional o motivo precisa ter ao menos 15 caracteres.

Erros

Todas as rotas desta seção respondem erros como { "code": "...", "message": "..." }:

HTTPcodeQuando
400parametro_invalidoFiltro ou paginação inválidos (a mensagem diz qual).
400referencia_invalidareferenciaExterna com mais de 40 caracteres.
401nao_autorizadoX-Api-Key ausente ou inválida.
404documento_nao_encontradoDocumento inexistente ou de outra empresa.
422motivo_obrigatorio · motivo_invalido · cancelamento_indisponivelCancelamento sem motivo, motivo curto demais, ou nota que não está autorizada.

Consumo (bilhetagem)

GET /v1/consumo

Quantidade de documentos autorizados por emitente e tipo em um período, para faturar por volume. Só leitura: nunca emite nem altera nada. Autenticação: X-Api-Key.

curl "https://api.maxerp.com.br/v1/consumo?dataDe=2026-11-01&dataAte=2026-11-30&tipo=NfseNacional" \
  -H "X-Api-Key: SUA_API_KEY"
ParâmetroObrig.Descrição
dataDe, dataAtesimAAAA-MM-DD, intervalo inclusivo, no fuso America/Sao_Paulo. Período máximo de 366 dias.
tiponãoNfseNacional, NfseMunicipal, NFe ou NFCe. Vazio = todos os tipos (um item por emitente e tipo).
cnpjEmitentenão14 dígitos (a máscara é aceita). Vazio = todos os emitentes da conta.

Regras de contagem

  • O período é pela data de autorização da nota (nas notas antigas, sem essa data, vale a data de criação).
  • total conta apenas notas Autorizadas (um cancelamento ainda pendente continua contando como autorizada). Rejeitada, Falha, Pendente e Cancelada não entram.
  • canceladas é informado à parte: notas autorizadas no período que depois foram canceladas. Elas não estão em total — para faturar, use total; some canceladas se quiser o bruto.
  • Emitentes da conta: a empresa dona da X-Api-Key e, se ela é parceiro de negócio, todas as empresas que ela cadastrou. Todos aparecem em uma só chamada, inclusive os sem movimento: com tipo informado vêm com total: 0; sem tipo vêm com tipo: null e total: 0.

Chave de administração: consumo de todas as empresas

Para faturar todo mundo em uma chamada (todas as empresas e todos os parceiros), use a chave de administração no header X-Admin-Key no lugar da X-Api-Key. Ela é gerada pela MaxERP no painel Admin (Chaves de administração), é mostrada uma única vez e pode ser revogada. Vale só para leitura de consumo: não emite documentos nem consulta notas.

curl "https://api.maxerp.com.br/v1/consumo?dataDe=2026-11-01&dataAte=2026-11-30"   -H "X-Admin-Key: SUA_CHAVE_DE_ADMINISTRACAO"

Cada item traz também empresaId e parceiroId (nulo quando a empresa não foi criada por parceiro). Como o mesmo CNPJ pode existir em parceiros diferentes, o mesmo cnpj pode aparecer mais de uma vez, uma por empresa.

Exemplo de resposta (200 OK)

{
  "dataDe": "2026-11-01",
  "dataAte": "2026-11-30",
  "itens": [
    {
      "cnpj": "11111111000191",
      "tipo": "NfseNacional",
      "total": 3,
      "canceladas": 0
    },
    {
      "cnpj": "27529641000194",
      "tipo": "NfseNacional",
      "total": 2,
      "canceladas": 1
    },
    {
      "cnpj": "33000167000101",
      "tipo": "NfseNacional",
      "total": 0,
      "canceladas": 0
    }
  ]
}

Erros

Formato { "code": "...", "message": "..." }:

HTTPcodeQuando
400parametro_obrigatoriodataDe ou dataAte ausente.
400parametro_invalidoData fora do formato AAAA-MM-DD, tipo desconhecido ou cnpjEmitente sem 14 dígitos.
401nao_autorizadoX-Api-Key (ou X-Admin-Key) ausente, inválida ou revogada.
422periodo_invalido · periodo_muito_longodataAte anterior a dataDe, ou período com mais de 366 dias.
422emitente_nao_encontradoO cnpjEmitente não é um emitente desta conta.

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

Layout da DPS (NT 009) O Ambiente Nacional passou a exigir finNFSe e indDest como campos do infDPS (NT 009 SE/CGNFS-e, Anexo VI v1.04.01). A plataforma monta o XML no layout vigente e, se o servidor ainda responder com o layout anterior, reenvia no outro automaticamente — o corpo (payload) da API não muda.

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. A plataforma corrige erros comuns de digitação (ex.: gmail,com, gmailcom) e, se o e-mail continuar inválido (caracteres estranhos, vírgula na parte local etc.), omite o campo em vez de deixar a nota ser rejeitada — o e-mail é só informativo.

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.

Campos opcionais de servico — tributação, deduções e retenções

Além de itemListaServico, discriminacao, valorServicos, aliquota e ibsCbs (tabela acima), o objeto servico aceita:

CampoTipoObrigatórioDescrição
tipoTributacaostringnãoTributavel (padrão, tributado em São Paulo) · ForaMun (tributado fora) · Isenta · ForaMunIsento · Imune · ForaMunImune · Suspensa · ForaMunSuspensa · ExpServicos (exportação). Valor diferente disso é recusado na hora.
issRetidoboolnãoISS retido pelo tomador. Padrão false. Não pode ser true com intermediario informado (regra da prefeitura, erro 1419).
valorDeducoesdecimalnãoDeduções da base de cálculo. O ISS passa a incidir sobre valorServicos − valorDeducoes. Precisa ser menor que o valor do serviço.
valorPis · valorCofins · valorCsll · valorInss · valorIrdecimalnãoRetenções federais em R$ — informe só as que o tomador retém. No Layout 2, o tipo de retenção de PIS/COFINS/CSLL é deduzido de quais valores vierem preenchidos.
exigibilidadeSuspensaboolnãoLayout 2: emissão com exigibilidade suspensa. Padrão false.
intermediarioobjetonão{ "cpfCnpj": "…", "inscricaoMunicipal": "…", "issRetido": false }. Não pode ser o próprio tomador.

tomador.cpfCnpj pode ir vazio (""): a nota sai com tomador não identificado (consumidor final).

Regra da prefeitura de São Paulo: Simples Nacional usa sempre o Layout 1 O Layout 2 (IBS/CBS) só vale para empresa fora do Simples Nacional — a prefeitura recusa o Layout 2 de optante do Simples (erro 641 do manual do Web Service). A plataforma decide sozinha: se a empresa é optante do Simples (em Dados fiscais), o bloco ibsCbs é ignorado e a nota sai no Layout 1. Para empresa de regime normal, ibsCbs presente ativa o Layout 2; ausente, Layout 1.

Regras de formato (manual do Web Service da NFS-e de São Paulo, v3.3.9)

  • Discriminação: quebras de linha são trocadas por | e espaços nas pontas são removidos (você pode mandar \n).
  • E-mail do tomador: até 75 caracteres; maior que isso, o e-mail é omitido em vez de a nota ser recusada. E-mails com erro comum de digitação são corrigidos ou removidos.
  • Item do serviço: em São Paulo o itemListaServico tem 5 dígitos (ex.: "08117") — diferente do código de 6 dígitos da NFS-e Nacional.
  • Campos obrigatórios: numeroRps, serieRps e servico.itemListaServico. Um corpo com os nomes do padrão Nacional (numeroDps, codigoItemListaServico…) enviado como NfseMunicipal é recusado com uma mensagem listando o que falta.
  • Alertas: a prefeitura pode autorizar a nota e devolver avisos (ex.: código 1259, serviço de diversões públicas com ISS recolhido pelo SDPE). Eles vêm no campo alertas da resposta.

Exemplos prontos

Os corpos abaixo estão disponíveis para baixar em /docs/exemplos/ (e no repositório, em docs/exemplos-payload/) e são validados por teste automático:

ArquivoPara quem
nfse-sp-simples-nacional.jsonEmpresa do Simples Nacional em São Paulo (Layout 1).
nfse-sp-regime-normal-ibscbs.jsonLucro presumido/real em São Paulo, com IBS/CBS (Layout 2).
nfse-sp-com-retencoes.jsonTomador pessoa jurídica, ISS retido, deduções e retenções federais.
nfse-sp-tomador-nao-identificado.jsonConsumidor sem CPF/CNPJ.
nfse-nacional-completo.jsonNFS-e Nacional com IBS/CBS.
nfse-nacional-sjc-evento.jsonNFS-e Nacional de São José dos Campos: evento (ingresso, item 12.05 = "120501"), tomador não identificado (cpfCnpj vazio: a DPS sai sem o grupo do tomador) e IBS/CBS.

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.

Campos — NFC-e

Use quando tipo = "NFCe" (NFC-e, modelo 65 — cupom fiscal eletrônico do varejo). A emissão é síncrona: a SEFAZ da UF da empresa autoriza na hora e a resposta do POST já traz o resultado, a chave de acesso e o link do cupom. Funciona para todas as UFs. Os dados do emitente (inscrição estadual, regime, endereço, CSC) não entram no payload — vêm do cadastro em Painel de Controle > Dados fiscais.

Ambiente (homologação × produção) Cada empresa começa em Homologação (a SEFAZ autoriza notas de teste, sem valor fiscal — o primeiro item e o destinatário saem com o texto fixo exigido pela SEFAZ). A passagem para Produção é feita pela plataforma, e exige o CSC de produção cadastrado. Em produção a nota tem valor fiscal.

Cadastro prévio (Dados fiscais)

CampoDescrição
Inscrição estadualIE do estabelecimento na SEFAZ.
Regime tributário (CRT)1 Simples Nacional · 2 Simples (excesso de sublimite) · 3 Regime Normal. Define quais CSOSN/CST de ICMS são aceitos no payload.
UF, município, código IBGE, CEP, endereçoEndereço do estabelecimento emitente. O botão "Buscar endereço na Receita" preenche a partir do CNPJ.
SérieSérie da NFC-e (1 a 889). Usada quando o payload não informa serie.
CSC (ID + código)Código de Segurança do Contribuinte, gerado no portal da SEFAZ da sua UF — um para homologação e outro para produção. O código é guardado criptografado.

Objeto raiz

CampoTipoObrigatórioDescrição
itenslistasimDe 1 a 990 itens — ver tabela abaixo.
pagamentoslistasimAo menos uma forma de pagamento — ver tabela abaixo. A soma não pode ser menor que o total da nota; se for maior, a diferença vira troco.
numerointeironãoNúmero da NFC-e. Se omitido, a plataforma reserva o próximo número da sequência da empresa (por série e ambiente) e devolve em numero na resposta. Informe só se o seu sistema controla a numeração — para reenviar uma nota rejeitada, mande o mesmo numero/serie dela e a plataforma reaproveita o registro.
serieinteironãoSérie da NFC-e (1 a 889). Padrão: a série cadastrada em Dados fiscais.
consumidorobjetonãoCPF/CNPJ do consumidor, se ele pediu na nota. Sem este objeto a nota sai como consumidor não identificado.
informacoesAdicionaisstringnãoTexto livre impresso no rodapé do cupom (ex.: "Obrigado pela preferência!").
naturezaOperacaostringnãoPadrão "VENDA".

consumidor

CampoTipoObrigatórioDescrição
cpfCnpjstringnão11 (CPF) ou 14 (CNPJ) dígitos; pontuação é ignorada.
nomestringnãoNome do consumidor (só é enviado quando há cpfCnpj).

itens[]

CampoTipoObrigatórioDescrição
codigostringsimCódigo do produto no seu sistema.
descricaostringsimDescrição do produto.
ncmstringsimNCM com 8 dígitos.
cfopstringsimCFOP com 4 dígitos (ex.: "5102" venda dentro do estado).
unidadestringsimUnidade comercial (UN, KG, CX…).
quantidadedecimalsimMaior que zero (aceita casas decimais, ex.: 0.750).
valorUnitariodecimalsimMaior que zero. O valor do item é quantidade × valorUnitario, arredondado a 2 casas.
descontodecimalnãoDesconto em R$ no item (menor que o valor do item).
codigoBarrasstringnãoGTIN/EAN. Omitido = "SEM GTIN".
ceststringnãoCEST, quando o produto exigir.
origeminteironãoOrigem da mercadoria (0 a 8). Padrão 0 (nacional).
cstIcmsstringnão Simples Nacional (CRT 1/2): CSOSN 102 (padrão), 103, 300, 400 ou 500.
Regime Normal (CRT 3): CST 00 (padrão — exige aliquotaIcms), 40, 41, 50 ou 60.
Outros códigos (ex.: ICMS-ST, CST 20/90, CSOSN 101/900) ainda não são suportados e a nota é rejeitada com mensagem explicativa.
aliquotaIcmsdecimalcondicionalPercentual de ICMS (ex.: 18). Obrigatório com CST 00. A base é o valor do item já com desconto.
cstPis / cstCofinsstringnãoPadrão "49" (outras operações de saída, sem tributo). 01/02 calculam sobre o valor do item e exigem a alíquota; 04 a 09 são não tributados.
aliquotaPis / aliquotaCofinsdecimalcondicionalPercentual; obrigatório quando o CST for 01 ou 02.

pagamentos[]

CampoTipoObrigatórioDescrição
formastringsimCódigo do meio de pagamento: 01 dinheiro · 02 cheque · 03 cartão de crédito · 04 cartão de débito · 05 crédito loja · 10 vale-alimentação · 11 vale-refeição · 12 vale-presente · 13 vale-combustível · 15 boleto · 16 depósito · 17 PIX · 18 transferência · 19 programa de fidelidade · 90 sem pagamento · 99 outros.
valordecimalsimValor pago nesta forma.
descricaostringnãoDescrição do meio de pagamento — usada com forma "99" (outros).

Exemplo mínimo

{
  "tipo": "NFCe",
  "payload": {
    "itens": [
      { "codigo": "001", "descricao": "Produto", "ncm": "21069090", "cfop": "5102", "unidade": "UN", "quantidade": 1, "valorUnitario": 1.00 }
    ],
    "pagamentos": [ { "forma": "01", "valor": 1.00 } ]
  }
}

Exemplo completo — Simples Nacional, consumidor identificado e pagamento misto

{
  "tipo": "NFCe",
  "payload": {
    "serie": 2,
    "consumidor": { "cpfCnpj": "39053344705", "nome": "Fulano de Tal" },
    "itens": [
      {
        "codigo": "001",
        "descricao": "Pao frances",
        "ncm": "19059090",
        "cfop": "5102",
        "unidade": "KG",
        "quantidade": 0.75,
        "valorUnitario": 18.90,
        "desconto": 0.50,
        "codigoBarras": "7891000100103",
        "origem": 0,
        "cstIcms": "102"
      },
      {
        "codigo": "002",
        "descricao": "Refrigerante lata 350ml",
        "ncm": "22021000",
        "cfop": "5102",
        "unidade": "UN",
        "quantidade": 2,
        "valorUnitario": 5.50
      }
    ],
    "pagamentos": [
      { "forma": "17", "valor": 10.00 },
      { "forma": "01", "valor": 20.00 }
    ],
    "informacoesAdicionais": "Obrigado pela preferencia!"
  }
}

Exemplo — Regime Normal (ICMS 18%)

{
  "tipo": "NFCe",
  "payload": {
    "itens": [
      {
        "codigo": "010", "descricao": "Camiseta", "ncm": "61091000", "cfop": "5102", "unidade": "UN",
        "quantidade": 1, "valorUnitario": 59.90,
        "cstIcms": "00", "aliquotaIcms": 18
      }
    ],
    "pagamentos": [ { "forma": "03", "valor": 59.90 } ]
  }
}

Resposta — nota autorizada

{
  "id": "5794503a-72bc-4f5f-920f-6b0c848b4f6d",
  "status": "Autorizada",
  "numeroProtocolo": "53261043809837000270650020000000011123535978",
  "motivoRejeicao": null,
  "xmlGerado": "<?xml version=\"1.0\"?><nfeProc>...</nfeProc>",
  "linkDanfse": null,
  "chaveAcesso": "53261043809837000270650020000000011123535978",
  "numero": "1",
  "serie": "2",
  "linkDanfce": "https://api.maxerp.com.br/v1/documentos-fiscais/5794503a-72bc-4f5f-920f-6b0c848b4f6d/danfce"
}

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": "NFCe",
    "payload": {
      "itens": [
        { "codigo": "001", "descricao": "Produto", "ncm": "21069090", "cfop": "5102", "unidade": "UN", "quantidade": 1, "valorUnitario": 1.00 }
      ],
      "pagamentos": [ { "forma": "01", "valor": 1.00 } ]
    }
  }'

Rejeições comuns

Mensagem em motivoRejeicaoO que fazer
CSC de homologação/produção não cadastrado…Cadastre o ID e o código do CSC do ambiente em uso, em Dados fiscais.
Não foi possível abrir o certificado digital…A senha cadastrada não abre o certificado. Reenvie o certificado em Certificado Digital (o portal valida a senha na hora do envio).
Item N: NCM deve ter 8 dígitos (e similares)Erro de validação no payload — corrija o item indicado e reenvie.
Soma dos pagamentos … é menor que o total da notaOs pagamentos precisam cobrir o total; o excedente vira troco.
CSOSN/CST … ainda não suportadoUse um dos códigos listados na tabela de itens.
NNN - mensagem da SEFAZRejeição devolvida pela própria SEFAZ (código + motivo). Consulte a tabela de rejeições da sua UF.
Cancelamento e contingência O cancelamento da NFC-e é feito pelo Portal do Cliente, na tela de detalhe do documento (a justificativa precisa ter ao menos 15 caracteres, e a SEFAZ limita o prazo). Ainda não há endpoint público de cancelamento, nem contingência offline ou inutilização de numeração — se a SEFAZ estiver fora do ar, a emissão retorna rejeitada/erro temporário e deve ser reenviada depois.

Campos — NF-e (modelo 55)

Use quando tipo = "NFe": nota fiscal de produtos (venda a empresa ou pessoa física, e-commerce), devolução, retorno de remessa, complementar e ajuste. A emissão passa pela fila e a SEFAZ da UF da empresa autoriza; consulte o resultado pelo GET se o POST responder Pendente. Itens, pagamentos e tributos (ICMS, PIS, COFINS) seguem as mesmas regras da NFC-e.

Cadastro prévio Em Dados fiscais (Portal do Cliente): inscrição estadual, regime (CRT), endereço e série da NF-e. A numeração é reservada pela plataforma quando numero é omitido. Sem o cadastro, a API responde 400.

Objeto raiz

CampoTipoObrigatórioDescrição
itenslistasimDe 1 a 990 itens (codigo, descricao, ncm, cfop, unidade, quantidade, valorUnitario, desconto, cstIcms, aliquotaIcms…) — mesma tabela da NFC-e.
pagamentoslistasim*Formas de pagamento (forma + valor). *Dispensado em devolução, complementar, ajuste e quando todas as formas são "90" (sem pagamento).
destinatarioobjetosimCliente (ou, na entrada própria, a outra parte): cpfCnpj, nome, endereco completo (logradouro, número, bairro, município, codigoMunicipioIbge, UF, CEP), indicadorIe (1 contribuinte — exige inscricaoEstadual · 2 isento · 9 não contribuinte, padrão), e-mail e telefone.
numero · serieinteironãoOmitidos: a plataforma reserva o próximo número e usa a série cadastrada.
transporteobjetonãomodalidade (0 emitente · 1 destinatário · 2 terceiros · 3/4 próprio · 9 sem frete), valorFrete (rateado nos itens), transportadora, volume.
difalobjetonão*aliquotaInternaUfDestino e aliquotaFcpUfDestino. *Obrigatório em venda interestadual a não contribuinte para empresa do Regime Normal (CRT 3).
indicadorPresencainteironão1 presencial · 2 internet (padrão da venda) · 3 telefone · 5 fora do estabelecimento · 9 outros. Padrão 9 em devolução/retorno/entrada e 0 em complementar/ajuste.
intermediadorobjetonãoMarketplace: cnpj + identificadorLoja.
numeroPedido · informacoesAdicionais · naturezaOperacaostringnãoPedido (vai em xPed), texto livre e natureza da operação (padrão conforme a finalidade: VENDA, DEVOLUCAO DE VENDA…).
finalidadeinteironão1 normal (padrão) · 2 complementar · 3 ajuste · 4 devolução.
tipoOperacaointeironão1 saída (padrão) · 0 entrada de emissão própria (ex.: devolução de venda de cliente que não emite nota). Na entrada, o destinatario é a outra parte.
chavesReferenciadaslista de stringnão*Chaves de acesso (44 dígitos, dígito verificador conferido) da NF-e de origem, enviadas no grupo NFref. *Obrigatória em finalidades 2, 3 e 4; opcional (recomendada) em retorno de remessa.

Devolução, retorno de remessa, complementar e ajuste

CasotipoOperacaofinalidadeCFOPChave de origem
Devolução de venda (cliente devolveu, sem emitir nota)0 (entrada)41202 · 2202 (outro estado)obrigatória (a NF-e da venda)
Devolução de compra (devolve ao fornecedor)1 (saída)45202 · 6202obrigatória (a NF-e de compra)
Retorno de remessa — saída (conserto, demonstração)115916 · 6916 (conserto) · 5913opcional, recomendada
Retorno de remessa — entrada (mercadoria sua que voltou)011916 · 2916opcional, recomendada
NF-e complementar / de ajuste12 / 3conforme a nota originalobrigatória
  • O CFOP precisa combinar com o tipo de operação: entrada usa 1xxx/2xxx/3xxx; saída usa 5xxx/6xxx/7xxx. Incoerência é recusada na hora.
  • O CFOP acompanha o destino: 5xxx vira 6xxx (e 1xxx vira 2xxx) quando o destinatário é de outra UF.
  • Complementar, ajuste e devolução saem sem pagamento (forma 90, valor 0) — não é preciso enviar pagamentos.
  • Na entrada própria, PIS/COFINS usam o CST 98 (o 49 é só de saída) e não há DIFAL.
  • Limitações atuais: CST de ICMS suportados 00, 40, 41, 50 e 60 (CSOSN 102, 103, 300, 400, 500); devolução com ICMS-ST, redução de base ou IPI ainda não é montada; só chaves de NF-e entram em chavesReferenciadas.

Exemplo — devolução de venda (entrada própria)

{
  "tipo": "NFe",
  "payload": {
    "tipoOperacao": 0,
    "finalidade": 4,
    "chavesReferenciadas": ["35261011222333000181550030000000151234567815"],
    "destinatario": {
      "cpfCnpj": "39053344705", "nome": "Maria Compradora", "indicadorIe": 9,
      "endereco": { "logradouro": "Av. Paulista", "numero": "1000", "bairro": "Bela Vista",
                    "codigoMunicipioIbge": "3550308", "municipio": "São Paulo", "uf": "SP", "cep": "01310100" }
    },
    "itens": [ { "codigo": "CAM-AZ-M", "descricao": "Camiseta algodão azul M", "ncm": "61091000",
                 "cfop": "1202", "unidade": "UN", "quantidade": 1, "valorUnitario": 50.00, "cstIcms": "102" } ]
  }
}

Status possíveis

PendenteDocumento recebido, aguardando processamento na fila. Se ficar mais de 15 minutos assim (mensagem perdida), a plataforma o libera para reenvio manual.
ProcessandoEm processamento pelo worker (assinando, enviando ao governo).
AutorizadaDocumento autorizado. numeroProtocolo, xmlGerado, numero, chaveAcesso e, na NFS-e, alertas preenchidos.
RejeitadaRejeitado pelo governo/prefeitura. Veja motivoRejeicao para o erro exato retornado.
ErroTemporarioFalha temporária (ex.: erro interno do Ambiente Nacional — código E232 —, SEFAZ/webservice fora do ar ou falha de infraestrutura). A plataforma reprocessa sozinha: até 5 novas tentativas, após 1, 2, 5, 10 e 30 minutos — o motivoRejeicao informa "nova tentativa automática em X min (tentativa N de 5)". Continue consultando o documento pelo GET até ele sair desse status. Se as tentativas esgotarem, o motivo avisa e o documento pode ser reenviado manualmente.
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. Para "NFCe": cadastro Dados fiscais incompleto ou payload ilegível.
401 UnauthorizedCabeçalho X-Api-Key ausente, chave incorreta ou revogada.
404 Not Found(Só no GET) Documento inexistente ou pertencente a outra empresa.
422 Unprocessable Entity · 409 · 413 · 403Só nas rotas de cadastro de empresa e certificado: o corpo traz { "erro": "codigo", "mensagem": "…" } — veja os códigos nas respectivas seções.

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.