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

# List customer context

> Strategic intelligence records: churn reasons, competitive mentions, satisfaction
and more. Filter by `type`, `customer_id`, or date range. Shares `customer_id` with
insights, so you can line the two up for the same customer.




## OpenAPI

````yaml /api-reference/openapi.yaml get /context
openapi: 3.0.3
info:
  title: ClosedLoop AI Public API
  version: 1.0.0
  x-logo:
    url: https://app.closedloop.sh/favicon.svg
    altText: ClosedLoop AI
  description: >
    # ClosedLoop AI Public API


    Programmatic access to your team's **product insights**, the structured
    intelligence

    ClosedLoop AI extracts from customer conversations (Gong, Fireflies, Slack,
    …) and

    structured feedback (surveys, webhooks).


    Pull insights, themes, features, customer context and analytics into your
    own tools.


    ## Two ways to integrate


    | | **This REST API** | **MCP** (live today) |

    |---|---|---|

    | Best for | server-to-server, dashboards, ETL, scripts | AI assistants
    (Claude, Cursor, …), agents |

    | Shape | resource endpoints, JSON | tool calls over the Model Context
    Protocol |

    | Auth | `X-API-Key` header | OAuth |


    Most agentic use cases are already covered by MCP. Reach for this REST API
    when you

    want plain HTTP resources.


    ## Base URLs (region-scoped)


    Your API key belongs to a **team**, and each team lives in exactly one
    region. Use the

    base URL for **your** region. A key issued in the EU only works against the
    EU host.


    | Region | Base URL |

    |---|---|

    | United States | `https://api.closedloop.sh/v1` |

    | European Union | `https://eu.api.closedloop.sh/v1` |


    ## Authentication


    Create a key in **Settings → API Keys** in the app, then send it on every
    request:


    ```

    X-API-Key: clai_live_xxxxxxxxxxxxxxxxxxxx

    ```


    Keys are **team-scoped**: every response is automatically limited to your
    team's data.

    Never expose a key in client-side code.


    ## Conventions


    - **Read-only**: every v1 endpoint is a `GET`; nothing is mutated. Feedback
    is ingested
      through your connected integrations, not this API.
    - **Pagination**: list endpoints accept `limit` (default 50, max 200) and
    `offset`.
      Responses include a `pagination` object with the full-set `total`.
    - **Errors**: non-2xx responses return a JSON `{ error, code, hint? }` body.
    User-safe
      messages only; never raw internals.
    - **Rate limits** (per API key): Free 100/hr · Pay-as-you-go 500/hr ·
    Enterprise 2,000/hr.
      `429` on exceed, with `X-RateLimit-*` headers.
    - **Linking insights and context**: both carry the same resolved
    `customer_id`, so you
      can line up an insight with the context (churn, competitor, satisfaction) for the same
      customer. Filter either list by `customer_id`.
    - **Time anchors**: timestamps are ISO 8601 (UTC).
  contact:
    name: ClosedLoop AI Support
    email: support@closedloop.sh
    url: https://closedloop.sh
  license:
    name: Proprietary (ClosedLoop Labs LLC)
    url: https://closedloop.sh/terms
servers:
  - url: https://api.closedloop.sh/v1
    description: United States (production)
  - url: https://eu.api.closedloop.sh/v1
    description: European Union (production)
security:
  - ApiKeyAuth: []
tags:
  - name: Insights
    description: |
      Individual **product insights**: structured, AI-processed feedback items
      (pain point, severity, workaround, competitor gap, evidence).
  - name: Themes
    description: >
      **Themes**: top-level problem clusters of related insights, RIC-scored.
      The

      "what should we build?" surface. Each theme rolls up one or more buildable
      features.
  - name: Features
    description: >
      **Features**: the buildable, shippable children of a theme. Filter by
      `theme_id`.

      Same theme → features hierarchy you see on the roadmap.
  - name: Customers
    description: The people and accounts who gave feedback, with CRM context.
  - name: Context
    description: >
      **Customer context**, the strategic intelligence behind your customers:
      churn

      reasons, competitive mentions, satisfaction, pricing perception and more,
      surfaced

      from conversations. This is the `/context` surface in the app. Each record
      resolves

      to a customer (`customer_id`), so it lines up with insights for the same
      customer.
  - name: Competitors
    description: >
      Competitive pressure derived from your customers' own words. Competitors
      with a

      **mention trend over time** (not a static total), and a searchable feed of
      the exact

      mentions, each showing the company behind it.
  - name: Analytics
    description: Trends, cohorts and facet counts over the full dataset.
  - name: Integrations
    description: Connected data sources for your team.
  - name: Usage
    description: Credit consumption and usage records for billing transparency.
  - name: Meta
    description: Service metadata.
paths:
  /context:
    get:
      tags:
        - Context
      summary: List customer context
      description: >
        Strategic intelligence records: churn reasons, competitive mentions,
        satisfaction

        and more. Filter by `type`, `customer_id`, or date range. Shares
        `customer_id` with

        insights, so you can line the two up for the same customer.
      parameters:
        - name: type
          in: query
          schema:
            type: string
          description: >-
            Context type. Common values: churn_risk, churn_reason,
            competitor_mention, satisfaction, win_factor, expansion_opportunity,
            pricing_perception, decision_criteria, general_dislike, deal_blocker
            (30+ total).
        - name: customer_id
          in: query
          schema:
            type: string
            format: uuid
          description: Filter to context for one customer (same key as on insights).
        - $ref: '#/components/parameters/DateFrom'
        - $ref: '#/components/parameters/DateTo'
        - $ref: '#/components/parameters/Limit'
        - $ref: '#/components/parameters/Offset'
      responses:
        '200':
          description: A page of context records
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: '#/components/schemas/Context'
                  pagination:
                    $ref: '#/components/schemas/Pagination'
components:
  parameters:
    DateFrom:
      name: date_from
      in: query
      schema:
        type: string
        format: date
      description: Inclusive start date (ISO 8601).
    DateTo:
      name: date_to
      in: query
      schema:
        type: string
        format: date
      description: Inclusive end date (ISO 8601).
    Limit:
      name: limit
      in: query
      schema:
        type: integer
        default: 50
        minimum: 1
        maximum: 200
      description: Page size (max 200).
    Offset:
      name: offset
      in: query
      schema:
        type: integer
        default: 0
        minimum: 0
      description: Number of records to skip.
  schemas:
    Context:
      type: object
      required:
        - id
        - type
        - content
        - created_at
      properties:
        id:
          type: string
          format: uuid
          example: 51617100-0000-4000-8000-000000000001
        type:
          type: string
          example: churn_reason
          description: >-
            Context type: see the /context 'type' filter for common values
            (30+).
        content:
          type: string
          example: They're evaluating Competitor X because our reporting is too slow.
        customer_id:
          type: string
          format: uuid
          nullable: true
          description: >-
            Resolved customer: same key as on insights; correlate the two by
            this.
          example: c0ffee00-0000-4000-8000-000000000001
        customer_name:
          type: string
          example: Acme Co
        source:
          type: string
          example: gong_call_def456
        created_at:
          type: string
          format: date-time
          example: '2026-05-20T14:00:00Z'
    Pagination:
      type: object
      properties:
        total:
          type: integer
          description: Total matching records (full set, not the page).
          example: 508
        limit:
          type: integer
          example: 50
        offset:
          type: integer
          example: 0
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: X-API-Key
      description: |
        Team-scoped API key created in the app (Settings → API Keys).
        Sent as `X-API-Key: <key>` on every request.

````