# Constant Contact

> Manage Constant Contact contacts, lists and tags, and create, test, send and report on email campaigns.

App · 20 actions. Web page: https://docs.lodol.com/docs/integrations/constant-contact

## Actions

### Add contacts to lists

Add contacts - or every member of other lists - to lists. Constant Contact does this in the background; follow it with 'Get activity status'.

**Inputs**

- Lists (`list_ids`, text, required): Lists to add them to.
- Contact IDs (`contact_ids`, list): Up to 500 contact ids, as a list or comma-separated.
- Members of lists (`source_list_ids`, text): Instead of contact ids: every member of these lists.

**Outputs**

- `activity_errors` (list)
- `activity_id` (text)
- `completed_at` (text)
- `created_at` (text)
- `percent_done` (number)
- `started_at` (text)
- `state` (text)
- `status` (object)
- `updated_at` (text)

**Example output**

```json
{
  "activity_errors": [],
  "activity_id": "c1a6f6a2-5d7e-4b9c-8f3a-2e4d6b8a0c13",
  "completed_at": "2026-09-03T10:16:02Z",
  "created_at": "2026-09-03T10:16:00Z",
  "percent_done": 0,
  "started_at": "2026-09-03T10:16:00Z",
  "state": "initialized",
  "status": {
    "items_completed_count": 1,
    "items_total_count": 1,
    "list_count": 1
  },
  "updated_at": "2026-09-03T10:16:02Z"
}
```

### Create contact

Add a new contact, optionally to lists and with tags. Needs at least an email or a name. Fails if the email already belongs to a contact - use 'Create or update contact' for that.

**Inputs**

- Email (`email`, text): Email address (up to 80 characters).
- Email permission (`permission_to_send`, text): The permission you have to email them. Defaults to Implicit. Only choose Explicit if they asked to receive your email. One of: `implicit` (Implicit (an existing business relationship)), `explicit` (Explicit (the contact asked to be emailed)), `pending_confirmation` (Pending confirmation (double opt-in)).
- First name (`first_name`, text): First name (up to 50 characters).
- Last name (`last_name`, text): Last name (up to 50 characters).
- Job title (`job_title`, text): Job title (up to 50 characters).
- Company (`company_name`, text): Company name (up to 50 characters).
- Phone number (`phone_number`, text): Phone number (up to 25 characters).
- Phone type (`phone_type`, text): Defaults to Mobile. One of: `mobile`, `home`, `work`, `other`.
- Street (`street`, text): Street address.
- City (`city`, text): City.
- State (`state`, text): State or province.
- Postal code (`postal_code`, text): ZIP or postal code.
- Country (`country`, text): Country.
- Address type (`address_type`, text): Defaults to Home. One of: `home`, `work`, `other`.
- Birthday (`birthday`, date): Birthday. Constant Contact keeps the month and day only.
- Anniversary (`anniversary`, date): Anniversary date, e.g. when they became a customer.
- Lists (`list_ids`, text): Lists to add the contact to.
- Tags (`tag_ids`, text): Tags to give the contact.
- Custom fields (`custom_fields`, object): Values for your account's contact custom fields.

**Outputs**

- `anniversary` (text)
- `birthday_day` (number)
- `birthday_month` (number)
- `company_name` (text)
- `contact_id` (text)
- `create_source` (text)
- `created_at` (text)
- `custom_fields` (list)
- `deleted_at` (text)
- `email` (text)
- `email_address` (object)
- `first_name` (text)
- `job_title` (text)
- `last_name` (text)
- `list_memberships` (list)
- `notes` (list)
- `permission_to_send` (text)
- `phone_numbers` (list)
- `sms_channel` (object)
- `street_addresses` (list)
- `taggings` (list)
- `update_source` (text)
- `updated_at` (text)

**Example output**

