Transactional email API for developers and AI agents
Email that lands. Built for developers and their AI agents.
Send transactional and product email over the API or from your AI agent (SMTP coming soon). Couryo sets up your DNS, watches your sender reputation around the clock, and tells you in plain words what to fix.
3,000 emails per month, no credit card
- No per-seat fees
- MCP for Claude and Cursor
- llms.txt and Markdown docs
- Pay in USD or BRL
Timelinemsg_9w2k7c1x0d
to maria@gmail.comAccepted14:02:07.118
Queued. Only then does the API answer 202.
Sent14:02:07.402
Signed with shop.com's own DKIM key.
Delivered14:02:08.931
gmail-smtp-in.l.google.com answered
250 2.0.0 OK
In plain words: Gmail's server received and accepted Maria's email.
- free emails per month, forever
- 3,000
- free emails per month, forever
- emails per batch request
- 100
- emails per batch request
- of protection against duplicate sends
- 24 h
- of protection against duplicate sends
- maximum time for a human review of a pause
- 1 business day
- maximum time for a human review of a pause
- per seat, on every plan
- $0
- per seat, on every plan
Built by people who run email for products in production. Wunka's own products (ViralRecast, Start Atende, Mentezinha and Linkezera) are the first to move to Couryo.
Quickstart
From zero to your first email in 5 minutes.
Three steps, one API call. Copy the example in your language.
- 1
Connect your domain
Connect Cloudflare and Couryo creates the records for you. Using another DNS provider? Every record is ready to copy and checked live.
- 2
Create a key
Scoped keys (send only, read only or admin), allowed IP lists and a test key that never delivers for real.
- 3
Send
One call to POST /v1/emails. A 202 only comes back once the email is in the queue. No fake success.
const res = await fetch("https://api.couryo.com/v1/emails", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.COURYO_API_KEY}`,
"Content-Type": "application/json",
"Idempotency-Key": "order-1042-confirmation",
},
body: JSON.stringify({
from: "Acme Store <orders@example.com>",
to: ["maria@example.com"],
subject: "Your order 1042 is confirmed",
html: "<p>Thanks for your purchase, Maria!</p>",
tags: { type: "order" },
}),
});
const email = await res.json(); // { id: "msg_...", status: "queued" }$ch = curl_init('https://api.couryo.com/v1/emails');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('COURYO_API_KEY'),
'Content-Type: application/json',
'Idempotency-Key: order-1042-confirmation',
],
CURLOPT_POSTFIELDS => json_encode([
'from' => 'Acme Store <orders@example.com>',
'to' => ['maria@example.com'],
'subject' => 'Your order 1042 is confirmed',
'html' => '<p>Thanks for your purchase, Maria!</p>',
]),
]);
$email = json_decode(curl_exec($ch), true); // ['id' => 'msg_...', 'status' => 'queued']import os
import requests
res = requests.post(
"https://api.couryo.com/v1/emails",
headers={
"Authorization": f"Bearer {os.environ['COURYO_API_KEY']}",
"Idempotency-Key": "order-1042-confirmation",
},
json={
"from": "Acme Store <orders@example.com>",
"to": ["maria@example.com"],
"subject": "Your order 1042 is confirmed",
"html": "<p>Thanks for your purchase, Maria!</p>",
},
)
email = res.json() # {"id": "msg_...", "status": "queued"}curl https://api.couryo.com/v1/emails \
-H "Authorization: Bearer $COURYO_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: order-1042-confirmation" \
-d '{
"from": "Acme Store <orders@example.com>",
"to": ["maria@example.com"],
"subject": "Your order 1042 is confirmed",
"html": "<p>Thanks for your purchase, Maria!</p>"
}'
# 202 Accepted
# {"id": "msg_...", "status": "queued"}# Any app or framework that sends over SMTP (Laravel .env example)
MAIL_MAILER=smtp
MAIL_HOST=smtp.couryo.com
MAIL_PORT=587 # STARTTLS. Also: 465 (TLS) and 2525
MAIL_USERNAME=couryo
MAIL_PASSWORD=ck_live_... # your API key
MAIL_FROM_ADDRESS=orders@example.comDeliverability agent (coming soon)
A deliverability expert watching your email around the clock.
The agent brings together DMARC reports, blocklists, Google Postmaster Tools, Microsoft SNDS, bounces and complaints. When something changes, it explains in plain words what happened, why, and what to do.
- A weekly "Email health" digest
- A warning before you cross Gmail, Yahoo and Microsoft thresholds
- Every bounce with the receiving server's raw response, translated
- At launch it reads and warns. It only acts with your permission
Deliverability agent
Reading the signalsAlert ready
- DMARC reports
- Blocklists
- Google Postmaster
- Microsoft SNDS
- Bounces
- Complaints
Hotmail and OutlookWarning
Since yesterday at 2 pm, part of your email to Hotmail is being deferred with code 421 4.7.0.
Likely cause: a spike in bounces from the "win-back-october" campaign, sent to an old list.
What to do: pause that campaign and remove the addresses that bounced. Transactional email (passwords and billing) is unaffected.
Never in the dark
No pause without notice, without a reason, or without someone to listen.
The top complaint about email services is an account suspended out of nowhere. Here the rules are public, your limits show in the dashboard and in the API, and every decision comes with numbers.
Trust levels, in plain sight
ExampleLevel 0
Sandbox
How you get there
Account created
Limit
25 per day, only to the account's own addresses
Level 1
New
How you get there
Domain verified (DKIM, return path and DMARC)
Limit
100 per day, 3,000 per month
Level 2
Verified
How you get there
7 clean days and a verified company ID or card
Limit
1,000 to 10,000 per day
Level 3
Trusted
How you get there
30 clean days on a paid plan
Limit
Your plan's volume
You move up on your own, and the dashboard shows what is missing. For example: "4 more clean days to reach level 2". On the Free plan, the cap is 100 per day at any level.
If something looks wrong, the pause is gradual
- 1Marketing email is paused.
- 2Critical transactional email (password, login and billing) keeps going, with up to 30 per day.
- 3You get the reason, the numbers and what to fix, by email and in the dashboard.
A full stop only happens on clear fraud, such as phishing or a purchased list.
- Reason
- bounce rate above 3% over the last 24 hours
- Numbers
- sent, bounced and rate, with the time of each measurement
- How to fix
- remove the addresses that bounced and confirm where the list came from
- Transactional
- still active, with a lower limit
Disagree? Request a review
Right away
An AI agent reviews the request against your account data and decides clear cases immediately.
Within 1 business day
If there is still doubt, a person on the team reviews it and replies with the reason.
Automatic DNS
DKIM, return path and DMARC without opening a tutorial.
Connect Cloudflare and Couryo creates the records. Anywhere else, every record is ready to copy, with live status and an explanation of what is missing. Your domain's SPF stays as it is. Coming soon, the agent follows your reports and takes DMARC to the strongest policy when it is safe.
The agent will walk your DMARC up (coming soon)
p=noneobserve and collect reports
p=quarantinespoofed email goes to spam
p=rejectspoofed email is refused
- DKIMCNAMEWaiting for DNSCheckingVerified
couryo1._domainkey → couryo1.7h2kq9w4x1abcdef.dkim.couryo.com
Signs every email with a key of your own domain.
- DKIMCNAMEWaiting for DNSCheckingVerified
couryo2._domainkey → couryo2.7h2kq9w4x1abcdef.dkim.couryo.com
Second selector: keys rotate without you touching DNS.
- Return pathCNAMEWaiting for DNSCheckingVerified
bounces → rp.couryo.com
Aligns SPF without touching your domain's SPF, and brings bounces back.
- DMARCTXTWaiting for DNSCheckingVerified
_dmarc → v=DMARC1; p=none; rua=mailto:dmarc@couryo.com; adkim=r; aspf=r
_dmarc → v=DMARC1; p=quarantine; rua=mailto:dmarc@couryo.com; adkim=r; aspf=r
_dmarc → v=DMARC1; p=reject; rua=mailto:dmarc@couryo.com; adkim=r; aspf=r
Tells mailbox providers what to do with spoofed email.
Built for AI
Your coding agent already knows how to use Couryo.
Markdown docs, llms.txt in English and Portuguese, pricing readable by agents, and a remote MCP server for Claude, Cursor, Claude Code and the OpenAI API, with your API key. OAuth for the Claude and ChatGPT connectors is coming soon.
Remote MCP
Send, read the timeline, check a domain's DNS and understand a bounce, by chatting.
/en/docs/mcpllms.txt and llms-full.txt
The whole guide in one file, in English and Portuguese.
/en/llms.txtEvery page as .md
Add .md to any docs URL and get clean Markdown.
/en/docs/quickstart.mdPricing for agents
Plans, overage and commitments in plain Markdown.
/pricing.md
Why did the email to maria@company.com bounce?
couryo · why_bounced("msg_9w2k7c1x0d")
It bounced because that mailbox no longer exists: the company's server answered 550 5.1.1 (unknown user). The address is already on your suppression list, so we will not try again. If Maria has a new address, update her record.
For developers
Everything you expect from an email API. Plus what was missing.
Built like the best APIs: predictable, idempotent and honest about what happened to every message.
Real idempotency
The same Idempotency-Key returns the same response for 24 hours. A different body returns 409.
Test mode
ck_test_ keys never deliver: the email is kept in the dashboard for your team to review.
Signed webhooks
Standard Webhooks, retries for up to 3 days and delivery history. Missed one? List them at /v1/events.
Timeline with the raw response
Every event with time, receiving server, SMTP code and the original response, translated.
Batch and scheduling
Up to 100 emails per request with per-item results, and scheduled_at to send later.
Per-stream suppression
A marketing unsubscribe never blocks a password email. Hard bounces and complaints apply everywhere.
Errors that explain
Stable code, the offending field, a link to the docs and a message in English or Portuguese.
SMTP toocoming soon
smtp.couryo.com on ports 587, 465 and 2525, for when you do not want to touch code.
Scoped keys
Send only, read only or admin, with allowed IP lists.
Pre-send checks
Domain, shortened links, oversized HTML and bill attachments, scored 0 to 100, in CI.
Built in Brazil
Ready for the world, at home in Brazil.
If your company is in Brazil, Couryo bills in reais with a local invoice. Everywhere else, in US dollars.
USD or BRL
International card in dollars, or card and boleto in reais for Brazilian companies.
Local invoice in Brazil
A service invoice (NFS-e) is issued on every payment for Brazilian customers.
Privacy by design
A data protection officer, a data processing agreement and subprocessors listed by category.
Support that answers
AI answers first, with your account data. When it cannot solve it, a person takes over.
Delivery by mailbox provider
Gmail, Microsoft and Yahoo, plus Brazilian providers such as UOL, BOL and Terra, tracked separately.
Two languages from day one
Dashboard, docs, errors and alerts in English and Portuguese.
Pricing
Simple, volume-based pricing.
No per-seat fees. Prices locked for 12 months after any change.
Free
For testing and small projects. Forever.
$0/mo
3,000 emails per month
- 3,000 emails per month (up to 100 per day)
- 1 domain
- 7 days of logs
- REST API and webhooks (SMTP coming soon)
Pro
For products in production.
$19/mo
50,000 emails per month
Overage: $0.35 per 1,000
- 50,000 emails per month included
- Up to 10 domains
- 30 days of logs
- Unlimited users, no per-seat fees
Scale
For high volume and larger teams.
$59/mo
200,000 emails per month
Overage: $0.28 per 1,000
- 200,000 emails per month included
- Everything in Pro
- Up to 50 domains
- 90 days of logs
Enterprise
For teams that need a contract and guarantees.
Custom
- Custom volume
- Unlimited domains
- Dedicated IP
- SSO
Frequently asked questions
Still have a question? Write to contato@couryo.com.
Is the free plan really forever?
Yes. 3,000 emails per month (up to 100 per day) and 1 domain, written into the terms of use. It is not a trial and needs no card.
How much does it cost?
Free: 3,000 emails per month (up to 100 per day) and 1 domain, no card. Pro: US$ 19 per month with 50,000 emails and US$ 0.35 per extra 1,000. Scale: US$ 59 per month with 200,000 emails and US$ 0.28 per extra 1,000. Enterprise: custom. Companies in Brazil pay in reais: Pro R$ 99 (R$ 1,80 per extra 1,000) and Scale R$ 299 (R$ 1,40 per extra 1,000). No per-seat fees on any plan.
Can my account be suspended without warning?
No. Pauses are gradual and come with the reason, the numbers and what to fix. You can request a review: an AI agent decides clear cases right away and a person reviews within 1 business day. An immediate stop only happens on clear fraud, such as phishing.
What happens if I go over my quota?
On Free, sending stops at the monthly limit and resumes next month, with no charge. On paid plans, overage is billed per 1,000 emails ($0.35 on Pro and $0.28 on Scale). If you set a spending limit, sending stops when overage reaches it, and nothing is charged above the cap.
Do I need to know DNS?
No. With Cloudflare, Couryo creates the records itself. Anywhere else, you copy and paste each record and see its live status, with an explanation of what is missing.
Does it work with my AI agent?
Yes. The docs are available as Markdown, there is an llms.txt in English and Portuguese, and the remote MCP server (mcp.couryo.com) already works in Claude Code, Claude Desktop, Cursor and through the OpenAI API, with your API key. OAuth, for the Claude and ChatGPT connectors, is coming soon.
Can I test without sending real email?
Yes. With a ck_test_ key nothing is delivered: the email is captured in the dashboard, with a link your team can review.
Where is my data stored?
Couryo's infrastructure is currently in the United States. The privacy policy lists our subprocessors by category, the log retention of each plan, and how to reach our data protection officer.
What about marketing email?
Supported, in a stream separate from transactional email, with the one-click unsubscribe that Gmail and Yahoo require. Password emails never share reputation with campaigns.
Send your first email today.
Start on the Free plan. When you need more, pricing stays simple.
3,000 emails per month, no credit card. Cancel anytime.