{
  "info": {
    "name": "API NFS-e Nacional",
    "description": "[SANDBOX NFS-e — ambiente de homologação. tpAmb=2, não transmite ao ADN, sem valor fiscal.]\n\nColeção Postman para integração com a API NFS-e Nacional conforme padrão ABRASF/SEFIN.\n\nEsta coleção contém todos os endpoints disponíveis para emissão, consulta e gerenciamento de Notas Fiscais de Serviço Eletrônicas.",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json",
    "_exporter_id": "nfse-api"
  },
  "variable": [
    {
      "key": "base_url",
      "value": "https://tributario.speedgov.com.br",
      "type": "string",
      "description": "URL base da API"
    },
    {
      "key": "tenant",
      "value": "ibicuitinga",
      "type": "string",
      "description": "Slug do município (tenant). Exemplos: ibicuitinga, davinopolis"
    },
    {
      "key": "chave_acesso",
      "value": "",
      "type": "string",
      "description": "Chave de acesso (50 dígitos) da NFS-e alvo dos eventos. Vai no path da URL."
    }
  ],
  "item": [
    {
      "name": "Emissao",
      "item": [
        {
          "name": "Emitir NFS-e",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/xml",
                "description": "O corpo da requisição deve ser um XML DPS válido"
              },
              {
                "key": "Accept",
                "value": "application/json",
                "description": "A resposta será em formato JSON"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "\u003c?xml version=\"1.0\" encoding=\"UTF-8\"?\u003e\n\u003cDPS versao=\"1.01\" xmlns=\"http://www.sped.fazenda.gov.br/nfse\"\u003e\n      \u003cinfDPS Id=\"DPS230533221122233300018180000177920370165622\"\u003e\n        \u003ctpAmb\u003e2\u003c/tpAmb\u003e\n        \n        \u003cverAplic\u003e1.01\u003c/verAplic\u003e\n        \u003cserie\u003e80000\u003c/serie\u003e\n        \u003cnDPS\u003e177920370165622\u003c/nDPS\u003e\n        \u003cdCompet\u003e2026-05-19\u003c/dCompet\u003e\n        \u003ctpEmit\u003e1\u003c/tpEmit\u003e\n        \u003ccLocEmi\u003e2301000\u003c/cLocEmi\u003e\n        \u003cprest\u003e\n          \u003cCNPJ\u003e11222333000181\u003c/CNPJ\u003e\n          \u003cIM\u003e123456\u003c/IM\u003e\n          \u003cxNome\u003ePrestador Teste LTDA\u003c/xNome\u003e\n          \u003cfone\u003e11999999999\u003c/fone\u003e\n          \u003cemail\u003eprestador@teste.com\u003c/email\u003e\n          \u003cregTrib\u003e\n            \u003copSimpNac\u003e1\u003c/opSimpNac\u003e\n            \u003cregEspTrib\u003e0\u003c/regEspTrib\u003e\n          \u003c/regTrib\u003e\n        \u003c/prest\u003e\n        \u003ctoma\u003e\n          \u003cCNPJ\u003e12345678000195\u003c/CNPJ\u003e\n          \u003cxNome\u003eTomador Teste\u003c/xNome\u003e\n          \u003cend\u003e\n            \u003cendNac\u003e\n              \u003ccMun\u003e2301000\u003c/cMun\u003e\n              \u003cCEP\u003e12345678\u003c/CEP\u003e\n            \u003c/endNac\u003e\n            \u003cxLgr\u003eRua Teste\u003c/xLgr\u003e\n            \u003cnro\u003e100\u003c/nro\u003e\n            \u003cxBairro\u003eCentro\u003c/xBairro\u003e\n          \u003c/end\u003e\n          \u003cfone\u003e11888888888\u003c/fone\u003e\n          \u003cemail\u003etomador@teste.com\u003c/email\u003e\n        \u003c/toma\u003e\n        \u003cserv\u003e\n          \u003clocPrest\u003e\n            \u003ccLocPrestacao\u003e2301000\u003c/cLocPrestacao\u003e\n          \u003c/locPrest\u003e\n          \u003ccServ\u003e\n            \u003ccTribNac\u003e010101\u003c/cTribNac\u003e\n            \u003ccTribMun\u003e11130100\u003c/cTribMun\u003e\n            \u003cxDescServ\u003eServiço de teste para homologação do sistema de NFS-e\u003c/xDescServ\u003e\n            \u003ccNBS\u003e101011100\u003c/cNBS\u003e\n          \u003c/cServ\u003e\n        \u003c/serv\u003e\n        \u003cvalores\u003e\n          \u003cvServPrest\u003e\n            \u003cvServ\u003e1000.00\u003c/vServ\u003e\n          \u003c/vServPrest\u003e\n          \u003ctrib\u003e\n            \u003ctribMun\u003e\n              \u003ctribISSQN\u003e1\u003c/tribISSQN\u003e\n              \u003ctpRetISSQN\u003e1\u003c/tpRetISSQN\u003e\n              \u003cpAliq\u003e5.00\u003c/pAliq\u003e\n            \u003c/tribMun\u003e\n            \u003ctotTrib\u003e\n              \u003cindTotTrib\u003e0\u003c/indTotTrib\u003e\n            \u003c/totTrib\u003e\n          \u003c/trib\u003e\n        \u003c/valores\u003e\n      \u003c/infDPS\u003e\n    \u003c/DPS\u003e\n",
              "options": {
                "raw": {
                  "language": "xml"
                }
              }
            },
            "url": {
              "raw": "{{base_url}}/{{tenant}}/api/v1/nfse",
              "host": ["{{base_url}}"],
              "path": ["{{tenant}}", "api", "v1", "nfse"]
            },
            "description": "Emite uma nova Nota Fiscal de Serviço Eletrônica a partir de uma DPS (Declaração de Prestação de Serviços).\n\n## Assinatura Digital (OBRIGATÓRIA)\n\nO XML da DPS **deve estar assinado digitalmente** com certificado e-CNPJ ICP-Brasil do prestador.\n\n**Requisitos da Assinatura:**\n- Algoritmo: RSA-SHA256\n- Canonicalização: Exclusive XML Canonicalization (xml-exc-c14n)\n- Elemento assinado: `infDPS` (referenciado pelo atributo `Id`)\n- O CNPJ do certificado deve corresponder ao CNPJ do prestador no XML\n\n**Códigos de Erro de Assinatura:**\n| Código | Mensagem | Solução |\n|--------|----------|--------|\n| E901 | XML não está assinado | Assinar XML com certificado e-CNPJ |\n| E902 | Assinatura inválida | Verificar algoritmo e certificado |\n| E903 | Certificado expirado | Renovar certificado digital |\n| E904 | Certificado inválido | Usar certificado ICP-Brasil válido |\n| E905 | Certificado não encontrado | Incluir X509Certificate na assinatura |\n| E906 | CNPJ divergente | Usar certificado do próprio prestador |\n\n## Campos Importantes\n- `tpAmb`: Tipo de ambiente (1=Produção, 2=Homologação)\n- `dCompet`: Data de competência do serviço\n- `CNPJ`: CNPJ do prestador (deve estar cadastrado)\n- `vServ`: Valor total do serviço\n- `vISSQN`: Valor do ISS calculado\n\n**Importante:** A data/hora de emissão (`dhEmi`) é gerada automaticamente pelo sistema. NÃO envie este campo no XML."
          },
          "response": [
            {
              "name": "Sucesso - NFS-e Emitida",
              "originalRequest": {
                "method": "POST",
                "url": {
                  "raw": "{{base_url}}/{{tenant}}/api/v1/nfse",
                  "host": ["{{base_url}}"],
                  "path": ["api", "v1", "nfse"]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "body": "{\n  \"status\": \"OK\",\n  \"numero_protocolo\": \"20251111120000000001\",\n  \"chave_acesso\": \"23044002300600973590300001000000000000011264046313\",\n  \"numero_nfse\": \"1\",\n  \"data_emissao\": \"2025-11-11T12:00:00-03:00\",\n  \"xml_nfse\": \"<?xml version=\\\"1.0\\\"?>...\"\n}"
            },
            {
              "name": "Erro - Estabelecimento não encontrado",
              "originalRequest": {
                "method": "POST",
                "url": {
                  "raw": "{{base_url}}/{{tenant}}/api/v1/nfse",
                  "host": ["{{base_url}}"],
                  "path": ["{{tenant}}", "api", "v1", "nfse"]
                }
              },
              "status": "Unprocessable Entity",
              "code": 422,
              "_postman_previewlanguage": "json",
              "body": "{\n  \"codigo_erro\": \"E101\",\n  \"mensagem\": \"Estabelecimento não encontrado\",\n  \"detalhes\": \"O CNPJ não está cadastrado\",\n  \"timestamp\": \"2025-11-11T12:00:00-03:00\"\n}"
            },
            {
              "name": "Erro - XML não assinado (E901)",
              "originalRequest": {
                "method": "POST",
                "url": {
                  "raw": "{{base_url}}/{{tenant}}/api/v1/nfse",
                  "host": ["{{base_url}}"],
                  "path": ["{{tenant}}", "api", "v1", "nfse"]
                }
              },
              "status": "Unprocessable Entity",
              "code": 422,
              "_postman_previewlanguage": "json",
              "body": "{\n  \"codigo_erro\": \"E901\",\n  \"mensagem\": \"XML não está assinado digitalmente\",\n  \"detalhes\": \"O XML da DPS deve ser assinado com certificado e-CNPJ do prestador\",\n  \"timestamp\": \"2025-11-11T12:00:00-03:00\"\n}"
            },
            {
              "name": "Erro - Assinatura inválida (E902)",
              "originalRequest": {
                "method": "POST",
                "url": {
                  "raw": "{{base_url}}/{{tenant}}/api/v1/nfse",
                  "host": ["{{base_url}}"],
                  "path": ["{{tenant}}", "api", "v1", "nfse"]
                }
              },
              "status": "Unprocessable Entity",
              "code": 422,
              "_postman_previewlanguage": "json",
              "body": "{\n  \"codigo_erro\": \"E902\",\n  \"mensagem\": \"Assinatura digital inválida\",\n  \"detalhes\": \"A assinatura digital não corresponde ao conteúdo do XML\",\n  \"timestamp\": \"2025-11-11T12:00:00-03:00\"\n}"
            },
            {
              "name": "Erro - Certificado expirado (E903)",
              "originalRequest": {
                "method": "POST",
                "url": {
                  "raw": "{{base_url}}/{{tenant}}/api/v1/nfse",
                  "host": ["{{base_url}}"],
                  "path": ["{{tenant}}", "api", "v1", "nfse"]
                }
              },
              "status": "Unprocessable Entity",
              "code": 422,
              "_postman_previewlanguage": "json",
              "body": "{\n  \"codigo_erro\": \"E903\",\n  \"mensagem\": \"Certificado digital expirado\",\n  \"detalhes\": \"Certificado expirado em 15/01/2025\",\n  \"timestamp\": \"2025-11-11T12:00:00-03:00\"\n}"
            },
            {
              "name": "Erro - CNPJ certificado divergente (E906)",
              "originalRequest": {
                "method": "POST",
                "url": {
                  "raw": "{{base_url}}/{{tenant}}/api/v1/nfse",
                  "host": ["{{base_url}}"],
                  "path": ["{{tenant}}", "api", "v1", "nfse"]
                }
              },
              "status": "Unprocessable Entity",
              "code": 422,
              "_postman_previewlanguage": "json",
              "body": "{\n  \"codigo_erro\": \"E906\",\n  \"mensagem\": \"CNPJ do certificado diverge do prestador informado\",\n  \"detalhes\": \"CNPJ do certificado (98765432000100) não corresponde ao prestador (12345678000195)\",\n  \"timestamp\": \"2025-11-11T12:00:00-03:00\"\n}"
            }
          ]
        }
      ],
      "description": "Endpoints para emissão de NFS-e"
    },
    {
      "name": "Consulta",
      "item": [
        {
          "name": "Consultar NFS-e",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json",
                "description": "A resposta será em formato JSON"
              }
            ],
            "url": {
              "raw": "{{base_url}}/{{tenant}}/api/v1/nfse/:chave_acesso",
              "host": ["{{base_url}}"],
              "path": ["{{tenant}}", "api", "v1", "nfse", ":chave_acesso"],
              "variable": [
                {
                  "key": "chave_acesso",
                  "value": "23044002300600973590300001000000000000011264046313",
                  "description": "Chave de acesso da NFS-e (50 caracteres)"
                }
              ]
            },
            "description": "Consulta uma NFS-e emitida pela chave de acesso.\n\nA chave de acesso possui 50 caracteres e é retornada no momento da emissão da nota."
          },
          "response": [
            {
              "name": "Sucesso - Nota encontrada",
              "originalRequest": {
                "method": "GET",
                "url": {
                  "raw": "{{base_url}}/{{tenant}}/api/v1/nfse/:chave_acesso",
                  "host": ["{{base_url}}"],
                  "path": ["api", "v1", "nfse", ":chave_acesso"]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "body": "{\n  \"status\": \"OK\",\n  \"nota\": {\n    \"chave_acesso\": \"23044002300600973590300001000000000000011264046313\",\n    \"numero\": \"1\",\n    \"status\": \"autorizada\",\n    \"data_emissao\": \"2025-11-11T12:00:00-03:00\",\n    \"prestador\": {\n      \"documento\": \"12345678000195\",\n      \"nome\": \"Empresa Prestadora LTDA\",\n      \"inscricao_municipal\": \"12345\"\n    },\n    \"tomador\": {\n      \"documento\": \"12345678901\",\n      \"nome\": \"João da Silva\"\n    },\n    \"valores\": {\n      \"valor_servico\": 1000.00,\n      \"valor_issqn\": 50.00,\n      \"aliquota\": 5.00\n    }\n  }\n}"
            },
            {
              "name": "Erro - Nota não encontrada",
              "originalRequest": {
                "method": "GET",
                "url": {
                  "raw": "{{base_url}}/{{tenant}}/api/v1/nfse/:chave_acesso",
                  "host": ["{{base_url}}"],
                  "path": ["api", "v1", "nfse", ":chave_acesso"]
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "body": "{\n  \"codigo_erro\": \"E301\",\n  \"mensagem\": \"Nota fiscal não encontrada\",\n  \"detalhes\": \"Verifique se a chave de acesso está correta\",\n  \"timestamp\": \"2025-11-11T12:00:00-03:00\"\n}"
            }
          ]
        }
      ],
      "description": "Endpoints para consulta de NFS-e"
    },
    {
      "name": "DANFSE",
      "item": [
        {
          "name": "Download DANFSE (PDF) [DEPRECIADO]",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/pdf",
                "description": "A resposta será um arquivo PDF"
              }
            ],
            "url": {
              "raw": "{{base_url}}/{{tenant}}/api/v1/danfse/:chave_acesso",
              "host": ["{{base_url}}"],
              "path": ["{{tenant}}", "api", "v1", "danfse", ":chave_acesso"],
              "variable": [
                {
                  "key": "chave_acesso",
                  "value": "23044002300600973590300001000000000000011264046313",
                  "description": "Chave de acesso da NFS-e (50 caracteres)"
                }
              ]
            },
            "description": "**DEPRECIADO** — este endpoint será removido futuramente. Após a autorização no ADN, consulte o DANFSe oficial pela chave de acesso no portal nacional: https://www.nfse.gov.br/ConsultaPublica. O XML da NFS-e fica disponível no endpoint de consulta da nota (GET /api/v1/nfse/:chave_acesso ou por protocolo), permitindo montar a própria representação gráfica.\n\nRetorna o PDF da Nota Fiscal de Serviço Eletrônica (Documento Auxiliar da NFS-e - DANFSE).\n\n**Dica:** No Postman, clique em \"Save Response\" > \"Save to a file\" para salvar o PDF."
          },
          "response": [
            {
              "name": "Sucesso - PDF gerado",
              "originalRequest": {
                "method": "GET",
                "url": {
                  "raw": "{{base_url}}/{{tenant}}/api/v1/danfse/:chave_acesso",
                  "host": ["{{base_url}}"],
                  "path": ["api", "v1", "danfse", ":chave_acesso"]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "text",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/pdf"
                },
                {
                  "key": "Content-Disposition",
                  "value": "attachment; filename=\"danfse.pdf\""
                }
              ],
              "body": "[Binary PDF content]"
            }
          ]
        }
      ],
      "description": "[DEPRECIADO] Endpoints para download do DANFSE (PDF da NFS-e). Será removido futuramente — consulte o DANFSe pela chave de acesso no portal nacional: https://www.nfse.gov.br/ConsultaPublica"
    },
    {
      "name": "Eventos",
      "item": [
        {
          "name": "Cancelamento (101101)",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json",
                "description": "O corpo da requisição deve ser um JSON"
              },
              {
                "key": "Accept",
                "value": "application/json",
                "description": "A resposta será em formato JSON"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"tipo_evento\": \"cancelamento\",\n  \"codigo_motivo_cancelamento\": \"erro_na_emissao\",\n  \"descricao_motivo_cancelamento\": \"Cancelamento solicitado pelo prestador - erro nos dados do serviço\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{base_url}}/{{tenant}}/api/v1/nfse/{{chave_acesso}}/eventos",
              "host": ["{{base_url}}"],
              "path": ["{{tenant}}", "api", "v1", "nfse", "{{chave_acesso}}", "eventos"]
            },
            "description": "Registra um evento de cancelamento simples na NFS-e.\n\n**Código do Evento:** 101101\n\n**Quando usar:**\n- Quando a NFS-e foi emitida com dados incorretos\n- Quando o serviço não foi prestado\n- Quando houve duplicidade de emissão\n\n**Requisitos:**\n- A nota deve estar autorizada\n- A nota não pode ter sido cancelada anteriormente\n- O cancelamento deve respeitar o prazo regulamentar\n\n**Atenção:** Eventos são irreversíveis."
          },
          "response": [
            {
              "name": "Sucesso - Cancelamento registrado",
              "originalRequest": {
                "method": "POST",
                "url": {
                  "raw": "{{base_url}}/{{tenant}}/api/v1/nfse/{{chave_acesso}}/eventos",
                  "host": ["{{base_url}}"],
                  "path": ["api", "v1", "nfse", "{{chave_acesso}}", "eventos"]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "body": "{\n  \"status\": \"OK\",\n  \"numero_protocolo\": \"20251111120000000002\",\n  \"tipo_evento\": \"cancelamento\",\n  \"codigo_evento\": \"101101\",\n  \"data_evento\": \"2025-11-11T12:30:00-03:00\",\n  \"mensagem\": \"Evento de cancelamento registrado com sucesso\"\n}"
            },
            {
              "name": "Erro - Nota já cancelada",
              "originalRequest": {
                "method": "POST",
                "url": {
                  "raw": "{{base_url}}/{{tenant}}/api/v1/nfse/{{chave_acesso}}/eventos",
                  "host": ["{{base_url}}"],
                  "path": ["api", "v1", "nfse", "{{chave_acesso}}", "eventos"]
                }
              },
              "status": "Unprocessable Entity",
              "code": 422,
              "_postman_previewlanguage": "json",
              "body": "{\n  \"codigo_erro\": \"E302\",\n  \"mensagem\": \"Nota já cancelada\",\n  \"detalhes\": \"Não é possível operar sobre uma nota cancelada\",\n  \"timestamp\": \"2025-11-11T12:30:00-03:00\"\n}"
            }
          ]
        },
        {
          "name": "Cancelamento por Substituição (105102)",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json",
                "description": "O corpo da requisição deve ser um JSON"
              },
              {
                "key": "Accept",
                "value": "application/json",
                "description": "A resposta será em formato JSON"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"tipo_evento\": \"cancelamento_por_substituicao\",\n  \"codigo_justificativa_cancelamento_substituicao\": \"rejeicao_tomador_ou_intermediario\",\n  \"descricao_justificativa_cancelamento_substituicao\": \"Substituição por nota com valores corrigidos\",\n  \"chave_substituta\": \"35503081234567800019500010000000020000000002\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{base_url}}/{{tenant}}/api/v1/nfse/{{chave_acesso}}/eventos",
              "host": ["{{base_url}}"],
              "path": ["{{tenant}}", "api", "v1", "nfse", "{{chave_acesso}}", "eventos"]
            },
            "description": "Registra um evento de cancelamento por substituição na NFS-e.\n\n**Código do Evento:** 105102\n\n**Quando usar:**\n- Quando a nota original precisa ser corrigida e uma nova nota já foi emitida\n- Quando há necessidade de vincular a nota cancelada à nota substituta\n\n**Campos obrigatórios (no corpo JSON):**\n- `tipo_evento`: cancelamento_por_substituicao\n- `codigo_justificativa_cancelamento_substituicao`: enum (consulte GET /api/v1/catalogo/motivos_evento)\n- `descricao_justificativa_cancelamento_substituicao`: justificativa\n- `chave_substituta`: chave da nova nota substituta\n\n**A chave da nota cancelada vai no PATH da URL** (/nfse/:chave_acesso/eventos), não no corpo.\n\n**Requisitos:**\n- A nota substituta deve existir e estar autorizada\n- Ambas as notas devem ser do mesmo prestador\n\n**Atenção:** Eventos são irreversíveis."
          },
          "response": [
            {
              "name": "Sucesso - Substituição registrada",
              "originalRequest": {
                "method": "POST",
                "url": {
                  "raw": "{{base_url}}/{{tenant}}/api/v1/nfse/{{chave_acesso}}/eventos",
                  "host": ["{{base_url}}"],
                  "path": ["api", "v1", "nfse", "{{chave_acesso}}", "eventos"]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "body": "{\n  \"status\": \"OK\",\n  \"numero_protocolo\": \"20251111120000000003\",\n  \"tipo_evento\": \"cancelamento_por_substituicao\",\n  \"codigo_evento\": \"105102\",\n  \"data_evento\": \"2025-11-11T12:35:00-03:00\",\n  \"chave_acesso_substituta\": \"35503081234567800019500010000000020000000002\",\n  \"mensagem\": \"Evento de cancelamento por substituição registrado com sucesso\"\n}"
            },
            {
              "name": "Erro - Nota substituta não encontrada",
              "originalRequest": {
                "method": "POST",
                "url": {
                  "raw": "{{base_url}}/{{tenant}}/api/v1/nfse/{{chave_acesso}}/eventos",
                  "host": ["{{base_url}}"],
                  "path": ["api", "v1", "nfse", "{{chave_acesso}}", "eventos"]
                }
              },
              "status": "Unprocessable Entity",
              "code": 422,
              "_postman_previewlanguage": "json",
              "body": "{\n  \"codigo_erro\": \"E304\",\n  \"mensagem\": \"Nota substituta não encontrada\",\n  \"detalhes\": \"A chave de acesso da nota substituta é inválida ou não existe\",\n  \"timestamp\": \"2025-11-11T12:35:00-03:00\"\n}"
            }
          ]
        },
        {
          "name": "Solicitação Análise Fiscal (101103)",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json",
                "description": "O corpo da requisição deve ser um JSON"
              },
              {
                "key": "Accept",
                "value": "application/json",
                "description": "A resposta será em formato JSON"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"tipo_evento\": \"solicitacao_analise_fiscal_para_cancelamento\",\n  \"codigo_motivo_cancelamento\": \"erro_na_emissao\",\n  \"descricao_motivo_cancelamento\": \"Solicito análise fiscal para cancelamento - nota emitida em duplicidade\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{base_url}}/{{tenant}}/api/v1/nfse/{{chave_acesso}}/eventos",
              "host": ["{{base_url}}"],
              "path": ["{{tenant}}", "api", "v1", "nfse", "{{chave_acesso}}", "eventos"]
            },
            "description": "Registra uma solicitação de análise fiscal para cancelamento de NFS-e.\n\n**Código do Evento:** 101103\n\n**Quando usar:**\n- Quando o prazo para cancelamento direto já expirou\n- Quando o cancelamento requer aprovação da fiscalização\n- Quando há situações especiais que necessitam análise\n\n**Campos obrigatórios (no corpo JSON):**\n- `tipo_evento`: solicitacao_analise_fiscal_para_cancelamento\n- `codigo_motivo_cancelamento`: enum (erro_na_emissao, servico_nao_prestado, outros)\n- `descricao_motivo_cancelamento`: justificativa detalhada\n\n**A chave da nota vai no PATH da URL** (/nfse/:chave_acesso/eventos), não no corpo.\n\n**Observação:** Este evento não cancela a nota automaticamente. A fiscalização analisará o pedido e poderá aprovar ou rejeitar."
          },
          "response": [
            {
              "name": "Sucesso - Solicitação registrada",
              "originalRequest": {
                "method": "POST",
                "url": {
                  "raw": "{{base_url}}/{{tenant}}/api/v1/nfse/{{chave_acesso}}/eventos",
                  "host": ["{{base_url}}"],
                  "path": ["api", "v1", "nfse", "{{chave_acesso}}", "eventos"]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "body": "{\n  \"status\": \"OK\",\n  \"numero_protocolo\": \"20251111120000000004\",\n  \"tipo_evento\": \"solicitacao_analise_fiscal_para_cancelamento\",\n  \"codigo_evento\": \"101103\",\n  \"data_evento\": \"2025-11-11T12:40:00-03:00\",\n  \"status_solicitacao\": \"aguardando_analise\",\n  \"mensagem\": \"Solicitação de análise fiscal registrada com sucesso. Aguarde retorno da fiscalização.\"\n}"
            }
          ]
        },
        {
          "name": "Confirmação do Tomador (203202)",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json",
                "description": "O corpo da requisição deve ser um JSON"
              },
              {
                "key": "Accept",
                "value": "application/json",
                "description": "A resposta será em formato JSON"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"tipo_evento\": \"confirmacao_tomador\",\n  \"descricao\": \"Confirmo o recebimento do serviço conforme descrito na NFS-e\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{base_url}}/{{tenant}}/api/v1/nfse/{{chave_acesso}}/eventos",
              "host": ["{{base_url}}"],
              "path": ["{{tenant}}", "api", "v1", "nfse", "{{chave_acesso}}", "eventos"]
            },
            "description": "Registra a confirmação do tomador sobre a prestação do serviço.\n\n**Código do Evento:** 203202\n\n**Quando usar:**\n- Quando o tomador deseja confirmar que o serviço foi prestado\n- Para dar maior segurança jurídica à operação\n- Quando solicitado pelo prestador ou pela fiscalização\n\n**Campos obrigatórios (no corpo JSON):**\n- `tipo_evento`: confirmacao_tomador\n\n**Campos opcionais:**\n- `descricao`: observação livre do tomador\n\n**Observação:** A chave da nota vai no PATH da URL (/nfse/:chave_acesso/eventos). O autor do evento (tomador) é inferido da própria nota; quando o webservice exigir assinatura, o certificado do tomador é que autentica."
          },
          "response": [
            {
              "name": "Sucesso - Confirmação registrada",
              "originalRequest": {
                "method": "POST",
                "url": {
                  "raw": "{{base_url}}/{{tenant}}/api/v1/nfse/{{chave_acesso}}/eventos",
                  "host": ["{{base_url}}"],
                  "path": ["api", "v1", "nfse", "{{chave_acesso}}", "eventos"]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "body": "{\n  \"status\": \"OK\",\n  \"numero_protocolo\": \"20251111120000000005\",\n  \"tipo_evento\": \"confirmacao_tomador\",\n  \"codigo_evento\": \"203202\",\n  \"data_evento\": \"2025-11-11T12:45:00-03:00\",\n  \"mensagem\": \"Confirmação do tomador registrada com sucesso\"\n}"
            },
            {
              "name": "Erro - Tomador inválido",
              "originalRequest": {
                "method": "POST",
                "url": {
                  "raw": "{{base_url}}/{{tenant}}/api/v1/nfse/{{chave_acesso}}/eventos",
                  "host": ["{{base_url}}"],
                  "path": ["api", "v1", "nfse", "{{chave_acesso}}", "eventos"]
                }
              },
              "status": "Unprocessable Entity",
              "code": 422,
              "_postman_previewlanguage": "json",
              "body": "{\n  \"codigo_erro\": \"E305\",\n  \"mensagem\": \"Tomador não corresponde\",\n  \"detalhes\": \"O documento informado não corresponde ao tomador da NFS-e\",\n  \"timestamp\": \"2025-11-11T12:45:00-03:00\"\n}"
            }
          ]
        },
        {
          "name": "Rejeição do Tomador (203206)",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json",
                "description": "O corpo da requisição deve ser um JSON"
              },
              {
                "key": "Accept",
                "value": "application/json",
                "description": "A resposta será em formato JSON"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"tipo_evento\": \"rejeicao_tomador\",\n  \"motivo_rejeicao_tomador\": \"erro_valores_ou_servico\",\n  \"descricao_motivo_rejeicao_tomador\": \"O serviço descrito na NFS-e não corresponde ao que foi efetivamente prestado\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{base_url}}/{{tenant}}/api/v1/nfse/{{chave_acesso}}/eventos",
              "host": ["{{base_url}}"],
              "path": ["{{tenant}}", "api", "v1", "nfse", "{{chave_acesso}}", "eventos"]
            },
            "description": "Registra a rejeição do tomador em relação à prestação do serviço.\n\n**Código do Evento:** 203206\n\n**Quando usar:**\n- Quando o tomador não reconhece a prestação do serviço\n- Quando o serviço descrito não corresponde ao contratado\n- Quando há divergências entre o serviço prestado e o documentado\n\n**Campos obrigatórios (no corpo JSON):**\n- `tipo_evento`: rejeicao_tomador\n- `motivo_rejeicao_tomador`: enum (consulte GET /api/v1/catalogo/motivos_evento)\n- `descricao_motivo_rejeicao_tomador`: detalhamento da rejeição\n\n**A chave da nota vai no PATH da URL** (/nfse/:chave_acesso/eventos), não no corpo.\n\n**Observação:** A rejeição pelo tomador pode iniciar um processo de análise fiscal."
          },
          "response": [
            {
              "name": "Sucesso - Rejeição registrada",
              "originalRequest": {
                "method": "POST",
                "url": {
                  "raw": "{{base_url}}/{{tenant}}/api/v1/nfse/{{chave_acesso}}/eventos",
                  "host": ["{{base_url}}"],
                  "path": ["api", "v1", "nfse", "{{chave_acesso}}", "eventos"]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "body": "{\n  \"status\": \"OK\",\n  \"numero_protocolo\": \"20251111120000000006\",\n  \"tipo_evento\": \"rejeicao_tomador\",\n  \"codigo_evento\": \"203206\",\n  \"data_evento\": \"2025-11-11T12:50:00-03:00\",\n  \"mensagem\": \"Rejeição do tomador registrada com sucesso. A fiscalização será notificada.\"\n}"
            }
          ]
        }
      ],
      "description": "Endpoints para registro de eventos na NFS-e.\n\n**Tipos de Eventos Suportados:**\n\n| Tipo | Código | Descrição |\n|------|--------|-----------||\n| cancelamento | 101101 | Cancelamento simples de NFS-e |\n| cancelamento_por_substituicao | 105102 | Cancelamento com chave da nota substituta |\n| solicitacao_analise_fiscal_para_cancelamento | 101103 | Solicita análise fiscal para cancelar |\n| confirmacao_tomador | 203202 | Confirmação pelo tomador |\n| rejeicao_tomador | 203206 | Rejeição pelo tomador |\n\n**Atenção:** Eventos são irreversíveis. Certifique-se dos dados antes de registrar."
    },
    {
      "name": "Catálogo",
      "item": [
        {
          "name": "Códigos de Tributação Municipal (cTribMun)",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/{{tenant}}/api/v1/catalogo/codigos_tributacao_municipal?per_page=25&page=1",
              "host": ["{{base_url}}"],
              "path": ["{{tenant}}", "api", "v1", "catalogo", "codigos_tributacao_municipal"],
              "query": [
                { "key": "per_page", "value": "25", "description": "Itens por página (1..100)" },
                { "key": "page", "value": "1", "description": "Número da página (>=1)" },
                { "key": "descricao", "value": "", "description": "Filtra por trecho da descrição (ILIKE, case-insensitive)", "disabled": true },
                { "key": "cnae_codigo", "value": "", "description": "Filtra por id do CNAE vinculado", "disabled": true }
              ]
            },
            "description": "Lista os códigos de tributação municipal cadastrados no município.\n\nO campo `id` retornado é o valor que deve ser enviado no XML DPS em `<serv><cServ><cTribMun>`.\n\n**Cache:** Resposta inclui `Cache-Control: public, max-age=3600` (1 hora).\n\n**Sem autenticação** — dados públicos por LAI."
          },
          "response": []
        },
        {
          "name": "Códigos de Tributação Nacional (cTribNac)",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/{{tenant}}/api/v1/catalogo/codigos_tributacao_nacional?per_page=25&page=1",
              "host": ["{{base_url}}"],
              "path": ["{{tenant}}", "api", "v1", "catalogo", "codigos_tributacao_nacional"],
              "query": [
                { "key": "per_page", "value": "25", "description": "Itens por página (1..100)" },
                { "key": "page", "value": "1", "description": "Número da página" },
                { "key": "codigo", "value": "", "description": "Filtra por código exato de 6 dígitos", "disabled": true },
                { "key": "descricao", "value": "", "description": "Filtra por trecho da descrição (ILIKE)", "disabled": true },
                { "key": "item", "value": "", "description": "Filtra por item da LC 116/2003", "disabled": true }
              ]
            },
            "description": "Lista os códigos de tributação nacional do ADN.\n\nO campo `codigo` (6 dígitos) é o valor que deve ser enviado no XML DPS em `<serv><cServ><cTribNac>`.\n\n**Cache:** `Cache-Control: public, max-age=3600`.\n\n**Sem autenticação.**"
          },
          "response": []
        },
        {
          "name": "Códigos NBS (cNBS)",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/{{tenant}}/api/v1/catalogo/nbs?per_page=25&page=1",
              "host": ["{{base_url}}"],
              "path": ["{{tenant}}", "api", "v1", "catalogo", "nbs"],
              "query": [
                { "key": "per_page", "value": "25", "description": "Itens por página (1..100)" },
                { "key": "page", "value": "1", "description": "Número da página" },
                { "key": "codigo", "value": "", "description": "Filtra por código de 9 dígitos (aceita com ou sem pontuação)", "disabled": true },
                { "key": "descricao", "value": "", "description": "Filtra por trecho da descrição (ILIKE)", "disabled": true },
                { "key": "secao", "value": "", "description": "Filtra por seção (1..12)", "disabled": true }
              ]
            },
            "description": "Catálogo NBS (Nomenclatura Brasileira de Serviços) oficial.\n\nO campo `codigo` (9 dígitos sem formatação) é o valor que deve ser enviado no XML DPS em `<serv><cServ><cNBS>`.\n\nO campo `codigo_formatado` apresenta o valor no formato `XX.XX.XX.XX-X` para exibição.\n\n**Cache:** `Cache-Control: public, max-age=3600`.\n\n**Sem autenticação.**"
          },
          "response": []
        },
        {
          "name": "Municípios IBGE (cMun, cMunPrest, cLocPrestacao, cLocEmi, cMunInc)",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/{{tenant}}/api/v1/catalogo/municipios?per_page=25&page=1",
              "host": ["{{base_url}}"],
              "path": ["{{tenant}}", "api", "v1", "catalogo", "municipios"],
              "query": [
                { "key": "per_page", "value": "25", "description": "Itens por página (1..100)" },
                { "key": "page", "value": "1", "description": "Número da página" },
                { "key": "codigo_ibge", "value": "", "description": "Filtra por código IBGE exato (7 dígitos)", "disabled": true },
                { "key": "uf", "value": "", "description": "Filtra por sigla da UF (CE, SP, etc.) — case-insensitive", "disabled": true },
                { "key": "nome", "value": "", "description": "Filtra por trecho do nome (ILIKE)", "disabled": true }
              ]
            },
            "description": "Catálogo IBGE oficial de municípios brasileiros.\n\nO campo `codigo_ibge` (7 dígitos) é o valor que vai em `<cMun>`, `<cMunPrest>`, `<cLocPrestacao>`, `<cLocEmi>` e `<cMunInc>` no XML DPS.\n\n**Cache:** `Cache-Control: public, max-age=3600`.\n\n**Sem autenticação.**"
          },
          "response": []
        },
        {
          "name": "Países (cPais)",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/{{tenant}}/api/v1/catalogo/paises?per_page=25&page=1",
              "host": ["{{base_url}}"],
              "path": ["{{tenant}}", "api", "v1", "catalogo", "paises"],
              "query": [
                { "key": "per_page", "value": "25", "description": "Itens por página (1..100)" },
                { "key": "page", "value": "1", "description": "Número da página" },
                { "key": "codigo", "value": "", "description": "Filtra por código exato (BACEN/ISO 3166-1)", "disabled": true },
                { "key": "nome", "value": "", "description": "Filtra por trecho do nome (ILIKE)", "disabled": true }
              ]
            },
            "description": "Catálogo de países (BACEN / ISO 3166-1).\n\nO campo `codigo` é o valor que vai em `<cPais>` no XML DPS quando o endereço do tomador é exterior.\n\n**Cache:** `Cache-Control: public, max-age=3600`.\n\n**Sem autenticação.**"
          },
          "response": []
        }
      ],
      "description": "Endpoints públicos read-only para descoberta de códigos usados na montagem do XML DPS.\n\nTodos os endpoints:\n- Não exigem autenticação (dados públicos por LAI)\n- Retornam `Cache-Control: public, max-age=3600` (catálogos mudam pouco)\n- Suportam paginação via `?page` e `?per_page` (máximo 100)\n- Filtros textuais usam ILIKE (case-insensitive)\n\n**Estrutura da resposta:**\n```json\n{\n  \"itens\": [...],\n  \"paginacao\": {\n    \"pagina_atual\": 1,\n    \"por_pagina\": 25,\n    \"total\": 1234,\n    \"total_paginas\": 50\n  }\n}\n```"
    }
  ]
}