```json
{
  "anniversary": "2021-06-01",
  "birthday_day": 12,
  "birthday_month": 4,
  "company_name": "Ramirez Bakery",
  "contact_id": "1618ae62-4752-11e9-9c8a-fa163e6b01c1",
  "create_source": "Account",
  "created_at": "2026-09-03T10:15:00Z",
  "custom_fields": [],
  "deleted_at": null,
  "email": "dana@example.com",
  "email_address": {
    "address": "dana@example.com",
    "opt_in_source": "Account",
    "permission_to_send": "implicit"
  },
  "first_name": "Dana",
  "job_title": "Owner",
  "last_name": "Ramirez",
  "list_memberships": [
    "07936f78-662a-11eb-af0a-fa163e56c9b0"
  ],
  "notes": [],
  "permission_to_send": "implicit",
  "phone_numbers": [
    {
      "kind": "mobile",
      "phone_number": "+1 555 0100"
    }
  ],
  "sms_channel": null,
  "street_addresses": [],
  "taggings": [
    "00f4f6ec-2b62-4c33-9a0a-7f1e5d4bf3e1"
  ],
  "update_source": "Account",
  "updated_at": "2026-09-03T10:15:00Z"
}
```

### Create contact list

Create a contact list. List names must be unique.

**Inputs**

- Name (`name`, text, required): List name (unique).
- Description (`description`, text): What the list is for.
- Favorite (`favorite`, true/false): Star the list in Constant Contact.

**Outputs**

- `created_at` (text)
- `deleted_at` (text)
- `description` (text)
- `favorite` (true/false)
- `list_id` (text)
- `membership_count` (number)
- `name` (text)
- `updated_at` (text)

**Example output**

```json
{
  "created_at": "2026-01-10T09:00:00Z",
  "deleted_at": null,
  "description": "Monthly newsletter subscribers",
  "favorite": false,
  "list_id": "07936f78-662a-11eb-af0a-fa163e56c9b0",
  "membership_count": null,
  "name": "Newsletter",
  "updated_at": "2026-09-01T09:00:00Z"
}
```

### Create email campaign

Create a draft email from your HTML (or plain text, which is wrapped in HTML). Constant Contact's open-tracking image is added for you. Choose who receives it when you send it.

**Inputs**

- Campaign name (`name`, text, required): Internal name, unique in the account (up to 80).
- Subject (`subject`, text, required): Email subject line.
- From name (`from_name`, text, required): Sender name recipients see (up to 100).
- Email body (`html_content`, text, required): The email's HTML, or plain text.
- From email (`from_email`, text): A confirmed email address of this account. Defaults to the first one.
- Reply-to email (`reply_to_email`, text): A confirmed email address of this account. Defaults to the From email.
- Preheader (`preheader`, text): Preview text shown after the subject (up to 200).

**Outputs**

- `activity_status` (text)
- `campaign_activity_id` (text)
- `campaign_id` (text)
- `contact_list_ids` (list)
- `created_at` (text)
- `current_status` (text)
- `from_email` (text)
- `from_name` (text)
- `html_content` (text)
- `name` (text)
- `permalink_url` (text)
- `preheader` (text)
- `reply_to_email` (text)
- `segment_ids` (list)
- `subject` (text)
- `type` (text)
- `updated_at` (text)

**Example output**

```json
{
  "activity_status": "DRAFT",
  "campaign_activity_id": "e2b4c6d8-1a3c-4e5f-9a7b-1c3d5e7f9a20",
  "campaign_id": "9f7d3e1a-2b6c-4d8e-a1f0-3c5b7d9e2a41",
  "contact_list_ids": [],
  "created_at": "2026-09-03T10:20:00Z",
  "current_status": "Draft",
  "from_email": "hello@example.com",
  "from_name": "Ramirez Bakery",
  "html_content": "<html><body><p>Hello!</p>[[trackingImage]]</body></html>",
  "name": "September newsletter",
  "permalink_url": null,
  "preheader": "Fresh bread and a new loyalty card",
  "reply_to_email": "hello@example.com",
  "segment_ids": [],
  "subject": "What's new this month",
  "type": "Custom Code Email",
  "updated_at": "2026-09-03T10:20:00Z"
}
```

