E-mail de facturas
Envíe NF-e / NFS-e / CT-e / DC-e autorizadas por correo al cliente: plantillas y variables, HTML del cuerpo e imágenes, adjuntos y enlaces de descarga, reglas del remitente, estados, idempotencia y 409, eventos de webhook, modelo de errores y checklist de integración.
Visión general y flujo de integración
| Paso | Endpoint | Notas |
|---|---|---|
| 1 Guardar plantilla | POST /openapi/v2/emails/templates | Del integrador, compartida por todas las empresas; puede haber varias por tipo de documento, padrao marca la predeterminada |
| 2 Registrar callback | POST /openapi/v1/webhooks | Incluya email.sent y email.failed en eventos; sin suscripción solo queda la consulta |
| 3 Enviar | POST /openapi/v2/empresas/{empresaId}/emails | Devuelve el emailId en la aceptación; la entrega es asíncrona |
| 4 Consultar | GET /openapi/v2/empresas/{empresaId}/emails/{emailId} | Estado, motivo de la espera, motivo del fallo y lo que se envió |
| Apoyo | GET .../emails/templates · GET .../emails/templates/{templateId} | Lista y detalle de las plantillas; el detalle trae la lista de variables permitidas |
La autenticación es la misma que en los demás endpoints: cabeceras token / timestamp / sign, vea Autenticación. El correo solo sale cuando usted llama al endpoint de envío; nada se envía automáticamente en la autorización.
Plantillas y envío
- La plantilla pertenece al integrador, no a una empresa; cualquier empresa registrada usa cualquier plantilla.
- Cada plantilla tiene un tipo de documento (
tipoDocumento) y un idioma (idioma) fijos. Puede haber varias por tipo, por ejemplo una por idioma. - Cada tipo de documento tiene como máximo una plantilla predeterminada (
padrao=true), sin importar el idioma. El envío sintemplateIdusa esa; sin predeterminada devuelve10021012. Para usar otra plantilla, informetemplateIden el envío. - Marcar una plantilla como predeterminada quita la predeterminada anterior del mismo tipo; una plantilla desactivada (
ativo=false) no sirve para el envío ni puede ser predeterminada. - Guardar sustituye la plantilla entera: con
templateId, reenvíe todos los campos; un campo opcional omitido vuelve a su valor por defecto. - En el envío la plantilla debe estar activa y ser del tipo del documento, si no
10021002.
Variables
Escriba {{nome}} en el asunto o el cuerpo; el nombre empieza con letra y acepta letras, dígitos, guion bajo y punto, con espacios opcionales dentro de las llaves. Al guardar, cada nombre se comprueba contra la lista del tipo de documento; un nombre desconocido devuelve 10021003. Al renderizar, una variable sin valor queda como texto vacío. En el cuerpo el valor se escapa como HTML; en el asunto no.
Comunes a los cuatro tipos:
| Variable | Significado |
|---|---|
numero | Número del documento |
serie | Serie |
chaveAcesso | Clave de acceso, 44 o 50 dígitos |
dataEmissao | Fecha de emisión, huso de São Paulo |
valorTotal | Importe total: total de la NF-e, valor del servicio de la NFS-e, valor total de la prestación del CT-e, valor declarado de la DC-e |
emitente.nome | Razón social del emisor |
emitente.cnpj | CNPJ del emisor |
cliente.nome | Nombre del destinatario de la nota: comprador de la NF-e, tomador de la NFS-e y del CT-e, destinatario de la DC-e |
cliente.documento | Documento del destinatario, CPF o CNPJ |
linkPdf | Enlace de descarga del PDF |
linkXml | Enlace de descarga del XML autorizado; vacío si el XML aún no fue archivado |
Propias de cada tipo:
| Tipo | Variable | Significado |
|---|---|---|
| NFSe | codigoVerificacao | Código de verificación de la NFS-e |
| NFSe | municipio | Nombre del municipio del emisor |
| NFSe | descricaoServico | Descripción del servicio |
| NFSe | valorIss | Importe del ISS |
| CTe | remetente.nome | Nombre del remitente de la carga |
| CTe | destinatario.nome | Nombre del destinatario de la carga |
| CTe | valorFrete | Valor total de la prestación |
| DCe | marketplace.site | Sitio del marketplace, del registro de DC-e del emisor |
Importes y fechas siguen el idioma de la plantilla: pt / es usan 1.234,56 y dd/MM/yyyy HH:mm; en / zh usan 1,234.56 y yyyy-MM-dd HH:mm. La hora es siempre la de São Paulo. El campo variaveisDisponiveis de Consultar plantilla es la lista completa del tipo.
HTML del cuerpo e imágenes
El cuerpo se rechaza, no se limpia: cualquier elemento fuera de la lista devuelve 10021004 al guardar, con su posición. Etiquetas permitidas: p, div, span, br, hr, h1 a h6, strong, b, em, i, u, s, ul, ol, li, blockquote, table, thead, tbody, tr, th, td, a, img; atributos permitidos: style, href, src, alt, width, height, align, colspan, rowspan. style no puede contener url(, expression(, position: ni behavior:; href solo acepta https:, mailto:, {{linkPdf}} o {{linkXml}}; el cuerpo tiene como máximo 64 KB.
Imágenes solo por dirección https. La plataforma no tiene subida de imágenes; aloje el logotipo en una dirección pública propia. Una imagen http se marca como contenido mixto en los clientes de correo y una imagen inline data: no se muestra en algunos webmails; ambas se rechazan al guardar. Un ejemplo completo con logotipo y botones está en Guardar plantilla de correo.
Adjuntos y enlaces de descarga
enviarPdf=trueadjunta el comprobante en PDF (DANFE / DANFSe / DACTE / DACE) yenviarXml=trueadjunta el XML autorizado; los archivos se llaman{tipo}-{chave}.pdf/.xml.- Si el comprobante o el XML aún no está disponible, el correo no sale incompleto: queda en
Aguardando(motivoEspera=pdfoxml), comprobado de nuevo cada 30 segundos hasta 120 minutos; después pasa aFalha. - Aunque no adjunte nada, el cuerpo puede llevar los enlaces
{{linkPdf}}/{{linkXml}}; su validez sigue la configuración de enlaces de archivo del integrador, 7 días por defecto.
Remitente y destinatarios
- La dirección del remitente es la de la plataforma; no puede usarse un correo o dominio propio. El nombre mostrado es la razón social del emisor y el responder-a es el correo registrado de la empresa, así que las respuestas del cliente llegan a la empresa.
destinatariosacepta hasta 5 direcciones; omitido, usa el correo del cliente informado en la emisión, que solo tienen NF-e y NFS-e; CT-e y DC-e exigendestinatarios. Sin ninguno,10021013.- Las direcciones repetidas se unifican y el dominio pasa a minúsculas; el
destinatariosde la aceptación y de la consulta es la lista efectiva ya normalizada.
Estados
Aguardando ──► Enfileirado ──► Enviando ──┬──► Enviado (terminal)└──► Falha (terminal)
| Estado | Significado | Terminal |
|---|---|---|
Aguardando | Aceptado, a la espera de datos del documento; motivoEspera = chaveAcesso / pdf / xml | No |
Enfileirado | En cola, datos completos | No |
Enviando | Renderizando y enviando | No |
Enviado | Aceptado por el servicio de envío | Sí |
Falha | Fallo definitivo, motivoFalha lo explica | Sí |
Aguardando solo existe mientras falta la clave (la clave de 50 dígitos de la NFS-e de São Paulo vuelve después por el ambiente nacional), el PDF o el XML, y no consume intentos. Un fallo al salir se reintenta con espera creciente, hasta 5 intentos; agotados, pasa a Falha. Otras causas de Falha: documento que dejó de estar autorizado, plantilla desactivada tras la aceptación, comprobante que no puede emitirse.
Idempotencia y 409
ides la clave de idempotencia, única dentro de la empresa. Repetir el mismoiddevuelve la aceptación original sin crear otro correo, aunque el cuerpo sea distinto; elstatusde la respuesta es el estado actual.- Mientras el correo anterior del mismo documento (misma empresa,
tipoDocumentoydocumentoId) no llegue al estado terminal, un envío con otroiddevuelve HTTP 409 y10021015, con elemailIdy el estado del correo en curso en el mensaje. EspereEnviado/Falhapor el callback o la consulta y reenvíe con unidnuevo.
Eventos de webhook
Incluya email.sent y email.failed en eventos al registrar el webhook; ambos solo se entregan a las aplicaciones que los suscriben explícitamente. El payload es el sobre de evento, con los campos de data en snake_case:
{"version": "1.0","event_id": "1950000000000006","event_type": "email.sent","occurred_at": "2026-09-28T12:00:31Z","data": {"email_id": "2103160000000000001","id": "email-pedido-8842-1","tipo_documento": "NFe","documento_id": "pedido-8842","chave": "35241204893402000113650010000117691017244265","destinatarios": ["comprador@exemplo.com"],"status": "Enviado","motivo_falha": null}}
| Evento | Cuándo | data.status |
|---|---|---|
email.sent | El servicio de envío aceptó el mensaje | Enviado |
email.failed | Fallo definitivo, data.motivo_falha lo explica | Falha |
email.sent significa que el servicio de envío aceptó el mensaje, no que llegó a la bandeja del destinatario. La descripción completa de los campos está en Webhooks.
Modelo de errores
Los endpoints devuelven un array plano:
[{"codigo": "10021013", "mensagem": "Sem destinatário: destinatarios não informado e o documento não tem e-mail do cliente"}]
| Código | HTTP | Significado | Qué hacer |
|---|---|---|---|
10001001 | 400 | Falló la validación de campos | Corrija según el mensaje |
10003000 | 404 | Empresa no encontrada | Verifique empresaId |
10021001 | 404 | Plantilla no encontrada o de otro integrador | Verifique templateId |
10021002 | 400 | Plantilla desactivada o de tipo distinto del documento | Cambie la plantilla o reactívela |
10021003 | 400 | La plantilla usa variables fuera de la lista permitida | Corrija los nombres señalados en el mensaje |
10021004 | 400 | HTML de la plantilla con contenido prohibido o por encima de 64 KB | Corrija las posiciones señaladas en el mensaje |
10021005 | 400 | Tipo de documento no soportado | Use solo NFe / NFSe / CTe / DCe |
10021010 | 404 | Documento no encontrado o de otra empresa | Verifique documentoId y tipoDocumento |
10021011 | 400 | Documento aún no autorizado | Envíe después de la autorización |
10021012 | 400 | Tipo sin plantilla predeterminada | Informe templateId o marque una predeterminada |
10021013 | 400 | Sin destinatario | Informe destinatarios |
10021015 | 409 | Correo anterior del mismo documento en curso | Espere el estado terminal y reenvíe con id nuevo |
10021020 | 404 | Correo no encontrado o de otra empresa | Verifique emailId |
Los errores de autenticación y autorización (10009xxx) están en Autenticación; la tabla completa en Códigos de error.
Checklist de integración
- Guarde una plantilla NFe con
padrao=truey compruebe quevariaveisDisponiveisen la respuesta tiene 11 ítems. - Escriba a propósito
{{codigoVerificacao}}en el cuerpo y compruebe10021003; cambie la imagen por una direcciónhttpy compruebe10021004. - Incluya
email.sentyemail.faileden loseventosdel webhook. - Envíe una NF-e autorizada (
enviarPdfyenviarXmlentrue, sindestinatarios); compruebe la aceptaciónEnfileirado, despuésemail.sent, yassuntoyenviadoEmrellenados en la consulta. - Antes del estado terminal, envíe el mismo documento con otro
idy compruebe 409 con10021015; repita con el mismoidy compruebe el mismoemailId. - Envíe una NFS-e de São Paulo y compruebe la aceptación
AguardandoconmotivoEspera=chaveAcesso, pasando aEnviadopor sí sola cuando llegue la clave.
