Campaigns
Newsletters and mass messages, their audiences, and who opened or opted out.
List audiences
The saved lists a campaign sends to. An audience is a fixed set of contacts, not a saved filter, so a contact who matches your criteria tomorrow does not join a list you saved today.
List audiences › Responses
Success
successAlways true on a successful response.
The page of results. The endpoint description and the Pagination guide give the order.
Offset pagination. Page forward until page reaches total_pages.
Create an audience
Save a list of contacts to send to. Build the list with GET /v1/contacts, and send the ids here. A contact outside your brokerage is refused, and the whole request fails.
Headers
Idempotency-KeyOptional for POST. An authorized retry with the same method, path, and exact body returns the stored response. Reservations last 24 hours. They belong to the original API key and broker. Reconcile uncertain results before you use a new key.
Create an audience › Request Body
nameYour own name for the audience. Required.
contact_idsThe contacts to put on it. A contact outside your brokerage is refused.
Create an audience › Responses
Success
successAlways true on a successful response.
The requested record.
Delete an audience
Deletes the saved list. The contacts stay. A campaign that used the audience keeps its history and its results, and is left with no audience.
path Parameters
idResource id.
Delete an audience › Responses
Success
successAlways true on a successful response.
The requested record.
Update an audience
Rename the audience or replace its list of contacts. contact_ids replaces the whole list. A campaign that is already scheduled or sending keeps the people it had when it was scheduled.
path Parameters
idResource id.
Update an audience › Request Body
nameYour own name for the audience.
contact_idsThe new list of contacts. It replaces the whole list. A contact outside your brokerage is refused. A campaign that is already scheduled keeps the people it had.
Update an audience › Responses
Success
successAlways true on a successful response.
The requested record.
List campaigns
Every campaign in the brokerage, newest first. Each one carries its result counts, so you can read opens and opt-outs without a second request.
query Parameters
page1-indexed page number, up to 1000000.
page_sizeRows per page. Capped at 100.
updated_sinceISO 8601 date-time, for example 2026-10-01T00:00:00Z. Returns only rows changed at or after it, in updated_at order and then id order, oldest first. A value that is not ISO 8601 gets 400 VALIDATION_ERROR.
after_idUse with updated_since to read the next page of a sync. Send the updated_at and id of the last row you read: the list then starts after that row, and a row that changes while you sync cannot be skipped. Keep page at 1. Without updated_since it gets 400 VALIDATION_ERROR.
statusReturn only campaigns in this state.
List campaigns › Responses
Success
successAlways true on a successful response.
The page of results. The endpoint description and the Pagination guide give the order.
Offset pagination. Page forward until page reaches total_pages.
Create a campaign draft
Writes a campaign and leaves it as a draft. Nothing is sent. The broker can open the draft in BrokerPlus and send it, or you can set a time with POST /v1/campaigns/{id}/schedule. Write the body in Markdown; **bold** and the rest become formatting in the email.
Headers
Idempotency-KeyOptional for POST. An authorized retry with the same method, path, and exact body returns the stored response. Reservations last 24 hours. They belong to the original API key and broker. Reconcile uncertain results before you use a new key.
Create a campaign draft › Request Body
nameYour own name for the campaign. Clients never see it. Required.
bodyThe message, as Markdown. **bold**, *italic*, [text](https://example.com), # headings and - or 1. lists become formatting in the email. HTML in this field is shown to the client as text, so write Markdown, not tags. An SMS campaign sends it as plain text with no formatting, and holds 1600 characters. To personalize each message, write a variable as {{name|fallback}}, for example {{borrower.firstName|there}}. Recipient variables: borrower.firstName, borrower.nickname, borrower.lastName, borrower.fullName. Give each recipient variable a fallback, which is sent when the contact has no value; without one, that contact gets a blank. Sender variables: broker.firstName, broker.fullName, broker.email, broker.phone, broker.title, broker.bookingLink, brokerage.name, system.today. Other variables are rejected.
channelDefaults to email.
subjectThe email subject line. Required on an email. Can contain variables, the same as body.
preheaderThe preview line under the subject in an inbox. Can contain variables, the same as body.
segment_idThe audience to send to. Create one with POST /v1/audiences.
segment_idsMore audiences to send to, up to 20, together with segment_id. A person in more than one audience gets one message. On a change, the two together replace every audience the draft had.
Create a campaign draft › Responses
Success
successAlways true on a successful response.
The requested record.
Retrieve a campaign
One campaign, with the message it sends and its result counts. The counts are recomputed from the recipient rows on every read.
path Parameters
idResource id.
Retrieve a campaign › Responses
Success
successAlways true on a successful response.
The requested record.
Delete a campaign
Deletes the campaign in any state, with its recipient list and results. Deleting a scheduled or sending campaign stops it: nobody else gets it. You cannot undo this.
path Parameters
idResource id.
Delete a campaign › Responses
Success
successAlways true on a successful response.
The requested record.
Update a campaign draft
Change a draft's name, words or audience. Only the fields you send change. Only a draft can be changed here: a scheduled campaign goes out with the words it has, so change it in BrokerPlus. The channel cannot change.
path Parameters
idResource id.
Update a campaign draft › Request Body
nameYour own name for the campaign. Clients never see it. Required.
subjectThe email subject line. Required on an email. Can contain variables, the same as body.
preheaderThe preview line under the subject in an inbox. Can contain variables, the same as body.
bodyThe message, as Markdown. **bold**, *italic*, [text](https://example.com), # headings and - or 1. lists become formatting in the email. HTML in this field is shown to the client as text, so write Markdown, not tags. An SMS campaign sends it as plain text with no formatting, and holds 1600 characters. To personalize each message, write a variable as {{name|fallback}}, for example {{borrower.firstName|there}}. Recipient variables: borrower.firstName, borrower.nickname, borrower.lastName, borrower.fullName. Give each recipient variable a fallback, which is sent when the contact has no value; without one, that contact gets a blank. Sender variables: broker.firstName, broker.fullName, broker.email, broker.phone, broker.title, broker.bookingLink, brokerage.name, system.today. Other variables are rejected.
segment_idThe audience to send to. Create one with POST /v1/audiences.
segment_idsMore audiences to send to, up to 20, together with segment_id. A person in more than one audience gets one message. On a change, the two together replace every audience the draft had.
Update a campaign draft › Responses
Success
successAlways true on a successful response.
The requested record.
Schedule a campaign
Schedules a draft campaign now, the same as Schedule in the campaign composer. The recipient list is frozen and the campaign is scheduled for scheduled_at. A time in the past starts the send now. The broker can still pause or delete it in BrokerPlus before it fires. The response is the campaign. Every email leaves through the broker's own connected mailbox, which its provider caps per day (Google Workspace 2,000, Gmail 500, Microsoft 365 10,000), so read warnings in the response and pass anything there on to the broker. A key with the no_sending limit gets 403.
path Parameters
idResource id.
Headers
Idempotency-KeyOptional for POST. An authorized retry with the same method, path, and exact body returns the stored response. Reservations last 24 hours. They belong to the original API key and broker. Reconcile uncertain results before you use a new key.
Schedule a campaign › Request Body
scheduled_atWhen the send starts, as an ISO 8601 timestamp. It must be in the future.
send_window_daysSpread the send across this many days. 1, the default, releases everyone on the first day, paced through it. Paced sends only go out between 8 AM and 8 PM, on each recipient's own clock when their address places them and on the campaign creator's otherwise, so a scheduled_at outside those hours starts at the next 8 AM. About 150 a day is the safe pace for one mailbox.
express_sendSend to the whole audience within about two hours of scheduled_at (longer for lists over about 700, at the same rate), and ignore send_window_days. This queues every recipient at once and releases them from the broker's own mailbox within minutes of each other, so a large audience can use up most of that mailbox's daily sending limit in one go. Confirm the audience size with the broker before setting it. Express sends at any hour, so pick a daytime scheduled_at. A fast send from one mailbox is more likely to go to spam, so leave this off unless speed matters more than delivery.
skip_weekendsHold the paced send over Saturday and Sunday in the broker's time zone and carry on Monday at 8 AM. Ignored with express_send. Defaults to false.
recurrenceRepeat the campaign on this cadence. Omit it for a one-off send.
recurrence_untilThe last day an occurrence can start, as an ISO 8601 timestamp. Omit it to repeat until you stop it.
Schedule a campaign › Responses
Success
successAlways true on a successful response.
The requested record.
Pause a campaign
Stops a campaign that is sending. Nobody else gets it until the broker resumes it in BrokerPlus. Resuming is not on the API, because it starts writing to clients again.
path Parameters
idResource id.
Headers
Idempotency-KeyOptional for POST. An authorized retry with the same method, path, and exact body returns the stored response. Reservations last 24 hours. They belong to the original API key and broker. Reconcile uncertain results before you use a new key.
Pause a campaign › Responses
Success
successAlways true on a successful response.
The requested record.
Duplicate a campaign
Makes a new draft with the same words, audience and follow-ups. Nothing is sent. Duplicating a follow-up copies the campaign it follows.
path Parameters
idResource id.
Headers
Idempotency-KeyOptional for POST. An authorized retry with the same method, path, and exact body returns the stored response. Reservations last 24 hours. They belong to the original API key and broker. Reconcile uncertain results before you use a new key.
Duplicate a campaign › Responses
Success
successAlways true on a successful response.
The requested record.
List a campaign's recipients
Who the campaign reached, and what each person did. opened_at is the open, and unsubscribed is the opt-out. Clicks are not recorded: BrokerPlus does not rewrite the links in your message, so no endpoint reports them.
path Parameters
idResource id.
query Parameters
page1-indexed page number, up to 1000000.
page_sizeRows per page. Capped at 100.
statusReturn only recipients with this outcome.
openedSend true for only the people who opened the message, or false for only those who did not.
List a campaign's recipients › Responses
Success
successAlways true on a successful response.
The page of results. The endpoint description and the Pagination guide give the order.
Offset pagination. Page forward until page reaches total_pages.