sendboundAPI Reference

Developer platform

Send email that gets there.

The Sendbound API lets you send transactional email, grow your audience, and understand every interaction.

Base URLhttps://api.sendbound.com

Authentication

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.

http
Authorization: Bearer sk_your_secret_key

Never expose secret keys in browser code.

Sending Email

Send transactional email

POST/v1/send

ParameterTypeDescription
tostring | string[]Recipient address(es).
subjectstringMessage subject.
bodystringHTML body.
from?stringVerified sender.
reply?stringReply-to address.
name?stringSender name.
headers?objectMessage headers.
delaySeconds?numberDelivery delay.
bash
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"}'
json
{"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.

ParameterTypeDescription
eventstringEvent name.
emailstringContact email.
data?objectCustom properties.
json
{"event":"purchase_completed","email":"user@example.com","data":{"amount":99.99}}

Contacts

List contacts

GET/contacts

ParameterTypeDescription
limitnumberDefault 100; maximum 250.
nextstringCursor for pagination.
subscribedbooleanFilter by subscription status.
searchstringSearch contacts.
json
{"contacts":[...],"count":N,"next":"cursor_token"}

Get contact

GET/contacts/:id

Get a contact by ID or email.

json
{"contact":{"id":"...","email":"...","subscribed":true,"data":{},"createdAt":"...","updatedAt":"..."}}

Create contact

POST/contacts

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

ParameterTypeDescription
email.sentEmailAccepted for delivery.
email.openedEmailRecipient opened it.
email.clickedEmailRecipient clicked a link.
email.bouncedEmailDelivery failed.
email.complainedEmailReported as spam.
email.unsubscribedEmailRecipient opted out.
contact.createdContactNew contact created.
contact.updatedContactContact changed.
json
{"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.

javascript
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

ParameterTypeDescription
400Bad RequestInvalid request.
401UnauthorizedInvalid API key.
403ForbiddenAccess denied.
404Not FoundResource missing.
429Rate LimitedToo many requests.
503Service UnavailableTry again shortly.

Rate Limits

The API is rate limited by plan. Free: 100 req/min. Pro: 1000 req/min. Enterprise: custom.