---
canonical_url: "https://docs.composio.dev/toolkits/modem"
markdown_url: "https://docs.composio.dev/toolkits/modem.md"
product: "platform"
version: null
last_updated: null
---

# Modem

Modem turns customer conversations into structured topics, people, and company insights for analysis and workflow automation.

- **Category:** analytics
- **Auth:** API_KEY
- **Composio-managed OAuth available?** N/A
- **Tools:** 30
- **Triggers:** 0
- **Slug:** `MODEM`
- **Version:** 00000000_00

## Tools

### Add People to Company

**Slug:** `MODEM_ADD_PEOPLE_TO_COMPANY`

Associate one or more existing people with an existing company. People already associated with the company are reported as skipped. This changes company membership, and the approved API surface has no inverse removal operation.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `company_id` | string | Yes | Decimal Modem company ID that receives the people. |
| `person_ids` | array | Yes | One or more decimal IDs of existing people to associate with the company. |
| `idempotency_key` | string | No | Optional retry key; reuse only for the identical request within 24 hours. |

#### Output

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `data` | string | Yes | Data from the action execution |
| `error` | string | No | Error if any occurred during the execution of the action |
| `successful` | boolean | Yes | Whether or not the action execution was successful or not |

### Create Companies

**Slug:** `MODEM_CREATE_COMPANIES`

Create one to 50 companies in one batch. Each item succeeds or fails independently; use a one-item array to create one company.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `companies` | array | Yes | Companies to create (1-50); use a one-item array for one company. |
| `idempotency_key` | string | No | Optional retry key; reuse only for the identical request within 24 hours. |

#### Output

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `data` | string | Yes | Data from the action execution |
| `error` | string | No | Error if any occurred during the execution of the action |
| `successful` | boolean | Yes | Whether or not the action execution was successful or not |

### Create People

**Slug:** `MODEM_CREATE_PEOPLE`

Create one to 50 people in one batch. Each item succeeds or fails independently; use a one-item array to create one person.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `people` | array | Yes | People to create (1-50); use a one-item array for one person. |
| `idempotency_key` | string | No | Optional retry key; reuse only for the identical request within 24 hours. |

#### Output

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `data` | string | Yes | Data from the action execution |
| `error` | string | No | Error if any occurred during the execution of the action |
| `successful` | boolean | Yes | Whether or not the action execution was successful or not |

### Get Channel

**Slug:** `MODEM_GET_CHANNEL`

Get one channel's source details, connection state, context, timestamps, and message count by UUID.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `channel_id` | string | Yes | Modem channel UUID. |

#### Output

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `data` | string | Yes | Data from the action execution |
| `error` | string | No | Error if any occurred during the execution of the action |
| `successful` | boolean | Yes | Whether or not the action execution was successful or not |

### Get Company

**Slug:** `MODEM_GET_COMPANY`

Get one company's core details, connection values, domain, logo, and VIP status by decimal ID.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `company_id` | string | Yes | Decimal Modem company ID. |

#### Output

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `data` | string | Yes | Data from the action execution |
| `error` | string | No | Error if any occurred during the execution of the action |
| `successful` | boolean | Yes | Whether or not the action execution was successful or not |

### Get Company Activity

**Slug:** `MODEM_GET_COMPANY_ACTIVITY`

Get one company's message count, weekly activity series, and source-level message breakdown.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `company_id` | string | Yes | Decimal Modem company ID. |

#### Output

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `data` | string | Yes | Data from the action execution |
| `error` | string | No | Error if any occurred during the execution of the action |
| `successful` | boolean | Yes | Whether or not the action execution was successful or not |

### Get Company History

**Slug:** `MODEM_GET_COMPANY_HISTORY`