### Create or update contact

Add a contact by email, or update the contact that already has that email. Lists and custom fields are added to what the contact has - never removed. Returns the full contact and whether it was created or updated.

**Inputs**

- Email (`email`, text, required): Email address (up to 50 characters).
- Lists (`list_ids`, text, required): Lists to add the contact to (at least one).
- First name (`first_name`, text): First name (up to 50 characters).
- Last name (`last_name`, text): Last name (up to 50 characters).
- Job title (`job_title`, text): Job title (up to 50 characters).
- Company (`company_name`, text): Company name (up to 50 characters).
- Phone number (`phone_number`, text): Phone number (up to 25 characters).
- Street (`street`, text): Street address.
- City (`city`, text): City.
- State (`state`, text): State or province.
- Postal code (`postal_code`, text): ZIP or postal code.
- Country (`country`, text): Country.
- Address type (`address_type`, text): Defaults to Home. One of: `home`, `work`, `other`.
- Birthday (`birthday`, date): Birthday. Constant Contact keeps the month and day only.
- Anniversary (`anniversary`, date): Anniversary date, e.g. when they became a customer.
- Custom fields (`custom_fields`, object): Values for your account's contact custom fields.

**Outputs**

- `action` (text)
- `anniversary` (text)
- `birthday_day` (number)
- `birthday_month` (number)
- `company_name` (text)
- `contact_id` (text)
- `create_source` (text)
- `created_at` (text)
- `custom_fields` (list)
- `deleted_at` (text)
- `email` (text)
- `email_address` (object)
- `first_name` (text)
- `job_title` (text)
- `last_name` (text)
- `list_memberships` (list)
- `notes` (list)
- `permission_to_send` (text)
- `phone_numbers` (list)
- `sms_channel` (object)
- `street_addresses` (list)
- `taggings` (list)
- `update_source` (text)
- `updated_at` (text)

**Example output**

```json
{
  "action": "created",
  "anniversary": "2021-06-01",
  "birthday_day": 12,
  "birthday_month": 4,
  "company_name": "Ramirez Bakery",
  "contact_id": "1618ae62-4752-11e9-9c8a-fa163e6b01c1",
  "create_source": "Account",
  "created_at": "2026-09-03T10:15:00Z",
  "custom_fields": [],
  "deleted_at": null,
  "email": "dana@example.com",
  "email_address": {
    "address": "dana@example.com",
    "opt_in_source": "Account",
    "permission_to_send": "implicit"
  },
  "first_name": "Dana",
  "job_title": "Owner",
  "last_name": "Ramirez",
  "list_memberships": [
    "07936f78-662a-11eb-af0a-fa163e56c9b0"
  ],
  "notes": [],
  "permission_to_send": "implicit",
  "phone_numbers": [
    {
      "kind": "mobile",
      "phone_number": "+1 555 0100"
    }
  ],
  "sms_channel": null,
  "street_addresses": [],
  "taggings": [
    "00f4f6ec-2b62-4c33-9a0a-7f1e5d4bf3e1"
  ],
  "update_source": "Account",
  "updated_at": "2026-09-03T10:15:00Z"
}
```

### Create tag

Create a contact tag. Tag names must be unique.

**Inputs**

- Name (`name`, text, required): Tag name (unique).

**Outputs**

- `contacts_count` (number)
- `created_at` (text)
- `name` (text)
- `tag_id` (text)
- `tag_source` (text)
- `updated_at` (text)

**Example output**

```json
{
  "contacts_count": 0,
  "created_at": "2026-02-01T09:00:00Z",
  "name": "VIP",
  "tag_id": "00f4f6ec-2b62-4c33-9a0a-7f1e5d4bf3e1",
  "tag_source": "Contact",
  "updated_at": "2026-02-01T09:00:00Z"
}
```

### Delete contact

Delete a contact. Constant Contact keeps it as deleted, and updating it later restores it.

**Inputs**

- Contact ID (`contact_id`, text, required): The contact's id (a UUID) - the contact_id of a List contacts result, or a Constant Contact contact page address containing it.

