# Search knowledge base contents

Search the knowledge base contents — articles, snippets, external pages, uploaded files, and internal articles — using a keyword query.
Each result row has a `type` discriminator. Most types (`content_snippet`, `external_content`, `file_source_content`, `internal_article`) return a flat `{ type, id, title }` shape. Help center articles return a nested shape with a `contents[]` array, one entry per locale.
Requires the `read_content` OAuth scope.

Endpoint: GET /content/search
Version: 2.17
Security: bearerAuth

## Query parameters:

  - `query` (string)
    A free-text search term matched against the title and body of each content item. When omitted, returns the most recent content items.

  - `page` (integer)
    The page number to fetch. Defaults to 1. Values below 1 are clamped to 1.

  - `per_page` (integer)
    Number of results per page. Defaults to 10. Maximum 50.

  - `states` (array)
    Filter by publication state. Accepts a comma-separated list or repeated params.

  - `locales` (array)
    Filter by locale codes (e.g. `en`, `fr`, `de`). Accepts a comma-separated list or repeated params.

  - `tag_ids` (array)
    Filter by tag IDs. Pairs with `tag_operator` to control match semantics. Accepts a comma-separated list or repeated params.

  - `tag_operator` (string)
    Match operator paired with `tag_ids`. `IN` returns content matching any of the given tags; `NIN` excludes content matching any of them.

  - `any_tag_ids` (array)
    Filter by tag IDs using OR semantics — returns content matching any of the given tags. Alternative to `tag_ids` + `tag_operator`. Accepts a comma-separated list or repeated params.

  - `folder_ids` (array)
    Filter by folder IDs. Must be sent together with `folder_entity_type`. Accepts a comma-separated list or repeated params.

  - `folder_entity_type` (string)
    Required when `folder_ids` is provided. Identifies the entity type the folder IDs refer to.

  - `content_types` (array)
    Restrict the search to specific content types. When provided, this REPLACES the default content type set rather than filtering on top of it. Accepts a comma-separated list or repeated params.

  - `copilot_state` (string)
    Filter by whether the content is enabled for Copilot.

  - `fin_service_state` (string)
    Filter by whether the content is enabled for Fin AI Agent (customer-facing service).

  - `fin_sales_state` (string)
    Filter by whether the content is enabled for Fin Sales Agent.

  - `created_by_ids` (array)
    Filter by the admin IDs that created the content. Accepts a comma-separated list or repeated params.

  - `last_updated_by_ids` (array)
    Filter by the admin IDs that last updated the content. Accepts a comma-separated list or repeated params.

  - `created_at_after` (integer)
    Return content created at or after this time. Unix epoch seconds.

  - `created_at_before` (integer)
    Return content created at or before this time. Unix epoch seconds.

  - `updated_at_after` (integer)
    Return content last updated at or after this time. Unix epoch seconds.

  - `updated_at_before` (integer)
    Return content last updated at or before this time. Unix epoch seconds.

## Header parameters:

  - `Intercom-Version` (string)

## Response 200 fields (application/json):

  - `type` (string)
    Always `list`.
    Enum: "list"

  - `total_count` (integer)
    Total number of results matching the query.
    Example: 5

  - `pages` (object)
    Pagination metadata, including links to neighbouring pages.

  - `pages.type` (string)
    Enum: "pages"

  - `pages.page` (integer)
    The current page number.
    Example: 1

  - `pages.per_page` (integer)
    Number of results per page.
    Example: 10

  - `pages.total_pages` (integer)
    Total number of pages of results.
    Example: 1

  - `pages.next` (string)
    A link to the next page of results, or null when on the last page.
    Example: https://api.intercom.io/content/search?query=billing&page=2

  - `pages.prev` (string)
    A link to the previous page of results, or null when on the first page.
    Example: null

  - `data` (array)
    The list of matched content items. Each item's `type` field determines its shape.

  - `data.type` (string, required)
    The kind of content item.
    Enum: "content_snippet", "external_content", "file_source_content", "internal_article"

  - `data.id` (string)
    The unique identifier of the content item.
    Example: 123

  - `data.title` (string)
    The display title of the content item.
    Example: Billing FAQ

  - `data.type` (string, required)
    Always `article`.
    Enum: "article"

  - `data.id` (string)
    The unique identifier of the article.
    Example: 345

  - `data.title` (string)
    The article's canonical title.
    Example: Billing FAQ

  - `data.contents` (array)
    One entry per locale of the article.

  - `data.contents.type` (string)
    Always `article_content`.
    Enum: "article_content"

  - `data.contents.id` (string)
    The unique identifier of the article content.
    Example: 678

  - `data.contents.title` (string)
    The localized title of the article.
    Example: Billing FAQ

  - `data.contents.locale` (string)
    The locale of this article content.
    Example: en

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

