Documentação API NFS-e
Guia completo para integração com o sistema de Nota Fiscal de Serviços Eletrônica da Centi
Começando
A API NFS-e da Centi permite que empresas emitam notas fiscais de serviço diretamente de seus sistemas próprios através de integração via API REST.
Pré-requisitos
- Credenciais de acesso: Usuário e senha fornecidos pela prefeitura municipal
- Certificado Digital: Certificado ICP-Brasil A1 ou A3, dentro da validade, do próprio prestador (CNPJ da matriz ou da filial) ou de sócio ativo, para assinatura dos XMLs
- Cadastro ativo: Empresa cadastrada e habilitada no sistema da prefeitura
- Conhecimento técnico: Familiaridade com APIs REST e formato XML
Quick Start - 3 Passos
Entre em contato com a prefeitura do município para obter seu usuário e senha de acesso à API. É a mesma senha de acesso ao portal para emissão manual.
Monte o XML da NFS-e conforme o schema XSD fornecido. Assine digitalmente o XML com seu certificado digital, incluindo o certificado em <KeyInfo><X509Data><X509Certificate>.
Faça uma requisição POST para o endpoint da API com Content-Type: application/json e um corpo JSON com os campos Usuario, Senha e Xml (o XML assinado, como texto).
Autenticação
A API NFS-e não utiliza header de autenticação (não há HTTP Basic Auth nem token). As
credenciais (usuário e senha) seguem no corpo JSON da requisição, junto com o XML,
nos campos Usuario, Senha e Xml — os três são obrigatórios
em todas as rotas (emitir, cancelar, substituir e consultar).
Formato do corpo (JSON)
{
"Usuario": "{usuario}",
"Senha": "{senha}",
"Xml": "{XML assinado, como texto}"
}
Exemplo
Credenciais:
Usuário: "empresa123"
Senha: "senhaSegura@2025"
Corpo da requisição:
{
"Usuario": "empresa123",
"Senha": "senhaSegura@2025",
"Xml": "<?xml version=\"1.0\" encoding=\"utf-8\"?><GerarNfseEnvio xmlns=\"http://www.centi.com.br/files/nfse.xsd\">...</GerarNfseEnvio>"
}
Header obrigatório:
Content-Type: application/json
O XML vai dentro do campo Xml como uma string JSON comum: escape apenas as aspas
(\") e as quebras de linha (\n), como qualquer serializador JSON faz.
Não converta o XML em entidades HTML (<, >).
Usuário ou senha inválidos não geram HTTP 401: a resposta é HTTP 200 com a recusa no XML de retorno
(ex.: Usuário/senha inválidos.).
Estrutura da API
URL Base
https://api.centi.com.br
Por padrão, todas as requisições precisam informar a sigla da UF e o identificador do município
em que o prestador está cadastrado, representado pela variável Tenant.
Formato das URLs
https://api.centi.com.br/{recurso}/{UF}/{Tenant}
Exemplo:
https://api.centi.com.br/nfe/gerar/go/rioverde
Rotas disponíveis
| Rota (POST) | Raiz do XML | Uso |
|---|---|---|
/nfe/gerar |
GerarNfseEnvio |
Emissão da NFS-e |
/nfe/substituir |
GerarNfseEnvio com <RpsSubstituido> |
Substituição de uma NFS-e já emitida |
/nfe/cancelar |
CancelarNfseEnvio |
Cancelamento (ou solicitação de cancelamento) da NFS-e |
/nfe/consultar/rps |
ConsultarNfse |
Consulta da NFS-e gerada a partir do número do RPS |
/nfe/gerar//nfe/substituir/ |
GerarNfseEnvio |
Teste: executa as mesmas validações da emissão/substituição sem gravar a nota e devolve um retorno de teste (Numero 0000, Codigo *TESTE*) |
Todas as rotas são seguidas de /{UF}/{Tenant} e recebem o mesmo corpo JSON (Usuario, Senha e Xml)
e devolvem o XML de retorno como texto. Limite de uso: até 15 requisições por segundo por IP
(acima disso a resposta é HTTP 429).
| Parâmetro | Descrição | Exemplo |
|---|---|---|
{UF} |
Sigla da UF em minúsculo | go, sp, rj |
{Tenant} |
Nome do município em minúsculo, sem acentos, espaços ou hífens | rioverde, goiania |
Emitir Nota Fiscal
Endpoint
POST https://api.centi.com.br/nfe/gerar/{UF}/{Tenant}
Request Completo
POST https://api.centi.com.br/nfe/gerar/go/rioverde
Headers:
Content-Type: application/json
Body:
{
"Usuario": "{seu_usuario}",
"Senha": "{sua_senha}",
"Xml": "<?xml version=\"1.0\" encoding=\"utf-8\"?><GerarNfseEnvio xmlns=\"http://www.centi.com.br/files/nfse.xsd\"><Rps>...</Rps></GerarNfseEnvio>"
}
Classificação do Serviço: NBS, INDOP e Classificação Tributária
No XML de emissão, as tags <CodigoNbs>, <CodigoINDOP> e
<CodigoClassTrib> devem ser enviadas dentro do grupo <Servico>,
respeitando a sequência abaixo:
<Servico>
<Valores>
<!-- valores do serviço -->
</Valores>
<IssRetido>2</IssRetido>
<ItemListaServico>01.07</ItemListaServico>
<CodigoNbs>1.2345.67.89</CodigoNbs>
<CodigoINDOP>010101</CodigoINDOP>
<CodigoClassTrib>000001</CodigoClassTrib>
<CodigoCnae>6201501</CodigoCnae>
<!-- demais campos do serviço -->
</Servico>
Obrigatoriedade por regra de negócio
No XSD, <CodigoNbs>, <CodigoINDOP> e <CodigoClassTrib> possuem
minOccurs="0" para compatibilidade estrutural. Entretanto, no fluxo de emissão,
a API exige as três tags quando o município está integrado ao Ambiente de Dados Nacional (ADN)
— a partir de 03/08/2026 — ou quando a prefeitura parametrizou o NBS como obrigatório,
e rejeita o RPS quando as informações estiverem ausentes, inválidas ou incompatíveis com o NBS
informado. A única dispensa é o serviço de não incidência (item 99.01).
Retenções Federais e Detalhamento PIS/COFINS (NT 007)
O grupo <Valores> passou a aceitar seis tags de detalhamento
federal da NT 007. Elas são opcionais no XSD, mas devem respeitar obrigatoriamente a sequência
abaixo, sempre após <DescontoCondicionado>, e com a grafia exata
do schema (o XML diferencia maiúsculas de minúsculas):
<Valores>
<ValorServicos>1000.00</ValorServicos>
<ValorDeducoes>0.00</ValorDeducoes>
<ValorPis>6.50</ValorPis>
<ValorCofins>30.00</ValorCofins>
<ValorInss>0.00</ValorInss>
<ValorIr>0.00</ValorIr>
<ValorCsll>0.00</ValorCsll>
<OutrasRetencoes>0.00</OutrasRetencoes>
<ValorIss>50.00</ValorIss>
<Aliquota>5.00</Aliquota>
<DescontoIncondicionado>0.00</DescontoIncondicionado>
<DescontoCondicionado>0.00</DescontoCondicionado>
<!-- Detalhamento Federal (NT 007) -->
<CST>01</CST>
<vBcPisCofins>1000.00</vBcPisCofins>
<pAliqPis>0.65</pAliqPis>
<pAliqCofins>3.00</pAliqCofins>
<tpRetPisCofins>0</tpRetPisCofins>
</Valores>
| Tag | Tipo | Descrição |
|---|---|---|
CST | Texto (2 dígitos) | Código de Situação Tributária de PIS/COFINS, conforme tabela da NT 007; obrigatório quando o grupo PIS/COFINS é informado |
vBcPisCofins | Decimal | Base de cálculo do débito próprio de PIS/COFINS; quando informada, o servidor recalcula ValorPis e ValorCofins |
pAliqPis | Decimal | Alíquota de PIS aplicada (percentual, ex.: 0.65) |
pAliqCofins | Decimal | Alíquota de COFINS aplicada (percentual, ex.: 3.00) |
tpRetPisCofins | Numérico | Tipo de retenção de PIS/COFINS/CSLL, conforme tabela da NT 007 (ausente = 0, não retidos) |
vRetCSLL | Decimal | Soma dos valores retidos de PIS, COFINS e CSLL |
Pela NT 007, <ValorPis> e <ValorCofins> passam a representar o
débito de apuração própria do prestador e não abatem o valor líquido. A retenção de
INSS continua em <ValorInss> e a de IR em <ValorIr>; não existe
tag <VlINSS>.
<Aliquota> passou a ser obrigatória no XSD
No schema atual, <Aliquota> deixou de ser opcional
(minOccurs="0") e passou a minOccurs="1" dentro de
<Valores>. XMLs sem essa tag falham na validação estrutural.
Blocos opcionais: CondicaoPagamento, DadosObra e DadosImovel
<DadosObra> e <DadosImovel> ficam dentro de
<Prestador>, antes de <RazaoSocial>/<InscricaoMunicipal>.
<CondicaoPagamento> fica no final de <InfDeclaracaoPrestacaoServico>,
após <IncentivoFiscal>:
<Prestador>
<CpfCnpj><Cnpj>12345678000195</Cnpj></CpfCnpj>
<!-- Dados da obra (construção civil) -->
<DadosObra>
<CnoObra>123456789012</CnoObra>
<CepObra>74000000</CepObra>
<LogradouroObra>AVENIDA ANHANGUERA</LogradouroObra>
<NumeroObra>123</NumeroObra>
<BairroObra>CENTRO</BairroObra>
<ComplementoObra>QUADRA 5</ComplementoObra>
<QuadraObra>5</QuadraObra>
<LoteObra>12</LoteObra>
<CodigoMunicipioObra>5208707</CodigoMunicipioObra>
<UfObra>GO</UfObra>
</DadosObra>
<!-- Dados do imóvel -->
<DadosImovel>
<Cib>987654321</Cib>
<Cep>74000000</Cep>
<Logradouro>AVENIDA ANHANGUERA</Logradouro>
<Numero>123</Numero>
<Bairro>CENTRO</Bairro>
</DadosImovel>
<InscricaoMunicipal>123456</InscricaoMunicipal>
</Prestador>
...
<IncentivoFiscal>2</IncentivoFiscal>
<!-- Condições de pagamento -->
<CondicaoPagamento>
<Condicao>7</Condicao>
<QuantidadeParcela>3</QuantidadeParcela>
<Observacao>Pagamento em 3 parcelas mensais</Observacao>
<Parcela>
<Parcela>1</Parcela>
<Valor>333.34</Valor>
</Parcela>
</CondicaoPagamento>
</InfDeclaracaoPrestacaoServico>
Onde enviar o <DadosObra>
Envie <DadosObra> somente dentro de
<Prestador>: é a única posição lida pela API. Enviado diretamente em
<InfDeclaracaoPrestacaoServico>, o grupo é ignorado e a nota sai sem os dados
da obra. As tags usam PascalCase:
<CnoObra>, <CepObra>,
<LogradouroObra>, <NumeroObra>,
<BairroObra>, <ComplementoObra>,
<QuadraObra>, <LoteObra>,
<CodigoMunicipioObra> (código IBGE do município da obra) e
<UfObra> (opcional, apenas conferência — divergente do município, a nota é recusada).
Os nomes com sufixo Fild (<cepObraFild> etc.) não são
reconhecidos: são descartados sem aviso. Nos serviços de obra, informe o CNO ou o
endereço completo da obra e o município da obra.
<DadosImovel> também é aceito no final de
<InfDeclaracaoPrestacaoServico> (se vier nas duas posições, prevalece o de
<Prestador>) e é exigido — CIB ou CEP, Logradouro,
Número e Bairro — quando o INDOP informado é de operação com imóvel.
Retenções e Detalhamento Federal (NT 007)
Quando há retenção de PIS, COFINS ou CSLL, informe o tipo de retenção em
<tpRetPisCofins> e a soma dos valores retidos em
<vRetCSLL> — sempre os dois juntos. Exemplo com PIS, COFINS e CSLL retidos
(650,00 + 3.000,00 + 1.000,00):
<Valores>
<ValorServicos>100000.00</ValorServicos>
<ValorDeducoes>0.00</ValorDeducoes>
<ValorPis>650.00</ValorPis>
<ValorCofins>3000.00</ValorCofins>
<ValorInss>0.00</ValorInss>
<ValorIr>0.00</ValorIr>
<ValorCsll>0.00</ValorCsll>
<OutrasRetencoes>0.00</OutrasRetencoes>
<ValorIss>2000.00</ValorIss>
<Aliquota>2.00</Aliquota>
<DescontoIncondicionado>0.00</DescontoIncondicionado>
<DescontoCondicionado>0.00</DescontoCondicionado>
<!-- Detalhamento Federal (NT 007) -->
<CST>01</CST>
<vBcPisCofins>100000.00</vBcPisCofins>
<pAliqPis>0.65</pAliqPis>
<pAliqCofins>3.00</pAliqCofins>
<tpRetPisCofins>3</tpRetPisCofins>
<vRetCSLL>4650.00</vRetCSLL>
</Valores>
| Tag | Tipo | Descrição |
|---|---|---|
CST |
Texto (2 dígitos) | Situação Tributária de PIS/COFINS: 00–09, 49, 50–56, 60–67, 70–75, 98, 99 |
vBcPisCofins |
Decimal | Base de cálculo do débito próprio de PIS/COFINS (com ela, ValorPis = base × pAliqPis / 100 e ValorCofins = base × pAliqCofins / 100, calculados pelo servidor) |
pAliqPis |
Decimal | Alíquota de PIS (%) |
pAliqCofins |
Decimal | Alíquota de COFINS (%) |
tpRetPisCofins |
Numérico | 0 não retidos; 3 PIS/COFINS/CSLL retidos; 4 PIS/COFINS retidos; 5 só PIS; 6 só COFINS; 7 COFINS/CSLL; 8 só CSLL; 9 PIS/CSLL |
vRetCSLL |
Decimal | Soma de PIS + COFINS + CSLL retidos (abate o valor líquido) |
<Aliquota> passou a ser obrigatória no XSD
No schema anterior <Aliquota> era minOccurs="0".
No schema atual ela é minOccurs="1" dentro de <Valores>.
A ausência da tag quebra a validação estrutural do XML.
Valores de domínio
Os códigos válidos de <CST> e <tpRetPisCofins>
seguem as tabelas oficiais da NT 007 do padrão nacional da NFS-e.
A nota é recusada quando o grupo PIS/COFINS é informado sem <CST>, quando
<tpRetPisCofins> = 0 vem com <vRetCSLL> maior que zero, ou
quando há tipo de retenção declarado sem valor em <vRetCSLL>. A retenção de CSLL
enviada na tag antiga <ValorCsll> é convertida para <vRetCSLL>.
Os nomes CstPisCofins, TpRetPisCofins, VlBcPisCofins,
PAliqPis, PAliqCofins, VlRetCSLL e VlINSS,
divulgados anteriormente nesta página, são aceitos apenas provisoriamente — migre para os
nomes do XSD.
Blocos opcionais: CondicaoPagamento, DadosObra e DadosImovel
Posições aceitas pelo XSD e lidas pela API: <DadosObra> dentro de
<Prestador>; <DadosImovel> dentro de <Prestador>
ou no final de <InfDeclaracaoPrestacaoServico>; e, ao final de
<InfDeclaracaoPrestacaoServico>, após <IncentivoFiscal>,
nesta ordem: <CondicaoPagamento>, <DadosImovel> e <TipoOperacao>:
<Prestador>
<CpfCnpj><Cnpj>12345678000195</Cnpj></CpfCnpj>
<!-- 1. Dados da obra (construção civil) -->
<DadosObra>
<CnoObra>123456789012</CnoObra>
<CepObra>74000000</CepObra>
<LogradouroObra>AVENIDA ANHANGUERA</LogradouroObra>
<NumeroObra>123</NumeroObra>
<BairroObra>CENTRO</BairroObra>
<ComplementoObra>QUADRA 10</ComplementoObra>
<QuadraObra>10</QuadraObra>
<LoteObra>5</LoteObra>
<CodigoMunicipioObra>5208707</CodigoMunicipioObra>
<UfObra>GO</UfObra>
</DadosObra>
<InscricaoMunicipal>123456</InscricaoMunicipal>
</Prestador>
...
<RegimeEspecialTributacao>1</RegimeEspecialTributacao>
<OptanteSimplesNacional>2</OptanteSimplesNacional>
<IncentivoFiscal>2</IncentivoFiscal>
<!-- 2. Condições de pagamento (uma única <Parcela>) -->
<CondicaoPagamento>
<Condicao>7</Condicao>
<QuantidadeParcela>3</QuantidadeParcela>
<Observacao>Pagamento em 3 parcelas mensais</Observacao>
<Parcela>
<Parcela>1</Parcela>
<Valor>333.34</Valor>
</Parcela>
</CondicaoPagamento>
<!-- 3. Dados do imóvel (posição alternativa) -->
<DadosImovel>
<Cib>987654321</Cib>
<InscricaoImobiliaria>1.2.3.4567.8</InscricaoImobiliaria>
<Cep>74000000</Cep>
<Logradouro>AVENIDA ANHANGUERA</Logradouro>
<Numero>123</Numero>
<Bairro>CENTRO</Bairro>
<Complemento>SALA 2</Complemento>
</DadosImovel>
<!-- 4. Tipo de operação IBS/CBS (1 a 5) -->
<TipoOperacao>1</TipoOperacao>
</InfDeclaracaoPrestacaoServico>
Posicionamento e capitalização do <DadosObra>
Envie <DadosObra> dentro de <Prestador> — no nível de
<InfDeclaracaoPrestacaoServico> o grupo é ignorado. Todas as tags usam
PascalCase — atenção especial ao <CnoObra> (e não <Cno>).
Os nomes com sufixo Fild (<cepObraFild>,
<logradouroObraFild> etc.) não são reconhecidos e são descartados.
<TipoOperacao> (também aceito como <tpOper>) é exigido nos
subitens 10.05, 15.09, 17.12 e 25.05 da LC 116; se omitido nesses casos, o servidor assume 1
quando <Condicao> = 7 (a prazo) e 5 nos demais.
Validações realizadas pelo sistema
- Obrigatoriedade: com o município integrado ao ADN (a partir de 03/08/2026) ou com o NBS parametrizado como obrigatório pela prefeitura, as três tags são exigidas, exceto no serviço de não incidência (99.01).
- NBS cadastrado: o
<CodigoNbs>deve existir no cadastro de códigos NBS (com ou sem pontos). - NBS x Serviço: o
<CodigoNbs>deve estar associado ao serviço informado em<ItemListaServico>, conforme o cadastro AR017. - INDOP x NBS: o
<CodigoINDOP>deve possuir 6 dígitos numéricos, sem pontos, e corresponder ao INDOP vinculado ao NBS. - Classificação Tributária x NBS: o
<CodigoClassTrib>deve possuir 6 dígitos numéricos e corresponder à classificação vinculada ao NBS. - Persistência: após a validação, o identificador interno do NBS é gravado na nota fiscal gerada.
Exemplos de rejeição
É obrigatório informar as tags <CodigoNbs>, <CodigoINDOP> e <CodigoClassTrib> do serviço.Código NBS informado em <CodigoNbs> não existe no cadastro de código NBS.Código NBS informado não está vinculado ao serviço informado em <ItemListaServico>. Verifique o cadastro do serviço (AR017).Código INDOP inválido para o NBS informado.Código de Classificação Tributária inválido para o NBS informado.
Response de Sucesso (HTTP 200)
Quando a nota é emitida com sucesso, a API retorna, como texto no corpo da resposta, um XML <GerarNfseResposta> contendo:
- Número da NFS-e gerada (
<Numero>) - Código de verificação (
<CodigoVerificacao>) - Identificador da nota (atributo
Idde<InfNfse>) — guarde-o: é exigido no cancelamento - Data e hora da emissão e situação da nota (
<Status>: 0 Ativa, 1 Substituída, 2 Aguardando cancelamento, 3 Cancelada) - Valores apurados (
<ValoresNfse>) e a declaração da prestação (<DeclaracaoPrestacaoServico>, com Serviço, Prestador e Tomador) - Bloco
<DadosNotaNacional>com os dados da Reforma Tributária
O grupo <InfNfse> do retorno passou a incluir os campos
<DescricaoCancelamento>, <DescricaoSubstituicao>,
<Observacao> e o bloco <DadosNotaNacional>; a
<Discriminacao> vem em <DeclaracaoPrestacaoServico>, dentro de
<Servico>. A <ChaveAcessoNacional> vem vazia até a nota ser
autorizada no Ambiente de Dados Nacional:
<DadosNotaNacional>
<AliqotaIBS>0</AliqotaIBS>
<AliquotaCBS>0</AliquotaCBS>
<ValorIBS>0</ValorIBS>
<ValorCBS>0</ValorCBS>
<ChaveAcessoNacional>...</ChaveAcessoNacional>
</DadosNotaNacional>
Atenção à grafia de <AliqotaIBS>
A tag é declarada no XSD como <AliqotaIBS> (sem a letra "u"),
diferente de <AliquotaCBS>. Ao fazer o parse do retorno, utilize
exatamente a grafia do schema. Além disso, no grupo <ValoresNfse>
os campos BaseCalculo, Aliquota, ValorIss e
ValorLiquido são sempre retornados — o valor líquido vem em
<ValorLiquido>, e não em <ValorLiquidoNfse> como consta no XSD —,
seguidos do detalhamento (ValorServicos, ValorDeducoes, retenções e descontos)
e das tags da NT 007. O retorno traz campos que não constam do XSD (ex.: Status,
IssRetido, IdentificacaoRps): leia-o pelo nome das tags, sem validá-lo contra o schema.
Erros Comuns
| Código | Erro | Solução |
|---|---|---|
200 + <ListaMensagemRetorno> |
Nota recusada: credenciais inválidas, XML inválido, assinatura digital, prestador/tomador, NBS, INDOP, Classificação Tributária ou outra regra de negócio | Leia a segunda <Mensagem> (motivo da recusa); a primeira traz o Cód. erro, número a informar ao suporte |
200 + <ListaMensagemRetorno> |
... bloqueada temporariamente para este emissor por excesso de erros consecutivos |
Sete recusas em 3 minutos bloqueiam o emissor por 5 minutos. Corrija o XML antes de reenviar e não reenvie em laço |
200 + <ListaMensagemRetorno> |
... temporariamente indisponível ... (envios anteriores em andamento ou limite de envios simultâneos do município) |
No máximo 3 envios simultâneos por CNPJ e um limite por município. Aguarde a resposta dos envios anteriores e reenvie |
400 |
Corpo JSON inválido ou sem Usuario, Senha ou Xml; ou falha ao encaminhar a requisição ao município (JSON com error/message) |
Confira o JSON e a UF/Tenant da URL |
415 |
Content-Type diferente de application/json |
Envie Content-Type: application/json |
429 |
Mais de 15 requisições por segundo a partir do mesmo IP | Aguarde o tempo informado no header Retry-After e reduza o paralelismo |
500 |
Erro no servidor | Tente novamente ou contate suporte |
Cancelar Nota Fiscal
Endpoint
POST https://api.centi.com.br/nfe/cancelar/{UF}/{Tenant}
Estrutura do XML de Cancelamento
<CancelarNfseEnvio xmlns="http://www.centi.com.br/files/nfse.xsd">
<Pedido>
<InfPedidoCancelamento>
<IdentificacaoNfse>
<Numero>123456</Numero>
<CpfCnpj>
<Cnpj>12345678000195</Cnpj>
</CpfCnpj>
<InscricaoMunicipal>12345</InscricaoMunicipal>
<CodigoMunicipio>5218805</CodigoMunicipio>
<CodigoVerificacao>ABCD1234</CodigoVerificacao>
<DescricaoCancelamento>Motivo do cancelamento</DescricaoCancelamento>
<Id>{atributo Id de <InfNfse> no retorno da emissão}</Id>
</IdentificacaoNfse>
<CodigoCancelamento>1</CodigoCancelamento>
</InfPedidoCancelamento>
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#"><!-- Assinatura Digital --></Signature>
</Pedido>
</CancelarNfseEnvio>
Campos que passaram a ser obrigatórios
Em <IdentificacaoNfse>, as tags
<CodigoVerificacao> e <Id> passaram a
minOccurs="1". A tag <CodigoCancelamento> também
deixou de ser opcional em <InfPedidoCancelamento>.
A ordem exigida é: Numero, CpfCnpj,
InscricaoMunicipal, CodigoMunicipio,
CodigoVerificacao, DescricaoCancelamento, Id.
A nota é localizada pela combinação Numero + CodigoVerificacao +
Id, copiados do XML de retorno da emissão (InfNfse/Numero,
InfNfse/CodigoVerificacao e o atributo Id de <InfNfse>).
<DescricaoCancelamento> (até 500 caracteres) é obrigatória quando o código é 6.
Conforme a parametrização do município, o pedido cancela a nota imediatamente
(<Status> 3 no retorno) ou registra uma solicitação que aguarda a
autorização da prefeitura (<Status> 2). Podem se aplicar prazo máximo após
a emissão e o bloqueio por competência (DMS/REST) encerrada; nota já cancelada ou já
substituída não pode ser cancelada.
Código de Cancelamento
| Código | Descrição |
|---|---|
1 |
Rasura |
2 |
Erro preenchimento |
3 |
Fim do prazo de validade |
4 |
Fora de sequência numérica e cronológica |
5 |
Desacordo comercial |
6 |
Outros (exige <DescricaoCancelamento>) |
Substituir Nota Fiscal
Endpoint
POST https://api.centi.com.br/nfe/substituir/{UF}/{Tenant}
A substituição tem rota própria e usa o mesmo XML da geração (raiz <GerarNfseEnvio>),
com informações adicionais sobre qual nota está sendo substituída. Na rota de geração
(/nfe/gerar) o bloco <RpsSubstituido> é ignorado e a nota é emitida
como uma nota nova.
Bloco RpsSubstituido
<Rps>
<IdentificacaoRps>
<Numero>2</Numero>
<Serie>A1</Serie>
<Tipo>1</Tipo>
</IdentificacaoRps>
<DataEmissao>2025-12-16T10:00:00</DataEmissao>
<Status>1</Status>
<!-- Bloco de Substituição: Numero = número da NFS-e a ser substituída -->
<RpsSubstituido>
<Numero>1542</Numero>
<Serie>A1</Serie>
<Tipo>1</Tipo>
</RpsSubstituido>
</Rps>
Como funciona:
Ao enviar à rota /nfe/substituir um XML com o bloco <RpsSubstituido>,
o sistema gera uma nova nota com os dados atualizados e marca a nota anterior como
Substituída (<Status> 1) — ela não é cancelada. Em
<RpsSubstituido><Numero> informe o número da NFS-e a ser
substituída (o <Numero> de <InfNfse> no retorno), e em
<IdentificacaoRps> um RPS novo, ainda não utilizado. Uma mesma nota só pode ser
substituída uma vez, e a prefeitura pode bloquear a substituição ou a troca de tomador.
Principais Campos do XML
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
Numero |
Numérico | SIM | Número do RPS (único por prestador) |
Serie |
Texto | SIM | Série do RPS |
DataEmissao |
Data/hora | SIM | Data/hora do RPS (YYYY-MM-DDThh:mm:ss; a API também aceita YYYY-MM-DD). A NFS-e recebe a data/hora do processamento |
Inscricao (Prestador) |
Texto | SIM | Inscrição municipal do prestador, pela qual ele é localizado no cadastro do município |
ValorServicos |
Decimal | SIM | Valor total dos serviços |
ValorIss |
Decimal | NÃO | Valor do ISS; é recalculado pelo servidor (base de cálculo × alíquota) |
Aliquota |
Decimal | SIM | Alíquota do ISS em percentual (ex.: 5.00), entre 2,00 e 5,00 e igual à do serviço cadastrado no município (exceto Simples Nacional/MEI e tributação fora do município) |
ItemListaServico |
Texto | SIM | Código do serviço da LC 116/2003 (ex.: 01.07). Em alguns municípios a tag recebe o código interno do serviço; nesse caso a mensagem de recusa informa o código a utilizar |
CodigoNbs |
Texto (12 caracteres, ex.: 1.2345.67.89) | REGRA DE NEGÓCIO | Código NBS vinculado ao serviço cadastrado na AR017 |
CodigoINDOP |
Numérico (6 dígitos) | REGRA DE NEGÓCIO | Indicador da operação, sem pontos, vinculado ao NBS informado; minOccurs="0" no XSD |
CodigoClassTrib |
Numérico (6 dígitos) | REGRA DE NEGÓCIO | Classificação Tributária vinculada ao NBS informado; minOccurs="0" no XSD |
CodigoCnae |
Numérico | NÃO | Código CNAE |
Discriminacao |
Texto | SIM | Descrição do serviço (até 2000 caracteres) |
IssRetido |
Numérico | NÃO | 1=Sim (retido pelo tomador), 2=Não; ausente = não retido |
CodigoMunicipio (Servico) |
Numérico (IBGE) | SIM | Código IBGE do município onde o serviço foi prestado |
Municipio |
Numérico (IBGE) | SIM | Código IBGE do município de incidência do ISS (opcional no XSD, exigido pela API) |
Identificacao |
Grupo | SIM | CPF/CNPJ válido do tomador (ou <Estrangeiro>1 com <Documento); sem ele a nota é recusada |
RazaoSocial (Tomador) |
Texto | SIM | Nome/razão social do tomador |
CodigoMunicipio (Endereço do Tomador) |
Numérico (IBGE) | SIM | Município do tomador (para tomador estrangeiro, informe o país em <CodigoPais>) |
Signature |
XMLDSig | SIM | Assinatura com o certificado do prestador ou de sócio ativo, incluindo o certificado X.509 em <KeyInfo> |
CST |
Texto | REGRA DE NEGÓCIO | CST de PIS/COFINS (NT 007) — dentro de <Valores>; obrigatório quando o grupo PIS/COFINS é informado |
tpRetPisCofins |
Numérico | NÃO | Tipo de retenção de PIS/COFINS/CSLL (NT 007); ausente = 0 (não retidos) |
vBcPisCofins |
Decimal | NÃO | Base de cálculo de PIS/COFINS |
pAliqPis / pAliqCofins |
Decimal | NÃO | Alíquotas de PIS e COFINS aplicadas |
vRetCSLL |
Decimal | NÃO | Soma de PIS, COFINS e CSLL retidos (exige tpRetPisCofins diferente de 0) |
ValorInss |
Decimal | NÃO | Contribuição Previdenciária retida (não existe tag VlINSS) |
Condicao |
Numérico | NÃO | Condição de pagamento (1 à vista, 2 cheque, 3 cartão de crédito, 4 cartão de débito, 5 crédito em conta, 6 duplicata, 7 a prazo); obrigatório se <Condicao for enviado |
Quantidade |
Numérico | NÃO | Quantidade de parcelas; obrigatório dentro de <Condicao |
CnoObra |
Texto | NÃO | CNO da obra, em <DadosObra> dentro de <Prestador> (PascalCase); nos serviços de obra, informe o CNO ou o endereço completo e o município da obra |
Cib |
Texto | NÃO | Código CIB do imóvel, em <DadosImovel>; nas operações com imóvel, informe o CIB ou o endereço completo |
TipoOperacao |
Numérico (1 a 5) | REGRA DE NEGÓCIO | Tipo de operação IBS/CBS, ao final de <InfDeclaracao (alias <tpOper>); exigido nos subitens 10.05, 15.09, 17.12 e 25.05 |
Códigos de Referência
ISS Retido
| Código | Significado |
|---|---|
1 |
Sim - ISS retido pelo tomador |
2 |
Não - ISS recolhido pelo prestador |
Códigos de Serviço (Principais)
| Código | Descrição |
|---|---|
01.07 |
Suporte técnico em informática |
04.01 |
Medicina e biomedicina |
07.01 |
Engenharia, arquitetura |
16.02 |
Transporte municipal |
17.01 |
Assessoria ou consultoria |
Detalhamento Federal (NT 007)
| Campo | Formato | Origem do domínio |
|---|---|---|
CST |
Texto (código numérico com zeros à esquerda, ex.: 01) |
Tabela de CST de PIS/COFINS da NT 007: 00–09, 49, 50–56, 60–67, 70–75, 98, 99 |
tpRetPisCofins |
Numérico inteiro | Tabela de tipos de retenção da NT 007: 0 PIS/COFINS/CSLL não retidos; 3 PIS/COFINS/CSLL retidos; 4 PIS/COFINS retidos, CSLL não retido; 5 PIS retido, COFINS/CSLL não retidos; 6 COFINS retido, PIS/CSLL não retidos; 7 PIS não retido, COFINS/CSLL retidos; 8 PIS/COFINS não retidos, CSLL retido; 9 COFINS não retido, PIS/CSLL retidos (1 e 2 são legados) |
Condicao |
Numérico inteiro (até 5 dígitos) | Condição de pagamento (tabela Centi): 1 à vista, 2 cheque, 3 cartão de crédito, 4 cartão de débito, 5 crédito em conta, 6 duplicata, 7 a prazo |
TipoOperacao |
Numérico inteiro (1 a 5) | Tipo de operação IBS/CBS (tpOper da NFS-e Nacional): 1 fornecimento com pagamento posterior; 2 recebimento do pagamento com fornecimento já realizado; 3 fornecimento com pagamento já realizado; 4 recebimento do pagamento com fornecimento posterior; 5 fornecimento e recebimento do pagamento concomitantes |
Referência oficial
Os domínios de CST e tpRetPisCofins estão declarados no XSD da Centi
(tsCstPisCofins e tsTipoRetPisCofins) e seguem as tabelas publicadas na
Nota Técnica 007 do padrão nacional da NFS-e. Consulte sempre a versão vigente
da NT para a relação completa e atualizada dos códigos.
NBS, INDOP e Classificação Tributária
| Campo | Formato | Validação aplicada |
|---|---|---|
CodigoNbs |
12 caracteres no formato 9.9999.99.99 (o servidor também aceita sem os pontos) |
Deve existir no cadastro NBS e estar vinculado ao ItemListaServico informado |
CodigoINDOP |
6 dígitos numéricos, sem pontuação | Deve coincidir exatamente com o INDOP cadastrado para o NBS |
CodigoClassTrib |
6 dígitos numéricos | Deve coincidir exatamente com a Classificação Tributária cadastrada para o NBS |
Validação estrutural x validação de negócio
O XSD verifica presença opcional, sequência e formato. A compatibilidade entre Serviço, NBS, INDOP e Classificação Tributária é validada no processamento da API com base nos cadastros da Centi. A API não valida o XML contra o XSD no recebimento: uma tag com nome ou capitalização diferente do schema é ignorada sem aviso e o valor não chega à nota. Valide o XML contra o XSD antes de integrar.
Perguntas Frequentes
Como obter as credenciais de acesso?
Entre em contato com a prefeitura do município onde sua empresa está cadastrada.
Preciso de certificado digital?
Sim. O XML de emissão e de substituição deve ser assinado digitalmente com certificado ICP-Brasil A1 ou A3
dentro da validade, do próprio prestador (CNPJ da matriz ou da filial) ou de sócio ativo, com o
certificado incluído em <KeyInfo><X509Data><X509Certificate>. Sem isso a
resposta é Assinatura digital inválida., incorreta. ou expirada.
Existe ambiente de testes?
Sim. As rotas POST /nfe/gerar/homologacao/{UF}/{Tenant} e
POST /nfe/substituir/homologacao/{UF}/{Tenant} executam as mesmas validações da emissão,
sem gravar a nota, e devolvem um retorno de teste (Numero 0000 e
CodigoVerificacao *TESTE*). As credenciais e os cadastros usados são os de produção.
Posso cancelar uma nota via API?
Sim, através do endpoint POST /nfe/cancelar/{UF}/{Tenant} com XML de cancelamento.
Posso substituir uma nota já emitida?
Sim. Use o endpoint POST /nfe/substituir/{UF}/{Tenant} com o mesmo XML da geração,
adicionando o bloco <RpsSubstituido> com o número da NFS-e que está sendo
substituída. Na rota de geração o bloco é ignorado.
Por que CodigoINDOP e CodigoClassTrib são opcionais no XSD, mas podem gerar rejeição?
O atributo minOccurs="0" mantém compatibilidade estrutural do schema. Na emissão, porém, o provider aplica regras de negócio e valida os códigos contra o cadastro do NBS. Assim, um XML pode passar na validação XSD e ainda ser rejeitado por inconsistência cadastral.
Documentação OpenAPI / Swagger
Tenha acesso a documentação interativa no padrão OpenAPI.
Especificação OpenAPI
Arquivos para Download
Exemplos completos de XML de cada requisição:
Schemas XSD
Arquivos de schema para validação estrutural dos XMLs (baixe os dois para a mesma pasta: o nfse.xsd importa o schema da assinatura digital):
Atualizações/Alterações
A documentação, os XMLs de exemplo, o XSD e o validador foram revisados e alinhados ao comportamento atual da API. Não houve mudança na API: os pontos abaixo corrigem orientações que estavam divergentes.
- Não há HTTP Basic Auth: usuário, senha e XML seguem no corpo JSON (
Usuario,SenhaeXml), comContent-Type: application/json. - Recusas de negócio (inclusive credenciais inválidas) retornam HTTP 200 com
<ListaMensagemRetorno>; os códigos HTTP de erro são 400, 415, 429 e 500. - A substituição usa a rota própria
/nfe/substituir/{UF}/{Tenant}; em<RpsSubstituido><Numero>vai o número da NFS-e substituída, que passa à situação "Substituída". - Documentadas as rotas de consulta de RPS e de homologação (teste sem gravar a nota).
- NT 007: os nomes corretos das tags são
<CST>,<vBcPisCofins>,<pAliqPis>,<pAliqCofins>,<tpRetPisCofins>e<vRetCSLL>. Não existe<VlINSS>(o INSS retido segue em<ValorInss>). Os nomes divulgados antes (CstPisCofins,VlRetCSLLetc.) são aceitos apenas provisoriamente. <DadosObra>deve ser enviado dentro de<Prestador>; no nível de<InfDeclaracaoPrestacaoServico>ele é ignorado. Novas tags<CodigoMunicipioObra>e<UfObra>. As tags com sufixoFildnão são reconhecidas.<DadosImovel>aceita também<InscricaoImobiliaria>e<Complemento>.- Documentado o
<TipoOperacao>(alias<tpOper>) do IBS/CBS. - Obrigatórios na emissão:
<InscricaoMunicipal>do prestador,<IdentificacaoTomador>, razão social e município do tomador,<CodigoMunicipio>e<MunicipioIncidencia>do serviço, e a assinatura com o certificado em<KeyInfo>. - Cancelamento: o código 6 (Outros) exige
<DescricaoCancelamento>; o XSD passou a aceitar até 500 caracteres nesse campo.
- O valor líquido vem em
<ValorLiquido>; o retorno traz<Status>, o detalhamento dos valores e campos que não constam do XSD. O atributoIdde<InfNfse>é o identificador exigido no cancelamento.
- Os quatro modelos XML e o
nfse.xsdforam atualizados; o schema da assinatura (xmldsig-core-schema20020212.xsd) passou a ser disponibilizado para download.
Em razão da alteração promovida pelo ADN (Ambiente de Dados Nacional) da NFS-e, as tags
<CodigoNbs>, <CodigoINDOP> e <CodigoClassTrib>
passam a ser obrigatórias no XML de emissão a partir de 03/08/2026.
Esses dados alimentam o grupo IBSCBS exigido no leiaute nacional da DPS/NFS-e.
- A LC 214/2025 instituiu o IBS e a CBS. As Notas Técnicas do CGNFS-e (NT 004 e NT 007) definem o grupo
IBSCBSno leiaute da DPS/NFS-e. - O Portal Nacional da NFS-e prevê a obrigatoriedade do grupo IBS/CBS e de suas regras de validação a partir de 03/08/2026.
- Anexo VI – Leiautes e Regras de Negócio V1.03.00 (NT 007), aba
LEIAUTE DPS_NFS-e:cIndOpecClassTribpossuem ocorrência 1-1 dentro do grupo. - No XSD nacional
tiposComplexos_v1.01.xsd, o elementoIBSCBSpossuiminOccurs="0": ou o grupo é enviado completo, ou é omitido — não há meio-termo.
- A partir de 03/08/2026,
<CodigoNbs>,<CodigoINDOP>e<CodigoClassTrib>passam a ser obrigatórios no XML de emissão. - Os valores devem seguir a correlação oficial do Anexo VIII V1.01.00 (Item da LC 116 × NBS × cIndOp × cClassTrib). Combinações fora da tabela são rejeitadas pelo ADN.
- Com o município integrado ao ADN, o XML de emissão sem esses campos é recusado com a mensagem
É obrigatório informar as tags <CodigoNbs>, <CodigoINDOP> e <CodigoClassTrib> do serviço.
<ItemListaServico>01.07</ItemListaServico>
<CodigoNbs>1.2345.67.89</CodigoNbs>
<CodigoINDOP>010101</CodigoINDOP>
<CodigoClassTrib>000001</CodigoClassTrib>
<CodigoCnae>6201501</CodigoCnae>
Exceção — não incidência (9901):
- Serviços de não incidência, com código de tributação nacional
9901, estão dispensados: o Anexo VIII não estabelece correlação para o item 99.01.01 e, nesses casos, o grupo IBS/CBS é omitido. - A dispensa vale somente para o
9901. Os demais subitens do grupo 99 (99.02, 99.03 e 99.04) possuem correlação oficial e seguem a regra geral.
- Documentação Técnica – RTC: gov.br/nfse — Documentação Técnica RTC
- Anexo VIII V1.01.00 e Anexo VI V1.03.00 (NT 007) estão disponíveis na página acima.
O schema oficial da Centi foi atualizado, ampliando o XML de emissão com campos de detalhamento federal, blocos de condição de pagamento, obra e imóvel, além de endurecer a obrigatoriedade de alguns campos já existentes.
<CST>,<vBcPisCofins>,<pAliqPis>,<pAliqCofins>,<tpRetPisCofins>e<vRetCSLL>(nomes corrigidos em 06/11/2026).- Devem ser enviados no final do grupo
<Valores>, após<DescontoCondicionado>, na ordem definida no XSD. - Os domínios de
CSTetpRetPisCofinsseguem as tabelas da NT 007.
<CondicaoPagamento>—Condicao,QuantidadeParcela,Observacaoe uma<Parcela>; fica em<InfDeclaracaoPrestacaoServico>, após<IncentivoFiscal>.<DadosObra>—CnoObra,CepObra,LogradouroObra,NumeroObra,BairroObra,ComplementoObra,QuadraObra,LoteObra,CodigoMunicipioObraeUfObra; fica dentro de<Prestador>.<DadosImovel>—Cib,InscricaoImobiliaria,Cep,Logradouro,Numero,Bairro,Complemento; dentro de<Prestador>ou após<CondicaoPagamento>.
<Aliquota>dentro de<Valores>.<Signature>na declaração de prestação de serviço e no pedido de cancelamento.<CodigoVerificacao>e<Id>em<IdentificacaoNfse>, e<CodigoCancelamento>em<InfPedidoCancelamento>.
<CodigoNbs>é aceito com ou sem pontos separadores.- Nomenclatura de obra: use
<CnoObra>(PascalCase). As tags legadas com sufixoFildnão são reconhecidas pela API e são descartadas. - O bloco
<Prestador>passou a aceitarEndereco,Contato,RazaoSocial,NomeFantasiaeInscricaoEstadual. <Tomador>passou a aceitarEstrangeiro,DocumentoEstrangeiroeInscricaoEstadual.- No retorno,
<InfNfse>incluiDescricaoCancelamento,DescricaoSubstituicao,Observacaoe<DadosNotaNacional>(aDiscriminacaovem em<Servico>). - O validador da documentação recebeu 5 novas regras e teve as regras de
<DadosObra>revisadas.
O XML de emissão passa a receber as tags <CodigoINDOP> e <CodigoClassTrib> dentro do grupo <Servico>, logo após <CodigoNbs>. Os dados são utilizados para validar a classificação da operação e garantir a persistência do NBS correto na NFS-e.
<ItemListaServico>01.07</ItemListaServico>
<CodigoNbs>1.2345.67.89</CodigoNbs>
<CodigoINDOP>010101</CodigoINDOP>
<CodigoClassTrib>000001</CodigoClassTrib>
<CodigoCnae>6201501</CodigoCnae>
Regras aplicadas no processamento:
- O NBS deve estar vinculado ao serviço informado em
<ItemListaServico>, conforme cadastro AR017. - O INDOP deve conter 6 dígitos numéricos, sem pontos, e coincidir com o código vinculado ao NBS.
- A Classificação Tributária deve conter 6 dígitos numéricos e coincidir com o cadastro do NBS.
- Em caso de divergência, o RPS é rejeitado com mensagem específica ao contribuinte.
- No XSD, as duas novas tags permanecem com
minOccurs="0"; a obrigatoriedade é tratada como regra de negócio no provider.
Código INDOP inválido para o NBS informado.Código de Classificação Tributária inválido para o NBS informado.Código NBS informado não está vinculado ao serviço informado em <ItemListaServico>. Verifique o cadastro do serviço (AR017).
A documentação da API agora conta com um Validador de XML integrado. Antes de enviar seu XML à API, você pode verificar instantaneamente se a estrutura está correta — sem precisar abrir chamado de suporte.
- Namespace correto (
http://www.centi.com.br/files/nfse.xsd) - Encoding e estrutura XML (parse errors)
- Tamanho fixo de CPF (11 dígitos), CNPJ (14 dígitos), CEP (8 dígitos) e UF (2 caracteres)
- Campo
<CodigoNbs>obrigatório por regra de negócio - Campos
<CodigoINDOP>e<CodigoClassTrib>com exatamente 6 dígitos numéricos - Sequência correta das tags no grupo
<Servico>: NBS → INDOP → Classificação Tributária - Datas no formato ISO 8601 (
dateTime) - Valores decimais com ponto (não vírgula) como separador
- Campos fora do XSD:
<NaturezaOperacao>,<NomeFantasia>no Tomador,<Observacao>no nível principal - Validações de padrão XSD:
IssRetido,Status,ExigibilidadeISS,CodigoCancelamentoe outros
- Acesse o menu Validador de XML na barra lateral
- Arraste o arquivo
.xmlou cole o conteúdo diretamente - Clique em Validar XML — o resultado aparece imediatamente
A partir de 13/01/2026, os XMLs de envio e retorno passam a incluir o campo <CodigoNbs> (Nomenclatura Brasileira de Serviços) dentro do grupo <Servico>, efetuando assim a classificação do serviço conforme a NBS.
- Tag:
<CodigoNbs>- Código da Nomenclatura Brasileira de Serviços (NBS) - Localização no XML de envio:
<Servico>dentro de<InfDeclaracaoPrestacaoServico> - Localização no XML de retorno:
<Servico>dentro de<DeclaracaoPrestacaoServico> - Formato no layout Centi atual: 12 caracteres conforme
tsCodigoNbsdo XSD (ex.:1.2345.67.89) - Obrigatoriedade: Obrigatório quando o município está integrado ao ADN (a partir de 03/08/2026) ou quando a prefeitura parametriza o NBS como obrigatório — junto com
<CodigoINDOP>e<CodigoClassTrib> - Relação com ItemListaServico: O código NBS deve ser compatível com o Item da Lista de Serviços (LC 116/2003) informado
- A tabela completa de códigos NBS está disponível no link "https://www.gov.br/nfse/pt-br/biblioteca/documentacao-tecnica/rtc/anexoviii-correlacaoitemnbsindopcclasstrib_ibscbs_v1-00-00.xlsx"
- O código NBS deve ser selecionado conforme a atividade específica do serviço prestado
- A relação entre ItemListaServico (LC 116/2003) e CodigoNbs é de 1 para N (um item da lista pode ter vários códigos NBS)
- Sistemas integradores devem implementar validação do código NBS para evitar rejeição
O XML de envio agora suporta informações sobre RPS que está sendo substituído através da nova tag <RpsSubstituido> dentro do grupo <Rps>.
- Tag principal:
<RpsSubstituido>- Contém dados do RPS que está sendo substituído <Numero>- Número da NFS-e que está sendo substituída<Serie>- Série (exigida pelo XSD)<Tipo>- Tipo (exigido pelo XSD)- O bloco só é considerado na rota
/nfe/substituir/{UF}/{Tenant}; na rota de geração ele é ignorado.
O XML de envio agora permite informar dados detalhados da obra diretamente no grupo <Prestador> através da nova tag <DadosObra>.
- Tag principal:
<DadosObra>- Contém informações detalhadas da obra <CnoObra>- Código CNO (Cadastro Nacional de Obras) da obra<CepObra>- CEP do local da obra<LogradouroObra>- Logradouro completo da obra<NumeroObra>- Número do endereço da obra<BairroObra>- Bairro onde está localizada a obra<ComplementoObra>- Complemento do endereço da obra<QuadraObra>- Quadra da obra (quando aplicável)<LoteObra>- Lote da obra (quando aplicável)
Atenção: todos os nomes de tag usam PascalCase (primeira letra maiúscula), igual ao padrão do XSD. Tags com inicial minúscula (cepObra, logradouroObra etc.) não são reconhecidas pelo sistema Centi, pois XML é case-sensitive: os dados são descartados e, nos serviços de obra, a nota é recusada por falta dos dados da obra. O XML de retorno da API usa os mesmos nomes (CnoObra, CepObra, LogradouroObra etc.); não existem tags com o sufixo "Fild".
O XML de envio agora suporta informações sobre intermediário de serviços através da nova tag <Intermediario>.
- Tag principal:
<Intermediario>- Contém dados do intermediário de serviços <IdentificacaoIntermediario>- Grupo com CPF/CNPJ e Inscrição Municipal do intermediário<RazaoSocial>- Razão social do intermediário- O grupo é aceito pelo XSD; atualmente, porém, os dados do intermediário não são registrados na NFS-e emitida pela API.
Alguns campos foram removidos do XML de envio para simplificação e adequação ao padrão nacional.
<NaturezaOperacao>- Removido do nível principal de InfDeclaracaoPrestacaoServico<Observacao>- Removido do nível principal (mantido apenas dentro de Servico)<NomeFantasia>- Removido do grupo Tomador
A partir de 12/01/2026, o XML de retorno das notas fiscais incluirá uma nova tag <DadosNotaNacional> contendo informações sobre IBS, CBS e a chave de acesso nacional.
- Tag principal:
<DadosNotaNacional>- Contém dados referentes à nota nacional <AliqotaIBS>- Alíquota aplicada para calcular o IBS<AliquotaCBS>- Alíquota aplicada para calcular o CBS<ValorIBS>- Valor calculado do IBS<ValorCBS>- Valor calculado do CBS<ChaveAcessoNacional>- Chave de acesso do registro da nota nacional
As tags dentro de <DadosNotaNacional> tiveram seus nomes padronizados para melhor legibilidade. Os nomes antigos não devem mais ser utilizados.
<pAliqIBS>foi substituída por<AliqotaIBS><pAliqCBS>foi substituída por<AliquotaCBS><vIBS>foi substituída por<ValorIBS><vCBS>foi substituída por<ValorCBS><chAcesso>foi substituída por<ChaveAcessoNacional>
O XML de retorno foi enriquecido com novos campos informativos para melhor rastreabilidade e gestão das notas fiscais.
<DescricaoCancelamento>- Descrição do motivo de cancelamento da nota<DescricaoSubstituicao>- Descrição do motivo de substituição da nota<Discriminacao>- Discriminação detalhada do serviço prestado (retornada em<DeclaracaoPrestacaoServico>→<Servico>)<Observacao>- Observações adicionais sobre a nota fiscal<Status>- Situação da nota: 0 Ativa, 1 Substituída, 2 Aguardando cancelamento, 3 Cancelada<ValorCredito>,<EnderecoPrestadorServico>e<OrgaoGerador>- declarados no XSD, mas atualmente não preenchidos no retorno (o endereço do prestador vem em<DeclaracaoPrestacaoServico>→<Prestador>)
O XML de retorno agora inclui estruturas específicas para informações de cancelamento e substituição de notas fiscais.
<NfseCancelamento>- Contém informações completas sobre o cancelamento da nota<NfseSubstituicao>- Contém informações sobre a nota fiscal substituta<Confirmacao>- Dados da confirmação do cancelamento<DataHora>- Data e hora da confirmação do cancelamento<NfseSubstituidora>- Número da nota fiscal que substituiu- Esses grupos estão declarados no XSD, mas atualmente a API não os preenche: a situação da nota é informada em
<Status>(1 Substituída, 2 Aguardando cancelamento, 3 Cancelada) e em<DescricaoCancelamento>/<DescricaoSubstituicao>; a nota substituta traz o número da substituída em<NfseSubstituida>.
Quando enviados no XML de entrada, os dados da obra agora são retornados dentro do grupo <Prestador> no XML de retorno.
- Os mesmos campos enviados são retornados para confirmação, com os mesmos nomes (
CnoObra,CepObraetc.); em nota sem obra o grupo vem com as tags vazias - Permite verificar se os dados da obra foram registrados corretamente
- Localização: dentro de
<DeclaracaoPrestacaoServico>→<Prestador>
A estrutura <ValoresNfse> foi simplificada, mantendo apenas os campos essenciais para o resumo dos valores da nota.
<BaseCalculo>- Base de cálculo do ISS<Aliquota>- Alíquota aplicada<ValorIss>- Valor do ISS calculado<ValorLiquido>- Valor líquido da nota fiscal (no XSD consta comoValorLiquidoNfse, mas a API retornaValorLiquido)
ValorServicos, ValorDeducoes, retenções, descontos e as tags da NT 007) vêm no próprio <ValoresNfse>, logo após esses quatro campos.
O XML de retorno agora possui estruturas específicas para mensagens de alerta e erro, facilitando o tratamento de problemas.
<ListaMensagemAlertaRetorno>- Lista de alertas não-críticos<ListaMensagemRetorno>- Lista de mensagens gerais (erros, avisos, confirmações)<Codigo>- Código identificador da mensagem<Mensagem>- Descrição da mensagem<Correcao>- Sugestão de correção (quando aplicável)- Na prática, a recusa vem em
<ListaMensagemRetorno>com duas<MensagemRetorno>: a primeira trazCód. erro :seguido do número de registro (informe-o ao suporte) e a segunda, em<Mensagem>, o motivo da recusa.
Fique atualizado!
- Esta seção é atualizada sempre que há mudanças importantes nos XMLs, endpoints ou regras de validação da API.
- No menu "Arquivos para Download", contém o XML de exemplo com as novas tags.
- Valide a estrutura de seu XML antes de enviá-lo no menu "Validador de XML". Lembrando que este processo é somente uma dica opcional e não obrigatória.
Validador de XML
Verifique a estrutura do seu XML, os formatos de NBS/INDOP/Classificação Tributária e a configuração da requisição antes de enviar à API. O processamento é 100% local; vínculos cadastrais são confirmados somente pelo provider da Centi.
Arraste o arquivo XML aqui ou clique para selecionar
Use este checklist para diagnosticar erros de transmissão — problemas que ocorrem na camada HTTP/JSON, não no XML em si. São os casos mais comuns de erro (1, 1) mesmo com XML estruturalmente correto.
XML com HTML-encoding dentro do campo JSON
Causa o erro: There is an error in XML document (1, 1)
ERRO CRÍTICO
O campo "xml" no body JSON está com o conteúdo HTML-encoded: os caracteres < > " estão sendo enviados como < > ". Quando o servidor extrai o valor do campo "xml" e tenta fazer o parse como XML, encontra < no lugar de < — causando falha imediata no parse na posição (1,1).
Como verificar no Postman: No body da requisição (raw → JSON), o valor do campo "xml" deve começar exatamente com <?xml ou <GerarNfseEnvio. Se começar com <?xml ou <GerarNfseEnvio, ainda está HTML-encoded e precisa ser corrigido.
Content-Type incorreto — body é JSON mas header diz XML
Header: Content-Type
ERRO CRÍTICO
O body enviado é JSON (com os campos senha, usuario e xml), mas o header Content-Type está configurado como application/xml. A API só aceita corpo JSON: a requisição é recusada antes de chegar ao processamento da nota (HTTP 415 Unsupported Media Type).
XML desatualizado dentro da collection do Postman
Campo "xml" no body JSON
ATENÇÃO
O conteúdo do campo "xml" na collection pode estar usando uma versão antiga do XML — sem declaração <?xml...?>, sem namespace, ou com estrutura que não corresponde ao schema atual da Centi. Após corrigir o Content-Type e o HTML-encoding, substitua o conteúdo do campo "xml" pelo XML mais recente, validado pela aba "Estrutura do XML".
Caracteres de controle ou BOM no início do XML
Encoding UTF-8 / BOM
VERIFICAR
Alguns editores ou sistemas salvam arquivos XML com BOM (Byte Order Mark) UTF-8 (EF BB BF) no início. O parser XML do servidor interpreta o BOM como conteúdo inválido, causando erro na posição (1,1). Verifique se o arquivo XML não contém BOM — o conteúdo deve começar exatamente com <?xml ou com a tag raiz, sem caracteres invisíveis antes.
URL da requisição — UF e Tenant corretos
https://api.centi.com.br/nfe/gerar/{UF}/{Tenant}
VERIFICAR
Certifique-se de que a URL contém a UF em minúsculas e o Tenant (nome do município) correto para o prestador. Uma URL apontando para o município errado pode retornar erros de autenticação ou de validação de dados.
Resumo — checklist rápido antes de enviar
Conferir sempre antes de reportar erro
RESUMO
Verifique antes de cada envio: