Envía la representación impresa de un CFE por correo
POST /v1/cfe/enviar-email/{id}
Envía la representación impresa (PDF) de un CFE ya emitido a una lista de hasta 10 destinatarios.
Validación previa
Antes de intentar cualquier envío, Host Factura valida que todos los correos tengan un formato válido. Si alguno es inválido, se rechaza la solicitud completa con 422 (ningún correo se envía).
Reporte por destinatario
El envío se hace destinatario por destinatario: el rechazo del servidor de correo en una dirección no aborta las demás. La respuesta siempre incluye el detalle por correo en resultados[], indicando cuáles fueron exitosos (exito: true) y cuáles fallaron (exito: false) con el motivo en error.
Códigos de estado HTTP
| Estado | Significado |
|---|---|
200 | Todos los correos fueron aceptados por el servidor (data.todosExitosos: true). |
207 | Envío parcial: algunos aceptados, otros rechazados. Revisá data.resultados. |
502 | El servidor de correo rechazó todos los envíos. El detalle va en error.details. |
Autorizaciones
Sección titulada «Autorizaciones »Parámetros
Sección titulada « Parámetros »Parámetros de path
Sección titulada «Parámetros de path »Identificador único del recurso (UUID v4)
Identificador único del recurso (UUID v4)
Cuerpo de la solicitud required
Sección titulada «Cuerpo de la solicitud required »Lista de hasta 10 correos a los que enviar la representación impresa
object
Ejemplos
Reenviar a tres destinatarios
{ "correos": [ "cliente@empresa.com.uy", "contador@empresa.com.uy", "archivo@empresa.com.uy" ]}Respuestas
Sección titulada « Respuestas »Todos los destinatarios recibieron el comprobante
Ejemplos
Todos los correos fueron aceptados
{ "data": { "total": 3, "exitosos": 3, "fallidos": 0, "todosExitosos": true, "ningunoExitoso": false, "resultados": [ { "email": "cliente@empresa.com.uy", "exito": true }, { "email": "contador@empresa.com.uy", "exito": true }, { "email": "archivo@empresa.com.uy", "exito": true } ] }}Envío parcial. Algunos correos fueron aceptados y otros rechazados. Inspeccioná data.resultados para ver el detalle por destinatario.
Ejemplos
Envío parcial (207): algunos aceptados, otros rechazados
{ "data": { "total": 3, "exitosos": 2, "fallidos": 1, "todosExitosos": false, "ningunoExitoso": false, "resultados": [ { "email": "cliente@empresa.com.uy", "exito": true }, { "email": "contador@empresa.com.uy", "exito": true }, { "email": "buzon-inexistente@empresa.com.uy", "exito": false, "error": "Message failed: 550 5.1.1 The email account that you tried to reach does not exist — código SMTP 550" } ] }}No autenticado. La API_KEY no fue enviada o no es válida.
Códigos posibles: API_AUTH_HEADER_MISSING, API_AUTH_HEADER_INVALID, API_ACCESS_INVALID.
object
object
Identificador estable del error en SCREAMING_SNAKE_CASE
Mensaje legible en español
Información adicional (puede ser objeto, array o string)
UUID de correlación; mismo valor que el header X-Request-ID
Ejemplos
Falta header Authorization
{ "error": { "code": "API_AUTH_HEADER_MISSING", "message": "Se esperaba la cabecera Authorization con esquema Bearer" }, "requestId": "5b2c7c8a-1f6e-4d29-9a0b-7c3a8d1e2f4c"}Secret key inválida o revocada
{ "error": { "code": "API_ACCESS_INVALID", "message": "Acceso no autorizado" }, "requestId": "5b2c7c8a-1f6e-4d29-9a0b-7c3a8d1e2f4c"}Acceso prohibido. La credencial es válida pero el plan o el alcance de sucursal lo impiden.
Códigos posibles: API_FEATURE_DISABLED, API_ACCESS_BRANCH_MISMATCH.
object
object
Identificador estable del error en SCREAMING_SNAKE_CASE
Mensaje legible en español
Información adicional (puede ser objeto, array o string)
UUID de correlación; mismo valor que el header X-Request-ID
Ejemplos
El plan no incluye API
{ "error": { "code": "API_FEATURE_DISABLED", "message": "El plan de esta cuenta no tiene habilitado el acceso a la API" }, "requestId": "5b2c7c8a-1f6e-4d29-9a0b-7c3a8d1e2f4c"}Header x-branch-id distinto al fijo del ApiAccess
{ "error": { "code": "API_ACCESS_BRANCH_MISMATCH", "message": "El ApiAccess está fijado a otra sucursal y no coincide con x-branch-id" }, "requestId": "5b2c7c8a-1f6e-4d29-9a0b-7c3a8d1e2f4c"}CFE no encontrado o pertenece a otra cuenta
object
object
Identificador estable del error en SCREAMING_SNAKE_CASE
Mensaje legible en español
Información adicional (puede ser objeto, array o string)
UUID de correlación; mismo valor que el header X-Request-ID
Ejemplos
CFE no encontrado
{ "error": { "code": "CFE_EMITIDO_NO_ENCONTRADO", "message": "CFE no encontrado (uuid)" }, "requestId": "5b2c7c8a-1f6e-4d29-9a0b-7c3a8d1e2f4c"}Rate limit excedido. Esperá los segundos indicados en el header Retry-After.
object
object
Identificador estable del error en SCREAMING_SNAKE_CASE
Mensaje legible en español
Información adicional (puede ser objeto, array o string)
UUID de correlación; mismo valor que el header X-Request-ID
Ejemplos
Excediste el rate limit
{ "error": { "code": "API_RATE_LIMITED", "message": "Se superó el límite de requests para esta API key" }, "requestId": "5b2c7c8a-1f6e-4d29-9a0b-7c3a8d1e2f4c"}Headers
Sección titulada «Headers »Ejemplo
42Segundos hasta que se libera la ventana de rate limit
El servidor de correo rechazó todos los envíos. El detalle por destinatario (con el motivo de cada rechazo) viene en error.details.
object
object
Identificador estable del error en SCREAMING_SNAKE_CASE
Mensaje legible en español
Información adicional (puede ser objeto, array o string)
UUID de correlación; mismo valor que el header X-Request-ID
Ejemplos
El servidor de correo rechazó todos los envíos
{ "error": { "code": "EMAIL_ENVIO_FALLIDO", "message": "El servidor de correo rechazó el envío a todos los destinatarios", "details": { "total": 2, "exitosos": 0, "fallidos": 2, "todosExitosos": false, "ningunoExitoso": true, "resultados": [ { "email": "no-existe@empresa.com.uy", "exito": false, "error": "Message failed: 550 5.1.1 The email account that you tried to reach does not exist — código SMTP 550" }, { "email": "dominio-caido@empresa.com.uy", "exito": false, "error": "getaddrinfo ENOTFOUND mail.dominio-caido.com — código ENOTFOUND" } ] } }, "requestId": "5b2c7c8a-1f6e-4d29-9a0b-7c3a8d1e2f4c"}