Get started
Quickstart
Send your first message. Mint an API key in the console, then call POST /emails.
1. Have a verified domain
Open the console and select your organization. Go to Domains. Make sure that the domain you send from shows Verified. If it does not, complete Verify a domain first. The API refuses to send from a domain with any other status (422 domain_not_verified).
2. Mint an API key
Go to API keys → New key. Enter a name. Select SEND. This permission is sufficient to send messages and upsert contacts. If the API key lives in one app, restrict it to the domain of that app.
The console shows the token (f5_live_…) once. Copy it into the environment of the app.
3. Send
curl -X POST https://api.f5send.com/api/v1/emails \
-H "Authorization: Bearer $F5SEND_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: welcome:user_123" \
-d '{
"from": "Acme <hello@example.com>",
"to": ["jane@example.org"],
"subject": "Welcome to Acme",
"html": "<p>Thanks for signing up.</p>",
"text": "Thanks for signing up."
}'
const res = await fetch("https://api.f5send.com/api/v1/emails", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.F5SEND_API_KEY}`,
"Content-Type": "application/json",
"Idempotency-Key": "welcome:user_123",
},
body: JSON.stringify({
from: "Acme <hello@example.com>",
to: ["jane@example.org"],
subject: "Welcome to Acme",
html: "<p>Thanks for signing up.</p>",
text: "Thanks for signing up.",
}),
});
const { id } = await res.json(); // { "id": "cm…" }
The response is { "id": "<message id>" }. The API queues the message. The worker sends it. Delivery events arrive on the message timeline and on your webhooks.
SMTP instead of HTTP
A program that cannot call HTTP can use the SMTP relay. Host smtp.f5send.com, port 465, username = the id of the API key, password = the token. Settings → SMTP in the console shows ready configuration for Postfix, WordPress, Python, Node.js and .NET.
About Idempotency-Key
If you send the same Idempotency-Key again in the same organization, you get the original message id back. The response carries the header Idempotent-Replayed: true. The platform sends nothing twice. Use the header on every cron or retry path. See Rate limits & idempotency for details.
4. Check the result
In the console, Emails lists the message with its status (Queued → Sent → Delivered). The page also shows an event timeline per recipient. You can also fetch the message with the API:
curl https://api.f5send.com/api/v1/emails/<id> \
-H "Authorization: Bearer $F5SEND_API_KEY"
Bulk mail
If the message is a digest, a newsletter, a sequence step or another bulk message, pass a kind such as "digest.weekly". Send exactly one recipient per message. The platform then adds List-Unsubscribe / one-click headers. It also applies the unsubscribe state of the recipient. See Unsubscribe & tracking.