Skip to content

Content

Search and bulk operations over Knowledge Hub content (Preview)

Run a bulk action on Knowledge Hub content (Preview)

Request

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 and returns 202.

Important — 202 Accepted does not guarantee every item was processed. Two classes of items are silently excluded:

  1. Unsupported content type for the action. Items whose type is not in the action's allowlist (see the action description) are not included in the bulk operation. No per-item error is returned.
  2. Synced content on delete. Articles imported from a synced source (Confluence, Notion, Zendesk, Salesforce Knowledge, etc.) are not deletable through this endpoint — they can only be removed by disconnecting the underlying import source.

For compliance-driven deletions (GDPR right-to-erasure, etc.), do not rely on the 202 Accepted response alone. Verify removal by fetching each item directly (for example, GET /articles/{id} for article content) or disconnect the import source for synced content. A future Preview release will expose a polling job resource with per-item updated, unchanged, skipped, and failed buckets to make these outcomes explicit.

Requires the write_content OAuth scope. Set Intercom-Version: preview.

Security
bearerAuth
Headers
Intercom-Versionstring(intercom_version_preview)

Preview Intercom API version. Used for closed beta endpoints or other features under managed availability.

Default:"preview"
Value:"preview"
Example:preview
Bodyapplication/jsonrequired
actionstringrequired

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"
Example:"publish"
content_idsArray of objects, <= 1000 itemsrequired

Up to 1,000 content items to apply the action to.

availabilityobject

Required when action is set_availability. Each field is optional — only the properties present in the request are toggled.

audienceobject

Required when action is set_audience. Manages segment membership.

tagsobject

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).

curl -i -X POST \
  https://api.intercom.io/content/bulk_actions \
  -H 'Authorization: Bearer <YOUR_TOKEN_HERE>' \
  -H 'Content-Type: application/json' \
  -H 'Intercom-Version: preview' \
  -d '{
    "action": "publish",
    "content_ids": [
      {
        "type": "article_content",
        "id": "12345678"
      },
      {
        "type": "article_content",
        "id": "12345679"
      }
    ]
  }'

Responses

Accepted — work has been enqueued

Bodyapplication/json
typestringrequired
Example:"content_bulk_action"
statusstringrequired
Example:"queued"
Response
{ "type": "content_bulk_action", "status": "queued" }