Get up to 50 company audit records plus merge history. The API reports the total audit count but exposes no cursor or page parameter, so this tool cannot retrieve records beyond the requested limit.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `limit` | integer | No | Maximum audit records returned (1-50). The API provides no cursor or page parameter, so records beyond this limit cannot be retrieved. |
| `changed_by` | array | No | Actor types to include; omit for the provider default of user and agent changes, which excludes system changes. |
| `company_id` | string | Yes | Decimal Modem company ID. |

#### Output

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `data` | string | Yes | Data from the action execution |
| `error` | string | No | Error if any occurred during the execution of the action |
| `successful` | boolean | Yes | Whether or not the action execution was successful or not |

### Get Company Identities

**Slug:** `MODEM_GET_COMPANY_IDENTITIES`

Get external platform identities linked to one company by Modem's identify operation.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `company_id` | string | Yes | Decimal Modem company ID. |

#### Output

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `data` | string | Yes | Data from the action execution |
| `error` | string | No | Error if any occurred during the execution of the action |
| `successful` | boolean | Yes | Whether or not the action execution was successful or not |

### Get Current Organization

**Slug:** `MODEM_GET_CURRENT_ORGANIZATION`

Return the organization selected by the connected API key. Use this as an authentication smoke test and to confirm the active tenant; it returns no member, credential, or plan details.

#### Output

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `data` | string | Yes | Data from the action execution |
| `error` | string | No | Error if any occurred during the execution of the action |
| `successful` | boolean | Yes | Whether or not the action execution was successful or not |

### Get Person

**Slug:** `MODEM_GET_PERSON`

Get one person's complete profile, including company, connections, tags, sources, timestamps, identities, and message activity aggregates.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `person_id` | string | Yes | Decimal Modem person ID. |

#### Output

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `data` | string | Yes | Data from the action execution |
| `error` | string | No | Error if any occurred during the execution of the action |
| `successful` | boolean | Yes | Whether or not the action execution was successful or not |

### Get Person History

**Slug:** `MODEM_GET_PERSON_HISTORY`

Get up to 50 person audit records plus merge history. The API reports the total audit count but exposes no cursor or page parameter, so this tool cannot retrieve records beyond the requested limit.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `limit` | integer | No | Maximum audit records returned (1-50). The API provides no cursor or page parameter, so records beyond this limit cannot be retrieved. |
| `person_id` | string | Yes | Decimal Modem person ID. |
| `changed_by` | array | No | Actor types to include; omit for the provider default of user and agent changes, which excludes system changes. |

#### Output

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `data` | string | Yes | Data from the action execution |
| `error` | string | No | Error if any occurred during the execution of the action |
| `successful` | boolean | Yes | Whether or not the action execution was successful or not |

### Get Person Identities

**Slug:** `MODEM_GET_PERSON_IDENTITIES`

Get all external platform identities linked to one person.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `person_id` | string | Yes | Decimal Modem person ID. |

#### Output

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `data` | string | Yes | Data from the action execution |
| `error` | string | No | Error if any occurred during the execution of the action |
| `successful` | boolean | Yes | Whether or not the action execution was successful or not |

### Get Person Source Stats

**Slug:** `MODEM_GET_PERSON_SOURCE_STATS`

Get one person's message counts broken down by source platform.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `person_id` | string | Yes | Decimal Modem person ID. |

#### Output

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `data` | string | Yes | Data from the action execution |
| `error` | string | No | Error if any occurred during the execution of the action |
| `successful` | boolean | Yes | Whether or not the action execution was successful or not |

### Get Topic

**Slug:** `MODEM_GET_TOPIC`

Get one topic's complete details, including its summary, classification, lifecycle, priority, keywords, time range, archive state, and event count.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `topic_id` | string | Yes | Modem topic UUID. |

#### Output

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `data` | string | Yes | Data from the action execution |
| `error` | string | No | Error if any occurred during the execution of the action |
| `successful` | boolean | Yes | Whether or not the action execution was successful or not |

### Get Topic Groups

**Slug:** `MODEM_GET_TOPIC_GROUPS`

