A reference guide for building AI agents: every method, how to authenticate, and the permissions each one needs.
The Constant Contact API is how an app or AI agent works with a Constant Contact account: adding and updating contacts, organizing them into lists, tags, and segments, building and scheduling email campaigns, and reading who opened or clicked. Access is granted through an OAuth access token whose scopes decide which areas a call can reach, like contact data, campaign data, or account settings, and a call outside its scopes is refused. It runs as a single continuously updated API, where new endpoints and fields arrive through monthly release notes rather than dated versions.
How an app or AI agent connects to Constant Contact determines what it can reach. Access runs through the V3 API, authorized by OAuth, and the permissions that the access token carries decide which contacts, campaigns, and account data a call can read or change.
The V3 REST API answers at https://api.cc.email/v3. It accepts JSON request bodies, returns JSON responses, and pages through collections with a cursor carried in a next link. Every call sends an OAuth access token in the Authorization header, and TLS 1.2 or better is required.
Constant Contact offers webhooks only to partner integrations, and only for billing and account events, like a plan change or a new account. A partner subscribes per topic, and Constant Contact POSTs a notification with a URL to fetch the event details. There are no webhooks for contact or campaign activity, so a regular integration polls the API instead.
A server-side app sends the user to authorize at authz.constantcontact.com, receives a short-lived authorization code, and exchanges it for an access token using its client_id and client_secret. This is the recommended flow because the client secret stays on the server. Adding the offline_access scope returns a refresh token.
The PKCE flow is the authorization code flow hardened for apps that cannot keep a secret, like a single-page or mobile app. The app proves it started the request with a code verifier instead of a client secret, then exchanges the authorization code for an access token.
The implicit flow returns an access token directly to a browser app without a server exchange. It cannot return a refresh token, so the user must re-authorize when the token expires, and Constant Contact points new integrations to the PKCE flow instead.
The Constant Contact API is split into areas an agent can act on, like contacts, contact lists, email campaigns, segments, and reporting. Each area has its own methods, and writes in some areas send live email or change who is on a list.
Create, read, update, and delete contacts, and create or update a contact through a sign-up form.
Create, read, update, and delete the lists that contacts belong to.
Create, read, rename, and delete tags, the labels used to group contacts.
Create, read, update, and delete the custom fields stored on contacts.
Create, read, update, and delete segments, the saved rules that select contacts.
Run background jobs that import, export, delete, or list-tag many contacts in one call, and check a job's status.
Create, read, list, rename, and delete email campaigns.
Read and edit a campaign's email content, send a test, and schedule or unschedule the send.
Read and update account summary details and list the account's verified email addresses.
Read campaign summary counts and per-campaign tracking, like who was sent, opened, clicked, bounced, or opted out.
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 | |
|---|---|---|---|---|---|---|
ContactsCreate, read, update, and delete contacts, and create or update a contact through a sign-up form.6 | ||||||
| GET | /v3/contacts | Get a collection of contacts, with optional filters like email, status, or list membership. | read | contact_data | Current | |
Read-only. The contact_data scope governs every /contacts endpoint. Acts oncontact Permission (capability) contact_dataVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| GET | /v3/contacts/{contact_id} | Get a single contact by its contact_id. | read | contact_data | Current | |
Read-only. Acts oncontact Permission (capability) contact_dataVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| POST | /v3/contacts | Create a new contact. | write | contact_data | Current | |
A core write. Creating a contact with an email that already exists returns a 409. Acts oncontact Permission (capability) contact_dataVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| PUT | /v3/contacts/{contact_id} | Update an existing contact. The PUT replaces the contact, so all fields to keep must be included. | write | contact_data | Current | |
This is a full replace; omitted fields, including custom field values, are cleared. Acts oncontact Permission (capability) contact_dataVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| DELETE | /v3/contacts/{contact_id} | Delete a contact, which also removes its list memberships. | write | contact_data | Current | |
Deleting a contact removes any list memberships but does not remove it from the account's billed contact count until purged. Acts oncontact Permission (capability) contact_dataVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| POST | /v3/contacts/sign_up_form | Create or update a contact as if they submitted a sign-up form, adding them to lists. | write | contact_data | Current | |
Treats the contact as having opted in through a form, so it can resubscribe a previously unsubscribed contact. Acts oncontact Permission (capability) contact_dataVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
Contact listsCreate, read, update, and delete the lists that contacts belong to.5 | ||||||
| GET | /v3/contact_lists | Get a collection of the account's contact lists. | read | contact_data | Current | |
Read-only. The contact_data scope governs every /contact_lists endpoint. Acts oncontact_list Permission (capability) contact_dataVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| GET | /v3/contact_lists/{list_id} | Get a single contact list by its list_id. | read | contact_data | Current | |
Read-only. Acts oncontact_list Permission (capability) contact_dataVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| POST | /v3/contact_lists | Create a new contact list. | write | contact_data | Current | |
A list name that already exists returns a 409. Acts oncontact_list Permission (capability) contact_dataVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| PUT | /v3/contact_lists/{list_id} | Update a contact list's name or description. | write | contact_data | Current | |
A core write. Acts oncontact_list Permission (capability) contact_dataVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| DELETE | /v3/contact_lists/{list_id} | Delete a contact list. This is a background activity that removes the list, not its contacts. | write | contact_data | Current | |
Runs as an asynchronous activity; deleting the list does not delete its contacts. Acts oncontact_list Permission (capability) contact_dataVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
TagsCreate, read, rename, and delete tags, the labels used to group contacts.5 | ||||||
| GET | /v3/contact_tags | Get details about all tags on the account. | read | contact_data | Current | |
Read-only. A tag is a label used to group contacts. Acts ontag Permission (capability) contact_dataVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| GET | /v3/contact_tags/{tag_id} | Get a single tag's details by its tag_id. | read | contact_data | Current | |
Read-only. Acts ontag Permission (capability) contact_dataVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| POST | /v3/contact_tags | Create a new tag. | write | contact_data | Current | |
An account is limited to 500 tags. Acts ontag Permission (capability) contact_dataVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| PUT | /v3/contact_tags/{tag_id} | Rename a tag. | write | contact_data | Current | |
A core write. Acts ontag Permission (capability) contact_dataVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| DELETE | /v3/contact_tags/{tag_id} | Delete a tag, removing it from every contact it is applied to. | write | contact_data | Current | |
Removes the tag from all contacts; the contacts themselves are not deleted. Acts ontag Permission (capability) contact_dataVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
Custom fieldsCreate, read, update, and delete the custom fields stored on contacts.5 | ||||||
| GET | /v3/contact_custom_fields | Get a collection of the account's custom fields. | read | contact_data | Current | |
Read-only. The contact_data scope governs every /contact_custom_fields endpoint. Acts oncustom_field Permission (capability) contact_dataVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| GET | /v3/contact_custom_fields/{custom_field_id} | Get a single custom field by its custom_field_id. | read | contact_data | Current | |
Read-only. Acts oncustom_field Permission (capability) contact_dataVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| POST | /v3/contact_custom_fields | Create a new custom field that can hold extra data on contacts. | write | contact_data | Current | |
An account is limited to 100 custom fields. Acts oncustom_field Permission (capability) contact_dataVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| PUT | /v3/contact_custom_fields/{custom_field_id} | Update a custom field's name. | write | contact_data | Current | |
A core write. Acts oncustom_field Permission (capability) contact_dataVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| DELETE | /v3/contact_custom_fields/{custom_field_id} | Delete a custom field, removing its values from all contacts. | write | contact_data | Current | |
Removes the field's stored value from every contact. Acts oncustom_field Permission (capability) contact_dataVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
SegmentsCreate, read, update, and delete segments, the saved rules that select contacts.5 | ||||||
| GET | /v3/segments | Get a collection of the account's segments. | read | contact_data | Current | |
Read-only. A segment is a saved rule that selects contacts by criteria like activity, list, or contact details. Acts onsegment Permission (capability) contact_dataVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| GET | /v3/segments/{segment_id} | Get a single segment, including its selection criteria. | read | contact_data | Current | |
Read-only. Acts onsegment Permission (capability) contact_dataVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| POST | /v3/segments | Create a new segment with a name and selection criteria. | write | contact_data | Current | |
An account is limited to 100 segments. Acts onsegment Permission (capability) contact_dataVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| PUT | /v3/segments/{segment_id} | Update a segment's name and criteria. Both name and segment_criteria must be supplied. | write | contact_data | Current | |
Both name and segment_criteria are required even when changing only one. Acts onsegment Permission (capability) contact_dataVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| DELETE | /v3/segments/{segment_id} | Delete a segment. The contacts it selected are not affected. | write | contact_data | Current | |
Deletes the rule, not the contacts it matched. Acts onsegment Permission (capability) contact_dataVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
Bulk activitiesRun background jobs that import, export, delete, or list-tag many contacts in one call, and check a job's status.7 | ||||||
| GET | /v3/activities/{activity_id} | Get the status of a bulk activity job, used to learn when an import, export, or delete has finished. | read | contact_data | Current | |
Read-only. A job runs asynchronously; poll about once every 30 seconds until it completes. Acts onactivity Permission (capability) contact_dataVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| POST | /v3/activities/contacts_json_import | Start a background job that imports or updates many contacts from a JSON payload. | write | contact_data | Current | |
Accepts up to 500 contacts per call. Returns an activity_id to poll for completion. Acts onactivity Permission (capability) contact_dataVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| POST | /v3/activities/contacts_file_import | Start a background job that imports contacts from an uploaded CSV file. | write | contact_data | Current | |
Uses a multipart form upload rather than a JSON body. Returns an activity_id to poll. Acts onactivity Permission (capability) contact_dataVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| POST | /v3/activities/add_list_memberships | Start a background job that adds many contacts to one or more lists. | write | contact_data | Current | |
Selects contacts by contact_ids, list_ids, segment_id, or all_active_contacts. Acts onactivity Permission (capability) contact_dataVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| POST | /v3/activities/remove_list_memberships | Start a background job that removes many contacts from one or more lists. | write | contact_data | Current | |
Removes list membership only; the contacts are not deleted. Acts onactivity Permission (capability) contact_dataVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| POST | /v3/activities/contacts_delete | Start a background job that deletes many contacts in one call. | write | contact_data | Current | |
Selects contacts to delete by contact_ids, list_ids, or segment_id. Acts onactivity Permission (capability) contact_dataVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| POST | /v3/activities/contacts_export | Start a background job that exports selected contacts and fields to a CSV file. | write | contact_data | Current | |
Runs as a write activity even though it reads data, because it creates an export job. The CSV is fetched once the job completes. Acts onactivity Permission (capability) contact_dataVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
Email campaignsCreate, read, list, rename, and delete email campaigns.5 | ||||||
| GET | /v3/emails | Get a collection of the account's email campaigns. | read | campaign_data | Current | |
Read-only. The campaign_data scope governs every /emails endpoint. Acts onemail_campaign Permission (capability) campaign_dataVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| GET | /v3/emails/{campaign_id} | Get a single email campaign, including the IDs of its campaign activities. | read | campaign_data | Current | |
Read-only. Acts onemail_campaign Permission (capability) campaign_dataVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| POST | /v3/emails | Create a new email campaign, which also creates its primary email campaign activity. | write | campaign_data | Current | |
A campaign name that already exists returns a 409. Acts onemail_campaign Permission (capability) campaign_dataVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| PATCH | /v3/emails/{campaign_id} | Rename an email campaign. | write | campaign_data | Current | |
Changes the campaign name only; the email content is edited through the campaign activity. Acts onemail_campaign Permission (capability) campaign_dataVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| DELETE | /v3/emails/{campaign_id} | Delete an email campaign and its activities. | write | campaign_data | Current | |
An email that has already been sent cannot be deleted. Acts onemail_campaign Permission (capability) campaign_dataVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
Campaign activitiesRead and edit a campaign's email content, send a test, and schedule or unschedule the send.6 | ||||||
| GET | /v3/emails/activities/{campaign_activity_id} | Get a campaign activity, the editable email content for a campaign. | read | campaign_data | Current | |
Read-only. A campaign activity holds the subject, from address, and HTML for one send. Acts oncampaign_activity Permission (capability) campaign_dataVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| PUT | /v3/emails/activities/{campaign_activity_id} | Update a campaign activity's email content, like its subject, from address, and HTML. | write | campaign_data | Current | |
Only a campaign in draft can be edited; an already scheduled or sent activity cannot. Acts oncampaign_activity Permission (capability) campaign_dataVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| POST | /v3/emails/activities/{campaign_activity_id}/tests | Send a test of the campaign activity to up to five email addresses. | write | campaign_data | Current | |
Sends real email to the test recipients, but not to the campaign's contact lists. Acts oncampaign_activity Permission (capability) campaign_dataVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| POST | /v3/emails/activities/{campaign_activity_id}/schedules | Schedule the campaign activity to send, immediately or at a future time. | write | campaign_data | Current | |
This sends live email to every contact on the campaign's lists once the scheduled time arrives. Acts oncampaign_activity Permission (capability) campaign_dataVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| GET | /v3/emails/activities/{campaign_activity_id}/schedules | Get the schedule set on a campaign activity. | read | campaign_data | Current | |
Read-only. Acts oncampaign_activity Permission (capability) campaign_dataVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| DELETE | /v3/emails/activities/{campaign_activity_id}/schedules | Unschedule a campaign activity, returning it to draft before it sends. | write | campaign_data | Current | |
Only works before the scheduled send time is reached. Acts oncampaign_activity Permission (capability) campaign_dataVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
AccountRead and update account summary details and list the account's verified email addresses.3 | ||||||
| GET | /v3/account/summary | Get a summary of account details, like the organization name and contact information. | read | account_read | Current | |
Read-only. Use the extra_fields parameter to also return physical_address or company_logo. Acts onaccount Permission (capability) account_readVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| PUT | /v3/account/summary | Update account summary details, like the organization name and contact information. | write | account_update | Current | |
Needs the account_update scope, which is separate from the account_read scope used to read account data. Acts onaccount Permission (capability) account_updateVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| GET | /v3/account/emails | Get the collection of email addresses on the account and their verification status. | read | account_read | Current | |
Read-only. Only a verified address can be used as a campaign's from or reply-to address. Acts onaccount_email Permission (capability) account_readVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
ReportingRead campaign summary counts and per-campaign tracking, like who was sent, opened, clicked, bounced, or opted out.6 | ||||||
| GET | /v3/reports/summary_reports/email_campaign_summaries | Get summary tracking counts for up to 500 of the account's most recent email campaigns. | read | campaign_data | Current | |
Read-only. Reporting uses the campaign_data scope and the ui:campaign:metrics user privilege. Acts onreport Permission (capability) campaign_dataVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| GET | /v3/reports/email_reports/{campaign_activity_id}/tracking/sends | Get the contacts a campaign activity was sent to. | read | campaign_data | Current | |
Read-only; returns contact-level data including email addresses. Acts onreport Permission (capability) campaign_dataVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| GET | /v3/reports/email_reports/{campaign_activity_id}/tracking/opens | Get the contacts that opened a campaign activity. | read | campaign_data | Current | |
Read-only; returns contact-level engagement data. Acts onreport Permission (capability) campaign_dataVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| GET | /v3/reports/email_reports/{campaign_activity_id}/tracking/clicks | Get the contacts that clicked a link in a campaign activity. | read | campaign_data | Current | |
Read-only; returns contact-level engagement data. Acts onreport Permission (capability) campaign_dataVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| GET | /v3/reports/email_reports/{campaign_activity_id}/tracking/bounces | Get the contacts whose copy of a campaign activity bounced. | read | campaign_data | Current | |
Read-only; returns contact-level data. Acts onreport Permission (capability) campaign_dataVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| GET | /v3/reports/email_reports/{campaign_activity_id}/tracking/optouts | Get the contacts that opted out (unsubscribed) from a campaign activity. | read | campaign_data | Current | |
Read-only; returns contact-level data. Acts onreport Permission (capability) campaign_dataVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
Constant Contact pushes events only to partner integrations, and only for billing and account changes, like a plan being upgraded or an account being created. A regular integration learns about contact and campaign changes by calling the API rather than by receiving a push.
| Event | What it signals | Triggered by |
|---|
Constant Contact limits how fast and how much an app or AI agent can call, through a daily request quota and a separate per-second ceiling, both tied to the application's API key.
Constant Contact meters requests against the application's API key, not per user. The key allows up to 10,000 requests per day and 4 requests per second, with the daily count resetting at UTC 00:00:00. Going over returns HTTP 429: an error_key of quota_exceeded for the daily limit and throttled for the per-second limit. Bulk activity jobs have their own ceiling, with at most 1,000 queued activities at a time.
Collection endpoints are cursor-based. A limit parameter sets the page size, and each response includes a _links object with a next href that carries an opaque cursor; following that link returns the next page until no next link remains. The cursor should be used as given rather than constructed by hand.
A bulk JSON contact import accepts up to 500 contacts per call, and add_list_memberships takes up to 500 contact_ids or 50 list_ids. The campaign summary report covers up to 500 of the most recent campaigns. An account is capped at 100 custom fields, 100 segments, and 500 tags. A test send goes to at most 5 addresses.
The status codes an agent should handle, and what to do about each.
| Status | Code | Meaning | What to do |
|---|---|---|---|
| 400 | Bad Request | The request includes malformed JSON or does not match the expected schema, like a missing required field or a contact_id in an invalid format. | Fix the JSON or the field against the schema before resending; do not retry the same body unchanged. |
| 401 | Unauthorized | The access token is missing, invalid, or expired. Access tokens last 24 hours. | Refresh the access token using the refresh token, then resend with a valid Bearer token. |
| 403 | Forbidden | The token lacks the scope the endpoint needs, the user lacks the required privilege, or the application is deactivated. For example, calling a /contacts endpoint without the contact_data scope returns 403. | Re-authorize with the right scope, like contact_data or campaign_data, or check the account's user privileges. |
| 404 | Not Found | The requested resource does not exist, or the path is misspelled or malformed. | Verify the resource id and the request path. |
| 409 | Conflict | A create or update would collide with a name that already exists, like a duplicate list name, campaign name, or account email address. | Use a unique name, or update the existing resource instead of creating a new one. |
| 415 | Unsupported Media Type | The Content-Type header does not match what the endpoint expects, for example sending a body that is not application/json. | Set Content-Type to application/json (or multipart form for file import) to match the endpoint. |
| 429 | Too Many Requests | A rate limit was hit. The error_key is quota_exceeded for the daily limit and throttled for the per-second limit; the bulk-activity queue is also capped at 1,000 jobs. | Slow the request rate below 4 per second, and wait for the daily reset at UTC 00:00 when the daily quota is hit. |
| 500 | Server Error | An unexpected condition on Constant Contact's side. It is rare. | Retry after a short delay, and contact support if it persists. |
| 503 | Service Unavailable | The service is temporarily unavailable. | Back off and retry after a delay. |
Constant Contact runs a single, continuously updated V3 API rather than dated versions. New endpoints and fields ship through monthly release notes without minting a new version string.
The V3 API is the single live API at api.cc.email/v3. It is not versioned by date; new endpoints and fields ship through monthly release notes rather than a new version string. The entries below are notable additions from those release notes, newest first, grouped by period.
Additive feature releases during 2025, shipped to the same live V3 API.
Additive feature releases during 2024, shipped to the same live V3 API.
There is one live API; track the release notes for new endpoints and fields.
Constant Contact V3 API release notes ↗Bollard AI sits between a team's AI agents and Constant Contact. Grant each agent exactly the access it needs, read or write, resource by resource, and every call is checked and logged.