Email API
The email API built for software companies
Send transactional and marketing email through a REST API and typed SDKs. Use workflows for lifecycle email and let your team edit templates in Loops. Start on a free tier that does not expire.
See how Loops handles transactional email and marketing email.
Send your first email
Verify your sending domain, publish a transactional template, copy its transactionalId, and set LOOPS_API_KEY on your server. Replace the sample recipient and variables before running an example. The Next.js example is a server helper for an existing password-reset flow: the caller must supply the account email, its generated reset URL, and a persisted send key.
cURL
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" }
}'Node SDK
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" },
});Python (HTTP API)
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))Next.js (server helper)
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 },
});
}One platform
Sending, templates, and contact data
Transactional + marketing in one API
Send account messages and campaigns from the same platform.
Lifecycle workflows
Send a product event to start a workflow with emails, timers, and branches.
Editable templates
A visual editor so non-engineers can edit copy.
Webhooks
Delivery, open, click, bounce, and unsubscribe events.
Sending infrastructure
Sending-domain records, managed delivery, and bounce handling.
Audiences & contacts
One contact API with custom properties and lists.
Free tier
A free tier that doesn’t expire
The free tier includes up to 1,000 subscribed contacts and 4,000 combined marketing and transactional sends in any rolling 30-day window. It does not expire.
Buyer guide
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 simple REST endpoint, typed SDKs, clear docs, local setup paths, and server-side API-key handling that works in your existing 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 should be able to edit reusable templates while 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 fragmenting customer state.
You need visibility into send status, bounces, complaints, and failures so transactional email is debuggable 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. Exercise 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?
Is there a free email API?
What’s the difference between a transactional and a marketing email API?
Which languages and SDKs does Loops support?
How do I send my first email?
Can I use the Loops API from the browser?
How does Loops handle deliverability?
What are the Loops API rate limits?