API

Envía correo por REST o SMTP.

onesend te ofrece una API REST y un relay SMTP listo para usar para correo transaccional. Soberano en la UE, conforme al RGPD, alojado en Alemania. Cámbiate desde Amazon SES, SendGrid, Mailgun o Postmark cambiando solo el host y la clave.

Base REST

https://api.onesend.eu

Endpoint de envío

POST /v1/email/send

Auth REST

Authorization: Bearer KEY_ID:KEY_SECRET

Panel

https://app.onesend.eu

Host SMTP

smtp.onesend.eu

Puerto SMTP

587 (STARTTLS)

Usuario SMTP

KEY_ID

Contraseña SMTP

KEY_SECRET

Autenticación

Ambos métodos usan la misma credencial: una clave API, que tiene un key ID (público) y un key secret. Crea claves en el panel en app.onesend.eu.

La autenticación REST usa un token Bearer formado por el key ID y el key secret unidos por dos puntos:

Authorization: Bearer YOUR_KEY_ID:YOUR_KEY_SECRET

En SMTP, el key ID es el usuario y el key secret es la contraseña. No hay credenciales SMTP separadas que generar. La clave API es la credencial tanto para REST como para SMTP.

Verifica tu dominio de envío

Solo puedes enviar desde una dirección de un dominio que hayas añadido y verificado. Es obligatorio incluso durante la prueba, para proteger la reputación de la IP compartida. La verificación se hace una sola vez, en el panel.

Cuando añades un dominio, onesend genera una clave DKIM y te da cuatro registros TXT para publicar en tu proveedor de DNS:

PropósitoHostValor (ejemplo)
DKIMonesend._domainkey.yourdomain.comv=DKIM1; k=rsa; p=MIIB...
SPFyourdomain.comv=spf1 include:onesend.eu ~all
DMARC_dmarc.yourdomain.comv=DMARC1; p=none; rua=mailto:dmarc@onesend.eu
Propiedad_onesend.yourdomain.comonesend-verify=YOUR_TOKEN

DKIM es lo que habilita la verificación. Se recomiendan encarecidamente SPF y DMARC, pero el dominio se verifica solo con DKIM. El selector DKIM es onesend. Si ya tienes un registro SPF, añade include:onesend.eu a tu registro existente en lugar de crear un segundo, ya que un dominio solo puede tener un registro SPF. Los cambios de DNS tardan de unos minutos a unas horas en propagarse.

Enviar con la API REST

POST https://api.onesend.eu/v1/email/send
Authorization: Bearer YOUR_KEY_ID:YOUR_KEY_SECRET
Content-Type: application/json

Cuerpo de la solicitud:

{
  "from": "hello@yourdomain.com",
  "to": ["recipient@example.com"],
  "cc": ["optional@example.com"],
  "bcc": ["optional@example.com"],
  "reply_to": "reply@yourdomain.com",
  "subject": "Hello from onesend",
  "html": "<h1>It works</h1>",
  "text": "It works",
  "headers": { "X-Custom": "value" },
  "tags": { "campaign": "welcome" }
}

Los campos obligatorios son from, to, subject y al menos uno de html o text. La dirección from debe estar en un dominio verificado. Los campos cc, bcc, reply_to, text, headers y tags son opcionales.

Si tiene éxito, la respuesta es 202 Accepted y el mensaje se pone en cola para su entrega:

{ "message_id": "...", "status": "queued" }

Si el destinatario está en tu lista de supresión, la solicitud aún devuelve 200 (no es un error), el envío se omite y no se factura:

{ "message_id": "...", "status": "suppressed", "reason": "Recipient on suppression list (bounce)" }

Enviar por SMTP

Apunta tu cliente SMTP existente a onesend. No hay cambios de código más allá del host y las credenciales.

Host:     smtp.onesend.eu
Port:     587
Security: STARTTLS (required)
Username: YOUR_KEY_ID
Password: YOUR_KEY_SECRET

Se aplican las mismas reglas que en REST: la dirección From debe estar en un dominio verificado, y los destinatarios suprimidos se omiten y no se facturan.

Ejemplos de código

curl (REST)

curl -X POST https://api.onesend.eu/v1/email/send \
  -H "Authorization: Bearer $ONESEND_KEY_ID:$ONESEND_KEY_SECRET" \
  -H "Content-Type: application/json" \
  -d '{
    "from": "hello@yourdomain.com",
    "to": ["recipient@example.com"],
    "subject": "Hello from onesend",
    "html": "<h1>It works</h1>",
    "text": "It works"
  }'

Node.js (REST, fetch)