**Outputs**

- `deleted` (true/false)
- `id` (text)
- `type` (text)

**Example output**

```json
{
  "deleted": true,
  "id": "1618ae62-4752-11e9-9c8a-fa163e6b01c1",
  "type": "contact"
}
```

### Get activity status

How far a list or tag change has got (initialized, processing, completed, failed...) and any errors it hit.

**Inputs**

- Activity ID (`activity_id`, text, required): The activity_id an earlier list or tag step returned.

**Outputs**

- `activity_errors` (list)
- `activity_id` (text)
- `completed_at` (text)
- `created_at` (text)
- `percent_done` (number)
- `started_at` (text)
- `state` (text)
- `status` (object)
- `updated_at` (text)

**Example output**

```json
{
  "activity_errors": [],
  "activity_id": "c1a6f6a2-5d7e-4b9c-8f3a-2e4d6b8a0c13",
  "completed_at": "2026-09-03T10:16:02Z",
  "created_at": "2026-09-03T10:16:00Z",
  "percent_done": 100,
  "started_at": "2026-09-03T10:16:00Z",
  "state": "completed",
  "status": {
    "items_completed_count": 1,
    "items_total_count": 1,
    "list_count": 1
  },
  "updated_at": "2026-09-03T10:16:02Z"
}
```

### Get contact

Read one contact with its email permission, lists, tags, phones, addresses, custom fields and notes.

**Inputs**

- Contact ID (`contact_id`, text, required): The contact's id (a UUID) - the contact_id of a List contacts result, or a Constant Contact contact page address containing it.

**Outputs**

- `anniversary` (text)
- `birthday_day` (number)
- `birthday_month` (number)
- `company_name` (text)
- `contact_id` (text)
- `create_source` (text)
- `created_at` (text)
- `custom_fields` (list)
- `deleted_at` (text)
- `email` (text)
- `email_address` (object)
- `first_name` (text)
- `job_title` (text)
- `last_name` (text)
- `list_memberships` (list)
- `notes` (list)
- `permission_to_send` (text)
- `phone_numbers` (list)
- `sms_channel` (object)
- `street_addresses` (list)
- `taggings` (list)
- `update_source` (text)
- `updated_at` (text)

**Example output**

```json
{
  "anniversary": "2021-06-01",
  "birthday_day": 12,
  "birthday_month": 4,
  "company_name": "Ramirez Bakery",
  "contact_id": "1618ae62-4752-11e9-9c8a-fa163e6b01c1",
  "create_source": "Account",
  "created_at": "2026-09-03T10:15:00Z",
  "custom_fields": [],
  "deleted_at": null,
  "email": "dana@example.com",
  "email_address": {
    "address": "dana@example.com",
    "opt_in_source": "Account",
    "permission_to_send": "implicit"
  },
  "first_name": "Dana",
  "job_title": "Owner",
  "last_name": "Ramirez",
  "list_memberships": [
    "07936f78-662a-11eb-af0a-fa163e56c9b0"
  ],
  "notes": [],
  "permission_to_send": "implicit",
  "phone_numbers": [
    {
      "kind": "mobile",
      "phone_number": "+1 555 0100"
    }
  ],
  "sms_channel": null,
  "street_addresses": [],
  "taggings": [
    "00f4f6ec-2b62-4c33-9a0a-7f1e5d4bf3e1"
  ],
  "update_source": "Account",
  "updated_at": "2026-09-03T10:15:00Z"
}
```

### Get email campaign

Read a campaign: status, subject, sender, recipient lists, web link and HTML.

**Inputs**

- Email campaign (`campaign_id`, text, required): The campaign, or its campaign_id from List email campaigns.

**Outputs**

- `activity_status` (text)
- `campaign_activity_id` (text)
- `campaign_id` (text)
- `contact_list_ids` (list)
- `created_at` (text)
- `current_status` (text)
- `from_email` (text)
- `from_name` (text)
- `html_content` (text)
- `name` (text)
- `permalink_url` (text)
- `preheader` (text)
- `reply_to_email` (text)
- `segment_ids` (list)
- `subject` (text)
- `type` (text)
- `updated_at` (text)

