Developer platform
Send email that gets there.
The Sendbound API lets you send transactional email, grow your audience, and understand every interaction.
https://api.sendbound.comAuthentication
Sendbound uses two types of API keys: a Public key (pk_...) for client-side event tracking, and a Secret key (sk_...) for all other API operations.
Authorization: Bearer sk_your_secret_keyNever expose secret keys in browser code.
Sending Email
Send transactional email
POST/v1/send
| Parameter | Type | Description |
|---|---|---|
| to | string | string[] | Recipient address(es). |
| subject | string | Message subject. |
| body | string | HTML body. |
| from? | string | Verified sender. |
| reply? | string | Reply-to address. |
| name? | string | Sender name. |
| headers? | object | Message headers. |
| delaySeconds? | number | Delivery delay. |
curl -X POST https://api.sendbound.com/v1/send \
-H "Authorization: Bearer sk_your_secret_key" \
-H "Content-Type: application/json" \
-d '{"to":"user@example.com","subject":"Welcome to Acme!","body":"<h1>Hello!</h1><p>Thanks for signing up.</p>","from":"noreply@yourdomain.com","name":"Acme Inc"}'{"success":true,"emails":[{"contact":{"id":"...","email":"user@example.com"},"email":{"id":"...","emailId":"..."}}]}Track events
POST/v1/track
Uses a public key, not a secret key.
| Parameter | Type | Description |
|---|---|---|
| event | string | Event name. |
| string | Contact email. | |
| data? | object | Custom properties. |
{"event":"purchase_completed","email":"user@example.com","data":{"amount":99.99}}Contacts
List contacts
GET/contacts
| Parameter | Type | Description |
|---|---|---|
| limit | number | Default 100; maximum 250. |
| next | string | Cursor for pagination. |
| subscribed | boolean | Filter by subscription status. |
| search | string | Search contacts. |
{"contacts":[...],"count":N,"next":"cursor_token"}Get contact
GET/contacts/:id
Get a contact by ID or email.
{"contact":{"id":"...","email":"...","subscribed":true,"data":{},"createdAt":"...","updatedAt":"..."}}Create contact
POST/contacts
{"email":"user@example.com","subscribed":true,"data":{"plan":"pro"}}Update contact
PATCH/contacts/:id
Body fields: email?, subscribed?, data?.
Delete contact
DELETE/contacts/:id
Subscribe / Unsubscribe
Use PATCH /contacts/:id with {"subscribed": true} or {"subscribed": false}.
Campaigns
Create and deliver campaigns to your audience.
GET/campaigns
POST/campaigns
POST/campaigns/:id/send
Templates
GET/templates
GET/templates/:id
Segments
GET/segments
Webhooks
Webhook events
| Parameter | Type | Description |
|---|---|---|
| email.sent | Accepted for delivery. | |
| email.opened | Recipient opened it. | |
| email.clicked | Recipient clicked a link. | |
| email.bounced | Delivery failed. | |
| email.complained | Reported as spam. | |
| email.unsubscribed | Recipient opted out. | |
| contact.created | Contact | New contact created. |
| contact.updated | Contact | Contact changed. |
{"event":"email.opened","createdAt":"...","data":{"emailId":"...","contactId":"..."}}Signature verification
Sendbound signs payloads with your webhook signing secret using HMAC-SHA256. Verify the raw body before processing it.
import crypto from 'node:crypto';
const expected = crypto.createHmac('sha256', process.env.SENDBOUND_WEBHOOK_SECRET).update(rawBody).digest('hex');
const valid = crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(expected));Errors
| Parameter | Type | Description |
|---|---|---|
| 400 | Bad Request | Invalid request. |
| 401 | Unauthorized | Invalid API key. |
| 403 | Forbidden | Access denied. |
| 404 | Not Found | Resource missing. |
| 429 | Rate Limited | Too many requests. |
| 503 | Service Unavailable | Try again shortly. |
Rate Limits
The API is rate limited by plan. Free: 100 req/min. Pro: 1000 req/min. Enterprise: custom.