Release 2026.1 - Unificação da API de Contribuintes.
Visão Geral
A API de Contribuintes v2 (também conhecida como API Gerenciamento de Empresas) agora unifica o gerenciamento de empresas emissoras de documentos fiscais em uma única API.
Anteriormente utilizada apenas para NF-e e NFC-e, a API v2 passa a suportar também a configuração de Inscrições Municipais para emissão de NFS-e.
Com essa mudança, os endpoints de gerenciamento de empresas da API de NFS-e v1 (/v1/companies/*) serão descontinuados em favor dos endpoints da API v2 (/v2/companies/*).
Por que essa mudança?
Até esta release, a plataforma NFE.io mantinha duas APIs separadas:
| API | Domínio | Finalidade |
|---|---|---|
| NFS-e v1 | api.nfe.io | Empresas para emissão de NFS-e |
| Contribuintes v2 / Gerenciamento de Empresas | api.nfse.io | Empresas para emissão de NF-e e NFC-e |
Essa separação trazia desafios para quem integrava com a plataforma:
| Desafio | Impacto |
|---|---|
| Cadastro duplicado | Uma empresa que emitia NFS-e e NF-e precisava ser cadastrada nas duas APIs separadamente |
| Dados desatualizados | Mudanças de endereço ou certificado precisavam ser replicadas manualmente em ambas as APIs |
| Maior complexidade | Desenvolvedores precisavam conhecer e manter integração com duas APIs distintas, em domínios diferentes |
A unificação resolve isso: uma empresa cadastrada uma única vez pode emitir qualquer tipo de documento fiscal.
Como funciona hoje
A API de Contribuintes v2 / API Gerenciamento de Empresas
A API de Contribuintes v2 (também chamada de API Gerenciamento de Empresas) (/v2/companies/*) é a API unificada da NFE.io para gerenciamento de empresas emissoras de documentos fiscais. Disponível no domínio api.nfse.io, ela permite:
- Cadastrar e gerenciar empresas (dados cadastrais, endereço, regime tributário)
- Vincular certificados digitais ICP-Brasil
- Configurar inscrições estaduais para emissão de NF-e e NFC-e
- Configurar inscrições municipais para emissão de NFS-e (novo)
Cada recurso possui endpoints dedicados, permitindo gerenciamento granular e independente de cada aspecto da empresa.
Retrocompatibilidade com a API v1
Para facilitar a transição dos clientes que utilizam a API v1, optamos por manter retrocompatibilidade até o desligamento dos endpoints v1.
Isso significa que os endpoints da API v1 (/v1/companies/*) continuam funcionando normalmente. Internamente, porém, esses endpoints já direcionam as chamadas para a API v2:
Você chama O sistema executa internamente
----------- ------------------------------
POST /v1/companies --> POST /v2/companies
+ POST /v2/companies/{id}/municipaltaxes
GET /v1/companies/:id --> GET /v2/companies/:id
+ GET /v2/companies/:id/municipaltaxes/:im_id
PUT /v1/companies/:id --> PUT /v2/companies/:id
+ PUT /v2/companies/:id/municipaltaxes/:im_id
O que isso significa para você:
| Aspecto | Implicação |
|---|---|
| Continuidade | Suas integrações atuais com a v1 continuam funcionando sem alterações até o desligamento |
| Dados unificados | Empresas criadas via v1 já existem na estrutura v2 — não há dados "separados" |
| Migração simplificada | Não há migração de dados, apenas atualização dos endpoints chamados |
| Novos recursos | Para usar funcionalidades exclusivas da v2 (múltiplas cidades, consulta de séries RPS), é necessário chamar os endpoints v2 diretamente |
Essa abordagem permite que você planeje e execute a migração no seu próprio ritmo, sem interrupções no serviço, até a data de descontinuação da v1.
O que mudou
Novos endpoints para Inscrições Municipais
A API v2 agora inclui endpoints dedicados para gerenciar Inscrições Municipais (necessárias para emissão de NFS-e):
| Método | Endpoint | O que faz |
|---|---|---|
POST | /v2/companies/{id}/municipaltaxes | Cadastra uma nova inscrição municipal |
GET | /v2/companies/{id}/municipaltaxes | Lista todas as inscrições da empresa |
GET | /v2/companies/{id}/municipaltaxes/{im_id} | Consulta uma inscrição específica |
PUT | /v2/companies/{id}/municipaltaxes/{im_id} | Atualiza dados da inscrição |
DELETE | /v2/companies/{id}/municipaltaxes/{im_id} | Remove a inscrição |
GET | .../municipaltaxes/{im_id}/series/{serie} | Consulta numeração de uma série RPS |
Estrutura unificada da empresa
Com a unificação, uma empresa na API v2 pode conter:
Empresa (Company)
│
├── Certificado Digital
│ └── Usado para assinar NF-e, NFC-e e NFS-e
│
├── Inscrições Estaduais (StateTax)
│ └── Para emissão de NF-e e NFC-e
│
└── Inscrições Municipais (MunicipalTax) ← NOVO
└── Para emissão de NFS-e
Benefícios
| Benefício | O que significa na prática |
|---|---|
| Cadastro único | Cadastre a empresa uma vez e configure-a para emitir NF-e, NFC-e ou NFS-e conforme necessário |
| Certificado compartilhado | O mesmo certificado digital é utilizado para todos os tipos de documento |
| Inscrição Municipal segregada | Uma empresa pode ter Inscrição Municipal no modelo aplicado atualmente para Inscrição Estadual |
| Dados consistentes | Atualização de endereço ou razão social reflete automaticamente em todas as emissões |
| Integração simplificada | Uma única API para aprender, integrar e manter |
Detalhamento técnico
Mapeamento de campos: v1 para v2
Na API v1, os dados da empresa e da inscrição municipal estavam misturados em um único objeto. Na v2, eles são separados em recursos distintos:
| Campo na v1 | Recurso na v2 | Campo na v2 |
|---|---|---|
name | Company | name |
tradeName | Company | tradeName |
federalTaxNumber | Company | federalTaxNumber |
taxRegime | Company | taxRegime |
address.* | Company | address.* |
municipalTaxNumber | MunicipalTax | taxNumber |
rpsSerialNumber | MunicipalTax | rpsSerialNumber |
rpsNumber | MunicipalTax | rpsNumber |
lastRpsSent | MunicipalTax | lastRpsSent |
issRate | MunicipalTax | issRate |
environment | MunicipalTax | environment |
fiscalStatus | MunicipalTax | fiscalStatus |
specialTaxRegime | MunicipalTax | specialTaxRegime |
legalNature | MunicipalTax | legalNature |
regionalTaxNumber | MunicipalTax | regionalTaxNumber |
loginName | MunicipalTax | loginName |
loginPassword | MunicipalTax | loginPassword |
authIssueValue | MunicipalTax | authIssueValue |
federalTaxDetermination | MunicipalTax | federalTaxDetermination |
municipalTaxDetermination | MunicipalTax | municipalTaxDetermination |
Diferenças nas respostas
Listagem de empresas
v1: GET /v1/companies
{
"companies": [
{
"id": "abc123def456",
"name": "ACME TECNOLOGIA LTDA",
"federalTaxNumber": 12345678000199,
"municipalTaxNumber": "123456",
"rpsSerialNumber": "A1",
"rpsNumber": 1500,
"environment": "Production",
"certificate": {
"thumbprint": "1A2B3C4D5E6F7890ABCDEF1234567890ABCDEF12",
"modifiedOn": "2026-01-15T10:30:00+00:00",
"expiresOn": "2027-01-15T23:59:59+00:00",
"status": "Active"
},
"address": {
"state": "SP",
"city": {
"code": "3550308",
"name": "São Paulo"
},
"district": "Centro",
"street": "Avenida Paulista",
"number": "1000",
"postalCode": "01310100",
"country": "BRA"
}
}
],
"page": 1
}
v2: GET /v2/companies
{
"hasMore": false,
"companies": [
{
"id": "abc123def456",
"name": "ACME TECNOLOGIA LTDA",
"federalTaxNumber": 12345678000199,
"municipalTaxNumber": "mtx_789xyz",
"stateTaxes": [],
"municipalTaxes": ["mtx_789xyz"],
"certificate": {
"taxPayerId": "abc123def456",
"thumbprint": "1A2B3C4D5E6F7890ABCDEF1234567890ABCDEF12",
"taxId": "12345678000199",
"subject": "CN=ACME TECNOLOGIA LTDA:12345678000199, OU=RFB e-CNPJ A1, O=ICP-Brasil, C=BR",
"validUntil": "2027-01-15T23:59:59Z",
"modifiedOn": "2026-01-15T10:30:00Z",
"status": "Active"
},
"address": {
"state": "SP",
"city": {
"code": "3550308",
"name": "São Paulo"
},
"district": "Centro",
"street": "Avenida Paulista",
"number": "1000",
"postalCode": "01310100",
"country": "BRA"
}
}
]
}
Principais diferenças:
| Aspecto | v1 | v2 |
|---|---|---|
| Paginação | "page": 1 | "hasMore": false + cursor |
| Dados municipais | Campos inline | Referência por ID em municipalTaxes |
| Inscrições estaduais | Não existia | Array stateTaxes |
Consulta de empresa
v1: GET /v1/companies/:id
{
"companies": {
"id": "abc123def456",
"name": "ACME TECNOLOGIA LTDA",
"tradeName": "ACME Tech",
"federalTaxNumber": 12345678000199,
"rpsSerialNumber": "A1",
"rpsNumber": 1500,
"issRate": 2.5,
"environment": "Production",
"fiscalStatus": "Active",
"loginName": "usuario_prefeitura",
"loginPassword": "******",
"authIssueValue": "token_xyz_123"
}
}
v2: GET /v2/companies/:id + GET /v2/companies/:id/municipaltaxes/:im_id
// GET /v2/companies/:id
{
"company": {
"id": "abc123def456",
"name": "ACME TECNOLOGIA LTDA",
"tradeName": "ACME Tech",
"federalTaxNumber": 12345678000199,
"municipalTaxes": ["789xyz"],
"stateTaxes": []
}
}
// GET /v2/companies/:id/municipaltaxes/:im_id
{
"municipalTax": {
"id": "mtx_789xyz",
"companyId": "abc123def456",
"accountId": "56abc",
"city": {
"country": "BRA",
"state": "SP",
"code": "3550308",
"name": "São Paulo"
},
"taxNumber": "123456",
"rpsSerialNumber": "A1",
"rpsNumber": 1500,
"lastRpsSent": 1499,
"issRate": 2.5,
"environment": "Production",
"fiscalStatus": "Active",
"loginName": "usuario_prefeitura",
"loginPassword": "******",
"authIssueValue": "token_xyz_123",
"rpsSerialNumbers": ["A1"]
}
}
Principais diferenças:
| Aspecto | v1 | v2 |
|---|---|---|
| Objeto raiz | "companies": {...} (singular incorreto) | "company": {...} |
| Dados municipais | Inline | Recurso separado |
| Séries RPS | Campo único | Array rpsSerialNumbers com histórico |
IDs são compartilhados
O ID da empresa é o mesmo em ambas as APIs:
v1: /v1/companies/abc123def456
v2: /v2/companies/abc123def456
Para obter o ID da inscrição municipal, consulte o array municipalTaxes na resposta da empresa v2:
{
"company": {
"id": "abc123def456",
"municipalTaxes": ["mtx_789xyz"]
}
}
Como migrar da v1 para v2
Como seus dados já estão na estrutura v2 (graças ao adaptador interno), a migração consiste em atualizar seu código para chamar os novos endpoints.
Mapeamento de endpoints
| Endpoint v1 (será descontinuado) | Endpoint v2 equivalente |
|---|---|
GET /v1/companies | GET /v2/companies |
POST /v1/companies | POST /v2/companies + POST .../municipaltaxes |
GET /v1/companies/:id | GET /v2/companies/:id |
PUT /v1/companies/:id | PUT /v2/companies/:id |
DELETE /v1/companies/:id | DELETE /v2/companies/:id |
POST /v1/companies/:id/certificate | POST /v2/companies/:id/certificates |
Mudança de domínio
| API | Domínio |
|---|---|
| v1 (descontinuada) | api.nfe.io |
| v2 (usar esta) | api.nfse.io |
A autenticação permanece a mesma: Authorization: <sua_api_key>
→ Saiba como obter sua API Key
Cenários de migração
Cenário A: Empresa usa apenas NFS-e (existe só na v1)
Seus dados já estão na v2 por causa do adaptador. Para migrar:
1. Obtenha o ID da empresa na v2 (é o mesmo da v1)
curl -H "Authorization: sk_live_xxx" \
https://api.nfse.io/v2/companies/abc123def456
2. Obtenha o ID da inscrição municipal
curl -H "Authorization: sk_live_xxx" \
https://api.nfse.io/v2/companies/abc123def456/municipaltaxes
Resposta inclui o ID: "id": "mtx_789xyz"
3. Atualize seu código para usar os novos endpoints
- GET api.nfe.io/v1/companies/abc123def456
+ GET api.nfse.io/v2/companies/abc123def456
+ GET api.nfse.io/v2/companies/abc123def456/municipaltaxes/mtx_789xyz
Cenário B: Empresa usa NF-e/NFC-e e NFS-e
Se você já usa a v2 para NF-e/NFC-e e a v1 para NFS-e:
1. Verifique se a inscrição municipal já existe na v2
curl -H "Authorization: sk_live_xxx" \
https://api.nfse.io/v2/companies/{company_id}/municipaltaxes
2. Se existir, apenas atualize os endpoints no seu código
3. Se não existir, crie a inscrição municipal
curl -X POST -H "Authorization: sk_live_xxx" \
-H "Content-Type: application/json" \
https://api.nfse.io/v2/companies/{company_id}/municipaltaxes \
-d '{
"MunicipalTax": {
"City": { "Code": "3550308", "Name": "São Paulo", "State": "SP" },
"TaxNumber": "123456",
"RpsSerialNumber": "A1",
"RpsNumber": 1,
"Environment": "Production"
}
}'
Cenário C: Empresa com múltiplas cidades (novo recurso)
Antes não era possível ter múltiplas inscrições municipais. Agora você pode:
# Adicionar segunda cidade
curl -X POST -H "Authorization: sk_live_xxx" \
-H "Content-Type: application/json" \
https://api.nfse.io/v2/companies/{company_id}/municipaltaxes \
-d '{
"MunicipalTax": {
"City": { "Code": "3304557", "Name": "Rio de Janeiro", "State": "RJ" },
"TaxNumber": "789012",
"RpsSerialNumber": "RJ1",
"RpsNumber": 1,
"Environment": "Production"
}
}'
# Listar todas as cidades
curl -H "Authorization: sk_live_xxx" \
https://api.nfse.io/v2/companies/{company_id}/municipaltaxes
# Retorna array com São Paulo e Rio de Janeiro
Nova documentação disponível
Além da unificação da API, publicamos uma nova seção de documentação com conteúdo mais detalhado sobre o gerenciamento de empresas.
O que há de novo na documentação
| Seção | O que você encontra |
|---|---|
| Visão Geral | Explicação da arquitetura da API e hierarquia de recursos. Exemplo: diagrama mostrando que Company é o "hub" que conecta Certificate, StateTax e MunicipalTax |
| API de Empresas | Detalhamento de cada campo do cadastro. Exemplo: TaxRegime define o regime tributário (Simples Nacional, Lucro Presumido, etc.) usado no cálculo de impostos |
| API de Inscrições Municipais | Explicação do conceito de "espelhamento" - a API não cadastra na prefeitura, apenas armazena dados já obtidos pelo contribuinte para uso nas emissões |
| Validações e erros | Lista completa de regras de validação com códigos de erro. Exemplo: código 40028 indica que o código IBGE da cidade não corresponde à UF informada |
| Exemplos de requisição | Cada endpoint possui exemplos em cURL e PowerShell prontos para copiar e executar |
| Boas práticas | Recomendações como: enviar CNPJ sem pontuação, usar códigos IBGE de 7 dígitos, inicializar numeração RPS corretamente |
Links para a documentação
- Visão Geral - API de Contribuintes
- API de Empresas
- API de Certificados
- API de Inscrições Estaduais
- API de Inscrições Municipais
Próximos passos: descontinuação da v1
A camada de compatibilidade que traduz chamadas v1 para v2 será removida em uma data a ser comunicada. A partir desse momento, os endpoints v1 deixarão de funcionar.
Endpoints que serão descontinuados
GET /v1/companiesPOST /v1/companiesGET /v1/companies/:company_id_or_tax_numberPUT /v1/companies/:company_idDELETE /v1/companies/:company_idPOST /v1/companies/:company_id/certificate
Cronograma
| Fase | Endpoints v1 | Ação recomendada |
|---|---|---|
| Agora | Funcionam normalmente (via adaptador) | Iniciar planejamento da migração |
| Período de transição | Funcionam, mas com avisos de depreciação | Executar a migração |
| Após descontinuação | Serão desligados | Usar exclusivamente a v2 |
Prazo: A data de descontinuação será comunicada em breve. Recomendamos iniciar a migração o quanto antes.
Campo municipalTaxNumber na Company v2
O campo municipalTaxNumber no objeto Company da v2 atualmente contém o ID da MunicipalTax (não o número real da inscrição). Este campo será removido em uma versão futura.
Recomendação: Utilize o array municipalTaxes para obter os IDs das inscrições municipais e consulte o endpoint /municipaltaxes/{id} para obter o número real da inscrição (taxNumber).
Precisa de ajuda?
- Consulte a documentação completa
- Em caso de dúvidas, entre em contato com nosso suporte