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

# Search companies

> Companies from the Elasticsearch projection: every company tab is this tool with filter playtable_sids {in: [<table>]}. Filter coverage (domain is_null), tags, status, signals; q is free text over name, domain, website and LinkedIn. Firmographics are cell-value view conditions, not entity filters. Includes: field_values (custom columns), people_counts, signals; page_size 0 = counts only, counts.groups.signals per signal. Fresh writes lag ES by seconds: read-your-writes is get_company.

Contract:
- MCP tool `search_companies`, registry package `mcp.playtables/companies`, mount `playtables.people`.
- Operation `search`, response envelope `search`.
- Flags: read only.



## OpenAPI

````yaml /api-reference/playtables/openapi.yaml post /api/companies/search
openapi: 3.0.3
info:
  title: 'GetSales public contract: gs.service.playtables'
  description: >-
    The data platform and the outreach engine: tables of people and companies,
    their enrichment columns, cells and runs, the data sources that feed them,
    sender profiles, the stoplist, the activity feed, the credit ledger, and the
    multichannel workflows with their per-person journeys and tasks.


    GENERATED. This document is projected from the Zod MCP tool registry in
    `product/mcp/gs.mcp` (one tool per public endpoint, 1:1). Do not edit it by
    hand; edit the tool definition and regenerate with `pnpm openapi:public`.


    Surface: the public `/api` contract of `gs.service.playtables`, 142
    operations. This is the only OpenAPI document the platform publishes.
    Internal (`/internal`) and health endpoints are deliberately absent: they
    are not part of any contract, they can change without notice, and the
    service source is their only description.


    Conventions:

    - Auth is a bearer JWT, optionally narrowed by the `Team-SID` header.

    - Every success body is an MCP envelope: `success: true` plus one typed
    `operation` shape (`search`, `get`, `create`, `update`, `delete`, `metrics`,
    `group_by`, `action`), and a `meta` block with `trace_id` for support.

    - Every failure is the same `McpError` envelope with a code from a fixed
    16-code taxonomy, so a client maps errors once.

    - Lists page with `page_size` (0 to 500, default 50) plus an opaque forward
    `cursor`; `page_size: 0` returns counts only.

    - On `GET` and `DELETE`, object-valued query parameters (`filter`, `sort`)
    travel as JSON text and array-valued ones repeat as `name[]=value`.

    - The MCP-only `_meta` field (usage analytics) never reaches the backend and
    is not part of this contract.
  version: '1.0'
  contact:
    name: GetSales
    url: https://getsales.io
    email: support@getsales.io
  license:
    name: Proprietary
    url: https://getsales.io/terms
servers:
  - url: https://beta.getsales.io/playtables/v1
    description: >-
      Production (the gateway path on the beta ring; the origin is provisioned
      per DEPLOY_MAP.md)
security:
  - BearerJwt: []
    TeamSid: []
tags:
  - name: activities
    description: >-
      Registry package `mcp.playtables/activities`, served on MCP mount
      `playtables.journeys`.
  - name: activity_objects
    description: >-
      Registry package `mcp.playtables/activity_objects`, served on MCP mount
      `playtables.people`.
  - name: companies
    description: >-
      Registry package `mcp.playtables/companies`, served on MCP mount
      `playtables.people`.
  - name: credit_ledger_entries
    description: >-
      Registry package `mcp.playtables/credit_ledger_entries`, served on MCP
      mount `id.billing`.
  - name: data_source_items
    description: >-
      Registry package `mcp.playtables/data_source_items`, served on MCP mount
      `playtables.sources`.
  - name: data_sources
    description: >-
      Registry package `mcp.playtables/data_sources`, served on MCP mount
      `playtables.sources`.
  - name: notes
    description: >-
      Registry package `mcp.playtables/notes`, served on MCP mount
      `playtables.pipeline`.
  - name: people
    description: >-
      Registry package `mcp.playtables/people`, served on MCP mount
      `playtables.people`.
  - name: pipeline_stages
    description: >-
      Registry package `mcp.playtables/pipeline_stages`, served on MCP mount
      `playtables.pipeline`.
  - name: plays
    description: >-
      Registry package `mcp.playtables/plays`, served on MCP mount
      `playtables.pipeline`.
  - name: playtable_field_values
    description: >-
      Registry package `mcp.playtables/playtable_field_values`, served on MCP
      mount `playtables.columns`.
  - name: playtable_fields
    description: >-
      Registry package `mcp.playtables/playtable_fields`, served on MCP mount
      `playtables.columns`.
  - name: playtable_runs
    description: >-
      Registry package `mcp.playtables/playtable_runs`, served on MCP mount
      `playtables.columns`.
  - name: playtable_views
    description: >-
      Registry package `mcp.playtables/playtable_views`, served on MCP mount
      `playtables.tables`.
  - name: playtables
    description: >-
      Registry package `mcp.playtables/playtables`, served on MCP mount
      `playtables.tables`.
  - name: result_pages
    description: >-
      Registry package `mcp.playtables/result_pages`, served on MCP mount
      `playtables.tables`.
  - name: sender_profiles
    description: >-
      Registry package `mcp.playtables/sender_profiles`, served on MCP mount
      `playtables.sources`.
  - name: stoplist_entries
    description: >-
      Registry package `mcp.playtables/stoplist_entries`, served on MCP mount
      `playtables.stoplist`.
  - name: tags
    description: >-
      Registry package `mcp.playtables/tags`, served on MCP mount
      `playtables.pipeline`.
  - name: workflow_attachments
    description: >-
      Registry package `mcp.playtables/workflow_attachments`, served on MCP
      mount `playtables.workflows`.
  - name: workflow_records
    description: >-
      Registry package `mcp.playtables/workflow_records`, served on MCP mount
      `playtables.journeys`.
  - name: workflow_sources
    description: >-
      Registry package `mcp.playtables/workflow_sources`, served on MCP mount
      `playtables.workflows`.
  - name: workflow_tasks
    description: >-
      Registry package `mcp.playtables/workflow_tasks`, served on MCP mount
      `playtables.journeys`.
  - name: workflow_versions
    description: >-
      Registry package `mcp.playtables/workflow_versions`, served on MCP mount
      `playtables.workflows`.
  - name: workflows
    description: >-
      Registry package `mcp.playtables/workflows`, served on MCP mount
      `playtables.workflows`.