Get every message group assigned to one topic in ascending or descending group-time order. Modem does not paginate or limit this endpoint, so topics with many deeply nested messages can return a large response.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `order` | string ("asc" | "desc") | No | Ascending or descending group-time order. |
| `topic_id` | string | Yes | Modem topic UUID. |

#### Output

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `data` | string | Yes | Data from the action execution |
| `error` | string | No | Error if any occurred during the execution of the action |
| `successful` | boolean | Yes | Whether or not the action execution was successful or not |

### Get Topic History

**Slug:** `MODEM_GET_TOPIC_HISTORY`

Get up to 50 topic audit records plus action and merge history. The API reports the total audit count but exposes no cursor or page parameter, so this tool cannot retrieve audit records beyond the requested limit.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `limit` | integer | No | Maximum audit records returned (1-50). The API provides no cursor or page parameter, so records beyond this limit cannot be retrieved. |
| `topic_id` | string | Yes | Modem topic UUID. |
| `changed_by` | array | No | Actor types to include; omit for the provider default of user and agent changes, which excludes system changes. |

#### Output

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `data` | string | Yes | Data from the action execution |
| `error` | string | No | Error if any occurred during the execution of the action |
| `successful` | boolean | Yes | Whether or not the action execution was successful or not |

### Get Topic People

**Slug:** `MODEM_GET_TOPIC_PEOPLE`

Get every unique person who participated in one topic, including source identities, company, profile, VIP state, and contribution count.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `topic_id` | string | Yes | Modem topic UUID. |

#### Output

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `data` | string | Yes | Data from the action execution |
| `error` | string | No | Error if any occurred during the execution of the action |
| `successful` | boolean | Yes | Whether or not the action execution was successful or not |

### Identify External Records

**Slug:** `MODEM_IDENTIFY_EXTERNAL_RECORDS`

Upsert links from external platform records to Modem people and companies in batches of 50. Modem matches platform identities before natural keys, can create records only from the documented creation fields, links resolved memberships, and reports probable duplicate conflicts without merging them.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `idempotency_key` | string | No | Optional retry key; reuse only for the identical request within 24 hours. |
| `identifications` | array | Yes | External records to resolve and link (1-50). Each item may contain person facts, company facts, or both. |

#### Output

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `data` | string | Yes | Data from the action execution |
| `error` | string | No | Error if any occurred during the execution of the action |
| `successful` | boolean | Yes | Whether or not the action execution was successful or not |

### List Channels

**Slug:** `MODEM_LIST_CHANNELS`

List organization channels with connection state and message counts, optionally filtered by source, name, or channel IDs.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `limit` | integer | No | Maximum channels in this page (1-100). |
| `cursor` | string | No | Opaque continuation cursor returned by a previous call; omit for the first page. |
| `search` | string | No | Non-empty channel-name search text. |
| `channel_ids` | array | No | UUID channel IDs to return; omit when not filtering by ID. |
| `source_name` | string | No | Source slug to match, such as slack or discord; omit for every source. |
| `connected_only` | boolean | No | When true, exclude channels whose backing integration is no longer connected; currently affects GitHub repository channels only. |

#### Output

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `data` | string | Yes | Data from the action execution |
| `error` | string | No | Error if any occurred during the execution of the action |
| `successful` | boolean | Yes | Whether or not the action execution was successful or not |

### List Companies

**Slug:** `MODEM_LIST_COMPANIES`

List companies with person and message aggregates, optionally searching and sorting the result. Returns one page and an opaque continuation cursor.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `limit` | integer | No | Maximum companies in this page (1-100). |
| `cursor` | string | No | Opaque continuation cursor returned by a previous call; omit for the first page. |
| `search` | string | No | Non-empty company search text. |
| `sort_by` | string ("lastSeen" | "messageCount" | "personCount") | No | Company field used to sort results. |
| `sort_order` | string ("asc" | "desc") | No | Ascending or descending result order. |

