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

# Search Chats

> Hybrid search across the caller's chat history that merges two lanes: a case-insensitive title-substring match and a semantic (vector) match over each chat's AI-generated summary. Title matches are returned first (a strong signal the user remembers the chat name), followed by semantic matches in relevance order, de-duplicated and capped at `limit`.

**Authorization:** User-scoped keys (`u:gcai_...`) search the chats that user can access. Organization-scoped keys search every chat shared with the entire organization, regardless of who or what created it. Chats that remain private to an individual user are never returned to an org-scoped key.

API-created chats appear here only once they've been [materialized](/api-reference/concepts/chat-visibility); unmaterialized chats are not in anyone's history and won't match.



## OpenAPI

````yaml GET /chat/search
openapi: 3.0.3
info:
  title: GC AI External API
  version: 1.0.0
  description: >-
    The GC AI External API allows programmatic access to GC AI's chat
    capabilities. It's designed for integration with workflow automation tools
    like Zapier, Make, n8n, or custom applications.


    ## Authentication


    All API requests must include an API key in the `Authorization` header:


    ```

    Authorization: gcai_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

    ```


    API keys can be created in the GC AI app under **Settings → API**.


    ## Multi-turn Conversations


    Conversations can span multiple turns: pass the `chat_id` returned by a
    completion back on your next request to continue the same chat. See
    [Multi-turn Conversations](/api-reference/concepts/multi-turn).


    ## Current Limitations


    The following is not yet available via API:


    - **Interactive clarification**: the model cannot pause to ask the caller a
    follow-up question; the `askUserQuestions` tool is disabled on the API
    surface in beta


    ## Usage


    Usage is tracked and viewable in the GC AI app under **Settings → API → View
    Usage**.


    ## Support


    For API support, contact [support@gc.ai](mailto:support@gc.ai) or reach out
    to your account representative.
  contact:
    email: support@gc.ai
servers:
  - url: https://app.gc.ai/api/external/v1
    description: Production server
security: []
tags:
  - name: Chat
    description: AI chat completion endpoints
  - name: Files
    description: File upload and management endpoints
  - name: Folders
    description: Folder management endpoints
  - name: Playbooks
    description: Playbook review endpoints
  - name: Profiles
    description: Personal and company profile endpoints
  - name: Projects
    description: Project management endpoints
  - name: Skills
    description: Skill library management endpoints
  - name: Utility
    description: Health check and connectivity endpoints
  - name: Usage
    description: Usage and credit/billing reporting endpoints
paths:
  /chat/search:
    get:
      tags:
        - Chat
      summary: Search chats
      description: >-
        Hybrid search across the caller's chat history that merges two lanes: a
        case-insensitive title-substring match and a semantic (vector) match
        over each chat's AI-generated summary. Title matches are returned first
        (a strong signal the user remembers the chat name), followed by semantic
        matches in relevance order, de-duplicated and capped at `limit`.


        **Authorization:** User-scoped keys (`u:gcai_...`) search the chats that
        user can access. Organization-scoped keys search every chat shared with
        the entire organization, regardless of who or what created it. Chats
        that remain private to an individual user are never returned to an
        org-scoped key.


        API-created chats appear here only once they've been
        [materialized](/api-reference/concepts/chat-visibility); unmaterialized
        chats are not in anyone's history and won't match.
      operationId: searchChats
      parameters:
        - schema:
            type: string
            minLength: 1
            maxLength: 500
            description: Search query (required, 1-500 chars). Natural language is fine.
            example: force majeure carve-out
          required: true
          description: Search query (required, 1-500 chars). Natural language is fine.
          name: q
          in: query
        - schema:
            type: integer
            minimum: 1
            maximum: 50
            default: 20
            description: Max chats to return (default 20, max 50)
          required: false
          description: Max chats to return (default 20, max 50)
          name: limit
          in: query
      responses:
        '200':
          description: Chats matching the query
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ChatSearchResponse'
        '400':
          description: Missing or invalid query parameters
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: Missing or malformed API key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '403':
          description: Invalid API key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '429':
          description: >-
            Rate limit exceeded. See [Rate
            Limits](/api-reference/concepts/rate-limits) for the tiers, limits,
            and how to back off.
          headers:
            Retry-After:
              schema:
                type: string
                description: Seconds to wait before retrying after a rate-limit block.
                example: '60'
              required: true
              description: Seconds to wait before retrying after a rate-limit block.
            RateLimit-Limit:
              schema:
                type: string
                description: Request quota for the applicable window.
                example: '3'
              required: true
              description: Request quota for the applicable window.
            RateLimit-Remaining:
              schema:
                type: string
                description: Requests remaining in the current window.
                example: '0'
              required: true
              description: Requests remaining in the current window.
            RateLimit-Reset:
              schema:
                type: string
                description: Seconds until the quota resets.
                example: '60'
              required: true
              description: Seconds until the quota resets.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '503':
          description: Service temporarily unavailable
          headers:
            Retry-After:
              schema:
                type: string
                description: >-
                  Seconds to wait before retrying after a transient service
                  outage.
                example: '5'
              required: true
              description: >-
                Seconds to wait before retrying after a transient service
                outage.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      security:
        - ApiKeyAuth: []
components:
  schemas:
    ChatSearchResponse:
      type: object
      properties:
        chats:
          type: array
          items:
            $ref: '#/components/schemas/ChatSearchResult'
          description: >-
            Chats matching the query. Title-substring matches first, then
            semantic (vector) matches in relevance order, de-duplicated and
            capped at `limit`.
      required:
        - chats
    Error:
      type: object
      properties:
        error:
          type: string
          description: Error message
        code:
          type: string
          description: >-
            Machine-readable error code present on some errors (e.g.
            `RATE_LIMITED`, `INSUFFICIENT_CREDITS`, `TRIAL_NOT_STARTED`,
            `BILLING_NOT_CONFIGURED`). Branch on this rather than the
            human-readable `error` string.
        message:
          type: string
          description: Additional error details
        details:
          type: object
          additionalProperties:
            nullable: true
          description: Validation error details (for 400 errors)
      required:
        - error
    ChatSearchResult:
      type: object
      properties:
        id:
          type: string
          format: uuid
          description: Unique chat identifier
        title:
          type: string
          nullable: true
          description: Chat title, or null if untitled
        summary:
          type: string
          nullable: true
          description: AI-generated summary of the chat, if any
        updated_at:
          type: string
          description: ISO 8601 last-update timestamp
      required:
        - id
        - title
        - summary
        - updated_at
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: Authorization
      description: |-
        API key for authentication. Format: `gcai_xxxxxxxxx`

        Create API keys in the GC AI app under Settings → API.

````