> ## Documentation Index
> Fetch the complete documentation index at: https://help.experro.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Content Search

> Searches non-product content indexed for the catalog — CMS pages, articles, blog posts, and similar — with an optional content-type filter.

Returns a different result shape than product search: title, URL, image, and summary rather than price, SKU, and inventory.

Before calling this endpoint, make sure you've generated an API token and picked the correct domain. See [Authentication & Base URLs](/api-reference/authbaseurl).

This searches CMS content rather than products, so the result shape differs — title, URL, image, and summary instead of price, SKU, and inventory. For products, use [Search Products](/api-reference/discovery/search/post).


## OpenAPI

````yaml GET /discovery/search/content
openapi: 3.1.0
info:
  title: OpenAPI Plant Store
  description: >-
    A sample API that uses a plant store as an example to demonstrate features
    in the OpenAPI specification
  license:
    name: MIT
  version: 1.0.0
servers:
  - url: https://apis.experro.app
    description: Admin Server
  - url: https://{base-address}
    description: Custom Server
    variables:
      base-address:
        default: ''
        description: Enter your custom domain or server address.
security:
  - bearerAuth: []
paths:
  /discovery/search/content:
    get:
      summary: Search CMS / Content Items
      description: >-
        Searches non-product content indexed for the catalog — CMS pages,
        articles, blog posts, and similar — with an optional content-type
        filter.


        Returns a different result shape than product search: title, URL, image,
        and summary rather than price, SKU, and inventory.
      parameters:
        - $ref: '#/components/parameters/StorefrontTenantIdHeader'
        - $ref: '#/components/parameters/StorefrontWorkspaceIdHeader'
        - $ref: '#/components/parameters/StorefrontEnvironmentIdHeader'
        - name: catalog_id
          in: query
          description: Catalog to search within.
          required: true
          schema:
            type: string
            format: uuid
        - name: q
          in: query
          description: Text query to match content against.
          required: true
          schema:
            type: string
        - name: locale
          in: query
          description: >-
            Locale to search in, such as `en-us`. Determines which localized
            content is matched and returned.
          schema:
            type: string
        - name: skip
          in: query
          description: Number of results to skip.
          schema:
            type: integer
            default: 0
        - name: limit
          in: query
          description: Maximum number of results to return.
          schema:
            type: integer
            default: 10
        - name: type
          in: query
          description: Content type filter.
          schema:
            type: string
        - name: sort_by
          in: query
          description: Field to sort by.
          schema:
            type: string
            enum:
              - relevance
              - created_at
              - created_by
              - title
              - modified_at
              - modified_by
        - name: sort_order
          in: query
          description: Sort direction.
          schema:
            type: string
            enum:
              - asc
              - desc
      responses:
        '200':
          description: Success.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ContentSearchResult'
        '400':
          description: >-
            The request could not be parsed or validated. `Invalid Input` almost
            always means a request-body problem rather than a bad field value:


            - The `Content-Type` is missing or is not `application/json`.

            - The body was sent as form data instead of raw JSON.

            - The body is empty, or is not valid JSON.

            - An optional field was sent **blank rather than omitted** — for
            example `"sort_order": ""`, `"hero_variant_option_override": {}`, or
            `"filters": [{}]`. Omit a field you are not using, or send `null` or
            `[]`; an empty string or empty object is rejected.

            - A numeric field was sent as a string, such as `"limit": "24"`
            instead of `"limit": 24`.


            A missing required query parameter returns a more specific message,
            for example `Query deserialize error: missing field \`catalog_id\``.
        '404':
          description: The catalog was not found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error404'
        '500':
          description: >-
            An unexpected error occurred on the server. This endpoint returns
            500 on catalogs where content search is not configured.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error500'
      security: []
      servers:
        - url: https://{base-address}
          description: Custom Server
          variables:
            base-address:
              default: ''
              description: Enter your custom domain or server address.
components:
  parameters:
    StorefrontTenantIdHeader:
      name: x-tenant-id
      in: header
      required: true
      schema:
        type: string
      description: Identifies your organization. Ensures data isolation per tenant.
    StorefrontWorkspaceIdHeader:
      name: x-workspace-id
      in: header
      required: true
      schema:
        type: string
      description: >-
        Identifies the workspace within your organization. Scopes resources to a
        specific workspace.
    StorefrontEnvironmentIdHeader:
      name: x-environment-id
      in: header
      required: true
      schema:
        type: string
      description: >-
        Identifies the environment you are targeting. Scopes the call to a
        specific deployment environment.
  schemas:
    ContentSearchResult:
      type: object
      description: Matching content items for the query.
      properties:
        data:
          type: array
          description: Matching content items for this page of results.
          items:
            $ref: '#/components/schemas/ContentSearchRecord'
        total:
          type: integer
          description: >-
            Total number of matching items, before `limit` and `skip` are
            applied.
      additionalProperties: false
    Error404:
      type: object
      properties:
        Status:
          type: string
          example: failure
        Error:
          type: object
          properties:
            message:
              type: string
            name:
              type: string
            code:
              type: string
          required:
            - message
            - name
      required:
        - Status
        - Error
    Error500:
      type: object
      properties:
        Status:
          type: string
          example: failure
        Error:
          type: object
          properties:
            message:
              type: string
            name:
              type: string
            code:
              type: string
          required:
            - message
            - name
      required:
        - Status
        - Error
    ContentSearchRecord:
      type: object
      description: >-
        One content item. Fields describe a page or article rather than a
        product, so there is no price, SKU, or inventory here.
      properties:
        title:
          type: string
          description: Title of the content item.
        url:
          type: string
          description: Path to the item, relative to your storefront.
        type:
          type: string
          description: >-
            Kind of content, such as `page` or `blog`. Pass the same value in
            the `type` query parameter to filter by it.
        summary:
          type: string
          description: Short extract of the body text, suitable for a result snippet.
        image_url:
          type:
            - string
            - 'null'
          description: Featured image for the item. Null when the item has no image.
        provider_id:
          type: string
          description: Id of the item in the system that manages the content.
        created_at:
          type: string
          description: When the item was created, as an ISO 8601 timestamp.
        created_by:
          type:
            - string
            - 'null'
          description: >-
            Who created the item. Null when the source does not record an
            author.
        extra_data:
          type: string
          description: >-
            Additional source-specific metadata, such as publish and update
            timestamps. This is a JSON **string**, so parse it before use rather
            than reading it as an object.
      additionalProperties: true
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer

````