DC-e
Emissão de DC-e (modelo 99, Declaração de Conteúdo Eletrônica) em nome de marketplaces e empresas, incluindo onboarding, cargas de webhook, modelo de erros, máquina de estados e checklist de integração.
Visão geral e fluxo de onboarding
O DC-e (modelo 99, Declaração de Conteúdo Eletrônica, Ajuste SINIEF 05/2021) é a declaração eletrônica de conteúdo que acompanha remessas de mercadorias enviadas por não contribuintes, emitida em nome deles por um marketplace, ou por uma empresa para si mesma. Cadastro de empresa, vinculação de certificado e registro de webhook são compartilhados com a NF-e; o segmento de recurso mantém o dc-e original do documento e toda operação em nível de documento fica sob /dc-e/{dceId}.
| Etapa | API | Observações |
|---|---|---|
| 1 Registrar empresa | POST /openapi/v2/empresas | Igual à NF-e, com a seção opcional emissaoDCe; pelo menos um entre emissaoNFeProduto / emissaoDCe é obrigatório, um integrador só de DC-e pode omitir o bloco NF-e; um corpo com id é uma atualização |
| 2 Vincular certificado | POST /openapi/v1/empresas/{empresaId}/certificadoDigital | Igual à NF-e |
| 3 Registrar webhook | POST /openapi/v1/webhooks | Igual à NF-e; os resultados de DC-e reutilizam a mesma URL de callback |
| 4 Emitir | POST /openapi/v2/empresas/{empresaId}/dc-e | Aceito imediatamente (200, sem corpo); autorizado de forma assíncrona na SEFAZ |
| 5 Consultar | GET /openapi/v2/empresas/{empresaId}/dc-e/{dceId} | Status, protocolo, links de download do XML / DACE, eco da requisição |
| 6 Cancelar | DELETE /openapi/v2/empresas/{empresaId}/dc-e/{dceId} | Até 24 horas após a autorização; assíncrono: 200 sem corpo, resultado via webhook |
A autenticação é idêntica à NF-e: cabeçalhos token / timestamp / sign, com sign = MD5(token + path + body + timestamp) em hexadecimal minúsculo; path inclui o prefixo /openapi e as variáveis de caminho e exclui a query string; GET / DELETE sem corpo usam a string vazia; um DELETE com corpo (cancelamento com motivo) assina o JSON bruto com CR/LF removidos. Veja Autenticação.
Pré-requisitos
- A empresa deve estar aprovada com certificado utilizável (caso contrário
DCe00008). O autorizador do DC-e é a SEFAZ-PR (o único autorizador listado no portal nacional do DC-e); empresas de todos os estados são roteadas para ele. - A empresa deve ter os parâmetros de emissão de DC-e configurados:
emissaoDCe.tipoEmitentee uma série do modelo 99 (sequencialDCe/serieDCe); a falta de qualquer um devolveDCe00004. - A fase um suporta dois tipos de emitente:
Marketplace(uma plataforma emitindo em nome de vendedores não contribuintes / pessoas físicas) eOwnIssuer(uma empresa emitindo para si mesma).Carrierpode ser cadastrado, mas a emissão é rejeitada (10019013) até a SVRS publicar o novo pacote de schema. ambientena requisição deve ser igual ao ambiente atual da empresa, caso contrárioDCe00004(texto do documento: "not configured for the informed environment"). Após o cadastro a empresa está no ambiente de homologação (Homologacao); a troca para produção é uma ação da operação sem API, e enviarambiente=Producaoantes da troca devolveDCe00004.- A fase um suporta apenas emissão normal (
tpEmis=1); a contingência offline vem na fase dois.
Cadastro de empresa: a seção emissaoDCe
Registrar empresa aceita uma seção opcional emissaoDCe (todos os demais campos inalterados):
"emissaoDCe": {"ambienteProducao": {"tipoEmitente": "Marketplace","sequencialDCe": 1,"serieDCe": "1","siteMarketplace": "https://loja.exemplo.com.br"}}
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
tipoEmitente | string | sim | Marketplace / OwnIssuer (alias do documento EmissorProprio) / Carrier (alias Transportadora; cadastro permitido, emissão rejeitada) |
sequencialDCe | integer | sim | Primeiro nDC (1-999999999); a plataforma numera sequencialmente a partir dele |
serieDCe | string | sim | Série (0-999, até 3 dígitos) |
siteMarketplace | string | Obrigatório para Marketplace | Site da plataforma (2-120 caracteres), gravado no XML Marketplace/Site e no DACE |
- Uma empresa cadastrada sem
emissaoDCenão fica habilitada para DC-e: o cadastro é aceito, mas a resposta trazdceHabilitado=falsee a emissão devolveDCe00004. Confira esse campo logo após cadastrar. - Para habilitar DC-e depois, elevar o número inicial ou corrigir dados de contato, reenvie o payload de cadastro com
id. A série do modelo 99 só avança; as regras completas de atualização estão na página Registrar empresa.
Endpoints
| Endpoint | Finalidade |
|---|---|
| Emitir DC-e | POST /openapi/v2/empresas/{empresaId}/dc-e, aceito com HTTP 200 sem corpo; idempotente por id |
| Consultar DC-e | GET /openapi/v2/empresas/{empresaId}/dc-e/{dceId}, status, protocolo, links de download e eco da requisição |
| Cancelar DC-e | DELETE /openapi/v2/empresas/{empresaId}/dc-e/{dceId}, assíncrono, até 24 horas após a autorização |
Carga do webhook
O registro de webhook e os cabeçalhos de assinatura são compartilhados com a NF-e; registre a URL de callback em Registrar webhook. Cabeçalhos da entrega: além dos cinco cabeçalhos de assinatura da plataforma (X-Tffiscal-Event / X-Tffiscal-Event-Id / X-Tffiscal-Delivery-Id / X-Tffiscal-Timestamp / X-Tffiscal-Signature), toda entrega traz token e x-token com o mesmo valor (o token registrado no webhook, devolvido sem alteração); o receptor pode verificar qualquer um deles.
Códigos de evento e carga de compatibilidade (tipo="DC-e", 14 campos em ordem fixa):
| Código do evento | Gatilho | dceStatus |
|---|---|---|
dce.authorized | Autorização 100 | Autorizada |
dce.rejected | Rejeição da SEFAZ ou falha terminal da tarefa (inclusive falhas antes da numeração do documento, que não têm chave) | Negada (dceMotivoStatus é cStat - motivo; uma falha terminal sem cStat traz só o motivo) |
dce.canceled | Cancelamento registrado (135 / 136 / 155) | Cancelada (dceDataAutorizacao é o momento do registro do cancelamento, dceNumeroProtocolo o protocolo do evento de cancelamento) |
dce.cancel_rejected | A SEFAZ rejeitou o cancelamento ou a tarefa de cancelamento falhou terminalmente | CancelamentoNegado (o documento permanece autorizado; traz o protocolo / digest / link do XML da autorização) |
Campos da carga
| Campo | Tipo | Descrição |
|---|---|---|
tipo | string | Sempre DC-e |
empresaId | string | Identificador da empresa |
dceId | string | O id enviado na emissão; correlacione as entregas por este campo |
dceStatus | string | Autorizada / Negada / Cancelada / CancelamentoNegado |
dceMotivoStatus | string | cStat - xMotivo na rejeição ou rejeição do cancelamento, o motivo da falha na falha terminal; null nos demais casos |
dceLinkDace | string | Link do DACE renderizado sob demanda pela chave (callbacks de autorização / cancelamento); null na rejeição |
dceLinkXml | string | Link de download do XML; null quando não há XML autorizado |
dceNumero | string | Número do DC-e; null quando o documento nunca foi numerado |
dceSerie | string | Série do DC-e; null quando o documento nunca foi numerado |
dceChaveAcesso | string | Chave de acesso de 44 dígitos; null quando o documento nunca foi numerado |
dceDataEmissao | string | Momento da emissão; o momento da aceitação para falhas antes da numeração |
dceDataAutorizacao | string | Momento da autorização; o momento do registro do cancelamento em dce.canceled; null nos demais casos |
dceNumeroProtocolo | string | Protocolo de autorização; o protocolo do evento de cancelamento em dce.canceled; null na rejeição |
dceDigestValue | string | Digest da assinatura do documento autorizado; null na rejeição e em dce.canceled |
dce.authorized
{ "tipo": "DC-e", "empresaId": "1934811222334455", "dceId": "DCe-000012333", "dceStatus": "Autorizada", "dceMotivoStatus": null,"dceLinkDace": "https://api.v2.tffiscal.com/openapi/files/dace/35260940673061000134990010000000011100000012?token=...", "dceLinkXml": "https://api.v2.tffiscal.com/openapi/files/xml/7?token=...","dceNumero": "1", "dceSerie": "1", "dceChaveAcesso": "41260940673061000134990010000000011101234567","dceDataEmissao": "2026-09-06T12:00:00Z", "dceDataAutorizacao": "2026-09-06T12:00:03Z","dceNumeroProtocolo": "141260000000001", "dceDigestValue": "tasG40Ic6Zh7PIBiLEEH7Hb940Y=" }
dce.rejected
{ "tipo": "DC-e", "empresaId": "1934811222334455", "dceId": "DCe-000012333", "dceStatus": "Negada","dceMotivoStatus": "225 - Rejeicao: Falha no schema XML", "dceLinkDace": null, "dceLinkXml": null,"dceNumero": "1", "dceSerie": "1", "dceChaveAcesso": "4126...", "dceDataEmissao": "2026-09-06T12:00:00Z","dceDataAutorizacao": null, "dceNumeroProtocolo": null, "dceDigestValue": null }
Falha antes da numeração (empresa não configurada para DC-e / série ausente / falha no mapeamento da mensagem e outras falhas terminais em que o documento nunca foi numerado e não tem chave): dce.rejected é entregue mesmo assim, os campos de fato do documento são null, dceMotivoStatus traz o motivo da falha e dceDataEmissao o momento da aceitação. Correlacione por dceId e nunca presuma que dceChaveAcesso está presente:
{ "tipo": "DC-e", "empresaId": "1934811222334455", "dceId": "DCe-000012333", "dceStatus": "Negada","dceMotivoStatus": "Empresa não configurada para emissão de DC-e", "dceLinkDace": null, "dceLinkXml": null,"dceNumero": null, "dceSerie": null, "dceChaveAcesso": null, "dceDataEmissao": "2026-09-06T12:00:00Z","dceDataAutorizacao": null, "dceNumeroProtocolo": null, "dceDigestValue": null }
dce.canceled
{ "tipo": "DC-e", "empresaId": "1934811222334455", "dceId": "DCe-000012333", "dceStatus": "Cancelada", "dceMotivoStatus": null,"dceLinkDace": "https://.../openapi/files/dace/35260940673061000134990010000000011100000012?token=...", "dceLinkXml": "https://.../openapi/files/xml/7?token=...","dceNumero": "1", "dceSerie": "1", "dceChaveAcesso": "4126...", "dceDataEmissao": "2026-09-06T12:00:00Z","dceDataAutorizacao": "2026-09-06T15:00:00Z", "dceNumeroProtocolo": "141260000000099", "dceDigestValue": null }
dce.cancel_rejected
{ "tipo": "DC-e", "empresaId": "1934811222334455", "dceId": "DCe-000012333", "dceStatus": "CancelamentoNegado","dceMotivoStatus": "594 - Rejeicao: O numero de sequencia do evento informado e maior que o permitido","dceLinkDace": null, "dceLinkXml": "https://.../openapi/files/xml/7?token=...", "dceNumero": "1", "dceSerie": "1","dceChaveAcesso": "4126...", "dceDataEmissao": "2026-09-06T12:00:00Z", "dceDataAutorizacao": null,"dceNumeroProtocolo": "141260000000001", "dceDigestValue": "tasG40Ic6Zh7PIBiLEEH7Hb940Y=" }
Nos callbacks de autorização / cancelamento, dceLinkDace é o link do DACE renderizado sob demanda pela chave (nada é renderizado no momento da entrega; o primeiro download renderiza e arquiva); os dois links têm o mesmo formato da API de consulta (/openapi/files/{kind}/{ref}?token=…) e sua validade vem da configuração do inquilino (padrão 7 dias). Veja Download de arquivos.
Modelo de erros
Mesmos formatos da NF-e: erros de negócio são [{ "codigo", "mensagem" }] (HTTP 400; documento / tarefa inexistente é HTTP 404 com codigo DCe0001); erros da camada de autenticação usam o envelope da plataforma (401 / 403 / 429, veja Autenticação). Casos com código de exemplo documentado reutilizam o código do documento; todo outro codigo é o código de erro numérico da plataforma, e mensagem é localizada pelo idioma da requisição (o português usa o texto do documento).
| codigo | HTTP | Cenário | Ação |
|---|---|---|---|
DCe0001 | 404 | dceId não encontrado, não pertence à empresa, ou cancelamento solicitado antes de o documento ser materializado | Verifique id e empresaId; cancele documentos Pendente só após a autorização |
10003000 | 404 | empresaId não encontrado | Verifique o empresaId |
DCe00004 | 400 | Empresa não configurada para DC-e (falta tipoEmitente / série do modelo 99 / site do Marketplace), ou ambiente diferente do ambiente atual da empresa | Envie emissaoDCe no cadastro ou em uma atualização com id; submeta no ambiente atual da empresa e peça à operação a troca para produção |
DCe00005 / DCe00006 / DCe00007 | 400 | Empresa Marketplace / Carrier sem remetente / remetente.endereco ausente / remetente brasileiro sem cpfCnpj | Informe os dados do remetente |
DCe00008 | 400 | Empresa não pode emitir (não aprovada / certificado não pronto) | Aguarde a aprovação / vincule o certificado |
DCe00009 | 400 | Destinatário brasileiro sem cpfCnpj | Informe o documento do destinatário |
GW001 | 400 | Código IBGE do município não encontrado ou inconsistente com uf | Verifique cidade / uf |
10019005 / 10019006 | 400 | Requisição duplicada concorrente / tarefas pendentes em excesso para o CNPJ | Tente novamente mais tarde |
10019007 | 400 | Série não resolvida (várias séries habilitadas) | Peça à operação para consolidar as séries |
10019013 | 400 | Tipo de emitente Carrier ainda não suportado na emissão | Use uma empresa Marketplace / OwnIssuer |
10019018 – 10019022 | 400 | Item inválido / enumeração ou formato inválido / CNPJ da transportadora inválido / informação adicional longa demais / autorizacaoDownloadXml inválido | Corrija conforme mensagem |
10019030 / 10019031 | 400 | Mesmo id com mensagem diferente / produção: já existe documento ativo ou autorizado para o id | Use um novo id ou reenvie a mensagem original / consulte o original |
10019040 / 10019041 / 10019042 / 10019043 | 400 | Status não permite cancelamento / janela de 24 horas excedida / cancelamento já aceito / motivo inválido | Veja Cancelar DC-e |
10019048 | 400 | dataEmissao fora da janela permitida (mais de 5 minutos à frente ou mais de 30 dias para trás) | Use a hora atual ou omita dataEmissao |
10001001 | 400 | Falha de validação de campos (uma entrada por campo); erros de contrato de cadastro / atualização | Corrija conforme mensagem |
As listas de códigos por endpoint estão em Emitir DC-e, Consultar DC-e e Cancelar DC-e. Rejeições da SEFAZ durante a emissão não são erros HTTP: aparecem como status Negada na consulta e no webhook dce.rejected; rejeições da SEFAZ ao cancelamento aparecem como dce.cancel_rejected.
Máquina de estados
Aceito (POST 200) ─→ Pendente ─numera + envia à SEFAZ─┬─ cStat 100 ─→ Autorizada ─DELETE 200─→ CancelamentoPendente ─┬─ 135/136/155 ─→ Cancelada│ └─ rejeição SEFAZ ─→ Autorizada (webhook CancelamentoNegado)├─ outro cStat terminal ─→ Negada└─ parâmetros não interpretáveis / retentativas esgotadas ─→ Falha (mesmo id pode ser reenviado)
- Enquanto
Pendente, indisponibilidades da SEFAZ (108 / 109) são retentadas com back-off pela plataforma; não há redirecionamento de contingência na fase um. Emissão duplicada (451 / 452 / 539) é reconciliada consultando a SEFAZ primeiro. - Após
Negada/Falhao mesmoidpode ser reenviado (reaberto com a nova mensagem); apósAutorizadaum reenvio com o mesmoidsó aciona a idempotência.
Observações
- O CNPJ da chave é a empresa da plataforma: as posições 7-20 trazem sempre o emitente autorizado (a empresa Marketplace ou a empresa que emite para si); um remetente CPF só aparece no grupo
emitdo XML e no bloco REMETENTE do DACE. - Nome fixo do destinatário no ambiente de homologação: com
tpAmb=2o nome do destinatário no XML e no DACE éDCE EMITIDA EM AMBIENTE DE HOMOLOGACAO(validação SEFAZ 598); o eco da consulta mantém o original. - Janela de cancelamento de 24 horas: contada a partir do momento da autorização; depois dela o documento só pode ser mantido. O DC-e oficial só tem cancelamento: sem carta de correção, sem inutilização de numeração.
- Carrier ainda não suportado: o schema oficial atual restringe
tpEmita Marketplace / emitente próprio; uma empresa transportadora cadastrada é rejeitada com10019013na emissão. - DACE: A4 retrato, renderizado sob demanda e cacheado; re-renderizado com a marca d'água
CANCELADAapós o cancelamento; o ambiente de homologação traz a marca d'águaSEM VALOR FISCAL - HOMOLOGAÇÃO. - Autorizador: o DC-e de todos os estados vai para o autorizador SEFAZ-PR; o QR code aponta para
https://www.fazenda.pr.gov.br/dce/qrcode?chDCe={chave}&tpAmb={tpAmb}.
Checklist de integração
- No ambiente de homologação: empresa cadastrada (com
emissaoDCe, respostadceHabilitado=trueconfirmada), certificado vinculado, webhook registrado (receptor aceitatoken/x-token). - Emita um DC-e mínimo (o exemplo em Emitir DC-e), consulte-o como
Autorizada, baixe o XML e o DACE, receba o callbackdce.authorized. - Reenvie o mesmo
iduma vez e confirme HTTP 200 sem segundo documento; altere um item e reenvie, confirme10019030. - Cancele o documento: confirme 200 sem corpo, consulte
CancelamentoPendente→Cancelada, receba o callbackdce.canceled, DACE com a marca d'água. - Cancele o documento cancelado de novo e confirme
10019040; consulte um id inexistente e confirme 404DCe0001. - Envie erros deliberados (
ambiente=Producao,cidade=9999999,remetenteausente) e confirme o array de erros 400 com os códigosDCe00004/GW001/DCe00005. - Emita para uma empresa não habilitada para DC-e e confirme
DCe00004; reenvie o payload de cadastro comide umsequencialDCemaior, confirme 200 e que o próximo documento começa do novo número; reenvie um número menor e confirme 40010001001.
