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.
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 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
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", "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. |
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 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. |
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. |
chaveAcesso | Só NFC-e. Chave de acesso de 44 dígitos (mesmo valor de numeroProtocolo). |
numero / serie | Só 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. |
linkDanfce | Só 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
| 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. Depois de autorizada, a resposta também traz:
| Campo | Descrição |
|---|---|
numero | Nú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. |
serie | Série (do RPS na NFS-e Municipal; da nota na NF-e/NFC-e). |
chaveAcesso | Chave de acesso: 44 dígitos na NF-e/NFC-e; chave da nota nacional na NFS-e (São Paulo devolve a ChaveNotaNacional). |
codigoVerificacao | Código de verificação da NFS-e, quando a prefeitura devolve (ex.: "P6DZLPF9"). |
alertas | Lista [{ "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 · linkDanfe | Links 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
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).
Baixar DANFCE (NFC-e)
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âmetro | Local | Descrição |
|---|---|---|
id | Path | O 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
/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" }'
| Campo | Obrig. | Descrição |
|---|---|---|
cnpj | sim | CNPJ da empresa, com ou sem máscara. Os dígitos verificadores são conferidos. |
razaoSocial | sim | Razão social. |
emailCliente | sim | E-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
| HTTP | erro | Quando |
|---|---|---|
| 401 | — | Header X-Parceiro-Token ausente, inválido, revogado, ou parceiro desativado. |
| 403 | parceiro_invalido · parceiro_suspenso | A empresa dona do token não é (mais) parceiro de negócio, ou está suspensa. |
| 422 | cnpj_invalido · razao_social_obrigatoria | Dados da empresa inválidos. |
| 422 | email_cliente_obrigatorio · email_cliente_invalido | E-mail não informado ou malformado. |
| 404 | cliente_nao_encontrado | Nenhum cliente do Portal com esse e-mail — a empresa não é criada. |
| 409 | cliente_inativo | Cliente desativado. |
| 409 | parceiro_sem_responsavel_financeiro | O parceiro ainda não tem responsável financeiro definido pela MaxERP. |
| 409 | limite_de_empresas_atingido | O parceiro atingiu o limite de empresas combinado. |
Listar e consultar as empresas do parceiro
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
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
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
| HTTP | erro | Quando |
|---|---|---|
| 404 | empresa_nao_encontrada | empresaId inexistente ou de outro parceiro. |
| 422 | arquivo_obrigatorio · senha_obrigatoria · base64_invalido | Corpo incompleto. |
| 422 | certificado_ilegivel | Senha incorreta ou arquivo que não é um .pfx. |
| 422 | certificado_vencido · certificado_sem_chave_privada | Certificado inutilizável. |
| 409 | certificado_de_outro_cnpj | O CNPJ do certificado não é o da empresa. |
| 413 | arquivo_grande_demais | Mais de 5 MB. |
Consultar e listar notas (NFS-e)
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:
400comcode: "referencia_invalida". - A referência volta em todas as consultas (
referenciaExterna).
Recuperar uma nota pela referência
Devolve a nota (ou items: []) sem depender do id, para recuperar o resultado quando a resposta da emissão se perdeu (timeout).
Listagem paginada
| Parâmetro | Descrição |
|---|---|
dataEmissaoDe, dataEmissaoAte | AAAA-MM-DD, inclusive, no horário de Brasília. |
status | Pendente, Processando, Autorizada, Rejeitada, Cancelada (também CancelamentoPendente, Falha, ErroTemporario). |
tipo | NfseNacional ou NfseMunicipal. Sem o filtro, vêm as duas. |
cpfCnpjTomador | Com ou sem máscara. |
referenciaExterna | Referência informada na emissão. |
numeroDps | Número da DPS (Nacional) ou do RPS (Municipal). |
atualizadoDesde | Data/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, pageSize | Padrã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
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
| Campo | Descrição |
|---|---|
id, tipo, status | Identificação e situação. status: Pendente, Autorizada, Rejeitada, Cancelada… |
motivo | Mensagem de rejeição/erro, quando houver (motivoRejeicao continua disponível). |
numeroNota, numeroDps, serieDps, codigoVerificacao, chaveAcesso | Numeração e chaves. numeroNota só existe depois da autorização. |
dataEmissao, dataAutorizacao, dataCancelamento, atualizadoEm | ISO 8601 em UTC. dataCancelamento é null se não cancelada. |
valorServicos, valorIss, aliquota, valorLiquido | Valores da nota (da autorização; antes dela, calculados do que foi enviado). |
tomador | cpfCnpj, razaoSocial, email. |
servico | codigoItemListaServico, discriminacao. |
referenciaExterna | Referência do ERP. |
links.pdf | DANFSe em PDF — link público (abre sem X-Api-Key). |
links.xml | XML autorizado — link público (abre sem X-Api-Key): GET /v1/documentos-fiscais/{id}/xml. |
Cancelar uma nota
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": "..." }:
| HTTP | code | Quando |
|---|---|---|
| 400 | parametro_invalido | Filtro ou paginação inválidos (a mensagem diz qual). |
| 400 | referencia_invalida | referenciaExterna com mais de 40 caracteres. |
| 401 | nao_autorizado | X-Api-Key ausente ou inválida. |
| 404 | documento_nao_encontrado | Documento inexistente ou de outra empresa. |
| 422 | motivo_obrigatorio · motivo_invalido · cancelamento_indisponivel | Cancelamento sem motivo, motivo curto demais, ou nota que não está autorizada. |
Consumo (bilhetagem)
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âmetro | Obrig. | Descrição |
|---|---|---|
dataDe, dataAte | sim | AAAA-MM-DD, intervalo inclusivo, no fuso America/Sao_Paulo. Período máximo de 366 dias. |
tipo | não | NfseNacional, NfseMunicipal, NFe ou NFCe. Vazio = todos os tipos (um item por emitente e tipo). |
cnpjEmitente | não | 14 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).
totalconta 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 emtotal— para faturar, usetotal; somecanceladasse quiser o bruto.- Emitentes da conta: a empresa dona da
X-Api-Keye, se ela é parceiro de negócio, todas as empresas que ela cadastrou. Todos aparecem em uma só chamada, inclusive os sem movimento: comtipoinformado vêm comtotal: 0; semtipovêm comtipo: nulletotal: 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": "..." }:
| HTTP | code | Quando |
|---|---|---|
| 400 | parametro_obrigatorio | dataDe ou dataAte ausente. |
| 400 | parametro_invalido | Data fora do formato AAAA-MM-DD, tipo desconhecido ou cnpjEmitente sem 14 dígitos. |
| 401 | nao_autorizado | X-Api-Key (ou X-Admin-Key) ausente, inválida ou revogada. |
| 422 | periodo_invalido · periodo_muito_longo | dataAte anterior a dataDe, ou período com mais de 366 dias. |
| 422 | emitente_nao_encontrado | O cnpjEmitente não é um emitente desta conta. |
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
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.
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. 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
| 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. |
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:
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
tipoTributacao | string | não | Tributavel (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. |
issRetido | bool | não | ISS retido pelo tomador. Padrão false. Não pode ser true com intermediario informado (regra da prefeitura, erro 1419). |
valorDeducoes | decimal | não | Deduçõ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 · valorIr | decimal | não | Retençõ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. |
exigibilidadeSuspensa | bool | não | Layout 2: emissão com exigibilidade suspensa. Padrão false. |
intermediario | objeto | nã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).
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
itemListaServicotem 5 dígitos (ex.:"08117") — diferente do código de 6 dígitos da NFS-e Nacional. - Campos obrigatórios:
numeroRps,serieRpseservico.itemListaServico. Um corpo com os nomes do padrão Nacional (numeroDps,codigoItemListaServico…) enviado comoNfseMunicipalé 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
alertasda 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:
| Arquivo | Para quem |
|---|---|
nfse-sp-simples-nacional.json | Empresa do Simples Nacional em São Paulo (Layout 1). |
nfse-sp-regime-normal-ibscbs.json | Lucro presumido/real em São Paulo, com IBS/CBS (Layout 2). |
nfse-sp-com-retencoes.json | Tomador pessoa jurídica, ISS retido, deduções e retenções federais. |
nfse-sp-tomador-nao-identificado.json | Consumidor sem CPF/CNPJ. |
nfse-nacional-completo.json | NFS-e Nacional com IBS/CBS. |
nfse-nacional-sjc-evento.json | NFS-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"
}
}
}
}
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.
Cadastro prévio (Dados fiscais)
| Campo | Descrição |
|---|---|
| Inscrição estadual | IE 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ço | Endereço do estabelecimento emitente. O botão "Buscar endereço na Receita" preenche a partir do CNPJ. |
| Série | Sé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
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
itens | lista | sim | De 1 a 990 itens — ver tabela abaixo. |
pagamentos | lista | sim | Ao 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. |
numero | inteiro | não | Nú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. |
serie | inteiro | não | Série da NFC-e (1 a 889). Padrão: a série cadastrada em Dados fiscais. |
consumidor | objeto | não | CPF/CNPJ do consumidor, se ele pediu na nota. Sem este objeto a nota sai como consumidor não identificado. |
informacoesAdicionais | string | não | Texto livre impresso no rodapé do cupom (ex.: "Obrigado pela preferência!"). |
naturezaOperacao | string | não | Padrão "VENDA". |
consumidor
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
cpfCnpj | string | não | 11 (CPF) ou 14 (CNPJ) dígitos; pontuação é ignorada. |
nome | string | não | Nome do consumidor (só é enviado quando há cpfCnpj). |
itens[]
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
codigo | string | sim | Código do produto no seu sistema. |
descricao | string | sim | Descrição do produto. |
ncm | string | sim | NCM com 8 dígitos. |
cfop | string | sim | CFOP com 4 dígitos (ex.: "5102" venda dentro do estado). |
unidade | string | sim | Unidade comercial (UN, KG, CX…). |
quantidade | decimal | sim | Maior que zero (aceita casas decimais, ex.: 0.750). |
valorUnitario | decimal | sim | Maior que zero. O valor do item é quantidade × valorUnitario, arredondado a 2 casas. |
desconto | decimal | não | Desconto em R$ no item (menor que o valor do item). |
codigoBarras | string | não | GTIN/EAN. Omitido = "SEM GTIN". |
cest | string | não | CEST, quando o produto exigir. |
origem | inteiro | não | Origem da mercadoria (0 a 8). Padrão 0 (nacional). |
cstIcms | string | nã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. |
aliquotaIcms | decimal | condicional | Percentual de ICMS (ex.: 18). Obrigatório com CST 00. A base é o valor do item já com desconto. |
cstPis / cstCofins | string | não | Padrã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 / aliquotaCofins | decimal | condicional | Percentual; obrigatório quando o CST for 01 ou 02. |
pagamentos[]
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
forma | string | sim | Có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. |
valor | decimal | sim | Valor pago nesta forma. |
descricao | string | não | Descriçã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 motivoRejeicao | O 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 nota | Os pagamentos precisam cobrir o total; o excedente vira troco. |
| CSOSN/CST … ainda não suportado | Use um dos códigos listados na tabela de itens. |
| NNN - mensagem da SEFAZ | Rejeição devolvida pela própria SEFAZ (código + motivo). Consulte a tabela de rejeições da sua UF. |
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.
numero é omitido. Sem o cadastro, a API responde 400.
Objeto raiz
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
itens | lista | sim | De 1 a 990 itens (codigo, descricao, ncm, cfop, unidade, quantidade, valorUnitario, desconto, cstIcms, aliquotaIcms…) — mesma tabela da NFC-e. |
pagamentos | lista | sim* | Formas de pagamento (forma + valor). *Dispensado em devolução, complementar, ajuste e quando todas as formas são "90" (sem pagamento). |
destinatario | objeto | sim | Cliente (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 · serie | inteiro | não | Omitidos: a plataforma reserva o próximo número e usa a série cadastrada. |
transporte | objeto | não | modalidade (0 emitente · 1 destinatário · 2 terceiros · 3/4 próprio · 9 sem frete), valorFrete (rateado nos itens), transportadora, volume. |
difal | objeto | não* | aliquotaInternaUfDestino e aliquotaFcpUfDestino. *Obrigatório em venda interestadual a não contribuinte para empresa do Regime Normal (CRT 3). |
indicadorPresenca | inteiro | não | 1 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. |
intermediador | objeto | não | Marketplace: cnpj + identificadorLoja. |
numeroPedido · informacoesAdicionais · naturezaOperacao | string | não | Pedido (vai em xPed), texto livre e natureza da operação (padrão conforme a finalidade: VENDA, DEVOLUCAO DE VENDA…). |
finalidade | inteiro | não | 1 normal (padrão) · 2 complementar · 3 ajuste · 4 devolução. |
tipoOperacao | inteiro | não | 1 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. |
chavesReferenciadas | lista de string | nã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
| Caso | tipoOperacao | finalidade | CFOP | Chave de origem |
|---|---|---|---|---|
| Devolução de venda (cliente devolveu, sem emitir nota) | 0 (entrada) | 4 | 1202 · 2202 (outro estado) | obrigatória (a NF-e da venda) |
| Devolução de compra (devolve ao fornecedor) | 1 (saída) | 4 | 5202 · 6202 | obrigatória (a NF-e de compra) |
| Retorno de remessa — saída (conserto, demonstração) | 1 | 1 | 5916 · 6916 (conserto) · 5913 | opcional, recomendada |
| Retorno de remessa — entrada (mercadoria sua que voltou) | 0 | 1 | 1916 · 2916 | opcional, recomendada |
| NF-e complementar / de ajuste | 1 | 2 / 3 | conforme a nota original | obrigató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:
5xxxvira6xxx(e1xxxvira2xxx) 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
numeroProtocolo, xmlGerado, numero, chaveAcesso e, na NFS-e, alertas preenchidos.motivoRejeicao para o erro exato retornado.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.motivoRejeicao.Referência de erros HTTP
| Código | Quando ocorre |
|---|---|
400 Bad Request | tipo inválido ou payload ausente/nulo. Para "NFCe": cadastro Dados fiscais incompleto ou payload ilegível. |
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. |
422 Unprocessable Entity · 409 · 413 · 403 | Só 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
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.