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.

Base URL

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.

  1. Sign in to the app and open Account Settings.
  2. Open the API tab.
  3. 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.
  4. Send that value on every call as the X-Auth-Token header, or as Authorization: Bearer YOUR_API_KEY.
  5. 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

14.4 KB · updated 2026-11-04

Download

Claude 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/.

17.9 KB · updated 2026-11-04

Download

Add 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.

LimitCapDetail
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

CodeMeaning
200Success
201Created, or a send was queued
400The JSON body is not valid
401Missing or unknown API key
403Inactive, expired, or not a web account
404That record is not on this account
405Wrong HTTP method
409Conflict, such as a duplicate name or a send already running
422A field failed validation
429Hourly request limit or daily schedule limit reached
500The save or the queue failed

Subscriber status

CodeNameMeaning
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.

ParameterInTypeRequiredDetail
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=.

ParameterInTypeRequiredDetail
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.

ParameterInTypeRequiredDetail
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.

ParameterInTypeRequiredDetail
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.

ParameterInTypeRequiredDetail
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.

ParameterInTypeRequiredDetail
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.

ParameterInTypeRequiredDetail
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.

ParameterInTypeRequiredDetail
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.

ParameterInTypeRequiredDetail
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.

ParameterInTypeRequiredDetail
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.

ParameterInTypeRequiredDetail
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.

ParameterInTypeRequiredDetail
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.

ParameterInTypeRequiredDetail
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.

ParameterInTypeRequiredDetail
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.

ParameterInTypeRequiredDetail
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=.

ParameterInTypeRequiredDetail
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.

ParameterInTypeRequiredDetail
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.

ParameterInTypeRequiredDetail
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.

ParameterInTypeRequiredDetail
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.

ParameterInTypeRequiredDetail
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.

ParameterInTypeRequiredDetail
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.

TagField
%%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%%
ParameterInTypeRequiredDetail
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.

ParameterInTypeRequiredDetail
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.

ParameterInTypeRequiredDetail
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.

ParameterInTypeRequiredDetail
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.

ParameterInTypeRequiredDetail
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.

ParameterInTypeRequiredDetail
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.

ParameterInTypeRequiredDetail
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.

ParameterInTypeRequiredDetail
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=.

ParameterInTypeRequiredDetail
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.

ParameterInTypeRequiredDetail
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.

ParameterInTypeRequiredDetail
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.

ParameterInTypeRequiredDetail
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.

ParameterInTypeRequiredDetail
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.

ParameterInTypeRequiredDetail
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.

ParameterInTypeRequiredDetail
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.

ParameterInTypeRequiredDetail
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.

ParameterInTypeRequiredDetail
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.

ParameterInTypeRequiredDetail
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.

ParameterInTypeRequiredDetail
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.

ParameterInTypeRequiredDetail
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.

ParameterInTypeRequiredDetail
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}'