{"openapi":"3.0.3","info":{"title":"API - Conota","description":"API para emissao de documentos fiscais eletronicos (NF-e, NFC-e, NFS-e), consulta de CEP/CNPJ e gestao de empresas emissoras. Autentique com o header X-API-Key, usando a chave criada no painel. Bearer nao serve aqui: esse header e lido como sessao do painel e devolve 401.\n\n**Quer testar uma chamada?** Esta pagina e para leitura. O console com \"Try it out\", onde voce dispara a requisicao com a sua propria chave, fica em [/swagger](/swagger) — mesma API, mesmos endpoints.\n\n**Assistentes de IA (MCP):** estas mesmas consultas estao disponiveis para agentes via Model Context Protocol, usando a MESMA API Key. Instrucoes de conexao e catalogo de ferramentas em [mcp.conota.dev](https://mcp.conota.dev).","version":"1.0.0"},"components":{"securitySchemes":{"apiKey":{"type":"apiKey","name":"X-API-Key","in":"header","description":"Chave de API criada no painel, em Integracao > Chaves de API"}},"schemas":{}},"paths":{"/v1/empresas":{"get":{"summary":"Listar empresas emissoras do tenant","tags":["Empresas"],"responses":{"200":{"description":"Default Response"}}},"post":{"summary":"Cadastrar empresa emissora","tags":["Empresas"],"description":"Cria uma empresa emissora na conta. É o **primeiro passo** de qualquer integração: sem empresa cadastrada não há o que emitir.\n\nCadastrar não basta para emitir. Depois disto faltam ainda:\n\n1. enviar o certificado A1 — `PUT /v1/empresas/{cpf_cnpj}/certificado`;\n2. configurar o tipo de documento — `PUT /v1/empresas/{cpf_cnpj}/nfe`, `/nfse` ou `/nfce`.\n\n**CNPJs são ilimitados para emissão** — cadastre quantas empresas precisar.\n\n> O `cpf_cnpj` é gravado **sem máscara**, independente de como você enviar. É por ele que a empresa é referenciada nas demais rotas.\n\n**Respostas:** `201` com a empresa criada · `400` falta `cpf_cnpj` ou `nome_razao_social` · `409` empresa já cadastrada nesta conta · `500` erro interno.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["cpf_cnpj","nome_razao_social"],"properties":{"cpf_cnpj":{"type":"string","description":"CNPJ ou CPF do emitente. Com ou sem máscara — aqui vai no corpo, então a barra não atrapalha. CNPJ alfanumérico é aceito."},"nome_razao_social":{"type":"string","description":"Razão social, exatamente como consta no CNPJ."},"nome_fantasia":{"type":"string","description":"Nome fantasia."},"email":{"type":"string","description":"E-mail de contato da empresa."},"fone":{"type":"string","description":"Telefone, só dígitos com DDD."},"inscricao_estadual":{"type":"string","description":"Inscrição estadual. Obrigatória para NF-e e NFC-e; use `ISENTO` quando aplicável."},"inscricao_municipal":{"type":"string","description":"Inscrição municipal. Exigida por vários municípios na NFS-e."},"endereco":{"type":"object","description":"Endereço do emitente. O `codigo_municipio` (IBGE) é o que determina o município emissor na NFS-e.","properties":{"cep":{"type":"string"},"logradouro":{"type":"string"},"numero":{"type":"string"},"complemento":{"type":"string"},"bairro":{"type":"string"},"cidade":{"type":"string"},"uf":{"type":"string","maxLength":2},"codigo_municipio":{"type":"string","description":"Código IBGE do município, 7 dígitos. Ex.: `3106200` (Belo Horizonte)."},"codigo_pais":{"type":"string","description":"Padrão `1058` (Brasil)."},"pais":{"type":"string","description":"Padrão `Brasil`."}}}},"example":{"cpf_cnpj":"11222333000181","nome_razao_social":"string","nome_fantasia":"string","email":"string","fone":"string","inscricao_estadual":"string","inscricao_municipal":"string","endereco":{"cep":"string","logradouro":"string","numero":"string","bairro":"string","cidade":"string","uf":"string","codigo_municipio":"string"}}}}}},"responses":{"200":{"description":"Default Response"}}}},"/v1/empresas/certificados":{"get":{"summary":"Listar certificados digitais do tenant (validade e status)","tags":["Empresas"],"description":"Retorna o certificado A1 ativo de cada empresa do tenant — titular, emissor, validade e status: valido | expira_em_breve (<= 30 dias) | expirado | sem_certificado.","responses":{"200":{"description":"Default Response"}}}},"/v1/empresas/numeracao":{"get":{"summary":"Último número autorizado por empresa, tipo, série e ambiente","tags":["Empresas"],"description":"Diz **em que número cada sequência está** — o número da última nota **autorizada**, por empresa, tipo de documento, série e ambiente.\n\nHomologação e produção são sequências **independentes**, e vêm separadas. Nota rejeitada não avança a sequência: só entram autorizadas.\n\nInforme `cnpj` para trazer só uma empresa. Sem ele, vêm todas as do tenant.\n\n**Isto é consulta, não reserva.** Serve para saber onde a numeração está — não para atribuir o próximo número: entre ler e emitir há uma janela, e duas emissões simultâneas leriam o mesmo valor. Quem numera continua sendo você.","parameters":[{"schema":{"type":"string"},"in":"query","name":"cnpj","required":false,"description":"Opcional — CNPJ/CPF da empresa (com ou sem máscara)."},{"schema":{"type":"string","enum":["nfe","nfce","nfse"]},"in":"query","name":"tipo","required":false,"description":"Opcional — filtra por tipo."}],"security":[{"apiKey":[]}],"responses":{"200":{"description":"Default Response"}}}},"/v1/empresas/{cpf_cnpj}":{"get":{"summary":"Detalhe de uma empresa","tags":["Empresas"],"parameters":[{"schema":{"type":"string","example":"11222333000181"},"in":"path","name":"cpf_cnpj","required":true,"description":"CNPJ/CPF da empresa, **sem a barra**: `11222333000181` ou `11.222.333.0001-81`. A barra da máscara é separador de caminho na URL — enviando `11.222.333/0001-81` a rota não é encontrada (404). Em query string e no corpo, a máscara completa é aceita normalmente. CNPJ alfanumérico é aceito."}],"responses":{"200":{"description":"Default Response"}}},"put":{"summary":"Atualizar dados cadastrais da empresa","tags":["Empresas"],"description":"Atualiza os dados cadastrais. O `cpf_cnpj` **não muda** por aqui — ele identifica a empresa; para outro CNPJ, cadastre outra empresa.\n\nCampo não enviado **mantém o valor atual**.\n\n> Mudança de razão social, endereço ou regime costuma exigir atualização aqui **antes** da próxima emissão — o documento leva estes dados, e divergência com o cadastro na Receita ou na prefeitura gera rejeição.\n\nConfiguração fiscal (ambiente, série, CSC) não vem aqui: use as rotas `/nfe`, `/nfse` e `/nfce`.\n\n**Respostas:** `200` com a empresa atualizada · `404` empresa não encontrada nesta conta · `500` erro interno.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"nome_razao_social":{"type":"string","description":"Razão social, como consta no CNPJ."},"nome_fantasia":{"type":"string"},"email":{"type":"string"},"fone":{"type":"string","description":"Só dígitos, com DDD."},"inscricao_estadual":{"type":"string","description":"Use `ISENTO` quando aplicável."},"inscricao_municipal":{"type":"string"},"endereco":{"type":"object","description":"Endereço completo. Enviando este objeto, envie-o inteiro.","properties":{"cep":{"type":"string"},"logradouro":{"type":"string"},"numero":{"type":"string"},"complemento":{"type":"string"},"bairro":{"type":"string"},"cidade":{"type":"string"},"uf":{"type":"string","maxLength":2},"codigo_municipio":{"type":"string","description":"Código IBGE, 7 dígitos."}}}}}}}},"parameters":[{"schema":{"type":"string","example":"11222333000181"},"in":"path","name":"cpf_cnpj","required":true,"description":"CNPJ/CPF da empresa, **sem a barra**: `11222333000181` ou `11.222.333.0001-81`. A barra da máscara é separador de caminho na URL — enviando `11.222.333/0001-81` a rota não é encontrada (404). Em query string e no corpo, a máscara completa é aceita normalmente. CNPJ alfanumérico é aceito."}],"responses":{"200":{"description":"Default Response"}}},"delete":{"summary":"Remover empresa","tags":["Empresas"],"parameters":[{"schema":{"type":"string","example":"11222333000181"},"in":"path","name":"cpf_cnpj","required":true,"description":"CNPJ/CPF da empresa, **sem a barra**: `11222333000181` ou `11.222.333.0001-81`. A barra da máscara é separador de caminho na URL — enviando `11.222.333/0001-81` a rota não é encontrada (404). Em query string e no corpo, a máscara completa é aceita normalmente. CNPJ alfanumérico é aceito."}],"responses":{"200":{"description":"Default Response"}}}},"/v1/empresas/{cpf_cnpj}/nfe":{"put":{"summary":"Configurar parâmetros de NF-e da empresa","tags":["Empresas"],"description":"Define ambiente, regime tributário, série e numeração da NF-e desta empresa. **Obrigatório antes da primeira emissão** — sem esta configuração, `POST /v1/nfe/emitir` responde `422`.\n\nÉ um **upsert parcial**: envie só o que quer mudar. Campo não enviado **mantém o valor atual** — não volta para o padrão.\n\n| Campo | Padrão na criação |\n|---|---|\n| `ambiente` | `2` (homologação) |\n| `crt` | `1` (Simples Nacional) |\n| `serie` | `\"001\"` |\n| `proximo_numero` | `1` |\n\n> **`proximo_numero` não é um contador automático.** Ele é o valor de partida que você registra aqui; a emissão usa o `nNF` que **você** envia no payload. Para saber em que número cada série realmente está, use `GET /v1/empresas/numeracao`, que lê a última nota autorizada.\n\n> **Homologação e produção são sequências independentes.** Trocar o `ambiente` não reinicia nem transfere numeração.\n\n**Respostas:** `200` com a configuração salva · `404` empresa não encontrada nesta conta · `500` erro interno.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"ambiente":{"type":"integer","enum":[1,2],"description":"Ambiente do autorizador: `1` = produção (valor fiscal real), `2` = homologação (sem valor fiscal)."},"crt":{"type":"integer","enum":[1,2,3,4],"description":"Código do Regime Tributário: `1` = Simples Nacional, `2` = Simples Nacional com excesso de sublimite, `3` = Regime Normal, `4` = MEI. Precisa refletir o enquadramento REAL da empresa — ele muda a tributação do documento."},"serie":{"type":"string","maxLength":3,"description":"Série da NF-e, até 3 caracteres. Ex.: `\"001\"`. Cada série tem a sua própria numeração."},"proximo_numero":{"type":"integer","minimum":1,"description":"Número de partida da série. Registro seu — a emissão usa o `nNF` enviado no payload."}},"example":{"ambiente":2,"crt":1,"serie":"001","proximo_numero":1}}}}},"parameters":[{"schema":{"type":"string","example":"11222333000181"},"in":"path","name":"cpf_cnpj","required":true,"description":"CNPJ/CPF da empresa, **sem a barra**: `11222333000181` ou `11.222.333.0001-81`. A barra da máscara é separador de caminho na URL — enviando `11.222.333/0001-81` a rota não é encontrada (404). Em query string e no corpo, a máscara completa é aceita normalmente. CNPJ alfanumérico é aceito."}],"responses":{"200":{"description":"Default Response"}}}},"/v1/empresas/{cpf_cnpj}/nfse":{"put":{"summary":"Configurar parâmetros de NFS-e da empresa","tags":["Empresas"],"description":"Define ambiente, numeração de RPS, enquadramentos municipais e as credenciais da prefeitura. **Obrigatório antes da primeira emissão** de NFS-e.\n\nÉ um **upsert parcial**: envie só o que quer mudar. Campo não enviado **mantém o valor atual**.\n\n> **Atenção: aqui `ambiente` é TEXTO.** Nesta rota vale `\"producao\"` ou `\"homologacao\"` — diferente das rotas de NF-e e NFC-e, onde `ambiente` é o número `1` ou `2`. É a divergência que mais causa erro na configuração inicial.\n\n> **A configuração é POR AMBIENTE.** Homologação e produção têm registros separados, com **contadores de RPS independentes**. Configurar produção não altera o que está em homologação.\n\n| Campo | Padrão na criação |\n|---|---|\n| `ambiente` | `\"homologacao\"` |\n| `lote` | `1` |\n| `serie` | `\"RPS\"` |\n| `numero` | `1` |\n| `op_simp_nac` | `1` |\n| `reg_ap_trib_sn` | `0` |\n| `reg_esp_trib` | `0` |\n| `incentivo_fiscal` | `false` |\n\n**Credenciais de prefeitura** (`prefeitura_login`, `prefeitura_senha`, `prefeitura_token`) só são exigidas por municípios com sistema próprio. No Padrão Nacional, o certificado digital basta. Elas nunca são devolvidas nas consultas.\n\n**Respostas:** `200` com a configuração salva · `404` empresa não encontrada nesta conta · `500` erro interno.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"ambiente":{"type":"string","enum":["producao","homologacao"],"description":"TEXTO, não número: `\"producao\"` ou `\"homologacao\"`. Cada ambiente tem a sua própria configuração e o seu próprio contador de RPS."},"lote":{"type":"integer","minimum":1,"description":"Número do lote de envio. Contador próprio do emitente."},"serie":{"type":"string","description":"Série do RPS. Ex.: `\"RPS\"`."},"numero":{"type":"integer","minimum":1,"description":"Número do RPS. É um contador **monotônico**: não reaproveite número já usado, mesmo após rejeição."},"op_simp_nac":{"type":"integer","description":"Optante pelo Simples Nacional. ATENÇÃO: a implementação atual espera `4` = não optante (o schema oficial usa `1`). Confirme o valor aceito antes de configurar um emitente novo."},"reg_ap_trib_sn":{"type":"integer","description":"Regime de apuração tributária pelo Simples Nacional. `0` quando não se aplica."},"reg_esp_trib":{"type":"integer","description":"Regime especial de tributação. `0` = nenhum. Campo distinto de `reg_ap_trib_sn` — cada um preenche a sua tag no XML."},"incentivo_fiscal":{"type":"boolean","description":"Empresa possui incentivo fiscal municipal."},"prefeitura_login":{"type":"string","description":"Login na prefeitura. Só para municípios com sistema próprio."},"prefeitura_senha":{"type":"string","description":"Senha na prefeitura. Nunca é devolvida nas consultas."},"prefeitura_token":{"type":"string","description":"Token da prefeitura, quando o município usa token em vez de senha."}},"example":{"ambiente":"homologacao","lote":1,"serie":"RPS","numero":1,"op_simp_nac":1,"reg_ap_trib_sn":0,"reg_esp_trib":0,"incentivo_fiscal":false}}}}},"parameters":[{"schema":{"type":"string","example":"11222333000181"},"in":"path","name":"cpf_cnpj","required":true,"description":"CNPJ/CPF da empresa, **sem a barra**: `11222333000181` ou `11.222.333.0001-81`. A barra da máscara é separador de caminho na URL — enviando `11.222.333/0001-81` a rota não é encontrada (404). Em query string e no corpo, a máscara completa é aceita normalmente. CNPJ alfanumérico é aceito."}],"responses":{"200":{"description":"Default Response"}}}},"/v1/empresas/{cpf_cnpj}/nfce":{"put":{"summary":"Configurar parametros de NFC-e da empresa (CSC, serie, ambiente)","tags":["Empresas"],"description":"Define o CSC (Codigo de Seguranca do Contribuinte) e o ID do CSC, obtidos no portal da SEFAZ do estado da empresa - necessarios para gerar o QR Code da NFC-e. ambiente: 1=producao, 2=homologacao. crt: 1=Simples Nacional, 2=Simples excesso sublimite, 3=Regime Normal, 4=MEI. Por seguranca, o CSC nao e retornado; a resposta traz apenas csc_configurado (boolean).","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"ambiente":{"type":"integer","enum":[1,2],"description":"1=producao, 2=homologacao"},"crt":{"type":"integer","enum":[1,2,3,4]},"serie":{"type":"string","maxLength":3},"proximo_numero":{"type":"integer","minimum":1},"csc_id":{"type":"string","maxLength":10,"description":"ID do CSC / idToken (ex: \"000001\")"},"csc":{"type":"string","maxLength":50,"description":"Codigo de Seguranca do Contribuinte (token)"}},"example":{"ambiente":2,"crt":1,"serie":"001","proximo_numero":1,"csc_id":"string","csc":"string"}}}}},"parameters":[{"schema":{"type":"string","example":"11222333000181"},"in":"path","name":"cpf_cnpj","required":true,"description":"CNPJ/CPF da empresa, **sem a barra**: `11222333000181` ou `11.222.333.0001-81`. A barra da máscara é separador de caminho na URL — enviando `11.222.333/0001-81` a rota não é encontrada (404). Em query string e no corpo, a máscara completa é aceita normalmente. CNPJ alfanumérico é aceito."}],"responses":{"200":{"description":"Default Response"}}}},"/v1/empresas/{cpf_cnpj}/cte":{"put":{"summary":"Configurar parametros de CT-e da empresa (RNTRC, serie, ambiente)","tags":["Empresas"],"description":"Define os parametros de emissao de **CT-e (modelo 57)** e **CT-e OS (modelo 67)**, ambos no modal rodoviario.\n\n`rntrc` — Registro Nacional de Transportadores Rodoviarios de Carga, obtido na ANTT. Vai no grupo `rodo` do CT-e (57).\n\n`taf` — Termo de Autorizacao de Fretamento, usado pelo CT-e OS (67). Quem so emite o 57 nao precisa.\n\nambiente: 1=producao, 2=homologacao. crt: 1=Simples Nacional, 2=Simples excesso sublimite, 3=Regime Normal, 4=MEI.\n\nCampo nao enviado **mantem o valor atual** — nao volta ao padrao.\n\n**Respostas:** `200` configuracao salva · `404` empresa nao encontrada · `500` erro interno.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"ambiente":{"type":"integer","enum":[1,2],"description":"1=producao, 2=homologacao"},"crt":{"type":"integer","enum":[1,2,3,4],"description":"Regime tributario do emitente"},"serie":{"type":"string","maxLength":3},"proximo_numero":{"type":"integer","minimum":1},"rntrc":{"type":"string","maxLength":12,"description":"Registro na ANTT — grupo rodo do CT-e (57)"},"taf":{"type":"string","maxLength":20,"description":"Termo de Autorizacao de Fretamento — grupo rodoOS do CT-e OS (67)"}},"example":{"ambiente":2,"crt":3,"serie":"1","proximo_numero":1,"rntrc":"12345678","taf":""}}}}},"parameters":[{"schema":{"type":"string","example":"11222333000181"},"in":"path","name":"cpf_cnpj","required":true,"description":"CNPJ/CPF da empresa, **sem a barra**: `11222333000181` ou `11.222.333.0001-81`. A barra da máscara é separador de caminho na URL — enviando `11.222.333/0001-81` a rota não é encontrada (404). Em query string e no corpo, a máscara completa é aceita normalmente. CNPJ alfanumérico é aceito."}],"responses":{"200":{"description":"Default Response"}}}},"/v1/empresas/{cpf_cnpj}/mdfe":{"put":{"summary":"Configurar parametros de MDF-e da empresa (tipo de emitente, RNTRC, serie)","tags":["Empresas"],"description":"Define os parametros de emissao de **MDF-e (modelo 58)**, modal rodoviario.\n\n`tipo_emitente` e o campo que mais gera erro silencioso: ele decide **qual documento o manifesto aceita**.\n\n- `1` prestador de servico de transporte -> manifesto de **CT-e**\n- `2` transportador de carga propria -> manifesto de **NF-e**\n- `3` prestador com CT-e Globalizado -> manifesto de **NF-e**\n\nA combinacao errada nao da erro na biblioteca do autorizador: ela monta um manifesto **sem documento nenhum**. Por isso o Conota recusa antes.\n\n`rntrc` e o registro do transportador na ANTT.\n\nCampo nao enviado **mantem o valor atual**.\n\n**Respostas:** `200` configuracao salva - `404` empresa nao encontrada - `500` erro interno.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"ambiente":{"type":"integer","enum":[1,2],"description":"1=producao, 2=homologacao"},"serie":{"type":"string","maxLength":3},"proximo_numero":{"type":"integer","minimum":1},"rntrc":{"type":"string","maxLength":12,"description":"Registro na ANTT"},"tipo_emitente":{"type":"integer","enum":[1,2,3],"description":"1=prestador (CT-e), 2=carga propria (NF-e), 3=CT-e Globalizado (NF-e)"}},"example":{"ambiente":2,"serie":"1","proximo_numero":1,"rntrc":"12345678","tipo_emitente":1}}}}},"parameters":[{"schema":{"type":"string","example":"11222333000181"},"in":"path","name":"cpf_cnpj","required":true,"description":"CNPJ/CPF da empresa, **sem a barra**: `11222333000181`."}],"responses":{"200":{"description":"Default Response"}}}},"/v1/empresas/{cpf_cnpj}/certificado":{"put":{"summary":"Enviar ou substituir o certificado digital A1 (PFX)","tags":["Empresas"],"description":"Envia o certificado **A1** (`.pfx`/`.p12`) da empresa, em base64, junto com a senha. O Conota lê o certificado, extrai titular, emissor, validade e número de série, e passa a usá-lo em todas as emissões daquela empresa.\n\nSubstituir é a mesma chamada: o certificado anterior é desativado e o novo entra no lugar.\n\n> **Só A1.** O A3 depende de mídia física (token ou cartão) e não se aplica a uma emissão executada em servidor.\n\n> **Certificado vencido derruba TODAS as emissões da empresa** — não é rejeição pontual, é parada total, e chega sem aviso no dia do vencimento. Acompanhe por `GET /v1/empresas/certificados`, que traz `dias_para_expirar` e o status de cada empresa.\n\nComo gerar o base64:\n\n```bash\nbase64 -w 0 certificado.pfx    # Linux\ncertutil -encode certificado.pfx saida.txt   # Windows\n```\n\n**Respostas:** `200` com os dados extraídos do certificado · `400` falta `certificado` ou `password` · `404` empresa não encontrada · `422` senha incorreta ou arquivo inválido · `500` erro interno.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["certificado","password"],"properties":{"certificado":{"type":"string","description":"Conteúdo do arquivo `.pfx`/`.p12` em **base64**, sem quebras de linha e sem o prefixo `data:`."},"password":{"type":"string","description":"Senha do certificado. É armazenada cifrada e nunca devolvida em nenhuma consulta."}},"example":{"certificado":"MIIQxQIBAzCCEI8GCSqGSIb3...","password":"string"}}}}},"parameters":[{"schema":{"type":"string","example":"11222333000181"},"in":"path","name":"cpf_cnpj","required":true,"description":"CNPJ/CPF da empresa, **sem a barra**: `11222333000181` ou `11.222.333.0001-81`. A barra da máscara é separador de caminho na URL — enviando `11.222.333/0001-81` a rota não é encontrada (404). Em query string e no corpo, a máscara completa é aceita normalmente. CNPJ alfanumérico é aceito."}],"responses":{"200":{"description":"Default Response"}}}},"/v1/cep/{cep}":{"get":{"summary":"Consultar endereco por CEP","tags":["CEP"],"description":"Retorna o endereco completo a partir de um CEP (8 digitos).","parameters":[{"schema":{"type":"string"},"in":"path","name":"cep","required":true,"description":"CEP (somente numeros)"}],"responses":{"200":{"description":"Default Response"}}}},"/v1/cep":{"get":{"summary":"Buscar CEP por logradouro","tags":["CEP"],"description":"Busca CEPs a partir de logradouro / cidade / UF.","parameters":[{"schema":{"type":"string"},"in":"query","name":"logradouro","required":true},{"schema":{"type":"string"},"in":"query","name":"tipo","required":false},{"schema":{"type":"string"},"in":"query","name":"bairro","required":false},{"schema":{"type":"string"},"in":"query","name":"cidade","required":false},{"schema":{"type":"string"},"in":"query","name":"uf","required":false}],"responses":{"200":{"description":"Default Response"}}}},"/v1/cnpj/{cnpj}":{"get":{"summary":"Consultar dados cadastrais por CNPJ","tags":["CNPJ"],"description":"Retorna os dados cadastrais de uma empresa a partir do CNPJ.","parameters":[{"schema":{"type":"string"},"in":"path","name":"cnpj","required":true,"description":"CNPJ **sem a barra**: `00000000000191` ou `00.000.0000001-91`. A barra da máscara é separador de caminho na URL — enviando `00.000.000/0001-91` a rota não é encontrada (404). Aceita **CNPJ alfanumérico** (NT Conjunta 2025.001): 12 posições alfanuméricas + 2 dígitos verificadores."}],"responses":{"200":{"description":"Default Response"}}}},"/v1/ncm/buscar":{"post":{"summary":"Buscar NCM pela descricao do produto","tags":["NCM"],"description":"Procura NCMs pela **descricao do produto**.\n\nE a consulta que resolve o problema real de quem cadastra produto: voce sabe que o item e um *parafuso*, nao que ele e o *7318.15.00*.\n\nDevolve os codigos candidatos com a descricao oficial e a vigencia, para escolher com seguranca.\n\nO termo e procurado em **qualquer posicao** da descricao: `autoperfurantes` encontra *Parafusos autoperfurantes*. Use `so_inicio` para restringir ao comeco da descricao, quando a busca ampla trouxer resultado demais.\n\nPor padrao a resposta traz **apenas codigos de 8 digitos** -- os unicos que servem numa nota. A tabela tambem tem os niveis da arvore (`7318` e um agrupamento, nao um NCM emitivel); para ve-los, envie `apenas_codigos_finais: false`.\n\nBusca sem resultado devolve `200` com `ncms: []`. Nao e erro.\n\n> A tabela vem do portal do governo e fica em cache aqui. A primeira consulta depois de uma atualizacao pode demorar um pouco mais.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["descricao"],"properties":{"descricao":{"type":"string","minLength":3,"description":"Texto a procurar na descricao oficial. Ex.: \"parafuso\", \"cafe soluvel\"."},"limite":{"type":"integer","minimum":1,"maximum":200,"description":"Maximo de resultados (padrao 50)."},"so_inicio":{"type":"boolean","description":"Exige que a descricao COMECE com o termo. Padrao `false` (procura em qualquer posicao)."},"apenas_codigos_finais":{"type":"boolean","description":"Devolve so os NCMs de 8 digitos, que sao os validos numa nota. Padrao `true`."}}}}}},"responses":{"200":{"description":"Default Response"}}}},"/v1/ncm/{codigo}":{"get":{"summary":"Consultar NCM por codigo","tags":["NCM"],"description":"Devolve a descricao oficial, a vigencia e o ato normativo de um NCM de 8 digitos.","parameters":[{"schema":{"type":"string"},"in":"path","name":"codigo","required":true,"description":"NCM de 8 digitos, com ou sem pontuacao"}],"responses":{"200":{"description":"Default Response"}}}},"/v1/ncm/{codigo}/validar":{"get":{"summary":"Validar um codigo NCM","tags":["NCM"],"description":"Responde apenas se o codigo existe na tabela vigente. Util antes de emitir, quando o NCM vem de cadastro antigo.","parameters":[{"schema":{"type":"string"},"in":"path","name":"codigo","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/issqn/aliquota":{"get":{"summary":"Consultar a aliquota de ISSQN de um servico num municipio","tags":["ISSQN"],"description":"Devolve a **alíquota de ISSQN** vigente para um município e um código de serviço, na data informada.\n\nOs dados vêm do extrato oficial da NFS-e Nacional.\n\n> **A cobertura não é total.** O extrato traz 5.341 dos 5.571 municípios. Faltam 230, entre eles 11 capitais — São Paulo, Rio de Janeiro, Belo Horizonte, Brasília, Fortaleza, Recife, Manaus, Belém, Maceió, Campo Grande e Teresina. Esses municípios mantêm sistema próprio e não alimentam o cadastro nacional; para eles a resposta é `municipio_fora_do_extrato`.\n\n**`aliquota: null` não é alíquota zero.** Significa que o município não publicou o valor. A menor alíquota que existe no arquivo é 2 (o piso da LC 116) e o valor zero não aparece nenhuma vez.\n\nQuando não há resposta, o campo `motivo` diz qual das quatro situações ocorreu: `municipio_fora_do_extrato`, `servico_nao_consta`, `sem_vigencia_na_data` ou `aliquota_nao_informada`.","parameters":[{"schema":{"type":"string"},"in":"query","name":"codigo_ibge","required":true,"description":"Código IBGE do município, 7 dígitos. Ex.: 4106902."},{"schema":{"type":"string"},"in":"query","name":"codigo_servico","required":true,"description":"Código de serviço da NFS-e Nacional. Ex.: 01.01.01.000."},{"schema":{"type":"string"},"in":"query","name":"data","required":false,"description":"Data da prestação (AAAA-MM-DD). Padrão: hoje."}],"responses":{"200":{"description":"Default Response"}}}},"/v1/issqn/municipios/{codigo_ibge}":{"get":{"summary":"Listar as aliquotas vigentes de um municipio","tags":["ISSQN"],"description":"Todas as alíquotas vigentes de um município, para montar um seletor de serviços ou conferir o cadastro de uma vez só.\n\nServiços cuja alíquota o município não publicou vêm com `aliquota: null` — e continuam na lista de propósito: saber que o serviço existe sem alíquota publicada é diferente de não saber nada.","parameters":[{"schema":{"type":"string"},"in":"path","name":"codigo_ibge","required":true,"description":"Código IBGE, 7 dígitos."}],"responses":{"200":{"description":"Default Response"}}}},"/v1/issqn/extracao":{"get":{"summary":"De quando e o dado de aliquotas","tags":["ISSQN"],"description":"Data de referência do extrato carregado e o tamanho da cobertura.\n\nExiste porque \"de quando é essa alíquota?\" é a primeira pergunta de quem for contestar um cálculo — e sem esta rota não haveria resposta.","responses":{"200":{"description":"Default Response"}}}},"/v1/catalogos":{"post":{"summary":"Criar um catálogo para a empresa","tags":["Catálogo"],"description":"O catálogo pertence à **empresa emissora**. Se você emite por várias empresas, cada uma tem o seu, isolado das demais.\n\nCada empresa tem um catálogo: criar um segundo responde `409`. Para recomeçar, desative o atual e crie outro.\n\nGuarde o **`catalogo_id`** da resposta — é por ele que todas as demais rotas do catálogo são chamadas, e você não precisa repetir o CNPJ depois.\n\n**Respostas:** `201` criado · `404` empresa não encontrada nesta conta · `409` a empresa já tem catálogo ativo · `500` erro interno.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["cpf_cnpj","nome"],"properties":{"cpf_cnpj":{"type":"string","description":"CNPJ da empresa emissora, com ou sem máscara. CNPJ alfanumérico é aceito."},"nome":{"type":"string","maxLength":120,"description":"Como você chama este catálogo. Ex.: `Padrão`, `Loja física`."},"descricao":{"type":"string","maxLength":500}},"example":{"cpf_cnpj":"11222333000181","nome":"Padrão","descricao":"Produtos e serviços da operação principal"}}}}},"responses":{"200":{"description":"Default Response"}}},"get":{"summary":"Listar os catálogos de uma empresa","tags":["Catálogo"],"description":"Devolve os catálogos da empresa, com a contagem de itens de cada um. Por padrão só os ativos — use `incluir_inativos` para ver também os desativados.","parameters":[{"schema":{"type":"string"},"in":"query","name":"cpf_cnpj","required":true,"description":"CNPJ da empresa emissora."},{"schema":{"type":"boolean","default":false},"in":"query","name":"incluir_inativos","required":false,"description":"Inclui também os catálogos desativados, para encontrar um e reativá-lo."}],"responses":{"200":{"description":"Default Response"}}}},"/v1/catalogos/{id}":{"get":{"summary":"Ver um catálogo","tags":["Catálogo"],"description":"Use o `catalogo_id` devolvido na criação. A empresa já está vinculada a ele, então não é preciso informar o CNPJ de novo.","parameters":[{"schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"},"in":"path","name":"id","required":true,"description":"O `catalogo_id` devolvido na criacao."}],"responses":{"200":{"description":"Default Response"}}},"put":{"summary":"Renomear ou redescrever um catálogo","tags":["Catálogo"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"nome":{"type":"string","maxLength":120},"descricao":{"type":"string","maxLength":500}}}}}},"parameters":[{"schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"},"in":"path","name":"id","required":true,"description":"O `catalogo_id` devolvido na criacao."}],"responses":{"200":{"description":"Default Response"}}},"delete":{"summary":"Desativar um catálogo","tags":["Catálogo"],"description":"O catálogo sai de uso, e com ele os itens. Nada é apagado: os itens continuam lá e voltam inteiros se você reativar o catálogo.\n\nDesativar libera a empresa para criar um novo catálogo — ou para reativar outro.","parameters":[{"schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"},"in":"path","name":"id","required":true,"description":"O `catalogo_id` devolvido na criacao."}],"responses":{"200":{"description":"Default Response"}}}},"/v1/catalogos/{id}/reativar":{"post":{"summary":"Reativar um catálogo desativado","tags":["Catálogo"],"description":"Traz o catálogo de volta, com todos os itens e exceções como estavam. Nada precisa ser recadastrado.\n\nComo cada empresa tem um catálogo ativo, reativar só funciona se não houver outro ativo na mesma empresa — nesse caso, desative o outro antes.\n\nChamar num catálogo que já está ativo não é erro: responde `200` e nada muda.\n\n**Respostas:** `200` reativado · `404` catálogo não encontrado · `409` a empresa já tem outro catálogo ativo · `500` erro interno.","parameters":[{"schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"},"in":"path","name":"id","required":true,"description":"O `catalogo_id` devolvido na criacao."}],"responses":{"200":{"description":"Default Response"}}}},"/v1/catalogos/{id}/produtos":{"get":{"summary":"Listar produtos do catálogo","tags":["Catálogo"],"description":"Lista paginada. Informe `sku` para filtrar por um item exato — a resposta é a mesma lista, com `total` 1 ou 0.\n\n`busca` procura texto livre em `sku`, `codigo_interno`, `nome` e `descricao`.","parameters":[{"schema":{"type":"string","maxLength":60},"in":"query","name":"sku","required":false,"description":"Filtra pelo `sku` exato."},{"schema":{"type":"string"},"in":"query","name":"busca","required":false,"description":"Texto livre."},{"schema":{"type":"boolean","default":false},"in":"query","name":"incluir_removidos","required":false,"description":"Inclui também os removidos, para encontrar um e reativá-lo."},{"schema":{"type":"integer","minimum":1,"default":1},"in":"query","name":"pagina","required":false},{"schema":{"type":"integer","minimum":1,"maximum":200,"default":50},"in":"query","name":"limite","required":false},{"schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"},"in":"path","name":"id","required":true,"description":"O `catalogo_id` devolvido na criacao."}],"responses":{"200":{"description":"Default Response"}}},"post":{"summary":"Cadastrar produto","tags":["Catálogo"],"description":"O `sku` é o código **seu** para o item, e é por ele que o item é referenciado nas demais rotas. `codigo_interno` é um segundo código livre, para o seu uso — não vai para a nota.\n\n**Respostas:** `201` criado · `400` corpo inválido ou contradição fiscal no bloco `fiscal` · `404` catálogo não encontrado · `409` já existe produto com este código · `500` erro interno.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["sku","nome"],"properties":{"sku":{"type":"string","minLength":1,"maxLength":60,"pattern":"^\\S(.*\\S)?$","description":"Seu código para o item. Barra, espaço e acento são aceitos — é o seu código, não o nosso. Só não pode começar ou terminar com espaço."},"codigo_interno":{"type":"string","maxLength":60,"description":"Seu código interno. Opcional."},"nome":{"type":"string","maxLength":200},"descricao":{"type":"string","maxLength":1000},"unidade":{"type":"string","maxLength":10},"valor_unitario":{"type":"number","minimum":0,"description":"Preço padrão, usado só quando a emissão não informar o valor. Omita para deixar sem preço — `0` significa preço zero, não “não definido”."},"fiscal":{"type":"object","additionalProperties":true,"description":"Bloco fiscal do item, no mesmo formato que a emissão aceita — espelhar a estrutura é o que permite aplicá-lo sem tradução. Os valores são os que **você** declara: o Conota guarda e aplica, não sugere nem corrige.\n\nA única coisa recusada é contradição interna: um CST de tributação de IBS/CBS com todas as alíquotas em zero.\n\nAqui também moram `NCM`, `CEST` e `cEAN`, que não são tributo mas são do item.","properties":{"icms":{"type":"object","additionalProperties":true,"description":"Ex.: `{\"CST\":\"41\",\"orig\":0}` ou `{\"CSOSN\":\"102\",\"orig\":0}`."},"pis":{"type":"object","additionalProperties":true},"cofins":{"type":"object","additionalProperties":true},"ipi":{"type":"object","additionalProperties":true},"ibscbs":{"type":"object","additionalProperties":true,"description":"Reforma tributária. Atenção: `cst` e `classificacao` (cClassTrib) **não são** o CST do ICMS declarado acima — são outro par, com tabela própria.\n\nAs alíquotas são as que você informa, e mudam conforme o ano-calendário.","properties":{"cst":{"type":"string"},"classificacao":{"type":"string"},"ibs_uf":{"type":"object","additionalProperties":true},"ibs_mun":{"type":"object","additionalProperties":true},"cbs":{"type":"object","additionalProperties":true}}}}}},"example":{"sku":"BAL-001-MET","codigo_interno":"INT-4471","nome":"Balão Metalizado","unidade":"UN","valor_unitario":20,"fiscal":{"icms":{"CST":"41","orig":0},"pis":{"CST":"07"},"cofins":{"CST":"07"},"ibscbs":{"cst":"000","classificacao":"000001","ibs_uf":{"aliquota":0.1},"ibs_mun":{"aliquota":0},"cbs":{"aliquota":0.9}}}}}}}},"parameters":[{"schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"},"in":"path","name":"id","required":true,"description":"O `catalogo_id` devolvido na criacao."}],"responses":{"200":{"description":"Default Response"}}},"put":{"summary":"Atualizar produto","tags":["Catálogo"],"description":"**Substitui o item inteiro.** Campos omitidos ficam vazios, e `fiscal` é trocado por completo — não é mesclado com o que estava lá.\n\nPara alterar um campo só: liste o produto com `?sku=`, altere o que precisa e devolva o objeto completo aqui.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["nome"],"properties":{"codigo_interno":{"type":"string","maxLength":60},"nome":{"type":"string","maxLength":200},"descricao":{"type":"string","maxLength":1000},"unidade":{"type":"string","maxLength":10},"valor_unitario":{"type":"number","minimum":0,"description":"Preço padrão, usado só quando a emissão não informar o valor. Omita para deixar sem preço — `0` significa preço zero, não “não definido”."},"fiscal":{"type":"object","additionalProperties":true,"description":"Bloco fiscal do item, no mesmo formato que a emissão aceita — espelhar a estrutura é o que permite aplicá-lo sem tradução. Os valores são os que **você** declara: o Conota guarda e aplica, não sugere nem corrige.\n\nA única coisa recusada é contradição interna: um CST de tributação de IBS/CBS com todas as alíquotas em zero.\n\nAqui também moram `NCM`, `CEST` e `cEAN`, que não são tributo mas são do item.","properties":{"icms":{"type":"object","additionalProperties":true,"description":"Ex.: `{\"CST\":\"41\",\"orig\":0}` ou `{\"CSOSN\":\"102\",\"orig\":0}`."},"pis":{"type":"object","additionalProperties":true},"cofins":{"type":"object","additionalProperties":true},"ipi":{"type":"object","additionalProperties":true},"ibscbs":{"type":"object","additionalProperties":true,"description":"Reforma tributária. Atenção: `cst` e `classificacao` (cClassTrib) **não são** o CST do ICMS declarado acima — são outro par, com tabela própria.\n\nAs alíquotas são as que você informa, e mudam conforme o ano-calendário.","properties":{"cst":{"type":"string"},"classificacao":{"type":"string"},"ibs_uf":{"type":"object","additionalProperties":true},"ibs_mun":{"type":"object","additionalProperties":true},"cbs":{"type":"object","additionalProperties":true}}}}}}}}}},"parameters":[{"schema":{"type":"string","maxLength":60},"in":"query","name":"sku","required":true,"description":"O `sku` do item, exatamente como cadastrado."},{"schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"},"in":"path","name":"id","required":true,"description":"O `catalogo_id` devolvido na criacao."}],"responses":{"200":{"description":"Default Response"}}},"delete":{"summary":"Remover produto","tags":["Catálogo"],"description":"O produto sai das listagens e o código fica livre para ser cadastrado de novo. Nada é apagado — as exceções continuam guardadas e voltam inteiras se você reativar.\n\nCadastrar o mesmo código de novo **não** é a mesma coisa que reativar: o cadastro novo nasce sem exceção nenhuma.","parameters":[{"schema":{"type":"string","maxLength":60},"in":"query","name":"sku","required":true,"description":"O `sku` do item, exatamente como cadastrado."},{"schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"},"in":"path","name":"id","required":true,"description":"O `catalogo_id` devolvido na criacao."}],"responses":{"200":{"description":"Default Response"}}}},"/v1/catalogos/{id}/produtos/reativar":{"post":{"summary":"Reativar produto removido","tags":["Catálogo"],"description":"Traz o produto de volta **com as exceções que ele tinha**. Isso é o que diferencia reativar de cadastrar de novo: o cadastro novo nasce sem nenhuma exceção, e para um item com uma dezena de municípios isso significa refazer todos.\n\nSó funciona se não houver outro produto ativo com o mesmo código — nesse caso, remova o outro antes.\n\nChamar num produto que já está ativo não é erro: responde `200` e nada muda.\n\n**Respostas:** `200` reativado · `404` catálogo ou item não encontrado · `409` já existe outro ativo com este código · `500` erro interno.","parameters":[{"schema":{"type":"string","maxLength":60},"in":"query","name":"sku","required":true,"description":"O `sku` do item, exatamente como cadastrado."},{"schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"},"in":"path","name":"id","required":true,"description":"O `catalogo_id` devolvido na criacao."}],"responses":{"200":{"description":"Default Response"}}}},"/v1/catalogos/{id}/produtos/excecoes":{"get":{"summary":"Listar as exceções de produto","tags":["Catálogo"],"parameters":[{"schema":{"type":"string","maxLength":60},"in":"query","name":"sku","required":true,"description":"O `sku` do item, exatamente como cadastrado."},{"schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"},"in":"path","name":"id","required":true,"description":"O `catalogo_id` devolvido na criacao."}],"responses":{"200":{"description":"Default Response"}}},"put":{"summary":"Definir exceção de produto","tags":["Catálogo"],"description":"Define o bloco fiscal que vale quando a condição bater — por exemplo, um município que exige códigos diferentes dos que você usa no resto do país.\n\nChamar de novo na mesma condição substitui a exceção anterior. A condição é o próprio endereço, então não há identificador a guardar.\n\n> **A exceção substitui o bloco `fiscal` inteiro** — não é mesclada com o padrão do item. Para uma cidade onde só falta um campo, liste o produto com `?sku=`, acrescente o campo e mande o bloco completo aqui.\n\nCondições aceitas: `municipio` (código IBGE, 7 dígitos).\n\n**Respostas:** `200` definida · `400` condição não suportada, bloco vazio ou contradição fiscal · `404` catálogo ou produto não encontrado · `500` erro interno.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["fiscal"],"properties":{"fiscal":{"type":"object","additionalProperties":true,"description":"Bloco fiscal do item, no mesmo formato que a emissão aceita — espelhar a estrutura é o que permite aplicá-lo sem tradução. Os valores são os que **você** declara: o Conota guarda e aplica, não sugere nem corrige.\n\nA única coisa recusada é contradição interna: um CST de tributação de IBS/CBS com todas as alíquotas em zero.\n\nAqui também moram `NCM`, `CEST` e `cEAN`, que não são tributo mas são do item.","properties":{"icms":{"type":"object","additionalProperties":true,"description":"Ex.: `{\"CST\":\"41\",\"orig\":0}` ou `{\"CSOSN\":\"102\",\"orig\":0}`."},"pis":{"type":"object","additionalProperties":true},"cofins":{"type":"object","additionalProperties":true},"ipi":{"type":"object","additionalProperties":true},"ibscbs":{"type":"object","additionalProperties":true,"description":"Reforma tributária. Atenção: `cst` e `classificacao` (cClassTrib) **não são** o CST do ICMS declarado acima — são outro par, com tabela própria.\n\nAs alíquotas são as que você informa, e mudam conforme o ano-calendário.","properties":{"cst":{"type":"string"},"classificacao":{"type":"string"},"ibs_uf":{"type":"object","additionalProperties":true},"ibs_mun":{"type":"object","additionalProperties":true},"cbs":{"type":"object","additionalProperties":true}}}}}}}}}},"parameters":[{"schema":{"type":"string","maxLength":60},"in":"query","name":"sku","required":true,"description":"O `sku` do item, exatamente como cadastrado."},{"schema":{"type":"string"},"in":"query","name":"tipo","required":true,"description":"Condição da exceção. Aceita: `municipio`."},{"schema":{"type":"string"},"in":"query","name":"valor","required":true,"description":"Para `municipio`: o código IBGE com 7 dígitos."},{"schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"},"in":"path","name":"id","required":true,"description":"O `catalogo_id` devolvido na criacao."}],"responses":{"200":{"description":"Default Response"}}},"delete":{"summary":"Apagar exceção de produto","tags":["Catálogo"],"description":"Apagada a exceção, aquela condição volta a usar o bloco padrão do item.","parameters":[{"schema":{"type":"string","maxLength":60},"in":"query","name":"sku","required":true,"description":"O `sku` do item, exatamente como cadastrado."},{"schema":{"type":"string"},"in":"query","name":"tipo","required":true},{"schema":{"type":"string"},"in":"query","name":"valor","required":true},{"schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"},"in":"path","name":"id","required":true,"description":"O `catalogo_id` devolvido na criacao."}],"responses":{"200":{"description":"Default Response"}}}},"/v1/catalogos/{id}/produtos/resolver":{"get":{"summary":"Resolver o bloco fiscal de produto para uma condição","tags":["Catálogo"],"description":"Diz qual bloco `fiscal` se aplica, e **por quê**: `aplicado` vem `excecao` quando houver uma para a condição informada, e `padrao` quando não houver.\n\nIsto não é recomendação fiscal — é o seu próprio cadastro, resolvido.","parameters":[{"schema":{"type":"string","maxLength":60},"in":"query","name":"sku","required":true,"description":"O `sku` do item, exatamente como cadastrado."},{"schema":{"type":"string"},"in":"query","name":"municipio","required":false,"description":"Código IBGE do município, 7 dígitos."},{"schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"},"in":"path","name":"id","required":true,"description":"O `catalogo_id` devolvido na criacao."}],"responses":{"200":{"description":"Default Response"}}}},"/v1/catalogos/{id}/servicos":{"get":{"summary":"Listar servicos do catálogo","tags":["Catálogo"],"description":"Lista paginada. Informe `codigo` para filtrar por um item exato — a resposta é a mesma lista, com `total` 1 ou 0.\n\n`busca` procura texto livre em `codigo`, `codigo_interno`, `nome` e `descricao`.","parameters":[{"schema":{"type":"string","maxLength":60},"in":"query","name":"codigo","required":false,"description":"Filtra pelo `codigo` exato."},{"schema":{"type":"string"},"in":"query","name":"busca","required":false,"description":"Texto livre."},{"schema":{"type":"boolean","default":false},"in":"query","name":"incluir_removidos","required":false,"description":"Inclui também os removidos, para encontrar um e reativá-lo."},{"schema":{"type":"integer","minimum":1,"default":1},"in":"query","name":"pagina","required":false},{"schema":{"type":"integer","minimum":1,"maximum":200,"default":50},"in":"query","name":"limite","required":false},{"schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"},"in":"path","name":"id","required":true,"description":"O `catalogo_id` devolvido na criacao."}],"responses":{"200":{"description":"Default Response"}}},"post":{"summary":"Cadastrar servico","tags":["Catálogo"],"description":"O `codigo` é o código **seu** para o item, e é por ele que o item é referenciado nas demais rotas. `codigo_interno` é um segundo código livre, para o seu uso — não vai para a nota.\n\n**Respostas:** `201` criado · `400` corpo inválido ou contradição fiscal no bloco `fiscal` · `404` catálogo não encontrado · `409` já existe servico com este código · `500` erro interno.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["codigo","nome"],"properties":{"codigo":{"type":"string","minLength":1,"maxLength":60,"pattern":"^\\S(.*\\S)?$","description":"Seu código para o item. Barra, espaço e acento são aceitos — é o seu código, não o nosso. Só não pode começar ou terminar com espaço."},"codigo_interno":{"type":"string","maxLength":60,"description":"Seu código interno. Opcional."},"nome":{"type":"string","maxLength":200},"descricao":{"type":"string","maxLength":1000},"unidade":{"type":"string","maxLength":10},"valor_unitario":{"type":"number","minimum":0,"description":"Preço padrão, usado só quando a emissão não informar o valor. Omita para deixar sem preço — `0` significa preço zero, não “não definido”."},"fiscal":{"type":"object","additionalProperties":true,"description":"Bloco fiscal do item, no mesmo formato que a emissão aceita — espelhar a estrutura é o que permite aplicá-lo sem tradução. Os valores são os que **você** declara: o Conota guarda e aplica, não sugere nem corrige.\n\nCada chave é um nó do **DPS**: `cServ` (o que está em `serv.cServ`), `tribMun` (de `valores.trib.tribMun`) e `IBSCBS`.\n\nNão entram aqui o município de prestação nem os valores — eles mudam a cada nota. Para um município que exija códigos diferentes, use uma **exceção**.","properties":{"cServ":{"type":"object","additionalProperties":true,"description":"Códigos do serviço: `cTribNac`, `cNBS`, `cTribMun` quando o município exigir."},"tribMun":{"type":"object","additionalProperties":true,"description":"Tributação municipal: `tribISSQN`, `tpRetISSQN`, `pAliq` quando você a informa."},"IBSCBS":{"type":"object","additionalProperties":true,"description":"Reforma tributária, na estrutura do DPS — `finNFSe`, `indFinal`, `cIndOp`, `indDest` e `valores.trib.gIBSCBS` com `CST` e `cClassTrib`."}}}},"example":{"codigo":"RECREACAO","codigo_interno":"SRV-12","nome":"Recreação e animação infantil","unidade":"UN","fiscal":{"cServ":{"cTribNac":"121701","cNBS":"125080000"},"tribMun":{"tribISSQN":1,"tpRetISSQN":1},"IBSCBS":{"finNFSe":0,"indFinal":1,"cIndOp":"030104","indDest":0,"valores":{"trib":{"gIBSCBS":{"CST":"000","cClassTrib":"000001"}}}}}}}}}},"parameters":[{"schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"},"in":"path","name":"id","required":true,"description":"O `catalogo_id` devolvido na criacao."}],"responses":{"200":{"description":"Default Response"}}},"put":{"summary":"Atualizar servico","tags":["Catálogo"],"description":"**Substitui o item inteiro.** Campos omitidos ficam vazios, e `fiscal` é trocado por completo — não é mesclado com o que estava lá.\n\nPara alterar um campo só: liste o servico com `?codigo=`, altere o que precisa e devolva o objeto completo aqui.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["nome"],"properties":{"codigo_interno":{"type":"string","maxLength":60},"nome":{"type":"string","maxLength":200},"descricao":{"type":"string","maxLength":1000},"unidade":{"type":"string","maxLength":10},"valor_unitario":{"type":"number","minimum":0,"description":"Preço padrão, usado só quando a emissão não informar o valor. Omita para deixar sem preço — `0` significa preço zero, não “não definido”."},"fiscal":{"type":"object","additionalProperties":true,"description":"Bloco fiscal do item, no mesmo formato que a emissão aceita — espelhar a estrutura é o que permite aplicá-lo sem tradução. Os valores são os que **você** declara: o Conota guarda e aplica, não sugere nem corrige.\n\nCada chave é um nó do **DPS**: `cServ` (o que está em `serv.cServ`), `tribMun` (de `valores.trib.tribMun`) e `IBSCBS`.\n\nNão entram aqui o município de prestação nem os valores — eles mudam a cada nota. Para um município que exija códigos diferentes, use uma **exceção**.","properties":{"cServ":{"type":"object","additionalProperties":true,"description":"Códigos do serviço: `cTribNac`, `cNBS`, `cTribMun` quando o município exigir."},"tribMun":{"type":"object","additionalProperties":true,"description":"Tributação municipal: `tribISSQN`, `tpRetISSQN`, `pAliq` quando você a informa."},"IBSCBS":{"type":"object","additionalProperties":true,"description":"Reforma tributária, na estrutura do DPS — `finNFSe`, `indFinal`, `cIndOp`, `indDest` e `valores.trib.gIBSCBS` com `CST` e `cClassTrib`."}}}}}}}},"parameters":[{"schema":{"type":"string","maxLength":60},"in":"query","name":"codigo","required":true,"description":"O `codigo` do item, exatamente como cadastrado."},{"schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"},"in":"path","name":"id","required":true,"description":"O `catalogo_id` devolvido na criacao."}],"responses":{"200":{"description":"Default Response"}}},"delete":{"summary":"Remover servico","tags":["Catálogo"],"description":"O servico sai das listagens e o código fica livre para ser cadastrado de novo. Nada é apagado — as exceções continuam guardadas e voltam inteiras se você reativar.\n\nCadastrar o mesmo código de novo **não** é a mesma coisa que reativar: o cadastro novo nasce sem exceção nenhuma.","parameters":[{"schema":{"type":"string","maxLength":60},"in":"query","name":"codigo","required":true,"description":"O `codigo` do item, exatamente como cadastrado."},{"schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"},"in":"path","name":"id","required":true,"description":"O `catalogo_id` devolvido na criacao."}],"responses":{"200":{"description":"Default Response"}}}},"/v1/catalogos/{id}/servicos/reativar":{"post":{"summary":"Reativar servico removido","tags":["Catálogo"],"description":"Traz o servico de volta **com as exceções que ele tinha**. Isso é o que diferencia reativar de cadastrar de novo: o cadastro novo nasce sem nenhuma exceção, e para um item com uma dezena de municípios isso significa refazer todos.\n\nSó funciona se não houver outro servico ativo com o mesmo código — nesse caso, remova o outro antes.\n\nChamar num servico que já está ativo não é erro: responde `200` e nada muda.\n\n**Respostas:** `200` reativado · `404` catálogo ou item não encontrado · `409` já existe outro ativo com este código · `500` erro interno.","parameters":[{"schema":{"type":"string","maxLength":60},"in":"query","name":"codigo","required":true,"description":"O `codigo` do item, exatamente como cadastrado."},{"schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"},"in":"path","name":"id","required":true,"description":"O `catalogo_id` devolvido na criacao."}],"responses":{"200":{"description":"Default Response"}}}},"/v1/catalogos/{id}/servicos/excecoes":{"get":{"summary":"Listar as exceções de servico","tags":["Catálogo"],"parameters":[{"schema":{"type":"string","maxLength":60},"in":"query","name":"codigo","required":true,"description":"O `codigo` do item, exatamente como cadastrado."},{"schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"},"in":"path","name":"id","required":true,"description":"O `catalogo_id` devolvido na criacao."}],"responses":{"200":{"description":"Default Response"}}},"put":{"summary":"Definir exceção de servico","tags":["Catálogo"],"description":"Define o bloco fiscal que vale quando a condição bater — por exemplo, um município que exige códigos diferentes dos que você usa no resto do país.\n\nChamar de novo na mesma condição substitui a exceção anterior. A condição é o próprio endereço, então não há identificador a guardar.\n\n> **A exceção substitui o bloco `fiscal` inteiro** — não é mesclada com o padrão do item. Para uma cidade onde só falta um campo, liste o servico com `?codigo=`, acrescente o campo e mande o bloco completo aqui.\n\nCondições aceitas: `municipio` (código IBGE, 7 dígitos).\n\n**Respostas:** `200` definida · `400` condição não suportada, bloco vazio ou contradição fiscal · `404` catálogo ou servico não encontrado · `500` erro interno.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["fiscal"],"properties":{"fiscal":{"type":"object","additionalProperties":true,"description":"Bloco fiscal do item, no mesmo formato que a emissão aceita — espelhar a estrutura é o que permite aplicá-lo sem tradução. Os valores são os que **você** declara: o Conota guarda e aplica, não sugere nem corrige.\n\nCada chave é um nó do **DPS**: `cServ` (o que está em `serv.cServ`), `tribMun` (de `valores.trib.tribMun`) e `IBSCBS`.\n\nNão entram aqui o município de prestação nem os valores — eles mudam a cada nota. Para um município que exija códigos diferentes, use uma **exceção**.","properties":{"cServ":{"type":"object","additionalProperties":true,"description":"Códigos do serviço: `cTribNac`, `cNBS`, `cTribMun` quando o município exigir."},"tribMun":{"type":"object","additionalProperties":true,"description":"Tributação municipal: `tribISSQN`, `tpRetISSQN`, `pAliq` quando você a informa."},"IBSCBS":{"type":"object","additionalProperties":true,"description":"Reforma tributária, na estrutura do DPS — `finNFSe`, `indFinal`, `cIndOp`, `indDest` e `valores.trib.gIBSCBS` com `CST` e `cClassTrib`."}}}}}}}},"parameters":[{"schema":{"type":"string","maxLength":60},"in":"query","name":"codigo","required":true,"description":"O `codigo` do item, exatamente como cadastrado."},{"schema":{"type":"string"},"in":"query","name":"tipo","required":true,"description":"Condição da exceção. Aceita: `municipio`."},{"schema":{"type":"string"},"in":"query","name":"valor","required":true,"description":"Para `municipio`: o código IBGE com 7 dígitos."},{"schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"},"in":"path","name":"id","required":true,"description":"O `catalogo_id` devolvido na criacao."}],"responses":{"200":{"description":"Default Response"}}},"delete":{"summary":"Apagar exceção de servico","tags":["Catálogo"],"description":"Apagada a exceção, aquela condição volta a usar o bloco padrão do item.","parameters":[{"schema":{"type":"string","maxLength":60},"in":"query","name":"codigo","required":true,"description":"O `codigo` do item, exatamente como cadastrado."},{"schema":{"type":"string"},"in":"query","name":"tipo","required":true},{"schema":{"type":"string"},"in":"query","name":"valor","required":true},{"schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"},"in":"path","name":"id","required":true,"description":"O `catalogo_id` devolvido na criacao."}],"responses":{"200":{"description":"Default Response"}}}},"/v1/catalogos/{id}/servicos/resolver":{"get":{"summary":"Resolver o bloco fiscal de servico para uma condição","tags":["Catálogo"],"description":"Diz qual bloco `fiscal` se aplica, e **por quê**: `aplicado` vem `excecao` quando houver uma para a condição informada, e `padrao` quando não houver.\n\nIsto não é recomendação fiscal — é o seu próprio cadastro, resolvido.","parameters":[{"schema":{"type":"string","maxLength":60},"in":"query","name":"codigo","required":true,"description":"O `codigo` do item, exatamente como cadastrado."},{"schema":{"type":"string"},"in":"query","name":"municipio","required":false,"description":"Código IBGE do município, 7 dígitos."},{"schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"},"in":"path","name":"id","required":true,"description":"O `catalogo_id` devolvido na criacao."}],"responses":{"200":{"description":"Default Response"}}}},"/v1/nfse-nacional/emitir":{"post":{"summary":"Emitir NFS-e — Padrão Nacional, motor próprio (assíncrono)","tags":["NFS-e"],"description":"Enfileira a emissão de uma NFS-e no Padrão Nacional pelo motor próprio do Conota. A DPS é montada e validada contra o XSD oficial antes do envio, e cada erro de leiaute volta com o caminho do campo.\n\nAcompanhe o resultado por `GET /v1/nfse/consultar/{job_id}` ou pelo webhook. Consulta, arquivos e cancelamento usam as rotas `/v1/nfse` de sempre.\n\nAntes de emitir, confira o payload em `POST /v1/nfse-nacional/validar`, que não consome cota nem numeração.\n\n**Leiautes (`versao`)**\n\n| Valor | Leiaute |\n|---|---|\n| `1.01` | XSD oficial de 09/02/2026. É o padrão quando `versao` é omitido. |\n| `1.01-20261020` | XSD oficial publicado em 20/10/2026 para a Produção Restrita (homologação), com parte da NT 009. |\n| `1.01-nt009` | Leiaute completo da NT 009, com condomínios. Provisório até a publicação do XSD oficial. |\n\n**O que muda no leiaute `1.01-20261020`**\n\n- `finNFSe` sai de `IBSCBS` e vai para `infDPS`, logo depois de `tpEmit`. Passa a ser obrigatório.\n- `CST` e `cClassTrib` sobem de `IBSCBS.valores.trib.gIBSCBS` para `IBSCBS.valores.trib`. O `gIBSCBS` fica opcional e guarda só `cCredPres`, `gTribRegular` e `gDif`.\n- `cIndOp` passa a ser opcional.\n- A dedução/redução (`gDedRed`) e o reembolso (`gReeRepRes`) dão lugar ao ajuste da base de cálculo (`gAjusteBC`).\n- Novos grupos: `IBSCBS.imovel.gLocacao`, `IBSCBS.imovel.gUnidImob` e `IBSCBS.bensMoveis`.\n\nUm campo enviado na posição de outro leiaute é recusado com `campo não existe no leiaute`. Em produção, continue no `1.01` até a Sefin adotar o novo XSD.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["cpf_cnpj","nota"],"additionalProperties":true,"properties":{"cpf_cnpj":{"type":"string","description":"CNPJ/CPF do prestador. Aceita com ou sem máscara. CNPJ alfanumérico é aceito."},"nota":{"type":"object","additionalProperties":true,"description":"Objeto com `infDPS` no leiaute escolhido em `versao`. Quando omitidos, são preenchidos a partir do cadastro: prestador (CNPJ/CPF, IM e `regTrib`), `cLocEmi`, `tpAmb`, `dhEmi`, `dCompet`, `serie` e `nDPS`. Envie `\"IM\": null` para não informar a inscrição municipal; a Sefin recusa a IM (E0120) quando o município não tem dados do prestador no CNC. Com IBS/CBS, informe `serv.cServ.cNBS` e `IBSCBS.cIndOp` conforme a correlação item × NBS × IndOp × cClassTrib (Anexo VIII da NT 004). Dependendo do `cIndOp`, o endereço do tomador também é obrigatório (E0234)."},"versao":{"type":"string","enum":["1.01","1.01-20261020","1.01-nt009"],"description":"Leiaute da DPS. Omitido, usa `1.01`. Ver a tabela de leiautes na descrição da rota."},"webhook_url":{"type":"string","format":"uri","maxLength":2048,"description":"URL https para notificação ao finalizar. Precisa ser https, em host público e porta padrão; redirecionamento não é seguido."},"referencia_externa":{"type":"string","maxLength":120,"description":"Opcional. Id único do seu lado (até 120 chars). Reenviar a MESMA referência devolve o job existente (HTTP 200, idempotente:true) em vez de reemitir."}},"example":{"cpf_cnpj":"string","referencia_externa":"PEDIDO-12345","versao":"1.01","nota":{"infDPS":{"dCompet":"string","toma":{"CPF":"string","xNome":"string","email":"string","end":{"endNac":{"cMun":"string","CEP":"string"},"xLgr":"string","nro":"string","xBairro":"string"}},"serv":{"locPrest":{"cLocPrestacao":"string"},"cServ":{"cTribNac":"string","xDescServ":"string","cNBS":"string"}},"valores":{"vServPrest":{"vServ":0},"trib":{"tribMun":{"tribISSQN":"string","tpRetISSQN":"string","pAliq":0},"totTrib":{"indTotTrib":"string"}}},"IBSCBS":{"finNFSe":"string","cIndOp":"string","indDest":"string","valores":{"trib":{"gIBSCBS":{"CST":"string","cClassTrib":"string"}}}}}}}}}}},"responses":{"200":{"description":"Default Response"}}}},"/v1/nfse-nacional/condominios/emitir":{"post":{"summary":"Emitir NFS-e de condomínio (subitem 99.05, NT 009)","tags":["NFS-e"],"description":"Mesma emissão do POST /v1/nfse-nacional/emitir, já no leiaute da NT 009, com os grupos IBSCBS.imovel e IBSCBS.condominios (cobranças, detalhamento e descontos). Antes do envio são conferidas as regras da NT: vServ = soma das cobranças, descontos batendo com vDescCondIncond, tipo de cobrança sem repetição e grupo do imóvel presente.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["cpf_cnpj","nota"],"additionalProperties":true,"properties":{"cpf_cnpj":{"type":"string","description":"CNPJ/CPF do prestador. Aceita com ou sem máscara. CNPJ alfanumérico é aceito."},"nota":{"type":"object","additionalProperties":true,"description":"Objeto com `infDPS` no leiaute escolhido em `versao`. Quando omitidos, são preenchidos a partir do cadastro: prestador (CNPJ/CPF, IM e `regTrib`), `cLocEmi`, `tpAmb`, `dhEmi`, `dCompet`, `serie` e `nDPS`. Envie `\"IM\": null` para não informar a inscrição municipal; a Sefin recusa a IM (E0120) quando o município não tem dados do prestador no CNC. Com IBS/CBS, informe `serv.cServ.cNBS` e `IBSCBS.cIndOp` conforme a correlação item × NBS × IndOp × cClassTrib (Anexo VIII da NT 004). Dependendo do `cIndOp`, o endereço do tomador também é obrigatório (E0234)."},"versao":{"type":"string","enum":["1.01","1.01-20261020","1.01-nt009"],"description":"Leiaute da DPS. Omitido, usa o leiaute da NT 009."},"webhook_url":{"type":"string","format":"uri","maxLength":2048,"description":"URL https para notificação ao finalizar. Precisa ser https, em host público e porta padrão; redirecionamento não é seguido."},"referencia_externa":{"type":"string","maxLength":120,"description":"Opcional. Id único do seu lado (até 120 chars). Reenviar a MESMA referência devolve o job existente (HTTP 200, idempotente:true) em vez de reemitir."}},"example":{"cpf_cnpj":"string","referencia_externa":"COND-UNID101-2026-12","nota":{"infDPS":{"dCompet":"string","finNFSe":"0","indDest":"0","toma":{"CPF":"string","xNome":"string"},"serv":{"locPrest":{"cLocPrestacao":"string"},"cServ":{"cTribNac":"990501","xDescServ":"string"}},"valores":{"vServPrest":{"vServ":715},"vDescCondIncond":{"vDescCond":35.75}},"IBSCBS":{"imovel":{"cMun":"string","gUnidImob":[{"end":{"CEP":"string","xLgr":"string","nro":"string","xCpl":"string"}}]},"condominios":{"dVencOrig":"string","gCobranca":[{"tpCobranca":"01","vCobranca":650},{"tpCobranca":"05","vCobranca":65}],"gDesconto":[{"tpDesconto":"2","vDesconto":35.75,"xTpDesconto":"string"}]},"valores":{"trib":{"CST":"string","cClassTrib":"string"}}}}}}}}}},"responses":{"200":{"description":"Default Response"}}}},"/v1/nfse-nacional/validar":{"post":{"summary":"Validar DPS do Padrão Nacional (sem emitir)","tags":["NFS-e"],"description":"Monta a DPS como a emissão montaria e valida contra o XSD e as regras de condomínio, sem assinar, sem enviar e sem consumir cota ou numeração. Devolve o XML gerado e cada erro com o caminho do campo. Use o mesmo `versao` da emissão.\n\n**Leiautes (`versao`)**\n\n| Valor | Leiaute |\n|---|---|\n| `1.01` | XSD oficial de 09/02/2026. É o padrão quando `versao` é omitido. |\n| `1.01-20261020` | XSD oficial publicado em 20/10/2026 para a Produção Restrita (homologação), com parte da NT 009. |\n| `1.01-nt009` | Leiaute completo da NT 009, com condomínios. Provisório até a publicação do XSD oficial. |\n\n**O que muda no leiaute `1.01-20261020`**\n\n- `finNFSe` sai de `IBSCBS` e vai para `infDPS`, logo depois de `tpEmit`. Passa a ser obrigatório.\n- `CST` e `cClassTrib` sobem de `IBSCBS.valores.trib.gIBSCBS` para `IBSCBS.valores.trib`. O `gIBSCBS` fica opcional e guarda só `cCredPres`, `gTribRegular` e `gDif`.\n- `cIndOp` passa a ser opcional.\n- A dedução/redução (`gDedRed`) e o reembolso (`gReeRepRes`) dão lugar ao ajuste da base de cálculo (`gAjusteBC`).\n- Novos grupos: `IBSCBS.imovel.gLocacao`, `IBSCBS.imovel.gUnidImob` e `IBSCBS.bensMoveis`.\n\nUm campo enviado na posição de outro leiaute é recusado com `campo não existe no leiaute`. Em produção, continue no `1.01` até a Sefin adotar o novo XSD.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["cpf_cnpj","nota"],"additionalProperties":true,"properties":{"cpf_cnpj":{"type":"string","description":"CNPJ/CPF do prestador. Aceita com ou sem máscara. CNPJ alfanumérico é aceito."},"nota":{"type":"object","additionalProperties":true,"description":"Objeto com infDPS."},"versao":{"type":"string","enum":["1.01","1.01-20261020","1.01-nt009"],"description":"Leiaute da DPS. Omitido, usa `1.01`, ou `1.01-nt009` quando o `cTribNac` é de condomínio (99.05)."}}}}}},"responses":{"200":{"description":"Default Response"}}}},"/v1/nfe/emitir":{"post":{"summary":"Emitir NF-e (assincrono)","tags":["NF-e"],"description":"Enfileira a emissao de uma NF-e. Retorna um job_id; acompanhe via GET /nfe/consultar/{id} ou webhook.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["cpf_cnpj","nota"],"additionalProperties":true,"properties":{"cpf_cnpj":{"type":"string","description":"CNPJ/CPF do emitente. Aceita com ou sem máscara. **CNPJ alfanumérico (NT Conjunta 2025.001) é aceito** — 12 posições alfanuméricas + 2 dígitos verificadores, ex.: `00.000.000/E08G-12`."},"nota":{"type":"object","additionalProperties":true,"description":"Dados da NF-e: identificacao, emitente, destinatario, produtos[], total, pagamentos[]... (veja a Referencia de Campos na documentacao). REFORMA TRIBUTARIA (IBS/CBS/IS): por item, envie o grupo produtos[].ibscbs { cst, classificacao (cClassTrib), ibs_uf/ibs_mun/cbs: {valor_bc, aliquota, valor} } e, no nivel da nota, ibscbs_total. IMPORTANTE: para itens IMUNES/isentos (ex.: livro, CST 410) envie APENAS { cst, classificacao } — SEM os sub-grupos ibs_uf/ibs_mun/cbs e SEM ibscbs_total (o CST de imunidade veda o grupo de calculo). Imposto Seletivo vai em produtos[].is_ e is_total. INFORMACOES COMPLEMENTARES (OBS): envie em informacoes_adicionais { infCpl, infAdFisco } (ate 5000 caracteres no infCpl). O XML nao aceita quebra de linha: cada \\n vira \"; \". Para o DANFE quebrar a linha nesses pontos, envie danfe_config { quebrar_linha_obs: true } dentro de nota."},"webhook_url":{"type":"string","format":"uri","maxLength":2048,"description":"URL https para notificacao ao finalizar. Precisa ser https, em host publico e porta padrao; redirecionamento nao e seguido."},"referencia_externa":{"type":"string","maxLength":120,"description":"Opcional. Id unico do seu lado (letras/numeros, ate 120 chars; ex.: UUID). Idempotente por tenant: reenviar a MESMA referencia devolve o job existente (HTTP 200, idempotente:true) em vez de reemitir a nota. Para corrigir e reemitir uma nota que falhou, use uma NOVA referencia. Tambem permite localizar a emissao depois via GET /v1/jobs/localizar?ref=... mesmo sem o job_id."}},"example":{"cpf_cnpj":"string","referencia_externa":"PEDIDO-12345","nota":{"identificacao":{"natOp":"string","mod":0,"serie":0,"nNF":0,"dhEmi":"string","tpNF":0,"idDest":0,"cMunFG":0,"tpImp":0,"tpEmis":0,"finNFe":0,"indFinal":0,"indPres":0,"procEmi":0,"verProc":"string"},"emitente":{"CNPJCPF":"string","xNome":"string","xFant":"string","CRT":0,"IE":"string","xLgr":"string","nro":"string","xBairro":"string","cMun":0,"xMun":"string","UF":"string","cUF":0,"CEP":"string","cPais":0,"xPais":"string","Fone":"string"},"destinatario":{"CNPJCPF":"string","xNome":"string","indIEDest":0,"xLgr":"string","nro":"string","xBairro":"string","cMun":0,"xMun":"string","UF":"string","CEP":"string"},"produtos":[{"cProd":"string","cEAN":"string","xProd":"string","NCM":"string","CFOP":0,"uCom":"string","qCom":0,"vUnCom":0,"vProd":0,"cEANTrib":"string","uTrib":"string","qTrib":0,"vUnTrib":0,"indTot":0,"icms":{"orig":0,"CST":"string"},"pis":{"CST":"string"},"cofins":{"CST":"string"},"ibscbs":{"cst":"string","classificacao":"string","ibs_uf":{"valor_bc":0,"aliquota":0,"valor":0},"ibs_mun":{"valor_bc":0,"aliquota":0,"valor":0},"cbs":{"valor_bc":0,"aliquota":0,"valor":0}}}],"total":{"vProd":0,"vNF":0},"ibscbs_total":{"vBCIBSCBS":0,"ibs":{"vIBS":0,"uf":{"vIBSUF":0},"mun":{"vIBSMun":0}},"cbs":{"vCBS":0}},"transportador":{"modFrete":0},"pagamentos":[{"tPag":"string","vPag":0,"indPag":0}]}}}}}},"responses":{"200":{"description":"Default Response"}}}},"/v1/nfe/cancelar":{"post":{"summary":"Cancelar NF-e","tags":["NF-e"],"description":"Solicita o cancelamento de uma NF-e autorizada. Informe job_id (da emissao) OU chave, e a justificativa (min. 15 caracteres).","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["cpf_cnpj"],"additionalProperties":true,"properties":{"cpf_cnpj":{"type":"string"},"job_id":{"type":"string"},"chave":{"type":"string"},"justificativa":{"type":"string"},"webhook_url":{"type":"string","format":"uri","maxLength":2048,"description":"URL https para notificacao ao finalizar. Precisa ser https, em host publico e porta padrao; redirecionamento nao e seguido."}},"example":{"cpf_cnpj":"string","job_id":"string","justificativa":"string"}}}}},"responses":{"200":{"description":"Default Response"}}}},"/v1/nfe/consultar/{id}":{"get":{"summary":"Consultar job de NF-e","tags":["NF-e"],"description":"Retorna o status e o resultado de um job de NF-e (status, dados da nota, arquivos disponiveis).","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"ID do job (UUID)"}],"responses":{"200":{"description":"Default Response"}}}},"/v1/nfe/{id}/file/{tipo}":{"get":{"summary":"Baixar arquivo da NF-e","tags":["NF-e"],"description":"Download direto do arquivo (binario) de um job de NF-e. O `pdf` aqui e o DANFE em A4. Nao sabe o que o job produziu? GET /v1/jobs/{id}/arquivos lista o que existe. Job de cancelamento tem xml_cancelamento e log, mas NAO tem xml.","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"ID do job"},{"schema":{"type":"string","enum":["xml","xml_cancelamento","pdf","log"]},"in":"path","name":"tipo","required":true,"description":"xml, pdf, log ou xml_cancelamento"}],"responses":{"200":{"description":"Default Response"}}}},"/v1/nfce/emitir":{"post":{"summary":"Emitir NFC-e (assincrono)","tags":["NFC-e"],"description":"Enfileira a emissao de uma NFC-e (modelo 65). Requer CSC configurado (PUT /empresas/{cpf_cnpj}/nfce). O modelo (65), tpImp (4), idDest (1) e indPres (1) sao aplicados automaticamente. Retorna job_id; acompanhe via GET /nfce/consultar/{id} ou webhook.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["cpf_cnpj","nota"],"additionalProperties":true,"properties":{"cpf_cnpj":{"type":"string","description":"CNPJ/CPF do emitente. Aceita com ou sem máscara. **CNPJ alfanumérico (NT Conjunta 2025.001) é aceito** — 12 posições alfanuméricas + 2 dígitos verificadores, ex.: `00.000.000/E08G-12`."},"nota":{"type":"object","additionalProperties":true,"description":"Dados da NFC-e: identificacao, emitente, produtos[], total, pagamentos[] (destinatario opcional)."},"webhook_url":{"type":"string","format":"uri","maxLength":2048},"referencia_externa":{"type":"string","maxLength":120,"description":"Opcional. Id unico do seu lado (letras/numeros, ate 120 chars; ex.: UUID). Idempotente por tenant: reenviar a MESMA referencia devolve o job existente (HTTP 200, idempotente:true) em vez de reemitir a nota. Para corrigir e reemitir uma nota que falhou, use uma NOVA referencia. Tambem permite localizar a emissao depois via GET /v1/jobs/localizar?ref=... mesmo sem o job_id."}},"example":{"cpf_cnpj":"string","referencia_externa":"PEDIDO-12345","nota":{"identificacao":{"modelo":65,"serie":0,"nNF":0,"dhEmi":"string","natOp":"string","tpNF":1,"idDest":1,"cMunFG":0,"tpImp":4,"tpEmis":1,"finNFe":1,"indFinal":1,"indPres":1},"emitente":{"CNPJCPF":"string","xNome":"string","xFant":"string","CRT":0,"IE":"string","xLgr":"string","nro":"string","xBairro":"string","cMun":0,"xMun":"string","UF":"string","cUF":0,"CEP":"string"},"produtos":[{"cProd":"string","cEAN":"SEM GTIN","xProd":"string","NCM":"string","CFOP":0,"uCom":"string","qCom":0,"vUnCom":0,"vProd":0,"cEANTrib":"SEM GTIN","uTrib":"string","qTrib":0,"vUnTrib":0,"indTot":1,"icms":{"orig":0,"CST":"string"},"pis":{"CST":"string"},"cofins":{"CST":"string"}}],"total":{"vProd":0,"vNF":0},"pagamentos":[{"tPag":"string","vPag":0}]}}}}}},"responses":{"200":{"description":"Default Response"}}}},"/v1/nfce/cancelar":{"post":{"summary":"Cancelar NFC-e","tags":["NFC-e"],"description":"Solicita o cancelamento de uma NFC-e autorizada. Informe job_id (da emissao) OU chave, e a justificativa (min. 15 caracteres).","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["cpf_cnpj"],"additionalProperties":true,"properties":{"cpf_cnpj":{"type":"string"},"job_id":{"type":"string"},"chave":{"type":"string"},"justificativa":{"type":"string"},"webhook_url":{"type":"string","format":"uri","maxLength":2048,"description":"URL https para notificacao ao finalizar. Precisa ser https, em host publico e porta padrao; redirecionamento nao e seguido."}},"example":{"cpf_cnpj":"string","job_id":"string","justificativa":"string"}}}}},"responses":{"200":{"description":"Default Response"}}}},"/v1/nfce/consultar/{id}":{"get":{"summary":"Consultar job de NFC-e","tags":["NFC-e"],"description":"Retorna o status e o resultado de um job de NFC-e (status, dados da nota, arquivos disponiveis).","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"ID do job (UUID)"}],"responses":{"200":{"description":"Default Response"}}}},"/v1/nfce/{id}/file/{tipo}":{"get":{"summary":"Baixar arquivo da NFC-e","tags":["NFC-e"],"description":"Download direto do arquivo (binario) de um job de NFC-e. O `pdf` aqui e o DANFE NFC-e em CUPOM de 80 mm, nao o A4 da NF-e. Nao sabe o que o job produziu? GET /v1/jobs/{id}/arquivos lista o que existe. Job de cancelamento tem xml_cancelamento e log, mas NAO tem xml.","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"ID do job"},{"schema":{"type":"string","enum":["xml","xml_cancelamento","pdf","log"]},"in":"path","name":"tipo","required":true,"description":"xml, pdf, log ou xml_cancelamento"}],"responses":{"200":{"description":"Default Response"}}}},"/v1/cte/emitir":{"post":{"summary":"Emitir CT-e (assincrono)","tags":["CT-e"],"description":"Enfileira a emissao de um **CT-e (modelo 57)** ou **CT-e OS (modelo 67)**, modal rodoviario.\n\nO modelo vem de `nota.identificacao.modelo`; o padrao e 57. Os dois tem estruturas diferentes:\n\n- **57** move carga de terceiros e tem cinco papeis: `remetente`, `expedidor`, `recebedor`, `destinatario` e o `tomador`, que e **escolhido entre eles** por `tomador.indice` (0=remetente, 1=expedidor, 2=recebedor, 3=destinatario).\n- **67** e servico prestado a um contratante unico: so `tomador`, e `servico` no lugar de `carga`.\n\nO `rntrc` (57) e o `taf` (67) saem da configuracao da empresa quando nao vierem no payload - configure em `PUT /v1/empresas/{cpf_cnpj}/cte`.\n\nDatas podem ir em ISO 8601; a conversao para o formato que o autorizador exige e nossa.\n\nRetorna `job_id`; acompanhe por `GET /v1/cte/consultar/{id}` ou por webhook.\n\n**Respostas:** `202` enfileirado - `400` payload invalido - `404` empresa nao encontrada - `422` certificado ou configuracao ausente - `429` cota esgotada - `403` ambiente incompativel.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["cpf_cnpj","nota"],"properties":{"cpf_cnpj":{"type":"string","description":"CNPJ do transportador emitente"},"nota":{"type":"object","additionalProperties":true,"description":"Dados do CT-e."},"referencia_externa":{"type":"string","maxLength":120,"description":"Seu identificador. Reenviar a mesma referencia devolve o job original em vez de emitir de novo."},"webhook_url":{"type":"string","format":"uri","description":"Endereco que recebe o resultado quando a emissao terminar."}}}}}},"responses":{"200":{"description":"Default Response"}}}},"/v1/cte/cancelar":{"post":{"summary":"Cancelar CT-e","tags":["CT-e"],"description":"Solicita o cancelamento de um CT-e autorizado. Informe `job_id` (da emissao) OU `chave`, mais a justificativa de no minimo 15 caracteres.\n\nO prazo de cancelamento do CT-e e definido por cada UF e **costuma ser mais curto que o da NF-e**; varios estados nao permitem cancelar depois de iniciada a prestacao do servico. Quem recusa e a SEFAZ, nao a API.\n\nConsome cota de CT-e.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["cpf_cnpj","justificativa"],"properties":{"cpf_cnpj":{"type":"string"},"job_id":{"type":"string","description":"ID do job da emissao"},"chave":{"type":"string","minLength":44,"maxLength":44,"description":"Chave de acesso do CT-e"},"justificativa":{"type":"string","minLength":15,"maxLength":255},"webhook_url":{"type":"string","format":"uri"}}}}}},"responses":{"200":{"description":"Default Response"}}}},"/v1/cte/consultar/{id}":{"get":{"summary":"Consultar job de CT-e","tags":["CT-e"],"description":"Retorna o status e o resultado de um job de CT-e. Le o que ja guardamos: **nao consome cota**.","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"ID do job"}],"responses":{"200":{"description":"Default Response"}}}},"/v1/cte/{id}/file/{tipo}":{"get":{"summary":"Baixar arquivo do CT-e","tags":["CT-e"],"description":"Download direto do arquivo de um job de CT-e. O `pdf` e o **DACTE**. Nao sabe o que o job produziu? `GET /v1/jobs/{id}/arquivos` lista o que existe.","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"ID do job"},{"schema":{"type":"string","enum":["xml","xml_cancelamento","pdf","log"]},"in":"path","name":"tipo","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/mdfe/emitir":{"post":{"summary":"Emitir MDF-e (assincrono)","tags":["MDF-e"],"description":"Enfileira a emissao de um **MDF-e (modelo 58)** -- o manifesto que acompanha a viagem.\n\n`tipo_emitente` decide **qual documento o manifesto carrega**, e vem da configuracao da empresa quando nao enviado:\n\n- `1` prestador de servico de transporte -> manifesto de **CT-e**\n- `2` transportador de carga propria -> manifesto de **NF-e**\n- `3` prestador com CT-e Globalizado -> manifesto de **NF-e**\n\nA combinacao errada **nao da erro no autorizador**: ele monta um manifesto sem documento nenhum. O Conota recusa antes, com o motivo.\n\nOs documentos vao em `descarregamento[]`, agrupados pelo municipio onde saem da carga.\n\n> **Manifesto aberto e infracao.** Depois que a viagem termina, use `POST /v1/mdfe/encerrar`. Para saber quais seguem abertos, `POST /v1/mdfe/nao-encerrados` pergunta direto a SEFAZ.\n\n**Respostas:** `202` enfileirado - `400` payload invalido - `404` empresa nao encontrada - `422` certificado ou configuracao ausente - `429` cota esgotada.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["cpf_cnpj","nota"],"properties":{"cpf_cnpj":{"type":"string","description":"CNPJ do emitente do manifesto"},"nota":{"type":"object","additionalProperties":true,"description":"Dados do MDF-e."},"referencia_externa":{"type":"string","maxLength":120},"webhook_url":{"type":"string","format":"uri"}}}}}},"responses":{"200":{"description":"Default Response"}}}},"/v1/mdfe/encerrar":{"post":{"summary":"Encerrar MDF-e","tags":["MDF-e"],"description":"Encerra o manifesto quando a viagem termina. **Manifesto aberto e infracao** -- e o unico documento do Conota que exige acao depois de autorizado.\n\nO `codigo_municipio` e onde a viagem **de fato** acabou, que nem sempre e o destino planejado.\n\nConsome cota de MDF-e.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["cpf_cnpj","chave","codigo_municipio","protocolo"],"properties":{"cpf_cnpj":{"type":"string"},"chave":{"type":"string","minLength":44,"maxLength":44},"data":{"type":"string","description":"Data do encerramento. Padrao: hoje."},"codigo_municipio":{"type":"string","description":"IBGE do municipio onde a viagem terminou"},"protocolo":{"type":"string","description":"Protocolo de autorizacao do manifesto"},"webhook_url":{"type":"string","format":"uri"}}}}}},"responses":{"200":{"description":"Default Response"}}}},"/v1/mdfe/cancelar":{"post":{"summary":"Cancelar MDF-e","tags":["MDF-e"],"description":"Cancela um manifesto autorizado. So vale **antes de iniciada a viagem**; depois disso o caminho e o encerramento, nao o cancelamento.\n\nJustificativa de no minimo 15 caracteres. Consome cota de MDF-e.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["cpf_cnpj","chave","justificativa"],"properties":{"cpf_cnpj":{"type":"string"},"chave":{"type":"string","minLength":44,"maxLength":44},"justificativa":{"type":"string","minLength":15,"maxLength":255},"webhook_url":{"type":"string","format":"uri"}}}}}},"responses":{"200":{"description":"Default Response"}}}},"/v1/mdfe/nao-encerrados":{"post":{"summary":"Listar MDF-e nao encerrados","tags":["MDF-e"],"description":"Pergunta **a propria SEFAZ** quais manifestos deste CNPJ seguem abertos.\n\nManifesto aberto e infracao, e esta e a fonte da verdade: melhor perguntar a ela que manter um espelho e arriscar divergir.\n\nAssincrona como o resto: devolve `job_id`, e o resultado sai em `GET /v1/mdfe/consultar/{id}`. **Nao consome cota.**","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["cpf_cnpj"],"properties":{"cpf_cnpj":{"type":"string"},"webhook_url":{"type":"string","format":"uri"}}}}}},"responses":{"200":{"description":"Default Response"}}}},"/v1/mdfe/consultar/{id}":{"get":{"summary":"Consultar job de MDF-e","tags":["MDF-e"],"description":"Retorna o status e o resultado de um job de MDF-e. Le o que ja guardamos: **nao consome cota**.","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/mdfe/{id}/file/{tipo}":{"get":{"summary":"Baixar arquivo do MDF-e","tags":["MDF-e"],"description":"Download do arquivo de um job de MDF-e. O `pdf` e o **DAMDFE**, que acompanha o veiculo.","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string","enum":["xml","xml_cancelamento","pdf","log"]},"in":"path","name":"tipo","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/nfse/emitir":{"post":{"summary":"Emitir NFS-e — provedor Nacional (assincrono)","tags":["NFS-e"],"description":"Enfileira a emissao de uma NFS-e no Padrao Nacional. O corpo \"nota\" usa o formato infDPS. Retorna um job_id; acompanhe via GET /nfse/consultar/{id} ou webhook.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["cpf_cnpj","nota"],"additionalProperties":true,"properties":{"cpf_cnpj":{"type":"string","description":"CNPJ/CPF do prestador. Aceita com ou sem máscara. **CNPJ alfanumérico (NT Conjunta 2025.001) é aceito** — 12 posições alfanuméricas + 2 dígitos verificadores, ex.: `00.000.000/E08G-12`."},"nota":{"type":"object","additionalProperties":true,"description":"Objeto com ambiente, provedor:\"nacional\" e infDPS (veja a Referencia de Campos na documentacao)."},"webhook_url":{"type":"string","format":"uri","maxLength":2048,"description":"URL https para notificacao ao finalizar. Precisa ser https, em host publico e porta padrao; redirecionamento nao e seguido."},"referencia_externa":{"type":"string","maxLength":120,"description":"Opcional. Id unico do seu lado (letras/numeros, ate 120 chars; ex.: UUID). Idempotente por tenant: reenviar a MESMA referencia devolve o job existente (HTTP 200, idempotente:true) em vez de reemitir a nota. Para corrigir e reemitir uma nota que falhou, use uma NOVA referencia. Tambem permite localizar a emissao depois via GET /v1/jobs/localizar?ref=... mesmo sem o job_id."}},"example":{"cpf_cnpj":"string","referencia_externa":"PEDIDO-12345","nota":{"ambiente":"string","provedor":"nacional","infDPS":{"tpAmb":0,"dhEmi":"string","dCompet":"string","prest":{"CNPJ":"string","IM":"string","opSimpNac":0},"toma":{"CPF":"string","xNome":"string","end":{"endNac":{"cMun":"string","CEP":"string"},"xLgr":"string","nro":"string","xBairro":"string"}},"serv":{"locPrest":{"cLocPrestacao":"string"},"cServ":{"cTribNac":"string","xDescServ":"string","cNBS":"string"}},"valores":{"vServPrest":{"vServ":0},"trib":{"tribMun":{"tribISSQN":0,"cLocIncid":"string","vBC":0,"tpRetISSQN":0,"vLiq":0},"totTrib":{"vTotTrib":{"vTotTribFed":0,"vTotTribEst":0,"vTotTribMun":0}}}},"IBSCBS":{"finNFSe":0,"indFinal":0,"cIndOp":"string","indDest":0,"valores":{"trib":{"gIBSCBS":{"CST":"string","cClassTrib":"string"}}}}}}}}}}},"responses":{"200":{"description":"Default Response"}}}},"/v1/nfse/govdigital/emitir":{"post":{"summary":"Emitir NFS-e — provedor GovDigital (assincrono)","tags":["NFS-e"],"description":"Enfileira a emissao de uma NFS-e no GovDigital (Tecnos/NFe-Cidades). Mesmo formato infDPS do endpoint nacional, com provedor:\"govdigital\".","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["cpf_cnpj","nota"],"additionalProperties":true,"properties":{"cpf_cnpj":{"type":"string","description":"CNPJ/CPF do prestador. Aceita com ou sem máscara. **CNPJ alfanumérico (NT Conjunta 2025.001) é aceito** — 12 posições alfanuméricas + 2 dígitos verificadores, ex.: `00.000.000/E08G-12`."},"nota":{"type":"object","additionalProperties":true,"description":"Objeto com ambiente, provedor:\"govdigital\" e infDPS (veja a Referencia de Campos na documentacao)."},"webhook_url":{"type":"string","format":"uri","maxLength":2048,"description":"URL https para notificacao ao finalizar. Precisa ser https, em host publico e porta padrao; redirecionamento nao e seguido."},"referencia_externa":{"type":"string","maxLength":120,"description":"Opcional. Id unico do seu lado (letras/numeros, ate 120 chars; ex.: UUID). Idempotente por tenant: reenviar a MESMA referencia devolve o job existente (HTTP 200, idempotente:true) em vez de reemitir a nota. Para corrigir e reemitir uma nota que falhou, use uma NOVA referencia. Tambem permite localizar a emissao depois via GET /v1/jobs/localizar?ref=... mesmo sem o job_id."}},"example":{"cpf_cnpj":"string","referencia_externa":"PEDIDO-12345","nota":{"ambiente":"string","provedor":"govdigital","infDPS":{"tpAmb":0,"dhEmi":"string","dCompet":"string","prest":{"CNPJ":"string","IM":"string","opSimpNac":0,"end":{"endNac":{"cMun":"string","CEP":"string"},"xLgr":"string","nro":"string","xBairro":"string"}},"toma":{"CPF":"string","xNome":"string","end":{"endNac":{"cMun":"string","CEP":"string"},"xLgr":"string","nro":"string","xBairro":"string"}},"serv":{"locPrest":{"cLocPrestacao":"string"},"cServ":{"cTribNac":"string","xDescServ":"string","cNBS":"string"}},"valores":{"vServPrest":{"vServ":0},"trib":{"tribMun":{"tribISSQN":0,"cLocIncid":"string","vBC":0,"pAliq":0,"vISSQN":0,"tpRetISSQN":0,"vLiq":0},"totTrib":{"vTotTrib":{"vTotTribFed":0,"vTotTribEst":0,"vTotTribMun":0}}}},"IBSCBS":{"finNFSe":0,"indFinal":0,"cIndOp":"string","indDest":0,"valores":{"trib":{"gIBSCBS":{"CST":"string","cClassTrib":"string"}}}}}}}}}}},"responses":{"200":{"description":"Default Response"}}}},"/v1/nfse/cancelar":{"post":{"summary":"Cancelar NFS-e","tags":["NFS-e"],"description":"Solicita o cancelamento de uma NFS-e emitida. Informe job_id (da emissao) OU numero, e a justificativa.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["cpf_cnpj"],"additionalProperties":true,"properties":{"cpf_cnpj":{"type":"string"},"job_id":{"type":"string"},"numero":{"type":"integer"},"codigo_cancelamento":{"type":"string"},"justificativa":{"type":"string"},"webhook_url":{"type":"string","format":"uri","maxLength":2048,"description":"URL https para notificacao ao finalizar. Precisa ser https, em host publico e porta padrao; redirecionamento nao e seguido."}},"example":{"cpf_cnpj":"string","job_id":"string","justificativa":"string"}}}}},"responses":{"200":{"description":"Default Response"}}}},"/v1/nfse/consultar/{id}":{"get":{"summary":"Consultar job de NFS-e","tags":["NFS-e"],"description":"Retorna o status e o resultado de um job de NFS-e (status, dados da nota, arquivos disponiveis).","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"ID do job (UUID)"}],"responses":{"200":{"description":"Default Response"}}}},"/v1/nfse/{id}/file/{tipo}":{"get":{"summary":"Baixar arquivo da NFS-e","tags":["NFS-e"],"description":"Download direto do arquivo (binario) de um job de NFS-e. O `pdf` aqui e o DANFSe. Nao sabe o que o job produziu? GET /v1/jobs/{id}/arquivos lista o que existe. Job de cancelamento tem xml_cancelamento e log, mas NAO tem xml.","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"ID do job"},{"schema":{"type":"string","enum":["xml","xml_cancelamento","pdf","log"]},"in":"path","name":"tipo","required":true,"description":"xml, pdf, log ou xml_cancelamento"}],"responses":{"200":{"description":"Default Response"}}}},"/v1/nfse/consultar-sefaz":{"post":{"summary":"Consultar NFS-e na SEFAZ/prefeitura (tempo real)","tags":["NFS-e"],"description":"Consulta a nota diretamente no webservice da prefeitura/SEFAZ. Informe chave_acesso, job_id ou numero.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["cpf_cnpj"],"additionalProperties":true,"properties":{"cpf_cnpj":{"type":"string"},"chave_acesso":{"type":"string"},"job_id":{"type":"string"},"numero":{"type":"integer"},"tipo_consulta":{"type":"string"}}}}}},"responses":{"200":{"description":"Default Response"}}}},"/v1/jobs/consultar-lote":{"post":{"summary":"Consulta o status de vários jobs de uma vez (lote)","tags":["Notas"],"description":"Envie uma lista de `job_ids` (máx. 200) e receba o status de cada um numa só chamada. Escopo por tenant: ids inexistentes ou de outro tenant retornam `status: \"nao_encontrado\"`. A ordem do retorno segue a ordem enviada.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["job_ids"],"properties":{"job_ids":{"type":"array","items":{"type":"string"},"minItems":1,"maxItems":200,"description":"Lista de job_id (UUID) a consultar."}},"example":{"job_ids":["3fa85f64-5717-4562-b3fc-2c963f66afa6","9c8b1e2d-0a4f-4c3b-8e5a-1d2f3a4b5c6d"]}}}}},"security":[{"apiKey":[]}],"responses":{"200":{"description":"Default Response"}}}},"/v1/jobs/erros":{"get":{"summary":"Lista jobs com erro (status failed) num período, por data","tags":["Notas"],"description":"Retorna os jobs que **falharam** (`status = failed`) num intervalo de datas, escopado por tenant. Útil para reconciliar falhas de emissão em lote (ex.: automatizar retry).\n\n- **Período**: `de`/`ate` no formato `YYYY-MM-DD` (data de criação do job, fuso de Brasília). A janela é de no **máximo 90 dias**. Se você **não** informar datas, retorna os **últimos 7 dias**; se informar só `ate`, `de` = `ate − 7 dias`.\n- **`formato=lista`** (padrão): lista paginada de jobs. **`formato=resumo`**: contagem agregada por tipo e motivo normalizado (sem listar cada job).\n- Só falhas de **job**. Notas que foram autorizadas mas **rejeitadas** pela SEFAZ/prefeitura NÃO entram aqui.\n- O campo `erro` vem saneado (sem marcadores internos); quando houve reemissão, o novo id vem em `reemitido_como`.","parameters":[{"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","example":"2026-06-18"},"in":"query","name":"de","required":false,"description":"Data inicial (YYYY-MM-DD). Default: `ate − 7 dias`."},{"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","example":"2026-06-19"},"in":"query","name":"ate","required":false,"description":"Data final (YYYY-MM-DD). Default: hoje."},{"schema":{"type":"string","enum":["nfe","nfse","nfce","mdfe"]},"in":"query","name":"tipo","required":false,"description":"Filtra por tipo de documento."},{"schema":{"type":"string"},"in":"query","name":"cpf_cnpj","required":false,"description":"Filtra por emitente (CNPJ; pode enviar com ou sem máscara)."},{"schema":{"type":"string","enum":["lista","resumo"],"default":"lista"},"in":"query","name":"formato","required":false,"description":"`lista` (paginada) ou `resumo` (agregado)."},{"schema":{"type":"integer","minimum":1,"default":1},"in":"query","name":"pagina","required":false,"description":"Página (formato=lista)."},{"schema":{"type":"integer","minimum":1,"maximum":500,"default":100},"in":"query","name":"por_pagina","required":false,"description":"Itens por página (máx. 500)."}],"security":[{"apiKey":[]}],"responses":{"200":{"description":"Default Response"}}}},"/v1/jobs/rejeitadas":{"get":{"summary":"Lista notas rejeitadas pela SEFAZ/prefeitura num período, por data","tags":["Notas"],"description":"Retorna as notas cujo job foi processado mas o documento voltou **rejeitado** (`status = rejeitada`) num intervalo de datas, escopado por tenant. É o **par** de `GET /v1/jobs/erros`: aquela cobre jobs que **falharam** (nunca viraram nota); esta cobre notas que **foram rejeitadas** pela SEFAZ/prefeitura.\n\n- **Período**: `de`/`ate` no formato `YYYY-MM-DD` (data de criação do registro, fuso de Brasília). Janela de no **máximo 90 dias**. Sem datas → **últimos 7 dias**; só `ate` → `de` = `ate − 7 dias`.\n- **`formato=lista`** (padrão): lista paginada de notas. **`formato=resumo`**: contagem agregada por tipo e `codigo_status` (o código da SEFAZ é a chave do motivo).\n- Só `rejeitada`. Cancelamento é ação do cliente (rota própria); denegação/inutilização não entram aqui.","parameters":[{"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","example":"2026-07-11"},"in":"query","name":"de","required":false,"description":"Data inicial (YYYY-MM-DD). Default: `ate − 7 dias`."},{"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","example":"2026-07-18"},"in":"query","name":"ate","required":false,"description":"Data final (YYYY-MM-DD). Default: hoje."},{"schema":{"type":"string","enum":["nfe","nfse","nfce","mdfe"]},"in":"query","name":"tipo","required":false,"description":"Filtra por tipo de documento."},{"schema":{"type":"string"},"in":"query","name":"cpf_cnpj","required":false,"description":"Filtra por emitente (CNPJ; com ou sem máscara)."},{"schema":{"type":"string","enum":["lista","resumo"],"default":"lista"},"in":"query","name":"formato","required":false,"description":"`lista` (paginada) ou `resumo` (agregado)."},{"schema":{"type":"integer","minimum":1,"default":1},"in":"query","name":"pagina","required":false,"description":"Página (formato=lista)."},{"schema":{"type":"integer","minimum":1,"maximum":500,"default":100},"in":"query","name":"por_pagina","required":false,"description":"Itens por página (máx. 500)."}],"security":[{"apiKey":[]}],"responses":{"200":{"description":"Default Response"}}}},"/v1/jobs/localizar":{"get":{"summary":"Localizar job/emissão sem o job_id (por referência ou atributos)","tags":["Notas"],"description":"Recupera o `job_id` (ou confirma que a emissão nunca aconteceu) quando o cliente **perdeu o job_id**. Escopado por tenant. Duas formas de busca:\n\n1. **Por referência** — se você enviou `referencia_externa` no `/emitir`, basta `?ref=<sua-referencia>` (busca exata, sem precisar de período).\n2. **Por atributos** — informe um **período** (`de`/`ate`, máx. 90 dias; sem datas → últimos 7 dias) e **pelo menos um** de: `cpf_cnpj` (emitente), `destinatario_cpf_cnpj` ou valor (`valor` exato, ou faixa `valor_min`/`valor_max`). Refine com `tipo` e `status`.\n\nA busca cruza os dados do próprio job (referência, destinatário e valor denormalizados na criação) com a nota fiscal, quando existir. **0 resultados** = forte indício de que não processou (pode reemitir com segurança); **1** = é o job perdido; **N** = desambigúe por destinatário/valor/hora. Nunca retorna o payload (que carrega dados sensíveis).\n\n> Observação: destinatário/valor passam a ser gravados no job a partir de 18/07/2026; emissões anteriores são encontradas por esses campos apenas quando viraram nota (ou após backfill).","parameters":[{"schema":{"type":"string","maxLength":120,"example":"3fa85f64-5717-4562-b3fc-2c963f66afa6"},"in":"query","name":"ref","required":false,"description":"A `referencia_externa` que você enviou no /emitir (busca exata). Dispensa período."},{"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"in":"query","name":"de","required":false,"description":"Data inicial (YYYY-MM-DD). Default: `ate − 7 dias` (quando busca por atributos)."},{"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"in":"query","name":"ate","required":false,"description":"Data final (YYYY-MM-DD). Default: hoje."},{"schema":{"type":"string"},"in":"query","name":"cpf_cnpj","required":false,"description":"CNPJ do emitente (com ou sem máscara)."},{"schema":{"type":"string"},"in":"query","name":"destinatario_cpf_cnpj","required":false,"description":"CPF/CNPJ do destinatário (com ou sem máscara)."},{"schema":{"type":"number"},"in":"query","name":"valor","required":false,"description":"Valor total exato do documento."},{"schema":{"type":"number"},"in":"query","name":"valor_min","required":false,"description":"Piso do valor (faixa)."},{"schema":{"type":"number"},"in":"query","name":"valor_max","required":false,"description":"Teto do valor (faixa)."},{"schema":{"type":"string","enum":["nfe","nfse","nfce","mdfe"]},"in":"query","name":"tipo","required":false,"description":"Filtra por tipo de documento."},{"schema":{"type":"string","enum":["pending","processing","completed","failed","cancelled"]},"in":"query","name":"status","required":false,"description":"Filtra pelo status do job."},{"schema":{"type":"integer","minimum":1,"default":1},"in":"query","name":"pagina","required":false},{"schema":{"type":"integer","minimum":1,"maximum":500,"default":100},"in":"query","name":"por_pagina","required":false}],"security":[{"apiKey":[]}],"responses":{"200":{"description":"Default Response"}}}},"/v1/jobs/{job_id}/itens":{"get":{"summary":"Itens (produtos/serviços) de uma emissão, com os grupos tributários","tags":["Notas"],"description":"Retorna os **itens** de uma emissão a partir do `job_id`, com código, descrição, NCM, CFOP, quantidade, valores e os **grupos tributários de cada item** (ICMS, PIS, COFINS e **IBS/CBS**).\n\n### Para que serve\nResponder **\"qual produto derrubou minha nota\"** sem abrir XML. Quando o fisco rejeita apontando um item (`[nItem: N]` no motivo), a rota marca esse item com `\"rejeitado\": true` e o repete em `item_rejeitado` — o culpado sai identificado em **uma** chamada.\n\n### De onde vêm os dados\nDo **payload enviado** na emissão (`\"fonte\": \"payload_enviado\"`), não do XML autorizado. Isso é deliberado: o XML só existe para nota autorizada, enquanto o payload existe para **qualquer status** — inclusive as rejeitadas e as que falharam, que são justamente as que você precisa diagnosticar. Para notas autorizadas o conteúdo é equivalente (a SEFAZ não altera itens); se você precisa do documento com valor legal, baixe o XML em `/v1/{tipo}/{job_id}/file/xml`.\n\n### Por tipo de documento\n- **NF-e** e **NFC-e**: um item por produto, na ordem em que foram enviados (`nItem` começa em 1).\n- **NFS-e**: a DPS tem **um único serviço**, devolvido como um item só — com `codigo_tributacao_nacional`, `codigo_nbs` e o grupo `issqn`.\n\n> Nunca devolve o payload cru (que carrega certificado e senha) — apenas os itens e seus grupos fiscais.\n\n### Exemplo de uso\nUma NF-e rejeitada com *\"Aliquota do IBS da UF invalida[nItem: 2]\"* devolve `item_rejeitado` com o código e a descrição do produto, e o `ibscbs` daquele item mostra o que foi enviado (ex.: `cst: \"000\"` com alíquota `0` — contradição que o fisco recusa, já que CST 000 é tributação integral).","parameters":[{"schema":{"type":"string","example":"0fafe732-9665-4d36-8971-c8063962290c"},"in":"path","name":"job_id","required":true,"description":"ID do job retornado na emissão. Se você o perdeu, recupere em `GET /v1/jobs/localizar`."}],"security":[{"apiKey":[]}],"responses":{"200":{"description":"Default Response"}}}},"/v1/nfe/verificar-campos":{"post":{"summary":"Verificar campos do payload antes de emitir (não emite nada)","tags":["Notas"],"description":"Recebe **o mesmo corpo que você enviaria para `/v1/nfe/emitir`** e devolve os campos que o emissor **não reconhece** — sem emitir, sem consumir numeração e **sem debitar cota**.\n\n### O problema que isto resolve\nCampo com nome errado **não gera erro**: ele é ignorado na conversão e o campo correto sai vazio ou zerado. Um `vlrProd` no lugar de `vProd` produz uma NF-e formalmente válida com o produto valendo **R$ 0,00** — e você só descobre pela rejeição do fisco, ou não descobre.\n\n### O que a resposta traz\nPara cada campo desconhecido: o **caminho exato** dentro do payload e, quando existe algo parecido, uma **sugestão**:\n\n```json\n{ \"caminho\": \"nota.produtos[0].vlrProd\", \"campo\": \"vlrProd\", \"sugestao\": \"vProd\" }\n```\n\n### Duas camadas\n1. **Nomes de campo** — sempre, só com o payload.\n2. **Schema oficial** — quando você informa `cpf_cnpj`: monta, assina com o certificado do emitente e valida contra o XSD da NF-e, **sem transmitir**. Pega valor malformado (`NCM` de 3 dígitos, data inválida, tamanho excedido).\n\nAs duas se complementam e **nenhuma substitui a outra**: campo ignorado não chega ao XML, então o schema não o enxerga; e nome certo não garante valor válido.\n\n### Limites — leia antes de confiar\n- **Regra fiscal não é verificada** (ex.: CST 000 com alíquota zerada). Isso só o fisco avalia.\n- Sem `cpf_cnpj`, apenas a camada 1 roda — a resposta diz isso em `schema.verificado: false`.\n- Disponível para **NF-e e NFC-e**. A **NFS-e usa outro layout** e ainda não tem vocabulário próprio — pedir `tipo: \"nfse\"` é recusado em vez de acusar campos legítimos como desconhecidos.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["nota"],"properties":{"nota":{"type":"object","additionalProperties":true,"description":"O mesmo objeto `nota` do /emitir."},"tipo":{"type":"string","enum":["nfe","nfce"],"default":"nfe","description":"Tipo do documento."},"cpf_cnpj":{"type":"string","description":"CNPJ do emitente. **Opcional**: informando, roda também a validação contra o schema oficial (precisa do certificado para assinar antes de validar)."}}}}}},"security":[{"apiKey":[]}],"responses":{"200":{"description":"Default Response"}}}},"/v1/jobs/{id}/arquivos":{"get":{"summary":"Listar TODOS os arquivos de uma emissão","tags":["Arquivos"],"description":"**Descobre o que existe.** Devolve a lista de todos os arquivos gerados por um job — XML, PDF, log — cada um já com uma **URL assinada** pronta para download, o tamanho e o tipo.\n\nUse quando você **não sabe** quais arquivos aquele job produziu. Se você já sabe o tipo que quer, vá direto:\n\n| Rota | Devolve |\n|---|---|\n| `GET /v1/jobs/{id}/arquivos` | esta — a **lista** de tudo, com URLs |\n| `GET /v1/jobs/{id}/download/{tipo}` | **JSON com a URL** de um tipo |\n| `GET /v1/jobs/{id}/file/{tipo}` | **o arquivo em si** (binário) |\n\n> **As URLs expiram.** Elas valem cerca de 1 hora. Não guarde no seu banco nem mande por e-mail: gere uma nova quando precisar. URL assinada salva em algum lugar vira vazamento com prazo de validade.\n\nVale para qualquer tipo de documento (NF-e, NFC-e, NFS-e). Não consome cota.\n\n**Respostas:** `200` lista (pode vir vazia se o job ainda não gerou arquivo) · `404` job não encontrado nesta conta · `500` erro interno.","parameters":[{"schema":{"type":"string","example":"6f8dc295-..."},"in":"path","name":"id","required":true,"description":"`job_id` devolvido na emissão. Só encontra jobs da **sua** conta — id de outro tenant responde `404`, sem revelar que existe."}],"responses":{"200":{"description":"Default Response"}}}},"/v1/jobs/{id}/download/{tipo}":{"get":{"summary":"Obter a URL de download de um arquivo (devolve JSON)","tags":["Arquivos"],"description":"**Devolve o endereço, não o arquivo.** A resposta é um JSON com uma **URL assinada**, o tipo, o content-type e o tamanho.\n\nUse quando quiser **entregar o link para outra pessoa ou outro sistema** — mostrar um botão de download na sua tela, mandar para um fluxo do n8n, guardar temporariamente para um processamento posterior.\n\nSe o que você quer é **baixar o conteúdo agora**, use `GET /v1/jobs/{id}/file/{tipo}`, que devolve o binário direto e evita a segunda requisição.\n\n> **A URL expira em cerca de 1 hora.** Gere na hora de usar; não persista.\n\nNão consome cota.\n\n**Respostas:** `200` com a URL · `400` tipo inválido · `404` job ou arquivo daquele tipo não encontrado · `500` erro interno.","parameters":[{"schema":{"type":"string","example":"6f8dc295-..."},"in":"path","name":"id","required":true,"description":"`job_id` devolvido na emissão. Só encontra jobs da **sua** conta — id de outro tenant responde `404`, sem revelar que existe."},{"schema":{"type":"string","enum":["xml","xml_cancelamento","pdf","log"]},"in":"path","name":"tipo","required":true,"description":"Tipo do arquivo: `xml` (o documento autorizado), `xml_cancelamento` (o evento de cancelamento), `pdf` (DANFE, cupom ou DANFSe) ou `log` (retorno técnico do processamento)."}],"responses":{"200":{"description":"Default Response"}}}},"/v1/jobs/{id}/file/{tipo}":{"get":{"summary":"Baixar o arquivo (devolve o binário)","tags":["Arquivos"],"description":"**Devolve o arquivo em si**, com `Content-Disposition: attachment` — no navegador, baixa; no `curl`, use `-o`; no n8n, o bloco HTTP Request devolve o conteúdo direto.\n\nÉ o caminho mais curto quando você quer **guardar o XML** na sua base ou anexar o PDF a um e-mail. Uma requisição, sem passar por URL assinada.\n\nO nome do arquivo sai como `{job_id}.{extensão}` — e `log` baixa como `.json`.\n\nExistem rotas equivalentes por tipo de documento, que fazem exatamente o mesmo: `GET /v1/nfe/{id}/file/{tipo}`, `/v1/nfce/...`, `/v1/nfse/...`. Esta serve para qualquer tipo, quando você tem só o `job_id` e não sabe (ou não quer saber) qual documento é.\n\n> **Guarde o XML.** A obrigação de guarda recai sobre o **XML autorizado** — o PDF pode ser regerado a partir dele, o contrário não. A retenção aqui depende do plano; o arquivo definitivo é o seu.\n\nNão consome cota.\n\n**Respostas:** `200` com o binário · `400` tipo inválido · `404` job ou arquivo não encontrado · `500` erro interno.","parameters":[{"schema":{"type":"string","example":"6f8dc295-..."},"in":"path","name":"id","required":true,"description":"`job_id` devolvido na emissão. Só encontra jobs da **sua** conta — id de outro tenant responde `404`, sem revelar que existe."},{"schema":{"type":"string","enum":["xml","xml_cancelamento","pdf","log"]},"in":"path","name":"tipo","required":true,"description":"Tipo do arquivo: `xml` (o documento autorizado), `xml_cancelamento` (o evento de cancelamento), `pdf` (DANFE, cupom ou DANFSe) ou `log` (retorno técnico do processamento)."}],"responses":{"200":{"description":"Default Response"}}}},"/v1/arquivos/zips":{"get":{"summary":"Listar zips mensais de XMLs disponíveis","tags":["Notas"],"description":"Lista os pacotes ZIP mensais de XMLs do tenant, gerados automaticamente no dia 1º de cada mês (um zip por tipo de documento — nfe/nfse/nfce — com todos os XMLs de emissão do mês anterior, organizados por CNPJ do emitente + manifest.json). Retenção: 15 meses. `completo: false` indica zip gerado antes do fechamento do mês (parcial; será regenerado no dia 1º). Baixe via `GET /v1/arquivos/zip-mensal`.","security":[{"apiKey":[]}],"responses":{"200":{"description":"Default Response"}}}},"/v1/arquivos/zip-mensal":{"get":{"summary":"Download do zip mensal de XMLs (URL assinada)","tags":["Notas"],"description":"Retorna a URL de download (válida por 1h) do ZIP mensal de XMLs do tenant para o tipo e a competência informados. Os zips são gerados no dia 1º de cada mês com os XMLs do mês anterior e mantidos por 15 meses. Use `GET /v1/arquivos/zips` para ver os disponíveis.","parameters":[{"schema":{"type":"string","enum":["nfe","nfse","nfce"],"example":"nfe"},"in":"query","name":"tipo","required":true,"description":"Tipo de documento fiscal."},{"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}$","example":"2026-07"},"in":"query","name":"competencia","required":true,"description":"Mês de referência (YYYY-MM)."}],"security":[{"apiKey":[]}],"responses":{"200":{"description":"Default Response"}}}},"/v1/notas":{"get":{"summary":"Listar notas fiscais","tags":["Notas"],"description":"Lista as notas fiscais do tenant (NF-e, NFS-e, NFC-e), da mais recente para a mais antiga (ordena por `data_emissao`, depois `criado_em`). Escopada ao tenant autenticado.\n\n- **Filtros** (todos opcionais e combináveis por E): `tipo` (tipo de documento), `status` (situação fiscal) e `cpf_cnpj` (CNPJ do **emitente**). Sem filtros, retorna todas as notas do tenant.\n- **Paginação**: `limite` (padrão 20) e `pagina` (padrão 1). A resposta traz `total` (contagem total do filtro), `pagina` e `limite`.\n- **Cada item** inclui: identificação (`tipo`, `modelo`, `serie`, `numero`, `chave_acesso`); situação (`status`, `codigo_status`, `motivo_status`, `protocolo`, `data_autorizacao`); `valor_total`, destinatário (`destinatario_nome`, `destinatario_cpf_cnpj`) e emitente (`emitente_nome`, `emitente_cpf_cnpj`); dados de cancelamento (`protocolo_cancelamento`, `data_cancelamento`, `justificativa_cancelamento`); e os ids de origem `job_emissao_id` / `job_cancelamento_id` + `ambiente`.\n- **Rotas relacionadas**: status de um job → `GET /v1/<tipo>/consultar/{id}`; documento por chave → `GET /v1/notas/{chave}`; reconciliação por período → `GET /v1/jobs/erros` e `GET /v1/jobs/rejeitadas`.","parameters":[{"schema":{"type":"string","enum":["nfe","nfse","nfce","mdfe"],"example":"nfe"},"in":"query","name":"tipo","required":false,"description":"Filtra por tipo de documento."},{"schema":{"type":"string","enum":["autorizada","cancelada","rejeitada","denegada","inutilizada"],"example":"autorizada"},"in":"query","name":"status","required":false,"description":"Filtra pela situação fiscal da nota."},{"schema":{"type":"string","example":"11222333000181"},"in":"query","name":"cpf_cnpj","required":false,"description":"CNPJ do emitente. Aceita com ou sem máscara. **CNPJ alfanumérico (NT Conjunta 2025.001) é aceito** — 12 posições alfanuméricas + 2 dígitos verificadores, ex.: `00.000.000/E08G-12`."},{"schema":{"type":"integer","minimum":1,"default":20},"in":"query","name":"limite","required":false,"description":"Itens por página (padrão 20)."},{"schema":{"type":"integer","minimum":1,"default":1},"in":"query","name":"pagina","required":false,"description":"Página, começando em 1 (padrão 1)."}],"security":[{"apiKey":[]}],"responses":{"200":{"description":"Default Response"}}}},"/v1/notas/rejeicoes":{"get":{"summary":"Relatório de emissões × rejeições (resumo com valores e motivos)","tags":["Notas"],"description":"Resumo consolidado do período: **emitidas com sucesso** (autorizadas + canceladas) × **com erro** (notas rejeitadas + jobs falhos), com **valores somados**, **percentuais**, classificação por **categoria** (fiscal, duplicidade, infra), os **principais motivos** e um resumo por tipo (NF-e/NFS-e). Escopado ao tenant. É a visão de topo — use `GET /v1/notas/rejeicoes/detalhe` (por código/motivo) e `GET /v1/notas/emitidas/detalhe` para o drill-down paginado. Sem datas → do 1º dia do mês corrente até hoje.","parameters":[{"schema":{"type":"string","example":"2026-07-01"},"in":"query","name":"de","required":false,"description":"Data inicial YYYY-MM-DD. Default: 1º dia do mês atual."},{"schema":{"type":"string","example":"2026-07-18"},"in":"query","name":"ate","required":false,"description":"Data final YYYY-MM-DD. Default: hoje."},{"schema":{"type":"string","enum":["nfe","nfse","nfce","mdfe"]},"in":"query","name":"tipo","required":false,"description":"Filtra por tipo de documento."}],"security":[{"apiKey":[]}],"responses":{"200":{"description":"Default Response"}}}},"/v1/notas/rejeicoes/detalhe":{"get":{"summary":"Detalhe paginado de rejeições/falhas (drill-down por código ou motivo)","tags":["Notas"],"description":"Drill-down paginado e buscável de um item do relatório `GET /v1/notas/rejeicoes`. Informe **`codigo`** (código numérico da SEFAZ — ex.: 225 = falha de schema, 539 = duplicidade → notas `rejeitada`) **ou** **`motivo`** (texto normalizado do erro, para falhas de **job** NFS-e/pré-SEFAZ, quando `codigo` = `-`). Um dos dois é obrigatório (senão `400`). Escopado ao tenant. Sem datas → do 1º dia do mês até hoje.","parameters":[{"schema":{"type":"string","example":"539"},"in":"query","name":"codigo","required":false,"description":"Código de status da SEFAZ (ex.: 225, 539). Use \"-\" para falhas de job (aí informe `motivo`)."},{"schema":{"type":"string","example":"Certificado vencido"},"in":"query","name":"motivo","required":false,"description":"Motivo normalizado do erro (quando `codigo` = \"-\")."},{"schema":{"type":"string","enum":["nfe","nfse","nfce","mdfe"]},"in":"query","name":"tipo","required":false,"description":"Filtra por tipo de documento."},{"schema":{"type":"string","example":"Maria"},"in":"query","name":"busca","required":false,"description":"Filtra por nome/CPF/CNPJ do destinatário ou data (DD/MM/YYYY HH:MM)."},{"schema":{"type":"string","example":"2026-07-01"},"in":"query","name":"de","required":false,"description":"Data inicial YYYY-MM-DD. Default: 1º dia do mês."},{"schema":{"type":"string","example":"2026-07-18"},"in":"query","name":"ate","required":false,"description":"Data final YYYY-MM-DD. Default: hoje."},{"schema":{"type":"integer","default":1},"in":"query","name":"pagina","required":false,"description":"Página."},{"schema":{"type":"integer","default":20},"in":"query","name":"limite","required":false,"description":"Itens por página (máx. 100)."}],"security":[{"apiKey":[]}],"responses":{"200":{"description":"Default Response"}}}},"/v1/notas/emitidas/detalhe":{"get":{"summary":"Detalhe paginado de notas emitidas com sucesso","tags":["Notas"],"description":"Lista paginada e buscável das notas **emitidas com sucesso** (status `autorizada` ou `cancelada`) no período — o drill-down do bloco \"emitidas\" do relatório `GET /v1/notas/rejeicoes`. Escopado ao tenant. Ordena da mais recente para a mais antiga. Sem datas → do 1º dia do mês corrente até hoje.","parameters":[{"schema":{"type":"string","example":"2026-07-01"},"in":"query","name":"de","required":false,"description":"Data inicial YYYY-MM-DD. Default: 1º dia do mês."},{"schema":{"type":"string","example":"2026-07-18"},"in":"query","name":"ate","required":false,"description":"Data final YYYY-MM-DD. Default: hoje."},{"schema":{"type":"string","enum":["nfe","nfse","nfce","mdfe"]},"in":"query","name":"tipo","required":false,"description":"Filtra por tipo de documento."},{"schema":{"type":"string","example":"Maria"},"in":"query","name":"busca","required":false,"description":"Filtra por nome/CPF/CNPJ do destinatário ou data (DD/MM/YYYY HH:MM)."},{"schema":{"type":"integer","default":1},"in":"query","name":"pagina","required":false,"description":"Página."},{"schema":{"type":"integer","default":20},"in":"query","name":"limite","required":false,"description":"Itens por página (máx. 100)."}],"security":[{"apiKey":[]}],"responses":{"200":{"description":"Default Response"}}}},"/v1/notas/auditoria":{"get":{"summary":"Auditoria por documento/nome, Job ID ou referência externa","tags":["Notas"],"description":"Busca notas e jobs do tenant por **um** destes critérios: `busca` (documento/nome do destinatário), `job_id` (completo ou prefixo) ou `referencia_externa` (a que você enviou no `/emitir`, correspondência exata). Sempre escopado ao tenant. Retorna as notas do período (autorizada/rejeitada/cancelada) e — em modo `job_id`/`referencia_externa` — também o job quando ainda **não virou nota** (falha/pendente), com resumo por status e valores. Datas (`de`/`ate`) são opcionais.","parameters":[{"schema":{"type":"string","example":"Maria Silva"},"in":"query","name":"busca","required":false,"description":"CPF/CNPJ ou nome do destinatário (aceita máscara)."},{"schema":{"type":"string","example":"8881bac5"},"in":"query","name":"job_id","required":false,"description":"ID do job (completo ou prefixo)."},{"schema":{"type":"string","example":"PEDIDO-12345"},"in":"query","name":"referencia_externa","required":false,"description":"Referência externa exata enviada no /emitir."},{"schema":{"type":"string","example":"2026-07-01"},"in":"query","name":"de","required":false,"description":"Data inicial YYYY-MM-DD (opcional)."},{"schema":{"type":"string","example":"2026-07-18"},"in":"query","name":"ate","required":false,"description":"Data final YYYY-MM-DD (opcional)."},{"schema":{"type":"integer","default":1},"in":"query","name":"pagina","required":false,"description":"Página."},{"schema":{"type":"integer","default":20},"in":"query","name":"limite","required":false,"description":"Itens por página (máx. 100)."}],"security":[{"apiKey":[]}],"responses":{"200":{"description":"Default Response"}}}},"/v1/notas/{chave}":{"get":{"summary":"Consultar nota por chave de acesso","tags":["Notas"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"chave","required":true,"description":"Chave de acesso (44 digitos)"}],"responses":{"200":{"description":"Default Response"}}}},"/v1/captura":{"get":{"summary":"Estado da captura de uma empresa","tags":["Captura de notas recebidas"],"description":"Diz, por tipo (NF-e e NFS-e), se a captura está incluída no plano, ligada e em que situação — e qual webhook está configurado.\n\n| `situacao` | Significa |\n|---|---|\n| `nao_incluida_no_plano` | O plano da conta não inclui este tipo. |\n| `desligada` | Incluída no plano, mas desligada nesta empresa. |\n| `sincronizando` | Baixando o histórico, logo depois de ligar. |\n| `em_dia` | Histórico baixado; consultas periódicas por notas novas. |\n| `aguardando_limite_de_consumo` | Espera imposta pela fonte (ex.: rejeição 656 da SEFAZ). Não é defeito: a captura retoma sozinha. |\n| `com_erro` | O campo `erro` diz o motivo — por exemplo, certificado vencido. |\n\nResposta:\n\n```json\n{\n  \"cpf_cnpj\": \"11222333000181\",\n  \"nfe\": {\n    \"incluida_no_plano\": true,\n    \"ativa\": true,\n    \"situacao\": \"em_dia\",\n    \"ativada_em\": \"2026-09-25T18:22:00.000Z\",\n    \"desativada_em\": null,\n    \"sincronizada_em\": \"2026-09-25T18:23:00.000Z\",\n    \"ultima_consulta\": \"2026-09-25T20:31:00.000Z\",\n    \"proxima_consulta\": \"2026-09-25T21:33:00.000Z\",\n    \"erro\": null,\n    \"aceite_ciencia_da_operacao\": {\n      \"aceito_em\": \"2026-09-25T18:22:00.000Z\"\n    }\n  },\n  \"nfse\": {\n    \"incluida_no_plano\": true,\n    \"ativa\": true,\n    \"situacao\": \"sincronizando\",\n    \"ativada_em\": \"2026-09-25T19:20:00.000Z\",\n    \"desativada_em\": null,\n    \"sincronizada_em\": null,\n    \"ultima_consulta\": \"2026-09-25T19:22:00.000Z\",\n    \"proxima_consulta\": \"2026-09-25T19:27:00.000Z\",\n    \"erro\": null\n  },\n  \"webhook\": {\n    \"url\": \"https://seu-sistema.exemplo.com.br/conota\",\n    \"ativo\": true,\n    \"atualizado_em\": \"2026-09-25T19:40:00.000Z\",\n    \"chave_de_assinatura_criada_em\": \"2026-09-25T19:40:00.000Z\"\n  }\n}\n```","parameters":[{"schema":{"type":"string","minLength":11,"maxLength":18},"in":"query","name":"cpf_cnpj","required":true,"description":"CNPJ ou CPF da empresa emissora, com ou sem máscara"}],"security":[{"apiKey":[]}],"responses":{"200":{"description":"Default Response"}}},"put":{"summary":"Ligar ou desligar a captura","tags":["Captura de notas recebidas"],"description":"Liga ou desliga, por tipo, a captura das notas que fornecedores emitem **contra** a empresa. Envie `nfe` e/ou `nfse` com `true` (ligar) ou `false` (desligar).\n\n- Exige chave de **produção**: a captura lê as notas reais, não existe captura em homologação (**403**).\n- Ligar exige que o plano inclua o tipo (**403**) e que a empresa tenha certificado A1 ativo e válido (**422**).\n- **Ligar a NF-e exige `aceite_ciencia_da_operacao: true`** (**422** sem ele). Com o aceite, a captura fica autorizada a registrar na SEFAZ, em nome da empresa, a Ciência da Operação (evento 210210) de cada NF-e recebida — é o que libera o XML completo. A Ciência só informa que a empresa tomou conhecimento da nota; não confirma a operação. O registro automático entra em operação numa próxima etapa; até lá, a NF-e chega, em geral, como resumo (`xml_integral: false`).\n- Ao ligar, o histórico disponível na fonte é baixado primeiro (`situacao: sincronizando`). O histórico **não gera aviso** de webhook.\n- Desligar para de buscar notas novas. O que já foi capturado continua disponível.\n\nResponde com o estado atualizado, no mesmo formato de `GET /v1/captura`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["cpf_cnpj"],"properties":{"cpf_cnpj":{"type":"string","minLength":11,"maxLength":18,"description":"CNPJ ou CPF da empresa emissora, com ou sem máscara"},"nfe":{"type":"boolean"},"nfse":{"type":"boolean"},"aceite_ciencia_da_operacao":{"type":"boolean"}}}}}},"security":[{"apiKey":[]}],"responses":{"200":{"description":"Default Response"}}}},"/v1/captura/webhook":{"put":{"summary":"Configurar o webhook da empresa","tags":["Captura de notas recebidas"],"description":"Um webhook por empresa (CNPJ). A `url` precisa estar nos **destinos de webhook autorizados de produção** da conta (console, Integração > Destinos de webhook) — senão, **422**. `ativo: false` desliga.\n\nNa primeira configuração da conta, a resposta traz `chave_de_assinatura.valor` — **a única vez que ela aparece**. Guarde-a: ela assina os avisos de todas as empresas da conta.\n\n**Eventos**: `nota_recebida` (nota recebida nova) e `nota_recebida_cancelada`. O histórico baixado ao ligar a captura não gera aviso, nem as notas que a própria empresa emitiu.\n\n**Headers de cada aviso**: `X-Conota-Evento`, `X-Conota-Entrega` (id único — use para descartar repetição), `X-Conota-Tentativa`, `X-Conota-Timestamp` e `X-Conota-Signature`.\n\n**Como conferir a assinatura**:\n1. Leia o corpo **bruto**, antes de interpretar o JSON.\n2. Recuse se `X-Conota-Timestamp` estiver a mais de 5 minutos do seu relógio.\n3. Calcule `\"sha256=\" + hex(HMAC-SHA256(chave, \"<X-Conota-Timestamp>.<corpo bruto>\"))`.\n4. Compare com `X-Conota-Signature` em tempo constante.\n\n**Entrega**: responda 2xx. Sem 2xx, tentamos de novo em 1 min, 5 min, 15 min, 1 h, 3 h, 6 h e 12 h (8 tentativas). Redirecionamento não é seguido.\n\nCorpo de um aviso:\n\n```json\n{\n  \"evento\": \"nota_recebida\",\n  \"entrega_id\": \"5b0f3c1e-0000-4000-8000-000000000000\",\n  \"ocorrido_em\": \"2026-09-25T19:22:10.000Z\",\n  \"empresa\": {\n    \"cpf_cnpj\": \"11222333000181\"\n  },\n  \"nota\": {\n    \"tipo\": \"nfse\",\n    \"chave\": \"35503081299888777000166000000000012326081234567895\",\n    \"papel\": \"tomador\",\n    \"numero\": \"123\",\n    \"emissor\": {\n      \"cpf_cnpj\": \"99888777000166\",\n      \"nome\": \"PRESTADORA EXEMPLO LTDA\"\n    },\n    \"valor\": 1500,\n    \"data_emissao\": \"2026-09-20T13:00:00.000Z\",\n    \"situacao\": \"autorizada\",\n    \"municipio_incidencia\": \"3550308\",\n    \"xml_integral\": true\n  },\n  \"xml_url\": \"https://api.conota.dev/v1/captura/notas/xml?chave=35503081299888777000166000000000012326081234567895&cpf_cnpj=11222333000181\"\n}\n```","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["cpf_cnpj"],"properties":{"cpf_cnpj":{"type":"string","minLength":11,"maxLength":18,"description":"CNPJ ou CPF da empresa emissora, com ou sem máscara"},"url":{"type":"string","maxLength":2048},"ativo":{"type":"boolean","default":true}}}}}},"security":[{"apiKey":[]}],"responses":{"200":{"description":"Default Response"}}}},"/v1/captura/webhook/segredo":{"post":{"summary":"Gerar ou trocar a chave de assinatura","tags":["Captura de notas recebidas"],"description":"Gera uma chave de assinatura nova para a conta e a devolve **uma única vez**. A troca vale na hora: os avisos seguintes já saem assinados com a nova, para todas as empresas da conta.\n\nSem corpo. Exige chave de produção.","security":[{"apiKey":[]}],"responses":{"200":{"description":"Default Response"}}}},"/v1/captura/notas":{"get":{"summary":"Listar notas recebidas","tags":["Captura de notas recebidas"],"description":"Lista as notas em que a empresa figura como **tomadora, destinatária ou intermediária**. As notas que a própria empresa emitiu não aparecem aqui.\n\n- `desde` e `ate` são datas de emissão, no fuso de Brasília.\n- `situacao` vem como a fonte informou. Um código que ainda não interpretamos aparece cru (ex.: `cstat-107`), nunca como `autorizada`.\n- Numa NF-e, `xml_integral: false` significa que só o resumo chegou até agora.\n\nResposta:\n\n```json\n{\n  \"cpf_cnpj\": \"11222333000181\",\n  \"pagina\": 1,\n  \"limite\": 50,\n  \"total\": 1,\n  \"notas\": [\n    {\n      \"tipo\": \"nfse\",\n      \"chave\": \"35503081299888777000166000000000012326081234567895\",\n      \"papel\": \"tomador\",\n      \"numero\": \"123\",\n      \"emissor\": {\n        \"cpf_cnpj\": \"99888777000166\",\n        \"nome\": \"PRESTADORA EXEMPLO LTDA\"\n      },\n      \"valor\": 1500,\n      \"data_emissao\": \"2026-09-20T13:00:00.000Z\",\n      \"situacao\": \"autorizada\",\n      \"municipio_incidencia\": \"3550308\",\n      \"xml_integral\": true,\n      \"capturada_em\": \"2026-09-25T19:22:10.000Z\"\n    }\n  ]\n}\n```","parameters":[{"schema":{"type":"string","minLength":11,"maxLength":18},"in":"query","name":"cpf_cnpj","required":true,"description":"CNPJ ou CPF da empresa emissora, com ou sem máscara"},{"schema":{"type":"string","enum":["nfe","nfse"]},"in":"query","name":"tipo","required":false},{"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"in":"query","name":"desde","required":false,"description":"AAAA-MM-DD, no fuso de Brasília"},{"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"in":"query","name":"ate","required":false,"description":"AAAA-MM-DD, no fuso de Brasília"},{"schema":{"type":"string","maxLength":30},"in":"query","name":"situacao","required":false},{"schema":{"type":"integer","minimum":1,"default":1},"in":"query","name":"pagina","required":false},{"schema":{"type":"integer","minimum":1,"maximum":200,"default":50},"in":"query","name":"limite","required":false}],"security":[{"apiKey":[]}],"responses":{"200":{"description":"Default Response"}}}},"/v1/captura/notas/xml":{"get":{"summary":"Baixar o XML de uma nota recebida","tags":["Captura de notas recebidas"],"description":"Devolve o XML (`application/xml`). O header `X-Conota-Documento` diz se é a nota `integral` ou só o `resumo` (NF-e cuja nota integral ainda não chegou).\n\nInforme `cpf_cnpj` quando a mesma nota aparece em mais de uma empresa da conta — sem ele, a resposta é **409**.","parameters":[{"schema":{"type":"string","pattern":"^(\\d{44}|\\d{50})$"},"in":"query","name":"chave","required":true,"description":"Chave de acesso: 44 dígitos (NF-e) ou 50 (NFS-e)"},{"schema":{"type":"string","minLength":11,"maxLength":18},"in":"query","name":"cpf_cnpj","required":false,"description":"CNPJ ou CPF da empresa emissora, com ou sem máscara"}],"security":[{"apiKey":[]}],"responses":{"200":{"description":"Default Response"}}}}},"servers":[{"url":"https://api.conota.dev","description":"Producao"}],"security":[{"apiKey":[]}],"tags":[{"name":"NFS-e","description":"Emissao, consulta e cancelamento de NFS-e"},{"name":"NF-e","description":"Emissao, consulta e cancelamento de NF-e"},{"name":"NFC-e","description":"Emissao, consulta e cancelamento de NFC-e (modelo 65)"},{"name":"CT-e","description":"Emissao, consulta e cancelamento de CT-e (modelo 57) e CT-e OS (modelo 67), modal rodoviario"},{"name":"MDF-e","description":"Emissao, encerramento e cancelamento do Manifesto Eletronico de Documentos Fiscais (modelo 58)"},{"name":"CEP","description":"Consulta de CEP"},{"name":"CNPJ","description":"Consulta de CNPJ"},{"name":"NCM","description":"Consulta da tabela NCM por codigo ou por descricao do produto"},{"name":"Notas","description":"Listagem, consulta e auditoria de notas"},{"name":"Empresas","description":"Cadastro e configuracao de empresas emissoras"},{"name":"Arquivos","description":"Download de XML, PDF, log e certificado. Nenhuma consome cota."},{"name":"Publicas","description":"Sem autenticacao: identificacao da API, sonda de vida e status operacional"},{"name":"Captura de notas recebidas","description":"Captura de notas recebidas por empresa"}]}