**Example output**

```json
{
  "activity_status": "DRAFT",
  "campaign_activity_id": "e2b4c6d8-1a3c-4e5f-9a7b-1c3d5e7f9a20",
  "campaign_id": "9f7d3e1a-2b6c-4d8e-a1f0-3c5b7d9e2a41",
  "contact_list_ids": [],
  "created_at": "2026-09-03T10:20:00Z",
  "current_status": "Draft",
  "from_email": "hello@example.com",
  "from_name": "Ramirez Bakery",
  "html_content": "<html><body><p>Hello!</p>[[trackingImage]]</body></html>",
  "name": "September newsletter",
  "permalink_url": null,
  "preheader": "Fresh bread and a new loyalty card",
  "reply_to_email": "hello@example.com",
  "segment_ids": [],
  "subject": "What's new this month",
  "type": "Custom Code Email",
  "updated_at": "2026-09-03T10:20:00Z"
}
```

### Get email campaign stats

Sends, opens, clicks, bounces, forwards and unsubscribes, with rates, for up to 150 campaigns.

**Inputs**

- Email campaigns (`campaign_ids`, text, required): The campaigns to report on.

**Outputs**

- `errors` (list)
- `results` (list)

**Example output**

```json
{
  "errors": [],
  "results": [
    {
      "campaign_id": "9f7d3e1a-2b6c-4d8e-a1f0-3c5b7d9e2a41",
      "last_refresh_time": "2026-09-05T08:00:00Z",
      "percents": {
        "bounce": 0.8,
        "click": 12.6,
        "open": 45.5
      },
      "stats": {
        "em_bounces": 2,
        "em_clicks": 31,
        "em_opens": 112,
        "em_optouts": 1,
        "em_sends": 248
      }
    }
  ]
}
```

### List contact lists

Contact lists with how many members each has.

**Inputs**

- Name (`name`, text): Only the list with exactly this name.
- Status (`status`, text): Defaults to active lists. One of: `active`, `deleted`, `all`.
- Maximum results (`limit`, number): How many to return in one page (1-500). From 1 to 500. Default: `50`.
- Include total count (`include_count`, true/false): Also return the total number of matches.
- Next page (`next_page`, text): The next_page value from an earlier List contact lists step, to read the following page. Other filters are ignored when it is set.

**Outputs**

- `count` (number)
- `lists` (list)
- `next_page` (text)
- `total` (number)

**Example output**

```json
{
  "count": 1,
  "lists": [
    {
      "created_at": "2026-01-10T09:00:00Z",
      "deleted_at": null,
      "description": "Monthly newsletter subscribers",
      "favorite": false,
      "list_id": "07936f78-662a-11eb-af0a-fa163e56c9b0",
      "membership_count": 248,
      "name": "Newsletter",
      "updated_at": "2026-09-01T09:00:00Z"
    }
  ],
  "next_page": null,
  "total": null
}
```

### List contacts

Find contacts by email, list, tag, subscription status or the date they were created or changed, with their lists, tags, phones, addresses and custom fields.

**Inputs**

- Email (`email`, text): Only the contact with this email address.
- Subscription status (`status`, text): Defaults to every status except deleted. One of: `all`, `active`, `unsubscribed`, `pending_confirmation` (Pending confirmation), `temp_hold` (Temporary hold), `not_set` (Not set), `deleted`.
- Lists (`list_ids`, text): Only members of these lists (up to 25).
- Tags (`tag_ids`, text): Only contacts with these tags (up to 50).
- Created after (`created_after`, date and time): Only contacts created after this time.
- Created before (`created_before`, date and time): Only contacts created before this time.
- Updated after (`updated_after`, date and time): Only contacts changed after this time.
- Updated before (`updated_before`, date and time): Only contacts changed before this time.
- Maximum results (`limit`, number): How many to return in one page (1-500). From 1 to 500. Default: `50`.
- Include total count (`include_count`, true/false): Also return the total number of matches.
- Next page (`next_page`, text): The next_page value from an earlier List contacts step, to read the following page. Other filters are ignored when it is set.

