> **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 ActiveCampaign

The ActiveCampaign connector lets your AI agent act in each user's ActiveCampaign account. Each user connects their own ActiveCampaign API key once, and Scalekit sends it with every call, so your agent never handles credentials. It comes with 120 tools.

**Authentication:** API Key
**Categories:** Marketing, CRM & Sales, Automation
**Tools:** 120: 62 read, 43 write, 15 destructive
**Users sign in with:** API key
**Built by:** Scalekit connector
**Try it:** [Playground in the Scalekit dashboard](https://app.scalekit.com/ws/signup?sk_intent=playground&provider=ACTIVECAMPAIGN)

## 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 ActiveCampaign connection

   In **AgentKit > Connections**, create an ActiveCampaign connection. The name you give it is the `connection_name` your code passes. See [Configure connections](/agentkit/connections/).

4. ### 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 = 'activecampaign'
   const identifier = 'user_123'

   // Generate an authorization link for the user
   const { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })
   console.log('Authorize ActiveCampaign:', 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: 'activecampaign_get_current_user',
     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 = "activecampaign"
   identifier = "user_123"

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

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

   ```bash
   python quickstart.py
   ```

   Each user opens the link once and enters their ActiveCampaign credentials there. 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: 'activecampaign_get_account',
  toolInput: {
    account_id: 1,
  },
  connector: 'activecampaign',
  identifier: 'user_123',
})
```

**Python**

```python
result = actions.execute_tool(
    tool_name="activecampaign_get_account",
    tool_input={
        "account_id": 1,
    },
    connection_name="activecampaign",
    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.

### `activecampaign_get_account`

Get Account · Read-only

Retrieve one account (company) by ID.
Returns the account's name, accountUrl, owner, custom field values and dates.
Use activecampaign_list_accounts to find the ID.

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

Inputs:

- `account_id` (`integer`, required): ID of the account.

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

### `activecampaign_get_bulk_import_status`

Get Bulk Import Status · Read-only

Check the status of one bulk contact import by its batchId.
Returns status (completed when done), success (IDs of contacts created or updated) and failure (emails not imported).
Use this after activecampaign_bulk_import_contacts; poll until status is completed instead of resubmitting.

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

Inputs:

- `batch_id` (`string`, required): The batchId returned by bulk_import_contacts.

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

### `activecampaign_get_campaign`

Get Campaign · Read-only

Retrieve one email campaign by ID.
Returns the campaign's name, type, status, schedule and lifetime send, open, click, unsubscribe and bounce totals.
Use activecampaign_get_campaign_messages for per-message (A/B variation) totals.

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

Inputs:

- `campaign_id` (`integer`, required): ID of the campaign.

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

### `activecampaign_get_campaign_links`

Get Campaign Links · Read-only

List the tracked links in one email campaign.
Returns links with id, link URL, name and click tracking details.
Use this to see which links a campaign contains.

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

Inputs:

- `campaign_id` (`integer`, required): ID of the campaign.

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

### `activecampaign_get_campaign_messages`

Get Campaign Messages · Read-only

List the messages a campaign sent with their lifetime reporting totals; split (A/B) campaigns return one row per variation.
Returns campaignMessages with message ID and send, open, click and bounce counts. Not paginated.
Use this to compare A/B variations. Use activecampaign_get_campaign for campaign-level totals.

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

Inputs:

- `campaign_id` (`integer`, required): ID of the campaign.

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

### `activecampaign_get_contact`

Get Contact · Read-only

Retrieve one contact by ID.
Returns the contact record plus side-loaded contactLists, contactAutomations, fieldValues, deals and geoIps.
Use this when you have the contact ID. Use activecampaign_list_contacts to find a contact by email or name.

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

Inputs:

- `contact_id` (`integer`, required): ID of the contact.

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

### `activecampaign_get_contact_account_contacts`

Get Contact Account Associations · Read-only

List the account associations of one contact.
Returns accountContacts rows with account (account ID), jobTitle and the association id.
Use this to find which accounts a contact belongs to. Use activecampaign_create_account_contact to link a contact to an account.

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

Inputs:

- `contact_id` (`integer`, required): ID of the contact.

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

### `activecampaign_get_contact_automations`

Get Contact Automations · Read-only

List the automations one contact is in or has completed.
Returns contactAutomations rows with automation (automation ID), status, adddate and the row id.
Use this for one contact. Use activecampaign_list_automation_contacts for every contact in one automation.

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

Inputs:

- `contact_id` (`integer`, required): ID of the contact.

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

### `activecampaign_get_contact_bounce_logs`

Get Contact Bounce Logs · Read-only

List the bounce log entries recorded for one contact.
Returns bounceLogs entries with timestamp, bounce code and campaign.
Use this to see why emails to a contact bounced.

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

Inputs:

- `contact_id` (`integer`, required): ID of the contact.

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

### `activecampaign_get_contact_custom_field`

Get Contact Custom Field · Read-only

Retrieve one contact custom field definition by ID.
Returns the field's title, type, perstag and default value, with its options in fieldOptions and list links in fieldRels.
Use activecampaign_list_contact_custom_fields to find the ID.

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

Inputs:

- `field_id` (`integer`, required): ID of the custom field definition (not a field option ID).

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

### `activecampaign_get_contact_deals`

Get Contact Deals · Read-only

List the deals where this contact is the primary contact.
Returns deal records (id, title, value, currency, stage, group, status).
Use this for one contact's deals. Use activecampaign_list_deals to search deals across the account.

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

Inputs:

- `contact_id` (`integer`, required): ID of the contact.

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

### `activecampaign_get_contact_field_value`

Get Contact Field Value · Read-only

Retrieve one stored contact custom field value by its fieldValue ID.
Returns the entry with contact, field and value.
Use activecampaign_get_contact_field_values to read every value of a contact.

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

Inputs:

- `field_value_id` (`string`, required): ID of the fieldValue record (not a contact or field ID).

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

### `activecampaign_get_contact_field_values`

Get Contact Field Values · Read-only

List every stored custom field value of one contact.
Returns fieldValues entries with field (custom field ID), value and the entry's own id.
Use this for one contact. Use activecampaign_list_contact_field_values to query values across contacts.

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

Inputs:

- `contact_id` (`integer`, required): ID of the contact.

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

### `activecampaign_get_contact_lists`

Get Contact Lists · Read-only

List the lists a contact belongs to, one row per subscription.
Returns contactLists rows with list, status (1 active, 2 unsubscribed, 3 bounced), sdate, udate and unsubreason.
Use this to check a contact's subscriptions. Use activecampaign_update_contact_list_status to change them.

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

Inputs:

- `contact_id` (`integer`, required): ID of the contact.

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

### `activecampaign_get_contact_notes`

Get Contact Notes · Read-only

List all notes attached to one contact, drafts included.
Returns notes with note text, userid, cdate and mdate; results are not paginated or ordered.
Use this for one contact. Use activecampaign_create_note with reltype Subscriber to add a note.

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

Inputs:

- `contact_id` (`integer`, required): ID of the contact.

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

### `activecampaign_get_current_user`

Get Current User · Read-only

Retrieve the user whose API key this connection uses.
Returns that user's id, username, name and email.
Use this to check the connection or to get your own user ID.

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

Inputs: none.

Example input: `{}`

### `activecampaign_get_custom_object_record`

Get Custom Object Record · Read-only

Retrieve one custom object record by schema ID and record ID.
Returns the record's id, externalId, fields and relationships.
Use activecampaign_list_custom_object_records to find the record ID.

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

Inputs:

- `record_id` (`string`, required): ID of the custom object record.
- `schema_id` (`string`, required): ID of the custom object schema.

Example input: `{"record_id":"<record_id>","schema_id":"<schema_id>"}`

### `activecampaign_get_deal`

Get Deal · Read-only

Retrieve one deal by ID.
Returns the deal's title, value (cents), currency, pipeline, stage, owner, status, primary contact and account.
Use activecampaign_list_deals to find a deal by title or contact.

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

Inputs:

- `deal_id` (`integer`, required): ID of the deal.

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

### `activecampaign_get_deal_stage`

Get Deal Stage · Read-only

Retrieve one deal stage by ID.
Returns the stage's title, pipeline, order, color and card settings.
Use activecampaign_list_deal_stages to find the ID.

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

Inputs:

- `stage_id` (`integer`, required): ID of the deal stage.

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

### `activecampaign_get_deal_task`

Get Task · Read-only

Retrieve one CRM task by ID.
Returns the task's title, note, due date, status, type, assignee and related deal or contact.
Use activecampaign_list_deal_tasks to find the ID.

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

Inputs:

- `task_id` (`integer`, required): ID of the task.

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

### `activecampaign_get_ecom_customer`

Get E-commerce Customer · Read-only

Retrieve one e-commerce customer by ID.
Returns the customer's email, connection, external ID and order and revenue totals.
Use activecampaign_list_ecom_customers to find the ID.

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

Inputs:

- `customer_id` (`string`, required): ID of the e-commerce customer.

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

### `activecampaign_get_ecom_order`

Get E-commerce Order · Read-only

Retrieve one e-commerce order by ID.
Returns the order's products, totals, currency, state, customer and dates.
Use activecampaign_list_ecom_orders to find the ID.

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

Inputs:

- `order_id` (`integer`, required): ID of the e-commerce order.

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

### `activecampaign_get_list`

Get List · Read-only

Retrieve one contact list by ID.
Returns the list's name, stringid, channel, sender settings and dates, without subscriber counts.
Use activecampaign_list_lists for subscriber counts.

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

Inputs:

- `list_id` (`string`, required): ID of the list.

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

### `activecampaign_get_pipeline`

Get Pipeline · Read-only

Retrieve one deal pipeline by ID.
Returns the pipeline's title, currency, auto-assign settings and stages.
Use activecampaign_list_pipelines to find the ID.

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

Inputs:

- `pipeline_id` (`string`, required): ID of the pipeline.

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

### `activecampaign_get_tag`

Get Tag · Read-only

Retrieve one tag definition by ID.
Returns the tag's id, tag (name), tagType, description and dates.
Use activecampaign_list_tags with name to look a tag up by name.

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

Inputs:

- `tag_id` (`integer`, required): ID of the tag.

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

### `activecampaign_get_user`

Get User · Read-only

Retrieve one user by ID.
Returns the user's username, name, email and phone.
Use activecampaign_get_current_user for the user whose API key is connected.

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

Inputs:

- `user_id` (`integer`, required): ID of the user.

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

### `activecampaign_list_account_contacts`

List Account Contacts · Read-only

List contact-to-account associations, optionally for one contact or one account.
Returns accountContacts rows with id, account, contact and jobTitle.
Use this to list an account's contacts. Use activecampaign_get_contact_account_contacts for one contact.

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

Inputs:

- `account_id` (`integer`, optional): Return associations of this account ID.
- `contact_id` (`integer`, optional): Return associations of this contact ID.
- `limit` (`integer`, optional): Maximum number of associations to return in one page. The API default is 20 and the maximum is 100.
- `offset` (`integer`, optional): Number of associations to skip before the page starts (zero-based). Increase it by limit to fetch the next page; meta.total in the response holds the total count.

Example input: `{}`

### `activecampaign_list_account_custom_field_values`

List Account Custom Field Values · Read-only

List stored account custom field values, optionally for one account.
Returns accountCustomFieldData with id, customerAccountId, customFieldId and fieldValue.
Use this to read account custom fields and to find the value ID for activecampaign_update_account_custom_field_value.

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

Inputs:

- `account_id` (`string`, optional): Return only values of this account ID.
- `limit` (`integer`, optional): Maximum number of values to return in one page. The API default is 20 and the maximum is 100.
- `offset` (`integer`, optional): Number of values to skip before the page starts (zero-based). Increase it by limit to fetch the next page; meta.total in the response holds the total count.

Example input: `{}`

### `activecampaign_list_account_custom_fields`

List Account Custom Fields · Read-only

List account custom field definitions.
Returns accountCustomFieldMeta with id, fieldLabel, fieldType and options.
Use this to find customFieldId values for account custom fields.

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

Inputs:

- `limit` (`integer`, optional): Maximum number of fields to return (API default 100).
- `offset` (`integer`, optional): Number of fields to skip before the page starts (zero-based). Increase it by limit to fetch the next page; meta.total in the response holds the total count.

Example input: `{}`

### `activecampaign_list_accounts`

List Accounts · Read-only

List accounts (companies), optionally searching by name.
Returns accounts with id, name, accountUrl, owner and, when requested, contactCount and dealCount.
Use this to find an account ID. Use activecampaign_get_account for one account.

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

Inputs:

- `count_deals` (`boolean`, optional): Set to true to include accurate contactCount and dealCount per account.
- `limit` (`integer`, optional): Maximum number of accounts to return in one page. The API default is 20 and the maximum is 100.
- `offset` (`integer`, optional): Number of accounts to skip before the page starts (zero-based). Increase it by limit to fetch the next page; meta.total in the response holds the total count.
- `search` (`string`, optional): Return accounts whose name matches this text.

Example input: `{}`

### `activecampaign_list_automation_contacts`

List Automation Contacts · Read-only

List the contacts that are in, or have run through, one automation.
Returns contactAutomations rows with contact, status (1 in progress, 2 ended), adddate and lastblock.
Use this for one automation. Use activecampaign_get_contact_automations for one contact.

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

Inputs:

- `automation_id` (`integer`, required): ID of the automation.
- `contact_id` (`integer`, optional): Return only the row for this contact ID.
- `limit` (`integer`, optional): Maximum number of rows to return in one page. The API default is 20 and the maximum is 100.
- `offset` (`integer`, optional): Number of rows to skip before the page starts (zero-based). Increase it by limit to fetch the next page; meta.total in the response holds the total count.
- `order_by_added` (`string`, optional): Sort by the date the contact entered the automation: asc or desc. One of: `asc`, `desc`.
- `status` (`integer`, optional): Run status: 1 in progress, 2 ended. One of: `1`, `2`.

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

### `activecampaign_list_automations`

List Automations · Read-only

List the account's automations.
Returns automations with id, name, status, entered and exited counts, cdate and mdate.
Use this to find an automation ID before activecampaign_add_contact_to_automation or activecampaign_list_automation_contacts.

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

Inputs:

- `limit` (`integer`, optional): Maximum number of automations to return in one page. The API default is 20 and the maximum is 100.
- `offset` (`integer`, optional): Number of automations to skip before the page starts (zero-based). Increase it by limit to fetch the next page; meta.total in the response holds the total count.

Example input: `{}`

### `activecampaign_list_campaigns`

List Campaigns · Read-only

List email campaigns, optionally only those belonging to one automation.
Returns campaigns with id, name, type, status, sdate, ldate and send, open, click and bounce counts.
Use this to find campaigns and their totals. Use activecampaign_get_campaign for one campaign.

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

Inputs:

- `automation_id` (`integer`, optional): Return only campaigns that belong to this automation ID.
- `limit` (`integer`, optional): Maximum number of campaigns to return in one page. The API default is 20 and the maximum is 100.
- `offset` (`integer`, optional): Number of campaigns to skip before the page starts (zero-based). Increase it by limit to fetch the next page; meta.total in the response holds the total count.
- `order_by_last_send_date` (`string`, optional): Sort by last send date: ASC or DESC. One of: `ASC`, `DESC`.
- `order_by_send_date` (`string`, optional): Sort by send date: ASC or DESC. One of: `ASC`, `DESC`.

Example input: `{}`

### `activecampaign_list_contact_activities`

List Contact Activities · Read-only

List the activity feed of one contact: emails sent, opens, clicks, list and automation changes, notes and more.
Returns activities with tstamp, reference_type, reference_action and the referenced record.
Always pass contact_id; without it the read scans every activity on the account and can take minutes.

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

Inputs:

- `after` (`string`, optional): Return only entries recorded after this date and time (for example 2026-01-01 or 2026-01-01T00:00:00-05:00).
- `contact_id` (`integer`, optional): ID of the contact whose activity feed to read. Strongly recommended: without it the request reads the whole account.
- `include` (`string`, optional): Comma-separated related records to attach, for example notes,reference.
- `limit` (`integer`, optional): Maximum number of activities to return in one page. The API default is 20 and the maximum is 100.
- `offset` (`integer`, optional): Number of activities to skip before the page starts (zero-based). Increase it by limit to fetch the next page; meta.total in the response holds the total count.
- `order_by_time` (`string`, optional): Sort by when the activity happened: asc (oldest first) or desc (newest first). One of: `asc`, `desc`.
- `type` (`string`, optional): Comma-separated activity kinds to return, for example log,contact-list,contact-automation,note.

Example input: `{}`

### `activecampaign_list_contact_automations`

List Contact Automations · Read-only

List contact-to-automation rows across the account.
Returns contactAutomations rows with contact, automation, status and adddate, plus meta.total.
Use activecampaign_list_automation_contacts for one automation or activecampaign_get_contact_automations for one contact.

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

Inputs:

- `limit` (`integer`, optional): Maximum number of rows to return in one page. The API default is 20 and the maximum is 100.
- `offset` (`integer`, optional): Number of rows to skip before the page starts (zero-based). Increase it by limit to fetch the next page; meta.total in the response holds the total count.

Example input: `{}`

### `activecampaign_list_contact_custom_fields`

List Contact Custom Fields · Read-only

List contact custom field definitions, optionally filtered by title, type or list.
Returns fields with id, title, type, perstag and options, plus side-loaded fieldOptions and fieldRels.
Use this to find custom field IDs before setting field values on contacts.

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

Inputs:

- `all` (`string`, optional): Pass 1 to return every field in one response, ignoring limit and offset. One of: `1`.
- `limit` (`integer`, optional): Maximum number of fields per page. Default 20, maximum 500.
- `list_ids` (`string`, optional): Comma-separated list IDs; returns fields related to those lists or to all lists.
- `offset` (`integer`, optional): Number of fields to skip before the page starts (zero-based). Increase it by limit to fetch the next page; meta.total in the response holds the total count.
- `search` (`string`, optional): Return fields whose title contains this text.
- `title` (`string`, optional): Return only fields with exactly this title.
- `type` (`string`, optional): Comma-separated field types to return, for example dropdown,listbox.

Example input: `{}`

### `activecampaign_list_contact_field_values`

List Contact Field Values · Read-only

List stored contact custom field values across contacts, optionally for one field or value.
Returns fieldValues entries with contact, field, value and the entry id, plus meta.total.
Use activecampaign_get_contact_field_values for all values of one contact.

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

Inputs:

- `field_id` (`string`, optional): Return only values of this custom field ID.
- `ids` (`string`, optional): Comma-separated fieldValue IDs to return.
- `limit` (`integer`, optional): Maximum number of values to return in one page. The API default is 20 and the maximum is 100.
- `offset` (`integer`, optional): Number of values to skip before the page starts (zero-based). Increase it by limit to fetch the next page; meta.total in the response holds the total count.
- `value` (`string`, optional): Return only values exactly equal to this text.

Example input: `{}`

### `activecampaign_list_contacts`

List Contacts · Read-only

List, search and filter contacts by email, text, list, tag, segment, automation or date.
Returns contact records (id, email, firstName, lastName, phone, cdate, udate) and meta.total.
Use this to find contacts or look one up by email. Use activecampaign_get_contact when you already have the contact ID.

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

Inputs:

- `account_id` (`integer`, optional): Return contacts that belong to this account (account ID from list_accounts).
- `automation_id` (`integer`, optional): Return contacts associated with this automation (automation ID from list_automations).
- `created_after` (`string`, optional): Return contacts created after this date (YYYY-MM-DD or ISO 8601).
- `created_before` (`string`, optional): Return contacts created before this date (YYYY-MM-DD or ISO 8601).
- `email` (`string`, optional): Return only the contact with this exact email address.
- `email_like` (`string`, optional): Return contacts whose email address contains this text.
- `form_id` (`integer`, optional): Return contacts associated with this form.
- `id_greater` (`integer`, optional): Return only contacts with an ID greater than this. With order_by_id=asc this is the fastest way to page through large contact sets.
- `ids` (`string`, optional): Comma-separated contact IDs to return.
- `limit` (`integer`, optional): Maximum number of contacts to return in one page. The API default is 20 and the maximum is 100.
- `list_id` (`string`, optional): Return contacts on this list (list ID from list_lists). Combine with status to filter by subscription status on that list.
- `offset` (`integer`, optional): Number of contacts to skip before the page starts (zero-based). Increase it by limit to fetch the next page; meta.total in the response holds the total count.
- `order_by_created` (`string`, optional): Sort by creation date: asc or desc. One of: `asc`, `desc`.
- `order_by_email` (`string`, optional): Sort by email address: asc or desc. One of: `asc`, `desc`.
- `order_by_id` (`string`, optional): Sort by contact ID: asc or desc. One of: `asc`, `desc`.
- `order_by_updated` (`string`, optional): Sort by last-updated date: asc or desc. One of: `asc`, `desc`.
- `phone` (`string`, optional): Return contacts whose stored phone number starts with this value, compared exactly as stored (including country code and punctuation).
- `search` (`string`, optional): Free-text search. A full email address matches the contact's email exactly; any other value matches email, first name, last name, phone and account name.
- `segment_id` (`integer`, optional): Return contacts matching this segment. While set, only status and search still apply; other filters are ignored.
- `status` (`integer`, optional): List-membership status filter: -1 any (API default), 0 unconfirmed, 1 active, 2 unsubscribed, 3 bounced. Combine with list_id to check status on one list. One of: `-1`, `0`, `1`, `2`, `3`.
- `tag_id` (`integer`, optional): Return contacts that have this tag (tag ID from list_tags). Cannot be combined with tag_name.
- `tag_name` (`string`, optional): Return contacts that have this tag, by tag name instead of ID. Cannot be combined with tag_id.
- `updated_after` (`string`, optional): Return contacts last modified after this date (YYYY-MM-DD or ISO 8601). List, tag, custom field and score changes also update this date.
- `updated_before` (`string`, optional): Return contacts last modified before this date (YYYY-MM-DD or ISO 8601).

Example input: `{}`

### `activecampaign_list_custom_object_records`

List Custom Object Records · Read-only

List the records of one custom object schema.
Returns records with id, externalId, fields and relationships.
Use activecampaign_list_custom_object_schemas to find the schema ID.

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

Inputs:

- `schema_id` (`string`, required): ID of the custom object schema.
- `limit` (`integer`, optional): Maximum number of records to return in one page. The API default is 20 and the maximum is 100.
- `offset` (`integer`, optional): Number of records to skip before the page starts (zero-based). Increase it by limit to fetch the next page; meta.total in the response holds the total count.

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

### `activecampaign_list_custom_object_schemas`

List Custom Object Schemas · Read-only

List custom object schemas (custom record types) defined in the account.
Returns schemas with id, slug, labels, fields and relationships.
Use this to find a schema ID before activecampaign_list_custom_object_records.

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

Inputs:

- `limit` (`integer`, optional): Maximum number of schemas to return in one page. The API default is 20 and the maximum is 100.
- `offset` (`integer`, optional): Number of schemas to skip before the page starts (zero-based). Increase it by limit to fetch the next page; meta.total in the response holds the total count.
- `show_fields` (`string`, optional): Pass all to also show fields hidden because they are marked for deletion. One of: `all`.

Example input: `{}`

### `activecampaign_list_deal_activities`

List Deal Activities · Read-only

List recent deal activity (stage changes, notes, tasks, emails), optionally for one deal.
Returns dealActivities with deal, dataType, dataId, dataAction and cdate.
Use this to see a deal's history.

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

Inputs:

- `data_type` (`string`, optional): Return only activity of this data type, for example note, task or userid.
- `deal_id` (`string`, optional): Return only activity of this deal ID.
- `limit` (`integer`, optional): Maximum number of activities to return in one page. The API default is 20 and the maximum is 100.
- `offset` (`integer`, optional): Number of activities to skip before the page starts (zero-based). Increase it by limit to fetch the next page; meta.total in the response holds the total count.

Example input: `{}`

### `activecampaign_list_deal_custom_field_values`

List Deal Custom Field Values · Read-only

List stored deal custom field values, optionally for one deal.
Returns dealCustomFieldData with id, dealId, customFieldId and fieldValue.
Use this to read deal custom fields and to find the value ID for activecampaign_update_deal_custom_field_value.

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

Inputs:

- `deal_id` (`string`, optional): Return only values of this deal ID.
- `limit` (`integer`, optional): Maximum number of values to return in one page. The API default is 20 and the maximum is 100.
- `offset` (`integer`, optional): Number of values to skip before the page starts (zero-based). Increase it by limit to fetch the next page; meta.total in the response holds the total count.

Example input: `{}`

### `activecampaign_list_deal_custom_fields`

List Deal Custom Fields · Read-only

List deal custom field definitions.
Returns dealCustomFieldMeta with id, fieldLabel, fieldType and options.
Use this to find customFieldId values for deal custom fields.

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

Inputs:

- `limit` (`integer`, optional): Maximum number of fields to return (API default 100).
- `offset` (`integer`, optional): Number of fields to skip before the page starts (zero-based). Increase it by limit to fetch the next page; meta.total in the response holds the total count.

Example input: `{}`

### `activecampaign_list_deal_secondary_contacts`

List Deal Secondary Contacts · Read-only

List secondary contacts linked to deals.
Returns contactDeals rows with deal, contact and role.
Use activecampaign_get_deal for a deal's primary contact.

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

Inputs:

- `limit` (`integer`, optional): Maximum number of rows to return in one page. The API default is 20 and the maximum is 100.
- `offset` (`integer`, optional): Number of rows to skip before the page starts (zero-based). Increase it by limit to fetch the next page; meta.total in the response holds the total count.

Example input: `{}`

### `activecampaign_list_deal_stages`

List Deal Stages · Read-only

List deal stages, optionally for one pipeline or by title.
Returns dealStages with id, title, group (pipeline ID), order and color.
Use this to find stage IDs for activecampaign_create_deal or activecampaign_update_deal.

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

Inputs:

- `limit` (`integer`, optional): Maximum number of stages to return in one page. The API default is 20 and the maximum is 100.
- `offset` (`integer`, optional): Number of stages to skip before the page starts (zero-based). Increase it by limit to fetch the next page; meta.total in the response holds the total count.
- `pipeline_id` (`string`, optional): Return only stages of this pipeline ID.
- `title` (`string`, optional): Return stages whose title contains this text.

Example input: `{}`

### `activecampaign_list_deal_task_types`

List Task Types · Read-only

List the account's CRM task types (for example Call, Email, Meeting).
Returns dealTasktypes with id and title.
Use this to find the task_type_id for activecampaign_create_deal_task.

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

Inputs:

- `limit` (`integer`, optional): Maximum number of task types to return in one page. The API default is 20 and the maximum is 100.
- `offset` (`integer`, optional): Number of task types to skip before the page starts (zero-based). Increase it by limit to fetch the next page; meta.total in the response holds the total count.

Example input: `{}`

### `activecampaign_list_deal_tasks`

List Tasks · Read-only

List CRM tasks on deals and contacts, filtered by related record, status, type, assignee or due date.
Returns dealTasks with id, title, note, duedate, status, relid, reltype and assignee.
Use this to find open or overdue tasks. Use activecampaign_get_deal_task for one task.

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

Inputs:

- `assignee_id` (`integer`, optional): Return tasks assigned to this user ID.
- `due_after` (`string`, optional): Return tasks due after this date (YYYY-MM-DD).
- `duedate_range` (`string`, optional): A YYYY-MM-DD+YYYY-MM-DD date range, or upcoming, scheduled or overdue.
- `limit` (`integer`, optional): Maximum number of tasks to return in one page. The API default is 20 and the maximum is 100.
- `offset` (`integer`, optional): Number of tasks to skip before the page starts (zero-based). Increase it by limit to fetch the next page; meta.total in the response holds the total count.
- `relid` (`integer`, optional): ID of the deal or contact the tasks belong to.
- `reltype` (`string`, optional): Type of record the tasks belong to: Deal or Subscriber (contact).
- `status` (`integer`, optional): Task status: 0 incomplete, 1 complete. One of: `0`, `1`.
- `task_type_id` (`integer`, optional): Return tasks of this task type ID.

Example input: `{}`

### `activecampaign_list_deals`

List Deals · Read-only

List and search deals by text, pipeline, stage, status, owner, value or date.
Returns deals with id, title, value (cents), currency, group (pipeline), stage, owner, status and meta.total.
Use this to find deals. Use activecampaign_get_deal for one deal and activecampaign_get_contact_deals for one contact's deals.

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

Inputs:

- `created_after` (`string`, optional): Return deals created on or after this date (YYYY-MM-DD).
- `created_before` (`string`, optional): Return deals created before this date (YYYY-MM-DD).
- `limit` (`integer`, optional): Maximum number of deals to return in one page. The API default is 20 and the maximum is 100.
- `maximum_value` (`integer`, optional): Return deals worth at most this many dollars (whole USD).
- `minimum_value` (`integer`, optional): Return deals worth at least this many dollars (whole USD).
- `next_task` (`string`, optional): Task due-date filter: upcoming (due within 24 hours), scheduled (later), overdue or no-task. One of: `upcoming`, `scheduled`, `overdue`, `no-task`.
- `offset` (`integer`, optional): Number of deals to skip before the page starts (zero-based). Increase it by limit to fetch the next page; meta.total in the response holds the total count.
- `order_by_created` (`string`, optional): Sort by creation date: ASC or DESC. One of: `ASC`, `DESC`.
- `order_by_title` (`string`, optional): Sort by deal title: ASC or DESC. One of: `ASC`, `DESC`.
- `order_by_value` (`string`, optional): Sort by deal value: ASC or DESC. One of: `ASC`, `DESC`.
- `owner_id` (`integer`, optional): Return deals owned by this user ID.
- `pipeline_id` (`integer`, optional): Return deals in this pipeline ID.
- `search` (`string`, optional): Search text, matched against the field chosen in search_field.
- `search_field` (`string`, optional): Field the search text is matched against: all (title, contact and org), title, contact or org. One of: `all`, `title`, `contact`, `org`.
- `stage_id` (`integer`, optional): Return deals in this stage ID.
- `status` (`integer`, optional): Deal status: 0 open, 1 won, 2 lost. One of: `0`, `1`, `2`.
- `tag` (`string`, optional): Primary-contact tag filter: a tag ID (deals whose primary contact has that tag), -1 (any tag) or -2 (no tag).
- `title` (`string`, optional): Return deals with this title.
- `updated_after` (`string`, optional): Return deals updated on or after this date (YYYY-MM-DD).
- `updated_before` (`string`, optional): Return deals updated before this date (YYYY-MM-DD).

Example input: `{}`

### `activecampaign_list_ecom_connections`

List E-commerce Connections · Read-only

List the store connections (integrations such as Shopify) that sync e-commerce data.
Returns connections with id, service, externalid, name and status.
Use this to find a connection ID for e-commerce customers and orders.

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

Inputs:

- `limit` (`integer`, optional): Maximum number of connections to return in one page. The API default is 20 and the maximum is 100.
- `offset` (`integer`, optional): Number of connections to skip before the page starts (zero-based). Increase it by limit to fetch the next page; meta.total in the response holds the total count.
- `service` (`string`, optional): Return connections for this external service name.

Example input: `{}`

### `activecampaign_list_ecom_customers`

List E-commerce Customers · Read-only

List e-commerce customers synced from connected stores, optionally by email or store connection.
Returns ecomCustomers with id, connectionid, externalid, email, totalRevenue and totalOrders.
Use activecampaign_list_contacts for marketing contacts; e-commerce customers are separate records linked by email.

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

Inputs:

- `connection_id` (`string`, optional): Return customers of this store connection ID, from list_ecom_connections.
- `email` (`string`, optional): Return customers with this email address.
- `external_id` (`string`, optional): Return the customer with this ID in the external store.
- `limit` (`integer`, optional): Maximum number of customers to return in one page. The API default is 20 and the maximum is 100.
- `offset` (`integer`, optional): Number of customers to skip before the page starts (zero-based). Increase it by limit to fetch the next page; meta.total in the response holds the total count.

Example input: `{}`

### `activecampaign_list_ecom_orders`

List E-commerce Orders · Read-only

List e-commerce orders, filtered by customer email, state, customer or store connection.
Returns ecomOrders with id, externalid, email, totalPrice, currency, state and order dates.
Use activecampaign_get_ecom_order for one order.

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

Inputs:

- `connection_id` (`integer`, optional): Return orders of this store connection ID.
- `customer_id` (`string`, optional): Return orders of this e-commerce customer ID.
- `email` (`string`, optional): Return orders of this customer email.
- `limit` (`integer`, optional): Maximum number of orders to return in one page. The API default is 20 and the maximum is 100.
- `offset` (`integer`, optional): Number of orders to skip before the page starts (zero-based). Increase it by limit to fetch the next page; meta.total in the response holds the total count.
- `order_by_created` (`string`, optional): Sort by the store's order creation date: ASC or DESC. One of: `ASC`, `DESC`.
- `state` (`integer`, optional): Order state: 0 pending, 1 completed, 2 abandoned, 3 recovered, 4 waiting for payment. One of: `0`, `1`, `2`, `3`, `4`.

Example input: `{}`

### `activecampaign_list_email_activities`

List Email Activities · Read-only

List one-to-one email activity (emails sent and received through the CRM), optionally for one contact or deal.
Returns emailActivities with subject, from, to, date and the related contact and deal.
Use activecampaign_list_contact_activities for a contact's full activity feed.

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

Inputs:

- `contact_id` (`integer`, optional): Return only email activities of this contact ID.
- `deal_id` (`integer`, optional): Return only email activities of this deal ID.
- `limit` (`integer`, optional): Maximum number of activities to return in one page. The API default is 20 and the maximum is 100.
- `offset` (`integer`, optional): Number of activities to skip before the page starts (zero-based). Increase it by limit to fetch the next page; meta.total in the response holds the total count.

Example input: `{}`

### `activecampaign_list_forms`

List Forms · Read-only

List the account's subscription forms.
Returns forms with id, name, action and the lists and tags they apply.
Use the form ID with activecampaign_list_contacts form_id to find contacts who used a form.

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

Inputs:

- `limit` (`integer`, optional): Maximum number of forms to return in one page. The API default is 20 and the maximum is 100.
- `offset` (`integer`, optional): Number of forms to skip before the page starts (zero-based). Increase it by limit to fetch the next page; meta.total in the response holds the total count.

Example input: `{}`

### `activecampaign_list_lists`

List Lists · Read-only

List the account's contact lists, optionally filtered by name or channel.
Returns lists with id, name, stringid, active_subscribers, non_deleted_subscribers and meta.total.
Use this to find list IDs or subscriber counts. Use activecampaign_get_list for one list's settings.

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

Inputs:

- `channel` (`string`, optional): Which channel's lists to return: email (API default), sms or all. One of: `email`, `sms`, `all`.
- `limit` (`integer`, optional): Maximum number of lists to return in one page. The API default is 20 and the maximum is 100.
- `name` (`string`, optional): Return lists with this name.
- `offset` (`integer`, optional): Number of lists to skip before the page starts (zero-based). Increase it by limit to fetch the next page; meta.total in the response holds the total count.

Example input: `{}`

### `activecampaign_list_messages`

List Messages · Read-only

List email messages (the content records that campaigns send).
Returns messages with id, subject, fromname, fromemail, reply2, text and html.
Use this to read email content. Use activecampaign_list_campaigns for campaign status and totals.

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

Inputs:

- `limit` (`integer`, optional): Maximum number of messages to return in one page. The API default is 20 and the maximum is 100.
- `offset` (`integer`, optional): Number of messages to skip before the page starts (zero-based). Increase it by limit to fetch the next page; meta.total in the response holds the total count.

Example input: `{}`

### `activecampaign_list_notes`

List Notes · Read-only

List notes across contacts, deals, tasks and accounts.
Returns notes with id, note text, reltype, relid, userid, cdate and mdate.
Use activecampaign_get_contact_notes for one contact's notes.

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

Inputs:

- `limit` (`integer`, optional): Maximum number of notes to return in one page. The API default is 20 and the maximum is 100.
- `offset` (`integer`, optional): Number of notes to skip before the page starts (zero-based). Increase it by limit to fetch the next page; meta.total in the response holds the total count.

Example input: `{}`

### `activecampaign_list_pipelines`

List Pipelines · Read-only

List deal pipelines, optionally filtered by title.
Returns dealGroups (pipelines) with id, title, currency and their stages.
Use this to find pipeline IDs for activecampaign_create_deal and activecampaign_list_deal_stages.

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

Inputs:

- `have_stages` (`integer`, optional): 1 returns only pipelines that have at least one stage. One of: `0`, `1`.
- `limit` (`integer`, optional): Maximum number of pipelines to return in one page. The API default is 20 and the maximum is 100.
- `offset` (`integer`, optional): Number of pipelines to skip before the page starts (zero-based). Increase it by limit to fetch the next page; meta.total in the response holds the total count.
- `title` (`string`, optional): Return pipelines whose title contains this text.

Example input: `{}`

### `activecampaign_list_segments`

List Segments · Read-only

List saved segments (condition sets used to target contacts). Conditions themselves are not returned.
Returns segments with id, name and seriesid.
Use a segment ID with activecampaign_list_contacts segment_id to get matching contacts.

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

Inputs:

- `ids` (`string`, optional): Comma-separated segment IDs to return.
- `limit` (`integer`, optional): Maximum number of segments to return in one page. The API default is 20 and the maximum is 100.
- `offset` (`integer`, optional): Number of segments to skip before the page starts (zero-based). Increase it by limit to fetch the next page; meta.total in the response holds the total count.

Example input: `{}`

### `activecampaign_list_tags`

List Tags · Read-only

List tag definitions, optionally filtered by name.
Returns tags with id, tag (name), tagType, description and meta.total.
Use this to find a tag ID before activecampaign_add_tag_to_contact. Use activecampaign_get_tag when you have the ID.

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

Inputs:

- `ids` (`string`, optional): Comma-separated tag IDs to return.
- `limit` (`integer`, optional): Maximum number of tags to return in one page. The API default is 20 and the maximum is 100.
- `name` (`string`, optional): Return only the tag with exactly this name.
- `offset` (`integer`, optional): Number of tags to skip before the page starts (zero-based). Increase it by limit to fetch the next page; meta.total in the response holds the total count.
- `search` (`string`, optional): Return tags whose name contains this text.
- `type` (`string`, optional): Tag type to list: contact (API default) or template. One of: `contact`, `template`.

Example input: `{}`

### `activecampaign_list_templates`

List Email Templates · Read-only

List email templates, optionally filtered by name or category.
Returns templates with id, name, categoryid, mdate and preview details, plus meta.total.
Use this to find a template for a campaign.

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

Inputs:

- `category_id` (`integer`, optional): Return templates in this category ID.
- `limit` (`integer`, optional): Maximum number of templates to return in one page. The API default is 20 and the maximum is 100.
- `name` (`string`, optional): Return templates whose name contains this text.
- `offset` (`integer`, optional): Number of templates to skip before the page starts (zero-based). Increase it by limit to fetch the next page; meta.total in the response holds the total count.

Example input: `{}`

### `activecampaign_list_tracked_events`

List Tracked Event Names · Read-only

List the names of events registered for event tracking.
Returns eventTrackingEvents with name.
Use this to see which custom events the account tracks.

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

Inputs:

- `limit` (`integer`, optional): Maximum number of events to return in one page. The API default is 20 and the maximum is 100.
- `offset` (`integer`, optional): Number of events to skip before the page starts (zero-based). Increase it by limit to fetch the next page; meta.total in the response holds the total count.

Example input: `{}`

### `activecampaign_list_users`

List Users · Read-only

List the account's users (team members who log in to ActiveCampaign).
Returns users with id, username, firstName, lastName and email.
Use this to find owner or assignee IDs for deals, tasks and accounts.

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

Inputs:

- `limit` (`integer`, optional): Maximum number of users to return in one page. The API default is 20 and the maximum is 100.
- `offset` (`integer`, optional): Number of users to skip before the page starts (zero-based). Increase it by limit to fetch the next page; meta.total in the response holds the total count.

Example input: `{}`

### `activecampaign_add_contact_to_automation`

Add Contact to Automation · Write

Add a contact to an automation, starting it at the automation's first step.
Returns the contactAutomation row; its id is what activecampaign_remove_contact_from_automation needs.
Use activecampaign_list_automations to find the automation ID.

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

Inputs:

- `automation_id` (`integer`, required): ID of the automation, from list_automations.
- `contact_id` (`integer`, required): ID of the contact.

Example input: `{"automation_id":1,"contact_id":1}`

### `activecampaign_add_tag_to_contact`

Add Tag to Contact · Write

Apply an existing tag to a contact.
Returns the contactTag association (id, contact, tag); HTTP 200 if the tag was already applied.
Use activecampaign_list_tags or activecampaign_create_tag first to get the tag ID; tag names are not accepted here.

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

Inputs:

- `contact_id` (`integer`, required): ID of the contact to tag.
- `tag_id` (`integer`, required): ID of the tag to apply, from list_tags or create_tag. Not the tag name.

Example input: `{"contact_id":1,"tag_id":1}`

### `activecampaign_bulk_import_contacts`

Bulk Import Contacts · Write

Create or update up to 250 contacts in one asynchronous request, matched by email, with per-contact lists, tags and custom fields.
Returns a batchId; the import is only done once activecampaign_get_bulk_import_status reports it completed.
Use this for many contacts at once. Use activecampaign_sync_contact for a single contact.

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

Inputs:

- `contacts` (`array`, required): Contacts to import (1 to 250). Each needs an email (or email_hash) and may carry first_name, last_name, phone, customer_acct_name (account name), tags (array of tag names, created if missing), fields (array of {id, value} with custom field IDs), subscribe and unsubscribe (arrays of {listid}). Example: [{"email": "sam@example.com", "first_name": "Sam", "tags": ["newsletter"], "subscribe": [{"listid": 1}]}].
- `callback` (`object`, optional): Optional callback request made when the import finishes, with url and requestType (GET or POST), and optionally detailed_results, params and headers. Example: {"url": "https://example.com/import-done", "requestType": "POST", "detailed_results": "true"}.
- `enable_contacts_without_email` (`boolean`, optional): Set to true to allow contacts identified by phone number only.
- `exclude_automations` (`boolean`, optional): Set to true so the import does not start automations for the imported contacts.
- `send_webhooks` (`boolean`, optional): Set to false to suppress webhooks for the imported contacts.

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

### `activecampaign_create_account`

Create Account · Write

Create an account (company).
Returns the new account with its id.
Use activecampaign_create_account_contact afterwards to link contacts to it.

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

Inputs:

- `name` (`string`, required): Account (company) name.
- `account_url` (`string`, optional): Account website.
- `fields` (`array`, optional): Account custom field values as an array of {customFieldId, fieldValue, fieldCurrency}. Example: [{"customFieldId": 9, "fieldValue": "500-1000"}].
- `owner` (`integer`, optional): User ID of the account owner.

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

### `activecampaign_create_account_contact`

Link Contact to Account · Write

Link a contact to an account, with an optional job title.
Returns the accountContact association with its id.
Use activecampaign_delete_account_contact to remove the link.

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

Inputs:

- `account_id` (`integer`, required): ID of the account.
- `contact_id` (`integer`, required): ID of the contact.
- `job_title` (`string`, optional): The contact's job title at the account.

Example input: `{"account_id":1,"contact_id":1}`

### `activecampaign_create_account_note`

Create Account Note · Write

Add a note to an account.
Returns the new note with its id.
Use activecampaign_create_note for contact or task notes.

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

Inputs:

- `account_id` (`string`, required): ID of the account.
- `note` (`string`, required): Text of the note.

Example input: `{"account_id":"<account_id>","note":"<note>"}`

### `activecampaign_create_contact`

Create Contact · Write

Create a new contact. Fails with a 422 duplicate error if a contact with the same email already exists.
Returns the created contact (with its new id) and any fieldValues set.
Use activecampaign_sync_contact to create or update by email. Use activecampaign_add_tag_to_contact and activecampaign_update_contact_list_status for tags and lists.

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

Inputs:

- `email` (`string`, required): Email address of the contact. Example: jane.doe@example.com.
- `field_values` (`array`, optional): Custom field values to set, as an array of objects with field (the custom field ID from list_contact_custom_fields) and value. Multi-select values use the ||option 1||option 2|| format. Example: [{"field": "1", "value": "Blue"}].
- `first_name` (`string`, optional): First name of the contact.
- `last_name` (`string`, optional): Last name of the contact.
- `phone` (`string`, optional): Phone number of the contact, as a string. Example: +1 555-555-5555.

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

### `activecampaign_create_contact_custom_field`

Create Contact Custom Field · Write

Create a contact custom field, optionally with its options and list relationships in the same request.
Returns the field with its id and any created fieldOptions and fieldRels.
Fails with 422 if another field already uses the title.

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

Inputs:

- `title` (`string`, required): Title of the field.
- `type` (`string`, required): Field type. One of: `text`, `textarea`, `date`, `datetime`, `dropdown`, `listbox`, `radio`, `checkbox`, `hidden`.
- `defval` (`string`, optional): Default value of the field.
- `descript` (`string`, optional): Description of the field.
- `options` (`array`, optional): Options for dropdown, listbox, radio and checkbox fields (max 25), each with value and optional label, orderid and isdefault. Example: [{"value": "blue", "label": "Blue"}].
- `ordernum` (`integer`, optional): Position of the field in the My Fields tab.
- `perstag` (`string`, optional): Personalization tag used to insert the value in emails, for example FAVORITE_COLOR.
- `relations` (`array`, optional): Lists to relate the field to (max 25), each as {relid}; relid 0 means every list. Example: [{"relid": 0}].
- `visible` (`boolean`, optional): Whether the field is shown in the Form Builder.

Example input: `{"title":"<title>","type":"text"}`

### `activecampaign_create_deal`

Create Deal · Write

Create a deal in a pipeline stage, linked to a contact or an account.
Returns the new deal with its id.
Send contact_id or account_id, and pipeline_id or stage_id. Use activecampaign_list_pipelines and activecampaign_list_deal_stages to find IDs.

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

Inputs:

- `currency` (`string`, required): Three-letter ISO currency code in lowercase, for example usd.
- `title` (`string`, required): Deal title.
- `value` (`integer`, required): Deal value in cents, for example 45678 for 456.78. Must be zero or more.
- `account_id` (`string`, optional): ID of the deal's account. Required if contact_id is not set.
- `contact_id` (`string`, optional): ID of the deal's primary contact. Required if account_id is not set.
- `description` (`string`, optional): Deal description.
- `fields` (`array`, optional): Deal custom field values as an array of {customFieldId, fieldValue, fieldCurrency}; currency values are in cents. Example: [{"customFieldId": 1, "fieldValue": "Enterprise"}].
- `owner_id` (`string`, optional): User ID of the deal owner, from list_users. Required if the pipeline's auto-assign is disabled.
- `percent` (`integer`, optional): Win probability percentage.
- `pipeline_id` (`string`, optional): ID of the deal's pipeline, from list_pipelines. Required if stage_id is not set.
- `stage_id` (`string`, optional): ID of the deal's stage, from list_deal_stages. Required if pipeline_id is not set; defaults to the pipeline's first stage.
- `status` (`integer`, optional): Deal status: 0 open, 1 won, 2 lost. One of: `0`, `1`, `2`.

Example input: `{"currency":"<currency>","title":"<title>","value":1}`

### `activecampaign_create_deal_note`

Create Deal Note · Write

Add a note to a deal.
Returns the new note with its id.
Use activecampaign_create_note to add notes to contacts, accounts or tasks.

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

Inputs:

- `deal_id` (`string`, required): ID of the deal.
- `note` (`string`, required): Text of the note.

Example input: `{"deal_id":"<deal_id>","note":"<note>"}`

### `activecampaign_create_deal_secondary_contact`

Add Deal Secondary Contact · Write

Link a contact to a deal as a secondary contact.
Returns the contactDeal row with its id.
Use activecampaign_update_deal to change the primary contact.

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

Inputs:

- `contact_id` (`string`, required): ID of the contact.
- `deal_id` (`string`, required): ID of the deal.

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

### `activecampaign_create_deal_stage`

Create Deal Stage · Write

Add a stage to a deal pipeline.
Returns the new stage with its id.
Use activecampaign_list_pipelines to find the pipeline ID.

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

Inputs:

- `pipeline_id` (`string`, required): ID of the pipeline the stage belongs to.
- `title` (`string`, required): Stage title.
- `color` (`string`, optional): Stage color as a 6-character hex code without #.
- `deal_order` (`string`, optional): How deals are sorted in the stage: a field and direction separated by a space, for example next-action DESC or title ASC.
- `order` (`integer`, optional): Position of the stage within the pipeline.
- `reorder` (`integer`, optional): 1 reassigns order values to every stage in the pipeline after this change. One of: `0`, `1`.
- `width` (`integer`, optional): Stage column width in pixels.

Example input: `{"pipeline_id":"<pipeline_id>","title":"<title>"}`

### `activecampaign_create_deal_task`

Create Task · Write

Create a CRM task on a deal or contact.
Returns the new task with its id.
Use activecampaign_list_deal_task_types to find the task type ID.

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

Inputs:

- `duedate` (`string`, required): Due date and time in ISO 8601, for example 2026-11-02T12:00:00-05:00.
- `relid` (`integer`, required): ID of the deal or contact the task belongs to (see owner_type).
- `task_type_id` (`integer`, required): Task type ID, from list_deal_task_types.
- `assignee` (`integer`, optional): User ID the task is assigned to.
- `note` (`string`, optional): Task description.
- `owner_type` (`string`, optional): What relid refers to: deal or contact. One of: `deal`, `contact`.
- `status` (`integer`, optional): Task status: 0 incomplete, 1 complete. One of: `0`, `1`.
- `title` (`string`, optional): Task title.

Example input: `{"duedate":"<duedate>","relid":1,"task_type_id":1}`

### `activecampaign_create_ecom_customer`

Create E-commerce Customer · Write

Create an e-commerce customer for a store connection.
Returns the new ecomCustomer with its id.
Use activecampaign_list_ecom_connections to find the connection ID.

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

Inputs:

- `connection_id` (`string`, required): ID of the store connection the customer belongs to.
- `email` (`string`, required): The customer's email address.
- `external_id` (`string`, required): The customer's ID in the external store.
- `accepts_marketing` (`string`, optional): 1 if the customer opted in to marketing, 0 if not. One of: `0`, `1`.

Example input: `{"connection_id":"<connection_id>","email":"<email>","external_id":"<external_id>"}`

### `activecampaign_create_list`

Create List · Write

Create a contact list.
Returns the new list with its id.
Use activecampaign_update_contact_list_status afterwards to subscribe contacts to it.

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

Inputs:

- `name` (`string`, required): Name of the list.
- `sender_reminder` (`string`, required): Reminder shown to contacts explaining why they are on this list.
- `sender_url` (`string`, required): The website URL this list is for.
- `stringid` (`string`, required): URL-safe list name, for example monthly-newsletter.
- `carboncopy` (`string`, optional): Comma-separated email addresses that receive a copy of every mailing to this list.
- `channel` (`string`, optional): List channel: email (default) or sms. One of: `email`, `sms`.
- `send_last_broadcast` (`boolean`, optional): Whether to send the last campaign sent to this list to each new subscriber.
- `subscription_notify` (`string`, optional): Comma-separated email addresses notified when someone subscribes.
- `unsubscription_notify` (`string`, optional): Comma-separated email addresses notified when someone unsubscribes.
- `user` (`integer`, optional): User ID of the list owner, from list_users.

Example input: `{"name":"<name>","sender_reminder":"<sender_reminder>","sender_url":"<sender_url>","stringid":"<stringid>"}`

### `activecampaign_create_note`

Create Note · Write

Add a note to a contact, deal, task, activity or account.
Returns the new note with its id.
Use reltype Subscriber with the contact ID in relid to note a contact.

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

Inputs:

- `note` (`string`, required): Text of the note.
- `relid` (`integer`, required): ID of the record the note is attached to.
- `reltype` (`string`, required): Type of record the note is attached to: Subscriber (contact), Deal, DealTask, Activity or CustomerAccount (account). One of: `Subscriber`, `Deal`, `DealTask`, `Activity`, `CustomerAccount`.

Example input: `{"note":"<note>","relid":1,"reltype":"Subscriber"}`

### `activecampaign_create_pipeline`

Create Pipeline · Write

Create a deal pipeline.
Returns the new pipeline with its id.
Use activecampaign_create_deal_stage afterwards to add stages to it.

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

Inputs:

- `currency` (`string`, required): Default currency for new deals in this pipeline, lowercase ISO code.
- `title` (`string`, required): Pipeline title.
- `allgroups` (`integer`, optional): 1 lets every user group manage the pipeline; 0 limits it to the groups in groups. One of: `0`, `1`.
- `allusers` (`integer`, optional): 1 auto-assigns new deals across all users (unless auto-assign is off); 0 uses the users list. One of: `0`, `1`.
- `autoassign` (`integer`, optional): Deal auto-assign mode: 0 disabled, 1 round robin, 2 deal value. One of: `0`, `1`, `2`.
- `groups` (`array`, optional): User group IDs allowed to manage the pipeline.
- `users` (`array`, optional): User IDs to auto-assign new deals to.

Example input: `{"currency":"<currency>","title":"<title>"}`

### `activecampaign_create_tag`

Create Tag · Write

Create a tag definition. If a tag with the same name and type exists, that tag is returned instead.
Returns the tag with its id.
Use activecampaign_add_tag_to_contact afterwards to apply it to a contact.

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

Inputs:

- `name` (`string`, required): Tag name: 1 to 250 characters, no commas, line breaks or HTML.
- `tag_type` (`string`, required): Tag type: contact or template. Send it on create; tags created without a type do not appear in list_tags. One of: `contact`, `template`.
- `description` (`string`, optional): Description of the tag.

Example input: `{"name":"<name>","tag_type":"contact"}`

### `activecampaign_duplicate_campaign`

Duplicate Campaign · Write

Create a copy of an existing campaign.
Returns the new campaign's ID.
Use this to reuse a campaign's content and settings as a new draft.

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

Inputs:

- `campaign_id` (`integer`, required): ID of the source campaign.

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

### `activecampaign_merge_contacts`

Merge Contacts · Write

Merge a source contact into a destination contact, then delete the source. Cannot be undone.
Returns the merge result; the destination keeps its ID and gains the source's lists, tags, automations, deals and notes.
Use this to remove duplicate contacts. Requires the merge-contacts permission.

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

Inputs:

- `destination` (`integer`, required): ID of the contact that survives the merge.
- `source` (`integer`, required): ID of the contact to merge in. This contact is deleted after the merge.
- `resolution_automation_id` (`integer`, optional): ID of the contact (source or destination) whose automation membership wins where both are in the same automation.
- `resolution_field_id` (`integer`, optional): ID of the contact (source or destination) whose custom field values win where both have a value.

Example input: `{"destination":1,"source":1}`

### `activecampaign_move_deals_to_stage`

Move Deals to Stage · Write

Move every deal in one stage to another stage.
Returns the result of the move.
Use activecampaign_update_deal to move a single deal.

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

Inputs:

- `stage_id` (`integer`, required): ID of the deal stage.
- `target_stage_id` (`string`, required): ID of the stage to move the deals to.

Example input: `{"stage_id":1,"target_stage_id":"<target_stage_id>"}`

### `activecampaign_pause_campaign`

Pause Campaign · Write

Pause a campaign that is currently sending (status 3, paused).
Returns succeeded (1 or 0) and a message; rule failures return HTTP 200 with succeeded 0.
Use activecampaign_resume_campaign to continue sending, or activecampaign_stop_campaign to end it.

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

Inputs:

- `campaign_id` (`integer`, required): ID of the campaign.

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

### `activecampaign_resume_campaign`

Resume Campaign · Write

Resume a paused campaign so it continues sending (status 2, sending).
Returns succeeded (1 or 0) and a message; rule failures return HTTP 200 with succeeded 0.
Only a paused campaign can be resumed.

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

Inputs:

- `campaign_id` (`integer`, required): ID of the campaign.

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

### `activecampaign_schedule_campaign`

Schedule Campaign · Write

Enable a draft or disabled campaign for sending at its existing scheduled date (status 1, scheduled).
Returns succeeded (1 or 0) and a message; rule failures return HTTP 200 with succeeded 0.
The send date cannot be set here; it must already be set on the campaign.

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

Inputs:

- `campaign_id` (`integer`, required): ID of the campaign.

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

### `activecampaign_set_account_custom_field_value`

Set Account Custom Field Value · Write

Set an account's value for one custom field.
Returns the stored accountCustomFieldDatum with its id.
Use activecampaign_list_account_custom_fields to find the field ID.

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

Inputs:

- `account_id` (`integer`, required): ID of the account.
- `custom_field_id` (`integer`, required): ID of the account custom field.
- `field_value` (`string`, required): Value to store. Currency fields take cents.
- `field_currency` (`string`, optional): Three-letter currency code, for currency fields only.

Example input: `{"account_id":1,"custom_field_id":1,"field_value":"<field_value>"}`

### `activecampaign_set_contact_field_value`

Set Contact Field Value · Write

Set a contact's value for one custom field. Creates the value, or updates it if the contact already has one.
Returns the fieldValue (HTTP 201 when created, 200 when updated).
Use this to set one field. Use activecampaign_update_contact with field_values to set several at once.

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

Inputs:

- `contact_id` (`string`, required): ID of the contact.
- `field_id` (`string`, required): ID of the custom field, from list_contact_custom_fields.
- `value` (`string`, required): Value to store. Multi-select fields (checkbox, listbox) use ||option 1||option 2||; dates use YYYY-MM-DD.
- `use_defaults` (`boolean`, optional): If true, other required fields the contact is missing are filled with their default values.

Example input: `{"contact_id":"<contact_id>","field_id":"<field_id>","value":"<value>"}`

### `activecampaign_set_deal_custom_field_value`

Set Deal Custom Field Value · Write

Set a deal's value for one custom field.
Returns the stored dealCustomFieldDatum with its id.
Use activecampaign_list_deal_custom_fields to find the field ID. Use activecampaign_update_deal with fields to set several at once.

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

Inputs:

- `custom_field_id` (`integer`, required): ID of the deal custom field.
- `deal_id` (`integer`, required): ID of the deal.
- `field_value` (`string`, required): Value to store. Currency fields take cents, for example 10050 for 100.50.
- `field_currency` (`string`, optional): Three-letter currency code, for currency fields only.

Example input: `{"custom_field_id":1,"deal_id":1,"field_value":"<field_value>"}`

### `activecampaign_stop_campaign`

Stop Campaign · Write

Stop a sending or paused campaign permanently (status 4, stopped). It cannot be resumed afterwards.
Returns succeeded (1 or 0) and a message; rule failures return HTTP 200 with succeeded 0.
Use activecampaign_pause_campaign instead if you may want to continue sending later.

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

Inputs:

- `campaign_id` (`integer`, required): ID of the campaign.

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

### `activecampaign_sync_contact`

Sync Contact · Write

Create or update a single contact by email (upsert). Only the fields you send are changed.
Returns the contact and its fieldValues; HTTP 201 means created and 200 means updated.
Use this when the contact may already exist. Use activecampaign_create_contact only for guaranteed-new contacts, and activecampaign_bulk_import_contacts for many at once.

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

Inputs:

- `email` (`string`, required): Email address of the contact. Example: jane.doe@example.com.
- `field_values` (`array`, optional): Custom field values to set, as an array of objects with field (the custom field ID from list_contact_custom_fields) and value. Multi-select values use the ||option 1||option 2|| format. Example: [{"field": "1", "value": "Blue"}].
- `first_name` (`string`, optional): First name of the contact.
- `last_name` (`string`, optional): Last name of the contact.
- `phone` (`string`, optional): Phone number of the contact, as a string. Example: +1 555-555-5555.

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

### `activecampaign_update_account`

Update Account · Write

Update an account's name, website, owner or custom field values.
Returns the updated account.
Use activecampaign_set_account_custom_field_value to set one custom field.

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

Inputs:

- `account_id` (`integer`, required): ID of the account.
- `account_url` (`string`, optional): Account website.
- `fields` (`array`, optional): Account custom field values as an array of {customFieldId, fieldValue, fieldCurrency}. Example: [{"customFieldId": 9, "fieldValue": "500-1000"}].
- `name` (`string`, optional): Account (company) name.
- `owner` (`integer`, optional): User ID of the account owner.

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

### `activecampaign_update_account_custom_field_value`

Update Account Custom Field Value · Write

Update one stored account custom field value by its ID.
Returns the updated accountCustomFieldDatum.
Get the value ID from activecampaign_list_account_custom_field_values.

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

Inputs:

- `field_value` (`string`, required): New value. Currency fields take cents.
- `value_id` (`integer`, required): ID of the account custom field value.
- `field_currency` (`string`, optional): Three-letter currency code, for currency fields only.

Example input: `{"field_value":"<field_value>","value_id":1}`

### `activecampaign_update_contact`

Update Contact · Write

Update an existing contact's email, name, phone or custom field values by contact ID.
Returns the updated contact and its fieldValues.
Use this when you have the contact ID. Use activecampaign_sync_contact to update by email without the ID.

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

Inputs:

- `contact_id` (`integer`, required): ID of the contact.
- `email` (`string`, optional): Email address of the contact. Example: jane.doe@example.com.
- `field_values` (`array`, optional): Custom field values to set, as an array of objects with field (the custom field ID from list_contact_custom_fields) and value. Multi-select values use the ||option 1||option 2|| format. Example: [{"field": "1", "value": "Blue"}].
- `first_name` (`string`, optional): First name of the contact.
- `last_name` (`string`, optional): Last name of the contact.
- `phone` (`string`, optional): Phone number of the contact, as a string. Example: +1 555-555-5555.

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

### `activecampaign_update_contact_custom_field`

Update Contact Custom Field · Write

Update a contact custom field definition's title, type, description, personalization tag or default value.
Returns the updated field.
Options and list relationships cannot be changed here.

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

Inputs:

- `field_id` (`integer`, required): ID of the custom field definition (not a field option ID).
- `defval` (`string`, optional): Default value of the field.
- `descript` (`string`, optional): Description of the field.
- `ordernum` (`string`, optional): Position of the field in the My Fields tab.
- `perstag` (`string`, optional): Personalization tag.
- `title` (`string`, optional): New title of the field.
- `type` (`string`, optional): Field type. One of: `text`, `textarea`, `date`, `datetime`, `dropdown`, `listbox`, `radio`, `checkbox`, `hidden`.
- `visible` (`boolean`, optional): Whether the field is shown in the Form Builder.

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

### `activecampaign_update_contact_field_value`

Update Contact Field Value · Write

Update one stored contact custom field value by its fieldValue ID.
Returns the updated fieldValue and the contact.
The contact and field IDs must be sent along with the new value.

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

Inputs:

- `contact_id` (`string`, required): ID of the contact.
- `field_id` (`string`, required): ID of the custom field, from list_contact_custom_fields.
- `field_value_id` (`string`, required): ID of the fieldValue record (not a contact or field ID).
- `value` (`string`, required): Value to store. Multi-select fields (checkbox, listbox) use ||option 1||option 2||; dates use YYYY-MM-DD.
- `use_defaults` (`boolean`, optional): If true, other required fields the contact is missing are filled with their default values.

Example input: `{"contact_id":"<contact_id>","field_id":"<field_id>","field_value_id":"<field_value_id>","value":"<value>"}`

### `activecampaign_update_contact_list_status`

Update Contact List Status · Write

Subscribe a contact to a list or unsubscribe it, by setting its status on that list.
Returns the contactList membership record.
Use this to manage list membership. Use activecampaign_get_contact_lists to read a contact's current memberships.

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

Inputs:

- `contact_id` (`string`, required): ID of the contact.
- `list_id` (`string`, required): ID of the list, from list_lists.
- `status` (`string`, required): 1 subscribes the contact to the list, 2 unsubscribes it. Changing an unsubscribed contact back to active resubscribes it. One of: `1`, `2`.
- `source_id` (`integer`, optional): Set to 4 when re-subscribing a contact that was previously unsubscribed.

Example input: `{"contact_id":"<contact_id>","list_id":"<list_id>","status":"1"}`

### `activecampaign_update_deal`

Update Deal · Write

Update a deal's title, value, stage, pipeline, owner, status or custom fields.
Returns the updated deal.
Set status 1 to mark the deal won or 2 to mark it lost; stage_id must belong to the deal's pipeline.

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

Inputs:

- `deal_id` (`integer`, required): ID of the deal.
- `account_id` (`string`, optional): ID of the deal's account.
- `contact_id` (`string`, optional): ID of the deal's primary contact.
- `currency` (`string`, optional): Three-letter ISO currency code in lowercase, for example usd.
- `description` (`string`, optional): Deal description.
- `fields` (`array`, optional): Deal custom field values as an array of {customFieldId, fieldValue, fieldCurrency}; currency values are in cents. Example: [{"customFieldId": 1, "fieldValue": "Enterprise"}].
- `owner_id` (`string`, optional): User ID of the deal owner, from list_users.
- `percent` (`integer`, optional): Win probability percentage.
- `pipeline_id` (`string`, optional): ID of the deal's pipeline, from list_pipelines. The stage must belong to this pipeline.
- `stage_id` (`string`, optional): ID of the deal's stage, from list_deal_stages.
- `status` (`integer`, optional): Deal status: 0 open, 1 won, 2 lost. One of: `0`, `1`, `2`.
- `title` (`string`, optional): Deal title.
- `value` (`integer`, optional): Deal value in cents, for example 45678 for 456.78. Must be zero or more.

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

### `activecampaign_update_deal_custom_field_value`

Update Deal Custom Field Value · Write

Update one stored deal custom field value by its ID.
Returns the updated dealCustomFieldDatum.
Get the value ID from activecampaign_list_deal_custom_field_values.

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

Inputs:

- `field_value` (`string`, required): New value. Currency fields take cents.
- `value_id` (`integer`, required): ID of the deal custom field value.
- `field_currency` (`string`, optional): Three-letter currency code, for currency fields only.

Example input: `{"field_value":"<field_value>","value_id":1}`

### `activecampaign_update_deal_stage`

Update Deal Stage · Write

Update a deal stage's title, order, color or deal sorting.
Returns the updated stage.
Use activecampaign_move_deals_to_stage to move all of its deals elsewhere.

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

Inputs:

- `stage_id` (`integer`, required): ID of the deal stage.
- `color` (`string`, optional): Stage color as a 6-character hex code without #.
- `deal_order` (`string`, optional): How deals are sorted in the stage: a field and direction separated by a space, for example next-action DESC or title ASC.
- `order` (`integer`, optional): Position of the stage within the pipeline.
- `pipeline_id` (`string`, optional): ID of the pipeline the stage belongs to.
- `reorder` (`integer`, optional): 1 reassigns order values to every stage in the pipeline after this change. One of: `0`, `1`.
- `title` (`string`, optional): Stage title.
- `width` (`integer`, optional): Stage column width in pixels.

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

### `activecampaign_update_deal_task`

Update Task · Write

Update a CRM task, including marking it complete.
Returns the updated task.
Set status 1 to complete the task; accounts that require outcomes also need outcome_id.

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

Inputs:

- `task_id` (`integer`, required): ID of the task.
- `assignee` (`integer`, optional): User ID the task is assigned to.
- `duedate` (`string`, optional): Due date and time in ISO 8601, for example 2026-11-02T12:00:00-05:00.
- `note` (`string`, optional): Task description.
- `outcome_id` (`integer`, optional): Task outcome ID, required by some accounts when completing a task.
- `outcome_info` (`string`, optional): Extra information about the outcome.
- `owner_type` (`string`, optional): What relid refers to: deal or contact. One of: `deal`, `contact`.
- `relid` (`integer`, optional): ID of the deal or contact the task belongs to (see owner_type).
- `status` (`integer`, optional): Task status: 0 incomplete, 1 complete. One of: `0`, `1`.
- `task_type_id` (`integer`, optional): Task type ID, from list_deal_task_types.
- `title` (`string`, optional): Task title.

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

### `activecampaign_update_list`

Update List · Write

Update a contact list's name, sender details or notification settings. The channel cannot be changed.
Returns the updated list.
name is required on every update, even when it is not changing.

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

Inputs:

- `list_id` (`string`, required): ID of the list.
- `name` (`string`, required): Name of the list. Required on every update, even if unchanged; no HTML.
- `carboncopy` (`string`, optional): Comma-separated email addresses that receive a copy of every mailing to this list.
- `description` (`string`, optional): Description of the list.
- `send_last_broadcast` (`boolean`, optional): Whether to send the last campaign sent to this list to each new subscriber.
- `sender_reminder` (`string`, optional): Reminder shown to contacts explaining why they are on this list.
- `sender_url` (`string`, optional): The website URL this list is for. Email lists must keep a valid URL.
- `stringid` (`string`, optional): URL-safe list name.
- `subscription_notify` (`string`, optional): Comma-separated email addresses notified when someone subscribes.
- `unsubscription_notify` (`string`, optional): Comma-separated email addresses notified when someone unsubscribes.
- `user` (`integer`, optional): User ID of the list owner, from list_users.

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

### `activecampaign_update_note`

Update Note · Write

Replace the text of an existing note.
Returns the updated note.
reltype and relid must still name the record the note belongs to.

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

Inputs:

- `note` (`string`, required): Text of the note.
- `note_id` (`string`, required): ID of the note.
- `relid` (`integer`, required): ID of the record the note is attached to.
- `reltype` (`string`, required): Type of record the note is attached to: Subscriber (contact), Deal, DealTask, Activity or CustomerAccount (account). One of: `Subscriber`, `Deal`, `DealTask`, `Activity`, `CustomerAccount`.

Example input: `{"note":"<note>","note_id":"<note_id>","relid":1,"reltype":"Subscriber"}`

### `activecampaign_update_pipeline`

Update Pipeline · Write

Update a deal pipeline's title, currency, permissions or auto-assign settings.
Returns the updated pipeline.
Use activecampaign_update_deal_stage to change its stages.

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

Inputs:

- `pipeline_id` (`integer`, required): ID of the pipeline.
- `allgroups` (`integer`, optional): 1 lets every user group manage the pipeline; 0 limits it to the groups in groups. One of: `0`, `1`.
- `allusers` (`integer`, optional): 1 auto-assigns new deals across all users (unless auto-assign is off); 0 uses the users list. One of: `0`, `1`.
- `autoassign` (`integer`, optional): Deal auto-assign mode: 0 disabled, 1 round robin, 2 deal value. One of: `0`, `1`, `2`.
- `currency` (`string`, optional): Default currency for new deals in this pipeline, lowercase ISO code.
- `groups` (`array`, optional): User group IDs allowed to manage the pipeline.
- `title` (`string`, optional): Pipeline title.
- `users` (`array`, optional): User IDs to auto-assign new deals to.

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

### `activecampaign_update_tag`

Update Tag · Write

Rename a tag or change its type or description. Renaming also updates automations and segments that use it.
Returns the updated tag.
Fails with 422 if another tag already uses the new name.

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

Inputs:

- `tag_id` (`integer`, required): ID of the tag.
- `description` (`string`, optional): Description of the tag.
- `name` (`string`, optional): Tag name: 1 to 250 characters, no commas, line breaks or HTML.
- `tag_type` (`string`, optional): Tag type: contact or template. Send it on create; tags created without a type do not appear in list_tags. One of: `contact`, `template`.

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

### `activecampaign_delete_account`

Delete Account · Destructive

Delete an account (company) by ID.
Returns an empty object on success.
Contacts linked to the account are not deleted.

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

Inputs:

- `account_id` (`integer`, required): ID of the account.

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

### `activecampaign_delete_account_contact`

Unlink Contact from Account · Destructive

Remove a contact-to-account association by its ID.
Returns an empty object on success.
Get the association ID from activecampaign_list_account_contacts. The contact and account are not deleted.

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

Inputs:

- `association_id` (`integer`, required): ID of the accountContact association.

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

### `activecampaign_delete_contact`

Delete Contact · Destructive

Permanently delete a contact by ID.
Returns an empty object on success and 404 if the contact does not exist.
Use this to remove a contact entirely. Use activecampaign_update_contact_list_status to unsubscribe a contact from a list instead.

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

Inputs:

- `contact_id` (`integer`, required): ID of the contact.

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

### `activecampaign_delete_contact_custom_field`

Delete Contact Custom Field · Destructive

Permanently delete a contact custom field definition and every contact's value for it. Cannot be undone.
Returns an empty object on success.
Use activecampaign_delete_contact_field_value to clear the field for one contact only.

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

Inputs:

- `field_id` (`integer`, required): ID of the custom field definition (not a field option ID).

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

### `activecampaign_delete_contact_field_value`

Delete Contact Field Value · Destructive

Clear one contact's value for a custom field by deleting the fieldValue record.
Returns an empty object on success.
The field definition and other contacts' values are not affected.

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

Inputs:

- `field_value_id` (`integer`, required): ID of the fieldValue record (not a contact or field ID).

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

### `activecampaign_delete_deal`

Delete Deal · Destructive

Permanently delete a deal by ID.
Returns an empty object on success.
Use activecampaign_update_deal with status 2 to mark a deal lost instead of deleting it.

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

Inputs:

- `deal_id` (`integer`, required): ID of the deal.

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

### `activecampaign_delete_deal_secondary_contact`

Remove Deal Secondary Contact · Destructive

Remove a secondary contact from a deal by the contactDeal row ID.
Returns an empty object on success.
Get the row ID from activecampaign_list_deal_secondary_contacts.

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

Inputs:

- `contact_deal_id` (`integer`, required): ID of the contactDeal row.

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

### `activecampaign_delete_deal_stage`

Delete Deal Stage · Destructive

Delete a deal stage.
Returns an empty object on success.
Use activecampaign_move_deals_to_stage first to keep the stage's deals.

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

Inputs:

- `stage_id` (`integer`, required): ID of the deal stage.

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

### `activecampaign_delete_deal_task`

Delete Task · Destructive

Delete a CRM task by ID.
Returns an empty object on success.
Use activecampaign_update_deal_task with status 1 to complete a task instead.

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

Inputs:

- `task_id` (`integer`, required): ID of the task.

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

### `activecampaign_delete_list`

Delete List · Destructive

Delete a contact list.
Returns an empty object on success.
Contacts on the list are not deleted.

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

Inputs:

- `list_id` (`integer`, required): ID of the list.

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

### `activecampaign_delete_note`

Delete Note · Destructive

Delete a note by ID.
Returns an empty object on success.
Use activecampaign_list_notes or activecampaign_get_contact_notes to find the ID.

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

Inputs:

- `note_id` (`string`, required): ID of the note.

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

### `activecampaign_delete_pipeline`

Delete Pipeline · Destructive

Delete a deal pipeline.
Returns an empty object on success.
Move or close its deals first if you need to keep them.

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

Inputs:

- `pipeline_id` (`integer`, required): ID of the pipeline.

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

### `activecampaign_delete_tag`

Delete Tag · Destructive

Permanently delete a tag definition.
Returns an empty object on success.
Use activecampaign_remove_tag_from_contact to take a tag off one contact without deleting the tag.

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

Inputs:

- `tag_id` (`integer`, required): ID of the tag.

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

### `activecampaign_remove_contact_from_automation`

Remove Contact from Automation · Destructive

Remove a contact from an automation by the contactAutomation row ID.
Returns an empty object on success.
Get the row ID from activecampaign_get_contact_automations or activecampaign_add_contact_to_automation, not the automation ID.

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

Inputs:

- `contact_automation_id` (`integer`, required): ID of the contactAutomation row (not the automation ID).

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

### `activecampaign_remove_tag_from_contact`

Remove Tag from Contact · Destructive

Remove a tag from a contact by contact ID and tag ID. The tag definition itself is not deleted.
Returns an empty object on success, and 404 if the contact or tag does not exist or the tag is not on the contact.
Use activecampaign_list_tags to find the tag ID. Use activecampaign_delete_tag to delete the tag from the account entirely.

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

Inputs:

- `contact_id` (`integer`, required): ID of the contact.
- `tag_id` (`integer`, required): ID of the tag.

Example input: `{"contact_id":1,"tag_id":1}`

## 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 |
