# Iterable

```json
{
  "name": "Iterable",
  "slug": "iterable",
  "url": "https://composio.dev/toolkits/iterable",
  "markdown_url": "https://composio.dev/toolkits/iterable.md",
  "logo_url": "https://logos.composio.dev/api/iterable",
  "categories": [
    "marketing & social media"
  ],
  "is_composio_managed": false,
  "updated_at": "2026-06-18T09:35:12.721Z"
}
```

![Iterable logo](https://logos.composio.dev/api/iterable)

## Description

Securely connect your AI agents and chatbots (Claude, ChatGPT, Cursor, etc) with Iterable MCP or direct API to manage campaigns, update user profiles, track events, and analyze message performance through natural language.

## Summary

Iterable is a cross-channel marketing platform for building campaigns across email, SMS, push, and in-app channels.
It helps teams personalize customer journeys and optimize engagement from one place.

## Categories

- marketing & social media

## Toolkit Details

- Tools: 116

## Images

- Logo: https://logos.composio.dev/api/iterable

## Authentication

- **Api Key**
  - Type: `api_key`
  - Description: Api Key authentication for Iterable.
  - Setup:
    - Configure Api Key credentials for Iterable.
    - Use the credentials when creating an auth config in Composio.

## Suggested Prompts

- Summarize Iterable campaign performance today
- Add customer to welcome journey
- Update user email subscription status

## Supported Tools

| Tool slug | Name | Description |
|---|---|---|
| `ITERABLE_ABORT_CAMPAIGN` | Abort Campaign | Abort a running campaign to stop all in-progress message deliveries. Use this action when you need to immediately halt an active campaign that is currently sending messages to recipients. This action is useful for emergency stops, such as when an issue is discovered in the campaign content or targeting. Note: Only campaigns in 'Running' state can be aborted. Campaigns that have already finished or were not started cannot be aborted. |
| `ITERABLE_ACTIVATE_TRIGGERED_CAMPAIGN` | Activate a triggered campaign | Activates a triggered campaign by its unique ID, allowing it to process events and send messages. Use this action when you need to start a triggered campaign that will send messages based on user events (e.g., cart abandonment, welcome series, re-engagement). The campaign must be in a valid state for activation (e.g., not already running or finished). Note: API triggered campaign activation must be enabled for your project. |
| `ITERABLE_ARCHIVE_CAMPAIGNS` | Archive Campaigns | Archives one or more campaigns. This endpoint behaves the same as the archive feature in the UI. Scheduled or recurring campaigns will be cancelled, and running campaigns will be aborted. Archived campaigns will be hidden from the Campaigns page, but can still be viewed in the Archived tab. Use this action when you need to remove campaigns from the active campaigns list while preserving them for historical reference. This action is irreversible — once archived, campaigns cannot be restored through this API (must be done manually through the UI). Rate limit: 5 requests/second, per API key. |
| `ITERABLE_BULK_UPDATE_USERS` | Bulk Update Users | Bulk update user data in Iterable. Use this action when you need to update multiple user profiles at once. This endpoint adds and overwrites user profile fields as needed. It does not modify top-level fields omitted from the request body. If you'd like to merge (rather than overwrite) a user profile's top-level objects with the values provided, set mergeNestedObjects to true. When updating an existing field, you cannot change its data type (the new value must have the same data type as the old value). At least one of email or userId must be provided for each user in the users array. |
| `ITERABLE_CANCEL_CAMPAIGN` | Cancel Campaign | Cancel a scheduled or recurring campaign in Iterable. Use when you need to stop a campaign that is scheduled for future sending or is part of a recurring campaign cycle. Once canceled, the campaign will not be sent to any recipients. Note: This action is irreversible for campaigns that are already in the process of sending. Only campaigns with a 'Scheduled' or 'Recurring' state can be canceled. |
| `ITERABLE_CANCEL_EMAIL` | Cancel Email | Cancel a scheduled email to a specific user in Iterable. Use when you need to stop an email that has been queued for a specific user but has not yet been sent. You can cancel by providing the scheduledMessageId alone, or by providing a campaignId along with the user's email or userId. Note: This action is irreversible — once an email is canceled, it cannot be sent again using this endpoint. The canceled message will not be delivered to the recipient. |
| `ITERABLE_CANCEL_EXPORT` | Cancel Export | Cancel a queued or running export created with the 'Start export' endpoint. Use when you need to abort an export job that is in progress or queued. Rate limit: 1 request/second, per project. |
| `ITERABLE_CANCEL_IN_APP` | Cancel In-App Message | Cancel a scheduled in-app message to a specific user in Iterable. Use when you need to stop a scheduled in-app message that is queued for delivery to a specific user. This action cancels the in-app message for the specified user based on their email or userId. Note: This action is irreversible — once an in-app message is canceled, it will not be delivered to the user. |
| `ITERABLE_CANCEL_PUSH` | Cancel Push | Cancel a scheduled push notification to a specific user in Iterable. Use when you need to stop a push notification that has been queued for a specific user but has not yet been sent. You can cancel by providing the scheduledMessageId alone, or by providing a campaignId along with the user's email or userId. Note: This action is irreversible — once a push notification is canceled, it cannot be resent using this endpoint. The canceled message will not be delivered to the recipient. |
| `ITERABLE_CANCEL_WEB_PUSH` | Cancel Web Push | Cancel a scheduled web push notification to a specific user in Iterable. Use when you need to stop a web push notification that has been queued for a specific user but has not yet been sent. You can cancel by providing the scheduledMessageId alone, or by providing a campaignId along with the user's email or userId. Note: This action is irreversible — once a web push notification is canceled, it cannot be resent using this endpoint. The canceled message will not be delivered to the recipient. |
| `ITERABLE_CANCEL_WHATS_APP` | Cancel WhatsApp | Cancel a scheduled WhatsApp message to a specific user in Iterable. Use when you need to stop a WhatsApp message that has been queued for a specific user but has not yet been sent. You can cancel by providing the scheduledMessageId alone, or by providing a campaignId along with the user's email or userId. Note: This action is irreversible — once a WhatsApp message is canceled, it cannot be resent using this endpoint. The canceled message will not be delivered to the recipient. |
| `ITERABLE_CREATE_CAMPAIGN` | Create a new campaign | Creates a new blast or triggered campaign from an existing template. Use this action when you need to create email, push notification, web push notification, SMS, in-app message, and embedded message campaigns from an existing template. Note that global suppression lists are not automatically added to campaigns created from this endpoint; to include a global suppression list, include it in the suppressionListIds request parameter. |
| `ITERABLE_CREATE_CATALOG` | Create a catalog | Create a catalog with the specified name in Iterable. Use this action when you need to create a new catalog to store and organize data such as products, users, or other entities. Each catalog in a project must have a unique name. Catalog names can be no longer than 255 characters and must contain only alphanumeric characters and dashes. |
| `ITERABLE_CREATE_CATALOG_ITEMS` | Create Catalog Items | Asynchronously creates or updates up to 1000 catalog items with a single request. Use this action when you need to bulk create or update catalog items efficiently. If an item with the same ID already exists, it will be completely overwritten, unless replaceUploadedFieldsOnly is set to true to merge fields instead. This operation is asynchronous — the API returns 202 Accepted when the request is queued for processing. The rate limit is 100 requests per second. Note: Each item ID must contain only alphanumeric characters and dashes (max 255 characters), and field names should not contain periods. |
| `ITERABLE_CREATE_LIST` | Create a new list | Create a new static list in Iterable. Use this action when you need to create a new contact list that can be used for email campaigns, segmentation, or organizing contacts. Each list must have a unique name within the project. The newly created list starts empty and can be populated by adding contacts via other Iterable API actions. |
| `ITERABLE_CREATE_SNIPPET` | Create snippet | Creates a new code snippet in Iterable. Use this action when you need to create a reusable code snippet that can be referenced in campaigns, templates, or other Iterable features. The snippet name must be unique within the project and cannot be changed after creation. |
| `ITERABLE_DEACTIVATE_TRIGGERED_CAMPAIGN` | Deactivate Triggered Campaign | Deactivate a triggered campaign in Iterable. Use when you need to stop a triggered campaign from firing based on user events. This action is irreversible — once a triggered campaign is deactivated, it cannot be reactivated through this API. Use the Iterable dashboard or the activate triggered campaign endpoint to reactivate it. Note: Only triggered campaigns can be deactivated. Regular blast campaigns cannot be deactivated using this endpoint. |
| `ITERABLE_DELETE_BULK_TEMPLATES` | Bulk delete templates | Bulk delete one or more base templates from Iterable. Use this action when you need to permanently remove multiple templates that are no longer needed. This action is irreversible — templates cannot be recovered once deleted. Note: Templates associated with a campaign will not be deleted and will be skipped. |
| `ITERABLE_DELETE_CATALOG` | Delete a catalog | Delete a catalog by its name. This action also deletes all collections that reference the specified catalog. Use this action when you need to permanently remove a catalog and all its associated collections from Iterable. This action is irreversible — the catalog and all associated collections cannot be recovered once deleted. |
| `ITERABLE_DELETE_CATALOG_ITEM` | Delete a Catalog Item | Deletes the specified item from a catalog. This action is asynchronous — the data may not be deleted immediately. Use this action when you need to remove a specific item from a catalog by its unique identifier. This action is irreversible — once the item is deleted, it cannot be recovered unless a backup or re-sync mechanism is in place. |
| `ITERABLE_DELETE_CATALOG_ITEMS` | Delete Catalog Items | Asynchronously deletes catalog items from a specified catalog in Iterable. Use when you need to remove specific items from a catalog by their IDs. This action processes the deletion asynchronously — the API may return a 202 Accepted status indicating the request has been queued for processing. Important: This action is irreversible — the catalog items cannot be recovered once deleted. Note: This endpoint supports bulk deletion of multiple items at once. Ensure all item IDs in the request are valid and exist in the catalog to avoid partial deletions. |
| `ITERABLE_DELETE_LIST` | Delete a list | Delete a list by its listId. Use this action when you need to permanently remove a contact list from Iterable. This action is irreversible — the list and all associated data cannot be recovered once deleted. Note: Lists that are currently in use (e.g., in active campaigns) may not be deletable and will return a 409 error. |
| `ITERABLE_DELETE_METADATA_TABLE` | Delete Metadata Table | Asynchronously deletes a metadata table by its table name. Use when you need to permanently remove a metadata table from Iterable. This action is asynchronous - a 200 response indicates a valid request that will be processed, but the table may not be deleted immediately. Use GET /api/metadata/{table} to verify that the deletion is complete. This action is irreversible — the table and all associated data cannot be recovered once deleted. |
| `ITERABLE_DELETE_SNIPPET` | Delete snippet | Deletes a snippet by its ID (numeric) or name (string). Numeric identifiers are treated as snippet IDs, string identifiers as snippet names. Use this action when you need to remove a snippet that is no longer needed. This action is irreversible - the snippet cannot be recovered once deleted. |
| `ITERABLE_DELETE_USER_BY_ID` | Delete User By ID | Asynchronously deletes a user by userId from Iterable. Use when you need to remove a user from Iterable's system by their userId. This action does not prevent future data collection about the user. If multiple users share the same userId, they'll all be deleted. This endpoint can be used to delete users from email-based projects, userID-based projects, and hybrid projects. Important: This action is irreversible — the user data cannot be recovered once deleted. Note: userId values containing a '/' character are not supported by this endpoint. |
| `ITERABLE_EXPORT_DATA_CSV` | Export data to CSV | Export campaign analytics data in CSV format from Iterable. Use when you need to retrieve event data such as email sends, opens, clicks, push notifications, SMS messages, purchases, or custom events. Note: Either use the 'range' parameter (recommended for simple date filtering) OR use 'startDateTime' and 'endDateTime' together for custom date ranges. Using both will result in an error. Rate limit: 4 requests per minute per project. |
| `ITERABLE_EXPORT_DATA_JSON` | Export Campaign Data to JSON | Export campaign analytics data in JSON format with one entry per line. Use when you need to retrieve campaign metrics such as email sends, opens, clicks, purchases, or custom events. Rate limit: 4 requests per minute per project. Either 'range' OR 'startDateTime'/'endDateTime' must be provided. |
| `ITERABLE_EXPORT_USER_EVENTS` | Export User Events | Export all events for a user identified by email or userId. Returns events as JSON, one event per line. Use this action when you need to retrieve the complete event history for a specific user in Iterable. Either email or userId must be provided, but not both. Custom events are excluded by default unless includeCustomEvents is set to true. |
| `ITERABLE_FORGET_USER` | Forget User | Deletes the specified user's data from the Iterable project and prevents future data collection about them. This action is used for GDPR compliance. Use this action when you need to permanently remove a user's data from Iterable and ensure no future data is collected about them. In email-based projects, you must forget users by email. In userID-based projects, you must forget users by userId. In hybrid projects, you can forget users by either email or userId. Learn about identifying users by userId and email. Note: This action is irreversible - once a user is forgotten, their data cannot be recovered and future data collection about them is prevented. |
| `ITERABLE_GET_CAMPAIGN` | Get campaign by ID | Retrieves a campaign by its unique ID. Use this action when you need to fetch detailed information about a specific campaign from Iterable. The response includes campaign metadata such as state, type, timing, and associated lists or templates. |
| `ITERABLE_GET_CAMPAIGN_METRICS` | Get Campaign Metrics | Retrieve performance metrics for one or more campaigns. Use when you need to analyze delivery, open, click, and conversion rates for your email, push, or SMS campaigns. This action allows filtering by specific campaign IDs and/or a date range. Note: Rate limited to 10 requests per minute per project. |
| `ITERABLE_GET_CATALOG_FIELD_MAPPINGS` | Get Catalog Field Mappings | Tool to retrieve field mappings (field to data type) and undefined fields for a catalog in Iterable. Use when you need to inspect the schema structure and data type definitions of a catalog. |
| `ITERABLE_GET_CATALOG_ITEM` | Get catalog item by ID | Retrieves a specific catalog item by its ID from the specified catalog. Use this action when you need to fetch a single item from a catalog using its unique identifier. |
| `ITERABLE_GET_EMAIL_TEMPLATE` | Get email template by ID | Get an email template by templateId. Use this action when you need to retrieve a specific email template from Iterable to view its content, settings, sender configuration, or metadata. The response includes the template's HTML and plain text content, sender information (from email, reply-to), subject line, and various rendering options like data feeds, link parameters, and analytics settings. Optionally, you can specify a locale parameter to retrieve localized content if available. |
| `ITERABLE_GET_EMBEDDED_MESSAGES` | Get Embedded Messages | Retrieves embedded messages for which the specified user is eligible, grouped by placementId. Use this action when you need to fetch in-app embedded messages for a user based on their email or userId. By default, it returns data for all placements that have messages for the user. To constrain the response to specific placements, provide one or more placementIds query parameters. |
| `ITERABLE_GET_EMBEDDED_TEMPLATE` | Get Embedded Template | Retrieves an embedded message template by its unique ID. Use this action when you need to fetch detailed information about a specific embedded message template from Iterable, including its content, visual elements, and metadata. Optionally filter by locale to retrieve localized content. |
| `ITERABLE_GET_EXPERIMENT_METRICS` | Get Experiment Metrics | Retrieve metrics for email experiments. Use when you need to analyze performance data for A/B tests or email experiments. This action allows filtering by specific experiment IDs, campaign IDs, and/or a date range. Currently only email experiment metrics are supported. |
| `ITERABLE_GET_IN_APP_MESSAGES` | Get In-App Messages | Get a user's in-app messages from Iterable. This endpoint always returns the user's non-selective (not app-specific) in-app messages. To also fetch app-specific in-app messages, include a packageName and platform in the request. Use this action when you need to retrieve in-app messages for a user, including new messages and messages that have already been saved to a mobile inbox. Each message includes a read field to indicate whether it has been seen. |
| `ITERABLE_GET_IN_APP_TEMPLATE` | Get in-app template by ID | Retrieves an in-app template by its unique ID. Use this action when you need to fetch detailed information about a specific in-app template from Iterable, including its content, display settings, and metadata. Optionally specify a locale to retrieve localized content. |
| `ITERABLE_GET_LIST_SIZE` | Get List Size | Get the number of users within a list. Returns the count of users currently subscribed to the specified list. Use this action when you need to check how many users are in a specific list for reporting, list management, or campaign planning purposes. |
| `ITERABLE_GET_PUSH_TEMPLATE` | Get push template by ID | Retrieves a push template by its unique ID. Use this action when you need to fetch a specific push template from Iterable to view its settings, content, or configuration. The response includes all template properties including message content, buttons, deeplinks, and metadata. Rate limit: 100 requests/second, per project. |
| `ITERABLE_GET_SMS_TEMPLATE` | Get SMS template | Retrieves an SMS template by its unique ID. Use this action when you need to fetch the content, metadata, and settings of a specific SMS template from Iterable. The response includes the template message content, locale information, tracking settings, and other configuration details. Rate limit: 100 requests/second, per project. |
| `ITERABLE_GET_SNIPPET` | Get snippet by ID or name | Retrieves a snippet by its ID (numeric) or name (string). Numeric identifiers are treated as snippet IDs, string identifiers as snippet names. Use this action when you need to retrieve a specific snippet by its identifier to view its content, metadata, or associated variables. |
| `ITERABLE_GET_TEMPLATE_BY_CLIENT_ID` | Get template by client template ID | Retrieves an email template by its client-defined template ID. Use this action when you need to find templates using a client-specific identifier rather than the internal Iterable template ID. The response contains a list of templates that match the provided clientTemplateId. Rate limit: 100 requests/second, per project. |
| `ITERABLE_GET_USER_BY_ID` | Get User By ID | Get a user by userId from Iterable. Use when you need to retrieve user information using a specific userId. This action fetches user data including email, userId, and any additional dataFields stored in Iterable. Unlike path-parameter endpoints, this query-parameter-based endpoint provides better support for special characters (such as '/') in the userId value. Rate limit: 100 requests/second per project. |
| `ITERABLE_GET_USER_BY_ID_PATH` | Get User By ID (Path) | Get a user by userId (path parameter) from Iterable. Use when you need to retrieve user information using a specific userId as a path parameter. This action fetches user data including email, userId, and any additional dataFields stored in Iterable. Note: This endpoint does not work for userId values that contain a '/' character. For userIds with special characters, use the query-parameter-based GET /api/users/byUserId endpoint instead. Rate limit: 100 requests/second per project. |
| `ITERABLE_GET_USER_EVENTS` | Get User Events | Get events for a specific user by userId. Use when you need to retrieve the event history for a particular user from Iterable. This action allows you to fetch a user's event data including campaign interactions, channel activity, and associated metadata. The results can be filtered using the limit parameter to control the number of events returned (max 200). Note: This endpoint does not support userId values containing a '/' character. |
| `ITERABLE_GET_USER_SENT_MESSAGES` | Get User Sent Messages | Get messages sent to a user by email address or userId. Use when you need to retrieve the message history for a specific user in Iterable. This action returns messages sent to a user, with optional filtering by campaign, date range, and message type. Returns 10 messages by default, up to a maximum of 1000. Rate limit: 3 requests/second per project. Note: Either email or userId must be provided to identify the user, but not both. |
| `ITERABLE_GET_WEB_IN_APP_MESSAGES` | Get Web In-App Messages | Get a user's web in-app messages from Iterable. This endpoint always returns the user's non-selective (not app-specific) web in-app messages. To also fetch web app-specific in-app messages, include a packageName in the request. This endpoint returns new messages and messages that have already been saved to a mobile inbox, and each message has a read field to indicate whether or not it has already been seen. Use when you need to retrieve in-app messages for a user, such as displaying an inbox of notifications or checking unread message status. |
| `ITERABLE_LIST_CAMPAIGNS` | List all campaigns | Retrieves metadata about all campaigns in a project with optional pagination. Use this action when you need to enumerate all campaigns in a project, retrieve campaign IDs for subsequent operations, or paginate through large result sets. The response includes campaign metadata such as state, type, timing, and associated lists or templates. If no pagination parameters are provided, the unpaginated API returns all campaigns (deprecated behavior, may be removed in the future). Rate limit: 100 requests/second, per project. |
| `ITERABLE_LIST_CATALOG_ITEMS` | List Catalog Items | Get the catalog items for a catalog. Use when you need to retrieve items stored in a specific Iterable catalog, such as product catalogs, user preferences, or custom data sets. Supports pagination and sorting for large catalogs. Rate limit: 100 requests/second per API key. |
| `ITERABLE_LIST_CATALOGS` | List Catalogs | Tool to retrieve all catalog names from Iterable. Use when you need to list available catalogs before performing catalog-specific operations like getting or setting catalog records. |
| `ITERABLE_LIST_CHANNELS` | List Channels | Get all message channels within the Iterable project. Use this action when you need to retrieve all available communication channels (e.g., email, push notifications) configured in your Iterable project. This is useful for identifying valid channel options when creating campaigns or managing messaging workflows. |
| `ITERABLE_LIST_EXPORT_FILES` | List export files | Get the job status and files for an export started with the 'Start export' endpoint. Occasionally, a job status may change from running to enqueued because it had to restart. When this happens, the job maintains progress and begins where it previously stopped. Iterable uses exponential backoff for retries. Files are added to the list as the export job is running. Paginate through the files by using the last file name in the response as the startAfter value for the next request. Use when you need to monitor export progress, retrieve export results, or paginate through large export file lists. |
| `ITERABLE_LIST_EXPORT_JOBS` | List Export Jobs | Retrieve a list of recent export jobs for the current project. Use when you need to monitor export job status, check for completed exports, or manage data export operations. |
| `ITERABLE_LIST_FORGOTTEN_USER_IDS` | List Forgotten User IDs | Get hashed user IDs of forgotten users for GDPR compliance. Returns a hash for each userId currently forgotten by your project. Each forgotten userId is lowercased, trimmed, and hashed using SHA-256. Use this action when you need to retrieve forgotten user data for GDPR compliance audits or data subject request processing. Note: This endpoint only works for userID-based and hybrid projects. For email-based projects, it returns an error. Rate limit: 3 requests/second, per project. |
| `ITERABLE_LIST_JOURNEYS` | List Journeys | Get a list of journeys (workflows) within your Iterable project. Use this action when you need to retrieve and browse through marketing automation journeys, including their status, configuration, and metadata. Supports pagination, sorting, and filtering by journey state (active, archived, etc.). |
| `ITERABLE_LIST_LISTS` | List Lists | Retrieve all lists within a project. Use when you need to enumerate available lists, retrieve list IDs for subsequent operations, or understand the structure of contact lists. Rate limit: 100 requests/second, per project. |
| `ITERABLE_LIST_LIST_USERS` | List List Users | Get all users within a list. Use when you need to retrieve the complete list of users subscribed to a specific list for export, analysis, or batch operations. This action returns all users in the list (unlike preview which returns a sample). Rate limit: 5 requests/minute, per project. |
| `ITERABLE_LIST_MESSAGE_TYPES` | List Message Types | Lists all message types within a project. Use when you need to retrieve all available message types (e.g., Email, Push, SMS) and their associated metadata such as channel ID, subscription policy, and rate limits. Rate limit: 100 requests/second, per project. |
| `ITERABLE_LIST_METADATA_KEYS` | List Metadata Keys | List all keys in a metadata table. Use when you need to discover what keys exist within a specific metadata table (e.g., to find keys before retrieving or deleting individual metadata items). Results may be paginated; use the `nextMarker` parameter to retrieve subsequent pages. |
| `ITERABLE_LIST_METADATA_TABLES` | List Metadata Tables | List available metadata tables in Iterable. Use when you need to discover what metadata tables are available for querying (e.g., users, events, campaigns). This action is read-only and idempotent. |
| `ITERABLE_LIST_RECURRING_CHILD_CAMPAIGNS` | List recurring campaign child campaigns | Retrieve the child campaigns generated by a recurring campaign. Use when you need to list or monitor campaigns that were created from a recurring campaign template. Pagination is supported using page and pageSize parameters. Rate limit: 100 requests/second per project. |
| `ITERABLE_LIST_SNIPPETS` | List Snippets | Get all snippets for the current project. Use this action when you need to retrieve all code snippets available in the Iterable project, including their content, metadata, and associated variables. |
| `ITERABLE_LIST_TEMPLATES` | List all templates | Retrieves metadata about all templates in a project with optional pagination. Use this action when you need to enumerate all templates in a project, retrieve template IDs for subsequent operations, or paginate through large result sets. If no pagination parameters are provided, the unpaginated API returns all templates (deprecated behavior, may be removed in the future). Rate limit: 100 requests/second, per project. |
| `ITERABLE_LIST_USER_FIELDS` | List User Fields | Get all user fields within a project. Use when you need to discover what custom fields exist for users in your Iterable project, such as for understanding user data schema, creating imports, or validating field names before setting user data. Rate limit: 3 requests/second, per project. |
| `ITERABLE_LIST_WEBHOOKS` | List Webhooks | Get all webhooks configured within the Iterable project. Use this action when you need to retrieve all webhook configurations, identify webhook IDs for subsequent operations, or understand the webhook setup for your project. This is useful for auditing webhook settings, checking which events are being monitored, or finding webhook endpoints. This action is read-only and idempotent. |
| `ITERABLE_MERGE_USERS` | Merge Users | Merge two user profiles in Iterable. Use when you need to consolidate duplicate user profiles. This action merges all profile data and events from the source user into the destination user. The source user profile will be deleted after the merge is complete. IMPORTANT: Provide exactly one source identifier (sourceEmail OR sourceUserId) and exactly one destination identifier (destinationEmail OR destinationUserId). The action will return an error if the source user does not exist. If the destination user is not found, the source user will be updated instead of merged. This action is irreversible — once merged, the source user profile cannot be recovered. Rate limit: 50 requests/second per API key. |
| `ITERABLE_PREVIEW_EMAIL_TEMPLATE` | Preview email template | Generate a fully rendered HTML preview of an email template using custom data. Use this action when you need to preview how an email template will look when rendered with specific data fields or data feed data. This is useful for testing template rendering before sending campaigns, or for verifying template logic with different data scenarios. The preview shows exactly how the template will appear when sent to a user. Note: Fields not provided in the request data will be rendered as empty strings in the preview. |
| `ITERABLE_PREVIEW_IN_APP_TEMPLATE` | Preview in-app template | Generate a fully rendered HTML preview of an in-app template using custom data. Use this action when you need to simulate how a template would appear when sent to a user, allowing you to test template rendering with specific data fields and/or data feed data. This is useful for previewing templates before sending campaigns or testing template logic with different data scenarios. Note: If a template references a field that is not provided in the request data, that field will be rendered as an empty string, matching production behavior. |
| `ITERABLE_PREVIEW_LIST_USERS` | Preview List Users | Get a random sample of up to 5000 users within a list. Use when you need to quickly preview the users in a specific list without fetching the entire list. This action is useful for sampling list membership before running campaigns or verifying list content. Rate limit: 5 requests/minute, per project. |
| `ITERABLE_REPLACE_CATALOG_ITEM` | Replace Catalog Item | Asynchronously creates or replaces the specified catalog item in the given catalog. Use this action when you need to completely replace a catalog item with new data. If the item already exists, it will be fully replaced by the value provided in the request body. Previously existing fields not included in the new value will be lost. This operation is asynchronous — the API returns 202 Accepted when the request is queued for processing. Use GET /api/catalogs/{catalogName}/items/{itemId} to verify completion. Note: A catalog item's ID must be unique, contain only alphanumeric characters and dashes, and have a maximum length of 255 characters. Do not use periods in field names. The rate limit is 1000 requests per second. |
| `ITERABLE_REPLACE_METADATA_ITEM` | Replace Metadata Item | Asynchronously creates or replaces the metadata item associated with the specified key. Use when you need to create a new metadata item or completely replace an existing one. A 200 response indicates a valid request that will be processed; updates may not be made immediately. Use GET /api/metadata/{table}/{key} to verify the update completion. Note: This is an idempotent operation - calling it multiple times with the same parameters will result in the same state. |
| `ITERABLE_SCHEDULE_CAMPAIGN` | Schedule Campaign | Schedule an existing campaign to be sent at a specified time. Use when you have created a campaign and need to schedule it for future sending. The campaign must exist and not already be scheduled or in the process of sending. You can optionally specify time zone settings to send at the same local time across different recipient time zones. Note: The send time must be up to 7 days in the future. Scheduling can be modified or canceled before the send time using the 'Cancel campaign' endpoint. |
| `ITERABLE_SEND_CAMPAIGN` | Send Campaign | Send an existing campaign immediately in Iterable. Use when you need to trigger a campaign to send right away, bypassing any scheduled send time. The campaign must be in a 'Ready' state before it can be sent using this endpoint. This action is useful for testing campaigns or sending them outside of their normal schedule. Note: Once a campaign starts sending, it cannot be stopped. Ensure the campaign is in the correct state before using this action. |
| `ITERABLE_SEND_EMAIL_PROOF` | Send email template proof | Send a proof of an email template to a specific user. Use this action when you need to preview an email template by sending a proof to a specific recipient before sending it to a larger audience. This allows you to verify that the template renders correctly with sample data and contains the expected content. Provide the template ID and either an email address or user ID to identify the recipient. You can optionally include data fields to merge into the template for more accurate preview rendering. Rate limit: 20 requests/second per API key. |
| `ITERABLE_SEND_IN_APP` | Send in-app notification to target | Send an in-app notification to a specific user using Iterable. Use this action when you need to send an in-app notification directly to a recipient. The notification is sent based on a campaign/template ID, and the recipient is identified either by their email address or user ID. Request data fields override user profile data fields. A reference to the user profile is provided via the profile to help resolve field collisions. Learn about identifying users by userId and email. |
| `ITERABLE_SEND_IN_APP_PROOF` | Send in-app template proof | Send a proof of an in-app template to a specific user using Iterable. Use this action when you need to preview how an in-app template will look for a specific user before sending the actual campaign. The proof email contains the rendered template with merge fields populated using the provided data fields and user profile information. Provide either recipientEmail or recipientUserId (but not both) to identify the target user. This action is rate-limited to 20 requests per second per API key. |
| `ITERABLE_SEND_PUSH` | Send push to target | Send a push notification to a specific user using Iterable. Use this action when you need to send a transactional push notification directly to a recipient. The push is sent based on a campaign/template ID, and the recipient is identified either by their email address or user ID. Request data fields override user profile data fields. A reference to the user profile is provided via the profile to help resolve field collisions. Learn about identifying users by userId and email. |
| `ITERABLE_SEND_PUSH_PROOF` | Send push template proof | Send a proof of a push template to a specific user. Use this action when you need to preview a push template by sending a proof to a specific recipient before sending it to a larger audience. This allows you to verify that the template renders correctly with sample data and contains the expected content. Provide the template ID and either an email address or user ID to identify the recipient. You can optionally include data fields to merge into the template for more accurate preview rendering. # ci-skip: action-tags (POST /api/templates/push/proof sends a proof push as a side effect, not a durable resource creation) Rate limit: 20 requests/second per API key. |
| `ITERABLE_SEND_SMS_PROOF` | Send SMS template proof | Send a proof of an SMS template to a specific user. Use this action when you need to preview an SMS template by sending a proof to a specific recipient before sending it to a larger audience. This allows you to verify that the template renders correctly with sample data and contains the expected content. Provide the template ID and either an email address or user ID to identify the recipient. You can optionally include data fields to merge into the template for more accurate preview rendering. Rate limit: 20 requests/second per API key. |
| `ITERABLE_SEND_WHATS_APP` | Send WhatsApp to target | Send a WhatsApp message to a specific user using Iterable. Use this action when you need to send a transactional WhatsApp message directly to a recipient. The WhatsApp message is sent based on a campaign/template ID, and the recipient is identified either by their email address or user ID. Request data fields override user profile data fields. This API is typically used for transactional messaging. Learn about identifying users by userId and email. |
| `ITERABLE_START_EXPORT` | Start Export | Start a data export job. The export processes as a background job asynchronously. Use the 'List export files' action to check export status by jobId and obtain file download links once completed. Use this action when you need to export data such as user profiles, email events, push notifications, SMS messages, purchases, or custom events. The exported data can be in CSV or JSON format. Rate limit: 1 request/second, per organization. Concurrent request limit: Up to 4 exports process at a time, per organization. Additional requests are queued. |
| `ITERABLE_SUBSCRIBE_TO_LIST` | Subscribe to List | Subscribe one or more users to a specific list in Iterable. Use this action when you need to add subscribers to a list by their email address, userId, or both. The action can create new user profiles if they don't exist (unless updateExistingUsersOnly is set to true). This is an idempotent operation - re-subscribing a user who is already on the list has no additional effect. Learn about identifying users by userId and email. |
| `ITERABLE_SUBSCRIBE_USER_BY_ID` | Subscribe User By ID | Subscribes a user to the specified subscription group by their userId. Use when you need to add a user to a specific email list, message type, or message channel subscription. Contact your customer success manager to enable this API before using this action. |
| `ITERABLE_TRACK_EMBEDDED_CLICK` | Track Embedded Click | Tracks a click event on an embedded message. Use this action when you need to record user interactions with buttons or links in embedded messages. This creates an embeddedClick event in Iterable for analytics and campaign tracking purposes. For test messages (proofs), no events are created. Note: You must provide either an email or userId to identify the user profile, but not both. |
| `ITERABLE_TRACK_EMBEDDED_RECEIVED` | Track Embedded Received | Track that an embedded message was received on a device. Use this action when you need to record that a device has retrieved an embedded message from Iterable's API. Call this endpoint once per embedded message retrieved. Note that this only indicates the message was retrieved—it does not mean the message has been displayed to the user. Iterable's SDKs automatically call this endpoint, but if you're not using an SDK, call this manually. Provide either email or userId (but not both) to identify the user profile. |
| `ITERABLE_TRACK_EMBEDDED_SESSION` | Track Embedded Session | Tracks an embedded message session and related impressions in Iterable. Use this action when you need to report user engagement with embedded messages, including tracking when sessions start and end, and recording impressions for each message that was displayed during the session. This helps Iterable understand user behavior and optimize embedded message campaigns. An embeddedSession event represents a period of time when a user is viewing a page or screen where embedded messages can be displayed. An embeddedImpression event represents how many times a message was visible and for how long. |
| `ITERABLE_TRACK_EVENT` | Track Event | Track an event in Iterable. Use when you need to record a user action, system event, or custom analytics event. This action sends event data to Iterable for processing. Events are created asynchronously and processed separately from bulk endpoint. To ensure events are tracked in order, send them all to the same endpoint (bulk or non-bulk). There is a soft limit (default 8,000) on unique fields a custom event can have. Provide either email or userId (but not both) depending on how your project identifies users. For events of the same name, identically named data fields must be of the same type. Rate limit: 100 requests/second per project. |
| `ITERABLE_TRACK_EVENTS_BULK` | Track Events in Bulk | Track multiple events in bulk in Iterable. Use this action when you need to track multiple events at once for better performance and to ensure events are processed in the correct order (since bulk events are processed asynchronously together). Each event requires an eventName and should include either an email or userId to identify the user. Note: There is a soft limit of 8,000 unique fields a custom event can have. For events with the same name, identically named data fields must be of the same type. |
| `ITERABLE_TRACK_PURCHASE` | Track Purchase | Track a purchase event in Iterable. Use when you need to record a purchase transaction. This action tracks purchase events, clearing the shoppingCartItems field on the user profile. The user profile is updated if it already exists, or created otherwise. Note that there is a soft limit of 1,000 unique fields per user, and field types must remain consistent across all requests in the project. The total amount must match the sum of items (price × quantity), though this is not enforced by the API. If an optional purchase ID is provided and a purchase with that ID already exists, the purchase will be updated instead of creating a new one. |
| `ITERABLE_TRIGGER_CAMPAIGN` | Trigger Campaign | Trigger a campaign to send to one or more lists of recipients. Use when you need to initiate a marketing campaign immediately, sending to all users in the specified lists. The campaign must be in a ready state before triggering. This action is useful for time-sensitive announcements or promotional campaigns that need to go out immediately. Note: This action cannot be undone once the campaign begins sending. If you need to stop a campaign after triggering, use the 'Cancel campaign' action. |
| `ITERABLE_TRIGGER_JOURNEY` | Trigger Journey | Trigger a journey (workflow) in Iterable for a specific user or list. Use this action when you need to start a journey for an individual user (by email or userId) or for all users in a list. Triggering with a list is asynchronous - if a list trigger is already in progress, it must complete before the same list can be triggered again for the same journey. Journey statistics may take several minutes to update if other journeys are running in parallel. If the journey's start tile has a suppression list configured, users on that list will be excluded from the journey. Provide either email or userId (but not both) when triggering for individual users. Note: This action is idempotent for individual user triggers - triggering the same user for the same journey multiple times will not cause duplicate entries if the journey's entry settings prevent re-entry. |
| `ITERABLE_UNFORGET_USER` | Unforget User | Unforgets a previously forgotten user in Iterable, resuming data collection. This action allows you to resume collecting data about a user who was previously forgotten (deleted) from your Iterable project. The previously deleted data cannot be recovered, but new data will be collected going forward. Use this action when you need to re-enable tracking for a user after they have requested to be re-included in data collection (e.g., after a GDPR revocation request). In email-based projects, you must unforget users by email. In userID-based projects, you must unforget users by userId. In hybrid projects and projects migrated from email-based to userID-based, you can unforget users by either email or userId. Important: Deleted/forgotten data cannot be recovered, only new data collection resumes. |
| `ITERABLE_UNSUBSCRIBE_FROM_LIST` | Unsubscribe from list | Remove users from a list. Use this action when you need to unsubscribe one or more users from a specific email list in Iterable. This action permanently removes subscribers from the specified list and cannot be easily reversed. Users will need to be manually re-subscribed if they need access to the list again. Note: Users can be identified by email, userId, or both. At least one identifier must be provided for each subscriber. |
| `ITERABLE_UNSUBSCRIBE_USER_BY_ID` | Unsubscribe User By ID | Unsubscribes a user from the specified subscription group by their userId. Use when you need to remove a user from a specific email list, message type, or message channel subscription. Contact your customer success manager to enable this API before using this action. Note: This action is irreversible — once a user is unsubscribed, they will not receive messages from that subscription group unless they re-subscribe. |
| `ITERABLE_UPDATE_CART` | Update Shopping Cart | Update a user's shopping cart items in Iterable. Use when you need to update the shoppingCartItems field on a user profile with items from the user's shopping cart. The user profile is updated if it already exists or created otherwise via the user field. Types of data fields must match the types sent in previous requests, across all data fields in the project. Learn about identifying users by userId and email. This action is idempotent - calling it multiple times with the same items will simply update the shoppingCartItems field on the user profile. |
| `ITERABLE_UPDATE_CATALOG_FIELD_MAPPINGS` | Update Catalog Field Mappings | Set a catalog's field mappings (data types) in Iterable. Use this action when you need to define the data type for fields in a catalog. After being set, a given field's data type may not be changed. Valid types: boolean, date, geo_location, long, double, object, and string. Note: This action is idempotent - applying the same field mappings multiple times will have the same effect. Field types cannot be changed once set. |
| `ITERABLE_UPDATE_CATALOG_ITEM` | Update Catalog Item | Asynchronously creates or updates the specified catalog item in the given catalog. Use when you need to create a new catalog item or update an existing one. If the item already exists, its fields will be updated with the values provided. Previously existing fields not included in the request body will remain unchanged. The operation is asynchronous — use GET /api/catalogs/{catalogName}/items/{itemId} to verify completion. Note: A catalog item's ID must be unique, contain only alphanumeric characters and dashes, and have a maximum length of 255 characters. Do not use periods in field names. |
| `ITERABLE_UPDATE_EMAIL_TEMPLATE` | Update email template | Update an existing email template in Iterable. Use this action when you need to modify an existing email template's content, settings, sender information, or metadata. Only the fields included in the request will be updated; previously existing fields not included will retain their current values. The templateId is required to identify which template to update. This is an idempotent operation - calling it multiple times with the same parameters will result in the same state. |
| `ITERABLE_UPDATE_EMBEDDED_TEMPLATE` | Update Embedded Template | Updates an embedded message template with the specified fields. Use this action when you need to modify an existing embedded message template in Iterable. Only the fields included in the request body will be updated; previously existing fields not specified will remain unchanged. This is an idempotent operation — calling it multiple times with the same parameters will produce the same result. |
| `ITERABLE_UPDATE_IN_APP_TEMPLATE` | Update in-app template | Update an existing in-app template in Iterable. Use this action when you need to modify an existing in-app template. Only the fields specified in the request will be updated; fields not included will retain their existing values. The templateId is required to identify the template to update. This action performs a partial update. Note: This action is idempotent and will only update the fields provided. Fields not included in the request will retain their existing values. |
| `ITERABLE_UPDATE_PUSH_TEMPLATE` | Update push template | Updates an existing push template in Iterable. Use this action when you need to modify an existing push template's content, settings, or configuration. Only the fields specified in the request body will be updated; previously existing fields not included in the request will remain unchanged. Note: This action is idempotent — calling it multiple times with the same request will have the same effect as calling it once. |
| `ITERABLE_UPDATE_SMS_TEMPLATE` | Update SMS template | Update an existing SMS template in Iterable. Use this action when you need to modify the content or settings of an existing SMS template. Only the fields specified in the request will be updated; fields not included will retain their existing values. You must provide the templateId to identify which template to update. Note: This action modifies an existing template. The changes are irreversible and will affect all campaigns using this template. |
| `ITERABLE_UPDATE_SNIPPET` | Update snippet by ID or name | Updates an existing snippet by ID (numeric) or creates/updates a snippet by name (string). For numeric identifiers: only existing snippets can be updated (returns 404 if not found). For string identifiers (snippet names): creates the snippet if it doesn't exist, or updates it if it already exists. Use this action when you need to modify snippet content, description, or variables for an existing snippet, or create a new snippet by name. |
| `ITERABLE_UPDATE_USER` | Update User | Update user data or add a user if none exists in Iterable. Use when you need to create or update user profile information. This action merges data — missing fields are not deleted. Provide either email or userId (but not both) depending on how your project identifies users. There is a soft limit (default: 1,000) on the number of unique fields users can have. Types of data fields must match the types sent in previous requests, across all data fields in the project. Processing time varies based on the current load for Iterable's back-end services. To avoid race conditions, provide a buffer of at least 60 seconds between this request and subsequent dependent requests. Rate limit: 100 requests/second per project. |
| `ITERABLE_UPDATE_USER_EMAIL` | Update User Email | Updates a user's email address in Iterable. Use when you need to change a user's email in email-based projects. Use this action when you need to update a user's email address and migrate all profile data and events to the new email. To update an email in a userID-based or hybrid project, use POST /api/users/update instead. Specify either currentEmail or currentUserId in the request body, but not both — if both are provided, currentEmail takes precedence. This action is irreversible and will migrate all historical data to the new email address. |
| `ITERABLE_UPDATE_USER_SUBSCRIPTIONS` | Update User Subscriptions | Updates user subscription preferences in Iterable. Use when you need to modify a user's subscription status for email lists, message types, and channels. IMPORTANT: This endpoint overwrites (does not merge) existing data for any non-null fields specified in the request. For example, if unsubscribedChannelIds is included in the request, it will replace the user's existing channel subscriptions entirely. Provide either email or userId (but not both), depending on how your project identifies users. Learn about identifying users by userId and email. This action is idempotent - calling it multiple times with the same parameters will result in the same subscription state. |
| `ITERABLE_UPDATE_USER_SUBSCRIPTIONS_BULK` | Bulk Update User Subscriptions | Bulk update subscription preferences for multiple users in Iterable. Use this action when you need to update email list subscriptions, message type subscriptions, or channel subscriptions for multiple users in a single API call. This is useful for bulk list management, compliance updates, or campaign-related subscription changes. IMPORTANT: This endpoint overwrites (does not merge) existing data for any non-null fields specified in the request. Provide email or userId for each user to identify them. This action modifies user communication preferences immediately. Learn about identifying users by userId and email. |
| `ITERABLE_UPDATE_WEBHOOK` | Update Webhook | Update an existing webhook configuration in Iterable. Use this action when you need to modify webhook settings such as endpoint URL, authentication type, enabled status, or campaign type subscriptions. Only the fields included in the request body will be updated; other fields remain unchanged. The webhook ID (id) is required to identify which webhook to update. |
| `ITERABLE_UPSERT_EMAIL_TEMPLATE` | Upsert email template | Create or update an email template in Iterable. Use this action when you need to create a new email template or update an existing one that matches the provided clientTemplateId. This endpoint performs an upsert operation: if no template exists with the given clientTemplateId, a new template is created; if one or more templates exist with the same clientTemplateId, all matching templates are updated with the provided fields. Note that only the fields specified in the request will be updated. Fields not included in the request will retain their existing values (for updates) or use default values (for new templates). |
| `ITERABLE_UPSERT_EMBEDDED_TEMPLATE` | Upsert Embedded Template | Creates an embedded message template if it doesn't exist, or updates all embedded message templates that match the provided clientTemplateId. Use this action when you need to create or update embedded message templates in Iterable. If multiple templates exist with the same clientTemplateId, all will be updated with the provided data. This is useful for managing template versions or ensuring a template exists before sending campaigns. |
| `ITERABLE_UPSERT_IN_APP_TEMPLATE` | Upsert in-app template | Create or update an in-app template in Iterable. Use this action when you need to create a new in-app template or update an existing one that matches the provided clientTemplateId. This endpoint performs an upsert operation: if no template exists with the given clientTemplateId, a new template is created; if one or more templates exist with the same clientTemplateId, all matching templates are updated with the provided fields. Note that only the fields specified in the request will be updated. Fields not included in the request will retain their existing values (for updates) or use default values (for new templates). |
| `ITERABLE_UPSERT_PUSH_TEMPLATE` | Upsert push template | Create or update a push template in Iterable. Use this action when you need to create a new push template or update an existing one that matches the provided clientTemplateId. This endpoint performs an upsert operation: if no template exists with the given clientTemplateId, a new template is created; if one or more templates exist with the same clientTemplateId, all matching templates are updated with the provided fields. Note that only the fields specified in the request will be updated. Fields not included in the request will retain their existing values (for updates) or use default values (for new templates). This action is idempotent - calling it multiple times with the same clientTemplateId will always result in the same state. |
| `ITERABLE_UPSERT_SMS_TEMPLATE` | Upsert SMS template | Create or update an SMS template in Iterable. Use this action when you need to create a new SMS template or update an existing one that matches the provided clientTemplateId. This endpoint performs an upsert operation: if no template exists with the given clientTemplateId, a new template is created; if one or more templates exist with the same clientTemplateId, all matching templates are updated with the provided fields. Note that only the fields specified in the request will be updated. Fields not included in the request will retain their existing values (for updates) or use default values (for new templates). |
| `ITERABLE_VERIFY_SMS_CODE` | Verify SMS Code | Verifies an SMS verification code sent to a phone number in Iterable. Use this action when you need to check whether a user has entered the correct verification code during phone number verification. The code must match the most recent, non-expired, not-yet-verified code sent to the specified phone number. If the code is correct, the verification is successful. If the code is incorrect or expired, the verification fails. This action is idempotent - verifying the same code multiple times returns the same result. |

## Supported Triggers

None listed.

## Installation and MCP Setup

### Path 1: SDK Installation

#### Path 1, Step 1: Install Composio

Install the Composio SDK
```python
pip install composio_openai
```

```typescript
npm install @composio/openai
```

#### Path 1, Step 2: Initialize Composio and Create Tool Router Session

Import and initialize Composio client, then create a Tool Router session
```python
from openai import OpenAI
from composio import Composio
from composio_openai import OpenAIResponsesProvider

composio = Composio(provider=OpenAIResponsesProvider())
openai = OpenAI()
session = composio.create(user_id='your-user-id')
```

```typescript
import OpenAI from 'openai';
import { Composio } from '@composio/core';
import { OpenAIResponsesProvider } from '@composio/openai';

const composio = new Composio({
  provider: new OpenAIResponsesProvider(),
});
const openai = new OpenAI({});
const session = await composio.create('your-user-id');
```

#### Path 1, Step 3: Execute Iterable Tools via Tool Router with Your Agent

Get tools from Tool Router session and execute Iterable actions with your Agent
```python
tools = session.tools
response = openai.responses.create(
  model='gpt-4.1',
  tools=tools,
  input=[{
    'role': 'user',
    'content': 'List Iterable campaigns and summarize their current performance'
  }]
)
result = composio.provider.handle_tool_calls(
  response=response,
  user_id='your-user-id'
)
print(result)
```

```typescript
const tools = session.tools;
const response = await openai.responses.create({
  model: 'gpt-4.1',
  tools: tools,
  input: [{
    role: 'user',
    content: 'List Iterable campaigns and summarize their current performance'
  }],
});
const result = await composio.provider.handleToolCalls(
  'your-user-id',
  response.output
);
console.log(result);
```

### Path 2: MCP Server Setup

#### Path 2, Step 1: Install Composio

Install the Composio SDK for Python or TypeScript
```python
pip install composio claude-agent-sdk
```

```typescript
npm install @composio/core ai @ai-sdk/openai @ai-sdk/mcp
```

#### Path 2, Step 2: Initialize Client and Create Tool Router Session

Import and initialize the Composio client, then create a Tool Router session for Iterable
```python
from composio import Composio
from claude_agent_sdk import ClaudeSDKClient, ClaudeAgentOptions

composio = Composio(api_key='your-composio-api-key')
session = composio.create(user_id='your-user-id')
url = session.mcp.url
```

```typescript
import { Composio } from '@composio/core';

const composio = new Composio({ apiKey: 'your-api-key' });
const session = await composio.create('your-user-id');
console.log(`Tool Router session created: ${session.mcp.url}`);
```

#### Path 2, Step 3: Connect to AI Agent

Use the MCP server with your AI agent (Anthropic Claude or Mastra)
```python
import asyncio

options = ClaudeAgentOptions(
    permission_mode='bypassPermissions',
    mcp_servers={
        'tool_router': {
            'type': 'http',
            'url': url,
            'headers': {
                'x-api-key': 'your-composio-api-key'
            }
        }
    },
    system_prompt='You are a helpful assistant with access to Iterable tools.',
    max_turns=10
)

async def main():
    async with ClaudeSDKClient(options=options) as client:
        await client.query('Find Iterable users who received the welcome campaign today')
        async for message in client.receive_response():
            if hasattr(message, 'content'):
                for block in message.content:
                    if hasattr(block, 'text'):
                        print(block.text)

asyncio.run(main())
```

```typescript
import { openai } from '@ai-sdk/openai';
import { experimental_createMCPClient as createMCPClient } from '@ai-sdk/mcp';
import { generateText } from 'ai';

const client = await createMCPClient({
  transport: {
    type: 'http',
    url: session.mcp.url,
    headers: {
      'x-api-key': 'your-composio-api-key',
    },
  },
});

const tools = await client.tools();
const { text } = await generateText({
  model: openai('gpt-4o'),
  tools,
  messages: [{
    role: 'user',
    content: 'Find Iterable users who received the welcome campaign today'
  }],
  maxSteps: 5,
});

console.log(`Agent: ${text}`);
```

## Why Use Composio?

### 1. AI Native Iterable Integration

- Supports both Iterable MCP and direct API based integrations
- Structured, LLM-friendly schemas for reliable campaign, user, and event workflows
- Rich coverage for reading, writing, and querying Iterable marketing data

### 2. Managed Auth

- Secure API key handling without hard-coding Iterable credentials in your agent
- Use auth_configs.create() to configure Iterable auth and connected_accounts.link() to connect user accounts
- Central place to manage, scope, and revoke Iterable access across users and environments

### 3. Agent Optimized Design

- Iterable tools are designed so agents can understand campaign, user, and event actions clearly
- Tools are tuned using real error and success rates to improve reliability over time
- Comprehensive execution logs so you always know what ran, when, and on whose behalf

### 4. Enterprise Grade Security

- Fine-grained RBAC so you control which agents and users can access Iterable
- Scoped, least privilege access to Iterable resources like campaigns, users, and events
- Full audit trail of agent actions to support review and compliance

## Use Iterable with any AI Agent Framework

Choose a framework you want to connect Iterable with:

- [Claude Cowork](https://composio.dev/toolkits/iterable/framework/claude-cowork)
- [Codex](https://composio.dev/toolkits/iterable/framework/codex)

## Related Toolkits

- [Reddit](https://composio.dev/toolkits/reddit) - Reddit is a social news platform with thriving user-driven communities (subreddits). It's the go-to place for discussion, content sharing, and viral marketing.
- [Facebook](https://composio.dev/toolkits/facebook) - Facebook is a social media and advertising platform for businesses and creators. It helps you connect, share, and manage content across your public Facebook Pages.
- [Linkedin](https://composio.dev/toolkits/linkedin) - LinkedIn is a professional networking platform for connecting, sharing content, and engaging with business opportunities. It's the go-to place for building your professional brand and unlocking new career connections.
- [Active campaign](https://composio.dev/toolkits/active_campaign) - ActiveCampaign is a marketing automation and CRM platform for managing email campaigns, sales pipelines, and customer segmentation. It helps businesses engage customers and drive growth through smart automation and targeted outreach.
- [ActiveTrail](https://composio.dev/toolkits/active_trail) - ActiveTrail is a user-friendly email marketing and automation platform. It helps you reach subscribers and automate campaigns with ease.
- [Ahrefs](https://composio.dev/toolkits/ahrefs) - Ahrefs is an SEO and marketing platform for site audits, keyword research, and competitor insights. It helps you improve search rankings and drive organic traffic.
- [Amcards](https://composio.dev/toolkits/amcards) - AMCards lets you create and mail personalized greeting cards online. Build stronger customer relationships with easy, automated card campaigns.
- [Beamer](https://composio.dev/toolkits/beamer) - Beamer is a news and changelog platform for in-app announcements and feature updates. It helps companies boost user engagement by sharing news where users are most active.
- [Benchmark email](https://composio.dev/toolkits/benchmark_email) - Benchmark Email is a platform for creating, sending, and tracking email campaigns. It's built to help you engage audiences and analyze results—all in one place.
- [Bigmailer](https://composio.dev/toolkits/bigmailer) - BigMailer is an email marketing platform for managing multiple brands with white-labeling and automation. It helps teams streamline campaigns and simplify integration with Amazon SES.
- [Brandfetch](https://composio.dev/toolkits/brandfetch) - Brandfetch is an API that delivers company logos, colors, and visual branding assets. It helps marketers and developers keep brand visuals consistent everywhere.
- [Brevo](https://composio.dev/toolkits/brevo) - Brevo is an all-in-one email and SMS marketing platform for transactional messaging, automation, and CRM. It helps businesses engage customers and streamline communications through powerful campaign tools.
- [Campayn](https://composio.dev/toolkits/campayn) - Campayn is an email marketing platform for creating, sending, and managing campaigns. It helps businesses engage contacts and grow audiences with easy-to-use tools.
- [Cardly](https://composio.dev/toolkits/cardly) - Cardly is a platform for creating and sending personalized direct mail to customers. It helps businesses break through the digital clutter by getting real engagement via physical mailboxes.
- [ClickSend](https://composio.dev/toolkits/clicksend) - ClickSend is a cloud-based SMS and email marketing platform for businesses. It streamlines communication by enabling quick message delivery and contact management.
- [Constant Contact](https://composio.dev/toolkits/constant_contact) - Constant Contact is an email marketing and automation platform for small businesses. It helps teams build campaigns, manage contacts, and grow customer relationships.
- [Crustdata](https://composio.dev/toolkits/crustdata) - CrustData is an AI-powered data intelligence platform for real-time company and people data. It helps B2B sales teams, AI SDRs, and investors react to live business signals.
- [Curated](https://composio.dev/toolkits/curated) - Curated is a platform for collecting, curating, and publishing newsletters. It streamlines content aggregation and distribution for creators and teams.
- [Customerio](https://composio.dev/toolkits/customerio) - Customer.io is a customer engagement platform for targeted messaging across email, SMS, and push. Easily automate, segment, and track communications with your audience.
- [Cutt ly](https://composio.dev/toolkits/cutt_ly) - Cutt.ly is a URL shortening service for managing and analyzing links. Streamline your workflows with quick, trackable, and branded short URLs.

## Frequently Asked Questions

### Do I need my own developer credentials to use Iterable with Composio?

Yes, Iterable requires you to configure your own API key credentials. Once set up, Composio handles secure credential storage and API request handling for you.

### Can I use multiple toolkits together?

Yes! Composio's Tool Router enables agents to use multiple toolkits. [Learn more](https://docs.composio.dev/tool-router/overview).

### Is Composio secure?

Composio is SOC 2 and ISO 27001 compliant with all data encrypted in transit and at rest. [Learn more](https://trust.composio.dev).

### What if the API changes?

Composio maintains and updates all toolkit integrations automatically, so your agents always work with the latest API versions.

---
[See all toolkits](https://composio.dev/toolkits) · [Composio docs](https://docs.composio.dev/llms.txt)
