DC-e
Emisión de DC-e (modelo 99, Declaração de Conteúdo Eletrônica) en nombre de marketplaces y empresas, incluyendo onboarding, cargas de webhook, modelo de errores, máquina de estados y lista de verificación de integración.
Visión general y flujo de onboarding
El DC-e (modelo 99, Declaração de Conteúdo Eletrônica, Ajuste SINIEF 05/2021) es la declaración electrónica de contenido que acompaña los envíos de mercancías remitidas por no contribuyentes, emitida en su nombre por un marketplace, o por una empresa para sí misma. El registro de empresa, la vinculación de certificado y el registro de webhook se comparten con la NF-e; el segmento de recurso mantiene el dc-e original del documento y toda operación a nivel de documento vive bajo /dc-e/{dceId}.
| Paso | API | Notas |
|---|---|---|
| 1 Registrar empresa | POST /openapi/v2/empresas | Igual que NF-e, con la sección opcional emissaoDCe; al menos uno entre emissaoNFeProduto / emissaoDCe es obligatorio, un integrador solo de DC-e puede omitir el bloque NF-e; un cuerpo con id es una actualización |
| 2 Vincular certificado | POST /openapi/v1/empresas/{empresaId}/certificadoDigital | Igual que NF-e |
| 3 Registrar webhook | POST /openapi/v1/webhooks | Igual que NF-e; los resultados de DC-e reutilizan la misma URL de callback |
| 4 Emitir | POST /openapi/v2/empresas/{empresaId}/dc-e | Aceptado de inmediato (200, sin cuerpo); autorizado de forma asíncrona en la SEFAZ |
| 5 Consultar | GET /openapi/v2/empresas/{empresaId}/dc-e/{dceId} | Estado, protocolo, enlaces de descarga del XML / DACE, eco de la solicitud |
| 6 Cancelar | DELETE /openapi/v2/empresas/{empresaId}/dc-e/{dceId} | Hasta 24 horas después de la autorización; asíncrono: 200 sin cuerpo, resultado vía webhook |
La autenticación es idéntica a la NF-e: cabeceras token / timestamp / sign, con sign = MD5(token + path + body + timestamp) en hexadecimal minúsculo; path incluye el prefijo /openapi y las variables de ruta y excluye la query string; GET / DELETE sin cuerpo usan la cadena vacía; un DELETE con cuerpo (cancelación con motivo) firma el JSON bruto con CR/LF eliminados. Vea Autenticación.
Requisitos previos
- La empresa debe estar aprobada con certificado utilizable (de lo contrario
DCe00008). El autorizador del DC-e es la SEFAZ-PR (el único autorizador listado en el portal nacional del DC-e); las empresas de todos los estados se enrutan hacia él. - La empresa debe tener configurados sus parámetros de emisión de DC-e:
emissaoDCe.tipoEmitentey una serie del modelo 99 (sequencialDCe/serieDCe); la falta de cualquiera devuelveDCe00004. - La fase uno admite dos tipos de emisor:
Marketplace(una plataforma que emite en nombre de vendedores no contribuyentes / personas físicas) yOwnIssuer(una empresa que emite para sí misma).Carrierpuede registrarse, pero la emisión se rechaza (10019013) hasta que SVRS publique el nuevo paquete de schema. ambienteen la solicitud debe coincidir con el entorno actual de la empresa, de lo contrarioDCe00004(texto del documento: "not configured for the informed environment"). Tras el registro la empresa está en el entorno de certificación (Homologacao); el cambio a producción es una acción de operaciones sin API, y enviarambiente=Producaoantes del cambio devuelveDCe00004.- La fase uno admite solo emisión normal (
tpEmis=1); la contingencia offline llega en la fase dos.
Registro de empresa: la sección emissaoDCe
Registrar empresa acepta una sección opcional emissaoDCe (todos los demás campos sin cambios):
"emissaoDCe": {"ambienteProducao": {"tipoEmitente": "Marketplace","sequencialDCe": 1,"serieDCe": "1","siteMarketplace": "https://loja.exemplo.com.br"}}
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
tipoEmitente | string | sí | Marketplace / OwnIssuer (alias del documento EmissorProprio) / Carrier (alias Transportadora; registro permitido, emisión rechazada) |
sequencialDCe | integer | sí | Primer nDC (1-999999999); la plataforma numera secuencialmente a partir de él |
serieDCe | string | sí | Serie (0-999, hasta 3 dígitos) |
siteMarketplace | string | Obligatorio para Marketplace | Sitio de la plataforma (2-120 caracteres), escrito en el XML Marketplace/Site y en el DACE |
- Una empresa registrada sin
emissaoDCeno queda habilitada para DC-e: el registro se acepta, pero la respuesta traedceHabilitado=falsey la emisión devuelveDCe00004. Verifique ese campo justo después de registrar. - Para habilitar DC-e después, elevar el número inicial o corregir datos de contacto, reenvíe el payload de registro con
id. La serie del modelo 99 solo avanza; las reglas completas de actualización están en la página Registrar empresa.
Endpoints
| Endpoint | Propósito |
|---|---|
| Emitir DC-e | POST /openapi/v2/empresas/{empresaId}/dc-e, aceptado con HTTP 200 sin cuerpo; idempotente por id |
| Consultar DC-e | GET /openapi/v2/empresas/{empresaId}/dc-e/{dceId}, estado, protocolo, enlaces de descarga y eco de la solicitud |
| Cancelar DC-e | DELETE /openapi/v2/empresas/{empresaId}/dc-e/{dceId}, asíncrono, hasta 24 horas después de la autorización |
Carga del webhook
El registro de webhook y las cabeceras de firma se comparten con la NF-e; registre la URL de callback en Registrar webhook. Cabeceras de la entrega: además de las cinco cabeceras de firma de la plataforma (X-Tffiscal-Event / X-Tffiscal-Event-Id / X-Tffiscal-Delivery-Id / X-Tffiscal-Timestamp / X-Tffiscal-Signature), toda entrega lleva token y x-token con el mismo valor (el token registrado en el webhook, devuelto sin cambios); el receptor puede verificar cualquiera de los dos.
Códigos de evento y carga de compatibilidad (tipo="DC-e", 14 campos en orden fijo):
| Código de evento | Disparador | dceStatus |
|---|---|---|
dce.authorized | Autorización 100 | Autorizada |
dce.rejected | Rechazo de la SEFAZ o fallo terminal de la tarea (incluidos los fallos antes de numerar el documento, que no tienen chave) | Negada (dceMotivoStatus es cStat - motivo; un fallo terminal sin cStat lleva solo el motivo) |
dce.canceled | Cancelación registrada (135 / 136 / 155) | Cancelada (dceDataAutorizacao es el momento del registro de la cancelación, dceNumeroProtocolo el protocolo del evento de cancelación) |
dce.cancel_rejected | La SEFAZ rechazó la cancelación o la tarea de cancelación falló terminalmente | CancelamentoNegado (el documento permanece autorizado; lleva el protocolo / digest / enlace del XML de la autorización) |
Campos de la carga
| Campo | Tipo | Descripción |
|---|---|---|
tipo | string | Siempre DC-e |
empresaId | string | Identificador de la empresa |
dceId | string | El id enviado en la emisión; correlacione las entregas por este campo |
dceStatus | string | Autorizada / Negada / Cancelada / CancelamentoNegado |
dceMotivoStatus | string | cStat - xMotivo en el rechazo o en el rechazo de la cancelación, el motivo del fallo en el fallo terminal; null en los demás casos |
dceLinkDace | string | Enlace del DACE renderizado bajo demanda por la chave (callbacks de autorización / cancelación); null en el rechazo |
dceLinkXml | string | Enlace de descarga del XML; null cuando no hay XML autorizado |
dceNumero | string | Número del DC-e; null cuando el documento nunca fue numerado |
dceSerie | string | Serie del DC-e; null cuando el documento nunca fue numerado |
dceChaveAcesso | string | Clave de acceso de 44 dígitos; null cuando el documento nunca fue numerado |
dceDataEmissao | string | Momento de la emisión; el momento de la aceptación para fallos antes de la numeración |
dceDataAutorizacao | string | Momento de la autorización; el momento del registro de la cancelación en dce.canceled; null en los demás casos |
dceNumeroProtocolo | string | Protocolo de autorización; el protocolo del evento de cancelación en dce.canceled; null en el rechazo |
dceDigestValue | string | Digest de la firma del documento autorizado; null en el rechazo y en 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 }
Fallo antes de la numeración (empresa no configurada para DC-e / serie ausente / fallo en el mapeo del mensaje y otros fallos terminales en los que el documento nunca fue numerado y no tiene chave): dce.rejected se entrega igualmente, los campos de hecho del documento son null, dceMotivoStatus lleva el motivo del fallo y dceDataEmissao el momento de la aceptación. Correlacione por dceId y nunca asuma 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=" }
En los callbacks de autorización / cancelación, dceLinkDace es el enlace del DACE renderizado bajo demanda por la chave (nada se renderiza en el momento de la entrega; la primera descarga lo renderiza y archiva); ambos enlaces tienen el mismo formato que la API de consulta (/openapi/files/{kind}/{ref}?token=…) y su validez proviene de la configuración del inquilino (por defecto 7 días). Vea Descarga de archivos.
Modelo de errores
Mismos formatos que la NF-e: los errores de negocio son [{ "codigo", "mensagem" }] (HTTP 400; un documento / tarea inexistente es HTTP 404 con codigo DCe0001); los errores de la capa de autenticación usan el sobre de la plataforma (401 / 403 / 429, vea Autenticación). Los casos con código de ejemplo documentado reutilizan el código del documento; todo otro codigo es el código de error numérico de la plataforma, y mensagem se localiza según el idioma de la solicitud (el portugués usa el texto del documento).
| codigo | HTTP | Escenario | Acción |
|---|---|---|---|
DCe0001 | 404 | dceId no encontrado, no pertenece a la empresa, o cancelación solicitada antes de que el documento se materializara | Verifique id y empresaId; cancele documentos Pendente solo después de la autorización |
10003000 | 404 | empresaId no encontrado | Verifique el empresaId |
DCe00004 | 400 | Empresa no configurada para DC-e (falta tipoEmitente / serie del modelo 99 / sitio del Marketplace), o ambiente distinto del entorno actual de la empresa | Envíe emissaoDCe en el registro o en una actualización con id; envíe en el entorno actual de la empresa y pida a operaciones el cambio a producción |
DCe00005 / DCe00006 / DCe00007 | 400 | Empresa Marketplace / Carrier sin remetente / remetente.endereco ausente / remitente brasileño sin cpfCnpj | Informe los datos del remitente |
DCe00008 | 400 | La empresa no puede emitir (no aprobada / certificado no listo) | Espere la aprobación / vincule el certificado |
DCe00009 | 400 | Destinatario brasileño sin cpfCnpj | Informe el documento del destinatario |
GW001 | 400 | Código IBGE del municipio no encontrado o inconsistente con uf | Verifique cidade / uf |
10019005 / 10019006 | 400 | Solicitud duplicada concurrente / demasiadas tareas pendientes para el CNPJ | Reintente más tarde |
10019007 | 400 | Serie no resuelta (varias series habilitadas) | Pida a operaciones consolidar las series |
10019013 | 400 | Tipo de emisor Carrier aún no soportado en la emisión | Use una empresa Marketplace / OwnIssuer |
10019018 – 10019022 | 400 | Ítem inválido / enumeración o formato inválido / CNPJ de la transportadora inválido / información adicional demasiado larga / autorizacaoDownloadXml inválido | Corrija según mensagem |
10019030 / 10019031 | 400 | Mismo id con mensaje distinto / producción: ya existe un documento activo o autorizado para el id | Use un nuevo id o reenvíe el mensaje original / consulte el original |
10019040 / 10019041 / 10019042 / 10019043 | 400 | El estado no permite la cancelación / ventana de 24 horas excedida / cancelación ya aceptada / motivo inválido | Vea Cancelar DC-e |
10019048 | 400 | dataEmissao fuera de la ventana permitida (más de 5 minutos hacia adelante o más de 30 días hacia atrás) | Use la hora actual u omita dataEmissao |
10001001 | 400 | Falló la validación de campos (una entrada por campo); errores de contrato de registro / actualización | Corrija según mensagem |
Las listas de códigos por endpoint están en Emitir DC-e, Consultar DC-e y Cancelar DC-e. Los rechazos de la SEFAZ durante la emisión no son errores HTTP: aparecen como estado Negada en la consulta y en el webhook dce.rejected; los rechazos de la SEFAZ a la cancelación aparecen como dce.cancel_rejected.
Máquina de estados
Aceptado (POST 200) ─→ Pendente ─numera + envía a SEFAZ─┬─ cStat 100 ─→ Autorizada ─DELETE 200─→ CancelamentoPendente ─┬─ 135/136/155 ─→ Cancelada│ └─ rechazo SEFAZ ─→ Autorizada (webhook CancelamentoNegado)├─ otro cStat terminal ─→ Negada└─ parámetros no interpretables / reintentos agotados ─→ Falha (el mismo id puede reenviarse)
- Mientras está
Pendente, las caídas de la SEFAZ (108 / 109) se reintentan con back-off por la plataforma; no hay redireccionamiento de contingencia en la fase uno. La emisión duplicada (451 / 452 / 539) se reconcilia consultando primero a la SEFAZ. - Tras
Negada/Falhael mismoidpuede reenviarse (reabierto con el nuevo mensaje); trasAutorizadaun reenvío con el mismoidsolo activa la idempotencia.
Observaciones
- El CNPJ de la clave es la empresa de la plataforma: las posiciones 7-20 siempre llevan al emisor autorizado (la empresa Marketplace o la empresa que emite para sí); un remitente CPF solo aparece en el grupo
emitdel XML y en el bloque REMETENTE del DACE. - Nombre fijo del destinatario en el entorno de certificación: con
tpAmb=2el nombre del destinatario en el XML y el DACE esDCE EMITIDA EM AMBIENTE DE HOMOLOGACAO(validación SEFAZ 598); el eco de la consulta conserva el original. - Ventana de cancelación de 24 horas: contada desde el momento de la autorización; después de ella el documento solo puede mantenerse. El DC-e oficial solo tiene cancelación: sin carta de corrección, sin inutilización de numeración.
- Carrier aún no soportado: el schema oficial actual restringe
tpEmita Marketplace / emisor propio; una empresa transportadora registrada se rechaza con10019013en la emisión. - DACE: A4 vertical, renderizado bajo demanda y en caché; re-renderizado con la marca de agua
CANCELADAtras la cancelación; el entorno de certificación lleva la marca de aguaSEM VALOR FISCAL - HOMOLOGAÇÃO. - Autorizador: el DC-e de todos los estados va al autorizador SEFAZ-PR; el código QR apunta a
https://www.fazenda.pr.gov.br/dce/qrcode?chDCe={chave}&tpAmb={tpAmb}.
Lista de verificación de integración
- En el entorno de certificación: empresa registrada (con
emissaoDCe, respuestadceHabilitado=trueconfirmada), certificado vinculado, webhook registrado (el receptor aceptatoken/x-token). - Emita un DC-e mínimo (el ejemplo en Emitir DC-e), consúltelo como
Autorizada, descargue el XML y el DACE, reciba el callbackdce.authorized. - Reenvíe el mismo
iduna vez y confirme HTTP 200 sin segundo documento; cambie un ítem y reenvíe, confirme10019030. - Cancele el documento: confirme 200 sin cuerpo, consulte
CancelamentoPendente→Cancelada, reciba el callbackdce.canceled, el DACE lleva la marca de agua. - Cancele de nuevo el documento cancelado y confirme
10019040; consulte un id inexistente y confirme 404DCe0001. - Envíe errores deliberados (
ambiente=Producao,cidade=9999999,remetenteausente) y confirme el array de errores 400 con los códigosDCe00004/GW001/DCe00005. - Emita para una empresa no habilitada para DC-e y confirme
DCe00004; reenvíe el payload de registro conidy unsequencialDCemayor, confirme 200 y que el próximo documento comienza desde el nuevo número; reenvíe un número menor y confirme 40010001001.