**Outputs**

- `contacts` (list)
- `count` (number)
- `next_page` (text)
- `total` (number)

**Example output**

```json
{
  "contacts": [
    {
      "anniversary": "2021-06-01",
      "birthday_day": 12,
      "birthday_month": 4,
      "company_name": "Ramirez Bakery",
      "contact_id": "1618ae62-4752-11e9-9c8a-fa163e6b01c1",
      "create_source": "Account",
      "created_at": "2026-09-03T10:15:00Z",
      "custom_fields": [],
      "deleted_at": null,
      "email": "dana@example.com",
      "email_address": {
        "address": "dana@example.com",
        "opt_in_source": "Account",
        "permission_to_send": "implicit"
      },
      "first_name": "Dana",
      "job_title": "Owner",
      "last_name": "Ramirez",
      "list_memberships": [
        "07936f78-662a-11eb-af0a-fa163e56c9b0"
      ],
      "notes": [],
      "permission_to_send": "implicit",
      "phone_numbers": [
        {
          "kind": "mobile",
          "phone_number": "+1 555 0100"
        }
      ],
      "sms_channel": null,
      "street_addresses": [],
      "taggings": [
        "00f4f6ec-2b62-4c33-9a0a-7f1e5d4bf3e1"
      ],
      "update_source": "Account",
      "updated_at": "2026-09-03T10:15:00Z"
    }
  ],
  "count": 1,
  "next_page": null,
  "total": null
}
```

### List email campaigns

Email campaigns with their status, newest first.

**Inputs**

- Updated after (`updated_after`, date and time): Only campaigns changed after this time.
- Updated before (`updated_before`, date and time): Only campaigns changed before this time.
- Include deleted (`include_removed`, true/false): Also return deleted (Removed) campaigns.
- Maximum results (`limit`, number): How many to return in one page (1-500). From 1 to 500. Default: `50`.
- Next page (`next_page`, text): The next_page value from an earlier List email campaigns step, to read the following page. Other filters are ignored when it is set.

**Outputs**

- `campaigns` (list)
- `count` (number)
- `next_page` (text)

**Example output**

```json
{
  "campaigns": [
    {
      "campaign_id": "9f7d3e1a-2b6c-4d8e-a1f0-3c5b7d9e2a41",
      "created_at": "2026-09-03T10:20:00Z",
      "current_status": "Draft",
      "name": "September newsletter",
      "type": "Custom Code Email",
      "updated_at": "2026-09-03T10:20:00Z"
    }
  ],
  "count": 1,
  "next_page": null
}
```

### List tags

Contact tags, optionally with how many contacts have each.

**Inputs**

- Maximum results (`limit`, number): How many to return in one page (1-500). From 1 to 500. Default: `50`.
- Include contact counts (`include_count`, true/false): Also return how many contacts have each tag.
- Next page (`next_page`, text): The next_page value from an earlier List tags step, to read the following page. Other filters are ignored when it is set.

**Outputs**

- `count` (number)
- `next_page` (text)
- `tags` (list)

**Example output**

```json
{
  "count": 1,
  "next_page": null,
  "tags": [
    {
      "contacts_count": 12,
      "created_at": "2026-02-01T09:00:00Z",
      "name": "VIP",
      "tag_id": "00f4f6ec-2b62-4c33-9a0a-7f1e5d4bf3e1",
      "tag_source": "Contact",
      "updated_at": "2026-02-01T09:00:00Z"
    }
  ]
}
```

### Remove contacts from lists

Remove contacts from lists. The contacts themselves are kept. Runs in the background; follow it with 'Get activity status'.

**Inputs**

- Lists (`list_ids`, text, required): Lists to remove them from.
- Contact IDs (`contact_ids`, list, required): Up to 500 contact ids, as a list or comma-separated.