#### Output

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `data` | string | Yes | Data from the action execution |
| `error` | string | No | Error if any occurred during the execution of the action |
| `successful` | boolean | Yes | Whether or not the action execution was successful or not |

### List Groups

**Slug:** `MODEM_LIST_GROUPS`

List message groups for exactly one company or one person, returning compact message content and topic context one page at a time.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `limit` | integer | No | Maximum groups in this page (1-50); use a conservative value because each group includes messages. |
| `cursor` | string | No | Opaque continuation cursor returned by a previous call; omit for the first page. |
| `person_id` | string | No | Decimal person ID whose groups to list; provide this or company_id, never both. |
| `company_id` | string | No | Decimal company ID whose groups to list; provide this or person_id, never both. |

#### Output

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `data` | string | Yes | Data from the action execution |
| `error` | string | No | Error if any occurred during the execution of the action |
| `successful` | boolean | Yes | Whether or not the action execution was successful or not |

### List People

**Slug:** `MODEM_LIST_PEOPLE`

List people with aggregated message statistics, optionally filtering by search text, ecosystem tags, or company and sorting the result. Returns one page and an opaque continuation cursor.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `limit` | integer | No | Maximum people in this page (1-100). |
| `cursor` | string | No | Opaque continuation cursor returned by a previous call; omit for the first page. |
| `search` | string | No | Non-empty person search text. |
| `sort_by` | string ("lastSeen" | "messageCount") | No | Person field used to sort results. |
| `company_id` | string | No | Decimal company ID whose current people to return. |
| `sort_order` | string ("asc" | "desc") | No | Ascending or descending result order. |
| `ecosystem_tags` | array | No | Ecosystem tags to OR-match. |

#### Output

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `data` | string | Yes | Data from the action execution |
| `error` | string | No | Error if any occurred during the execution of the action |
| `successful` | boolean | Yes | Whether or not the action execution was successful or not |

### List and Search Topics

**Slug:** `MODEM_LIST_TOPICS`

List or search topics by keywords or semantic meaning with organization, participant, source, status, date, and classification filters, one page at a time. Semantic search takes precedence when both search modes are supplied.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `view` | string ("v1" | "v2") | No | Requested topic pipeline. v2 is honored only when enabled for the organization; otherwise Modem may serve v1. |
| `limit` | integer | No | Maximum topics in this page (1-100). |
| `cursor` | string | No | Opaque continuation cursor returned by a previous call; omit for the first page. |
| `search` | string | No | Keyword title search. Ignored when embedding_search is provided; wrap a token in double quotes for exact matching. |
| `sort_by` | string ("date" | "groups" | "lifecycle" | "priority" | "similarity") | No | Topic ordering field; similarity is most useful with semantic search. |
| `sources` | array | No | Message sources to include with case-insensitive OR matching. |
| `date_end` | string | No | ISO 8601 end of the topic-overlap range; provide with date_start. |
| `categories` | array | No | Categories to include with case-insensitive OR matching. |
| `date_start` | string | No | ISO 8601 start of the topic-overlap range; provide with date_end. |
| `person_ids` | array | No | Person IDs to include with OR matching. |
| `priorities` | array | No | Priority levels to include. |
| `sort_order` | string ("asc" | "desc") | No | Ascending or descending result order. |
| `company_ids` | array | No | Company IDs to include with OR matching. |
| `issue_types` | array | No | Issue classifications to include. |
| `product_ids` | array | No | Product UUIDs to include; use the literal none to also match topics without product attribution. |
| `team_response` | array | No | Team response states to include. |
| `min_similarity` | number | No | Minimum cosine similarity for semantic search (0-1). |
| `exclude_sources` | array | No | Message sources topics must not contain, using OR exclusion. |
| `ticket_statuses` | array | No | Linked-ticket presence states to include. |
| `embedding_search` | string | No | Semantic query that searches by meaning and takes precedence over search. |
| `lifecycle_states` | array | No | Lifecycle states to include; unknown also matches topics without an assessment. |
| `exclude_categories` | array | No | Categories topics must not have, using case-insensitive OR exclusion. |
| `exclude_person_ids` | array | No | Person IDs to exclude with OR exclusion. |
| `exclude_priorities` | array | No | Priority levels to exclude. |
| `exclude_company_ids` | array | No | Company IDs to exclude with OR exclusion. |
| `exclude_issue_types` | array | No | Issue classifications to exclude. |
| `exclude_product_ids` | array | No | Product UUIDs to exclude; use the literal none to exclude unattributed topics. |
| `exclude_ticket_statuses` | array | No | Linked-ticket presence states to exclude. |

