Start with a hello
~1s
Median transactional delivery
Reliable Email Infrastructure
A powerful and reliable email sending API for businesses. Deliver transactional, marketing, and notification emails at scale — with world-class deliverability and simple integrations.
First email in minutes
Built for the inbox
From launch to growth
Built for the tools you already use
A simple, elegant interface so you can start sending emails in minutes. It fits right into your code for your favorite programming languages.
curl --request POST "https://api.sendmero.com/v1/messages" \
--header "Authorization: Bearer $SENDMERO_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"from": "onboarding@yourapp.com",
"to": "user@example.com",
"subject": "Your verification code",
"html": "<p>Your code is 482913</p>"
}' curl --url "smtp://$SMTP_HOST:$SMTP_PORT" \
--ssl-reqd \
--user "$SMTP_USERNAME:$SMTP_PASSWORD" \
--mail-from "onboarding@yourapp.com" \
--mail-rcpt "user@example.com" \
--crlf --upload-file - <<'EMAIL'
From: onboarding@yourapp.com
To: user@example.com
Subject: Your verification code
MIME-Version: 1.0
Content-Type: text/html; charset=UTF-8
<p>Your code is 482913</p>
EMAIL const response = await fetch("https://api.sendmero.com/v1/messages", {
method: "POST",
headers: {
Authorization: "Bearer " + process.env.SENDMERO_API_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({
from: "onboarding@yourapp.com",
to: "user@example.com",
subject: "Your verification code",
html: "<p>Your code is 482913</p>",
}),
});
console.log(response.status, await response.json()); Setupnpm install nodemailer · save as send.mjs
import nodemailer from "nodemailer";
const smtp = nodemailer.createTransport({
host: process.env.SMTP_HOST,
port: Number(process.env.SMTP_PORT),
secure: false,
requireTLS: true,
auth: {
user: process.env.SMTP_USERNAME,
pass: process.env.SMTP_PASSWORD,
},
});
const result = await smtp.sendMail({
from: "onboarding@yourapp.com",
to: "user@example.com",
subject: "Your verification code",
html: "<p>Your code is 482913</p>",
});
console.log(result.messageId); import json, os
from urllib.request import Request, urlopen
message = {
"from": "onboarding@yourapp.com",
"to": "user@example.com",
"subject": "Your verification code",
"html": "<p>Your code is 482913</p>",
}
request = Request(
"https://api.sendmero.com/v1/messages",
data=json.dumps(message).encode(),
headers={
"Authorization": "Bearer " + os.environ["SENDMERO_API_KEY"],
"Content-Type": "application/json",
},
method="POST",
)
with urlopen(request) as response:
print(response.status, json.load(response)) import os, smtplib, ssl
from email.message import EmailMessage
message = EmailMessage()
message["From"] = "onboarding@yourapp.com"
message["To"] = "user@example.com"
message["Subject"] = "Your verification code"
message.set_content("<p>Your code is 482913</p>", subtype="html")
with smtplib.SMTP(
os.environ["SMTP_HOST"], int(os.environ["SMTP_PORT"]), timeout=30
) as smtp:
smtp.starttls(context=ssl.create_default_context())
smtp.ehlo()
smtp.login(os.environ["SMTP_USERNAME"], os.environ["SMTP_PASSWORD"])
smtp.send_message(message) <?php
$request = curl_init('https://api.sendmero.com/v1/messages');
curl_setopt_array($request, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('SENDMERO_API_KEY'),
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'from' => 'onboarding@yourapp.com',
'to' => 'user@example.com',
'subject' => 'Your verification code',
'html' => '<p>Your code is 482913</p>',
]),
]);
$response = curl_exec($request);
if ($response === false) throw new RuntimeException(curl_error($request));
echo $response;
curl_close($request); Setupcomposer require phpmailer/phpmailer
<?php
use PHPMailer\PHPMailer\PHPMailer;
require 'vendor/autoload.php';
$mail = new PHPMailer(true);
$mail->isSMTP();
$mail->Host = getenv('SMTP_HOST');
$mail->Port = (int) getenv('SMTP_PORT');
$mail->SMTPAuth = true;
$mail->Username = getenv('SMTP_USERNAME');
$mail->Password = getenv('SMTP_PASSWORD');
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
$mail->setFrom('onboarding@yourapp.com');
$mail->addAddress('user@example.com');
$mail->Subject = 'Your verification code';
$mail->isHTML(true);
$mail->Body = '<p>Your code is 482913</p>';
$mail->send(); require "net/http"
require "json"
uri = URI("https://api.sendmero.com/v1/messages")
request = Net::HTTP::Post.new(uri)
request["Authorization"] = "Bearer " + ENV.fetch("SENDMERO_API_KEY")
request["Content-Type"] = "application/json"
request.body = {
from: "onboarding@yourapp.com",
to: "user@example.com",
subject: "Your verification code",
html: "<p>Your code is 482913</p>"
}.to_json
response = Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
http.request(request)
end
puts response.code, response.body Setupgem install net-smtp
require "net/smtp"
message = <<~EMAIL
From: onboarding@yourapp.com
To: user@example.com
Subject: Your verification code
MIME-Version: 1.0
Content-Type: text/html; charset=UTF-8
<p>Your code is 482913</p>
EMAIL
smtp = Net::SMTP.new(ENV.fetch("SMTP_HOST"), Integer(ENV.fetch("SMTP_PORT")))
smtp.enable_starttls
smtp.start(
helo: "yourapp.com",
user: ENV.fetch("SMTP_USERNAME"),
secret: ENV.fetch("SMTP_PASSWORD"),
authtype: :plain
) do |connection|
connection.send_message(message, "onboarding@yourapp.com", "user@example.com")
end package main
import (
"io"
"net/http"
"os"
"strings"
)
func main() {
body := strings.NewReader(`{
"from": "onboarding@yourapp.com",
"to": "user@example.com",
"subject": "Your verification code",
"html": "<p>Your code is 482913</p>"
}`)
request, err := http.NewRequest("POST", "https://api.sendmero.com/v1/messages", body)
if err != nil { panic(err) }
request.Header.Set("Authorization", "Bearer "+os.Getenv("SENDMERO_API_KEY"))
request.Header.Set("Content-Type", "application/json")
response, err := http.DefaultClient.Do(request)
if err != nil { panic(err) }
defer response.Body.Close()
io.Copy(os.Stdout, response.Body)
} Setupgo get github.com/wneessen/go-mail
package main
import (
"os"
"strconv"
mail "github.com/wneessen/go-mail"
)
func main() {
port, err := strconv.Atoi(os.Getenv("SMTP_PORT"))
if err != nil { panic(err) }
smtp, err := mail.NewClient(os.Getenv("SMTP_HOST"),
mail.WithPort(port),
mail.WithTLSPolicy(mail.TLSMandatory),
mail.WithSMTPAuth(mail.SMTPAuthPlain),
mail.WithUsername(os.Getenv("SMTP_USERNAME")),
mail.WithPassword(os.Getenv("SMTP_PASSWORD")),
)
if err != nil { panic(err) }
message := mail.NewMsg()
if err := message.From("onboarding@yourapp.com"); err != nil { panic(err) }
if err := message.To("user@example.com"); err != nil { panic(err) }
message.Subject("Your verification code")
message.SetBodyString(mail.TypeTextHTML, "<p>Your code is 482913</p>")
if err := smtp.DialAndSend(message); err != nil { panic(err) }
} import java.net.URI;
import java.net.http.*;
class SendEmail {
public static void main(String[] args) throws Exception {
String message = """
{
"from": "onboarding@yourapp.com",
"to": "user@example.com",
"subject": "Your verification code",
"html": "<p>Your code is 482913</p>"
}
""";
var request = HttpRequest.newBuilder()
.uri(URI.create("https://api.sendmero.com/v1/messages"))
.header("Authorization", "Bearer " + System.getenv("SENDMERO_API_KEY"))
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(message)).build();
var response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
}
} SetupMaven: org.eclipse.angus:jakarta.mail:2.0.4
import jakarta.mail.*;
import jakarta.mail.internet.*;
import java.util.Properties;
class SendEmail {
public static void main(String[] args) throws Exception {
var properties = new Properties();
properties.setProperty("mail.smtp.host", System.getenv("SMTP_HOST"));
properties.setProperty("mail.smtp.port", System.getenv("SMTP_PORT"));
properties.setProperty("mail.smtp.auth", "true");
properties.setProperty("mail.smtp.starttls.enable", "true");
properties.setProperty("mail.smtp.starttls.required", "true");
properties.setProperty("mail.smtp.ssl.checkserveridentity", "true");
var message = new MimeMessage(Session.getInstance(properties));
message.setFrom(new InternetAddress("onboarding@yourapp.com"));
message.setRecipients(Message.RecipientType.TO, "user@example.com");
message.setSubject("Your verification code");
message.setContent("<p>Your code is 482913</p>", "text/html; charset=UTF-8");
Transport.send(message, System.getenv("SMTP_USERNAME"),
System.getenv("SMTP_PASSWORD"));
}
} using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Net.Http.Json;
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(
"Bearer", Environment.GetEnvironmentVariable("SENDMERO_API_KEY"));
using var response = await client.PostAsJsonAsync(
"https://api.sendmero.com/v1/messages",
new {
from = "onboarding@yourapp.com",
to = "user@example.com",
subject = "Your verification code",
html = "<p>Your code is 482913</p>"
});
Console.WriteLine(await response.Content.ReadAsStringAsync()); Setupdotnet add package MailKit
using System;
using MailKit.Net.Smtp;
using MailKit.Security;
using MimeKit;
var message = new MimeMessage();
message.From.Add(MailboxAddress.Parse("onboarding@yourapp.com"));
message.To.Add(MailboxAddress.Parse("user@example.com"));
message.Subject = "Your verification code";
message.Body = new TextPart("html") { Text = "<p>Your code is 482913</p>" };
using var smtp = new SmtpClient();
await smtp.ConnectAsync(
Environment.GetEnvironmentVariable("SMTP_HOST"),
int.Parse(Environment.GetEnvironmentVariable("SMTP_PORT")!),
SecureSocketOptions.StartTls);
await smtp.AuthenticateAsync(
Environment.GetEnvironmentVariable("SMTP_USERNAME"),
Environment.GetEnvironmentVariable("SMTP_PASSWORD"));
await smtp.SendAsync(message);
await smtp.DisconnectAsync(true); :inets.start()
:ssl.start()
url = String.to_charlist("https://api.sendmero.com/v1/messages")
token = String.to_charlist("Bearer " <> System.fetch_env!("SENDMERO_API_KEY"))
body = ~s({
"from": "onboarding@yourapp.com",
"to": "user@example.com",
"subject": "Your verification code",
"html": "<p>Your code is 482913</p>"
})
{:ok, {{_, status, _}, _, response}} = :httpc.request(
:post, {url, [{~c"authorization", token}], ~c"application/json", body},
[ssl: [verify: :verify_peer, cacerts: :public_key.cacerts_get()]],
[body_format: :binary]
)
IO.inspect({status, response}) Setupmix.exs: {:gen_smtp, "~> 1.3"} · mix deps.get · Erlang/OTP 25+
{:ok, _} = Application.ensure_all_started(:gen_smtp)
host = System.fetch_env!("SMTP_HOST") |> String.to_charlist()
message = Enum.join([
"From: onboarding@yourapp.com",
"To: user@example.com",
"Subject: Your verification code",
"MIME-Version: 1.0",
"Content-Type: text/html; charset=UTF-8",
"",
"<p>Your code is 482913</p>",
""
], "\r\n")
result = :gen_smtp_client.send_blocking(
{"onboarding@yourapp.com", ["user@example.com"], message},
relay: host,
port: System.fetch_env!("SMTP_PORT") |> String.to_integer(),
username: System.fetch_env!("SMTP_USERNAME"),
password: System.fetch_env!("SMTP_PASSWORD"),
no_mx_lookups: true,
tls: :always,
auth: :always,
tls_options: [
verify: :verify_peer,
cacerts: :public_key.cacerts_get(),
server_name_indication: host,
depth: 10,
customize_hostname_check: [
match_fun: :public_key.pkix_verify_hostname_match_fun(:https)
]
]
)
IO.inspect(result) Set SENDMERO_API_KEY to your API key.
Set SMTP_HOST, SMTP_PORT, SMTP_USERNAME, and SMTP_PASSWORD using your dashboard credentials. These examples use STARTTLS.
From message-level logs to inbox placement — everything you need to run email with total confidence.
See whether you are landing in the inbox, promotions, or spam before your users do — and catch ISP-specific issues before they spread.
Every send is tracked from Queued to Delivered to Opened, with human-readable error codes the moment something bounces or fails.
Integrate deeply with a modern REST API, or drop in SMTP credentials for legacy systems in minutes. Same deliverability, either way.
Built to absorb traffic spikes — flash sales, security alerts, OTP storms — without added latency or dropped sends.
Guided setup for SPF, DKIM, and DMARC, plus IP allowlisting and role-based access so developers and marketers get exactly the access they need.
Get a real-time POST to your server the instant an email is delivered, opened, clicked, bounced, or marked as spam.
Every domain gets guided SPF, DKIM, and DMARC setup, proactive blocklist monitoring, and inbox placement tracking — so you find out about a reputation problem before your users do.
Gmail
Yahoo
Outlook A verified identity and your logo in supported inboxes.
Spot blocklist, domain, and impersonation issues early.
Honor opt-outs and suppress bounces and complaints.
Automatic IP warm-up and delivery closer to your audience.
See which emails reach your audience and how people engage. Track opens and clicks, catch delivery issues, and use past results to improve your next campaign.
See when opens are recorded for your campaigns.
Follow link activity as your audience engages.
Find bounces and failed sends with clear explanations.
Compare past performance and export your reports.
Your audience knows your brand. Help them trust every email from it with a verified sending domain, protected account access, and the right permissions for everyone on your team.
Authenticate your domain with SPF, DKIM, and DMARC.
Allowlist IPs for your API and SMTP connections.
Set roles for templates and developer access.
Monitor sender reputation and spot issues early.
Delivery, opens, clicks, and bounces in real time — filterable by domain, tag, or template.
One account, two integration paths. Use whichever fits the system you're sending from.
Real engineers answer, with sub-4-hour response times during business hours.
SOC 2-track infrastructure with encryption in transit and at rest, and granular role-based access.
The speed and scale behind your welcome emails, order updates, and next big campaign.
~1s
Median transactional delivery
1,000+/sec
Emails processed per second
99%+
Transactional delivery rate
98%+
Marketing delivery rate
Find the right plan for your next campaign and every send after it.
Everything else is in the docs — but here's what people ask first.
Create an account, verify a domain, and send your first email — no sales call required.