**Outputs**

- `activity_errors` (list)
- `activity_id` (text)
- `completed_at` (text)
- `created_at` (text)
- `percent_done` (number)
- `started_at` (text)
- `state` (text)
- `status` (object)
- `updated_at` (text)

**Example output**

```json
{
  "activity_errors": [],
  "activity_id": "c1a6f6a2-5d7e-4b9c-8f3a-2e4d6b8a0c13",
  "completed_at": "2026-09-03T10:16:02Z",
  "created_at": "2026-09-03T10:16:00Z",
  "percent_done": 0,
  "started_at": "2026-09-03T10:16:00Z",
  "state": "initialized",
  "status": {
    "items_completed_count": 1,
    "items_total_count": 1,
    "list_count": 1
  },
  "updated_at": "2026-09-03T10:16:02Z"
}
```

### Send or schedule email campaign

Send a campaign to lists now, or at a set time. This emails real contacts. Sets the campaign's recipient lists first.

**Inputs**

- Email campaign (`campaign_id`, text, required): The campaign, or its campaign_id from List email campaigns.
- Lists (`list_ids`, text, required): Lists to send to.
- Send at (`send_at`, date and time): When to send. Leave blank to send immediately.

**Outputs**

- `campaign_activity_id` (text)
- `campaign_id` (text)
- `contact_list_ids` (list)
- `scheduled_date` (text)
- `sent_now` (true/false)

**Example output**

```json
{
  "campaign_activity_id": "e2b4c6d8-1a3c-4e5f-9a7b-1c3d5e7f9a20",
  "campaign_id": "9f7d3e1a-2b6c-4d8e-a1f0-3c5b7d9e2a41",
  "contact_list_ids": [
    "07936f78-662a-11eb-af0a-fa163e56c9b0"
  ],
  "scheduled_date": "2026-10-01T14:00:00.000Z",
  "sent_now": false
}
```

### Send test email

Send a test of a campaign to up to five addresses - by default to its From address. Constant Contact allows 50 test recipients a day.

**Inputs**

- Email campaign (`campaign_id`, text, required): The campaign, or its campaign_id from List email campaigns.
- Send to (`email_addresses`, list): Up to 5 addresses. Blank sends to the From email.
- Personal message (`personal_message`, text): A note shown above the email in the test.

**Outputs**

- `campaign_activity_id` (text)
- `campaign_id` (text)
- `email_addresses` (list)
- `sent` (true/false)

**Example output**

```json
{
  "campaign_activity_id": "e2b4c6d8-1a3c-4e5f-9a7b-1c3d5e7f9a20",
  "campaign_id": "9f7d3e1a-2b6c-4d8e-a1f0-3c5b7d9e2a41",
  "email_addresses": [
    "hello@example.com"
  ],
  "sent": true
}
```

### Tag contacts

Add tags to contacts - or to every member of some lists - keeping their other tags. Runs in the background; follow it with 'Get activity status'.

**Inputs**

- Tags (`tag_ids`, text, required): Tags to add.
- Contact IDs (`contact_ids`, list): Up to 500 contact ids, as a list or comma-separated.
- Members of lists (`source_list_ids`, text): Instead of contact ids: every member of these lists.

**Outputs**

- `activity_errors` (list)
- `activity_id` (text)
- `completed_at` (text)
- `created_at` (text)
- `percent_done` (number)
- `started_at` (text)
- `state` (text)
- `status` (object)
- `updated_at` (text)

**Example output**

```json
{
  "activity_errors": [],
  "activity_id": "c1a6f6a2-5d7e-4b9c-8f3a-2e4d6b8a0c13",
  "completed_at": "2026-09-03T10:16:02Z",
  "created_at": "2026-09-03T10:16:00Z",
  "percent_done": 0,
  "started_at": "2026-09-03T10:16:00Z",
  "state": "initialized",
  "status": {
    "items_completed_count": 1,
    "items_total_count": 1,
    "list_count": 1
  },
  "updated_at": "2026-09-03T10:16:02Z"
}
```

