Respostas, erros e limites
Envelope
Toda resposta JSON tem a mesma forma:
json
{
"status": "success",
"identifier": 1790000000,
"message": "",
"data": {},
"return_type": "SUCCESS"
}status:success,error(recusa ou validação) oufailed(erro interno).identifier: o instante da resposta, em segundos Unix.message: um texto para mostrar ou registrar. Nas recusas, diz o motivo.data: o conteúdo. Nas recusas, traz o código emdata.codigo.return_type: o tipo da resposta, em palavras.
O único conteúdo fora do envelope são os XMLs: o do CT-e e o do MDF-e.
Códigos HTTP
| HTTP | return_type | Quando |
|---|---|---|
200 | SUCCESS | Deu certo. |
201 | CREATED | Empresa criada. |
202 | SUCCESS | CT-e ou MDF-e recebido: a SEFAZ ainda vai responder. Acompanhe por polling. |
400 | FORBIDDEN | idempotency_key_ausente: falta o cabeçalho Idempotency-Key. |
401 | UNAUTHORIZED | Token ausente, inválido, vencido ou revogado. |
401 | FORBIDDEN | assinatura_invalida: a assinatura não confere. |
403 | FORBIDDEN | A credencial ou a conta não pode fazer a chamada (veja abaixo). |
404 | NOT_FOUND | A empresa ou o documento não existe, é de outra conta ou está fora dos CNPJs da credencial. |
409 | FORBIDDEN | idempotency_key_reutilizada ou idempotency_key_em_uso (idempotência). |
422 | VALIDATION_ERROR | Um campo fora do formato: data.errors traz a lista por campo. |
422 | ERROR | Recusa de negócio, com data.codigo. |
429 | TOO_MANY_REQUESTS | Passou do limite. |
5xx | SERVER_ERROR | Erro interno. Repita com a mesma Idempotency-Key. |
Recusas de acesso (403)
ip_nao_permitido: a credencial tem lista de IPs e o IP da chamada não está nela. Amessagemostra o IP que chegou.assinatura_inativa: o contrato da API fiscal não está ativo ou a conta não tem assinatura ativa. Fale com a equipe Subcontratei.feature_indisponivel: a rota não está no contrato da conta.data.featurediz qual recurso falta, e amessagediz o nome dele. Para incluir, fale com a equipe Subcontratei.empresa_fora_da_integracao: a empresa existe, mas o CNPJ não está entre os permitidos da credencial (também ao cadastrar uma empresa nova).escopo_insuficiente: a credencial não tem o escopo da rota. A recusa trazdata.escopo(o exigido pela rota) edata.escopos(os da credencial); compare os dois, ou consulte a credencial.
feature_indisponivel por rota
| Rota | data.feature | message |
|---|---|---|
/integracoes/empresas | api-fiscal.empresas | O plano da conta não inclui a API fiscal de empresas e certificados. |
/integracoes/ctes | api-fiscal.ctes | O plano da conta não inclui a API fiscal de CT-e. |
/integracoes/mdfes | api-fiscal.mdfes | O plano da conta não inclui a API fiscal de MDF-e e CT-e de todos os tipos. |
/integracoes/webhooks | api-fiscal.webhooks | O plano da conta não inclui os webhooks da API fiscal. |
A consulta da credencial aceita integracao.api ou qualquer api-fiscal.*; sem nenhum, a recusa traz data.feature = integracao.api e a message "O plano da conta não inclui a integração por API.".
json
{
"status": "error",
"identifier": 1790000000,
"message": "O plano da conta não inclui a API fiscal de CT-e.",
"data": {
"codigo": "feature_indisponivel",
"feature": "api-fiscal.ctes"
},
"return_type": "FORBIDDEN"
}Recusas de negócio (422)
operacao_recusada: a situação do documento não permite a ação. Amessagediz qual.conta_em_homologacao: pediu produção com a conta em homologação.certificado_ausente: a empresa emitente estápendente_certificado. Envie o certificado e emita de novo.ambiente_indisponivel: credencial de produção com a conta ainda em homologação, na emissão fiscal.numero_em_uso: a numeração do CT-e já existe;data.proximo_numerotraz o próximo livre.modelo_incompativel: o evento não é do modelo do documento, comocarta-correcaonuma chave de MDF-e.chave_de_cte:encerramentoou outro evento de MDF-e numa chave de CT-e (e o inverso, nas rotas de MDF-e).documento_encerrado: o documento já está encerrado e não aceita novos eventos.
Escopo fora do catálogo da conta
É um 422 VALIDATION_ERROR, com a mensagem em data.errors["escopos.N"] (N é a posição do escopo pedido). Acontece ao emitir ou alterar uma credencial com um escopo que o plano da conta não inclui. A API não cria credenciais: quem recebe essa recusa é a equipe, ao montar a credencial.
json
{
"status": "error",
"identifier": 1790000000,
"message": "Validation failed",
"data": {
"errors": {
"escopos.0": [
"O plano da conta não inclui o escopo mdfes:emitir."
]
}
},
"return_type": "VALIDATION_ERROR"
}O 409 cancelamento_ja_solicitado (CT-e e MDF-e) vem quando o cancelamento já foi pedido.
Limites
Por credencial, por minuto, somando todos os tokens dela:
- Leitura (
GET): 600 chamadas. - Escrita (
POSTePUT): 60 chamadas.
Passou do limite: 429, com a message "Limite de chamadas por minuto atingido: aguarde e tente de novo." e o cabeçalho Retry-After com os segundos a esperar. O 429 não conta para a idempotência: depois de esperar, a mesma chave executa.
Os outros limites estão nos campos: até 100 itens por página e até 100 caracteres na Idempotency-Key.