paths:
  /api/companies/search:
    post:
      tags:
        - companies
      summary: Search companies
      description: >-
        Companies from the Elasticsearch projection: every company tab is this
        tool with filter playtable_sids {in: [<table>]}. Filter coverage (domain
        is_null), tags, status, signals; q is free text over name, domain,
        website and LinkedIn. Firmographics are cell-value view conditions, not
        entity filters. Includes: field_values (custom columns), people_counts,
        signals; page_size 0 = counts only, counts.groups.signals per signal.
        Fresh writes lag ES by seconds: read-your-writes is get_company.


        Contract:

        - MCP tool `search_companies`, registry package
        `mcp.playtables/companies`, mount `playtables.people`.

        - Operation `search`, response envelope `search`.

        - Flags: read only.
      operationId: search_companies
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SearchCompaniesRequest'
      responses:
        '200':
          description: '`search` success envelope.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SearchCompaniesResponse'
        4XX:
          $ref: '#/components/responses/McpClientError'
        5XX:
          $ref: '#/components/responses/McpServerError'
components:
  schemas:
    SearchCompaniesRequest:
      type: object
      description: Request body of `search_companies`.
      properties:
        filter:
          type: object
          properties:
            sid:
              type: object
              properties:
                eq:
                  type: string
                  minLength: 18
                  maxLength: 18
                  pattern: ^cr_co_
                  description: Company sid (cr_co_…).
                in:
                  type: array
                  items:
                    type: string
                    minLength: 18
                    maxLength: 18
                    pattern: ^cr_co_
                    description: Company sid (cr_co_…).
              additionalProperties: false
              description: Prefix-validated cr_co_ sid(s).
            playtable_sids:
              type: object
              properties:
                in:
                  type: array
                  items:
                    type: string
                    minLength: 18
                    maxLength: 18
                    pattern: ^pt_tb_
                nin:
                  type: array
                  items:
                    type: string
                    minLength: 18
                    maxLength: 18
                    pattern: ^pt_tb_
              additionalProperties: false
              description: >-
                THE table context - every company tab passes { in: [<table>] };
                array-overlap. nin answers the complement, memberless rows
                included.
            pipeline_stage_category:
              type: object
              properties:
                eq:
                  type: string
                  enum:
                    - cold
                    - approaching
                    - engaging
                    - positive
                    - nurture
                    - negative
                    - disqualified
                in:
                  type: array
                  items:
                    type: string
                    enum:
                      - cold
                      - approaching
                      - engaging
                      - positive
                      - nurture
                      - negative
                      - disqualified
              additionalProperties: false
              description: >-
                The account's funnel bucket (one of seven), expanded on the
                server into the team's company stage sids of those categories:
                ask by name, never resolve the stages yourself. eq approaching =
                someone was invited or written to and nobody answered.
            signals:
              type: array
              items:
                type: object
                properties:
                  key:
                    type: string
                    enum:
                      - awaiting_reply
                      - opened_not_replied
                      - clicked_not_replied
                      - multi_opened
                      - accepted_not_replied
                      - note_read_not_replied
                      - reacted_not_replied
                      - invited_us
                      - followed_us
                      - lead_messaged_first
                      - unanswered_inbound
                      - draft_pending
                      - escalated_open
                      - task_overdue
                      - went_quiet
                      - reactivated
                      - invite_pending
                      - connection_removed
                      - blocked_us
                      - deleted_message
                      - bounced
                      - bounced_hard
                      - complained
                      - booking_link_sent
                      - objective_reached
                      - viewed_our_profile
                      - visited_our_site
                      - visited_not_replied
                      - visited_key_page
                      - multi_visited
                      - submitted_form
                      - company_visited_our_site
                      - no_people
                      - thin_coverage
                      - nobody_reached
                      - no_engagement
                      - no_reply
                      - exhausted
                      - dormant
                      - dm_missing
                    description: >-
                      A catalog signal name. Thread and person names:
                      awaiting_reply (our message is the last),
                      opened_not_replied and clicked_not_replied (our email
                      opened or its link clicked, no reply), multi_opened (3+
                      opens), accepted_not_replied (invite accepted, nothing
                      after), note_read_not_replied (the accept delivered our
                      invite note, no reply), reacted_not_replied (an emoji on
                      our message, no reply), invited_us (their invitation to
                      us, unanswered), followed_us, lead_messaged_first (an
                      inbound thread), unanswered_inbound, draft_pending (an AI
                      draft awaits approval), escalated_open (handed to a
                      person, task open), task_overdue, went_quiet (they had
                      replied, then nothing), reactivated (an inbound after 30+
                      quiet days), invite_pending (our invite out, neither
                      accepted nor withdrawn), connection_removed, blocked_us,
                      deleted_message, bounced, bounced_hard (the address is
                      gone), complained, booking_link_sent, objective_reached
                      (the live dialog landed its goal), viewed_our_profile.
                      Website names: visited_our_site, visited_not_replied,
                      visited_key_page (a page the team marked key),
                      multi_visited, submitted_form, company_visited_our_site
                      (someone from the company, nobody recognized; a person's
                      and a company's). Account names, companies only (dormant
                      also a person's): no_people (nobody to work),
                      thin_coverage (under 3 people to work), nobody_reached,
                      no_engagement (touched, nothing came back), no_reply
                      (touched, no reply), exhausted (everyone nurture or
                      negative), dormant (touched once, quiet since), dm_missing
                      (a Wrong Decision Maker named, no positive person left).
                      Tracking facts are private: never tell the lead
                      (submitted_form excepted).
                  age_days:
                    type: integer
                    minimum: 0
                    maximum: 3650
                    description: >-
                      At least this many days on the signal's clock (0 = any).
                      Defaults when omitted: 1 visited_not_replied; 3
                      awaiting_reply and the *_not_replied names; 14 went_quiet,
                      invite_pending; 30 no_engagement, no_reply; 180 dormant;
                      the rest any age.
                required:
                  - key
              minItems: 1
              maxItems: 9
              description: >-
                ES-only. Named signals of the account, all must hold: its own
                visit and the account names rolled up over the people to work
                (disqualified or stoplisted people do not count). Never compose
                the roll-ups yourself. A person's or a thread's name is a 422.
            data_source_sid:
              type: object
              properties:
                eq:
                  type: string
                  minLength: 18
                  maxLength: 18
                  pattern: ^ds_sc_
                in:
                  type: array
                  items:
                    type: string
                    minLength: 18
                    maxLength: 18
                    pattern: ^ds_sc_
                is_null:
                  type: boolean
              additionalProperties: false
              description: Import provenance (ds_sc_…).
            status:
              type: object
              properties:
                eq:
                  type: string
                  enum:
                    - ok
                    - failed_validation
                    - duplicate
                    - stoplisted
                ne:
                  type: string
                  enum:
                    - ok
                    - failed_validation
                    - duplicate
                    - stoplisted
                in:
                  type: array
                  items:
                    type: string
                    enum:
                      - ok
                      - failed_validation
                      - duplicate
                      - stoplisted
                nin:
                  type: array
                  items:
                    type: string
                    enum:
                      - ok
                      - failed_validation
                      - duplicate
                      - stoplisted
              additionalProperties: false
            duplicate_of_sid:
              type: object
              properties:
                eq:
                  type: string
                  minLength: 18
                  maxLength: 18
                  pattern: ^cr_co_
                  description: Company sid (cr_co_…).
                in:
                  type: array
                  items:
                    type: string
                    minLength: 18
                    maxLength: 18
                    pattern: ^cr_co_
                    description: Company sid (cr_co_…).
                is_null:
                  type: boolean
              additionalProperties: false
              description: >-
                The copies of a primary: { eq: <primary sid> }. is_null:true =
                rows that are not flagged duplicates.
            tag_sids:
              type: object
              properties:
                in:
                  type: array
                  items:
                    type: string
                    minLength: 18
                    maxLength: 18
                    pattern: ^cr_tg_
                nin:
                  type: array
                  items:
                    type: string
                    minLength: 18
                    maxLength: 18
                    pattern: ^cr_tg_
              additionalProperties: false
              description: >-
                Array-overlap (any of); cr_tg_ sids - resolve labels via tags.
                nin answers the complement, untagged rows included.
            ln_id:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
                is_null:
                  type: boolean
              additionalProperties: false
              description: Exact LinkedIn company id.
            ln_nickname:
              type: object
              properties:
                eq:
                  type: string
                is_null:
                  type: boolean
              additionalProperties: false
              description: Exact page slug; fuzzy matching goes through q.
            domain:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
                is_null:
                  type: boolean
              additionalProperties: false
              description: Lowercased apex; is_null = enrichment gap.
            name:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
                is_null:
                  type: boolean
              additionalProperties: false
              description: Exact match; substring goes through q.
            q:
              type: string
              maxLength: 128
              description: >-
                Free text over name, domain, website, ln_nickname (ES
                full-text).
            created_at:
              type: object
              properties:
                gte:
                  type: string
                lte:
                  type: string
                gt:
                  type: string
                lt:
                  type: string
              additionalProperties: false
              description: ISO 8601 range; combine bounds in one object.
            updated_at:
              type: object
              properties:
                gte:
                  type: string
                lte:
                  type: string
                gt:
                  type: string
                lt:
                  type: string
              additionalProperties: false
            deleted_at:
              type: object
              properties:
                gte:
                  type: string
                lte:
                  type: string
                is_null:
                  type: boolean
              additionalProperties: false
              description: 'Default scope is { is_null: true } (live rows).'
          description: >-
            Field filters, ANDed: {field: {eq | ne | in | nin | gte | lte | gt |
            lt | is_null}}; q inside it is free text. Omit for every row.
        include:
          type: array
          items:
            type: string
            enum:
              - people_counts
              - field_values
              - last_activities
              - notes
              - signals
              - freshness
          description: Relations to attach to every item; omit for the bare rows.
        sort:
          type: object
          properties:
            field:
              anyOf:
                - type: string
                  enum:
                    - row_order
                    - created_at
                    - updated_at
                    - name
                - type: string
                  pattern: ^fields\.[a-z][a-z0-9_]{0,63}$
                  description: Custom column of the pinned playtable, by slug.
            direction:
              type: string
              enum:
                - asc
                - desc
              description: Default asc for row_order, desc otherwise.
          required:
            - field
          description: >-
            One sort column with its direction; default row_order asc, the grid
            row order (a per-team arrival sequence, never a job title).
        page_size:
          type: integer
          minimum: 0
          maximum: 500
          description: 0..500, default 50; 0 = counts only, 1 = the first row.
        cursor:
          type: string
          nullable: true
          description: pagination.next_cursor of the previous page.
        filter_ast:
          description: >-
            The §4.18 filter AST (the same tree the grid saves on a view): ANDed
            with `filter`; typed leaves over object attributes, record.<slug>
            cells, journey arrays, and the `signals` leaf (any of the catalog
            names the account carries).
        sids_only:
          type: boolean
          description: >-
            Answer the matching sids only (the grid's ids-only model): items
            carry {sid} and nothing else.
        semantic:
          type: object
          properties:
            field:
              type: string
              minLength: 8
              maxLength: 96
              pattern: ^record\.
              description: >-
                The semantic column, record.<slug>, whose value vectors are
                searched.
            query:
              type: string
              minLength: 1
              maxLength: 2048
              description: Natural-language query embedded and matched against the column.
            k:
              type: integer
              minimum: 1
              maximum: 500
              description: >-
                Nearest neighbours to keep before the filter applies. Default
                100.
            min_score:
              type: number
              minimum: 0
              maximum: 1
              description: >-
                The match floor on the score the rows come back with (0..1,
                cosine mapped as (1 + cos) / 2): a row below it is out, not
                last. Default: no floor, the k nearest stay.
          required:
            - field
            - query
          description: >-
            Semantic search over one embedded column (research §Filterable, the
            I5 engine); the result order is similarity.
    SearchCompaniesResponse:
      type: object
      properties:
        success:
          type: boolean
          enum:
            - true
        operation:
          type: string
          enum:
            - search
        items:
          type: array
          items:
            type: object
            properties:
              item:
                type: object
                properties:
                  sid:
                    type: string
                  team_sid:
                    type: string
                  playtable_sids:
                    type: array
                    items:
                      type: string
                    description: >-
                      Member tables (pt_tb_…) - MULTI membership;
                      service-managed (create/import union, detach /
                      table-delete pull); may be empty. Filtering/counting on it
                      is ES-served.
                  data_source_sid:
                    type: string
                    nullable: true
                  data_source_type:
                    type: string
                    nullable: true
                  data_source_item_sid:
                    type: string
                    nullable: true
                  ln_id:
                    type: string
                    nullable: true
                    description: Numeric LinkedIn company id - strongest dedup key.
                  ln_nickname:
                    type: string
                    nullable: true
                    description: >-
                      The company page vanity slug (acme-corp), lowercased; a
                      page URL is reduced to it on write, never stored
                      (SERVICE_CONVENTIONS §Y). Dedup key #2.
                  context:
                    type: object
                    nullable: true
                    properties:
                      name:
                        type: string
                        nullable: true
                      picture_url:
                        type: string
                        nullable: true
                        description: >-
                          The logo: a permanent copy over a wire link; null =
                          the reader falls back to the domain favicon.
                      website:
                        type: string
                        nullable: true
                        description: >-
                          The full URL a source gave; domain on the row stays
                          the identifier.
                      sources:
                        type: object
                        additionalProperties:
                          type: object
                          properties:
                            kind:
                              type: string
                              enum:
                                - data_source_item
                                - file_record
                                - enrichment_cell
                                - participant
                                - connection
                                - profile_read
                                - duplicate_record
                                - manual
                                - legacy_column
                              description: >-
                                Who said it. A manual word stands until reset;
                                profile_read, enrichment_cell, participant,
                                connection, data_source_item and
                                duplicate_record (a LinkedIn-shaped record
                                another source brought) saw LinkedIn and rank
                                next, newest first; file_record (a CSV or a
                                webhook) and legacy_column (what the dropped
                                column held, backfilled) come last.
                            observed_at:
                              type: string
                              nullable: true
                              description: >-
                                When the source saw it (ISO 8601); null for a
                                column with no clock.
                          required:
                            - kind
                            - observed_at
                        description: Per resolved key, where it came from and when.
                    required:
                      - name
                      - picture_url
                      - website
                      - sources
                    description: >-
                      DERIVED and read-only (CONTEXT_FIELDS_RESEARCH.md section
                      5): the name, the logo and the website a surface or a
                      model shows next to the row, resolved at read from the
                      observations ledger with the same precedence as a
                      person's. The only place these words are: the row keeps
                      identifiers (phase E, 2026-10-22).
                  domain:
                    type: string
                    nullable: true
                    description: >-
                      Lowercased apex domain; derived from website when absent;
                      dedup key #3.
                  deal_size:
                    type: number
                    nullable: true
                    description: >-
                      Deal value attached to the account (decimal 15,2) - the
                      one client-writable business column.
                  status:
                    type: string
                    enum:
                      - ok
                      - failed_validation
                      - duplicate
                      - stoplisted
                    description: >-
                      Service-managed (import validation, stoplist); not
                      client-writable.
                  status_reason:
                    type: string
                    nullable: true
                    description: >-
                      Human-readable context for the current status (validation
                      error, matched stoplist identifier); service-written
                      together with status. A duplicate carries none: its
                      pointer is duplicate_of_sid.
                  duplicate_of_sid:
                    type: string
                    nullable: true
                    description: >-
                      While status is duplicate: the PRIMARY account (cr_co_…)
                      this one is a copy of - one primary per group, re-derived
                      on every recheck, swapped by make_company_primary. Null
                      otherwise.
                  duplicate_matched_kind:
                    type: string
                    nullable: true
                    enum:
                      - ln_id
                      - ln_nickname
                      - domain
                    description: >-
                      While status is duplicate: the identity column the late
                      write collided on. Null otherwise.
                  tag_sids:
                    type: array
                    nullable: true
                    items:
                      type: string
                  external_refs:
                    anyOf:
                      - type: object
                        additionalProperties:
                          type: string
                      - type: array
                        items: {}
                      - {}
                    description: >-
                      Free-form CRM sync hook ({ hubspot_company_id: "902", …
                      }); keys are integration-defined, stored as-is,
                      round-tripped, never validated; PHP empty map serialises
                      as [].
                  last_enrich_at:
                    type: string
                    nullable: true
                    description: >-
                      ISO 8601 UTC; stamped when an enrichment cycle completes -
                      drives enrichment scheduling.
                  deleted_by:
                    type: object
                    nullable: true
                    properties:
                      actor_type:
                        type: string
                        enum:
                          - user
                          - support
                          - api_key
                          - system
                          - agent
                      actor_sid:
                        type: string
                        nullable: true
                      team_sid:
                        type: string
                      actor_name:
                        type: string
                        nullable: true
                        description: >-
                          The OAuth client that acted ("Claude", "n8n"); null
                          for a user, an API key or a system job.
                      oauth_client_sid:
                        type: string
                        nullable: true
                        description: >-
                          The acting OAuth client (id_oc_*); null off the OAuth
                          path.
                      reason:
                        type: string
                        nullable: true
                        description: >-
                          Why a system actor wrote the row
                          (snapshot_capture_job, ...); null otherwise.
                      permissions:
                        type: object
                        additionalProperties: {}
                        description: >-
                          Internal audit context: the grant set the actor held
                          at write time. Not a contract.
                      cluster_id:
                        type: integer
                        nullable: true
                        description: >-
                          Internal audit context: the cluster that served the
                          write.
                      trace_id:
                        type: string
                        nullable: true
                        description: >-
                          Internal audit context: the trace id of the request
                          that wrote the row.
                    required:
                      - actor_type
                      - actor_sid
                      - team_sid
                      - permissions
                  created_at:
                    type: string
                  updated_at:
                    type: string
                  deleted_at:
                    type: string
                    nullable: true
                  pipeline_stage_sid:
                    type: string
                    nullable: true
                    description: >-
                      The funnel stage the company is in (cr_ps_...): derived
                      from its people unless pinned (pipeline_stages.md); null =
                      no stage.
                  pipeline_stage_source:
                    type: string
                    nullable: true
                    enum:
                      - derived
                      - manual
                    description: >-
                      How the stage was set (CompanyPipelineStageSourceEnum):
                      derived from the people, or pinned by a manual move;
                      reset_pipeline_stages_derivation drops the pin. Null with
                      no stage.
                required:
                  - sid
                  - team_sid
                  - playtable_sids
                  - data_source_sid
                  - data_source_type
                  - data_source_item_sid
                  - ln_id
                  - ln_nickname
                  - context
                  - domain
                  - deal_size
                  - status
                  - status_reason
                  - duplicate_of_sid
                  - duplicate_matched_kind
                  - tag_sids
                  - external_refs
                  - last_enrich_at
                  - deleted_by
                  - created_at
                  - updated_at
                  - deleted_at
                  - pipeline_stage_sid
                  - pipeline_stage_source
              included:
                type: object
                properties:
                  people_counts:
                    type: object
                    properties:
                      total_count:
                        type: integer
                        minimum: 0
                    required:
                      - total_count
                    description: >-
                      PeopleCounts aggregate over the company's linked people
                      (legacy leads-summary widget); FK auto-injected
                      (people.company_sid = parent.sid), no other filters pass -
                      see ./people.md.
                  field_values:
                    type: array
                    items:
                      type: object
                      properties:
                        sid:
                          type: string
                      required:
                        - sid
                    description: >-
                      Trimmed cell projection (value, status, cost, finished_at
                      - no meta.steps) across ALL member playtables; each row
                      carries its playtable_sid. Order: playtable_sid, then
                      field position. Full trace = playtable-field-values get -
                      see ./playtable_field_values.md.
                  last_activities:
                    type: array
                    items:
                      type: object
                      properties:
                        sid:
                          type: string
                      required:
                        - sid
                    description: >-
                      ActivityDomain rows (1:N, limit 20, occurred_at DESC) -
                      see ./activities.md.
                  notes:
                    type: array
                    items:
                      type: object
                      properties:
                        sid:
                          type: string
                      required:
                        - sid
                    description: >-
                      NoteDomain rows (1:N, limit 20, created_at DESC) - see
                      ./notes.md.
                  signals:
                    type: array
                    items:
                      type: object
                      properties:
                        key:
                          type: string
                          enum:
                            - awaiting_reply
                            - opened_not_replied
                            - clicked_not_replied
                            - multi_opened
                            - accepted_not_replied
                            - note_read_not_replied
                            - reacted_not_replied
                            - invited_us
                            - followed_us
                            - lead_messaged_first
                            - unanswered_inbound
                            - draft_pending
                            - escalated_open
                            - task_overdue
                            - went_quiet
                            - reactivated
                            - invite_pending
                            - connection_removed
                            - blocked_us
                            - deleted_message
                            - bounced
                            - bounced_hard
                            - complained
                            - booking_link_sent
                            - objective_reached
                            - viewed_our_profile
                            - visited_our_site
                            - visited_not_replied
                            - visited_key_page
                            - multi_visited
                            - submitted_form
                            - company_visited_our_site
                            - no_people
                            - thin_coverage
                            - nobody_reached
                            - no_engagement
                            - no_reply
                            - exhausted
                            - dormant
                            - dm_missing
                          description: >-
                            A catalog signal name. Thread and person names:
                            awaiting_reply (our message is the last),
                            opened_not_replied and clicked_not_replied (our
                            email opened or its link clicked, no reply),
                            multi_opened (3+ opens), accepted_not_replied
                            (invite accepted, nothing after),
                            note_read_not_replied (the accept delivered our
                            invite note, no reply), reacted_not_replied (an
                            emoji on our message, no reply), invited_us (their
                            invitation to us, unanswered), followed_us,
                            lead_messaged_first (an inbound thread),
                            unanswered_inbound, draft_pending (an AI draft
                            awaits approval), escalated_open (handed to a
                            person, task open), task_overdue, went_quiet (they
                            had replied, then nothing), reactivated (an inbound
                            after 30+ quiet days), invite_pending (our invite
                            out, neither accepted nor withdrawn),
                            connection_removed, blocked_us, deleted_message,
                            bounced, bounced_hard (the address is gone),
                            complained, booking_link_sent, objective_reached
                            (the live dialog landed its goal),
                            viewed_our_profile. Website names: visited_our_site,
                            visited_not_replied, visited_key_page (a page the
                            team marked key), multi_visited, submitted_form,
                            company_visited_our_site (someone from the company,
                            nobody recognized; a person's and a company's).
                            Account names, companies only (dormant also a
                            person's): no_people (nobody to work), thin_coverage
                            (under 3 people to work), nobody_reached,
                            no_engagement (touched, nothing came back), no_reply
                            (touched, no reply), exhausted (everyone nurture or
                            negative), dormant (touched once, quiet since),
                            dm_missing (a Wrong Decision Maker named, no
                            positive person left). Tracking facts are private:
                            never tell the lead (submitted_form excepted).
                        since:
                          type: string
                          nullable: true
                          description: >-
                            ISO 8601 UTC: the instant the signal's clock started
                            (our last message, the accept, the reaction...).
                            null when the signal has no clock (draft_pending).
                        age_days:
                          type: integer
                          nullable: true
                          minimum: 0
                          description: >-
                            Whole days since `since`, at read time. null when
                            the signal has no clock.
                      required:
                        - key
                        - since
                        - age_days
                    description: >-
                      The catalog names the account carries right now, evaluated
                      at read time from the ledger: its own website visit
                      (company_visited_our_site) and the account names over its
                      people (ACCOUNT_PLAYS_RESEARCH.md §4.2: no_people,
                      thin_coverage, nobody_reached, no_engagement, no_reply,
                      exhausted, dormant, dm_missing), each with the instant its
                      clock started and its age in days (both null for a stored
                      fact with no clock). Empty when none holds. Read it before
                      deciding where to top up or whom to re-engage.
                  freshness:
                    type: array
                    items:
                      type: object
                      properties:
                        object_sid:
                          type: string
                          description: 'The row: cr_pp_ on a person, cr_co_ on a company.'
                        kind:
                          type: string
                          enum:
                            - profile
                            - company
                            - posts
                          description: >-
                            profile: the LinkedIn profile (a people-tab column
                            over the person). company: the company page (a
                            people-tab column over a company URL on a person; a
                            companies-tab column on a company). posts: the
                            person's posts.
                        read_at:
                          type: string
                          nullable: true
                          description: >-
                            ISO 8601 UTC: the row's last read of this kind,
                            whoever read (the play, a workflow's Run column
                            step, a column's own run, a hand run). null = never
                            read.
                        play_sid:
                          type: string
                          description: >-
                            pt_pl_ the play whose schedule keeps this kind fresh
                            on the row: switched on, daily, its watch names the
                            kind, a column of the row's tab reads the kind, and
                            the row is in its audience (a company is when one of
                            its people is). When several plays cover the row and
                            the kind, the shortest cadence wins.
                        play_name:
                          type: string
                          description: >-
                            The play's name, for "re-read 2 days ago by Keep
                            data fresh".
                        days:
                          type: integer
                          minimum: 0
                          exclusiveMinimum: true
                          description: >-
                            The play's cadence for this kind, in days ("every 7
                            days").
                        next_at:
                          type: string
                          nullable: true
                          description: >-
                            ISO 8601 UTC: read_at plus the cadence, when the
                            schedule reads the row again. null when never read:
                            the next run reads it.
                      required:
                        - object_sid
                        - kind
                        - read_at
                        - play_sid
                        - play_name
                        - days
                        - next_at
                    description: >-
                      The company page's read when a watching play keeps it
                      fresh on the company (a companies-tab column reads it, one
                      of the company's people is in the play's audience): the
                      play, its cadence, the last read and the next. Empty when
                      no switched-on daily play covers the company.
            required:
              - item
              - included
        pagination:
          type: object
          properties:
            next_cursor:
              type: string
              nullable: true
            has_more:
              type: boolean
            total_count:
              type: integer
              nullable: true
          required:
            - next_cursor
            - has_more
            - total_count
        applied_filters:
          type: object
          additionalProperties: {}
        includes:
          type: array
          items:
            type: string
        meta:
          type: object
          properties:
            trace_id:
              type: string
              description: UUID v7; same 128-bit value as the X-Trace-Id header.
            span_id:
              type: string
              pattern: ^[0-9a-f]{16}$
              description: 16 hex chars, root span of this request.
            timestamp:
              type: string
              description: ISO 8601 UTC (Y-m-dTH:i:sZ), response time.
            duration_ms:
              type: integer
              minimum: 0
              description: Server-side wall clock.
            team_sid:
              type: string
              nullable: true
              description: >-
                The team this call ran in (the token team, or the team_sid
                override). Null when unauthenticated; absent from pre-2026-08-20
                backends.
            actor_type:
              type: string
              nullable: true
              description: >-
                user | agent | api_key | system. Null when unauthenticated;
                absent from pre-2026-08-20 backends.
          required:
            - trace_id
            - span_id
            - timestamp
            - duration_ms
        counts:
          type: object
          properties:
            total_count:
              type: integer
              minimum: 0
              description: Company rows matching the filter scope.
            with_linkedin_count:
              type: integer
              minimum: 0
              description: >-
                Rows where ln_id IS NOT NULL OR ln_nickname IS NOT NULL -
                multi-column OR, no group axis covers it.
            with_domain_count:
              type: integer
              minimum: 0
              description: >-
                Rows where domain IS NOT NULL - filterable but not groupable
                column.
            groups:
              type: object
              properties:
                status:
                  anyOf:
                    - type: object
                      additionalProperties:
                        type: integer
                        minimum: 0
                    - type: array
                      items: {}
                  description: Rows per CompanyStatusEnum value (3 values, bounded).
                playtable_sids:
                  anyOf:
                    - type: object
                      additionalProperties:
                        type: integer
                        minimum: 0
                    - type: array
                      items: {}
                  description: >-
                    Rows per member table (pt_tb_… keys); a company counts once
                    per member table.
                data_source_sid:
                  anyOf:
                    - type: object
                      additionalProperties:
                        type: integer
                        minimum: 0
                    - type: array
                      items: {}
                  description: Rows per provenance source (ds_sc_… keys).
                signals:
                  anyOf:
                    - type: object
                      additionalProperties:
                        type: integer
                        minimum: 0
                    - type: array
                      items: {}
                  description: >-
                    Rows per signal name the account carries at the catalog's
                    default threshold, present names only (a filters
                    aggregation, not a terms axis): how many accounts of the
                    scope read no_engagement, exhausted, dm_missing and the
                    rest, in one page_size:0 call (ACCOUNT_PLAYS_RESEARCH.md
                    §4.4: the chips over the Companies grid, Creator's brief).
              required:
                - status
                - playtable_sids
                - data_source_sid
                - signals
          required:
            - total_count
            - with_linkedin_count
            - with_domain_count
            - groups
      required:
        - success
        - operation
        - items
        - pagination
        - applied_filters
        - includes
        - meta
    McpError:
      type: object
      properties:
        success:
          type: boolean
          enum:
            - false
        error:
          type: object
          properties:
            code:
              type: string
              enum:
                - validation_failed
                - nothing_to_update
                - not_found
                - relation_not_found
                - invalid_transition
                - limit_exceeded
                - payment_required
                - duplicate_rejected
                - conflict
                - delete_blocked
                - unauthorized
                - forbidden
                - rate_limited
                - internal_error
                - service_unavailable
                - not_implemented
            message:
              type: string
            recoverable:
              type: boolean
            suggestion:
              type: string
            field_errors:
              type: object
              additionalProperties:
                type: array
                items:
                  type: object
                  properties:
                    rule:
                      type: string
                    message:
                      type: string
                  required:
                    - rule
                    - message
            blockers:
              type: array
              items:
                type: object
                properties:
                  type:
                    type: string
                    description: >-
                      Machine-readable blocker type (active_flow, pending_tasks,
                      …).
                  severity:
                    type: string
                    enum:
                      - hard
                      - soft
                    description: >-
                      hard = external action required; soft = acknowledge is
                      enough.
                  description:
                    type: string
                  entity_sid:
                    type: string
                    nullable: true
                  count:
                    type: integer
                  resolution:
                    type: string
                    description: 'Hard: tool name to call. Soft: code for acknowledge[].'
                  resolution_hint:
                    type: string
                required:
                  - type
                  - severity
                  - description
                  - entity_sid
                  - resolution
                  - resolution_hint
            context:
              type: object
              additionalProperties: {}
          required:
            - code
            - message
            - recoverable
        meta:
          type: object
          properties:
            trace_id:
              type: string
              description: UUID v7; same 128-bit value as the X-Trace-Id header.
            span_id:
              type: string
              pattern: ^[0-9a-f]{16}$
              description: 16 hex chars, root span of this request.
            timestamp:
              type: string
              description: ISO 8601 UTC (Y-m-dTH:i:sZ), response time.
            duration_ms:
              type: integer
              minimum: 0
              description: Server-side wall clock.
            team_sid:
              type: string
              nullable: true
              description: >-
                The team this call ran in (the token team, or the team_sid
                override). Null when unauthenticated; absent from pre-2026-08-20
                backends.
            actor_type:
              type: string
              nullable: true
              description: >-
                user | agent | api_key | system. Null when unauthenticated;
                absent from pre-2026-08-20 backends.
          required:
            - trace_id
            - span_id
            - timestamp
            - duration_ms
      required:
        - success
        - error
  responses:
    McpClientError:
      description: >-
        MCP error envelope. `error.code` is one of validation_failed,
        nothing_to_update, not_found, relation_not_found, invalid_transition,
        limit_exceeded, payment_required, duplicate_rejected, conflict,
        delete_blocked, unauthorized, forbidden, rate_limited, not_implemented.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/McpError'
    McpServerError:
      description: >-
        MCP error envelope with `error.code` internal_error or
        service_unavailable.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/McpError'
  securitySchemes:
    BearerJwt:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: >-
        Access token issued by gs.service.id. Its `access_identity` claim
        carries `team_sid`, `actor_sid` and `actor_type`, and that team scope is
        authoritative.
    TeamSid:
      type: apiKey
      in: header
      name: Team-SID
      description: >-
        Team scope for tokens that do not carry one. Ignored when the token
        already names a team.

````

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