The foundation the world's apps are built on.
Email, SMS, inboxes, scheduling and more, behind one SDK and one API key.
const { , } = await ..({
: "Acme <billing@acme.com>",
: "ada@example.com",
: "Your October invoice",
: "<p>Your invoice is attached.</p>",
: "billing",
});Response, abridged
{
"object": "email",
"id": "email_01k7c8m4q2f3e9v6t5r1n0p8yz",
"status": "queued"
}Your October invoice
to ada@example.com
- queued
- email.sent
- email.delivered
- email.opened
const { : , } = await ..(
{
: "+14155550123",
: "+14155550199",
: "Your Acme order #1042 has shipped.",
},
{ : "order-1042-shipped" },
);Response, abridged
{
"object": "sms",
"id": "sms_01k7c8m4q2f3e9v6t5r1n0p8yz",
"status": "queued"
}to +1 415 555 0199
Your Acme order #1042 has shipped.
- queued
- sms.sent
- sms.delivered
const = await ...({
: ,
: "2026-03-10T14:00:00Z",
: {
: "customer_77",
: "Sam Lee",
: "sam@example.com",
: "America/New_York",
},
});
if (.?. === "slot_unavailable") {
// Someone got there first: show the times again.
}Trial lesson with Ana Reyes
30 minutes, 10 minute buffer
| Time | Mon 9 | Tue 10 | Wed 11 | Thu 12 | Fri 13 |
|---|---|---|---|---|---|
| 09:00 | busy | open | booked | open | open |
| 10:00 | open | Sam | open | busy | open |
| 11:00 | open | open | busy | open | open |
| 13:00 | booked | open | open | booked | open |
| 14:00 | open | busy | open | booked | open |
| 15:00 | open | busy | open | open | busy |
- confirmedCalendar invitations to Sam and Ana
- scheduling.booking.confirmed
const { : } = await ..({
: "signup",
: { : . },
: .,
: .,
: { : . },
});
if (?. === "block") {
throw new ("We couldn't create your account.");
}email.disposable0.70device.automation0.70ip.hosting_provider0.25
// The user typed their number: send them a code.
const { } = await ..({
: "+14155550123", // or an email address
: ,
: "user_42",
});
// They typed the code they got: check it.
const { : } = await ..({
: "+14155550123",
: ,
});Enter your code
Sent to +1 415 555 0123
- 4
- 8
- 2
- 9
- 1
- 3
- verification.started
- verification.sent
- verification.approved
const { : } = await ...({
: "Services agreement",
: [{ : "agreement.pdf", : }],
: [
{
: "Ada Lovelace",
: "ada@example.com",
: "embedded",
: [
{ : "signature", : "{{signature:signer_1}}" },
],
},
],
});Services agreement
- sign_request.sent
- sign_request.viewed
- sign_request.signer_signed
- sign_request.completed
const { : } = await ..({
: "support-agent",
: "agent-42",
});
await ...(
,
,
{ : "Sorry about that, Jane! A new one is on its way." },
{ : `reply-${}` },
);support-agent@k3j9x2m7qp4l.inbound.coss.com
Hi, the order arrived damaged. Can you send a new one?
Sorry about that, Jane! A new one is on its way.
- inbox.message.received
- email.sent
- email.delivered
coss.com is used by
- Code
- fusial
- Ledington
One key, every product
The next one you add needs no new setup. See every product.
- Email
coss.emailTransactional email from your own domains, tracked to every recipient. - SMS
coss.smsText messages worldwide, on the same key, events and logs as email. - Scheduling
coss.schedulingAvailability and bookings, from the team behind Cal.com. - Risk
coss.riskAllow, review or block sign-ups, logins and payments, with the reasons why.
Take a look at what teams build with coss.com.
One vendor, not four
Every channel you add usually means another vendor to approve, pay and search. See how coss.com compares.
- Security review
- DPA signed
- Procurement approved
One vendor onboarding
coss.com
One subprocessor
- 120,000 recipients
- SMS
- 8,400 segments
- Scheduling
- 1,200 bookings
One bill
john@example.com
- email.delivered
- sms.delivered
- scheduling.booking.confirmed
One diagnostic surface
Set up in one prompt
Plain-text docs, typed results, and keys that can't send by accident.
- Copy one promptOne line for Claude Code, Cursor or Codex.
- Your agent reads the manualEvery docs page is Markdown at its URL plus .md.
- It tests with a sandbox keycoss_test_ keys record every event and deliver nothing.
Claude Code~/acme
Add coss.com to this project: read https://coss.com/llms.txt, get a development key with `npx coss-cli init --agents`, and build and test with it.
- Fetch(https://coss.com/llms.txt)
- Bash(npx coss-cli init --agents)
- ✔ Saved a development key to .env.local as COSS_API_KEY.
- Fetch(https://coss.com/docs/email/sending.md)
- Write(src/lib/coss.ts)
- Write(src/app/api/webhooks/coss/route.ts)
- Bash(npx tsx scripts/send-test.ts)
- email_01k7c8m4q2f3e9v6t5r1n0p8yz queued
- Email and signed delivery webhooks are in. The test send was recorded with your sandbox key; nothing was delivered.
Worked for 2m 14s
⏵⏵ accept edits on (shift+tab to cycle)
Know what happened to every message
Every message keeps its events. Look one up, ask your agent, or show it in your own app.
- email.sent
- email.delivered
- email.opened
Did john@example.com get the onboarding email?
diagnose_email(john@example.com)
Yes, delivered at 09:41 and opened two minutes later.
const { data } = await diagnose(coss, id);data.summary"Delivered to john@example.com."
Questions
Send your first email before your coffee cools.
Start free with 3,000 emails a month. Sandbox keys are never billed.