> **Building with AI coding agents?** Install the authstack plugin with one command. This equips your agent with accurate Scalekit implementation patterns.
>
> **Recommended** (the `-y` flags skip prompts, so the command runs without an interactive terminal):
> ```bash
> npx -y @scalekit-inc/cli setup -y
> ```
>
> Global:
> ```bash
> npm install -g @scalekit-inc/cli
> scalekit setup -y
> ```
>
> Supports Claude Code, Cursor, GitHub Copilot, Codex + skills for other Agent Skills-compatible agents in `~/.agents/skills`.
> Skills: integrate-agentkit, implement-saaskit, add-mcp-oauth, implement-sso, implement-scim.
> [Full setup guide](https://docs.scalekit.com/dev-kit/build-with-ai/)

---

# Connect AI agents to Constant Contact

The Constant Contact connector lets your AI agent act in each user's Constant Contact account. Each user signs in to Constant Contact once, and Scalekit stores and refreshes their tokens, so your agent never handles credentials. It comes with 95 tools.

**Authentication:** OAuth 2.0
**Categories:** Marketing, Communication
**Tools:** 95: 52 read, 30 write, 13 destructive
**Users sign in with:** OAuth
**OAuth app:** Your own Constant Contact app
**Built by:** Scalekit connector
**Try it:** [Playground in the Scalekit dashboard](https://app.scalekit.com/ws/signup?sk_intent=playground&provider=CONSTANTCONTACT)

## Setup

1. ### Install the SDK

   **Node.js**

   ```bash
   npm install @scalekit-sdk/node dotenv
   ```

   **Python**

   ```bash
   pip install scalekit-sdk-python python-dotenv
   ```

2. ### Set your credentials

   Add your Scalekit credentials to your `.env` file. Find values in **[app.scalekit.com](https://app.scalekit.com)** > **Developers** > **API Credentials**.

   ```sh title=".env"
   SCALEKIT_ENVIRONMENT_URL=<your-environment-url>
   SCALEKIT_CLIENT_ID=<your-client-id>
   SCALEKIT_CLIENT_SECRET=<your-client-secret>
   ```

3. ### Create the Constant Contact connection

   In **AgentKit > Connections**, create a Constant Contact connection and copy its redirect URI. The name you give it is the `connection_name` your code passes. See [Configure connections](/agentkit/connections/).

4. ### Register an OAuth app

   Constant Contact connections use your own OAuth app. Register one with Constant Contact and add the redirect URI you copied.

   Then enter the app's Client ID and Client Secret on the Constant Contact connection.

5. ### Authorize a user and make your first call

   **Node.js** (`quickstart.mts`)

   ```typescript
   import { ScalekitClient } from '@scalekit-sdk/node'
   import 'dotenv/config'
   import { createInterface } from 'node:readline/promises'

   const scalekit = new ScalekitClient(
     process.env.SCALEKIT_ENVIRONMENT_URL,
     process.env.SCALEKIT_CLIENT_ID,
     process.env.SCALEKIT_CLIENT_SECRET,
   )
   const actions = scalekit.actions

   const connector = 'constantcontact'
   const identifier = 'user_123'

   // Generate an authorization link for the user
   const { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })
   console.log('Authorize Constant Contact:', link)
   const rl = createInterface({ input: process.stdin, output: process.stdout })
   await rl.question('Press Enter after authorizing...')
   rl.close()

   // Make your first call
   const result = await actions.executeTool({
     connector,
     identifier,
     toolName: 'constantcontact_account_emails_list',
     toolInput: {},
   })
   console.log(result)
   ```

   ```bash
   npx tsx quickstart.mts
   ```

   **Python** (`quickstart.py`)

   ```python
   import os
   from scalekit import ScalekitClient
   from dotenv import load_dotenv
   load_dotenv()

   scalekit_client = ScalekitClient(
       env_url=os.getenv("SCALEKIT_ENVIRONMENT_URL"),
       client_id=os.getenv("SCALEKIT_CLIENT_ID"),
       client_secret=os.getenv("SCALEKIT_CLIENT_SECRET"),
   )
   actions = scalekit_client.actions

   connection_name = "constantcontact"
   identifier = "user_123"

   # Generate an authorization link for the user
   link_response = actions.get_authorization_link(
       connection_name=connection_name,
       identifier=identifier,
   )
   print("Authorize Constant Contact:", link_response.link)
   input("Press Enter after authorizing...")

   # Make your first call
   result = actions.execute_tool(
       tool_input={},
       tool_name="constantcontact_account_emails_list",
       connection_name=connection_name,
       identifier=identifier,
   )
   print(result)
   ```

   ```bash
   python quickstart.py
   ```

   Each user signs in once. See [Authorize a user](/agentkit/tools/authorize/) for the full flow and statuses.

## Tools

Pass the exact name to `execute_tool`, with an input like each tool's example. To ask for a tool that's missing, use the [request form](https://scalekitsupport.portal.usepylon.com/forms/request-a-connector-tool).

**Node.js**

```typescript
const result = await actions.executeTool({
  toolName: 'constantcontact_account_emails_list',
  toolInput: {},
  connector: 'constantcontact',
  identifier: 'user_123',
})
```

**Python**

```python
result = actions.execute_tool(
    tool_name="constantcontact_account_emails_list",
    tool_input={},
    connection_name="constantcontact",
    identifier="user_123",
)
```

`result.data` is the app's response as JSON, and `result.execution_id` (`executionId` in Node.js) is the ID of the call.

### `constantcontact_account_emails_list`

List Account Email Addresses · Read-only

List the account's email addresses and their confirmation status and roles. Only one filter can be used at a time.
Returns each email_address with confirm_status (CONFIRMED or UNCONFIRMED), confirm_time and roles.
Use to pick a CONFIRMED from_email and reply_to_email before creating or updating an email campaign.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `confirm_status` (`string`, optional): Return only addresses with this status (CONFIRMED or UNCONFIRMED). One of: `CONFIRMED`, `UNCONFIRMED`.
- `email_address` (`string`, optional): Return only this email address.
- `role_code` (`string`, optional): Return only addresses with this role. One of: `CONTACT`, `BILLING`, `JOURNALING`, `REPLY_TO`, `OTHER`.

Example input: `{}`

### `constantcontact_account_physical_address_get`

Get Account Physical Address · Read-only

Get the account's physical address, which is required to send email and appears in every email footer.
Returns address lines, city, state code or name, postal code and country code.
Use to check the footer address before sending campaigns.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `constantcontact_account_summary_get`

Get Account Summary · Read-only

Get the connected Constant Contact account's details.
Returns the encoded account ID, organization name, contact email and phone, website, time zone, country and state, and optionally the physical address and company logo.
Use to identify the connected account or check its setup.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `extra_fields` (`string`, optional): Extra details to include, comma-separated: physical_address, company_logo.

Example input: `{}`

### `constantcontact_activities_list`

List Activities · Read-only

List bulk activities (imports, exports, deletes, list and tag changes) in the account.
Returns each activity's activity_id, state, percent_done, created and updated dates, plus a _links.next cursor link.
Use to monitor background jobs. Use Get Activity for one activity's details and errors.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `cursor` (`string`, optional): Pagination cursor for the next page. Copy the value of the `cursor` query parameter from `_links.next.href` in the previous response (for example `/v3/contacts?cursor=bGltaXQ9NSZuZXh0PTI=` gives `bGltaXQ9NSZuZXh0PTI=`). Leave empty to get the first page.
- `limit` (`integer`, optional): Maximum number of activities to return per page, from 1 to 500. Defaults to 50. Default: `50`.
- `state` (`string`, optional): Return only activities in this state. One of: `processing`, `completed`, `cancelled`, `failed`, `timed_out`.

Example input: `{}`

### `constantcontact_activity_get`

Get Activity · Read-only

Get the status of one bulk activity.
Returns state, percent_done, activity_errors, status counts and a results link (for exports, the file to download).
Use after any bulk tool that returns an activity_id.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `activity_id` (`string`, required): The activity ID returned when the activity was created.

Example input: `{"activity_id":"<activity_id>"}`

### `constantcontact_automation_get`

Get Automation · Read-only

Get one automation workflow by its ID.
Returns the workflow's name, status, trigger and steps.
Use when you have a workflow ID. Use List Automations to find it.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `automation_flow_id` (`string`, required): The automation workflow ID. Get it from List Automations.

Example input: `{"automation_flow_id":"<automation_flow_id>"}`

### `constantcontact_automations_list`

List Automations · Read-only

List the account's automation workflows.
Returns each workflow's ID, name, status, channel and trigger details.
Use to find automations. Use Get Automation for one workflow's steps.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `channel` (`string`, optional): Return only workflows for this channel, for example email.
- `created_from` (`string`, optional): Return workflows created from scratch or from a template. One of: `SCRATCH`, `TEMPLATE`.
- `goals` (`string`, optional): Return workflows with this goal tag, for example post_purchase_followup or up_sell_and_cross_sell.
- `name` (`string`, optional): Return the workflow with this exact name.
- `sort_direction` (`string`, optional): Sort order, ASC or DESC (default DESC). One of: `ASC`, `DESC`.

Example input: `{}`

### `constantcontact_campaign_performance_stats_get`

Get Campaign Performance Stats · Read-only

Get performance statistics for campaigns in a date range.
Returns per-campaign performance stats such as sends, opens and clicks.
Use for date-range reporting. Use Get Email Campaigns Summary Report for the latest campaigns.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `count` (`integer`, optional): Number of campaign stats to return.
- `end_at` (`string`, optional): End of the date range, ISO 8601.
- `filter` (`string`, optional): Which date to filter campaigns on: adjusted_timestamp (default) or start_at. One of: `adjusted_timestamp`, `start_at`.
- `start_at` (`string`, optional): Start of the date range, ISO 8601.

Example input: `{}`

### `constantcontact_contact_activity_details_get`

Get Contact Activity Details · Read-only

Get one contact's tracking activity (sends, opens, clicks, bounces and more), newest first.
Returns each activity with its type, campaign_activity_id, optional campaign name and date-time, plus a _links.next cursor link.
Use to see how a contact engaged. Use Get Contact Activity Summary for per-campaign totals.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `contact_id` (`string`, required): The unique ID (UUID) of the contact. Get it from List Contacts.
- `tracking_activities_list` (`string`, required): Activity types to include, comma-separated: em_sends, em_opens, em_clicks, em_bounces, em_optouts, em_forwards, and other types listed in the Constant Contact reference (for example p_contact_open for landing pages).
- `cursor` (`string`, optional): Pagination cursor for the next page. Copy the value of the `cursor` query parameter from `_links.next.href` in the previous response (for example `/v3/contacts?cursor=bGltaXQ9NSZuZXh0PTI=` gives `bGltaXQ9NSZuZXh0PTI=`). Leave empty to get the first page.
- `include_campaign_activity_names` (`boolean`, optional): Return campaign activity names (default true). Set to false for faster responses.
- `limit` (`integer`, optional): Maximum number of tracking activities to return per page, from 1 to 100. Defaults to 100. Default: `100`.

Example input: `{"contact_id":"<contact_id>","tracking_activities_list":"<tracking_activities_list>"}`

### `constantcontact_contact_activity_summary_get`

Get Contact Activity Summary · Read-only

Get the most recent emails (up to 200) sent to a contact in a date range, with the actions the contact took on each.
Returns per-campaign activity counts such as opens and clicks, plus a _links.next cursor link.
Use for a per-email engagement summary. Use Get Contact Activity Details for each event.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `contact_id` (`string`, required): The unique ID (UUID) of the contact. Get it from List Contacts.
- `end` (`string`, required): End date, ISO 8601 (for example 2024-12-01T00:00:00-0500).
- `start` (`string`, required): Start date, ISO 8601 (for example 2024-01-01T00:00:00-0500).
- `cursor` (`string`, optional): Pagination cursor for the next page. Copy the value of the `cursor` query parameter from `_links.next.href` in the previous response (for example `/v3/contacts?cursor=bGltaXQ9NSZuZXh0PTI=` gives `bGltaXQ9NSZuZXh0PTI=`). Leave empty to get the first page.

Example input: `{"contact_id":"<contact_id>","end":"<end>","start":"<start>"}`

### `constantcontact_contact_counts_get`

Get Contact Consent Counts · Read-only

Get the account's total contact count and the count for each email consent state.
Returns totals such as explicit, implicit, pending_confirmation and unsubscribed contacts.
Use for list-health overviews. Use List Contacts with include_count for a filtered count.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `include` (`string`, optional): Set to new_subscriber to also return the number of contacts that subscribed in the last 30 days. One of: `new_subscriber`.

Example input: `{}`

### `constantcontact_contact_get`

Get Contact · Read-only

Get one contact by its contact_id.
Returns the contact's email address and permission, names, create and update details, and any requested sub-resources.
Use when you have a contact_id. Use List Contacts to look a contact up by email.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `contact_id` (`string`, required): The unique ID (UUID) of the contact. Get it from List Contacts.
- `include` (`string`, optional): Contact sub-resources to include in the response, as a comma-separated list. Valid values: custom_fields, list_memberships, phone_numbers, street_addresses, taggings, notes. Example: custom_fields,list_memberships.

Example input: `{"contact_id":"<contact_id>"}`

### `constantcontact_contact_list_get`

Get Contact List · Read-only

Get one contact list by its list_id.
Returns the list's name, description, favorite flag, created and updated dates, and an optional membership count.
Use when you have a list_id. Use List Contact Lists to find lists by name.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `list_id` (`string`, required): The unique ID (UUID) of the contact list. Get it from List Contact Lists.
- `include_membership_count` (`string`, optional): Include the list's contact count: active counts only active (mailable) contacts, all counts every contact. One of: `all`, `active`.

Example input: `{"list_id":"<list_id>"}`

### `constantcontact_contact_lists_list`

List Contact Lists · Read-only

List the account's contact lists, optionally filtered by name, status or channel.
Returns each list's list_id, name, description, favorite flag and optional membership counts, plus a _links.next cursor link.
Use to find list IDs. Use Get Contact List for one list's details.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `channel_type` (`string`, optional): Return email lists or SMS lists. Defaults to email. One of: `email`, `sms`.
- `cursor` (`string`, optional): Pagination cursor for the next page. Copy the value of the `cursor` query parameter from `_links.next.href` in the previous response (for example `/v3/contacts?cursor=bGltaXQ9NSZuZXh0PTI=` gives `bGltaXQ9NSZuZXh0PTI=`). Leave empty to get the first page.
- `include_count` (`boolean`, optional): Set to true to include lists_count, the total number of lists that match.
- `include_membership_count` (`string`, optional): Include each list's contact count: active counts only active (mailable) contacts, all counts every contact. One of: `all`, `active`.
- `include_sms_membership_count` (`boolean`, optional): Set to true to include the number of SMS members per list. Only applies when channel_type is sms.
- `limit` (`integer`, optional): Maximum number of lists to return per page, from 1 to 1000. Defaults to 50. Default: `50`.
- `name` (`string`, optional): Return only the list with this exact name.
- `status` (`string`, optional): Filter by list status: all, active or deleted (comma-separated for several).

Example input: `{}`

### `constantcontact_contact_open_click_rates_get`

Get Contact Open and Click Rates · Read-only

Get a contact's average open and click rates for bulk emails in a date range (up to 5 years).
Returns the average open rate, click rate and the number of campaign activities included (0 if none).
Use to score a contact's engagement.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `contact_id` (`string`, required): The unique ID (UUID) of the contact. Get it from List Contacts.
- `end` (`string`, required): End date, ISO 8601 (for example 2024-12-01T00:00:00-0500).
- `start` (`string`, required): Start date, ISO 8601 (for example 2024-01-01T00:00:00-0500).

Example input: `{"contact_id":"<contact_id>","end":"<end>","start":"<start>"}`

### `constantcontact_contact_sms_engagement_history_get`

Get Contact SMS Engagement History · Read-only

Get a contact's SMS engagement history.
Returns SMS consent actions and advertising frequency details for the contact.
Use to audit SMS consent. Use Get Contact for the contact's current SMS channel.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `contact_id` (`string`, required): The unique ID (UUID) of the contact. Get it from List Contacts.

Example input: `{"contact_id":"<contact_id>"}`

### `constantcontact_contacts_export_file_get`

Download Exported Contacts File · Read-only

Download the CSV file produced by a completed Export Contacts activity.
Returns the CSV text: a header row of contact fields followed by one row per contact.
Use after Get Activity shows the export is completed; take the file ID from the activity's results link.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `file_export_id` (`string`, required): The exported file ID from the results link of the completed export activity (usually the activity_id).

Example input: `{"file_export_id":"<file_export_id>"}`

### `constantcontact_contacts_list`

List Contacts · Read-only

List contacts in the Constant Contact account, filtered by status, email, list, tag, segment or date range.
Returns contacts with contact_id, email_address, names and any requested sub-resources, plus a _links.next cursor link.
Use to find or browse contacts. Use Get Contact when you already have a contact_id.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `created_after` (`string`, optional): Return contacts created after this ISO-8601 date-time.
- `created_before` (`string`, optional): Return contacts created before this ISO-8601 date-time.
- `cursor` (`string`, optional): Pagination cursor for the next page. Copy the value of the `cursor` query parameter from `_links.next.href` in the previous response (for example `/v3/contacts?cursor=bGltaXQ9NSZuZXh0PTI=` gives `bGltaXQ9NSZuZXh0PTI=`). Leave empty to get the first page.
- `email` (`string`, optional): Return only the contact with this exact email address.
- `include` (`string`, optional): Contact sub-resources to include in the response, as a comma-separated list. Valid values: custom_fields, list_memberships, phone_numbers, street_addresses, taggings, notes. Example: custom_fields,list_memberships.
- `include_count` (`boolean`, optional): Set to true to include contacts_count, the total number of contacts that match the filters.
- `limit` (`integer`, optional): Maximum number of contacts to return per page, from 1 to 500. Defaults to 50. Default: `50`.
- `lists` (`string`, optional): Return contacts that are members of these lists: comma-separated list IDs, up to 25.
- `optout_after` (`string`, optional): Return contacts that unsubscribed after this ISO-8601 date-time.
- `optout_before` (`string`, optional): Return contacts that unsubscribed before this ISO-8601 date-time.
- `segment_id` (`string`, optional): Return contacts that match this segment's criteria. Can only be combined with limit.
- `sms_status` (`string`, optional): Filter by SMS status as a comma-separated list. Valid values: all, explicit, unsubscribed, pending_confirmation, not_set.
- `status` (`string`, optional): Filter by contact status as a comma-separated list. Valid values: all, active, deleted, not_set, pending_confirmation, temp_hold, unsubscribed. Defaults to all contacts that are not deleted.
- `tags` (`string`, optional): Return contacts that have these tags: comma-separated tag IDs, up to 50.
- `updated_after` (`string`, optional): Return contacts updated after this ISO-8601 date-time.
- `updated_before` (`string`, optional): Return contacts updated before this ISO-8601 date-time.

Example input: `{}`

### `constantcontact_custom_field_get`

Get Custom Field · Read-only

Get one contact custom field by its custom_field_id.
Returns the field's label, name, type, metadata and choices.
Use when you have a custom_field_id. Use List Custom Fields to browse.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `custom_field_id` (`string`, required): The unique ID (UUID) of the custom field. Get it from List Custom Fields.

Example input: `{"custom_field_id":"<custom_field_id>"}`

### `constantcontact_custom_fields_list`

List Custom Fields · Read-only

List the contact custom fields defined in the account.
Returns each field's custom_field_id, label, name, type and choices, plus a _links.next cursor link.
Use to find custom_field_id values before setting custom field values on contacts.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `cursor` (`string`, optional): Pagination cursor for the next page. Copy the value of the `cursor` query parameter from `_links.next.href` in the previous response (for example `/v3/contacts?cursor=bGltaXQ9NSZuZXh0PTI=` gives `bGltaXQ9NSZuZXh0PTI=`). Leave empty to get the first page.
- `limit` (`integer`, optional): Maximum number of custom fields to return per page, from 1 to 100. Defaults to 50. Default: `50`.

Example input: `{}`

### `constantcontact_email_ab_test_get`

Get Email A/B Test · Read-only

Get the subject-line A/B test of a primary email campaign activity.
Returns the alternative subject, test size percentage and winner wait duration.
Use to review an A/B test before sending.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `campaign_activity_id` (`string`, required): The unique ID (UUID) of the email campaign activity. Get it from the campaign_activities array returned by Get Email Campaign (the activity with role primary_email holds the email content).

Example input: `{"campaign_activity_id":"<campaign_activity_id>"}`

### `constantcontact_email_bounces_report`

Get Email Bounces Report · Read-only

Get the email bounces report for one email campaign activity, most recent first.
Returns each bounce, with contact, bounce code and date-time, plus a _links.next cursor link.
Use to clean undeliverable addresses. Filter by bounce_code.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `campaign_activity_id` (`string`, required): The unique ID (UUID) of the email campaign activity (primary_email or resend role). Get it from Get Email Campaign.
- `bounce_code` (`array`, optional): Return only these bounce codes, sent as repeated parameters: B (non-existent address), D (undeliverable), F (full mailbox), S (suspended), V (vacation or autoreply), X (other), Z (blocked).
- `cursor` (`string`, optional): Pagination cursor for the next page. Copy the value of the `cursor` query parameter from `_links.next.href` in the previous response (for example `/v3/contacts?cursor=bGltaXQ9NSZuZXh0PTI=` gives `bGltaXQ9NSZuZXh0PTI=`). Leave empty to get the first page.
- `limit` (`integer`, optional): Maximum number of tracking activities to return per page, from 1 to 500. Defaults to 500. Default: `500`.

Example input: `{"campaign_activity_id":"<campaign_activity_id>"}`

### `constantcontact_email_campaign_activity_get`

Get Email Campaign Activity · Read-only

Get one email campaign activity: the email's content, sender details and recipients.
Returns from/reply-to, subject, preheader, contact_list_ids or segment_ids, current_status and any requested extra properties.
Use before Update Email Campaign Activity, which overwrites properties you leave out.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `campaign_activity_id` (`string`, required): The unique ID (UUID) of the email campaign activity. Get it from the campaign_activities array returned by Get Email Campaign (the activity with role primary_email holds the email content).
- `include` (`string`, optional): Extra properties to return, comma-separated: physical_address_in_footer, permalink_url, html_content, document_properties.

Example input: `{"campaign_activity_id":"<campaign_activity_id>"}`

### `constantcontact_email_campaign_activity_preview_get`

Get Email Preview · Read-only

Get the rendered HTML preview of an email campaign activity, using the account owner's details for variables.
Returns the preview HTML and subject as JSON strings.
Use to review an email without sending. Use Send Test Email to see it in an inbox.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `campaign_activity_id` (`string`, required): The unique ID (UUID) of the email campaign activity. Get it from the campaign_activities array returned by Get Email Campaign (the activity with role primary_email holds the email content).

Example input: `{"campaign_activity_id":"<campaign_activity_id>"}`

### `constantcontact_email_campaign_activity_schedule_get`

Get Email Campaign Activity Schedule · Read-only

Get the send schedule of an email campaign activity.
Returns an array with the scheduled_date, or an empty array if the activity is not scheduled.
Use to check when a campaign will send. Use Get Email Send History for past sends.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `campaign_activity_id` (`string`, required): The unique ID (UUID) of the email campaign activity. Get it from the campaign_activities array returned by Get Email Campaign (the activity with role primary_email holds the email content).

Example input: `{"campaign_activity_id":"<campaign_activity_id>"}`

### `constantcontact_email_campaign_activity_send_history_get`

Get Email Send History · Read-only

Get each past send of an email campaign activity, oldest first.
Returns send date, contact count, lists or segments used, completion state and any error reason per send.
Use to confirm a campaign went out. Use Get Email Campaign Activity Schedule for future sends.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `campaign_activity_id` (`string`, required): The unique ID (UUID) of the email campaign activity. Get it from the campaign_activities array returned by Get Email Campaign (the activity with role primary_email holds the email content).

Example input: `{"campaign_activity_id":"<campaign_activity_id>"}`

### `constantcontact_email_campaign_activity_stats_get`

Get Email Campaign Activity Stats · Read-only

Get performance statistics for up to 10 email campaign activities.
Returns, per campaign_activity_id, the campaign_id, total counts (stats) and last refresh time; missing or stat-less IDs appear under errors.
Use for activity-level numbers, for example a resend. Use Get Email Campaign Stats for whole campaigns.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `campaign_activity_ids` (`string`, required): Comma-separated campaign activity IDs (UUIDs), up to 10.

Example input: `{"campaign_activity_ids":"<campaign_activity_ids>"}`

### `constantcontact_email_campaign_get`

Get Email Campaign · Read-only

Get one email campaign by its campaign_id.
Returns the campaign name, current_status, dates and its campaign_activities (each with campaign_activity_id and role).
Use to get the primary_email campaign_activity_id needed to edit, schedule, test or report on a campaign.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `campaign_id` (`string`, required): The unique ID (UUID) of the email campaign. Get it from List Email Campaigns.

Example input: `{"campaign_id":"<campaign_id>"}`

### `constantcontact_email_campaign_stats_get`

Get Email Campaign Stats · Read-only

Get performance statistics for one or more email campaigns.
Returns, per campaign_id, total counts (stats), rates (percents) and the last refresh time. One invalid ID fails the whole request with 404.
Use for specific campaigns. Use Get Email Campaign Activity Stats for activity-level stats.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `campaign_ids` (`string`, required): Comma-separated campaign IDs (UUIDs), up to 150.

Example input: `{"campaign_ids":"<campaign_ids>"}`

### `constantcontact_email_campaign_summaries_report`

Get Email Campaigns Summary Report · Read-only

Get aggregate statistics for up to 500 sent email campaigns, most recently sent first.
Returns per-campaign unique counts (sends, opens, clicks, bounces, opt-outs, forwards) and aggregate percents, plus a _links.next cursor link.
Use for an overview of campaign performance. Use Get Email Campaign Stats for specific campaigns.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `cursor` (`string`, optional): Pagination cursor for the next page. Copy the value of the `cursor` query parameter from `_links.next.href` in the previous response (for example `/v3/contacts?cursor=bGltaXQ9NSZuZXh0PTI=` gives `bGltaXQ9NSZuZXh0PTI=`). Leave empty to get the first page.
- `limit` (`integer`, optional): Maximum number of campaign summaries to return per page, from 1 to 500. Defaults to 50. Default: `50`.

Example input: `{}`

### `constantcontact_email_campaigns_list`

List Email Campaigns · Read-only

List email campaigns in the account, including deleted ones, optionally by last-updated date range.
Returns each campaign's campaign_id, name, current_status, type and dates, plus a _links.next cursor link (no activity details).
Use to find campaigns. Use Get Email Campaign for a campaign's activities.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `after_date` (`string`, optional): Return campaigns last updated after this ISO-8601 date-time.
- `before_date` (`string`, optional): Return campaigns last updated before this ISO-8601 date-time.
- `cursor` (`string`, optional): Pagination cursor for the next page. Copy the value of the `cursor` query parameter from `_links.next.href` in the previous response (for example `/v3/contacts?cursor=bGltaXQ9NSZuZXh0PTI=` gives `bGltaXQ9NSZuZXh0PTI=`). Leave empty to get the first page.
- `limit` (`integer`, optional): Maximum number of campaigns to return per page, from 1 to 500. Defaults to 50. Default: `50`.

Example input: `{}`

### `constantcontact_email_clicks_report`

Get Email Clicks Report · Read-only

Get the email clicks report for one email campaign activity, most recent first.
Returns every link click, with contact, click date-time, device type and url_id, plus a _links.next cursor link.
Use for click detail. Use Get Email Links Report for per-link totals.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `campaign_activity_id` (`string`, required): The unique ID (UUID) of the email campaign activity (primary_email or resend role). Get it from Get Email Campaign.
- `cursor` (`string`, optional): Pagination cursor for the next page. Copy the value of the `cursor` query parameter from `_links.next.href` in the previous response (for example `/v3/contacts?cursor=bGltaXQ9NSZuZXh0PTI=` gives `bGltaXQ9NSZuZXh0PTI=`). Leave empty to get the first page.
- `limit` (`integer`, optional): Maximum number of tracking activities to return per page, from 1 to 500. Defaults to 500. Default: `500`.
- `url_id` (`integer`, optional): Return clicks for one link only. Get url_id values from Get Email Links Report.

Example input: `{"campaign_activity_id":"<campaign_activity_id>"}`

### `constantcontact_email_didnotopens_report`

Get Email Did Not Opens Report · Read-only

Get the email did not opens report for one email campaign activity, most recent first.
Returns each contact who was sent the email campaign activity but did not open it, with the send date-time, plus a _links.next cursor link.
Use to find non-openers, for example before a resend.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `campaign_activity_id` (`string`, required): The unique ID (UUID) of the email campaign activity (primary_email or resend role). Get it from Get Email Campaign.
- `cursor` (`string`, optional): Pagination cursor for the next page. Copy the value of the `cursor` query parameter from `_links.next.href` in the previous response (for example `/v3/contacts?cursor=bGltaXQ9NSZuZXh0PTI=` gives `bGltaXQ9NSZuZXh0PTI=`). Leave empty to get the first page.
- `limit` (`integer`, optional): Maximum number of tracking activities to return per page, from 1 to 500. Defaults to 500. Default: `500`.

Example input: `{"campaign_activity_id":"<campaign_activity_id>"}`

### `constantcontact_email_forwards_report`

Get Email Forwards Report · Read-only

Get the email forwards report for one email campaign activity, most recent first.
Returns each time a contact forwarded the email using the footer forward link, with contact and date-time, plus a _links.next cursor link.
Use to see forward activity.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `campaign_activity_id` (`string`, required): The unique ID (UUID) of the email campaign activity (primary_email or resend role). Get it from Get Email Campaign.
- `cursor` (`string`, optional): Pagination cursor for the next page. Copy the value of the `cursor` query parameter from `_links.next.href` in the previous response (for example `/v3/contacts?cursor=bGltaXQ9NSZuZXh0PTI=` gives `bGltaXQ9NSZuZXh0PTI=`). Leave empty to get the first page.
- `limit` (`integer`, optional): Maximum number of tracking activities to return per page, from 1 to 500. Defaults to 500. Default: `500`.

Example input: `{"campaign_activity_id":"<campaign_activity_id>"}`

### `constantcontact_email_links_report`

Get Email Links Report · Read-only

Get per-link click totals for an email campaign activity.
Returns each link's url_id, URL, link type and number of unique contacts who clicked it.
Use to compare links. Use Get Email Clicks Report for individual clicks.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `campaign_activity_id` (`string`, required): The unique ID (UUID) of the email campaign activity (primary_email or resend role). Get it from Get Email Campaign.
- `no_clicks` (`boolean`, optional): Set to true to include links that nobody clicked.

Example input: `{"campaign_activity_id":"<campaign_activity_id>"}`

### `constantcontact_email_opens_report`

Get Email Opens Report · Read-only

Get the email opens report for one email campaign activity, most recent first.
Returns every open of the email campaign activity, with contact, open date-time and device type, plus a _links.next cursor link.
Use for all opens including repeats. Use Get Email Unique Opens Report for the last open per contact.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `campaign_activity_id` (`string`, required): The unique ID (UUID) of the email campaign activity (primary_email or resend role). Get it from Get Email Campaign.
- `cursor` (`string`, optional): Pagination cursor for the next page. Copy the value of the `cursor` query parameter from `_links.next.href` in the previous response (for example `/v3/contacts?cursor=bGltaXQ9NSZuZXh0PTI=` gives `bGltaXQ9NSZuZXh0PTI=`). Leave empty to get the first page.
- `limit` (`integer`, optional): Maximum number of tracking activities to return per page, from 1 to 500. Defaults to 500. Default: `500`.

Example input: `{"campaign_activity_id":"<campaign_activity_id>"}`

### `constantcontact_email_optouts_report`

Get Email Opt-outs Report · Read-only

Get the email opt-outs report for one email campaign activity, most recent first.
Returns each contact who unsubscribed through the email's unsubscribe link, with opt-out date-time, plus a _links.next cursor link.
Use to see unsubscribes caused by a send.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `campaign_activity_id` (`string`, required): The unique ID (UUID) of the email campaign activity (primary_email or resend role). Get it from Get Email Campaign.
- `cursor` (`string`, optional): Pagination cursor for the next page. Copy the value of the `cursor` query parameter from `_links.next.href` in the previous response (for example `/v3/contacts?cursor=bGltaXQ9NSZuZXh0PTI=` gives `bGltaXQ9NSZuZXh0PTI=`). Leave empty to get the first page.
- `limit` (`integer`, optional): Maximum number of tracking activities to return per page, from 1 to 500. Defaults to 500. Default: `500`.

Example input: `{"campaign_activity_id":"<campaign_activity_id>"}`

### `constantcontact_email_resend_to_non_openers_get`

Get Resend to Non-openers · Read-only

Get the resend-to-non-openers setup for a primary email campaign activity.
Returns the resend_request_id, resend subject and delay, or an empty list if none exists.
Use before creating or deleting a resend; a campaign can have only one.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `campaign_activity_id` (`string`, required): The unique ID (UUID) of the email campaign activity. Get it from the campaign_activities array returned by Get Email Campaign (the activity with role primary_email holds the email content).

Example input: `{"campaign_activity_id":"<campaign_activity_id>"}`

### `constantcontact_email_sends_report`

Get Email Sends Report · Read-only

Get the email sends report for one email campaign activity, most recent first.
Returns each contact the email campaign activity was sent to, with send date-time, name and contact_id, plus a _links.next cursor link.
Use to see who received an email.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `campaign_activity_id` (`string`, required): The unique ID (UUID) of the email campaign activity (primary_email or resend role). Get it from Get Email Campaign.
- `cursor` (`string`, optional): Pagination cursor for the next page. Copy the value of the `cursor` query parameter from `_links.next.href` in the previous response (for example `/v3/contacts?cursor=bGltaXQ9NSZuZXh0PTI=` gives `bGltaXQ9NSZuZXh0PTI=`). Leave empty to get the first page.
- `limit` (`integer`, optional): Maximum number of tracking activities to return per page, from 1 to 500. Defaults to 500. Default: `500`.

Example input: `{"campaign_activity_id":"<campaign_activity_id>"}`

### `constantcontact_email_unique_opens_report`

Get Email Unique Opens Report · Read-only

Get the email unique opens report for one email campaign activity, most recent first.
Returns the most recent open per contact, with contact, open date-time and device type, plus a _links.next cursor link.
Use to count who opened. Use Get Email Opens Report for every open.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `campaign_activity_id` (`string`, required): The unique ID (UUID) of the email campaign activity (primary_email or resend role). Get it from Get Email Campaign.
- `cursor` (`string`, optional): Pagination cursor for the next page. Copy the value of the `cursor` query parameter from `_links.next.href` in the previous response (for example `/v3/contacts?cursor=bGltaXQ9NSZuZXh0PTI=` gives `bGltaXQ9NSZuZXh0PTI=`). Leave empty to get the first page.
- `limit` (`integer`, optional): Maximum number of tracking activities to return per page, from 1 to 500. Defaults to 500. Default: `500`.

Example input: `{"campaign_activity_id":"<campaign_activity_id>"}`

### `constantcontact_event_get`

Get Event · Read-only

Get one event's details.
Returns the event's name, title, description, status, times, time zone, location, contact, tracks and optional settings.
Use when you have an event_id, for example to find a track_id for registrations.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `event_id` (`string`, required): The unique ID (UUID) of the event. Get it from List Events.
- `include` (`boolean`, optional): Set to true to include the event setting properties.

Example input: `{"event_id":"<event_id>"}`

### `constantcontact_event_registration_get`

Get Event Registration · Read-only

Get one event registration's details.
Returns the registrant's details, tickets, items, payment and registration status.
Use when you have a registration ID from List Event Registrations.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `event_id` (`string`, required): The unique ID (UUID) of the event. Get it from List Events.
- `registration_id` (`string`, required): The registration ID. Get it from List Event Registrations.
- `track_id` (`string`, required): The event track key (for example s8zabc). Get it from the event's tracks in Get Event.

Example input: `{"event_id":"<event_id>","registration_id":"<registration_id>","track_id":"<track_id>"}`

### `constantcontact_event_registrations_list`

List Event Registrations · Read-only

List the registrations for an event track, with optional filters and sorting.
Returns each registration's ID, registrant name and email, registration and payment status, tickets and total, plus next and prev cursors.
Use to see who registered. Use Get Event Registration for one registration's details.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `event_id` (`string`, required): The unique ID (UUID) of the event. Get it from List Events.
- `track_id` (`string`, required): The event track key (for example s8zabc). Get it from the event's tracks in Get Event.
- `limit` (`integer`, optional): Number of registrations per page.
- `next` (`string`, optional): Cursor for the next page, from next_cursor in the previous response.
- `payment_status` (`string`, optional): Return only registrations with this payment status. One of: `PENDING`, `PAID`, `REFUNDED`, `CANCELLED`, `FAILED`, `CHARGED_BACK`.
- `prev` (`string`, optional): Cursor for the previous page, from prev_cursor in the previous response.
- `registration_status` (`string`, optional): Return only registrations with this status. One of: `PENDING`, `REGISTERED`, `CANCELED`, `EXPIRED`, `IN_PROGRESS`, `FAILED`.
- `search_text` (`string`, optional): Match registrations by first name, last name or email.
- `sort_by` (`string`, optional): Field to sort by. One of: `first_name`, `last_name`, `email_address`, `registration_status`, `payment_status`, `tickets`, `total`.
- `sort_order` (`string`, optional): Sort direction. One of: `ASC`, `DESC`.

Example input: `{"event_id":"<event_id>","track_id":"<track_id>"}`

### `constantcontact_events_list`

List Events · Read-only

List the account's events, optionally filtered by status or text.
Returns each event's event_id, name, title, status, start and end times, plus next_cursor and prev_cursor values.
Use to find events. Use Get Event for one event's full details.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `event_status` (`string`, optional): Return only events with this status. One of: `ACTIVE`, `DRAFT`, `COMPLETE`, `DELETED`, `CANCELLED`, `ERROR`.
- `limit` (`integer`, optional): Number of events per page. Default and maximum is 100.
- `next` (`string`, optional): Cursor for the next page: the next_cursor value from the previous response.
- `prev` (`string`, optional): Cursor for the previous page: the prev_cursor value from the previous response.
- `search_text` (`string`, optional): Return only events that contain this text.
- `sort_by` (`string`, optional): Sort events by this property. One of: `name`, `start_time`, `end_time`, `created_time`, `updated_time`.
- `sort_order` (`string`, optional): Sort direction for sort_by (default ASC). One of: `ASC`, `DESC`.

Example input: `{}`

### `constantcontact_segment_get`

Get Segment · Read-only

Get one segment by its segment_id, including deleted segments.
Returns the segment name, segment_criteria (escaped JSON string) and dates.
Use to read a segment's criteria before editing it with Update Segment.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `segment_id` (`integer`, required): The numeric ID of the segment. Get it from List Segments.

Example input: `{"segment_id":1}`

### `constantcontact_segments_list`

List Segments · Read-only

List the account's segments (deleted segments are left out).
Returns each segment's segment_id, name and created and updated dates, plus a _links.next cursor link.
Use to find segment IDs. Use Get Segment for the segment criteria.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `cursor` (`string`, optional): Pagination cursor for the next page. Copy the value of the `cursor` query parameter from `_links.next.href` in the previous response (for example `/v3/contacts?cursor=bGltaXQ9NSZuZXh0PTI=` gives `bGltaXQ9NSZuZXh0PTI=`). Leave empty to get the first page.
- `limit` (`integer`, optional): Maximum number of segments to return per page, from 1 to 1000. Defaults to 1000. Default: `1000`.
- `sort_by` (`string`, optional): Sort by name (ascending) or date (most recently updated first). Defaults to date. One of: `name`, `date`.

Example input: `{}`

### `constantcontact_sms_campaign_summaries_report`

Get SMS Campaigns Summary Report · Read-only

Get summary statistics for SMS campaigns sent on or after a date, most recently sent first.
Returns per-campaign unique interaction counts and aggregate stats, plus a _links.next cursor link.
Use for SMS reporting. Use Get Email Campaigns Summary Report for email.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `start_at` (`string`, required): Return SMS campaigns sent on or after this date, ISO 8601.
- `cursor` (`string`, optional): Pagination cursor for the next page. Copy the value of the `cursor` query parameter from `_links.next.href` in the previous response (for example `/v3/contacts?cursor=bGltaXQ9NSZuZXh0PTI=` gives `bGltaXQ9NSZuZXh0PTI=`). Leave empty to get the first page.
- `end_at` (`string`, optional): Return SMS campaigns sent on or before this date, ISO 8601.
- `limit` (`integer`, optional): Maximum number of SMS campaign summaries to return per page, from 1 to 50. Defaults to 50. Default: `50`.

Example input: `{"start_at":"<start_at>"}`

### `constantcontact_social_connections_list`

List Social Connections · Read-only

List the social network accounts connected to the Constant Contact account.
Returns each connection's network, connected user details and status (active, rate-limited or in error).
Use to check social connection health. Use List Social Profiles for postable pages.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `constantcontact_social_profiles_list`

List Social Profiles · Read-only

List the social media profiles (pages or business accounts) connected to the account.
Returns each profile's profile_id, network, name and image, and optionally whether it is accessible for posting.
Use to get profile IDs before Create Social Post. Use List Social Connections for the underlying network accounts.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `include` (`array`, optional): Set to ["accessible"] to also check whether each profile can currently be posted to.

Example input: `{}`

### `constantcontact_tag_get`

Get Tag · Read-only

Get one tag by its tag_id.
Returns the tag's name, tag_source, created and updated dates, and an optional contacts_count.
Use when you have a tag_id. Use List Tags to browse tags.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `tag_id` (`string`, required): The unique ID (UUID) of the tag. Get it from List Tags.
- `include_count` (`boolean`, optional): Set to true to include contacts_count, the number of tagged contacts.

Example input: `{"tag_id":"<tag_id>"}`

### `constantcontact_tags_list`

List Tags · Read-only

List all tags in the account.
Returns each tag's tag_id, name, tag_source and optional contacts_count, plus a _links.next cursor link.
Use to find tag IDs. Use Get Tag for one tag's details.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `cursor` (`string`, optional): Pagination cursor for the next page. Copy the value of the `cursor` query parameter from `_links.next.href` in the previous response (for example `/v3/contacts?cursor=bGltaXQ9NSZuZXh0PTI=` gives `bGltaXQ9NSZuZXh0PTI=`). Leave empty to get the first page.
- `include_count` (`boolean`, optional): Set to true to include contacts_count, the number of contacts with each tag.
- `limit` (`integer`, optional): Maximum number of tags to return per page, from 1 to 500. Defaults to 50. Default: `50`.

Example input: `{}`

### `constantcontact_user_privileges_get`

Get User Privileges · Read-only

Get the privileges of the user who authorized the connection.
Returns an array of privilege names, including ones the API does not use.
Use to diagnose 403 errors caused by the user's role.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `constantcontact_account_email_create`

Add Account Email Address · Write

Add an email address to the account. Constant Contact emails it a confirmation link; it stays UNCONFIRMED until clicked.
Returns the new address with its confirm_status.
Use to add a sender address for campaigns. Returns 409 if the address already exists.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `email_address` (`string`, required): The email address to add (max 80 characters).

Example input: `{"email_address":"<email_address>"}`

### `constantcontact_contact_create`

Create Contact · Write

Create a new contact. Needs create_source plus at least one of email_address, first_name, last_name or sms_channel.
Returns the created contact with its contact_id.
Use for a contact that does not exist yet (fails with 409 if the email exists). Use Create or Update Contact to upsert by email.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `create_source` (`string`, required): Who is adding the contact: Account (the account user added them) or Contact (the contact signed up). Must be accurate for compliance; it cannot be changed later. One of: `Account`, `Contact`.
- `anniversary` (`string`, optional): Anniversary date, for example the date the contact became a customer. Accepted formats include YYYY-MM-DD and MM/DD/YYYY (max 10 characters).
- `birthday_day` (`integer`, optional): Birthday day of month, 1 to 31. Must be sent together with birthday_month.
- `birthday_month` (`integer`, optional): Birthday month, 1 to 12. Must be sent together with birthday_day.
- `company_name` (`string`, optional): The company the contact works for (max 50 characters).
- `custom_fields` (`array`, optional): Custom field values, up to 25. Each item names a custom field by its custom_field_id and gives its value (or choice_ids for select fields). Example: [{"custom_field_id": "1b4fa3a6-3fdd-11e9-87e4-fa163e56c9b0", "value": "Gold"}].
- `email_address` (`string`, optional): The contact's email address (max 80 characters). Must be unique in the account. Only send it when the contact gave explicit permission to receive email.
- `first_name` (`string`, optional): The contact's first name (max 50 characters).
- `job_title` (`string`, optional): The contact's job title (max 50 characters).
- `last_name` (`string`, optional): The contact's last name (max 50 characters).
- `list_memberships` (`array`, optional): Contact list IDs to subscribe the contact to, up to 50. Get list IDs from List Contact Lists.
- `notes` (`array`, optional): Notes about the contact. Each item has content (max 2000 characters). Example: [{"content": "Met at the spring trade show."}].
- `permission_to_send` (`string`, optional): Permission the account has to email this contact. Sent with email_address. Valid values: explicit, implicit, not_set, pending_confirmation, temp_hold, unsubscribed. One of: `explicit`, `implicit`, `not_set`, `pending_confirmation`, `temp_hold`, `unsubscribed`.
- `phone_numbers` (`array`, optional): Phone numbers, up to 3. Each item has a phone_number (max 25 characters) and a kind: home, work, mobile or other. Example: [{"phone_number": "+1-555-555-0100", "kind": "work"}].
- `sms_channel` (`object`, optional): The contact's SMS channel, only when the contact gave explicit SMS consent. Holds full_sms_address (the number including dial code) and sms_channel_consents (an array of consent objects). See the Constant Contact contacts API reference for the consent shape.
- `street_addresses` (`array`, optional): Street addresses, up to 3. Each item needs a kind (home, work or other) and can have street, city, state, postal_code and country. Example: [{"kind": "home", "street": "123 Main St", "city": "Boston", "state": "MA", "postal_code": "02108", "country": "United States"}].
- `taggings` (`array`, optional): Tag IDs to assign to the contact, up to 50. Get tag IDs from List Tags.

Example input: `{"create_source":"Account"}`

### `constantcontact_contact_list_create`

Create Contact List · Write

Create a new contact list.
Returns the new list with its list_id.
Use before adding contacts to a new audience. List names must be unique (409 if taken).

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `name` (`string`, required): A unique name for the list (max 255 characters).
- `description` (`string`, optional): Text describing the list.
- `favorite` (`boolean`, optional): Set to true to mark the list as a favorite in the account.

Example input: `{"name":"<name>"}`

### `constantcontact_contact_list_update`

Update Contact List · Write

Update a contact list's name, description or favorite flag.
Returns the updated list.
Use to rename or describe a list. Use Add Contacts to Lists to change its members.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `list_id` (`string`, required): The unique ID (UUID) of the contact list. Get it from List Contact Lists.
- `name` (`string`, required): The list name (max 255 characters). Required by the API even if unchanged.
- `description` (`string`, optional): Text describing the list.
- `favorite` (`boolean`, optional): Set to true to mark the list as a favorite.

Example input: `{"list_id":"<list_id>","name":"<name>"}`

### `constantcontact_contact_resubscribe`

Resubscribe Contact · Write

Send an unsubscribed contact a confirmation email asking them to resubscribe, and add them to the given lists once they confirm.
Returns the request status. The contact stays unsubscribed until they click the confirmation link.
Use only once per contact; Constant Contact allows a single resubscribe email per unsubscribed contact.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `contact_id` (`string`, required): The unique ID (UUID) of the contact. Get it from List Contacts.
- `list_ids` (`array`, required): Contact list IDs to add the contact to after they confirm.

Example input: `{"contact_id":"<contact_id>","list_ids":[]}`

### `constantcontact_contact_update`

Update Contact · Write

Replace an existing contact's properties. Properties you leave out are cleared; sub-resources you leave out (lists, tags, custom fields, phones, addresses, notes) are kept.
Returns the updated contact. Updating a deleted contact revives it.
Use to edit a known contact by contact_id. Use Create or Update Contact for a partial update by email.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `contact_id` (`string`, required): The unique ID (UUID) of the contact. Get it from List Contacts.
- `update_source` (`string`, required): Who is updating the contact: Account or Contact. Use Account to revive a deleted contact. One of: `Account`, `Contact`.
- `anniversary` (`string`, optional): Anniversary date, for example the date the contact became a customer. Accepted formats include YYYY-MM-DD and MM/DD/YYYY (max 10 characters).
- `birthday_day` (`integer`, optional): Birthday day of month, 1 to 31. Must be sent together with birthday_month.
- `birthday_month` (`integer`, optional): Birthday month, 1 to 12. Must be sent together with birthday_day.
- `company_name` (`string`, optional): The company the contact works for (max 50 characters).
- `custom_fields` (`array`, optional): Custom field values, up to 25. Each item names a custom field by its custom_field_id and gives its value (or choice_ids for select fields). Example: [{"custom_field_id": "1b4fa3a6-3fdd-11e9-87e4-fa163e56c9b0", "value": "Gold"}].
- `email_address` (`string`, optional): The contact's email address (max 80 characters). Must be unique in the account. Only send it when the contact gave explicit permission to receive email.
- `first_name` (`string`, optional): The contact's first name (max 50 characters).
- `job_title` (`string`, optional): The contact's job title (max 50 characters).
- `last_name` (`string`, optional): The contact's last name (max 50 characters).
- `list_memberships` (`array`, optional): Contact list IDs to subscribe the contact to, up to 50. Get list IDs from List Contact Lists.
- `notes` (`array`, optional): Notes about the contact. Each item has content (max 2000 characters). Example: [{"content": "Met at the spring trade show."}].
- `permission_to_send` (`string`, optional): Permission the account has to email this contact. Sent with email_address. Valid values: explicit, implicit, not_set, pending_confirmation, temp_hold, unsubscribed. One of: `explicit`, `implicit`, `not_set`, `pending_confirmation`, `temp_hold`, `unsubscribed`.
- `phone_numbers` (`array`, optional): Phone numbers, up to 3. Each item has a phone_number (max 25 characters) and a kind: home, work, mobile or other. Example: [{"phone_number": "+1-555-555-0100", "kind": "work"}].
- `sms_channel` (`object`, optional): The contact's SMS channel, only when the contact gave explicit SMS consent. Holds full_sms_address (the number including dial code) and sms_channel_consents (an array of consent objects). See the Constant Contact contacts API reference for the consent shape.
- `street_addresses` (`array`, optional): Street addresses, up to 3. Each item needs a kind (home, work or other) and can have street, city, state, postal_code and country. Example: [{"kind": "home", "street": "123 Main St", "city": "Boston", "state": "MA", "postal_code": "02108", "country": "United States"}].
- `taggings` (`array`, optional): Tag IDs to assign to the contact, up to 50. Get tag IDs from List Tags.

Example input: `{"contact_id":"<contact_id>","update_source":"Account"}`

### `constantcontact_contact_upsert`

Create or Update Contact · Write

Create a contact, or update it if the email address (or SMS number) already exists. Updates are partial and append lists and custom fields.
Returns the contact_id and whether the contact was created or updated.
Use when you don't know if the contact exists. Use Create Contact or Update Contact for full control of sub-resources.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `list_memberships` (`array`, required): Contact list IDs to add the contact to: at least 1 and up to 50. Get list IDs from List Contact Lists.
- `anniversary` (`string`, optional): Anniversary date. Accepted formats include YYYY-MM-DD and MM/DD/YYYY.
- `birthday_day` (`integer`, optional): Birthday day of month, 1 to 31. Must be sent together with birthday_month.
- `birthday_month` (`integer`, optional): Birthday month, 1 to 12. Must be sent together with birthday_day.
- `company_name` (`string`, optional): The company the contact works for (max 50 characters).
- `custom_fields` (`array`, optional): Custom field values, up to 50. Each item has a custom_field_id and a value. Example: [{"custom_field_id": "1b4fa3a6-3fdd-11e9-87e4-fa163e56c9b0", "value": "Gold"}].
- `email_address` (`string`, optional): The contact's email address (max 50 characters). Identifies the contact: an existing address is updated, a new one creates a contact. Required unless sms_channel is given.
- `first_name` (`string`, optional): The contact's first name (max 50 characters).
- `job_title` (`string`, optional): The contact's job title (max 50 characters).
- `last_name` (`string`, optional): The contact's last name (max 50 characters).
- `phone_number` (`string`, optional): The contact's phone number (max 25 characters).
- `sms_channel` (`object`, optional): The contact's SMS details, only with explicit SMS consent. Holds sms_address (number without country code), dial_code, country_code and sms_channel_consents (array of consent objects).
- `street_address` (`object`, optional): One street address. Needs a kind (home, work or other) and can have street, city, state, postal_code and country. Example: {"kind": "home", "street": "123 Main St", "city": "Boston", "state": "MA", "postal_code": "02108", "country": "United States"}.

Example input: `{"list_memberships":[]}`

### `constantcontact_contacts_add_tags`

Add Tags to Contacts · Write

Start a background activity that adds tags to contacts. Pick the contacts with exactly one source option.
Returns the activity_id and status; check progress with Get Activity.
Use to tag contacts in bulk. Use Update Contact to change one contact's taggings.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `tag_ids` (`array`, required): Tag IDs to add to the selected contacts.
- `exclude_contact_ids` (`array`, optional): Contact IDs to leave out. Only applies when the source is source_all_active_contacts or source_list_ids.
- `source_all_active_contacts` (`boolean`, optional): Source option: set to true to act on all active (billable) contacts. Use exactly one source option.
- `source_contact_ids` (`array`, optional): Source option: contact IDs to act on, up to 500. Use exactly one source option.
- `source_list_ids` (`array`, optional): Source option: act on every member of these contact lists, up to 50 list IDs. Use exactly one source option.
- `source_new_subscriber` (`boolean`, optional): Source option: set to true to act on contacts that subscribed in the last 30 days. Use exactly one source option.
- `source_tag_ids` (`array`, optional): Source option: act on every contact that has any of these tag IDs. Use exactly one source option.

Example input: `{"tag_ids":[]}`

### `constantcontact_contacts_add_to_lists`

Add Contacts to Lists · Write

Start a background activity that adds contacts to one or more lists. Pick the contacts with exactly one source option.
Returns the activity_id and status; check progress with Get Activity.
Use to grow lists in bulk. Use Update Contact to change one contact's lists.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `list_ids` (`array`, required): Target contact list IDs to add the contacts to, up to 50.
- `exclude_contact_ids` (`array`, optional): Contact IDs to leave out. Only applies when the source is source_all_active_contacts or source_list_ids.
- `source_all_active_contacts` (`boolean`, optional): Source option: set to true to act on all active (billable) contacts. Use exactly one source option.
- `source_contact_ids` (`array`, optional): Source option: contact IDs to act on, up to 500. Use exactly one source option.
- `source_engagement_level` (`string`, optional): Source option: act on all contacts at this engagement level (as shown in the Constant Contact UI). Use exactly one source option.
- `source_list_ids` (`array`, optional): Source option: act on every member of these contact lists, up to 50 list IDs. Use exactly one source option.
- `source_segment_id` (`integer`, optional): Source option: act on every contact that matches this segment. Use exactly one source option.
- `source_tag_ids` (`array`, optional): Source option: act on every contact that has any of these tag IDs. Use exactly one source option.

Example input: `{"list_ids":[]}`

### `constantcontact_contacts_export`

Export Contacts · Write

Start a background export of contacts to a CSV file. With no filters it exports every contact.
Returns the activity_id; when it completes, its results link holds the file ID for Download Exported Contacts File.
Use to pull many contacts at once. Use List Contacts for paged JSON results.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `contact_ids` (`array`, optional): Export only these contacts, up to 500. Can be combined only with status.
- `exclude_contact_ids` (`array`, optional): Contact IDs to leave out (up to 50). Applies with list_ids or new_subscriber.
- `fields` (`array`, optional): Contact fields to export (all fields by default), for example email_address, first_name, last_name, list_memberships.
- `list_ids` (`array`, optional): Export the members of these lists, up to 50. Can be combined only with status or exclude.
- `new_subscriber` (`boolean`, optional): Set to true to export only contacts that subscribed in the last 30 days.
- `segment_id` (`integer`, optional): Export the contacts in this segment. Cannot be combined with other filters.
- `status` (`string`, optional): Export only contacts with this status, for example active or unsubscribed. Can be combined with contact_ids or list_ids.
- `tag_ids` (`array`, optional): Export contacts that have any of these tags. Cannot be combined with other filters.

Example input: `{}`

### `constantcontact_contacts_import_json`

Import Contacts · Write

Start a background import that creates or updates contacts from a JSON array and adds them to lists.
Returns the activity_id and state; check progress with Get Activity.
Use for many contacts at once. Use Create or Update Contact for a single contact.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `import_data` (`array`, required): The contacts to import. Each contact needs email (or sms_number) and can have first_name, last_name, job_title, company_name, phone, birthday_month, birthday_day, anniversary and address fields such as street, city, state, zip and country (or home_/work_/other_ prefixed versions). Set custom field values with keys named cf: plus the custom field name. Example: [{"email": "jane.doe@example.com", "first_name": "Jane", "cf:membership_level": "Gold"}].
- `list_ids` (`array`, required): Contact list IDs to add every imported contact to, up to 50.
- `sms_permission_to_send` (`string`, optional): For contacts with sms_number: explicit if they all gave SMS consent (then each needs sms_consent_date), otherwise not_set. One of: `explicit`, `not_set`.

Example input: `{"import_data":[{"email":"jane.doe@example.com","first_name":"Jane","cf:membership_level":"Gold"}],"list_ids":[]}`

### `constantcontact_contacts_remove_from_lists`

Remove Contacts from Lists · Write

Start a background activity that removes contacts from one or more lists. Pick the contacts with exactly one source option.
Returns the activity_id and status; check progress with Get Activity.
Use to clean up list membership in bulk. The contacts are not deleted.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `list_ids` (`array`, required): Target contact list IDs to remove the contacts from, up to 50.
- `exclude_contact_ids` (`array`, optional): Contact IDs to leave out. Only applies when the source is source_all_active_contacts or source_list_ids.
- `source_all_active_contacts` (`boolean`, optional): Source option: set to true to act on all active (billable) contacts. Use exactly one source option.
- `source_contact_ids` (`array`, optional): Source option: contact IDs to act on, up to 500. Use exactly one source option.
- `source_engagement_level` (`string`, optional): Source option: act on all contacts at this engagement level (as shown in the Constant Contact UI). Use exactly one source option.
- `source_list_ids` (`array`, optional): Source option: act on every member of these contact lists, up to 50 list IDs. Use exactly one source option.
- `source_tag_ids` (`array`, optional): Source option: act on every contact that has any of these tag IDs. Use exactly one source option.

Example input: `{"list_ids":[]}`

### `constantcontact_contacts_remove_tags`

Remove Tags from Contacts · Write

Start a background activity that removes tags from contacts. Pick the contacts with exactly one source option.
Returns the activity_id and status; check progress with Get Activity.
Use to untag contacts in bulk. The tags themselves are kept; use Delete Tag to remove a tag entirely.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `tag_ids` (`array`, required): Tag IDs to remove from the selected contacts.
- `exclude_contact_ids` (`array`, optional): Contact IDs to leave out. Only applies when the source is source_all_active_contacts or source_list_ids.
- `source_all_active_contacts` (`boolean`, optional): Source option: set to true to act on all active (billable) contacts. Use exactly one source option.
- `source_contact_ids` (`array`, optional): Source option: contact IDs to act on, up to 500. Use exactly one source option.
- `source_list_ids` (`array`, optional): Source option: act on every member of these contact lists, up to 50 list IDs. Use exactly one source option.
- `source_new_subscriber` (`boolean`, optional): Source option: set to true to act on contacts that subscribed in the last 30 days. Use exactly one source option.
- `source_tag_ids` (`array`, optional): Source option: act on every contact that has any of these tag IDs. Use exactly one source option.

Example input: `{"tag_ids":[]}`

### `constantcontact_custom_field_create`

Create Custom Field · Write

Create a contact custom field. An account can have up to 100 custom fields.
Returns the new field with its custom_field_id.
Use to store extra contact data such as membership level. Labels must be unique (409 if taken).

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `label` (`string`, required): The field name shown in the UI (max 50 characters).
- `type` (`string`, required): The type of data the field stores (max 20 characters), for example string, date, number, currency, single_select or multi_select.
- `choices` (`array`, optional): Choices for single_select and multi_select fields (up to 20 for checkbox and radio, 100 for dropdown). Each choice has a choice_label and optional display_order. Example: [{"choice_label": "Gold", "display_order": 1}].
- `metadata` (`object`, optional): Extra settings for some types: display_type (radio, checkbox or dropdown) for select fields; allow_negative, decimal_places and integer for number and currency fields; currency_code for currency; display_format for date fields. Example: {"display_type": "dropdown"}.
- `version` (`integer`, optional): For date fields: 2 stores real dates (supports comparisons), 1 is the legacy string date.

Example input: `{"label":"<label>","type":"<type>"}`

### `constantcontact_custom_field_update`

Update Custom Field · Write

Update a custom field's label or its select choices.
Returns the updated custom field.
Use to rename a field or edit its choices. The field's type cannot be changed.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `custom_field_id` (`string`, required): The unique ID (UUID) of the custom field. Get it from List Custom Fields.
- `choices` (`array`, optional): The full set of choices for select fields. Keep existing choices by including their choice_id; add new ones with a choice_label and optional display_order. Example: [{"choice_id": 1, "choice_label": "Gold", "display_order": 1}].
- `label` (`string`, optional): The new field name shown in the UI (max 50 characters).

Example input: `{"custom_field_id":"<custom_field_id>"}`

### `constantcontact_email_ab_test_create`

Create Email A/B Test · Write

Create a subject-line A/B test on a DRAFT primary email campaign activity.
Returns the A/B test settings. The activity type changes from Newsletter to A/B Test.
Use to test two subject lines; the one with more opens is sent to the remaining contacts.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `alternative_subject` (`string`, required): The second subject line to test.
- `campaign_activity_id` (`string`, required): The unique ID (UUID) of the email campaign activity. Get it from the campaign_activities array returned by Get Email Campaign (the activity with role primary_email holds the email content).
- `test_size` (`integer`, required): Percentage of recipients who get each version (for example 30 sends A to 30% and B to 30%). Valid values are 5 to 50.
- `winner_wait_duration` (`integer`, required): Hours to wait after the test send before picking the winner: 6, 12, 24 or 48. One of: `6`, `12`, `24`, `48`.

Example input: `{"alternative_subject":"<alternative_subject>","campaign_activity_id":"<campaign_activity_id>","test_size":1,"winner_wait_duration":6}`

### `constantcontact_email_campaign_activity_schedule`

Schedule Email Campaign Activity · Write

Send an email campaign activity now, or schedule it for a date. The activity needs recipients first (set them with Update Email Campaign Activity).
Returns the schedule as an array (empty when sending immediately).
Use to send a campaign to contacts. Use Send Test Email first to preview it. Only primary_email activities in DRAFT, DONE or ERROR status can be scheduled.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `campaign_activity_id` (`string`, required): The unique ID (UUID) of the email campaign activity. Get it from the campaign_activities array returned by Get Email Campaign (the activity with role primary_email holds the email content).
- `scheduled_date` (`string`, required): When to send, in ISO-8601 format (for example 2025-05-17T16:00:00.000Z). Use "0" to send immediately.

Example input: `{"campaign_activity_id":"<campaign_activity_id>","scheduled_date":"<scheduled_date>"}`

### `constantcontact_email_campaign_activity_test_send`

Send Test Email · Write

Send a test copy of an email campaign activity to up to 5 addresses. Dynamic content is not filled in. Limit: 50 test recipients per day.
Returns no content on success.
Use to check an email before Schedule Email Campaign Activity. Use Get Email Preview for the HTML without sending.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `campaign_activity_id` (`string`, required): The unique ID (UUID) of the email campaign activity. Get it from the campaign_activities array returned by Get Email Campaign (the activity with role primary_email holds the email content).
- `email_addresses` (`array`, required): Recipient email addresses for the test, up to 5.
- `personal_message` (`string`, optional): A note shown to test recipients above the email content.

Example input: `{"campaign_activity_id":"<campaign_activity_id>","email_addresses":[]}`

### `constantcontact_email_campaign_activity_update`

Update Email Campaign Activity · Write

Update an email campaign activity's sender, subject, content and recipients. Only primary_email activities in DRAFT or DONE status can be updated.
Returns the updated activity. Properties you leave out are cleared; html_content, physical_address_in_footer and document_properties are kept if omitted.
Use to set recipients (contact_list_ids or segment_ids) before scheduling. Call Get Email Campaign Activity first to keep current values.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `campaign_activity_id` (`string`, required): The unique ID (UUID) of the email campaign activity. Get it from the campaign_activities array returned by Get Email Campaign (the activity with role primary_email holds the email content).
- `from_email` (`string`, required): The sender email address. Must be a CONFIRMED account email address.
- `from_name` (`string`, required): The sender name shown to contacts.
- `reply_to_email` (`string`, required): The reply-to email address. Must be a CONFIRMED account email address.
- `subject` (`string`, required): The email subject line.
- `contact_list_ids` (`array`, optional): Contact list IDs to send to. Cannot be combined with segment_ids.
- `document_properties` (`object`, optional): Optional settings for legacy email formats (format_type 1 and 2), such as text_content, permission_reminder and view_as_webpage_enabled. Ignored for other formats.
- `html_content` (`string`, optional): The email HTML, for custom code emails (format_type 5). Include [[trackingImage]].
- `physical_address_in_footer` (`object`, optional): The organization's physical address shown in the email footer. Needs address_line1, country_code (ISO 3166-1 two-letter, uppercase) and organization_name; state_code is required for US addresses. Can also have address_line2, address_line3, address_optional, city, postal_code and state_non_us_name. Leave empty to use the account's physical address. Example: {"organization_name": "Acme Inc.", "address_line1": "123 Main St", "city": "Boston", "state_code": "MA", "postal_code": "02108", "country_code": "US"}.
- `preheader` (`string`, optional): A short summary shown after the subject line.
- `segment_ids` (`array`, optional): A single segment ID to send to, as a one-item array. Cannot be combined with contact_list_ids.

Example input: `{"campaign_activity_id":"<campaign_activity_id>","from_email":"<from_email>","from_name":"<from_name>","reply_to_email":"<reply_to_email>","subject":"<subject>"}`

### `constantcontact_email_campaign_create`

Create Email Campaign · Write

Create a draft custom-code (HTML) email campaign with its primary email activity.
Returns the campaign_id and its campaign_activities (including the primary_email campaign_activity_id).
Use to start a new email. Then set recipients with Update Email Campaign Activity and send with Schedule Email Campaign Activity.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `from_email` (`string`, required): The sender email address (max 80 characters). Must be a CONFIRMED account email address; see List Account Email Addresses.
- `from_name` (`string`, required): The sender name shown to contacts (max 100 characters).
- `html_content` (`string`, required): The email HTML (max 150000 characters). Include the [[trackingImage]] tag in the body so opens are reported.
- `name` (`string`, required): A unique campaign name (max 80 characters). Not shown to contacts.
- `reply_to_email` (`string`, required): The reply-to email address (max 80 characters). Must be a CONFIRMED account email address.
- `subject` (`string`, required): The email subject line.
- `format_type` (`integer`, optional): The email format. Use 5 for custom code (HTML) emails, the format this API creates. Defaults to 5. Default: `5`.
- `physical_address_in_footer` (`object`, optional): The organization's physical address shown in the email footer. Needs address_line1, country_code (ISO 3166-1 two-letter, uppercase) and organization_name; state_code is required for US addresses. Can also have address_line2, address_line3, address_optional, city, postal_code and state_non_us_name. Leave empty to use the account's physical address. Example: {"organization_name": "Acme Inc.", "address_line1": "123 Main St", "city": "Boston", "state_code": "MA", "postal_code": "02108", "country_code": "US"}.
- `preheader` (`string`, optional): A short summary shown after the subject line in most email clients (max 200 characters).

Example input: `{"from_email":"<from_email>","from_name":"<from_name>","html_content":"<html_content>","name":"<name>","reply_to_email":"<reply_to_email>","subject":"<subject>"}`

### `constantcontact_email_campaign_rename`

Rename Email Campaign · Write

Rename an email campaign. The name is not visible to contacts.
Returns the updated campaign.
Use to change the internal name. Use Update Email Campaign Activity to change subject or content.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `campaign_id` (`string`, required): The unique ID (UUID) of the email campaign. Get it from List Email Campaigns.
- `name` (`string`, required): The new unique campaign name (max 80 characters).

Example input: `{"campaign_id":"<campaign_id>","name":"<name>"}`

### `constantcontact_email_resend_to_non_openers_create`

Create Resend to Non-openers · Write

Schedule a resend of a primary email campaign activity to contacts who did not open it. One resend per campaign.
Returns the resend details, including its resend_request_id.
Use to boost opens. Set either delay_days (1 to 10) or delay_minutes (720 to 14400) after the original send.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `campaign_activity_id` (`string`, required): The unique ID (UUID) of the email campaign activity. Get it from the campaign_activities array returned by Get Email Campaign (the activity with role primary_email holds the email content).
- `resend_subject` (`string`, required): The subject line for the resend.
- `delay_days` (`integer`, optional): Days to wait after the original send, 1 to 10. If both delays are set, delay_minutes is ignored.
- `delay_minutes` (`integer`, optional): Minutes to wait after the original send, 720 (12 hours) to 14400 (10 days).

Example input: `{"campaign_activity_id":"<campaign_activity_id>","resend_subject":"<resend_subject>"}`

### `constantcontact_event_copy`

Copy Event · Write

Copy an existing event, with its settings, registration forms and landing pages, into a new DRAFT event. Deleted events cannot be copied.
Returns the new event's details.
Use to repeat an event. Use Create Event to start from defaults.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `event_id` (`string`, required): The unique ID (UUID) of the event. Get it from List Events.
- `target_event_name` (`string`, required): A unique name for the copied event.
- `source_campaign_activities` (`array`, optional): Campaign activity IDs of the event to copy. Copies all activities if empty.

Example input: `{"event_id":"<event_id>","target_event_name":"<target_event_name>"}`

### `constantcontact_event_create`

Create Event · Write

Create a new DRAFT event with default settings, registration form and landing page.
Returns the new event with its event_id.
Use to start an event; finish its setup in Constant Contact. Use Copy Event to start from an existing event.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `end_time` (`string`, optional): Event end time, ISO 8601. Defaults to one hour after the start.
- `name` (`string`, optional): Name for the new event. A default name is generated if empty.
- `start_time` (`string`, optional): Event start time, ISO 8601. Defaults to a future date.

Example input: `{}`

### `constantcontact_segment_create`

Create Segment · Write

Create a segment that targets the contacts matching the given criteria.
Returns the new segment with its segment_id.
Use to target contacts for a campaign by behavior or data. Segment names must be unique (409 if taken).

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `name` (`string`, required): A unique segment name.
- `segment_criteria` (`string`, required): The segment's contact selection criteria as a single string of escaped JSON (max 20000 characters). The JSON has a version and a criteria object whose top-level type is and/or with a group of conditions drawn from tracking, contact, list_membership and tags data. Don't evaluate more than 500 email campaigns or a date range over 1825 days. Example: {"version":"1.0.0","criteria":{"type":"and","group":[{"source":"tracking","field":"not_opened","op":"contains-any","const_value":"last-n-campaigns","param":"5"}]}}

Example input: `{"name":"<name>","segment_criteria":"<segment_criteria>"}`

### `constantcontact_segment_rename`

Rename Segment · Write

Rename a segment.
Returns the updated segment.
Use to change only the name. Use Update Segment to change the criteria.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `name` (`string`, required): The new unique segment name.
- `segment_id` (`integer`, required): The numeric ID of the segment. Get it from List Segments.

Example input: `{"name":"<name>","segment_id":1}`

### `constantcontact_segment_update`

Update Segment · Write

Replace a segment's name and criteria. Both are required even if only one changes.
Returns the updated segment.
Use to change who a segment targets. Use Rename Segment to change only the name.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `name` (`string`, required): The unique segment name (send the current one to keep it).
- `segment_criteria` (`string`, required): The segment's contact selection criteria as a single string of escaped JSON (max 20000 characters). The JSON has a version and a criteria object whose top-level type is and/or with a group of conditions drawn from tracking, contact, list_membership and tags data. Don't evaluate more than 500 email campaigns or a date range over 1825 days. Example: {"version":"1.0.0","criteria":{"type":"and","group":[{"source":"tracking","field":"not_opened","op":"contains-any","const_value":"last-n-campaigns","param":"5"}]}}
- `segment_id` (`integer`, required): The numeric ID of the segment. Get it from List Segments.

Example input: `{"name":"<name>","segment_criteria":"<segment_criteria>","segment_id":1}`

### `constantcontact_social_post_create`

Create Social Post · Write

Create a social media post for one or more connected profiles, saved as a draft or scheduled for publishing.
Returns the created post campaign with a campaign_activity_id per profile.
Use to publish to Facebook, Instagram, LinkedIn and other connected networks. Get profile IDs from List Social Profiles.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `profile_ids` (`array`, required): Profile IDs to post to. Can be empty only for a DRAFT.
- `status` (`string`, required): DRAFT saves without publishing; SCHEDULED publishes at scheduled_time (or right away if empty). One of: `DRAFT`, `SCHEDULED`.
- `image_urls` (`array`, optional): Public URLs of images to attach. Each URL must be properly encoded.
- `name` (`string`, optional): Campaign name for the post. A default name is generated if empty.
- `scheduled_time` (`string`, optional): When to publish a SCHEDULED post, ISO-8601.
- `text` (`string`, optional): The post text. Whether it is required depends on the network; always optional for a DRAFT.

Example input: `{"profile_ids":[],"status":"DRAFT"}`

### `constantcontact_tag_create`

Create Tag · Write

Create a new tag.
Returns the new tag with its tag_id.
Use before tagging contacts. Tag names must be unique (409 if taken). Use Add Tags to Contacts to apply it.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `name` (`string`, required): A unique tag name (1 to 255 characters).
- `tag_source` (`string`, optional): Optional label for the source used to identify the contacts to tag.

Example input: `{"name":"<name>"}`

### `constantcontact_tag_update`

Rename Tag · Write

Rename an existing tag. The tag_source cannot be changed.
Returns the updated tag.
Use to fix or change a tag name. The new name must be unique (409 if taken).

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `name` (`string`, required): The new unique tag name (max 255 characters).
- `tag_id` (`string`, required): The unique ID (UUID) of the tag. Get it from List Tags.

Example input: `{"name":"<name>","tag_id":"<tag_id>"}`

### `constantcontact_contact_delete`

Delete Contact · Destructive

Delete one contact. Deleted contacts get no email and are not billable, and can be revived later.
Returns no content on success.
Use for a single contact. Use Delete Contacts in Bulk for many contacts or all members of lists.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `contact_id` (`string`, required): The unique ID (UUID) of the contact. Get it from List Contacts.

Example input: `{"contact_id":"<contact_id>"}`

### `constantcontact_contact_list_delete`

Delete Contact List · Destructive

Delete a contact list and its memberships. The contacts themselves are kept.
Returns an activity (202) whose _links show where to check the deletion status.
Use for one list. Use Delete Contact Lists in Bulk for up to 100 lists.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `list_id` (`string`, required): The unique ID (UUID) of the contact list. Get it from List Contact Lists.

Example input: `{"list_id":"<list_id>"}`

### `constantcontact_contact_lists_bulk_delete`

Delete Contact Lists in Bulk · Destructive

Start a background activity that deletes up to 100 contact lists. The contacts are kept.
Returns the activity_id and state; check progress with Get Activity.
Use for many lists. Use Delete Contact List for one list.

Read only: no. Destructive: yes. Idempotent (safe to retry): no.

Inputs:

- `list_ids` (`array`, required): Contact list IDs to delete, up to 100.

Example input: `{"list_ids":[]}`

### `constantcontact_contacts_bulk_delete`

Delete Contacts in Bulk · Destructive

Start a background activity that deletes many contacts: up to 500 by ID, or every member of up to 50 lists.
Returns the activity_id and state; check progress with Get Activity.
Use for bulk cleanup. Use Delete Contact for one contact. Deleted contacts can be revived.

Read only: no. Destructive: yes. Idempotent (safe to retry): no.

Inputs:

- `contact_ids` (`array`, optional): Contact IDs to delete, up to 500. Use this or list_ids, not both.
- `list_ids` (`array`, optional): Delete every contact on these lists, up to 50. Use this or contact_ids, not both.

Example input: `{}`

### `constantcontact_custom_field_delete`

Delete Custom Field · Destructive

Delete a contact custom field and its values from all contacts.
Returns no content on success.
Use for one field. Use Delete Custom Fields in Bulk for up to 100 fields.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `custom_field_id` (`string`, required): The unique ID (UUID) of the custom field. Get it from List Custom Fields.

Example input: `{"custom_field_id":"<custom_field_id>"}`

### `constantcontact_custom_fields_bulk_delete`

Delete Custom Fields in Bulk · Destructive

Start a background activity that deletes up to 100 custom fields and their values.
Returns the activity_id and state; check progress with Get Activity.
Use for many fields. Use Delete Custom Field for one field.

Read only: no. Destructive: yes. Idempotent (safe to retry): no.

Inputs:

- `custom_field_ids` (`array`, required): Custom field IDs to delete, up to 100.

Example input: `{"custom_field_ids":[]}`

### `constantcontact_email_ab_test_delete`

Delete Email A/B Test · Destructive

Delete the A/B test of a DRAFT primary email campaign activity. The original subject line is kept.
Returns no content on success.
Use to turn an A/B test back into a regular newsletter.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `campaign_activity_id` (`string`, required): The unique ID (UUID) of the email campaign activity. Get it from the campaign_activities array returned by Get Email Campaign (the activity with role primary_email holds the email content).

Example input: `{"campaign_activity_id":"<campaign_activity_id>"}`

### `constantcontact_email_campaign_activity_unschedule`

Unschedule Email Campaign Activity · Destructive

Cancel the schedule of a SCHEDULED email campaign activity. It returns to its previous status (for example DRAFT).
Returns no content on success.
Use to stop a scheduled send before it goes out.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `campaign_activity_id` (`string`, required): The unique ID (UUID) of the email campaign activity. Get it from the campaign_activities array returned by Get Email Campaign (the activity with role primary_email holds the email content).

Example input: `{"campaign_activity_id":"<campaign_activity_id>"}`

### `constantcontact_email_campaign_delete`

Delete Email Campaign · Destructive

Delete an email campaign and its activities. Scheduled campaigns cannot be deleted; unschedule them first.
Returns no content on success. Users can restore deleted campaigns in the Constant Contact UI.
Use to remove drafts or old campaigns.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `campaign_id` (`string`, required): The unique ID (UUID) of the email campaign. Get it from List Email Campaigns.

Example input: `{"campaign_id":"<campaign_id>"}`

### `constantcontact_email_resend_to_non_openers_delete`

Delete Resend to Non-openers · Destructive

Delete (unschedule) a resend-to-non-openers activity.
Returns no content on success.
Use to cancel a planned resend. Get the resend_request_id from Get Resend to Non-openers.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `campaign_activity_id` (`string`, required): The unique ID (UUID) of the email campaign activity. Get it from the campaign_activities array returned by Get Email Campaign (the activity with role primary_email holds the email content).
- `resend_request_id` (`string`, required): The resend ID from Get Resend to Non-openers (for example 389093). Use DRAFT if the campaign is still a draft.

Example input: `{"campaign_activity_id":"<campaign_activity_id>","resend_request_id":"<resend_request_id>"}`

### `constantcontact_segment_delete`

Delete Segment · Destructive

Delete a segment. Check first that no scheduled campaign uses it.
Returns no content on success. Get Segment still returns a deleted segment's details.
Use to remove segments you no longer need.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `segment_id` (`integer`, required): The numeric ID of the segment. Get it from List Segments.

Example input: `{"segment_id":1}`

### `constantcontact_tag_delete`

Delete Tag · Destructive

Delete a tag and remove it from every contact that has it.
Returns an activity (202) whose link shows the deletion status.
Use for one tag. Use Delete Tags in Bulk for up to 500 tags.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `tag_id` (`string`, required): The unique ID (UUID) of the tag. Get it from List Tags.

Example input: `{"tag_id":"<tag_id>"}`

### `constantcontact_tags_bulk_delete`

Delete Tags in Bulk · Destructive

Start a background activity that deletes up to 500 tags and removes them from all contacts.
Returns the activity_id and state; check progress with Get Activity.
Use for many tags. Use Delete Tag for one tag.

Read only: no. Destructive: yes. Idempotent (safe to retry): no.

Inputs:

- `tag_ids` (`array`, required): Tag IDs to delete, up to 500.

Example input: `{"tag_ids":[]}`

## Related

Other Marketing connectors ([all 87](/agentkit/connectors/?category=marketing)):

- [HubSpot](/agentkit/connectors/hubspot/): Scalekit connector, OAuth, 457 tools
- [Mailchimp](/agentkit/connectors/mailchimp/): Scalekit connector, OAuth, 73 tools
- [Twitter / X](/agentkit/connectors/twitteroauth/): Scalekit connector, OAuth, 92 tools


---

## More Scalekit documentation

| Resource | What it contains | When to use it |
|----------|-----------------|----------------|
| [/llms.txt](/llms.txt) | Structured index with routing hints per product area | Start here — find which documentation set covers your topic before loading full content |
| [/llms-full.txt](/llms-full.txt) | Complete documentation for all Scalekit products in one file | Use when you need exhaustive context across multiple products or when the topic spans several areas |
| [sitemap-0.xml](https://docs.scalekit.com/sitemap-0.xml) | Full URL list of every documentation page | Use to discover specific page URLs you can fetch for targeted, page-level answers |
