# Run a bulk action on Knowledge Hub content

Asynchronously run a bulk action over up to 1,000 Knowledge Hub content items.
Six actions are supported:
* `publish` and `unpublish` — apply to `article_content` only.
* `delete` — permanently delete content (excludes synced sources and `external_content`).
* `set_availability` — toggle Fin AI Agent, Copilot, and Sales Agent availability flags.
* `set_audience` — manage segment membership on content.
* `update_tags` — apply and/or remove existing tags on content. Unlike the other
actions, `update_tags` addresses articles by the parent `article` id, not
`article_content`. Tags must already exist and not be archived; supply at least one of
`add_tag_ids` / `remove_tag_ids`.

The endpoint validates the request, enqueues background work, and returns 202 with a
placeholder envelope. Items whose `type` is not in the action's allowlist are silently
dropped before processing. Articles imported from synced sources (Confluence, Notion,
Zendesk, Salesforce Knowledge, etc.) are silently skipped on `delete` — they can only be
removed by disconnecting the underlying import source.
Requires the `write_content` OAuth scope.

Endpoint: POST /content/bulk_actions
Version: 2.16
Security: bearerAuth

## Header parameters:

  - `Intercom-Version` (string)

## Request fields (application/json):

  - `action` (string, required)
    The bulk action to perform. Allowed `content_ids[].type` values vary per action:
* `publish`, `unpublish`: `article_content`
* `delete`: `article_content`, `content_snippet`, `file_source_content`, `internal_article`
* `set_availability`, `set_audience`: `article_content`, `content_snippet`, `external_content`, `file_source_content`, `internal_article`
* `update_tags`: `article` (the parent Article id, not `article_content`), `content_snippet`, `external_content`, `file_source_content`, `internal_article`
    Enum: "publish", "unpublish", "delete", "set_availability", "set_audience", "update_tags"

  - `content_ids` (array, required)
    Up to 1,000 content items to apply the action to.

  - `content_ids.type` (string, required)
    Enum: "article", "article_content", "content_snippet", "external_content", "file_source_content", "internal_article"

  - `content_ids.id` (string, required)
    Example: 12345678

  - `availability` (object)
    Required when `action` is `set_availability`. Each field is optional — only the
properties present in the request are toggled.

  - `availability.ai_agent` (boolean)
    Toggle Fin AI Agent availability.

  - `availability.copilot` (boolean)
    Toggle Copilot availability.

  - `availability.sales_agent` (boolean)
    Toggle Sales Agent availability.

  - `audience` (object)
    Required when `action` is `set_audience`. Manages segment membership.

  - `audience.add_segment_ids` (array)
    Segment IDs to assign to the selected content.
    Example: [100]

  - `audience.remove_segment_ids` (array)
    Segment IDs to remove from the selected content.
    Example: [200]

  - `audience.remove_all` (boolean)
    When `true`, removes all segments from the selected content.
    Example: false

  - `tags` (object)
    Required when `action` is `update_tags`. Applies and/or removes existing tags.
Supply at least one of `add_tag_ids` / `remove_tag_ids`. At most 100 distinct tag IDs
may be supplied across `add_tag_ids` and `remove_tag_ids` combined. Tag IDs must
reference existing, non-archived tags; exceeding the limit or referencing unknown or
archived IDs is rejected with `parameter_invalid` (HTTP 422).

  - `tags.add_tag_ids` (array)
    Tag IDs to apply to the selected content.
    Example: [100]

  - `tags.remove_tag_ids` (array)
    Tag IDs to remove from the selected content.
    Example: [200]

## Response 202 fields (application/json):

  - `type` (string)
    Example: content_bulk_action

  - `status` (string)
    Example: queued

## Response 401 fields (application/json):

  - `type` (string, required)
    The type is error.list
    Example: error.list

  - `request_id` (string)
    Example: f93ecfa8-d08a-4325-8694-89aeb89c8f85

  - `errors` (array, required)
    An array of one or more error objects

  - `errors.code` (string, required)
    A string indicating the kind of error, used to further qualify the HTTP response code
    Example: unauthorized

  - `errors.message` (string)
    Optional. Human readable description of the error.
    Example: Access Token Invalid

  - `errors.field` (string)
    Optional. Used to identify a particular field or query parameter that was in error.
    Example: email

## Response 403 fields (application/json):

  - `type` (string, required)
    The type is error.list
    Example: error.list

  - `request_id` (string)
    Example: f93ecfa8-d08a-4325-8694-89aeb89c8f85

  - `errors` (array, required)
    An array of one or more error objects

  - `errors.code` (string, required)
    A string indicating the kind of error, used to further qualify the HTTP response code
    Example: unauthorized

  - `errors.message` (string)
    Optional. Human readable description of the error.
    Example: Access Token Invalid

  - `errors.field` (string)
    Optional. Used to identify a particular field or query parameter that was in error.
    Example: email

## Response 422 fields (application/json):

  - `type` (string, required)
    The type is error.list
    Example: error.list

  - `request_id` (string)
    Example: f93ecfa8-d08a-4325-8694-89aeb89c8f85

  - `errors` (array, required)
    An array of one or more error objects

  - `errors.code` (string, required)
    A string indicating the kind of error, used to further qualify the HTTP response code
    Example: unauthorized

  - `errors.message` (string)
    Optional. Human readable description of the error.
    Example: Access Token Invalid

  - `errors.field` (string)
    Optional. Used to identify a particular field or query parameter that was in error.
    Example: email