#### Output

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `data` | string | Yes | Data from the action execution |
| `error` | string | No | Error if any occurred during the execution of the action |
| `successful` | boolean | Yes | Whether or not the action execution was successful or not |

### Merge Companies Irreversibly

**Slug:** `MODEM_MERGE_COMPANIES`

Irreversibly merge one or more source companies into one surviving target. All domains, person associations, and Slack workspaces move to the target, and source records cannot be restored by this API. Requires explicit confirm_irreversible=true. Supply an Idempotency-Key when retrying the same merge to avoid applying it twice.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `idempotency_key` | string | No | Optional Idempotency-Key for safe retries. Reuse it only for the identical merge request within 24 hours; changing the payload with the same key causes a conflict. |
| `target_company_id` | string | Yes | Decimal company ID that survives and receives all source data. |
| `source_company_ids` | array | Yes | One to 50 unique decimal company IDs that will be absorbed and cease to remain independent; must exclude target_company_id. |
| `confirm_irreversible` | boolean | Yes | Must be true to acknowledge that the merge is irreversible and source companies cannot be restored. This confirmation is validated locally and is not sent to Modem. |

#### Output

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `data` | string | Yes | Data from the action execution |
| `error` | string | No | Error if any occurred during the execution of the action |
| `successful` | boolean | Yes | Whether or not the action execution was successful or not |

### Merge People Irreversibly

**Slug:** `MODEM_MERGE_PEOPLE`

Irreversibly merge one or more source people into one surviving target. All identities, emails, and company associations move to the target, and source records cannot be restored by this API. Requires explicit confirm_irreversible=true. Supply an Idempotency-Key when retrying the same merge to avoid applying it twice.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `idempotency_key` | string | No | Optional Idempotency-Key for safe retries. Reuse it only for the identical merge request within 24 hours; changing the payload with the same key causes a conflict. |
| `target_person_id` | string | Yes | Decimal person ID that survives and receives all source data. |
| `source_person_ids` | array | Yes | One to 50 unique decimal person IDs that will be absorbed and cease to remain independent; must exclude target_person_id. |
| `confirm_irreversible` | boolean | Yes | Must be true to acknowledge that the merge is irreversible and source people cannot be restored. This confirmation is validated locally and is not sent to Modem. |

#### Output

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `data` | string | Yes | Data from the action execution |
| `error` | string | No | Error if any occurred during the execution of the action |
| `successful` | boolean | Yes | Whether or not the action execution was successful or not |

### Merge Topics Irreversibly

**Slug:** `MODEM_MERGE_TOPICS`

Irreversibly merge 1 to 50 source topics into one surviving target. Modem archives and marks every source as merged, then copies their group and event associations to the target; this API cannot undo the merge. Requires explicit confirm_irreversible=true. Supply an Idempotency-Key when retrying an identical merge to avoid applying it twice.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `idempotency_key` | string | No | Optional Idempotency-Key for safe retries. Reuse it only for the identical merge request within 24 hours; changing the payload with the same key causes a conflict. |
| `target_topic_id` | string | Yes | Topic UUID that remains active and receives copies of the source topics' group and event associations. |
| `source_topic_ids` | array | Yes | Topic UUIDs to archive and merge into the target (1-50). Each source topic is marked merged, ceases to remain an active independent topic, and must not equal target_topic_id. Already archived sources are rejected. |
| `confirm_irreversible` | boolean | Yes | Must be true to acknowledge that every source topic will be archived and marked merged, and that this operation cannot be undone through the Modem API. This confirmation is validated locally and is not sent to Modem. |

