API reference

API reference

The BlacklistGuard HTTP API lets you send email and manage your audience, sending domains, and reporting programmatically. Every endpoint speaks JSON and uses the conventions on this page.

Base URL

All API requests go to:

https://app.blacklistguard.com/api/v1

Authentication

Authenticate every request with an API key in the X-API-Key header. Keys begin with efk_ and are tied to your workspace.

curl https://app.blacklistguard.com/api/v1/emails/send \
  -H "X-API-Key: efk_your_api_key"

See Authentication & API keys for creating, rotating, and securing keys.

Response format

Responses use a consistent envelope. On success, your data is in data:

{ "success": true, "data": { /* ... */ }, "message": "..." }

On failure, success is false and you get an error message plus a machine-readable code:

{ "success": false, "error": "from_email is required", "code": "BAD_REQUEST" }

Error codes

The HTTP status reflects the outcome; the code field tells you exactly what happened. The codes you're most likely to handle:

CodeHTTPMeaning
VALIDATION_ERROR400The request was malformed or a field was invalid.
BAD_REQUEST400The request couldn't be processed as sent.
UNAUTHORIZED401Missing or invalid API key.
FORBIDDEN403The key isn't allowed to perform this action.
INSUFFICIENT_SCOPE403The key's permissions don't cover this endpoint. The response lists the missing ones in required_scopes. See Permissions.
NOT_FOUND404The requested resource doesn't exist.
CONFLICT409The request conflicts with existing data (e.g. a duplicate).
RATE_LIMIT_EXCEEDED429Too many requests too quickly, or you've reached your hourly, daily or monthly sending limit. The message says which. Slow down and retry, or wait for the limit to reset.
FEATURE_NOT_AVAILABLE403Your plan doesn't include this feature. An API key gets this on every request when the plan has no API access.
PLAN_LIMIT_REACHED402You've reached a limit of your plan, such as the monthly volume or the number of a resource you can create.
INSUFFICIENT_BALANCE402Your prepaid balance is too low to cover this action.
EMAIL_NOT_VERIFIED403The account's own email address hasn't been verified yet. Returned when signing in to the console, not for an unverified sender, which is a BAD_REQUEST.
PAYMENT_FAILED402A new plan or an upgrade couldn't be paid from your balance or saved payment method. Nothing changed.
PAYMENT_PROCESSING409A plan change is still waiting on its payment. Try again once it has settled.
SERVICE_SUSPENDED402Your subscription is suspended because a payment is overdue. Pay what's due under Billing and service resumes automatically.
SENDING_PAUSED403Sending is paused for your account because of its sending reputation, so nothing was sent. Contact support to have it reviewed.
INTERNAL_ERROR500Something went wrong on our side. Retry shortly.

Rate limits

The API accepts up to 100 requests per second (with short bursts to 200) per source IP. If you exceed that, requests return 429 with code RATE_LIMIT_EXCEEDED. Pause briefly and retry. For steady throughput, keep well under the limit and add a small backoff when you see a 429.

Quotas & plan limits

How much you can send is governed by your plan, not a fixed request cap. Each plan includes a monthly email allowance:

PlanIncluded emails / moOver the allowance
Free3,000Sending pauses when the allowance is reached.
Growth ($35/mo)50,000$0.0008 per additional email.
Scale ($95/mo)250,000$0.0008 per additional email.
EnterpriseCustomNegotiated.

On paid plans, sending beyond your allowance draws from your prepaid balance. If it runs out, sends return INSUFFICIENT_BALANCE until you top up. Free plans hard-stop at the allowance with PLAN_LIMIT_REACHED. Your workspace may also have an optional hourly send cap configured by an administrator.

Plans can also cap how many emails you send in a day. On Free it's 100. Days run on UTC, so the count resets at 00:00 UTC. Once you reach the cap, Send an email returns 429 with RATE_LIMIT_EXCEEDED, and mail already queued waits until the next day. A campaign with more recipients than you have left for the day isn't sent: it goes back to draft, and your workspace admins get an email about it.

Your plan also sets how many users your workspace can have. Adding one past that returns 402 with PLAN_LIMIT_REACHED. You can check both, along with your other plan limits, with GET /billing/limits.

Pagination

List endpoints accept page and limit query parameters and return a pagination object alongside the results:

{
  "success": true,
  "data": {
    "pagination": { "page": 1, "limit": 50, "total": 214, "total_pages": 5 },
    "transactions": [ /* ... */ ]
  }
}

Endpoints

Reference pages by resource: