Sendook (Arabic for "box" - صندوق) is the easiest way to start sending AND receiving emails at scale.
- Setting up email sending at scale is still cumbersome—we had to do it at Rupt
- The ability to configure and check custom domains is still harder than it should be
- We use this extensively at Rupt to have our internal agents handle inbound emails, payments, prioritizations, etc.
- Using the API Endpoints
- Using the TypeScript SDK
- Self-hosting & Running Locally
- Repository Structure
- Features
- SDKs
- License
Create an inbox:
curl -X POST https://api.sendook.com/v1/inboxes \
-H "Authorization: Bearer your_api_key" \
-H "Content-Type: application/json" \
-d '{
"name": "rupt",
"email": "rupt@sendook.com"
}'
Send a message:
curl -X POST https://api.sendook.com/v1/inboxes/{inbox_id}/messages/send \
-H "Authorization: Bearer your_api_key" \
-H "Content-Type: application/json" \
-d '{
"to": ["rupt@sendook.com"],
"subject": "Welcome!",
"text": "Thanks for signing up.",
"html": "<p>Thanks for signing up.</p>"
}'
Create a webhook for receiving emails:
curl -X POST https://api.sendook.com/v1/webhooks \
-H "Authorization: Bearer your_api_key" \
-H "Content-Type: application/json" \
-d '{
"url": "https://your-app.com/webhooks/email",
"events": ["message.received"]
}'
import { Sendook } from "@sendook/node";
// Initialize client with API key
const client = new Sendook("your_api_key");
// Create an inbox
const inbox = await client.inboxes.create({
name: "rupt",
email: "rupt@sendook.com", // or use your custom domain
});
// Send an email
await client.messages.send({
inboxId: inbox.id,
from: "rupt@sendook.com",
to: ["rupt@sendook.com"],
subject: "Welcome!",
text: "Thanks for signing up.",
html: "<p>Thanks for signing up.</p>",
});
// Receive emails via webhook
await client.webhook.create({
url: "https://your-app.com/webhooks/email",
events: ["message.received"],
});Steps:
- Get client keys
- Create inbox
- If using
xxxxx@sendook.com, no verification needed - If using a custom domain, DNS verifications required:
- MX records (SES)
- CNAME records (DKIM)
- [Optional] SPF, DMARC
- If using
- Start sending & receiving emails
# Using Docker
docker build -t sendook-api ./api
docker run -p 8006:8006 \
-e MONGO_URI="your_mongodb_uri" \
# optional Rupt secret key for fake accounts & account takeover
-e RUPT_SECRET_KEY="your_secret_key" \
-e DEFAULT_EMAIL_DOMAIN="sendook.com" \
-e AWS_ACCESS_KEY_ID="your_aws_key" \
-e AWS_SECRET_ACCESS_KEY="your_aws_secret" \
sendook-apiEnvironment variables:
MONGO_URIRUPT_SECRET_KEY(optional for fake accounts & account takeover)DEFAULT_EMAIL_DOMAINAWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY
Development:
cd api
bun install
bun devProduction:
bun install
bun startcd app
bun install
bun dev # Development
bun build && bun start # ProductionEnvironment variable:
API_URL(default:http://localhost:8006)
cd landing
bun install
bun dev # Development
bun run build && bun start # ProductionNo environment variables required.
This monorepo contains:
api/- Backend API server (Node.js + MongoDB)app/- Dashboard applicationlanding/- Landing website (Nuxt 3 + Nuxt UI)node-sdk/- Official Node.js SDK
- Create inbox
- sendook.com domain
- Custom domain
- List inboxes
- Retrieve inbox
- Delete inbox
- Deletes inbox and all messages
- Send message
- To[], From, CC
- Labels
- Attachments
- BCC
- Threads
- Replies
- Rate-limit respecting (~1000/min & 50K/day)
- To[], From, CC
- Retrieve messages
- Attachments
- Search (find messages within inbox)
- Query
- Regex
- To, From, CC, subject, body
- Semantic search Vector DB (Chroma)
- Regex
- Query
- Create webhook
- Execution
- Receive
- Parsed emails
- delivered, bounced, rejected, sent
- Receive
- Messages auto-create or use a thread
- Retrieve threads
- Create domain
- List domains
- Retrieve domain
- Delete domain
- Verify domain
- Get domain DNS records
- Full API coverage
- Node
- Python
- Contributions welcome for additional SDKs
Sendook is open source software licensed under the MIT license.
Built with ❤️, maintained by the Rupt team.