Easy integration, reliable delivery, great documentation: integrate with the email API that developers love and start sending in minutes.
Integrating email into your product doesn't have to be a pain. With our powerful RESTful email API and official libraries in pretty much every programming language, integrating email is fast and easy — whether you're sending transactional or bulk email.
Simpler applications can also use our reliable SMTP service.
202 Accepted with a
message_id for tracking
One POST request is all it takes. Pick your language and copy-paste a working example straight into your codebase.
message_id
The WebMail API is designed for developers who need reliability, speed, and full observability.
Sub-second queueing with direct MX handoff. Your messages reach the inbox before your user closes the tab.
Send up to 500 messages in a single request. Ideal for bulk notifications, digests, and high-volume transactional flows.
Real-time push events for every delivery, open, click, bounce, and complaint — straight to your endpoint.
Store and render templates server-side. Pass variables at send time; WebMail handles merge, rendering, and delivery.
Every webhook payload is signed with HMAC-SHA256. Verify signatures on your server to reject forged requests.
Each request includes an X-WebMail-Signature
header containing a hex-encoded HMAC-SHA256 digest of the raw request body,
keyed with your webhook secret.
| Plan | Monthly quota | Rate limit |
|---|---|---|
| Free | 1,000 emails | 10 req/s |
| Pro | 100,000 emails | 100 req/s |
| Enterprise | Unlimited | Custom |
| Status | Code | Meaning |
|---|---|---|
| 202 | queued | Message accepted and queued for delivery |
| 400 | invalid_params | Missing or malformed request fields |
| 401 | invalid_api_key | API key missing, invalid, or revoked |
| 429 | rate_limit_exceeded | Too many requests — retry with backoff |
| 500 | server_error | Transient server error — safe to retry |
import hmac, hashlib
def verify_webhook(payload: bytes, signature: str, secret: str) -> bool:
expected = hmac.new(
secret.encode(),
payload,
hashlib.sha256,
).hexdigest()
return hmac.compare_digest(expected, signature)
# In your webhook handler (e.g. Django view):
def webhook_handler(request):
sig = request.headers.get("X-WebMail-Signature", "")
if not verify_webhook(request.body, sig, WEBHOOK_SECRET):
return HttpResponse(status=403)
event = json.loads(request.body)
event_type = event["event"] # "delivered" | "opened" | "bounced"
...
Use hmac.compare_digest to prevent timing attacks.
Retry logic uses exponential back-off over 10 attempts.
"It was incredibly easy to set up WebMail. In under 10 minutes I had the first test working and rolling it out to production was just as easy."
Jane Doe
CTO, Acme Corp
Free up to 1,000 emails / month. No credit card required.