Constant Contact
Constant Contact API integration with managed OAuth. Manage contacts, email campaigns, lists, segments, and marketing automation. Use this skill when users want to manage email marketing campaigns, co
Constant Contact API integration with managed OAuth. Manage contacts, email campaigns, lists, segments, and marketing automation. Use this skill when users want to manage email marketing campaigns, co
Real data. Real impact.
Emerging
Developers
Per week
Open source
Skills give you superpowers. Install in 30 seconds.
Access the Constant Contact V3 API with managed OAuth authentication. Manage contacts, email campaigns, contact lists, segments, and marketing analytics.
# List contacts python <<'EOF' import urllib.request, os, json req = urllib.request.Request('https://gateway.maton.ai/constant-contact/v3/contacts') req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}') print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2)) EOF
https://gateway.maton.ai/constant-contact/v3/{resource}
The gateway proxies requests to
api.cc.email/v3 and automatically injects your OAuth token.
All requests require the Maton API key in the Authorization header:
Authorization: Bearer $MATON_API_KEY
Environment Variable: Set your API key as
MATON_API_KEY:
export MATON_API_KEY="YOUR_API_KEY"
Manage your Constant Contact OAuth connections at
https://ctrl.maton.ai.
python <<'EOF' import urllib.request, os, json req = urllib.request.Request('https://ctrl.maton.ai/connections?app=constant-contact&status=ACTIVE') req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}') print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2)) EOF
python <<'EOF' import urllib.request, os, json data = json.dumps({'app': 'constant-contact'}).encode() req = urllib.request.Request('https://ctrl.maton.ai/connections', data=data, method='POST') req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}') req.add_header('Content-Type', 'application/json') print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2)) EOF
python <<'EOF' import urllib.request, os, json req = urllib.request.Request('https://ctrl.maton.ai/connections/{connection_id}') req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}') print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2)) EOF
Response:
{ "connection": { "connection_id": "4314bd0f-fd56-40ab-8c65-2676dd2c23c4", "status": "ACTIVE", "creation_time": "2026-02-07T07:41:05.859244Z", "last_updated_time": "2026-02-07T07:41:32.658230Z", "url": "https://connect.maton.ai/?session_token=...", "app": "constant-contact", "metadata": {} } }
Open the returned
url in a browser to complete OAuth authorization.
python <<'EOF' import urllib.request, os, json req = urllib.request.Request('https://ctrl.maton.ai/connections/{connection_id}', method='DELETE') req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}') print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2)) EOF
If you have multiple Constant Contact connections, specify which one to use with the
Maton-Connection header:
python <<'EOF' import urllib.request, os, json req = urllib.request.Request('https://gateway.maton.ai/constant-contact/v3/contacts') req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}') req.add_header('Maton-Connection', '4314bd0f-fd56-40ab-8c65-2676dd2c23c4') print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2)) EOF
If omitted, the gateway uses the default (oldest) active connection.
GET /constant-contact/v3/account/summary
GET /constant-contact/v3/account/emails
GET /constant-contact/v3/account/user/privileges
GET /constant-contact/v3/contacts
Query parameters:
status - Filter by status: all, active, deleted, not_set, pending_confirmation, temp_hold, unsubscribedemail - Filter by email addresslists - Filter by list ID(s)segment_id - Filter by segment IDtags - Filter by tag ID(s)updated_after - ISO-8601 date filterinclude - Include subresources: custom_fields, list_memberships, taggings, noteslimit - Results per page (default 50, max 500)GET /constant-contact/v3/contacts/{contact_id}
POST /constant-contact/v3/contacts Content-Type: application/json{ "email_address": { "address": "john@example.com", "permission_to_send": "implicit" }, "first_name": "John", "last_name": "Doe", "job_title": "Developer", "company_name": "Acme Inc", "list_memberships": ["list-uuid-here"] }
PUT /constant-contact/v3/contacts/{contact_id} Content-Type: application/json{ "email_address": { "address": "john@example.com" }, "first_name": "John", "last_name": "Smith" }
DELETE /constant-contact/v3/contacts/{contact_id}
Use this endpoint to create a new contact or update an existing one without checking if they exist first:
POST /constant-contact/v3/contacts/sign_up_form Content-Type: application/json{ "email_address": "john@example.com", "first_name": "John", "last_name": "Doe", "list_memberships": ["list-uuid-here"] }
GET /constant-contact/v3/contacts/counts
GET /constant-contact/v3/contact_lists
Query parameters:
include_count - Include contact count per listinclude_membership_count - Include membership countlimit - Results per pageGET /constant-contact/v3/contact_lists/{list_id}
POST /constant-contact/v3/contact_lists Content-Type: application/json{ "name": "Newsletter Subscribers", "description": "Main newsletter list", "favorite": false }
PUT /constant-contact/v3/contact_lists/{list_id} Content-Type: application/json{ "name": "Updated List Name", "description": "Updated description", "favorite": true }
DELETE /constant-contact/v3/contact_lists/{list_id}
GET /constant-contact/v3/contact_tags
POST /constant-contact/v3/contact_tags Content-Type: application/json{ "name": "VIP Customer" }
PUT /constant-contact/v3/contact_tags/{tag_id} Content-Type: application/json{ "name": "Premium Customer" }
DELETE /constant-contact/v3/contact_tags/{tag_id}
GET /constant-contact/v3/contact_custom_fields
POST /constant-contact/v3/contact_custom_fields Content-Type: application/json{ "label": "Customer ID", "type": "string" }
DELETE /constant-contact/v3/contact_custom_fields/{custom_field_id}
GET /constant-contact/v3/emails
Query parameters:
limit - Results per page (default 50)GET /constant-contact/v3/emails/{campaign_id}
POST /constant-contact/v3/emails Content-Type: application/json{ "name": "March Newsletter", "email_campaign_activities": [ { "format_type": 5, "from_name": "Company Name", "from_email": "marketing@example.com", "reply_to_email": "reply@example.com", "subject": "March Newsletter", "html_content": "<html><body><h1>Hello!</h1></body></html>" } ] }
PUT /constant-contact/v3/emails/activities/{campaign_activity_id} Content-Type: application/json{ "contact_list_ids": ["list-uuid-here"], "from_name": "Updated Name", "subject": "Updated Subject" }
POST /constant-contact/v3/emails/activities/{campaign_activity_id}/tests Content-Type: application/json{ "email_addresses": ["test@example.com"] }
POST /constant-contact/v3/emails/activities/{campaign_activity_id}/schedules Content-Type: application/json{ "scheduled_date": "2026-03-01T10:00:00Z" }
GET /constant-contact/v3/segments
GET /constant-contact/v3/segments/{segment_id}
POST /constant-contact/v3/segments Content-Type: application/json{ "name": "Engaged Subscribers", "segment_criteria": "..." }
DELETE /constant-contact/v3/segments/{segment_id}
POST /constant-contact/v3/activities/contacts_file_import Content-Type: multipart/form-data{file: contacts.csv, list_ids: ["list-uuid"]}
POST /constant-contact/v3/activities/add_list_memberships Content-Type: application/json{ "source": { "contact_ids": ["contact-uuid-1", "contact-uuid-2"] }, "list_ids": ["list-uuid"] }
POST /constant-contact/v3/activities/remove_list_memberships Content-Type: application/json{ "source": { "list_ids": ["source-list-uuid"] }, "list_ids": ["target-list-uuid"] }
POST /constant-contact/v3/activities/contact_delete Content-Type: application/json{ "contact_ids": ["contact-uuid-1", "contact-uuid-2"] }
GET /constant-contact/v3/activities/{activity_id}
GET /constant-contact/v3/activities
GET /constant-contact/v3/reports/summary_reports/email_campaign_summaries
Query parameters:
start - Start date (ISO-8601)end - End date (ISO-8601)GET /constant-contact/v3/reports/email_reports/{campaign_activity_id}
GET /constant-contact/v3/reports/contact_reports/{contact_id}/activity_summary
The API uses cursor-based pagination with a
limit parameter:
GET /constant-contact/v3/contacts?limit=50
Response includes pagination links:
{ "contacts": [...], "_links": { "next": { "href": "/v3/contacts?cursor=abc123" } } }
Use the cursor from the
next link for subsequent pages:
GET /constant-contact/v3/contacts?cursor=abc123
const response = await fetch( 'https://gateway.maton.ai/constant-contact/v3/contacts?limit=50', { headers: { 'Authorization': `Bearer ${process.env.MATON_API_KEY}` } } ); const data = await response.json();
import os import requestsresponse = requests.get( 'https://gateway.maton.ai/constant-contact/v3/contacts', headers={'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}'}, params={'limit': 50} ) data = response.json()
YYYY-MM-DDThh:mm:ss.sZformat_type: 5 for custom HTML emailscurl -g when URLs contain brackets to disable glob parsingjq or other commands, environment variables like $MATON_API_KEY may not expand correctly in some shell environments| Status | Meaning |
|---|---|
| 400 | Missing Constant Contact connection or invalid request |
| 401 | Invalid or missing Maton API key, or OAuth token expired |
| 403 | Insufficient permissions for the requested operation |
| 404 | Resource not found |
| 409 | Conflict (e.g., duplicate email address) |
| 429 | Rate limited |
| 4xx/5xx | Passthrough error from Constant Contact API |
{ "error_key": "unauthorized", "error_message": "Unauthorized" }
MATON_API_KEY environment variable is set:echo $MATON_API_KEY
python <<'EOF' import urllib.request, os, json req = urllib.request.Request('https://ctrl.maton.ai/connections') req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}') print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2)) EOF
constant-contact. For example:https://gateway.maton.ai/constant-contact/v3/contactshttps://gateway.maton.ai/v3/contactsNo automatic installation available. Please visit the source repository for installation instructions.
View Installation Instructions1,500+ AI skills, agents & workflows. Install in 30 seconds. Part of the Torly.ai family.
© 2026 Torly.ai. All rights reserved.