Overview
This API controls a BulkResponse web account: lists, categories, subscribers, suppression entries, campaigns, jobs, stats, and autoresponders. Lead finder is not included. Relay accounts are turned away until relay support is added. Only /api/v1 and /api/docs are served. Other /api paths have been removed. Send JSON with Content-Type: application/json. Form fields and query parameters are accepted as well. Times in responses are unix seconds plus a UTC string.
https://app.bulkresponse.com/web/api/v1
Every successful body looks like this:
{
"status": "success",
"message": "List created.",
"data": {}
}
A failed call looks like this:
{
"status": "error",
"message": "Unable to create the list.",
"errors": { "listname": "List name is required." }
}
A short call, after you copy the key from Account Settings:
curl -s "https://app.bulkresponse.com/web/api/v1/lists" \ -H "X-Auth-Token: YOUR_API_KEY"
How to get an API key
The key lives on your own account. Open Account Settings → API.
- Sign in to the app and open Account Settings.
- Open the API tab.
- If the key box is empty, click Generate API key. A new key is 32 characters, with lowercase and uppercase letters. Click Copy next to the key.
- Send that value on every call as the X-Auth-Token header, or as Authorization: Bearer YOUR_API_KEY.
- Regenerate API key replaces the current key at once. Calls that still use the old key receive 401.
Send the key on each request in either of these ways:
X-Auth-Token: YOUR_API_KEY
Authorization: Bearer YOUR_API_KEY
The account must be an active web account that has not expired. ?api_key= also works. Prefer the header.
API clients
Download a client, then add your API key. These downloads do not need a key.
Python client
One file, standard library only, Python 3.8 or newer. Covers every endpoint: lists, categories, subscribers and bulk add, suppressions, campaigns with send, schedule, pause and resume, jobs, stats, and autoresponder series. Includes a command line, a CSV import, and examples.
Unzip, then: python bulkresponse_api.py account
DownloadClaude skill
Lets Claude manage your BulkResponse account: build lists, import subscribers, write campaigns with placeholders and spintax, send, and report stats. It includes the Python client and the rules for using the API safely.
Claude.ai: Settings, Capabilities, Skills, Upload skill, then choose the zip. Claude Code: unzip into ~/.claude/skills/ so the folder is ~/.claude/skills/bulkresponse-api/.
DownloadAdd your API key to a client
Copy your key: Account Settings → API → Generate API key (or Copy).
Python client, macOS or Linux. Add both lines to ~/.zshrc or ~/.bashrc to keep them.
export BULKRESPONSE_API_KEY="paste-your-key-here" export BULKRESPONSE_API_URL="https://app.bulkresponse.com/web/api/v1"
Python client, Windows PowerShell. Open a new window after setx.
setx BULKRESPONSE_API_KEY "paste-your-key-here" setx BULKRESPONSE_API_URL "https://app.bulkresponse.com/web/api/v1"
Python client, in code.
BulkResponseClient(api_key="...", base_url="https://app.bulkresponse.com/web/api/v1")
Claude Code: add this to ~/.claude/settings.json, then restart Claude Code.
{ "env": { "BULKRESPONSE_API_KEY": "paste-your-key-here", "BULKRESPONSE_API_URL": "https://app.bulkresponse.com/web/api/v1" } }
Claude.ai: give Claude the key and the base URL in the chat when it asks. A key pasted into a chat is kept in that chat, so regenerate it afterwards if that matters.
Check: python bulkresponse_api.py account shows your username. 401 means the key is wrong, and a connection error means the URL is wrong.
python bulkresponse_api.py account
Keep the key secret. Do not commit it or put it in web pages. Regenerating the key disables the old one immediately.
Limits
Every authenticated API call counts as one request toward the hourly cap. A schedule also counts toward the daily cap. A call is refused with status 429 when that UTC hour or UTC day is already used up.
| Limit | Cap | Detail |
|---|---|---|
| Campaign schedules per day | 5 | Default for every web account. Counts API calls to POST /campaigns/schedule during the current UTC day. Send now is not part of this count. An admin can set a different number on the account. 0 keeps this default. |
| Small Business requests per hour | 100 | Every authenticated API call during the current UTC hour counts as 1, including POST /subscribers/bulk. OPTIONS, the public catalog, and a failed sign-in do not count. A call over this cap is still counted and returns 429. Counted responses include X-RateLimit-Limit, X-RateLimit-Remaining, and X-RateLimit-Reset. Applies to every package that is not High Volume. An admin can set a different number on the account. 0 keeps this default. |
| High Volume requests per hour | 2000 | Same hourly rules as Small Business: every authenticated call counts as 1. Default for an account whose package name is a High Volume plan. An admin can set a different number on the account. 0 keeps this default. |
Status codes
| Code | Meaning |
|---|---|
| 200 | Success |
| 201 | Created, or a send was queued |
| 400 | The JSON body is not valid |
| 401 | Missing or unknown API key |
| 403 | Inactive, expired, or not a web account |
| 404 | That record is not on this account |
| 405 | Wrong HTTP method |
| 409 | Conflict, such as a duplicate name or a send already running |
| 422 | A field failed validation |
| 429 | Hourly request limit or daily schedule limit reached |
| 500 | The save or the queue failed |
Subscriber status
| Code | Name | Meaning |
|---|---|---|
c |
confirmed | Mailed by send and schedule. |
n |
unconfirmed | On the list, not confirmed. |
p |
pending | Waiting on confirmation. Default when the list uses double opt-in. |
b |
bounced | Bounced address. |
u |
unsubscribed | Unsubscribed. |
s |
suppressed | Suppressed on this account. |
g |
globally_suppressed | Globally suppressed. |
You can send the code or the name, for example confirmed or unsubscribed.
Lists
Mailing lists owned by the account.
GET/lists
List the account lists. Returns lists newest first. Pass id to fetch one list from this same path.
| Parameter | In | Type | Required | Detail |
|---|---|---|---|---|
page |
query | integer | no | Page number. Default 1. |
per_page |
query | integer | no | Page size. Default 100, maximum 200. |
id |
query | integer | no | When set, returns that list instead of a page. Aliases: listid, list_id. |
curl -s "https://app.bulkresponse.com/web/api/v1/lists" \ -H "X-Auth-Token: YOUR_API_KEY"
GET/lists/{id}
Get one list. Same record as GET /lists?id=.
| Parameter | In | Type | Required | Detail |
|---|---|---|---|---|
id |
path | integer | yes | List id. |
curl -s "https://app.bulkresponse.com/web/api/v1/lists/{id}" \
-H "X-Auth-Token: YOUR_API_KEY"
POST/lists
Create a list. The category must already belong to this account. Names are unique per account.
| Parameter | In | Type | Required | Detail |
|---|---|---|---|---|
listname |
body | string | yes | List name. Maximum 40 characters. Alias: name. |
listcategoryid |
body | integer | yes | Category id. Aliases: category_id, list_category_id. |
fromname |
body | string | yes | From name. Maximum 40 characters. Alias: from_name. |
fromemail |
body | string | yes | From email. Alias: from_email. |
replytoemail |
body | string | yes | Reply-to email. Aliases: reply_to, reply_to_email. |
bounceemail |
body | string | no | Bounce mailbox address. Alias: bounce_email. |
double_optin |
body | boolean | no | 1 turns on double opt-in. Alias: doubleoptin. |
resubscribeoptions |
body | string | no | Stored as entered. Alias: resubscribe_options. |
curl -s -X POST "https://app.bulkresponse.com/web/api/v1/lists" \
-H "X-Auth-Token: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"listname":"listname","listcategoryid":1,"fromname":"fromname","fromemail":"fromemail","replytoemail":"replytoemail"}'
POST/lists/update
Update a list. Send only the fields that change. PUT /lists/{id} and POST /lists/{id} do the same.
| Parameter | In | Type | Required | Detail |
|---|---|---|---|---|
id |
body | integer | yes | List id. Aliases: listid, list_id. Not required when the id is in the URL. |
listname |
body | string | no | New name. Maximum 40 characters. Alias: name. |
listcategoryid |
body | integer | no | New category. Alias: category_id. |
fromname |
body | string | no | Alias: from_name. |
fromemail |
body | string | no | Alias: from_email. |
replytoemail |
body | string | no | Alias: reply_to. |
bounceemail |
body | string | no | Alias: bounce_email. |
double_optin |
body | boolean | no | 1 or 0. |
resubscribeoptions |
body | string | no | Alias: resubscribe_options. |
curl -s -X POST "https://app.bulkresponse.com/web/api/v1/lists/update" \
-H "X-Auth-Token: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"id":1}'
List categories
Folders used when a list is created.
GET/list-categories
List categories. Every category on the account.
No parameters.
curl -s "https://app.bulkresponse.com/web/api/v1/list-categories" \ -H "X-Auth-Token: YOUR_API_KEY"
POST/list-categories
Create a category. Names are unique per account.
| Parameter | In | Type | Required | Detail |
|---|---|---|---|---|
categoryname |
body | string | yes | Maximum 20 characters. Aliases: name, listCategoryName. |
curl -s -X POST "https://app.bulkresponse.com/web/api/v1/list-categories" \
-H "X-Auth-Token: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"categoryname":"categoryname"}'
POST/list-categories/update
Update a category. PUT /list-categories/{id} does the same.
| Parameter | In | Type | Required | Detail |
|---|---|---|---|---|
categoryid |
body | integer | yes | Category id. Aliases: category_id, id. Not required when the id is in the URL. |
categoryname |
body | string | yes | New name. Maximum 20 characters. Alias: name. |
curl -s -X POST "https://app.bulkresponse.com/web/api/v1/list-categories/update" \
-H "X-Auth-Token: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"categoryid":1,"categoryname":"categoryname"}'
POST/list-categories/delete
Delete a category. Refused while any list still uses it. DELETE /list-categories/{id} does the same.
| Parameter | In | Type | Required | Detail |
|---|---|---|---|---|
categoryid |
body | integer | yes | Category id. Aliases: category_id, id. |
curl -s -X POST "https://app.bulkresponse.com/web/api/v1/list-categories/delete" \
-H "X-Auth-Token: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"categoryid":1}'
Subscribers
People on a list. Confirmed subscribers use status c.
GET/subscribers
List subscribers. Always scoped to one list.
| Parameter | In | Type | Required | Detail |
|---|---|---|---|---|
list_id |
query | integer | yes | List id. Alias: listid. |
status |
query | string | no | c, n, p, b, u, s, g, or a name such as confirmed. |
email |
query | string | no | Exact email match. |
search |
query | string | no | Email contains this text. Alias: q. |
page |
query | integer | no | Default 1. |
per_page |
query | integer | no | Default 50, maximum 200. |
curl -s "https://app.bulkresponse.com/web/api/v1/subscribers" \ -H "X-Auth-Token: YOUR_API_KEY"
GET/subscribers/{id}
Get one subscriber. Includes address fields and any custom fields that are set.
| Parameter | In | Type | Required | Detail |
|---|---|---|---|---|
id |
path | integer | yes | Subscriber id. |
curl -s "https://app.bulkresponse.com/web/api/v1/subscribers/{id}" \
-H "X-Auth-Token: YOUR_API_KEY"
POST/subscribers
Add a subscriber. Uses the same gates as a web list import. A duplicate email on the same list returns 409. A bounced address, a suppression-list match (this list or the global list), or a rejected domain returns 422. Pass resubscribe true to reactivate an unsubscribed address that is not bounced or suppressed.
| Parameter | In | Type | Required | Detail |
|---|---|---|---|---|
list_id |
body | integer | yes | Alias: listid. |
email |
body | string | yes | Maximum 100 characters. |
first_name |
body | string | no | Maximum 100 characters. |
last_name |
body | string | no | Maximum 100 characters. |
status |
body | string | no | Defaults to c, or p when the list uses double opt-in. |
city |
body | string | no | Maximum 50 characters. |
country |
body | string | no | Maximum 50 characters. |
state |
body | string | no | Maximum 50 characters. |
zip |
body | string | no | Maximum 50 characters. |
address1 |
body | string | no | |
address2 |
body | string | no | |
cellphone |
body | string | no | Maximum 32 characters. |
cellcountrycode |
body | string | no | Maximum 8 characters. |
custom1 |
body | string | no | custom1 through custom30, each maximum 100 characters. Or send custom_fields as an object of those keys. |
resubscribe |
body | boolean | no | true reactivates an unsubscribed duplicate instead of returning 409. |
subscribe_ip |
body | string | no | Stored subscription IP. Alias: ip_address. Defaults to the caller IP. |
curl -s -X POST "https://app.bulkresponse.com/web/api/v1/subscribers" \
-H "X-Auth-Token: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"list_id":1,"email":"email"}'
POST/subscribers/bulk
Add up to 100 subscribers. One request counts as one call toward the hourly limit. Send 1 to 100 subscriber objects. A valid request returns 200 even when some rows are skipped. Nothing is saved when subscribers is missing, empty, or larger than 100. Each item uses the same checks as POST /subscribers. Result codes: added, resubscribed, duplicate, duplicate_in_request, invalid, bounced, suppressed, bad_domain, error. A later copy of an email in the same request is duplicate_in_request. A custom field this account does not have is left unsaved and named in warnings.
| Parameter | In | Type | Required | Detail |
|---|---|---|---|---|
list_id |
body | integer | yes | Alias: listid. Must belong to this account. |
subscribers |
body | array | yes | 1 to 100 objects. Each object accepts the same fields as POST /subscribers, including custom_fields. |
status |
body | string | no | Default for items that omit status. An item can override it. Defaults to c, or p when the list uses double opt-in. |
resubscribe |
body | boolean | no | Default for items that omit it. true reactivates an unsubscribed address. An item can override it. |
curl -s -X POST "https://app.bulkresponse.com/web/api/v1/subscribers/bulk" \
-H "X-Auth-Token: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"list_id":1,"subscribers":[1]}'
POST/subscribers/update
Update a subscriber. PUT /subscribers/{id} does the same. List counts are refreshed.
| Parameter | In | Type | Required | Detail |
|---|---|---|---|---|
subscriber_id |
body | integer | yes | Aliases: subscriberid, id. Not required when the id is in the URL. |
email |
body | string | no | Must stay unique on the list. |
status |
body | string | no | Setting u records the unsubscribe time. |
list_id |
body | integer | no | Move the subscriber to another of your lists. The destination is checked for a duplicate, a bounce, and suppression. A duplicate returns 409. |
first_name |
body | string | no | Same profile fields as add, including custom1–custom30 and custom_fields. |
curl -s -X POST "https://app.bulkresponse.com/web/api/v1/subscribers/update" \
-H "X-Auth-Token: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"subscriber_id":1}'
POST/subscribers/delete
Delete a subscriber. Removes the row. DELETE /subscribers/{id} does the same.
| Parameter | In | Type | Required | Detail |
|---|---|---|---|---|
subscriber_id |
body | integer | yes | Aliases: subscriberid, id. |
curl -s -X POST "https://app.bulkresponse.com/web/api/v1/subscribers/delete" \
-H "X-Auth-Token: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"subscriber_id":1}'
POST/subscribers/unsubscribe
Unsubscribe. Send subscriber_id, or both list_id and email. Calling it again on an unsubscribed address succeeds.
| Parameter | In | Type | Required | Detail |
|---|---|---|---|---|
subscriber_id |
body | integer | no | Aliases: subscriberid, id. |
list_id |
body | integer | no | Required together with email when subscriber_id is omitted. |
email |
body | string | no | Required together with list_id when subscriber_id is omitted. |
curl -s -X POST "https://app.bulkresponse.com/web/api/v1/subscribers/unsubscribe" \ -H "X-Auth-Token: YOUR_API_KEY" \ -H "Content-Type: application/json"
Suppression list
Emails and domains that are blocked from being added to a list. list_id g covers every list on the account.
GET/suppressions
List suppression entries. Returns this account's entries, newest first. Pass id to fetch one entry. System-wide rows are not included.
| Parameter | In | Type | Required | Detail |
|---|---|---|---|---|
page |
query | integer | no | Page number. Default 1. |
per_page |
query | integer | no | Page size. Default 100, maximum 200. |
list_id |
query | string | no | Limit to one list, or g for the global list. Alias: listid. |
q |
query | string | no | Match part of the email or domain. Alias: search. |
id |
query | integer | no | When set, returns that entry instead of a page. |
curl -s "https://app.bulkresponse.com/web/api/v1/suppressions" \ -H "X-Auth-Token: YOUR_API_KEY"
GET/suppressions/{id}
Get one suppression entry. Same record as GET /suppressions?id=.
| Parameter | In | Type | Required | Detail |
|---|---|---|---|---|
id |
path | integer | yes | Suppression entry id. |
curl -s "https://app.bulkresponse.com/web/api/v1/suppressions/{id}" \
-H "X-Auth-Token: YOUR_API_KEY"
POST/suppressions
Add suppression entries. Adds one or many emails or domains. Duplicates on the same list are skipped. Each new row is type gu and source api. At most 1000 entries per call.
| Parameter | In | Type | Required | Detail |
|---|---|---|---|---|
list_id |
body | string | yes | g for every list, or a list id on this account. Alias: listid. global is accepted as g. |
entries |
body | array | no | Emails and domains. An array, or a string split on newlines, commas, or semicolons. Aliases: values, emails, domains. |
email |
body | string | no | One address when entries is omitted. Alias: value. |
domain |
body | string | no | One domain when entries is omitted. |
curl -s -X POST "https://app.bulkresponse.com/web/api/v1/suppressions" \
-H "X-Auth-Token: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"list_id":"list_id"}'
POST/suppressions/update
Update a suppression entry. Change the email, domain, or list. PUT /suppressions/{id} does the same. A duplicate on the destination list returns 409.
| Parameter | In | Type | Required | Detail |
|---|---|---|---|---|
id |
body | integer | yes | Entry id. Not required when the id is in the URL. |
list_id |
body | string | no | New list, or g. Alias: listid. |
email |
body | string | no | New address. Aliases: domain, value. |
curl -s -X POST "https://app.bulkresponse.com/web/api/v1/suppressions/update" \
-H "X-Auth-Token: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"id":1}'
POST/suppressions/delete
Remove suppression entries. Send id, ids, or entries with list_id. DELETE /suppressions/{id} removes that one entry. Only rows on this account are removed.
| Parameter | In | Type | Required | Detail |
|---|---|---|---|---|
id |
body | integer | no | One entry id. |
ids |
body | array | no | Several entry ids. |
list_id |
body | string | no | Required with entries. Alias: listid. |
entries |
body | array | no | Emails or domains to remove from that list. Aliases: email, domain, value. |
curl -s -X POST "https://app.bulkresponse.com/web/api/v1/suppressions/delete" \ -H "X-Auth-Token: YOUR_API_KEY" \ -H "Content-Type: application/json"
Campaigns
A send copies the campaign HTML onto the job. Editing the campaign later does not change a send that is already queued.
GET/campaigns
List campaigns. List rows omit HTML. Pass id to fetch one campaign, including HTML, from this path.
| Parameter | In | Type | Required | Detail |
|---|---|---|---|---|
page |
query | integer | no | Default 1. |
per_page |
query | integer | no | Default 50, maximum 200. |
id |
query | integer | no | Aliases: campaignid, campaign_id. |
curl -s "https://app.bulkresponse.com/web/api/v1/campaigns" \ -H "X-Auth-Token: YOUR_API_KEY"
GET/campaigns/{id}
Get one campaign. Includes html and text.
| Parameter | In | Type | Required | Detail |
|---|---|---|---|---|
id |
path | integer | yes | Campaign id. |
curl -s "https://app.bulkresponse.com/web/api/v1/campaigns/{id}" \
-H "X-Auth-Token: YOUR_API_KEY"
POST/campaigns
Create a campaign. The campaign is active unless you pass active 0. Subject, html, and text may contain placeholders and spintax. The sender fills placeholders for each recipient and picks one spintax option per recipient.
Placeholders
Put these tags in the subject, HTML, or text. The sender replaces each one with that recipient's value.
| Tag | Field |
|---|---|
%%first_name%% |
First name |
%%last_name%% |
Last name |
%%email%% |
Email address |
%%city%% |
City |
%%state%% |
State |
%%zip%% |
ZIP or postal code |
%%country%% |
Country |
%%address1%% |
Address line 1 |
%%address2%% |
Address line 2 |
%%cellphone%% |
Cell phone |
%%cellcountrycode%% |
Cell country code |
%%homephone%% |
Home phone |
%%workphone%% |
Work phone |
Custom fields
A custom field uses the field name stored on the list, with the same spelling and case, wrapped in percent signs. A field named Company is %%Company%%. A field named industry is %%industry%%. These tags work in the subject, the HTML body, and the text body. An empty subscriber value is left blank.
Subject placeholders
A subject uses the same tags. Each recipient sees their own values.
%%first_name%%, a note for %%city%%
Hi %%first_name%% %%last_name%%
Spintax
Randomization picks one option for each recipient when the message is sent. Put it in the subject, the HTML body, or the text body. The block starts with {{RANDOM | and ends with }}. Separate options with a vertical bar. A placeholder inside an option is filled after the option is chosen.
{{RANDOM |Hi|Hello|Hey}} %%first_name%%,
{{RANDOM |We can help with|A short note about|An idea for}} {{RANDOM |delivery|list growth|inbox placement}}.
Subject randomization
A subject can pick one phrase per recipient. Placeholders in that subject are filled after the phrase is chosen.
{{RANDOM |Quick question|A short note|Following up}}, %%first_name%%
{{RANDOM |Hi|Hello|Hey}} %%first_name%%, your %%city%% update
Randomization is not nested. Do not put one {{RANDOM block inside another. Place each block next to the other.
Wrong
{{RANDOM |Hi {{RANDOM |there|friend}}|Hello}} %%first_name%%
Right
{{RANDOM |Hi|Hello}} {{RANDOM |there|friend}}, %%first_name%%
| Parameter | In | Type | Required | Detail |
|---|---|---|---|---|
name |
body | string | yes | Maximum 100 characters. |
subject |
body | string | yes | Required. Placeholders and spintax are allowed. |
html |
body | string | no | HTML body. Alias: htmlbody. Placeholders and spintax are allowed. |
text |
body | string | no | Plain text body. Alias: textbody. Placeholders and spintax are allowed. |
format |
body | string | no | h, t, or b. Also accepts html, text, both. Chosen from the bodies when omitted. |
active |
body | boolean | no | Default 1. |
curl -s -X POST "https://app.bulkresponse.com/web/api/v1/campaigns" \
-H "X-Auth-Token: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name":"name","subject":"subject"}'
POST/campaigns/update
Update a campaign. PUT /campaigns/{id} does the same.
| Parameter | In | Type | Required | Detail |
|---|---|---|---|---|
campaign_id |
body | integer | yes | Aliases: campaignid, id. |
name |
body | string | no | Maximum 100 characters. |
subject |
body | string | no | |
html |
body | string | no | Alias: htmlbody. |
text |
body | string | no | Alias: textbody. |
format |
body | string | no | h, t, or b. |
active |
body | boolean | no |
curl -s -X POST "https://app.bulkresponse.com/web/api/v1/campaigns/update" \
-H "X-Auth-Token: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"campaign_id":1}'
POST/campaigns/delete
Delete a campaign. Refused while a send for it is in progress or scheduled. DELETE /campaigns/{id} does the same.
| Parameter | In | Type | Required | Detail |
|---|---|---|---|---|
campaign_id |
body | integer | yes | Aliases: campaignid, id. |
curl -s -X POST "https://app.bulkresponse.com/web/api/v1/campaigns/delete" \
-H "X-Auth-Token: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"campaign_id":1}'
POST/campaigns/send
Send now. Queues every confirmed subscriber (status c) on the lists. The call stays open until the queue is built. Lists that are being cleaned are rejected. The from name cannot contain BulkResponse.
| Parameter | In | Type | Required | Detail |
|---|---|---|---|---|
campaign_id |
body | integer | yes | Alias: campaignid. The campaign must be active. |
list_ids |
body | array | yes | List ids. An array or a comma string. Aliases: list_id, listid. |
from_name |
body | string | no | Defaults to the first list. Aliases: fromname, sender_name. |
from_email |
body | string | no | Defaults to the first list. Aliases: fromemail, sender_email. |
reply_to |
body | string | no | Defaults to the first list. Aliases: replytoemail, reply_to_email. |
track_opens |
body | boolean | no | Default on. |
track_clicks |
body | boolean | no | Default on. |
notify_owner |
body | boolean | no | Default off. |
send_method |
body | string | no | pickup, smtp, or mailbox. Defaults to the account send method, then pickup. |
injector_id |
body | integer | no | Required for smtp or mailbox when the account has no default injector. |
bounce_mailbox_id |
body | integer | no | Required when the account has more than one bounce mailbox. The only mailbox is selected automatically. |
curl -s -X POST "https://app.bulkresponse.com/web/api/v1/campaigns/send" \
-H "X-Auth-Token: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"campaign_id":1,"list_ids":[1]}'
POST/campaigns/schedule
Schedule a send. Same fields as send, plus send_at. The job stays scheduled (status 4) until that time, then the mailer moves it to in progress. The default is 5 schedule requests per UTC day, unless an admin set a different cap on the account.
| Parameter | In | Type | Required | Detail |
|---|---|---|---|---|
campaign_id |
body | integer | yes | Alias: campaignid. |
list_ids |
body | array | yes | Same as send. |
send_at |
body | string | yes | Future unix time, or a date string in the app server timezone. Aliases: send_at_unix, start_time. |
from_name |
body | string | no | Same optional delivery fields as send. |
curl -s -X POST "https://app.bulkresponse.com/web/api/v1/campaigns/schedule" \
-H "X-Auth-Token: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"campaign_id":1,"list_ids":[1],"send_at":"send_at"}'
POST/campaigns/pause
Pause a send. Pauses in-progress (1) and scheduled (4) jobs. A finished send cannot be paused.
| Parameter | In | Type | Required | Detail |
|---|---|---|---|---|
job_id |
body | integer | no | One job. Alias: jobid. Send this or campaign_id. |
campaign_id |
body | integer | no | Every open send for that campaign. Alias: campaignid. |
curl -s -X POST "https://app.bulkresponse.com/web/api/v1/campaigns/pause" \ -H "X-Auth-Token: YOUR_API_KEY" \ -H "Content-Type: application/json"
POST/campaigns/resume
Resume a send. A future job returns to scheduled. A job whose start time has passed returns to in progress.
| Parameter | In | Type | Required | Detail |
|---|---|---|---|---|
job_id |
body | integer | no | One paused job. Alias: jobid. |
campaign_id |
body | integer | no | Every paused send for that campaign. |
curl -s -X POST "https://app.bulkresponse.com/web/api/v1/campaigns/resume" \ -H "X-Auth-Token: YOUR_API_KEY" \ -H "Content-Type: application/json"
Jobs
Sends queued for this account. Status 0 is not sent, 1 is in progress, 2 is complete, 3 is paused, and 4 is scheduled.
GET/jobs
List jobs. Newest first. The HTML and text of the message are not included. Pass id to fetch one job from this same path.
| Parameter | In | Type | Required | Detail |
|---|---|---|---|---|
page |
query | integer | no | Default 1. |
per_page |
query | integer | no | Default 50, maximum 200. |
id |
query | integer | no | One job. Aliases: job_id, jobid. |
status |
query | string | no | 0, 1, 2, 3, 4, or not_sent, in_progress, complete, paused, scheduled. Alias: jobstatus. |
jobtype |
query | string | no | Limit to one type, such as send. Alias: job_type. |
campaign_id |
query | integer | no | Jobs for that campaign. Alias: campaignid. |
curl -s "https://app.bulkresponse.com/web/api/v1/jobs" \ -H "X-Auth-Token: YOUR_API_KEY"
GET/jobs/{id}
Get one job. Same record as GET /jobs?id=.
| Parameter | In | Type | Required | Detail |
|---|---|---|---|---|
id |
path | integer | yes | Job id. |
curl -s "https://app.bulkresponse.com/web/api/v1/jobs/{id}" \
-H "X-Auth-Token: YOUR_API_KEY"
POST/jobs/pause
Pause a job. Pauses an in-progress (1) or scheduled (4) job. A finished job cannot be paused.
| Parameter | In | Type | Required | Detail |
|---|---|---|---|---|
job_id |
body | integer | yes | Aliases: jobid, id. |
curl -s -X POST "https://app.bulkresponse.com/web/api/v1/jobs/pause" \
-H "X-Auth-Token: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"job_id":1}'
POST/jobs/resume
Resume a job. A future job returns to scheduled. A job whose start time has passed returns to in progress.
| Parameter | In | Type | Required | Detail |
|---|---|---|---|---|
job_id |
body | integer | yes | Aliases: jobid, id. |
curl -s -X POST "https://app.bulkresponse.com/web/api/v1/jobs/resume" \
-H "X-Auth-Token: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"job_id":1}'
Stats
Account totals, per-send campaign stats, per-list subscriber counts, and autoresponder stats.
GET/stats/account
Account stats. Lists, confirmed subscribers, campaigns, autoresponders, sends in progress, credits, and this calendar month’s new subscribers, opens, and clicks.
No parameters.
curl -s "https://app.bulkresponse.com/web/api/v1/stats/account" \ -H "X-Auth-Token: YOUR_API_KEY"
GET/stats/campaign
Campaign stats. One row per send: size, sent count, opens, clicks, bounces, unsubscribes, and rates.
| Parameter | In | Type | Required | Detail |
|---|---|---|---|---|
campaign_id |
query | integer | no | Limit to one campaign. Alias: campaignid. |
job_id |
query | integer | no | Limit to one send. Alias: jobid. |
page |
query | integer | no | Default 1. |
per_page |
query | integer | no | Default 50, maximum 200. |
curl -s "https://app.bulkresponse.com/web/api/v1/stats/campaign" \ -H "X-Auth-Token: YOUR_API_KEY"
GET/stats/list
List stats. Stored counts plus a live count by subscriber status.
| Parameter | In | Type | Required | Detail |
|---|---|---|---|---|
list_id |
query | integer | no | One list. Omit it to return every list. Alias: listid. |
curl -s "https://app.bulkresponse.com/web/api/v1/stats/list" \ -H "X-Auth-Token: YOUR_API_KEY"
GET/stats/autoresponder
Autoresponder stats. Sent, delivered, opens, clicks, bounces, unsubscribes, and rates for each autoresponder. Rates use the same counts as the autoresponder screen.
| Parameter | In | Type | Required | Detail |
|---|---|---|---|---|
autoresponder_id |
query | integer | no | One autoresponder. Omit it to return every autoresponder on the account. Aliases: autoresponderid, id. |
page |
query | integer | no | Default 1. |
per_page |
query | integer | no | Default 50, maximum 200. |
curl -s "https://app.bulkresponse.com/web/api/v1/stats/autoresponder" \ -H "X-Auth-Token: YOUR_API_KEY"
Autoresponders
Messages sent after someone joins a list. hours_after_subscription is the delay. 0 sends on subscribe. The existing autoresponder sender delivers them.
GET/autoresponders
List autoresponders. List rows omit HTML. Pass id to include HTML on this path.
| Parameter | In | Type | Required | Detail |
|---|---|---|---|---|
page |
query | integer | no | Default 1. |
per_page |
query | integer | no | Default 50, maximum 200. |
id |
query | integer | no | Aliases: autoresponderid, autoresponder_id. |
curl -s "https://app.bulkresponse.com/web/api/v1/autoresponders" \ -H "X-Auth-Token: YOUR_API_KEY"
GET/autoresponders/{id}
Get one autoresponder. Includes html, text, tracking flags, and the bounce address.
| Parameter | In | Type | Required | Detail |
|---|---|---|---|---|
id |
path | integer | yes | Autoresponder id. |
curl -s "https://app.bulkresponse.com/web/api/v1/autoresponders/{id}" \
-H "X-Auth-Token: YOUR_API_KEY"
POST/autoresponders
Create an autoresponder. From name and from email are copied from the list when you omit them. Active by default.
| Parameter | In | Type | Required | Detail |
|---|---|---|---|---|
list_id |
body | integer | yes | One list, or list_ids as an array. Aliases: listid, list_ids. |
name |
body | string | yes | Maximum 100 characters. |
subject |
body | string | yes | Maximum 2000 characters. |
html |
body | string | no | Alias: htmlbody. |
text |
body | string | no | Alias: textbody. |
format |
body | string | no | h, t, or b. |
from_name |
body | string | no | Aliases: sendfromname, fromname. |
from_email |
body | string | no | Aliases: sendfromemail, fromemail. |
reply_to |
body | string | no | Alias: replytoemail. |
bounce_email |
body | string | no | Alias: bounceemail. Defaults to the list bounce address or the from email. |
hours_after_subscription |
body | integer | no | Delay in hours. Alias: hoursaftersubscription, delay_hours. Default 0. |
days_after_subscription |
body | integer | no | Added as 24 hours each. Alias: delay_days. |
active |
body | boolean | no | Default on. |
track_opens |
body | boolean | no | Default on. |
track_links |
body | boolean | no | Default on. |
curl -s -X POST "https://app.bulkresponse.com/web/api/v1/autoresponders" \
-H "X-Auth-Token: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"list_id":1,"name":"name","subject":"subject"}'
POST/autoresponders/update
Update an autoresponder. PUT /autoresponders/{id} does the same. Send only the fields that change.
| Parameter | In | Type | Required | Detail |
|---|---|---|---|---|
autoresponder_id |
body | integer | yes | Aliases: autoresponderid, id. |
name |
body | string | no | Same fields as create. |
subject |
body | string | no | |
list_id |
body | string | no | Alias: list_ids. |
hours_after_subscription |
body | integer | no | |
html |
body | string | no | |
active |
body | boolean | no |
curl -s -X POST "https://app.bulkresponse.com/web/api/v1/autoresponders/update" \
-H "X-Auth-Token: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"autoresponder_id":1}'
POST/autoresponders/delete
Delete an autoresponder. DELETE /autoresponders/{id} does the same.
| Parameter | In | Type | Required | Detail |
|---|---|---|---|---|
autoresponder_id |
body | integer | yes | Aliases: autoresponderid, id. |
curl -s -X POST "https://app.bulkresponse.com/web/api/v1/autoresponders/delete" \
-H "X-Auth-Token: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"autoresponder_id":1}'
POST/autoresponders/activate
Activate an autoresponder. Turns sending back on.
| Parameter | In | Type | Required | Detail |
|---|---|---|---|---|
autoresponder_id |
body | integer | yes | Aliases: autoresponderid, id. |
curl -s -X POST "https://app.bulkresponse.com/web/api/v1/autoresponders/activate" \
-H "X-Auth-Token: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"autoresponder_id":1}'
POST/autoresponders/pause
Pause an autoresponder. Stops further sends from this autoresponder.
| Parameter | In | Type | Required | Detail |
|---|---|---|---|---|
autoresponder_id |
body | integer | yes | Aliases: autoresponderid, id. |
curl -s -X POST "https://app.bulkresponse.com/web/api/v1/autoresponders/pause" \
-H "X-Auth-Token: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"autoresponder_id":1}'