Access the Constant Contact V3 API with managed OAuth authentication. Manage contacts, email campaigns, contact lists, tags, custom fields, segments, bulk operations, and marketing analytics.
Reference
Get Account Summary
GET /constant-contact/v3/account/summaryResponse:
{
"contact_email": "user@example.com",
"contact_phone": "5551234567",
"country_code": "us",
"encoded_account_id": "abc123",
"first_name": "John",
"last_name": "Doe",
"organization_name": "Acme Inc",
"state_code": "CA",
"time_zone_id": "US/Eastern"
}Update Account Summary
PUT /constant-contact/v3/account/summary
Content-Type: application/json
{
"first_name": "John",
"last_name": "Doe",
"organization_name": "Acme Inc",
"time_zone_id": "US/Eastern"
}Get Account Emails
Returns confirmed sender email addresses for the account.
GET /constant-contact/v3/account/emailsResponse:
[
{
"email_id": 1,
"email_address": "marketing@example.com",
"roles": ["BILLING", "CONTACT", "DEFAULT_FROM", "REPLY_TO"],
"confirm_status": "CONFIRMED",
"confirm_time": "2026-02-05T07:32:49.766+0000",
"confirm_source_type": "SITE_OWNER"
}
]Add Account Email
POST /constant-contact/v3/account/emails
Content-Type: application/json
{
"email_address": "newsender@example.com"
}A confirmation email will be sent to the address. The email must be confirmed before it can be used as a sender.
Get User Privileges
GET /constant-contact/v3/account/user/privilegesList Contacts
GET /constant-contact/v3/contactsQuery parameters:
status- Filter by status:all,active,deleted,not_set,pending_confirmation,temp_hold,unsubscribedemail- Filter by exact email addresslists- Filter by list ID(s), comma-separatedsegment_id- Filter by segment IDtags- Filter by tag ID(s), comma-separatedupdated_after- ISO-8601 date filter (e.g.,2026-04-01T00:00:00Z)include- Include subresources:custom_fields,list_memberships,taggings,notes(comma-separated)limit- Results per page (default 50, max 500)
Example with filters:
GET /constant-contact/v3/contacts?email=john@example.com&status=all
GET /constant-contact/v3/contacts?updated_after=2026-04-01T00:00:00Z&limit=100
GET /constant-contact/v3/contacts?include=custom_fields,list_memberships,taggings&limit=50Get Contact
GET /constant-contact/v3/contacts/{contact_id}Query parameters:
include- Include subresources:custom_fields,list_memberships,taggings,notes(comma-separated)
Example:
GET /constant-contact/v3/contacts/{contact_id}?include=custom_fields,list_memberships,taggings,notesResponse:
{
"contact_id": "uuid",
"email_address": {
"address": "john@example.com",
"permission_to_send": "implicit",
"created_at": "2026-04-28T21:46:22Z",
"updated_at": "2026-04-28T21:46:22Z",
"opt_in_source": "Account",
"opt_in_date": "2026-04-28T21:46:22Z",
"confirm_status": "off"
},
"first_name": "John",
"last_name": "Doe",
"create_source": "Account",
"created_at": "2026-04-28T21:46:22Z",
"updated_at": "2026-04-28T21:46:22Z",
"custom_fields": [],
"list_memberships": ["list-uuid"],
"taggings": [],
"notes": []
}Create Contact
IMPORTANT: The create_source field is required.
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",
"create_source": "Account",
"list_memberships": ["list-uuid-here"]
}Valid create_source values: Account, Contact, Landing Page
Update Contact
IMPORTANT: The update_source field is required.
PUT /constant-contact/v3/contacts/{contact_id}
Content-Type: application/json
{
"email_address": {
"address": "john@example.com"
},
"first_name": "John",
"last_name": "Smith",
"update_source": "Account"
}Valid update_source values: Account, Contact, Landing Page
Delete Contact
DELETE /constant-contact/v3/contacts/{contact_id}Returns 204 No Content on success.
Create or Update Contact (Sign-Up Form)
Use this endpoint to create a new contact or update an existing one by email address 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"]
}Response:
{
"contact_id": "uuid",
"action": "created"
}The action field indicates whether the contact was created or updated.
Get Contact Counts
GET /constant-contact/v3/contacts/countsResponse:
{
"total": 150,
"explicit": 100,
"implicit": 40,
"pending": 5,
"unsubscribed": 5
}List Contact Lists
GET /constant-contact/v3/contact_listsQuery parameters:
include_count- Include total list count (true/false)include_membership_count- Include contact count per list:all,active,unsubscribedlimit- Results per page
Example:
GET /constant-contact/v3/contact_lists?include_membership_count=allResponse:
{
"lists": [
{
"list_id": "uuid",
"name": "Newsletter Subscribers",
"description": "Main newsletter",
"favorite": false,
"created_at": "2026-02-05T07:19:59Z",
"updated_at": "2026-02-05T07:19:59Z",
"membership_count": 150
}
],
"lists_count": 1
}Get Contact List
GET /constant-contact/v3/contact_lists/{list_id}Query parameters:
include_membership_count- Include membership count:all,active,unsubscribed
Create Contact List
POST /constant-contact/v3/contact_lists
Content-Type: application/json
{
"name": "Newsletter Subscribers",
"description": "Main newsletter list",
"favorite": false
}Update Contact List
PUT /constant-contact/v3/contact_lists/{list_id}
Content-Type: application/json
{
"name": "Updated List Name",
"description": "Updated description",
"favorite": true
}Delete Contact List
DELETE /constant-contact/v3/contact_lists/{list_id}Returns 202 Accepted (deletion is asynchronous).
List Tags
GET /constant-contact/v3/contact_tagsQuery parameters:
limit- Results per page
Create Tag
POST /constant-contact/v3/contact_tags
Content-Type: application/json
{
"name": "VIP Customer"
}Update Tag
PUT /constant-contact/v3/contact_tags/{tag_id}
Content-Type: application/json
{
"name": "Premium Customer"
}Delete Tag
DELETE /constant-contact/v3/contact_tags/{tag_id}Returns 202 Accepted (deletion is asynchronous).
List Custom Fields
GET /constant-contact/v3/contact_custom_fieldsCreate Custom Field
POST /constant-contact/v3/contact_custom_fields
Content-Type: application/json
{
"label": "Customer ID",
"type": "string"
}Valid types: string, date
Response:
{
"custom_field_id": "uuid",
"label": "Customer ID",
"name": "customer_id",
"type": "string",
"version": 1,
"created_at": "2026-04-28T21:45:57Z",
"updated_at": "2026-04-28T21:45:57Z"
}Delete Custom Field
DELETE /constant-contact/v3/contact_custom_fields/{custom_field_id}List Email Campaigns
GET /constant-contact/v3/emailsQuery parameters:
limit- Results per page (default 50)before_date- ISO-8601 date filterafter_date- ISO-8601 date filter
Response:
{
"campaigns": [
{
"campaign_id": "uuid",
"name": "March Newsletter",
"current_status": "Draft",
"type": "CUSTOM_CODE_EMAIL",
"type_code": 26,
"created_at": "2026-04-28T21:47:35.000Z",
"updated_at": "2026-04-28T21:47:35.000Z"
}
]
}Get Email Campaign
GET /constant-contact/v3/emails/{campaign_id}Response includes campaign activity IDs:
{
"campaign_activities": [
{
"campaign_activity_id": "uuid",
"role": "primary_email"
},
{
"campaign_activity_id": "uuid",
"role": "permalink"
}
],
"campaign_id": "uuid",
"current_status": "DRAFT",
"name": "March Newsletter",
"type": "CUSTOM_CODE_EMAIL"
}Create Email Campaign
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>"
}
]
}The from_email must be a confirmed account email address (see Account Emails).
Rename Email Campaign
PATCH /constant-contact/v3/emails/{campaign_id}
Content-Type: application/json
{
"name": "New Campaign Name"
}Delete Email Campaign
DELETE /constant-contact/v3/emails/{campaign_id}Returns 204 No Content on success.
Get Campaign Activity
GET /constant-contact/v3/emails/activities/{campaign_activity_id}Response:
{
"campaign_activity_id": "uuid",
"campaign_id": "uuid",
"role": "primary_email",
"contact_list_ids": [],
"segment_ids": [],
"current_status": "DRAFT",
"format_type": 5,
"from_email": "marketing@example.com",
"from_name": "Company",
"reply_to_email": "reply@example.com",
"subject": "Newsletter"
}Update Campaign Activity
Updates the email content, targeting, and sender information. All fields in the request body are replaced.
PUT /constant-contact/v3/emails/activities/{campaign_activity_id}
Content-Type: application/json
{
"from_name": "Updated Name",
"from_email": "marketing@example.com",
"reply_to_email": "reply@example.com",
"subject": "Updated Subject",
"html_content": "<html><body><h1>Updated Content</h1></body></html>",
"contact_list_ids": ["list-uuid-here"]
}IMPORTANT: from_email is required in the update body. Omitting it returns a validation error.
Preview Campaign Activity
Returns the rendered HTML and text preview of the email.
GET /constant-contact/v3/emails/activities/{campaign_activity_id}/previewsResponse:
{
"campaign_activity_id": "uuid",
"from_email": "marketing@example.com",
"from_name": "Company",
"preview_html_content": "<html>...</html>",
"preview_text_content": "Plain text version...",
"reply_to_email": "reply@example.com",
"subject": "Newsletter"
}Send Test Email
Sends a test/proof version of the email to specified addresses.
POST /constant-contact/v3/emails/activities/{campaign_activity_id}/tests
Content-Type: application/json
{
"email_addresses": ["test@example.com"],
"personal_message": "Please review this draft"
}Returns 204 No Content on success.
Schedule Email Campaign
POST /constant-contact/v3/emails/activities/{campaign_activity_id}/schedules
Content-Type: application/json
{
"scheduled_date": "2026-06-01T10:00:00Z"
}Note: The campaign activity must have a valid from_email, a physical address on the account, and at least one target list or segment before scheduling.
Get Campaign Schedule
GET /constant-contact/v3/emails/activities/{campaign_activity_id}/schedulesUnschedule Email Campaign
DELETE /constant-contact/v3/emails/activities/{campaign_activity_id}/schedulesGet Non-Opener Resend
GET /constant-contact/v3/emails/activities/{campaign_activity_id}/non_opener_resendsReturns resend details for sent campaigns. Returns empty array if no resend is configured.
Get A/B Test
GET /constant-contact/v3/emails/activities/{campaign_activity_id}/abtestList Segments
GET /constant-contact/v3/segmentsQuery parameters:
sort_by- Sort field (e.g.,name,date)sort_order-ascordesc
Get Segment
GET /constant-contact/v3/segments/{segment_id}Create Segment
Segments use a criteria object to define the audience filter:
POST /constant-contact/v3/segments
Content-Type: application/json
{
"name": "Engaged Subscribers",
"segment_criteria": {
"version": "3.0.0",
"criteria": { ... }
}
}Note: The segment_criteria must be a JSON object (not a string). The criteria schema is complex and version-dependent. Refer to the Constant Contact Segments Documentation for the full criteria format.
Update Segment
PUT /constant-contact/v3/segments/{segment_id}
Content-Type: application/json
{
"name": "Updated Segment Name",
"segment_criteria": { ... }
}Delete Segment
DELETE /constant-contact/v3/segments/{segment_id}List Activities
GET /constant-contact/v3/activitiesQuery parameters:
limit- Results per pagestate- Filter by state:processing,completed,cancelled,failed,timed_out
Get Activity Status
GET /constant-contact/v3/activities/{activity_id}Response:
{
"activity_id": "uuid",
"state": "completed",
"started_at": "2026-04-28T21:48:16Z",
"completed_at": "2026-04-28T21:48:16Z",
"created_at": "2026-04-28T21:48:15Z",
"updated_at": "2026-04-28T21:48:16Z",
"percent_done": 100,
"activity_errors": [],
"status": {
"items_total_count": 1,
"items_completed_count": 1
}
}Add Contacts to Lists
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"]
}The source can also use list_ids to copy contacts from other lists:
{
"source": {
"list_ids": ["source-list-uuid"]
},
"list_ids": ["target-list-uuid"]
}Remove Contacts from Lists
POST /constant-contact/v3/activities/remove_list_memberships
Content-Type: application/json
{
"source": {
"contact_ids": ["contact-uuid-1", "contact-uuid-2"]
},
"list_ids": ["target-list-uuid"]
}Add Tags to Contacts
POST /constant-contact/v3/activities/contacts_taggings_add
Content-Type: application/json
{
"source": {
"contact_ids": ["contact-uuid-1", "contact-uuid-2"]
},
"tag_ids": ["tag-uuid"]
}Remove Tags from Contacts
POST /constant-contact/v3/activities/contacts_taggings_remove
Content-Type: application/json
{
"source": {
"contact_ids": ["contact-uuid-1", "contact-uuid-2"]
},
"tag_ids": ["tag-uuid"]
}Export Contacts
POST /constant-contact/v3/activities/contact_exports
Content-Type: application/json
{
"contact_ids": ["contact-uuid-1", "contact-uuid-2"],
"fields": ["first_name", "last_name", "email"]
}The response includes a results link to download the export:
{
"activity_id": "uuid",
"state": "initialized",
"_links": {
"self": { "href": "/v3/activities/{activity_id}" },
"results": { "href": "/v3/contact_exports/{export_id}" }
}
}Download Contact Export
After the export activity completes, download the CSV:
GET /constant-contact/v3/contact_exports/{export_id}Returns CSV data.
Import Contacts
POST /constant-contact/v3/activities/contacts_file_import
Content-Type: multipart/form-data
{file: contacts.csv, list_ids: ["list-uuid"]}Delete Contacts in Bulk
POST /constant-contact/v3/activities/contact_delete
Content-Type: application/json
{
"contact_ids": ["contact-uuid-1", "contact-uuid-2"]
}Email Campaign Summaries
GET /constant-contact/v3/reports/summary_reports/email_campaign_summariesResponse:
{
"bulk_email_campaign_summaries": [...],
"aggregate_percents": {
"click": 5.2,
"open": 22.1,
"did_not_open": 72.7,
"bounce": 1.3,
"unsubscribe": 0.2
}
}Get Email Campaign Report
Returns detailed metrics for a specific sent campaign activity.
GET /constant-contact/v3/reports/email_reports/{campaign_activity_id}Note: Only available for sent campaigns. Draft campaigns return 404.
Contact Activity Summary
GET /constant-contact/v3/reports/contact_reports/{contact_id}/activity_summaryResponse:
{
"contact_id": "uuid",
"campaign_activities": [
{
"campaign_activity_id": "uuid",
"sends": 1,
"opens": 1,
"clicks": 0,
"bounces": 0
}
]
}