### Update contact

Change fields on a contact. Fields left blank keep their value. Setting a phone, address, lists or tags replaces the contact's existing ones. Updating a deleted contact restores it.

**Inputs**

- Contact ID (`contact_id`, text, required): The contact's id (a UUID) - the contact_id of a List contacts result, or a Constant Contact contact page address containing it.
- New email (`email`, text): A new email address for the contact.
- Email permission (`permission_to_send`, text): Change the permission you have to email them. Unsubscribed stops all email; Constant Contact does not let an integration subscribe them again. One of: `implicit` (Implicit (an existing business relationship)), `explicit` (Explicit (the contact asked to be emailed)), `pending_confirmation` (Pending confirmation (double opt-in)), `unsubscribed`.
- Unsubscribe reason (`opt_out_reason`, text): Why they unsubscribed, when unsubscribing them. Only when Email permission is Unsubscribed.
- First name (`first_name`, text): First name (up to 50 characters).
- Last name (`last_name`, text): Last name (up to 50 characters).
- Job title (`job_title`, text): Job title (up to 50 characters).
- Company (`company_name`, text): Company name (up to 50 characters).
- Phone number (`phone_number`, text): Replaces the contact's phone numbers.
- Phone type (`phone_type`, text): Defaults to Mobile. One of: `mobile`, `home`, `work`, `other`.
- Street (`street`, text): Street address.
- City (`city`, text): City.
- State (`state`, text): State or province.
- Postal code (`postal_code`, text): ZIP or postal code.
- Country (`country`, text): Country.
- Address type (`address_type`, text): Defaults to Home. One of: `home`, `work`, `other`.
- Birthday (`birthday`, date): Birthday. Constant Contact keeps the month and day only.
- Anniversary (`anniversary`, date): Anniversary date, e.g. when they became a customer.
- Lists (`list_ids`, text): Replaces the contact's lists with these.
- Tags (`tag_ids`, text): Replaces the contact's tags with these.
- Custom fields (`custom_fields`, object): Values for your account's contact custom fields.

**Outputs**

- `anniversary` (text)
- `birthday_day` (number)
- `birthday_month` (number)
- `company_name` (text)
- `contact_id` (text)
- `create_source` (text)
- `created_at` (text)
- `custom_fields` (list)
- `deleted_at` (text)
- `email` (text)
- `email_address` (object)
- `first_name` (text)
- `job_title` (text)
- `last_name` (text)
- `list_memberships` (list)
- `notes` (list)
- `permission_to_send` (text)
- `phone_numbers` (list)
- `sms_channel` (object)
- `street_addresses` (list)
- `taggings` (list)
- `update_source` (text)
- `updated_at` (text)

**Example output**

```json
{
  "anniversary": "2021-06-01",
  "birthday_day": 12,
  "birthday_month": 4,
  "company_name": "Ramirez Bakery",
  "contact_id": "1618ae62-4752-11e9-9c8a-fa163e6b01c1",
  "create_source": "Account",
  "created_at": "2026-09-03T10:15:00Z",
  "custom_fields": [],
  "deleted_at": null,
  "email": "dana@example.com",
  "email_address": {
    "address": "dana@example.com",
    "opt_in_source": "Account",
    "permission_to_send": "implicit"
  },
  "first_name": "Dana",
  "job_title": "Owner",
  "last_name": "Ramirez",
  "list_memberships": [
    "07936f78-662a-11eb-af0a-fa163e56c9b0"
  ],
  "notes": [],
  "permission_to_send": "implicit",
  "phone_numbers": [
    {
      "kind": "mobile",
      "phone_number": "+1 555 0100"
    }
  ],
  "sms_channel": null,
  "street_addresses": [],
  "taggings": [
    "00f4f6ec-2b62-4c33-9a0a-7f1e5d4bf3e1"
  ],
  "update_source": "Account",
  "updated_at": "2026-09-03T10:15:00Z"
}
```