#### Output

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `data` | string | Yes | Data from the action execution |
| `error` | string | No | Error if any occurred during the execution of the action |
| `successful` | boolean | Yes | Whether or not the action execution was successful or not |

### Update Companies

**Slug:** `MODEM_UPDATE_COMPANIES`

Update one to 50 companies in one batch. Omitted fields remain unchanged, explicit null values clear nullable fields, and each item reports success independently.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `companies` | array | Yes | Company updates (1-50). Use a one-item array for one company. |
| `idempotency_key` | string | No | Optional retry key; reuse only for the identical request within 24 hours. |

#### Output

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `data` | string | Yes | Data from the action execution |
| `error` | string | No | Error if any occurred during the execution of the action |
| `successful` | boolean | Yes | Whether or not the action execution was successful or not |

### Update People

**Slug:** `MODEM_UPDATE_PEOPLE`

Update one to 50 people in one batch. Omitted fields remain unchanged, explicit null values clear nullable fields, and each item reports success independently.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `people` | array | Yes | Person updates (1-50). Use a one-item array for one person. |
| `idempotency_key` | string | No | Optional retry key; reuse only for the identical request within 24 hours. |

#### Output

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `data` | string | Yes | Data from the action execution |
| `error` | string | No | Error if any occurred during the execution of the action |
| `successful` | boolean | Yes | Whether or not the action execution was successful or not |

### Update Topic

**Slug:** `MODEM_UPDATE_TOPIC`

Update one topic's priority, lifecycle, issue type, complete keyword list, or archive state. Omitted fields remain unchanged; issue_type=null clears the classification.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `archived` | boolean | No | True archives the topic; false unarchives it; omit to leave it unchanged. |
| `keywords` | array | No | Complete replacement keyword/category list (up to 20). An empty list clears all keywords; omit the field to leave them unchanged. |
| `priority` | string ("very_low" | "low" | "default" | "high" | "very_high") | No | New topic priority. Omit to leave it unchanged. |
| `topic_id` | string | Yes | Modem topic UUID. |
| `issue_type` | string ("bug_report" | "complaint" | "discussion" | "feature_request" | "praise") | No | New issue classification, null to clear it, or omit to leave it unchanged. |
| `archived_reason` | string | No | Archive reason, allowed only when archived is explicitly true. |
| `idempotency_key` | string | No | Optional retry key; reuse only for the identical request within 24 hours. |
| `lifecycle_state` | string ("open" | "in_progress" | "completed" | "dismissed") | No | New lifecycle state. Omit to leave it unchanged; unknown is AI-assessed and cannot be set directly. |

#### Output

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `data` | string | Yes | Data from the action execution |
| `error` | string | No | Error if any occurred during the execution of the action |
| `successful` | boolean | Yes | Whether or not the action execution was successful or not |

### Update Topics

**Slug:** `MODEM_UPDATE_TOPICS`

Set priority or archive state for one to 100 topics at once. Provide at least one change, use archived=false to unarchive, and provide an archive reason only with archived=true.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `archived` | boolean | No | True archives every selected topic; false unarchives them. |
| `priority` | string ("very_low" | "low" | "default" | "high" | "very_high") | No | Priority to assign to every selected topic. |
| `topic_ids` | array | Yes | Modem topic UUIDs to update (1-100). |
| `archived_reason` | string | No | Optional archive reason, allowed only when archived is true. |
| `idempotency_key` | string | No | Optional retry key; reuse only for the identical request within 24 hours. |

#### Output

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `data` | string | Yes | Data from the action execution |
| `error` | string | No | Error if any occurred during the execution of the action |
| `successful` | boolean | Yes | Whether or not the action execution was successful or not |
