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

# List Competitor Customers

> The companies a competitor sells to, with the evidence behind each one

A competitor's customers. Clustr finds them on the competitor's own
[website](https://docs.clustr-ai.com/api-reference/get-competitor-site.md) and LinkedIn posts, and keeps the evidence
behind each one: the page, the quote and the people found.

Each piece of evidence is a **signal** with a weight:

| Signal | What it is | Weight |
| - | - | - |
| `case_study` | A case study page about the customer on the competitor's site | 100 |
| `testimonial` | A quote on the competitor's site whose own block names the company | 80 |
| `post_announcement` | A competitor post announcing the customer ("X chose us") | 80 |
| `post_webinar` | A competitor webinar or event with the customer as a speaker or guest | 70 |
| `post_highlight` | A competitor post about the customer's results | 70 |
| `logo_wall` | The customer's logo on the competitor's homepage or customers page | 50 |
| `cs_interaction` | The competitor's customer success reps commenting on posts by people at the company (likes do not count) | 30 for comments on two posts to two people there; 50 for comments on two posts by two reps. Comments on a single post only back up other evidence, and this signal is never enough on its own to confirm |

A company named as an investor, partner, integration or technology, the competitor itself, you,
or another competitor you track is never a customer, whatever else is found.

The **score** adds the weight of each signal once, capped at 100, and gives the **label**:

* `confirmed`: 80 or more (one strong signal), or confirmed by you.
* `likely`: 50 to 79.
* `possible`: under 50. Hidden unless you pass `include_possible=true`.

Each customer also has its `signals` (each with the page or post that shows it), its
`contacts` (`found_via`: `testimonial`, `tagged` in a post, `buying_committee` for people who
engaged with the competitor's post about the customer, `cs_counterpart` for the people its CS
reps engage), any `renewal_date` you set, `possible_churn` when the evidence was removed from
the competitor's site, and two flags: `in_crm` when the company is in your CRM, and
`is_customer_of_ours` when it is also your customer. When your CRM has the company (matched on
its domain), `owner_name`, `owner_email`, `cs_owner_name` and `cs_owner_email` name its account
owner and CS owner. `confidence` names the strongest kind of evidence and `sources` the
kinds of evidence seen; `renewal_window_start` and `renewal_window_end` are always `null`.

Customers you [rejected](https://docs.clustr-ai.com/api-reference/set-competitor-customer-verdict.md) are left out unless you
pass `include_rejected=1`. To read every competitor's customers in one list, use
[List All Competitor Customers](https://docs.clustr-ai.com/api-reference/list-all-competitor-customers.md). For the people at
one customer, and the ones you can reach there, use
[List Competitor Customer People](https://docs.clustr-ai.com/api-reference/list-competitor-customer-people.md).

```bash cURL theme={null}
curl https://api.clustr-ai.com/api/public/competitors/cmp_r0jpyyqyeh0txpgdhb604j2g9s/customers \
  -H "Authorization: Bearer YOUR_API_KEY"
```

```python Python theme={null}
import requests

requests.get(
    "https://api.clustr-ai.com/api/public/competitors/cmp_r0jpyyqyeh0txpgdhb604j2g9s/customers",
    headers={"Authorization": "Bearer YOUR_API_KEY"},
)
```

```javascript JavaScript theme={null}
await fetch("https://api.clustr-ai.com/api/public/competitors/cmp_r0jpyyqyeh0txpgdhb604j2g9s/customers", {
  headers: { Authorization: "Bearer YOUR_API_KEY" },
});
```

```json 200 theme={null}
{
  "success": true,
  "data": {
    "customers": [
      {
        "clustr_competitor_customer_id": "ccus_3jm919aa345jdss56074sb5vy2",
        "clustr_account_id": "acc_g756rvkxxsbt7wedcdh3rsqvyb",
        "id": "8b4e2f6a-1c3d-4e5f-9a7b-0c2d4e6f8a1b",
        "company_name": "Initech",
        "domain": "initech.com",
        "linkedin_numeric_id": "1035",
        "company_id": "3f9a1b2c-4d5e-6f70-8a9b-0c1d2e3f4a5b",
        "label": "confirmed",
        "score": 100,
        "signals": [
          { "signal": "case_study", "weight": 100, "url": "https://globex.com/customers/initech", "count": 1 }
        ],
        "contacts": [
          {
            "name": "Peter Gibbons",
            "title": "VP Operations",
            "linkedin_url": "https://www.linkedin.com/in/peter-gibbons",
            "found_via": "testimonial",
            "evidence_url": "https://globex.com/customers/initech"
          }
        ],
        "possible_churn": false,
        "renewal_date": null,
        "renewal_task_created_at": null,
        "confidence": "quoted",
        "sources": ["case_study"],
        "first_seen_at": "2026-09-07T06:00:00Z",
        "last_seen_at": "2026-10-05T06:00:00Z",
        "removed_at": null,
        "renewal_window_start": null,
        "renewal_window_end": null,
        "user_verdict": null,
        "in_crm": true,
        "is_customer_of_ours": false,
        "owner_name": "Alex Rivera",
        "owner_email": "alex@yourcompany.com",
        "evidence": [
          {
            "kind": "case_study",
            "signal": "case_study",
            "weight": 100,
            "url": "https://globex.com/customers/initech",
            "quote": "Globex cut our reporting time in half.",
            "person_name": "Peter Gibbons",
            "person_title": "VP Operations",
            "observed_at": "2026-09-07T06:00:00Z"
          }
        ]
      }
    ],
    "total": 1,
    "limit": 100,
    "offset": 0
  }
}
```


## OpenAPI

````yaml GET /competitors/{id}/customers
openapi: 3.1.0
info:
  title: Clustr Public API
  description: >
    Programmatic access to your Clustr network: import connectors, search warm
    intros (opportunities), and manage target accounts.


    ## Authentication

    All endpoints require a Bearer token (API key) in the `Authorization`
    header.


    ```

    Authorization: Bearer <your_api_key>

    ```


    API keys can be created and managed from the [API settings
    page](https://app.clustr-ai.com/api).
  version: '1.0'
  contact:
    name: Clustr Support
    url: https://clustr-ai.com
servers:
  - url: https://api.clustr-ai.com/api/public
    description: Production
security:
  - BearerAuth: []
paths:
  /competitors/{id}/customers:
    get:
      tags:
        - Competitor Monitoring
      summary: List Competitor Customers
      description: >-
        Lists the companies a competitor sells to, found on its own website and
        LinkedIn posts. Each customer has a label (`confirmed`, `likely` or
        `possible`) based on the signals behind it, with the page that shows
        each signal and the people found. By default the list holds confirmed
        and likely customers; add `include_possible=true` to include possible
        ones and `include_rejected=1` to include the customers you rejected.
        Each customer carries its CRM account owner and CS owner, matched on its
        domain.
      operationId: listCompetitorCustomers
      parameters:
        - name: company
          in: query
          description: >-
            Keeps the customers at this company, by its name. Repeat it for
            several companies (a name may hold a comma, so it is never split).
          schema:
            type: string
        - name: id
          in: path
          required: true
          description: >-
            The competitor's Clustr ID (`cmp_…`), from [List
            Competitors](/api-reference/list-competitors).

            The id from earlier responses also works.
          schema:
            type: string
          example: cmp_93ts5mkvygsdmqgxwh1tws27yr
        - name: label
          in: query
          description: >-
            Keeps the customers with these labels, as a comma-separated list of
            `confirmed`, `likely` and `possible`. Defaults to
            `confirmed,likely`. `possible` also needs `include_possible`.
          schema:
            type: string
        - name: include_possible
          in: query
          description: >-
            `true` also lists possible customers, the ones with only a weak
            signal.
          schema:
            type: string
            enum:
              - '0'
              - '1'
              - 'true'
              - 'false'
        - name: signal
          in: query
          description: >-
            Keeps the customers with at least one of these signals, as a
            comma-separated list: `case_study`, `testimonial`,
            `post_announcement`, `post_webinar`, `post_highlight`, `logo_wall`,
            `cs_interaction` or `product_user_comment`.
          schema:
            type: string
        - name: include_rejected
          in: query
          description: Set to `1` to also list the customers you rejected.
          schema:
            type: string
            enum:
              - '0'
              - '1'
        - name: order
          in: query
          description: >-
            `standing` lists your own customers first, then the companies in
            your CRM, then the rest in the default order.
          schema:
            type: string
            enum:
              - standing
        - name: owner
          in: query
          description: >-
            Keeps the customers whose CRM account owner or CS owner has this
            email address. Customers are matched to your CRM on their domain.
          schema:
            type: string
        - name: cs_owner
          in: query
          description: >-
            Keeps the customers whose CS owner has this email address: the CS
            owner set in Clustr, or else the one in your CRM.
          schema:
            type: string
        - name: limit
          in: query
          description: The number of customers per page, at most 500.
          schema:
            type: integer
            default: 100
            maximum: 500
        - name: offset
          in: query
          description: The number of customers to skip, for paging.
          schema:
            type: integer
            default: 0
      responses:
        '200':
          description: One page of the competitor's customers
          content:
            application/json:
              schema:
                type: object
                required:
                  - success
                  - data
                properties:
                  success:
                    type: boolean
                    example: true
                  data:
                    $ref: '#/components/schemas/CompetitorCustomersPage'
        '401':
          description: Invalid or missing API key
        '403':
          description: Competitor monitoring is not enabled for this workspace
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: Competitor not found
components:
  schemas:
    CompetitorCustomersPage:
      type: object
      properties:
        customers:
          type: array
          items:
            $ref: '#/components/schemas/CompetitorCustomer'
        total:
          type: integer
        limit:
          type: integer
        offset:
          type: integer
    ErrorResponse:
      type: object
      required:
        - success
        - error
      properties:
        success:
          type: boolean
          example: false
        error:
          type: object
          properties:
            message:
              type: string
              example: Invalid request body
            code:
              type: string
              example: BAD_REQUEST
    CompetitorCustomer:
      type: object
      description: One company a competitor sells to.
      properties:
        clustr_competitor_customer_id:
          type: string
          description: >-
            The customer's Clustr ID, for example
            `ccus_3x9b7685wn79zrq49xd1wre4j2`. Use it to refer to this

            customer.
          example: ccus_3x9b7685wn79zrq49xd1wre4j2
        clustr_account_id:
          type: string
          description: >-
            The Clustr ID of your account, when the customer matches one, for
            example

            `acc_pnz80bn0wwab426btp6s8jtceg`.
          example: acc_pnz80bn0wwab426btp6s8jtceg
        id:
          type: string
          description: >-
            Kept for integrations built before Clustr IDs. New integrations
            should use `clustr_competitor_customer_id`.
        competitor:
          type: object
          description: The competitor. Set on List All Competitor Customers only.
          properties:
            clustr_competitor_id:
              type: string
              description: >-
                The competitor's Clustr ID, for example
                `cmp_rax2h4x50hedcsspwnjyq9d4qv`. Use it to refer to

                this competitor.
              example: cmp_rax2h4x50hedcsspwnjyq9d4qv
            id:
              type: string
              description: >-
                Kept for integrations built before Clustr IDs. New integrations
                should use `clustr_competitor_id`.
            name:
              type: string
        company_name:
          type: string
          example: Initech
        domain:
          type: string
          nullable: true
        linkedin_numeric_id:
          type: string
          nullable: true
        company_id:
          type: string
          nullable: true
          description: >-
            Kept for integrations built before Clustr IDs. New integrations
            should use `clustr_account_id`.
        label:
          type: string
          enum:
            - confirmed
            - likely
            - possible
          description: >-
            `confirmed`: score 80 or more, or confirmed by you. `likely`: 50 to
            79. `possible`: under 50.
        score:
          type: integer
          minimum: 0
          maximum: 100
          description: The weights of its distinct signals added up, capped at 100.
        signals:
          type: array
          description: >-
            The signals behind the score, each with the page or post that shows
            it.
          items:
            type: object
            properties:
              signal:
                type: string
                enum:
                  - case_study
                  - testimonial
                  - post_announcement
                  - post_webinar
                  - post_highlight
                  - logo_wall
                  - cs_interaction
                  - product_user_comment
              weight:
                type: integer
              url:
                type: string
              count:
                type: integer
        contacts:
          type: array
          description: People found at the customer, and how.
          items:
            type: object
            properties:
              name:
                type: string
              title:
                type: string
                nullable: true
              linkedin_url:
                type: string
                nullable: true
              found_via:
                type: string
                enum:
                  - testimonial
                  - tagged
                  - buying_committee
                  - cs_counterpart
                  - product_user
              evidence_url:
                type: string
                nullable: true
        possible_churn:
          type: boolean
          description: >-
            True when the evidence was removed from the competitor's site, a
            possible sign that the customer left.
        renewal_date:
          type: string
          format: date
          nullable: true
          description: The renewal date you set. It replaces the estimated window.
        renewal_task_created_at:
          type: string
          format: date-time
          nullable: true
          description: When Clustr created the renewal task in your CRM.
        confidence:
          type: string
          enum:
            - quoted
            - named
            - company_only
            - inferred
          description: >-
            The strongest kind of evidence behind the customer: `quoted` (a
            testimonial quotes a named person), `named` (a case study,
            testimonial or post names the customer), `company_only` (a logo) or
            `inferred` (customer success activity alone). `label` and `score`
            give the overall verdict.
        sources:
          type: array
          items:
            type: string
          description: The kinds of evidence seen.
        first_seen_at:
          type: string
          format: date-time
        last_seen_at:
          type: string
          format: date-time
        removed_at:
          type: string
          format: date-time
          nullable: true
          description: Set when the evidence disappeared.
        renewal_window_start:
          type: string
          format: date
          nullable: true
        renewal_window_end:
          type: string
          format: date
          nullable: true
        user_verdict:
          type: string
          nullable: true
          enum:
            - confirmed
            - rejected
            - null
        in_crm:
          type: boolean
          description: The company is in your CRM.
        is_customer_of_ours:
          type: boolean
          description: The company is also your customer.
        owner_name:
          type: string
          description: >-
            The account owner in your CRM, matched on the domain. Absent when
            unknown.
        owner_email:
          type: string
        cs_owner_name:
          type: string
          description: >-
            The CS owner in your CRM, matched on the domain. Absent when
            unknown.
        cs_owner_email:
          type: string
        evidence:
          type: array
          items:
            $ref: '#/components/schemas/CompetitorCustomerEvidence'
    CompetitorCustomerEvidence:
      type: object
      description: One piece of evidence that a company is a competitor's customer.
      properties:
        kind:
          type: string
          enum:
            - website
            - logo
            - post
            - press
            - review
            - search
            - cs_interaction
            - case_study
            - testimonial
            - logo_wall
            - post_announcement
            - post_webinar
            - post_highlight
            - not_customer
            - product_user_comment
          example: case_study
        signal:
          type: string
          nullable: true
          description: What this evidence counts as in the score.
        weight:
          type: integer
          nullable: true
        url:
          type: string
        quote:
          type: string
          nullable: true
          description: The words that name the customer.
        person_name:
          type: string
          nullable: true
        person_title:
          type: string
          nullable: true
        observed_at:
          type: string
          format: date-time
          nullable: true
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      description: The API key you created on the API settings page of the Clustr app.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.