SendCraft API
SendCraft is a developer-first email API. Send transactional and marketing emails, track delivery events, manage campaigns, and receive real-time webhooks — all via a simple REST API.
The API is available at:
https://api.sendcraft.online/api
Fast integration
Send your first email in under 5 minutes — no SMTP, no infra setup.
Reliable delivery
Bounce handling, complaint processing, and automatic blacklisting built in.
Real-time events
Webhooks for every delivery event — open, click, bounce, unsubscribe.
Quickstart
Send your first email in 3 steps.
Create a free account
No credit card required. Your API key is generated automatically.
Create accountVerify your email
Check your inbox for a verification link. You'll be able to create API keys once verified.
Send your first email
Use your API key in the x-api-key header:
curl -X POST https://api.sendcraft.online/api/emails/send \
-H "x-api-key: sk_live_your_key_here" \
-H "Content-Type: application/json" \
-d '{
"toEmail": "user@example.com",
"subject": "Hello from SendCraft",
"htmlContent": "<h1>Welcome!</h1><p>Your first email.</p>"
}'On success you receive { success: true, messageId: "msg_..." }
Authentication
All API requests must include your API key in the x-api-key header.
curl https://api.sendcraft.online/api/emails/send \ -H "x-api-key: sk_live_your_key_here" \ -H "Content-Type: application/json"
Getting your API key
- Register at sendcraft.online
- Verify your email address
- Go to Settings → API Keys
- Click Create API key — copy it once, it's shown only once
Never expose your API key in client-side code or public repositories. Use environment variables: SENDCRAFT_API_KEY=sk_live_...
SDKs
No SDK required — the REST API works with any HTTP client. Direct integration examples:
npm install node-fetch # or use built-in fetch (Node 18+)
const res = await fetch("https://api.sendcraft.online/api/emails/send", {
method: "POST",
headers: {
"x-api-key": process.env.SENDCRAFT_API_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({
toEmail: "user@example.com",
subject: "Hello from SendCraft",
htmlContent: "<h1>Welcome!</h1>",
}),
});
const { messageId } = await res.json();
// messageId: "msg_01jxk9f2..."pip install requests
import requests, os
res = requests.post(
"https://api.sendcraft.online/api/emails/send",
headers={
"x-api-key": os.environ["SENDCRAFT_API_KEY"],
"Content-Type": "application/json",
},
json={
"toEmail": "user@example.com",
"subject": "Hello from SendCraft",
"htmlContent": "<h1>Welcome!</h1>",
},
)
data = res.json()
print(data["messageId"]) # msg_01jxk9f2...<?php
$ch = curl_init("https://api.sendcraft.online/api/emails/send");
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"x-api-key: " . getenv("SENDCRAFT_API_KEY"),
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => json_encode([
"toEmail" => "user@example.com",
"subject" => "Hello!",
"htmlContent" => "<h1>Hello!</h1>",
]),
]);
$data = json_decode(curl_exec($ch), true);
echo $data["messageId"];Emails
Send single and bulk transactional emails.
/emails/sendSend a single email. Returns a messageId for tracking.
toEmailstringrequiredRecipient email addresssubjectstringrequiredEmail subject linehtmlContentstringHTML body (one of htmlContent or textContent required)textContentstringPlain-text fallback bodyfromEmailstringSender address (defaults to your verified domain)fromNamestringSender display namereplyTostringReply-to addressscheduledAtISO 8601Schedule delivery at a future time/emails/send-bulkSend up to 100 emails in a single request. Body: { emails: [...] } where each item has the same fields as /emails/send.
Campaigns
Create and send bulk email campaigns to subscriber lists.
/campaignsCreate a new campaign with subject, template, and target list/campaignsList all campaigns with status and analytics/campaigns/:idGet a single campaign with full stats/campaigns/:id/sendTrigger immediate send to the campaign's list/campaigns/:idUpdate draft campaign fields/campaigns/:idDelete a draft campaignWebhooks
Receive real-time POST requests to your endpoint on every email event.
email.sentEmail accepted and queued for deliveryemail.deliveredEmail successfully delivered to the recipient's serveremail.openedRecipient opened the email (requires open tracking)email.clickedRecipient clicked a tracked linkemail.bouncedDelivery failed — hard or soft bounceemail.complainedRecipient marked the email as spamemail.unsubscribedRecipient clicked the unsubscribe linkExample webhook payload:
{
"event": "email.delivered",
"messageId": "msg_01jxk9f2...",
"email": "user@example.com",
"timestamp": "2026-03-12T10:30:00.000Z",
"metadata": {
"subject": "Hello from SendCraft"
}
}Register your endpoint in Settings → Webhooks or via the API (POST /webhooks). We sign each request with HMAC-SHA256 — verify the x-webhook-signature header.
Rate Limits
Rate limits vary by plan. All limits are per API key. When exceeded you receive 429 Too Many Requests with a Retry-After header.
Every response includes rate-limit headers: X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset.
Errors
All errors return JSON with an error field.
400Bad RequestMissing or invalid request parameters401UnauthorizedMissing or invalid API key403ForbiddenValid key but insufficient permissions404Not FoundResource does not exist409ConflictDuplicate resource (e.g. email already sent)429Too Many RequestsRate limit exceeded — check Retry-After header500Internal Server ErrorSomething went wrong on our end{
"success": false,
"error": "Invalid API key"
}All Endpoints
Interactive reference/emails/send/emails/send-bulk/emails/emails/:id/campaigns/campaigns/campaigns/:id/send/analytics/metrics/analytics/events/webhooks/webhooks/webhooks/:id/auth/register/auth/login/user/keys/user/keys/user/keys/:idReady to start sending?
1,000 emails free every month. No credit card required.