A reference guide for building AI agents: every method, how to authenticate, and the permissions each one needs.
The Campaign Monitor API is how an app or AI agent works with an email marketing account: adding and importing subscribers onto lists, creating and sending campaigns, building segments, and sending transactional email. Access is granted through an account API key or an OAuth token carrying coarse scopes like ManageLists, SendCampaigns, and ImportSubscribers, and an agent is limited to the accounts and clients that key or token can reach. Campaign Monitor can also push subscriber changes to a webhook so an integration learns about them without polling.
How an app or AI agent connects to Campaign Monitor determines what it can reach. There is a route for making calls and a route for receiving events, each governed by the key or token behind it and the permissions it carries.
The REST API answers at https://api.createsend.com/api/v3.3/. Most endpoints accept and return both JSON and XML, while the transactional endpoints are JSON only.
List webhooks deliver batched Subscribe, Update, and Deactivate events to a receiver URL chosen when the webhook is created, with up to 1,000 events per delivery.
An account or client API key is sent as the username in HTTP Basic auth, with any value for the password, and grants full access to whatever that key's account or client can reach. Reading a client's details returns that client's own key.
OAuth 2.0 lets an app act on a Campaign Monitor account without its username and password, granting an access token scoped to a comma-separated list of coarse permissions like ManageLists, ImportSubscribers, SendCampaigns, and ViewReports. The token is sent as a bearer token and can be refreshed.
The Campaign Monitor API is split into areas an agent can act on, like subscribers, lists, campaigns, segments, and transactional email. Each area has its own methods, and writes in some areas send real mail to real people.
Add and update a single subscriber, import many at once, read a subscriber's details and history, unsubscribe, and delete.
Create, read, update, and delete a list, and read its active, unsubscribed, bounced, and unconfirmed subscribers.
Create a draft campaign from content or a template, send or schedule it, send a preview, and read its results.
Create, read, update, and delete a segment on a list, manage its rules, and read the subscribers it matches.
Create, update, and delete the custom fields that store extra data against each subscriber on a list.
Create a client, read its details, lists, segments, and campaigns, manage its suppression list, and delete it.
Create, read, update, and delete the email templates a client builds campaigns from.
Send a smart or classic transactional email, list smart emails, and read message timelines and statistics.
List, create, delete, activate, and deactivate the webhooks that notify an app of subscriber changes on a list.
Filter by method, access, or permission, or search any path. Select a row for version detail, rate limits, the related webhook event, and the source.
| Method | Endpoint | What it does | Access | Permission | Version | |
|---|---|---|---|---|---|---|
SubscribersAdd and update a single subscriber, import many at once, read a subscriber's details and history, unsubscribe, and delete.7 | ||||||
| POST | /api/v3.3/subscribers/{listid}.json | Add a single subscriber to a list, updating the existing record if the email is already present. | write | ImportSubscribers | Current | |
OAuth scope ImportSubscribers. With an API key, the key's account access governs the call instead of a scope. Acts onsubscriber Permission (capability) ImportSubscribersVersionAvailable since the API’s base version Webhook event subscribeRate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| PUT | /api/v3.3/subscribers/{listid}.json?email={email} | Update an existing subscriber's email, name, mobile number, custom fields, and consent state. | write | ImportSubscribers | Current | |
OAuth scope ImportSubscribers. The email query parameter identifies the current record before any change. Acts onsubscriber Permission (capability) ImportSubscribersVersionAvailable since the API’s base version Webhook event updateRate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| POST | /api/v3.3/subscribers/{listid}/import.json | Import up to 1,000 subscribers in one request, returning which succeeded and which failed. | write | ImportSubscribers | Current | |
OAuth scope ImportSubscribers. A request with more than 1,000 records is rejected and must be split. Acts onsubscriber Permission (capability) ImportSubscribersVersionAvailable since the API’s base version Webhook event subscribeRate limitUp to 1,000 subscribers per request SourceOfficial documentation ↗ | ||||||
| GET | /api/v3.3/subscribers/{listid}.json?email={email} | Get a subscriber's details, including state, custom fields, and consent preferences. | read | ViewSubscribersInReports | Current | |
OAuth scope ViewSubscribersInReports. Set includetrackingpreference to true to return consent state. Acts onsubscriber Permission (capability) ViewSubscribersInReportsVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| GET | /api/v3.3/subscribers/{listid}/history.json?email={email} | Get a subscriber's history of campaigns and automated emails received, with opens and clicks. | read | ViewSubscribersInReports | Current | |
OAuth scope ViewSubscribersInReports. Acts onsubscriber Permission (capability) ViewSubscribersInReportsVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| POST | /api/v3.3/subscribers/{listid}/unsubscribe.json | Unsubscribe a subscriber from a list, optionally adding them to the suppression list. | write | ImportSubscribers | Current | |
OAuth scope ImportSubscribers. Whether the email is suppressed depends on the list's settings. Acts onsubscriber Permission (capability) ImportSubscribersVersionAvailable since the API’s base version Webhook event deactivateRate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| DELETE | /api/v3.3/subscribers/{listid}.json?email={email} | Delete a subscriber from a list without adding them to the suppression list. | write | ImportSubscribers | Current | |
OAuth scope ImportSubscribers. A deleted subscriber can be re-added later, unlike a suppressed one. Acts onsubscriber Permission (capability) ImportSubscribersVersionAvailable since the API’s base version Webhook event deactivateRate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
ListsCreate, read, update, and delete a list, and read its active, unsubscribed, bounced, and unconfirmed subscribers.8 | ||||||
| POST | /api/v3.3/lists/{clientid}.json | Create a list under a client, with its title, unsubscribe setting, and confirmation option. | write | ManageLists | Current | |
OAuth scope ManageLists. Acts onlist Permission (capability) ManageListsVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| GET | /api/v3.3/lists/{listid}.json | Get a list's basic details, including its opt-in type and unsubscribe settings. | read | ViewReports | Current | |
OAuth scope ViewReports. Acts onlist Permission (capability) ViewReportsVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| PUT | /api/v3.3/lists/{listid}.json | Update a list's name, unsubscribe behavior, and confirmation settings. | write | ManageLists | Current | |
OAuth scope ManageLists. Acts onlist Permission (capability) ManageListsVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| DELETE | /api/v3.3/lists/{listid}.json | Delete a list from the account. | write | ManageLists | Current | |
OAuth scope ManageLists. Deleting a list removes its subscribers and reporting. Acts onlist Permission (capability) ManageListsVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| GET | /api/v3.3/lists/{listid}/active.json | Get a paged result of all the active subscribers on a list. | read | ViewSubscribersInReports | Current | |
OAuth scope ViewSubscribersInReports. Acts onlist Permission (capability) ViewSubscribersInReportsVersionAvailable since the API’s base version Webhook eventNone Rate limitUp to 1,000 records per page SourceOfficial documentation ↗ | ||||||
| GET | /api/v3.3/lists/{listid}/unsubscribed.json | Get a paged result of the subscribers who have unsubscribed from a list. | read | ViewSubscribersInReports | Current | |
OAuth scope ViewSubscribersInReports. Acts onlist Permission (capability) ViewSubscribersInReportsVersionAvailable since the API’s base version Webhook eventNone Rate limitUp to 1,000 records per page SourceOfficial documentation ↗ | ||||||
| GET | /api/v3.3/lists/{listid}/bounced.json | Get a paged result of the subscribers who have bounced off a list. | read | ViewSubscribersInReports | Current | |
OAuth scope ViewSubscribersInReports. Acts onlist Permission (capability) ViewSubscribersInReportsVersionAvailable since the API’s base version Webhook eventNone Rate limitUp to 1,000 records per page SourceOfficial documentation ↗ | ||||||
| GET | /api/v3.3/lists/{listid}/unconfirmed.json | Get a paged result of the subscribers still pending confirmation on a double opt-in list. | read | ViewSubscribersInReports | Current | |
OAuth scope ViewSubscribersInReports. Acts onlist Permission (capability) ViewSubscribersInReportsVersionAvailable since the API’s base version Webhook eventNone Rate limitUp to 1,000 records per page SourceOfficial documentation ↗ | ||||||
CampaignsCreate a draft campaign from content or a template, send or schedule it, send a preview, and read its results.8 | ||||||
| POST | /api/v3.3/campaigns/{clientid}.json | Create, but not send, a draft campaign ready to be tested. | write | CreateCampaigns | Current | |
OAuth scope CreateCampaigns. Creating a draft does not send any mail on its own. Acts oncampaign Permission (capability) CreateCampaignsVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| POST | /api/v3.3/campaigns/{clientid}/fromtemplate.json | Create a draft campaign from an existing template with custom content. | write | CreateCampaigns | Current | |
OAuth scope CreateCampaigns. Acts oncampaign Permission (capability) CreateCampaignsVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| POST | /api/v3.3/campaigns/{campaignid}/send.json | Schedule a draft campaign to send immediately or on a chosen date. | write | SendCampaigns | Current | |
OAuth scope SendCampaigns. This delivers the campaign to every recipient on the chosen lists and segments. Acts oncampaign Permission (capability) SendCampaignsVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| POST | /api/v3.3/campaigns/{campaignid}/sendpreview.json | Send a preview of a draft campaign to a small set of named email addresses. | write | SendCampaigns | Current | |
OAuth scope SendCampaigns. A preview goes only to the addresses given, not the campaign's lists. Acts oncampaign Permission (capability) SendCampaignsVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| GET | /api/v3.3/campaigns/{campaignid}/summary.json | Get a basic summary of a sent campaign's results, including opens, clicks, and bounces. | read | ViewReports | Current | |
OAuth scope ViewReports. Acts oncampaign Permission (capability) ViewReportsVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| GET | /api/v3.3/campaigns/{campaignid}/recipients.json | Get a paged result of all the subscribers a campaign was sent to. | read | ViewReports | Current | |
OAuth scope ViewReports. Acts oncampaign Permission (capability) ViewReportsVersionAvailable since the API’s base version Webhook eventNone Rate limitUp to 1,000 records per page SourceOfficial documentation ↗ | ||||||
| POST | /api/v3.3/campaigns/{campaignid}/unschedule.json | Cancel the sending of a scheduled campaign and move it back into drafts. | write | SendCampaigns | Current | |
OAuth scope SendCampaigns. This works only before the scheduled send time. Acts oncampaign Permission (capability) SendCampaignsVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| DELETE | /api/v3.3/campaigns/{campaignid}.json | Delete a campaign, or stop a scheduled send if it is before the scheduled time. | write | CreateCampaigns | Current | |
OAuth scope CreateCampaigns. Acts oncampaign Permission (capability) CreateCampaignsVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
SegmentsCreate, read, update, and delete a segment on a list, manage its rules, and read the subscribers it matches.5 | ||||||
| POST | /api/v3.3/segments/{listid}.json | Create a segment on a list, with a title and optional rule groups that filter subscribers. | write | ManageLists | Current | |
OAuth scope ManageLists. Acts onsegment Permission (capability) ManageListsVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| PUT | /api/v3.3/segments/{segmentid}.json | Update a segment's name and optionally replace all of its rules. | write | ManageLists | Current | |
OAuth scope ManageLists. If rules are omitted, the existing rules stay in place. Acts onsegment Permission (capability) ManageListsVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| GET | /api/v3.3/segments/{segmentid}.json | Get a segment's title, list, active subscriber count, and rule structure. | read | ViewReports | Current | |
OAuth scope ViewReports. Acts onsegment Permission (capability) ViewReportsVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| GET | /api/v3.3/segments/{segmentid}/active.json | Get a paged result of the active subscribers that match a segment's rules. | read | ViewSubscribersInReports | Current | |
OAuth scope ViewSubscribersInReports. Acts onsegment Permission (capability) ViewSubscribersInReportsVersionAvailable since the API’s base version Webhook eventNone Rate limitUp to 1,000 records per page SourceOfficial documentation ↗ | ||||||
| DELETE | /api/v3.3/segments/{segmentid}.json | Delete a segment from its list. | write | ManageLists | Current | |
OAuth scope ManageLists. Acts onsegment Permission (capability) ManageListsVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
Custom fieldsCreate, update, and delete the custom fields that store extra data against each subscriber on a list.3 | ||||||
| POST | /api/v3.3/lists/{listid}/customfields.json | Create a custom field on a list, such as a Text, Number, Date, or MultiSelectOne field. | write | ManageLists | Current | |
OAuth scope ManageLists. Acts oncustom field Permission (capability) ManageListsVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| PUT | /api/v3.3/lists/{listid}/customfields/{customfieldkey}.json | Update a custom field's name and preference-center visibility. | write | ManageLists | Current | |
OAuth scope ManageLists. Acts oncustom field Permission (capability) ManageListsVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| DELETE | /api/v3.3/lists/{listid}/customfields/{customfieldkey}.json | Delete a custom field from a list, which also removes any segment rules built on it. | write | ManageLists | Current | |
OAuth scope ManageLists. Acts oncustom field Permission (capability) ManageListsVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
ClientsCreate a client, read its details, lists, segments, and campaigns, manage its suppression list, and delete it.6 | ||||||
| POST | /api/v3.3/clients.json | Create a new client in the account with its basic contact details. | write | AdministerAccount | Current | |
OAuth scope AdministerAccount. Creating clients is an agency-level account feature. Acts onclient Permission (capability) AdministerAccountVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| GET | /api/v3.3/clients/{clientid}.json | Get a client's full details, including its own API key and billing settings. | read | ViewReports | Current | |
OAuth scope ViewReports. The response includes the client's own API key, which grants full access to that client. Acts onclient Permission (capability) ViewReportsVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| GET | /api/v3.3/clients/{clientid}/lists.json | Get all of the subscriber lists belonging to a client. | read | ViewReports | Current | |
OAuth scope ViewReports. Acts onclient Permission (capability) ViewReportsVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| GET | /api/v3.3/clients/{clientid}/campaigns.json | Get a client's sent campaigns, with filtering and pagination. | read | ViewReports | Current | |
OAuth scope ViewReports. Acts onclient Permission (capability) ViewReportsVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| POST | /api/v3.3/clients/{clientid}/suppress.json | Add one or more email addresses to a client's suppression list. | write | ManageLists | Current | |
OAuth scope ManageLists. Suppressed addresses are blocked from all of the client's future sends. Acts onclient Permission (capability) ManageListsVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| DELETE | /api/v3.3/clients/{clientid}.json | Delete a client from the account. | write | AdministerAccount | Current | |
OAuth scope AdministerAccount. Deleting a client removes its lists, campaigns, and reporting. Acts onclient Permission (capability) AdministerAccountVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
TemplatesCreate, read, update, and delete the email templates a client builds campaigns from.4 | ||||||
| POST | /api/v3.3/templates/{clientid}.json | Create a template for a client by naming it and supplying its content URLs. | write | ManageTemplates | Current | |
OAuth scope ManageTemplates. Acts ontemplate Permission (capability) ManageTemplatesVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| GET | /api/v3.3/templates/{templateid}.json | Get a template's details, including its name, ID, preview URL, and screenshot URL. | read | ViewReports | Current | |
OAuth scope ViewReports. Acts ontemplate Permission (capability) ViewReportsVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| PUT | /api/v3.3/templates/{templateid}.json | Update a template's name and content URLs. | write | ManageTemplates | Current | |
OAuth scope ManageTemplates. Acts ontemplate Permission (capability) ManageTemplatesVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| DELETE | /api/v3.3/templates/{templateid}.json | Delete a template by its ID. | write | ManageTemplates | Current | |
OAuth scope ManageTemplates. Acts ontemplate Permission (capability) ManageTemplatesVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
TransactionalSend a smart or classic transactional email, list smart emails, and read message timelines and statistics.6 | ||||||
| GET | /api/v3.3/transactional/smartEmail | List the smart transactional emails in an account, filtered by status. | read | ViewTransactional | Current | |
OAuth scope ViewTransactional. Transactional endpoints accept and return JSON only. Acts ontransactional email Permission (capability) ViewTransactionalVersionAvailable since the API’s base version Webhook eventNone Rate limitRate-limited, see response headers SourceOfficial documentation ↗ | ||||||
| GET | /api/v3.3/transactional/smartEmail/{smartEmailID} | Get the details of a single smart transactional email. | read | ViewTransactional | Current | |
OAuth scope ViewTransactional. Acts ontransactional email Permission (capability) ViewTransactionalVersionAvailable since the API’s base version Webhook eventNone Rate limitRate-limited, see response headers SourceOfficial documentation ↗ | ||||||
| POST | /api/v3.3/transactional/smartEmail/{smartEmailID}/send | Send a smart transactional email, with optional merge variables and attachments. | write | SendTransactional | Current | |
OAuth scope SendTransactional. The content is managed in Campaign Monitor; the call supplies the recipient and variables. Acts ontransactional email Permission (capability) SendTransactionalVersionAvailable since the API’s base version Webhook eventNone Rate limitRate-limited, see response headers SourceOfficial documentation ↗ | ||||||
| POST | /api/v3.3/transactional/classicEmail/send | Send a classic transactional email with the full content supplied in the request. | write | SendTransactional | Current | |
OAuth scope SendTransactional. Unlike a smart email, the request carries the entire message body. Acts ontransactional email Permission (capability) SendTransactionalVersionAvailable since the API’s base version Webhook eventNone Rate limitRate-limited, see response headers SourceOfficial documentation ↗ | ||||||
| GET | /api/v3.3/transactional/statistics | Get delivery and engagement metrics for transactional email, optionally filtered by type or date. | read | ViewTransactional | Current | |
OAuth scope ViewTransactional. Acts ontransactional email Permission (capability) ViewTransactionalVersionAvailable since the API’s base version Webhook eventNone Rate limitRate-limited, see response headers SourceOfficial documentation ↗ | ||||||
| GET | /api/v3.3/transactional/messages | List sent transactional messages, with pagination and status filtering. | read | ViewTransactional | Current | |
OAuth scope ViewTransactional. Acts ontransactional email Permission (capability) ViewTransactionalVersionAvailable since the API’s base version Webhook eventNone Rate limitRate-limited, see response headers SourceOfficial documentation ↗ | ||||||
WebhooksList, create, delete, activate, and deactivate the webhooks that notify an app of subscriber changes on a list.4 | ||||||
| GET | /api/v3.3/lists/{listid}/webhooks.json | List the webhooks on a list, with their subscribed events and status. | read | ManageLists | Current | |
OAuth scope ManageLists. Acts onwebhook Permission (capability) ManageListsVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| POST | /api/v3.3/lists/{listid}/webhooks.json | Create a webhook on a list for Subscribe, Update, or Deactivate events. | write | ManageLists | Current | |
OAuth scope ManageLists. The chosen events and the receiver URL are set when the webhook is created. Acts onwebhook Permission (capability) ManageListsVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| DELETE | /api/v3.3/lists/{listid}/webhooks/{webhookid}.json | Delete a webhook from a list. | write | ManageLists | Current | |
OAuth scope ManageLists. Acts onwebhook Permission (capability) ManageListsVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| PUT | /api/v3.3/lists/{listid}/webhooks/{webhookid}/activate.json | Activate a webhook that has been deactivated. | write | ManageLists | Current | |
OAuth scope ManageLists. Campaign Monitor automatically deactivates a webhook after sustained delivery failures over a week. Acts onwebhook Permission (capability) ManageListsVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
Campaign Monitor can notify an app or AI agent when subscribers on a list change, instead of the app repeatedly asking. It posts batched events to a webhook URL that has been registered on that list.
| Event | What it signals | Triggered by |
|---|---|---|
Subscribe | Fires when a subscriber joins a list, is manually added, imported, or activated. | /api/v3.3/subscribers/{listid}.json/api/v3.3/subscribers/{listid}/import.json |
Update | Fires when a subscriber's details change through editing, re-importing, or an API call. | /api/v3.3/subscribers/{listid}.json?email={email} |
Deactivate | Fires when a subscriber unsubscribes, bounces, reports spam, or is removed from a list. | /api/v3.3/subscribers/{listid}/unsubscribe.json/api/v3.3/subscribers/{listid}.json?email={email} |
Campaign Monitor limits how much an app or AI agent can read at once through fixed-size paged results, and rate-limits the transactional email endpoints separately with request-quota headers on each response.
Most of the Campaign Monitor API has no published per-second request quota; the constraints are on how much is read or written at once. Reads return fixed-size paged results, and the subscriber import accepts at most 1,000 records per request, with a larger batch rejected outright. The transactional endpoints are rate-limited separately: each response carries X-RateLimit-Limit, X-RateLimit-Remaining, and X-RateLimit-Reset headers, and going over returns HTTP 429.
List endpoints that return subscribers or campaign results, like a list's active subscribers or a campaign's recipients, return a paged result of up to 1,000 records per page, with the page number, page size, order field, and order direction set through query parameters. Following pages are fetched by incrementing the page number until the result is empty.
The subscriber import accepts at most 1,000 records in a single request, and a batch larger than that is rejected and must be split. Paged read endpoints return at most 1,000 records per page. Requests and responses are JSON or XML, except the transactional endpoints, which are JSON only.
The status codes an agent should handle, and what to do about each.
| Status | Code | Meaning | What to do |
|---|---|---|---|
| 400 | Bad Request | The input is invalid. The body carries a numeric Code and a Message naming the problem, such as 100 for an invalid API key, 102 for an invalid client ID, or 250 for a list title that is not unique within a client. | Read the Code and Message, correct the named input, and resend. |
| 401 | Unauthorized | The credentials are missing or invalid, or an OAuth token is invalid (Code 120), expired (Code 121), or revoked (Code 122). | Check the API key or OAuth token, refreshing an expired token before retrying. |
| 403 | Forbidden | The call targets an agency-only feature that the authenticated customer is not entitled to use. | Use an account with the required agency entitlement, or omit the agency-only call. |
| 404 | Not Found | The resource named in the path does not exist, such as an unknown list, campaign, or subscriber. | Confirm the ID in the path is correct and the resource still exists. |
| 429 | Too Many Requests | A transactional endpoint's rate limit was exceeded. The X-RateLimit-Limit, X-RateLimit-Remaining, and X-RateLimit-Reset headers report the quota and when it resets. | Wait until the reset time in the X-RateLimit-Reset header, then retry. |
| 500 | Internal Server Error | An unexpected error occurred on Campaign Monitor's side. | Retry after a short delay, and contact support if it persists. |
Campaign Monitor versions its API by number in the request path. The current version is v3.3, and earlier versions like v3.2 keep working so an integration moves up when it chooses.
Version 3.3 is the current API version. It added pagination and performance improvements when requesting campaigns, a campaign tagging endpoint, subscriber list-join-date tracking, journey copying, template copying, and triggering of subscriber-activity journeys. Subscriber endpoints gained ListJoinedDate, MobileNumber, and ConsentToSendSms fields, with SMS consent returned when a mobile number is present. Earlier versions like v3.2 keep working, so an integration upgrades by changing the version segment in its paths.
Version 3.2 was the prior API version, superseded by v3.3. It remains reachable at its own version segment in the request path, so an integration written against it keeps working until it chooses to move up to v3.3.
An integration pins a version in the path and moves up on a schedule that suits it.
Campaign Monitor API what's new ↗Bollard AI sits between a team's AI agents and Campaign Monitor. Grant each agent exactly the access it needs, read or write, resource by resource, and every call is checked and logged.