Introduction

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:

Base URL
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.

1

Create a free account

No credit card required. Your API key is generated automatically.

Create account
2

Verify your email

Check your inbox for a verification link. You'll be able to create API keys once verified.

3

Send your first email

Use your API key in the x-api-key header:

bash
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.

bash
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

  1. Register at sendcraft.online
  2. Verify your email address
  3. Go to Settings → API Keys
  4. 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:

Node.js / TypeScript
install
npm install node-fetch  # or use built-in fetch (Node 18+)
javascript
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..."
Python
install
pip install requests
python
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
php
<?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.

POST/emails/send

Send a single email. Returns a messageId for tracking.

Request body
toEmailstringrequiredRecipient email address
subjectstringrequiredEmail subject line
htmlContentstringHTML body (one of htmlContent or textContent required)
textContentstringPlain-text fallback body
fromEmailstringSender address (defaults to your verified domain)
fromNamestringSender display name
replyTostringReply-to address
scheduledAtISO 8601Schedule delivery at a future time
POST/emails/send-bulk

Send 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.

POST/campaignsCreate a new campaign with subject, template, and target list
GET/campaignsList all campaigns with status and analytics
GET/campaigns/:idGet a single campaign with full stats
POST/campaigns/:id/sendTrigger immediate send to the campaign's list
PATCH/campaigns/:idUpdate draft campaign fields
DELETE/campaigns/:idDelete a draft campaign

Webhooks

Receive real-time POST requests to your endpoint on every email event.

Events
email.sentEmail accepted and queued for delivery
email.deliveredEmail successfully delivered to the recipient's server
email.openedRecipient opened the email (requires open tracking)
email.clickedRecipient clicked a tracked link
email.bouncedDelivery failed — hard or soft bounce
email.complainedRecipient marked the email as spam
email.unsubscribedRecipient clicked the unsubscribe link

Example webhook payload:

json
{
  "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.

ScopeFreeStarterPro+
General API100 / 15 min500 / 15 min2000 / 15 min
Send email50 / hour500 / hour5000 / hour
Bulk send2 / hour20 / hour100 / hour
Auth5 / 15 min5 / 15 min5 / 15 min

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 parameters
401UnauthorizedMissing or invalid API key
403ForbiddenValid key but insufficient permissions
404Not FoundResource does not exist
409ConflictDuplicate resource (e.g. email already sent)
429Too Many RequestsRate limit exceeded — check Retry-After header
500Internal Server ErrorSomething went wrong on our end
json
{
  "success": false,
  "error": "Invalid API key"
}
POST/emails/send
POST/emails/send-bulk
GET/emails
GET/emails/:id
POST/campaigns
GET/campaigns
POST/campaigns/:id/send
GET/analytics/metrics
GET/analytics/events
POST/webhooks
GET/webhooks
DELETE/webhooks/:id
POST/auth/register
POST/auth/login
GET/user/keys
POST/user/keys
DELETE/user/keys/:id

Ready to start sending?

1,000 emails free every month. No credit card required.