Constant Contact’s API v3 is the modern REST API for programmatic access to contacts, campaigns, tags, activities, and reports. OAuth 2.0 authentication, JSON payloads, per-endpoint rate limits documented publicly, decent SDK ecosystem via community wrappers. What Constant Contact does NOT ship in 2026: an official Model Context Protocol server. AI-agent access comes from community MCP wrappers (BusyBee3333, viasocket) rather than first-party. This tab inventories the API surface, MCP alternatives, and the gotchas SMB developers need to evaluate before committing.
Model Context Protocol is the emerging standard for connecting LLM agents to external tools. Constant Contact does not yet ship a first-party MCP server — unusual for a mature ESP with the market position Constant Contact holds. The gap has been filled by two community and commercial MCP options that cover most Constant Contact operations.
Constant Contact has not shipped an official Model Context Protocol server as of August 2026. This is a notable gap given Klaviyo shipped GA and MailerSend has a hosted BETA. AI-agent access to Constant Contact currently comes from two community/commercial routes: the BusyBee3333 community MCP (100+ tools for API v3) and the viasocket hosted MCP (commercial, managed authentication). Both are functional but neither is Constant Contact-endorsed. If you need first-party MCP, wait for Constant Contact’s announcement or use one of the alternatives below.
Three ways to reach Constant Contact from an AI agent as of August 2026. None are first-party maintained.
Most complete community MCP for Constant Contact. 100+ tools covering API v3 contacts, campaigns, tags, activities, reports. Open source. Requires self-hosting and OAuth setup.
Commercial hosted MCP server. Managed authentication, prompt injection defense, observability. Pay-per-use pricing. No self-hosting required.
Bridge access via Zapier’s MCP layer (9,000+ integrations available through one endpoint). Useful if you already run Zapier. Each MCP tool call consumes Zapier task credits.
Constant Contact’s API v3 follows REST conventions with OAuth 2.0 authentication. The predecessor API v2 is deprecated and pre-2020 integrations must migrate to v3.
| Base URL | https://api.cc.email/v3 |
|---|---|
| Response format | JSON |
| Authentication | OAuth 2.0 (three-leg flow, refresh tokens required) |
| Access token lifetime | 2 hours (auto-refresh via refresh token) |
| Refresh token lifetime | Long-lived (rotates on each refresh) |
| Rate limits | Per-endpoint (see rate-limits section) |
| Response on rate exceed | HTTP 429 with Retry-After header |
| Pagination | Cursor-based via _link objects (max page size 500) |
| Bulk operations | Async job endpoints for contact imports |
| Legacy API v2 status | Deprecated. Migrate to v3 immediately. |
API v3 uses OAuth 2.0 exclusively — there are no simple API-key endpoints. Setup takes 15-30 minutes for OAuth configuration, but the security profile is stronger than v2 (which used API keys). If you are used to Mailchimp-style API-key authentication, expect a learning curve on OAuth token refresh handling.
Constant Contact API v3 requires OAuth 2.0. Register an application at v3.developer.constantcontact.com to receive Client ID and Client Secret. Implement the three-leg authorization code flow to obtain access tokens on behalf of Constant Contact users.
# 1. Redirect user to authorization endpoint GET https://authz.constantcontact.com/oauth2/default/v1/authorize ?client_id=YOUR_CLIENT_ID &redirect_uri=YOUR_REDIRECT_URI &response_type=code &scope=contact_data+campaign_data+account_read # 2. Exchange authorization code for tokens POST https://authz.constantcontact.com/oauth2/default/v1/token Authorization: Basic BASE64(CLIENT_ID:CLIENT_SECRET) grant_type=authorization_code code=RECEIVED_CODE redirect_uri=YOUR_REDIRECT_URI # 3. Use access token in API requests GET https://api.cc.email/v3/contacts Authorization: Bearer YOUR_ACCESS_TOKEN
Access tokens expire after 2 hours. Refresh tokens rotate on each refresh — always store the newest refresh token from every refresh response. Losing the refresh token requires re-authorization by the user.
Constant Contact publishes per-endpoint rate limits with two-tier throttling (short-term and daily).
| Limit type | Value | Notes |
|---|---|---|
| General API requests | 10,000 per day | Per access token. Resets at midnight UTC. |
| Short-term burst | 4 requests per second | Per access token, rolling window. |
| Response on exceed | HTTP 429 | Too Many Requests. Includes Retry-After header with wait time in seconds. |
| Bulk contact import (async) | Separate job-based limit | Preferred over looping single-contact POST for large imports. |
| Webhook payload size | Not disclosed | Standard SaaS webhook conventions apply. |
The 10,000 daily / 4-per-second limits are generous for SMB use cases but insufficient for large-scale programmatic workflows (bulk data warehousing, real-time analytics). For those needs, use bulk contact import jobs and cache aggressively client-side.
Constant Contact ships two official SDKs and endorses community wrappers for other languages.
| Language | Package | Install | Status |
|---|---|---|---|
| PHP | constantcontact/constantcontact | composer require | Official |
| Node.js | Community wrappers | npm install | Community (multiple) |
| Python | Community wrappers | pip install | Community (multiple) |
| Ruby | Community wrappers | gem install | Community |
| .NET | Community wrappers | NuGet | Community |
Constant Contact’s official SDK footprint is thinner than Klaviyo (5 official) or Mailchimp (4 official Marketing). For non-PHP languages, community wrappers exist but quality varies — audit maintenance status and last-commit dates before adopting. Many teams call the API directly with their language’s HTTP client rather than depending on a community SDK that may become abandoned.
The endpoint groups you will actually use in production. Full reference at v3.developer.constantcontact.com.
| Resource | HTTP methods | Description |
|---|---|---|
| Contacts /contacts | GET, POST, PUT, DELETE | Full CRUD on contacts. Bulk import via async job endpoints. |
| Contact custom fields /contact_custom_fields | GET, POST, PUT, DELETE | Manage custom fields for contact profile enrichment. |
| Contact lists /contact_lists | GET, POST, PUT, DELETE | Manage static contact lists. Add or remove members via list membership endpoints. |
| Contact tags /contact_tags | GET, POST, PUT, DELETE | Manage tags. Tag-based segmentation for campaign targeting. |
| Segments /segments | GET | Read dynamic segments defined in the UI. Segment creation is UI-only. |
| Email campaigns /emails | GET, POST, PATCH, DELETE | Full CRUD on email campaigns. Schedule, cancel, send. Reports subresource. |
| Email schedule /emails/{id}/schedules | POST, GET, DELETE | Schedule campaign send at a specific datetime. Cancel scheduled sends. |
| Activities (bulk actions) /activities | GET, POST | Bulk operations queue (imports, exports, list moves). Async job status polling. |
| Reports /reports | GET | Campaign performance reports (opens, clicks, bounces, unsubscribes). |
| Account /account | GET, PATCH | Account profile, physical address, sender email management. |
| Webhooks /webhooks | GET, POST, PUT, DELETE | Configure webhook subscriptions for contact and campaign events. |
const axios = require('axios');
const ACCESS_TOKEN = 'YOUR_ACCESS_TOKEN';
const BASE_URL = 'https://api.cc.email/v3';
async function createContact(email, firstName, listId) {
// 1. Create contact with list membership
const response = await axios.post(
`${BASE_URL}/contacts`,
{
email_address: { address: email, permission_to_send: 'implicit' },
first_name: firstName,
list_memberships: [listId],
create_source: 'Account'
},
{ headers: { Authorization: `Bearer ${ACCESS_TOKEN}` } }
);
console.log(`Contact created: ${response.data.contact_id}`);
return response.data;
}
createContact('user@example.com', 'Alaa', 'YOUR_LIST_ID')
.catch(err => console.error(err.response?.data || err.message));<?php
require 'vendor/autoload.php';
use GuzzleHttpClient;
$client = new Client(['base_uri' => 'https://api.cc.email/v3/']);
$accessToken = 'YOUR_ACCESS_TOKEN';
// Create schedule for existing campaign
$response = $client->post("emails/{$campaignId}/schedules", [
'headers' => ['Authorization' => "Bearer {$accessToken}"],
'json' => ['scheduled_date' => '2026-08-20T14:00:00Z']
]);
echo "Scheduled: " . $response->getBody();Constant Contact rotates the refresh token on every refresh response. If you store only the initial refresh token and never update it, subsequent refreshes fail after the first rotation. Always persist the latest refresh token from every refresh response.
The legacy Constant Contact API v2 is deprecated. All new integrations must use v3. If you inherited a v2 integration, migrate promptly — Constant Contact has communicated shutoff plans and v2 will stop working. Note: v3 uses different endpoint paths, OAuth 2.0 (v2 used API keys), and different response shapes. Not a drop-in replacement.
The API can read dynamic segments (GET /segments) but cannot create or modify them programmatically. Segments are UI-only. For API-managed groupings, use contact_lists (fully CRUD) or contact_tags (fully CRUD).
Constant Contact access tokens have a 2-hour lifetime. Long-running processes must implement automatic refresh logic. Failing to refresh returns 401 responses. Best practice: refresh proactively at the 1.5-hour mark, or implement a refresh-on-401 retry pattern.
Only PHP and Node.js have officially maintained clients. For Python, Ruby, .NET, community wrappers exist but quality and maintenance status vary widely. Check last-commit date, open-issues count, and downloads/week before betting a production integration on a community SDK. Direct HTTP client calls are often safer than an abandoned SDK.
Constant Contact maintains developer release notes at v3.developer.constantcontact.com. Key items:
No. Constant Contact does not ship a first-party MCP server as of August 2026. AI-agent access comes from community/commercial routes: the BusyBee3333 community MCP (100+ tools for API v3) or the viasocket hosted MCP (commercial, managed authentication). Watch for an official announcement in the next 12-18 months given competitor movement (Klaviyo GA, MailerSend BETA).
Two officially maintained SDKs: PHP and Node.js. For other languages (Python, Ruby, .NET, Java, Go), community wrappers exist but quality varies. Audit last-commit date and maintenance status before adopting a community SDK. Direct HTTP client calls are often safer than an abandoned SDK.
Two tiers per access token: 10,000 requests per day (resets at UTC midnight) and 4 requests per second short-term burst. HTTP 429 responses include a Retry-After header with exact wait time. For bulk operations, use the async activity endpoints instead of looping single-record POSTs.
OAuth 2.0 only — no simple API-key endpoints. Register an app at v3.developer.constantcontact.com to get Client ID + Client Secret. Implement three-leg authorization code flow. Access tokens expire after 2 hours; refresh tokens rotate on each refresh. Always store the newest refresh token from every refresh response.
Deprecated. Constant Contact has communicated a shutoff timeline for API v2. All new development must use v3. Legacy v2 integrations should migrate promptly — v3 uses different endpoint paths, OAuth 2.0 (v2 used API keys), and different response shapes. Not a drop-in replacement.
Yes, via community MCP. Install the BusyBee3333 community MCP server (100+ tools, self-hosted) or subscribe to the viasocket hosted MCP (commercial, managed OAuth). Both let AI agents create contacts, send campaigns, manage tags, and pull reports through natural language. No first-party MCP from Constant Contact yet.
Contact lists are static (manually managed) and fully CRUD-able via API. Segments are dynamic (rules-based membership) and API read-only — segment creation is UI-only. Use contact_lists when you need programmatic membership control. Use segments when the membership logic must be UI-editable and dynamic.
This review follows our email infrastructure testing methodology. We disclose affiliate relationships in our editorial independence policy.