The email API built for software companies
Send transactional, marketing, and workflow email with a REST API and typed SDKs. Your team edits templates in Loops, on a free tier.
Send your first email
Verify your sending domain, publish a transactional template, copy its transactionalId, and set LOOPS_API_KEY on your server. Swap in your own recipient and variables before you run an example. The Next.js tab is a server helper for a password-reset flow: pass in the account email, its reset URL, and a stored idempotency key. From the terminal, the Loops CLI sends the same email.
curl -X POST https://app.loops.so/api/v1/transactional \
-H "Authorization: Bearer $LOOPS_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"transactionalId": "YOUR_ID",
"email": "YOUR_EMAIL",
"dataVariables": { "firstName": "Alex" }
}'import { LoopsClient } from "loops";
const apiKey = process.env.LOOPS_API_KEY;
if (!apiKey) throw new Error("Missing LOOPS_API_KEY");
const loops = new LoopsClient(apiKey);
await loops.sendTransactionalEmail({
transactionalId: "YOUR_ID",
email: "YOUR_EMAIL",
dataVariables: { firstName: "Alex" },
});import json
import os
from urllib.request import Request, urlopen
request = Request(
"https://app.loops.so/api/v1/transactional",
data=json.dumps({
"transactionalId": "YOUR_ID",
"email": "YOUR_EMAIL",
"dataVariables": {"firstName": "Alex"},
}).encode(),
headers={
"Authorization": f"Bearer {os.environ['LOOPS_API_KEY']}",
"Content-Type": "application/json",
},
method="POST",
)
with urlopen(request, timeout=30) as response:
print(json.load(response))import { LoopsClient } from "loops";
const apiKey = process.env.LOOPS_API_KEY;
if (!apiKey) throw new Error("Missing LOOPS_API_KEY");
const loops = new LoopsClient(apiKey);
export async function sendPasswordReset(
email: string,
resetUrl: string,
sendKey: string,
) {
const transactionalId = process.env.LOOPS_TRANSACTIONAL_ID_PASSWORD_RESET;
if (!transactionalId) throw new Error("Missing password-reset template ID");
return loops.sendTransactionalEmail({
transactionalId,
email,
dataVariables: { resetUrl },
headers: { "Idempotency-Key": sendKey },
});
}Sending, templates, and contact data
Transactional + marketing in one API
Send transactional email and marketing email from the same platform.
Webhooks
Delivery, open, click, bounce, and unsubscribe events.
Audiences & contacts
One contact API with custom properties and lists, plus integrations for Stripe, Clerk, and Supabase.
Start with the messages you send today and the operations your team will own. Compare providers using the criteria below, then test the send paths you need.
Look for a REST API, typed SDKs, clear docs, local setup, and server-side API-key handling that fits your stack.
Check which authentication, sending-domain setup, bounce handling, spam complaint suppression, and inbox-placement tasks the provider handles and which your team must manage.
Product and marketing teams edit reusable templates. Developers pass variables, fallbacks, and transactional IDs from code.
The API should share contacts, events, and properties across transactional sends, campaigns, and lifecycle workflows instead of keeping a separate copy of each customer.
See send status, bounces, complaints, and failures, so you can debug email like the rest of your product.
Compare the free tier, contact limits, monthly send volume, transactional-email costs, and how pricing changes as your SaaS product scales.
Loops combines transactional sending, campaigns, and lifecycle workflows. Developers connect events and contact data while the team edits templates in Loops.
Password resets and receipts need timely delivery and correct account data. Campaigns need audience selection and unsubscribe handling. Onboarding and trial sequences also need product events and exit conditions. A behavior trigger alone does not make an email transactional. Promotional lifecycle messages still need marketing consent and unsubscribe handling.
Test one send path before migrating
Publish a test template, send it to a test account, and inspect the rendered variables and delivery event. Try missing variables, invalid credentials, rate limits, and retries. Check that marketing subscription changes reach your app and that account-critical mail follows its own rules.
A transactional-only API can be enough if you only send system messages and have no marketing or lifecycle plans. A newsletter tool can be enough if your product does not need server-triggered transactional messages or event-driven journeys. An enterprise suite can be a better fit for procurement requirements, multi-brand governance, or custom reporting. With self-managed SMTP, your team owns reputation, monitoring, bounces, complaints, templates, and compliance.
Frequently asked questions
What is an email API?
An email API lets your server send and manage email through HTTP requests. You authenticate with an API key and send structured data. The provider operates delivery infrastructure, while your team configures its domain and controls recipients and message content.
Is there a free email API?
The free tier includes unlimited contacts and up to 4,000 combined marketing and transactional sends to your first 1,000 contacts in any rolling 30-day window. It does not expire.
What’s the difference between a transactional and a marketing email API?
Transactional emails are triggered by a user action and sent one to one (password resets, receipts). Marketing emails go to audiences and need unsubscribe handling. Loops sends both from one API and one contact record.
Which languages and SDKs does Loops support?
Official SDKs for JavaScript/TypeScript, Go, Nuxt, PHP, and Ruby. Any language can call the REST API over HTTPS.
How do I send my first email?
Verify your sending domain, publish a transactional template, copy its transactionalId, and set LOOPS_API_KEY on your server. POST to https://app.loops.so/api/v1/transactional with the recipient and the template’s required dataVariables.
Can I use the Loops API from the browser?
Keep Loops API calls on your server so the API key stays private. Browser calls are not supported. Your own server endpoint still needs appropriate access controls and input validation.
How does Loops handle deliverability?
Loops provides sending-domain records, runs managed sending infrastructure, and suppresses hard bounces and reported complaints. Your team configures DNS and controls consent, audience selection, and content. A receiving mailbox decides whether an accepted message reaches the inbox.
What are the Loops API rate limits?
10 requests per second per team. Requests over the limit return HTTP 429, so retry with exponential backoff. Contact Loops support for a higher threshold.