API reference
BlueyEmail API
Send transactional email, manage contacts, run campaigns, and receive HMAC-signed webhooks — a single REST API over 127 JSON endpoints.
Base URL https://api.blueyemail.com
Building a connector? Download the OpenAPI spec to auto-generate one. Public, no auth required.
Explore the API
Authentication
Every request needs an API key. Pass it as an X-API-Key header (recommended) or a Bearer token. Create keys in Settings → Integrations.
X-API-Key: YOUR_API_KEYAuthorization: Bearer YOUR_API_KEYTest the connection
Confirm a key works with a single call to GET /api/v2/me. It needs no scope and returns the workspace plus the key’s auth context — ideal for a platform’s “Test connection” step.
curl -X GET "https://api.blueyemail.com/api/v2/me" \-H "X-API-Key: YOUR_API_KEY" \-H "Content-Type: application/json"
{
"success": true,
"data": {
"workspace": { "id": "uuid", "name": "Acme Inc" },
"auth": { "method": "api_key", "mode": "live", "sandbox": false, "scopes": ["leads:write", "emails:send"] }
}
}Quick start
Send your first transactional email in one request.
curl -X POST "https://api.blueyemail.com/api/v2/transactional/send" \-H "X-API-Key: YOUR_API_KEY" \-H "Content-Type: application/json" \-d '{"to": "you@example.com","subject": "Hello from BlueyEmail","html": "<h1>It works!</h1>"}'
The API sends transactional email — receipts, OTPs, notifications — via /api/v2/transactional/send. For marketing (newsletters, campaigns), don't send per-recipient: (POST /api/v2/campaigns/:id/leads) so unsubscribes, warmup, and segments are respected.
Sending over SMTP
BlueyEmail sends over HTTPS instead of SMTP. There is less to set up — no host, port, encryption mode or mail password — and it keeps working on hosting that blocks outbound SMTP ports, which is one of the most common reasons email quietly stops sending.
Here is how to connect, depending on what you are sending from:
Send with the REST API — one POST with your API key. Attachments, scheduling, custom headers and Reply-To are all supported. See Quick Start above to send your first email in a couple of minutes.
We are building an official BlueyEmail plugin so you can skip SMTP entirely. Install it, paste your API key, and every email your site sends goes through BlueyEmail — WooCommerce orders and invoices, password resets, contact form replies. Nothing else to configure.
Connecting something else, or a platform you would like us to support? Tell us what you are working with — it genuinely shapes what we build next.
Rate limits & sending volume
Two different limits apply, and it helps to keep them separate.
1 · API request rate
How many HTTP calls your workspace can make. Your allowance is set by your plan and is shared across every API key and OAuth token in the workspace — creating more keys does not raise it. Both a per-minute and a per-hour cap apply. Exceeding either returns 429 RATE_LIMITED. Every response carries your live budget in headers:
| Plan | Requests / minute | Requests / hour |
|---|---|---|
| Free | 30 | 1,000 |
| Spark | 120 | 5,000 |
| Grow | 300 | 20,000 |
| Business | 600 | 50,000 |
| API Free | 60 | 3,000 |
| API Essentials | 300 | 30,000 |
| API Pro | 600 | 150,000 |
| API Premier | 1,200 | 500,000 |
X-RateLimit-Limit1000Requests allowed this hourX-RateLimit-Remaining842Requests left this hourX-RateLimit-Reset1710415260Unix time the window resetsRetry-AfterimpactedSeconds to wait (on 429)2 · Email sending volume
This is separate from the request rate. How many emails you can actually send is governed by a daily transactional ceiling (protects your sending reputation — raise it in Sending settings) and your monthly plan limit. Sends beyond a soft limit are queued, not dropped.
Sending to thousands? You don't make one call per recipient. Use (POST /api/v2/transactional/batch) — up to 1,000 messages per request. So 5,000 emails is just 5 API calls, far inside any rate limit. The single-send endpoint also accepts up to 50 recipients per call.
Errors
Errors return a nested error object with a type (derived from the HTTP status), a human-readable message, and a machine-readable code. The HTTP status is on the response itself. Some endpoints add extra fields (e.g. limit, reset_at, or the required scopes).
{
"error": {
"type": "auth_error",
"message": "Invalid API key",
"code": "INVALID_API_KEY"
}
}400validation_errorInvalid or missing parameters401auth_errorInvalid or missing API key403permission_errorAPI key lacks the required scope404not_found_errorResource does not exist409conflict_errorDuplicate idempotency key429rate_limit_errorSlow down — check Retry-After500api_errorServer error — retry with backoff