BookMySpot
Documentation

Sending in five minutes

Add a domain, grab an API key, and send. REST or SMTP, the same signed, tracked, audited pipeline either way.

Get started

  1. Create an account, free, no card. You get 500 emails to start.
  2. Add a domain, we generate the exact DNS records to publish.
  3. Verify, we check your authoritative nameservers directly.
  4. Create an API key, or an SMTP credential, and send.

Authentication

Every API request carries a bearer token. Keep keys server-side; they grant full send rights.

Authorization header
Authorization: Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx

Send a message

POST /v1/messages
curl -X POST https://api.bookmyspot.us/v1/messages \
  -H "Authorization: Bearer sk_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "from": "hello@send.yourbrand.com",
    "to": ["customer@example.com"],
    "subject": "Your receipt",
    "text": "Thanks for your order.",
    "html": "<p>Thanks for your order.</p>"
  }'

Returns 202 Accepted with a message id you can trace through the dashboard and webhooks. Pass an Idempotency-Key so a retry never sends twice.

SMTP relay

Point any system that speaks SMTP at our relay. Create an SMTP credential in the dashboard.

connection settings
host:     smtp.bookmyspot.us
ports:    587 (STARTTLS) · 465 (TLS) · 2525 (fallback)
username: (from the dashboard)
password: (shown once when created)

Webhooks

We POST delivery events as they happen. Verify the HMAC signature over the raw body before trusting a payload.

verify.js
const expected = crypto
  .createHmac('sha256', secret)
  .update(req.rawBody)
  .digest('hex')

if (expected === req.headers['x-bookmyspot-signature']) {
  const { type, recipient } = req.body
  // delivered | bounced | opened | clicked | complained
}

Errors

Errors are JSON with a stable code and a human detail. Common ones:

domain_not_verifiedThe from-domain hasn’t passed DNS verification.
free_allowance_exhaustedYour 500 free emails are used up, upgrade to continue.
rate_limitedOver your plan’s hourly limit. Retry after the given seconds.
invalid_fromThe from address isn’t a valid mailbox.