const res = await fetch("https://api.onesend.eu/v1/email/send", {
  method: "POST",
  headers: {
    "Authorization": `Bearer ${process.env.ONESEND_KEY_ID}:${process.env.ONESEND_KEY_SECRET}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    from: "hello@yourdomain.com",
    to: ["recipient@example.com"],
    subject: "Hello from onesend",
    html: "<h1>It works</h1>",
  }),
});
const data = await res.json();
console.log(res.status, data);

Node.js (SMTP, nodemailer)

import nodemailer from "nodemailer";

const transport = nodemailer.createTransport({
  host: "smtp.onesend.eu",
  port: 587,
  requireTLS: true,
  auth: {
    user: process.env.ONESEND_KEY_ID,
    pass: process.env.ONESEND_KEY_SECRET,
  },
});

await transport.sendMail({
  from: "hello@yourdomain.com",
  to: "recipient@example.com",
  subject: "Hello from onesend",
  html: "<h1>It works</h1>",
});

Python (REST, requests)

import os, requests

r = requests.post(
    "https://api.onesend.eu/v1/email/send",
    headers={
        "Authorization": f"Bearer {os.environ['ONESEND_KEY_ID']}:{os.environ['ONESEND_KEY_SECRET']}"
    },
    json={
        "from": "hello@yourdomain.com",
        "to": ["recipient@example.com"],
        "subject": "Hello from onesend",
        "html": "<h1>It works</h1>",
    },
)
print(r.status_code, r.json())

Python (SMTP, smtplib)

import os, smtplib
from email.message import EmailMessage

msg = EmailMessage()
msg["From"] = "hello@yourdomain.com"
msg["To"] = "recipient@example.com"
msg["Subject"] = "Hello from onesend"
msg.set_content("It works")
msg.add_alternative("<h1>It works</h1>", subtype="html")

with smtplib.SMTP("smtp.onesend.eu", 587) as s:
    s.starttls()
    s.login(os.environ["ONESEND_KEY_ID"], os.environ["ONESEND_KEY_SECRET"])
    s.send_message(msg)

PHP (REST, curl)

$ch = curl_init("https://api.onesend.eu/v1/email/send");
curl_setopt_array($ch, [
  CURLOPT_POST => true,
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer {$keyId}:{$keySecret}",
    "Content-Type: application/json",
  ],
  CURLOPT_POSTFIELDS => json_encode([
    "from" => "hello@yourdomain.com",
    "to" => ["recipient@example.com"],
    "subject" => "Hello from onesend",
    "html" => "<h1>It works</h1>",
  ]),
]);
$response = curl_exec($ch);

Cualquier otro lenguaje, framework o herramienta envía a través de la configuración SMTP anterior, incluidos Go net/smtp, Ruby, Java, Laravel, Rails, Django, WordPress y n8n.

Migrar desde otro proveedor

La migración más rápida es SMTP: cambia el host y las credenciales, y deja todo lo demás igual. En todos los casos, añade y verifica primero tu dominio de envío en onesend, porque el envío requiere un dominio verificado.

Amazon SES

Para SMTP, cambia el host de email-smtp.REGION.amazonaws.com a smtp.onesend.eu en el puerto 587, y usa tu key ID y key secret de onesend en lugar de las credenciales SMTP de SES. Es listo para usar. Para REST, SES usa solicitudes firmadas con SigV4, así que la API REST de onesend tiene otra forma; cámbiate a POST /v1/email/send o usa SMTP para una migración sin cambios de código. Puedes exportar tu lista de supresión de SES e importar el CSV en el panel.

SendGrid

Para SMTP, SendGrid usa smtp.sendgrid.net con el usuario apikey. onesend usa smtp.onesend.eu, con el usuario en tu key ID y la contraseña en tu key secret. Para REST, el /v3/mail/send de SendGrid usa una estructura JSON distinta; usa en su lugar POST /v1/email/send de onesend.

Mailgun

Para SMTP, cambia el host de smtp.mailgun.org a smtp.onesend.eu y cambia las credenciales. Para REST, Mailgun usa solicitudes codificadas como formulario a /v3/DOMAIN/messages; usa en su lugar el JSON POST /v1/email/send de onesend.

Postmark

Para SMTP, cambia el host de smtp.postmarkapp.com a smtp.onesend.eu y cambia las credenciales. Para REST, Postmark usa una cabecera X-Postmark-Server-Token y un cuerpo distinto; usa en su lugar POST /v1/email/send de onesend.

Valores de estado de entrega

Un mensaje pasa por estos estados:

  • queued aceptado y esperando a que el worker lo envíe.
  • sent entregado al servidor de correo receptor.
  • bounced rebote duro (permanente). La dirección se añade a tu lista de supresión.
  • soft_bounced fallo temporal, como un buzón lleno. Se reintenta, no se suprime.
  • complained el destinatario lo marcó como spam. Se añade a tu lista de supresión.
  • suppressed el destinatario ya estaba en tu lista de supresión. Se omite, no se factura.
  • invalid la dirección no pasó la validación antes del envío (sintaxis incorrecta o dominio muerto).
  • blocked bloqueado por una comprobación de políticas antes del envío.
  • failed fallo de envío interno.

Lista de supresión

onesend mantiene una lista de supresión por cuenta. Las direcciones llegan a ella automáticamente por rebotes duros y quejas, por la validación previa al envío, o las añades tú mismo. onesend registra tanto el motivo (por qué se suprime) como el origen (cómo llegó), además del código de diagnóstico real. Gestionas la lista en el panel y puedes importarla o exportarla como CSV.

Planes y facturación

Para enviar hacen falta un dominio verificado y un plan. La prueba cubre 100 correos sin límite de tiempo. Los planes de pago son Starter y Growth, facturados mensualmente a través de Mollie (un proveedor de pagos de la UE), con el IVA aplicado correctamente para clientes de la UE y de fuera, incluida la inversión del sujeto pasivo para NIF-IVA de empresa de la UE validados. El exceso se factura, no se bloquea, y los envíos suprimidos nunca se cuentan. Para precios actuales y volúmenes incluidos, consulta la página de precios.

Soberanía y cumplimiento

  • Empresa operadora: WOCOO Management and Consulting GmbH, Viena, Austria.
  • Infraestructura: Hetzner, Falkenstein, Alemania. Sin subencargados estadounidenses en la ruta de envío.
  • Diseñado para el RGPD: los datos del destinatario están en una bóveda de identidad separada de los registros de envío, y cada cuenta fija su propia política de retención. Se conservan los datos de la lista de supresión y las estadísticas agregadas.
  • Entregabilidad: SPF, DKIM con claves de 2048 bits por dominio y DMARC por dominio de envío. IP de envío dedicadas bajo petición.

¿Estás creando una integración con un asistente de IA? Una copia en texto plano de esta referencia está en /llms-full.txt