Registro de cambios
Aquí se recogen los cambios que afectan a la API pública o a los SDK. Los paquetes de los SDK siguen el versionado semántico; sus registros de cambios detallados se publican con cada versión en npm.
Sin publicar: beta pública
Sección titulada «Sin publicar: beta pública»SendGrid deja de ser compatible (octubre de 2026)
Sección titulada «SendGrid deja de ser compatible (octubre de 2026)»Desde el 1 de octubre de 2026, SendGrid ya no está disponible como proveedor de correo. Si enviabas a través de un servicio de SendGrid, cámbiate a otro proveedor de API como Resend, Postmark, Mailgun, Brevo o Mailjet y luego elige el nuevo servicio en tus plantillas (también como servicio de respaldo, si lo usabas ahí).
Traducciones de plantillas (septiembre de 2026)
Sección titulada «Traducciones de plantillas (septiembre de 2026)»Una misma plantilla ya se puede enviar en muchos idiomas; consulta Traducciones de plantillas.
- Panel: una barra Idiomas en el editor de plantillas. Añade hasta 29 variantes de idioma por
plantilla (cualquier idioma BCP 47, p. ej.
huopt-BR): como copia del idioma predeterminado, vacías o mediante traducción automática. Las variantes traducen el asunto, el HTML, el texto y el nombre del remitente; los destinatarios, los parámetros y los ajustes siguen siendo comunes. Cada variante tiene sus propias versiones y su reversión, y las etiquetas Desactualizada / Automática. El idioma predeterminado de la plantilla puede ser cualquier idioma (Ajustes → General → Idioma predeterminado). La exportación y la importación incluyen las variantes. - Traducción automática con tu propia clave: OpenAI, Anthropic, Google Gemini o DeepL con la
clave API propia de tu organización (Ajustes → Traducción automática, propietarios y
administradores). Frontmail comprueba que los parámetros, los enlaces y la estructura HTML se
mantienen (
translation_invalid). 30 traducciones por hora y organización, hasta 60 000 caracteres. Nuevos códigos de errortranslation_not_configured,translation_invalid,translation_provider_authytranslation_provider_error. - API:
localeopcional enPOST /v1/sendy en los elementos de/v1/send-batch, campo de formulariofm_localeenPOST /v1/send-form(un campo llamadolocalesigue siendo un parámetro de la plantilla). Resolución: idioma exacto → mismo idioma base (de-AT→de) → idioma predeterminado; una etiqueta mal formada da400 invalid_body. Las respuestas de envío y los resultados por lotes devuelven ellocaleusado;GET /v1/templatesdevuelvelocales. Las respuestas automáticas siguen el idioma del mensaje original y Reenviar lo mantiene. Las rutas compatibles con EmailJS usan siempre el idioma predeterminado. - Formato: las fechas, los números, los importes y el pie del plan Free siguen ahora el idioma en que se envía el correo (antes, el idioma de la organización).
- SDK de JavaScript (próxima versión, 0.2.0, junto con el refuerzo de seguridad de los SDK que se
describe más abajo): opción
localeensend/sendForm(sendFormla envía comofm_locale), proplocaleen<FrontmailForm>(React, Vue, Svelte) y enuse:frontmailForm,result.locale;@frontmail/node:localeensendy en los elementos desendBatch,templates.list()devuelvelocalesyfrontmail typesgenera los idiomas de cada plantilla y un tipo<TemplateName>Locale.@frontmail/emailjs-compatno cambia (solo idioma predeterminado). - SDK de Android / Kotlin 0.2.0:
SendOptions(locale = "de"),SendResult.locale. - SDK de iOS / Swift 0.2.0:
SendOptions(locale: "de"),SendResult.locale.
Refuerzo de seguridad: borde de la API pública y claves (septiembre de 2026)
Sección titulada «Refuerzo de seguridad: borde de la API pública y claves (septiembre de 2026)»Cambios de comportamiento; revisa tu integración:
- Las solicitudes sin
OriginniReferer(servidores, curl, apps nativas) con la clave pública ahora necesitan Permitir apps móviles, también cuando tu lista de sitios web permitidos está vacía. Antes, una lista vacía las aceptaba. A las organizaciones que enviaron solicitudes de este tipo en los últimos 30 días se les activó el interruptor automáticamente. En caso contrario:403 origin_not_allowed(details.reason: "no_origin"). En servidores, usa una clave privada. - Se rechazan las claves privadas desde navegadores: una solicitud con clave privada
(
Authorization: Bearero el campoaccessTokenal estilo de EmailJS) que lleve la cabeceraOriginrecibe el nuevo error403 private_key_in_browser. Para herramientas internas se puede habilitar en Seguridad → Permitir claves privadas en navegadores. - La CAPTCHA de las solicitudes sin
Originse verifica con el widget móvil compartido de Frontmail solo si Permitir apps móviles está activado. Las claves de prueba de Cloudflare se rechazan en producción. - Consulta del estado: envía el token de estado en la cabecera
X-Frontmail-Status-Token;?token=sigue funcionando para los SDK antiguos. - Límites de frecuencia: los clientes IPv6 comparten el límite por IP por cada red
/64. Los límites por clave y por organización y la detección de anomalías ahora solo cuentan las solicitudes que han superado las comprobaciones de plantilla y CAPTCHA, así que una avalancha de solicitudes no válidas ya no bloquea a tus visitantes reales. - Adjuntos: se limpian los nombres de archivo (caracteres invisibles o bidireccionales, puntos
finales) y se rechazan más tipos peligrosos (HTML, SVG, imágenes de disco, OneNote, Office con
macros,
.url,.lnk, …). Las subidas con clave pública (POST /v1/uploads) necesitan una plantilla que acepte adjuntos y tienen un presupuesto diario de bytes por organización. template_id/service_idmultipart de más de 64 caracteres →400 invalid_body(antes500).- La API, la API del panel y el inicio de sesión solo aceptan tráfico que pase por el CDN de Frontmail.
POST /v1/send,/v1/send-form,/v1/send-batch,/v1/uploads,GET /v1/messages/:id,GET /v1/history,GET /v1/templatesy alias compatibles con EmailJS.- Formato de error unificado con
docs_url; soporte deIdempotency-Key(24 h). - Cola de correos retenidos con los estados
held/held_service_errory los modoshold/reject. - Bloqueo de contenido para los envíos con clave pública a plantillas con destinatario dinámico:
CAPTCHA obligatoria (
dynamic_recipient_requires_captcha), campos de remitente fijos (dynamic_field_not_allowed), sin parámetros HTML y textos de ≤ 500 caracteres, enlaces solo a dominios permitidos (link_not_allowed) y como máximo 5 correos por destinatario y día. Una dirección From tomada de los parámetros se rechaza en cualquier envío con clave pública. Las respuestas automáticas también están bloqueadas. Nuevos ajustes:security.allowedLinkDomains,security.recipientDailyLimit,enforceLinkAllowlisten la plantilla. Consulta Lista de enlaces permitidos y bloqueo de contenido.
@frontmail/browser0.x (ESM + UMD, fija la versión con SRI),@frontmail/react,@frontmail/react-native,@frontmail/vue,@frontmail/svelte,@frontmail/nodecon la CLIfrontmail types,@frontmail/emailjs-compat.- Reintentos automáticos con backoff exponencial y claves de idempotencia; errores tipados.
Seguridad
Sección titulada «Seguridad»- La verificación en dos pasos ahora se exige en todos los métodos de inicio de sesión (incluidos los enlaces de inicio de sesión por correo y Google / GitHub) y solo se puede activar con una dirección de correo verificada.
- Los enlaces de inicio de sesión y de verificación abiertos en otro navegador piden confirmación (o no inician sesión en ese navegador), así que un enlace que te envíe otra persona no puede iniciar tu sesión en su cuenta.
- Cambiar el correo de inicio de sesión requiere tu contraseña y la aprobación desde la dirección actual.
- Los administradores ya no pueden asignar el rol de Facturación; solo el propietario gestiona a los administradores y a los miembros de facturación.
- Las URL de webhook de los proveedores se ocultan a los lectores y a los miembros de facturación y se pueden regenerar (Generar una nueva URL de webhook).
- Los servidores SMTP propios deben usar una dirección pública y el puerto 25, 465, 587 o 2525.
- Los adjuntos de las plantillas solo pueden usar archivos subidos por la misma organización.
- Las invitaciones al equipo están limitadas por destinatario y por organización; los nombres de organización no pueden contener enlaces.
- Los datos de seguimiento de clics exportados a analítica ya no contienen query strings (tokens, correos).
Refuerzo de seguridad de los SDK (próxima versión, 0.2.0)
Sección titulada «Refuerzo de seguridad de los SDK (próxima versión, 0.2.0)»- Cambio incompatible: los SDK de navegador (
@frontmail/browser, React, Vue, Svelte,@frontmail/emailjs-compat) lanzanprivate_key_in_browsercuando se usa una clave privada (privateKey,accessTokenen compat) en un navegador web;@frontmail/nodese niega a ejecutarse allí. Para desactivarlo:dangerouslyAllowPrivateKeyInBrowser: true. sendFormomite los campos de contraseña, los campos anti-CSRF y los nombres reservados; nuevoformFields: { include, exclude }.getStatusenvía el token de estado en la cabeceraX-Frontmail-Status-Tokenen lugar de?token=.<TurnstileWebView>de React Native está restringido a la página del widget (orígenes, navegación, mensajes).- CDN:
sri.jsoncon hashesintegrityjunto a cada bundle versionado; la documentación usa URL con la versión fijada y Subresource Integrity.
- Editor de plantillas HTML con vista previa en vivo, parámetros tipados, comprobaciones, versiones y galería (EN/CS).
- Servicios para SMTP, Mailgun, Amazon SES, Postmark, SendGrid, Mailjet, Brevo, Resend, Gmail y Outlook / Microsoft 365, con conmutación por error (failover) y comprobaciones de estado.
- Créditos: planes, paquetes de créditos, sobregiro, recarga automática; estadísticas de consumo.
Facturación y créditos (correcciones de seguridad)
Sección titulada «Facturación y créditos (correcciones de seguridad)»- Los planes anuales ahora reciben su cuota mensual y su margen de sobregiro en cada mes del periodo (antes solo en el primer mes).
- El sobregiro usado en los planes anuales se factura cada mes en una factura aparte; el sobregiro usado antes de que termine una suscripción (cancelación, eliminación de la organización) se factura de inmediato.
- Al pasar de mensual a anual se trasladan los créditos usados en el mes en curso.
- Los cambios de plan se rechazan mientras la suscripción tenga una factura impagada (
409 conflict,details.reason: "subscription_not_active"). - Los pagos disputados (contracargos) retiran los créditos que compraron; se restauran si se gana la disputa. Los reembolsos se procesan uno a uno.
- Nuevo: la cola de correos retenidos está limitada por organización; por encima del límite, las
solicitudes reciben
402 insufficient_creditscondetails.reason: "hold_queue_full". - Nuevo: los correos enviados con la clave pública no usan el sobregiro ni activan la recarga automática salvo que lo habilites en Facturación → Comprar créditos → Gasto del tráfico con clave pública (desactivado por defecto, también en las organizaciones existentes).
- Servidores SMTP propios: los fallos que ocurren después de que el servidor haya recibido el mensaje ya no se reembolsan; una protección de la tasa de reembolsos por organización detiene los reembolsos cuando los fallos son anormalmente frecuentes.
- Los webhooks de los proveedores solo suprimen a los destinatarios reales del mensaje; los webhooks de Amazon SES fijan el tema SNS del primer mensaje firmado. Resend rechaza las plantillas congeladas por una bajada de plan.