> ## 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 people

> People: every table view is this tool with filter playtable_sid. Filter statuses, channel coverage (work_email is_null), tags, named signals [{key}]: clicked_not_replied, accepted_not_replied (accepted our invite, got nothing), not the activity feed. q is free text over name, company, emails, LinkedIn; profile content is cells (filter_ast); include field_values renders them. page_size 0 = counts, counts.groups.signals per signal. Fresh writes lag ES seconds: get_person reads your writes.

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



## OpenAPI

````yaml /api-reference/playtables/openapi.yaml post /api/people/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/people/search:
    post:
      tags:
        - people
      summary: Search people
      description: >-
        People: every table view is this tool with filter playtable_sid. Filter
        statuses, channel coverage (work_email is_null), tags, named signals
        [{key}]: clicked_not_replied, accepted_not_replied (accepted our invite,
        got nothing), not the activity feed. q is free text over name, company,
        emails, LinkedIn; profile content is cells (filter_ast); include
        field_values renders them. page_size 0 = counts, counts.groups.signals
        per signal. Fresh writes lag ES seconds: get_person reads your writes.


        Contract:

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

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

        - Flags: read only.
      operationId: search_people
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SearchPeopleRequest'
      responses:
        '200':
          description: '`search` success envelope.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SearchPeopleResponse'
        4XX:
          $ref: '#/components/responses/McpClientError'
        5XX:
          $ref: '#/components/responses/McpServerError'
components:
  schemas:
    SearchPeopleRequest:
      type: object
      description: Request body of `search_people`.
      properties:
        filter:
          type: object
          properties:
            sid:
              type: object
              properties:
                eq:
                  type: string
                  minLength: 18
                  maxLength: 18
                  pattern: ^cr_pp_
                  description: Person sid (cr_pp_…).
                in:
                  type: array
                  items:
                    type: string
                    minLength: 18
                    maxLength: 18
                    pattern: ^cr_pp_
                    description: Person sid (cr_pp_…).
              additionalProperties: false
              description: Prefix-validated cr_pp_ sid(s).
            playtable_sid:
              type: object
              properties:
                eq:
                  type: string
                  minLength: 18
                  maxLength: 18
                  pattern: ^pt_tb_
                in:
                  type: array
                  items:
                    type: string
                    minLength: 18
                    maxLength: 18
                    pattern: ^pt_tb_
              additionalProperties: false
              description: 'THE table context - every table view passes { eq: <table> }.'
            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 stage's funnel bucket (one of seven), expanded on the server
                into the team's person stage sids of those categories: ask by
                name, never resolve stages. eq approaching = we reached out,
                nothing came back; in [engaging, positive] = something came
                back.
            company_sid:
              type: object
              properties:
                eq:
                  type: string
                  minLength: 18
                  maxLength: 18
                  pattern: ^cr_co_
                in:
                  type: array
                  items:
                    type: string
                    minLength: 18
                    maxLength: 18
                    pattern: ^cr_co_
                is_null:
                  type: boolean
              additionalProperties: false
            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.
            status:
              type: object
              properties:
                eq:
                  type: string
                  enum:
                    - ok
                    - failed_validation
                    - no_contact_data
                    - duplicate
                    - stoplisted
                ne:
                  type: string
                  enum:
                    - ok
                    - failed_validation
                    - no_contact_data
                    - duplicate
                    - stoplisted
                in:
                  type: array
                  items:
                    type: string
                    enum:
                      - ok
                      - failed_validation
                      - no_contact_data
                      - duplicate
                      - stoplisted
                nin:
                  type: array
                  items:
                    type: string
                    enum:
                      - ok
                      - failed_validation
                      - no_contact_data
                      - duplicate
                      - stoplisted
              additionalProperties: false
            duplicate_of_sid:
              type: object
              properties:
                eq:
                  type: string
                  minLength: 18
                  maxLength: 18
                  pattern: ^cr_pp_
                  description: Person sid (cr_pp_…).
                in:
                  type: array
                  items:
                    type: string
                    minLength: 18
                    maxLength: 18
                    pattern: ^cr_pp_
                    description: Person sid (cr_pp_…).
                is_null:
                  type: boolean
              additionalProperties: false
              description: >-
                The copies of a primary: { eq: <primary sid> }. is_null:true =
                rows that are not flagged duplicates.
            linkedin_status:
              type: object
              properties:
                eq:
                  type: string
                  enum:
                    - need_enrichment
                    - enrichment_failed
                    - no_data
                    - blocked
                    - ok
                ne:
                  type: string
                  enum:
                    - need_enrichment
                    - enrichment_failed
                    - no_data
                    - blocked
                    - ok
                in:
                  type: array
                  items:
                    type: string
                    enum:
                      - need_enrichment
                      - enrichment_failed
                      - no_data
                      - blocked
                      - ok
                nin:
                  type: array
                  items:
                    type: string
                    enum:
                      - need_enrichment
                      - enrichment_failed
                      - no_data
                      - blocked
                      - ok
              additionalProperties: false
            email_status:
              type: object
              properties:
                eq:
                  type: string
                  enum:
                    - need_search
                    - no_data
                    - bounced
                    - ok
                    - catch_all
                    - unverified
                ne:
                  type: string
                  enum:
                    - need_search
                    - no_data
                    - bounced
                    - ok
                    - catch_all
                    - unverified
                in:
                  type: array
                  items:
                    type: string
                    enum:
                      - need_search
                      - no_data
                      - bounced
                      - ok
                      - catch_all
                      - unverified
                nin:
                  type: array
                  items:
                    type: string
                    enum:
                      - need_search
                      - no_data
                      - bounced
                      - ok
                      - catch_all
                      - unverified
                is_null:
                  type: boolean
              additionalProperties: false
            phone_status:
              type: object
              properties:
                eq:
                  type: string
                  enum:
                    - need_search
                    - no_data
                    - ok
                ne:
                  type: string
                  enum:
                    - need_search
                    - no_data
                    - ok
                in:
                  type: array
                  items:
                    type: string
                    enum:
                      - need_search
                      - no_data
                      - ok
                nin:
                  type: array
                  items:
                    type: string
                    enum:
                      - need_search
                      - no_data
                      - ok
                is_null:
                  type: boolean
              additionalProperties: false
            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 semantics (any of) - in matches rows whose tag
                array overlaps the list; nin answers the complement, untagged
                rows included.
            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 person, all must hold. The server
                expands a name into its keyword and clock range: never compose
                them. A bare entry takes the catalog default age, age_days moves
                it. A thread-only name is a 422 (ask search_conversations).
            ln_member_id:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
                is_null:
                  type: boolean
              additionalProperties: false
              description: Exact identifier.
            ln_id:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
                is_null:
                  type: boolean
              additionalProperties: false
              description: Exact raw profile URN.
            sn_id:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
                is_null:
                  type: boolean
              additionalProperties: false
              description: Exact raw Sales Navigator URN.
            ln_nickname:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
                is_null:
                  type: boolean
              additionalProperties: false
              description: Exact vanity slug (lowercased); use q for fuzzy.
            work_email:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
                is_null:
                  type: boolean
              additionalProperties: false
              description: is_null:true = coverage gap.
            personal_email:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
                is_null:
                  type: boolean
              additionalProperties: false
            q:
              type: string
              maxLength: 128
              description: >-
                Free text (ES people index) over the resolved name and company
                name, the emails and the slug. Filter a company by company_sid.
            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:
              - company
              - field_values
              - workflow_records
              - last_activities
              - notes
              - engagement
              - engagement_by_sender
              - 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
                    - full_name
                    - company_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 view filter AST, ANDed with filter: typed leaves (attributes,
            record.<slug> cells, journeys), a signals leaf (names the person
            carries) and company_signals (people whose ACCOUNT carries any of
            the account names; ne / nin = none; max 10000 accounts).
        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.
    SearchPeopleResponse:
      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_sid:
                    type: string
                    description: >-
                      pt_tb_… - the SINGLE playtable membership;
                      service-managed, changes only via move (create
                      on_duplicate:move / run type move).
                  data_source_sid:
                    type: string
                    nullable: true
                  data_source_item_sid:
                    type: string
                    nullable: true
                  company_sid:
                    type: string
                    nullable: true
                  context:
                    type: object
                    nullable: true
                    properties:
                      name:
                        type: string
                        nullable: true
                      first_name:
                        type: string
                        nullable: true
                        description: >-
                          The source's own first name when it gave one, else the
                          first word of name.
                      picture_url:
                        type: string
                        nullable: true
                        description: >-
                          A permanent copy over a wire link, the wire link that
                          lasts longest, an expired one counts as none.
                      role:
                        type: string
                        nullable: true
                        description: >-
                          The title at the company (the Sales Navigator wire's
                          position, the enrichment's).
                      headline:
                        type: string
                        nullable: true
                        description: >-
                          The profile line (the regular and Recruiter wires, the
                          inbox participant, the enrichment).
                      company:
                        type: object
                        nullable: true
                        properties:
                          sid:
                            type: string
                            nullable: true
                            description: >-
                              cr_co_… when the person is linked to an account
                              (the account's own resolved context follows); null
                              = a name that is not an account, an import whose
                              company column resolved to none.
                          name:
                            type: string
                            nullable: true
                          domain:
                            type: string
                            nullable: true
                          picture_url:
                            type: string
                            nullable: true
                          ln_id:
                            type: string
                            nullable: true
                            description: >-
                              The company's LinkedIn id: the linked account's
                              own, else the person's company id as a source or
                              an edit gave it.
                        required:
                          - sid
                          - name
                          - domain
                          - picture_url
                          - ln_id
                      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
                      - first_name
                      - picture_url
                      - role
                      - headline
                      - company
                      - sources
                    description: >-
                      DERIVED and read-only (CONTEXT_FIELDS_RESEARCH.md section
                      5): the name, first name, picture, role, headline and
                      company a surface or a model shows next to the row,
                      resolved at read from the observations ledger: a manual
                      word until reset, then the newest LinkedIn-derived
                      observation, then any other. The only place these words
                      are: the row keeps identifiers (phase E, 2026-10-22). Null
                      only on an event payload.
                  ln_member_id:
                    type: string
                    nullable: true
                  ln_id:
                    type: string
                    nullable: true
                  sn_id:
                    type: string
                    nullable: true
                  recruiter_id:
                    type: string
                    nullable: true
                  work_email:
                    type: string
                    nullable: true
                  personal_email:
                    type: string
                    nullable: true
                  work_phone_number:
                    type: string
                    nullable: true
                  personal_phone_number:
                    type: string
                    nullable: true
                  status:
                    type: string
                    enum:
                      - ok
                      - failed_validation
                      - no_contact_data
                      - duplicate
                      - stoplisted
                    description: >-
                      Service-managed row validity (import validation, stoplist,
                      duplicate detection) - not client-writable.
                  duplicate_of_sid:
                    type: string
                    nullable: true
                    description: >-
                      While status is duplicate: the PRIMARY row (cr_pp_…) this
                      one is a copy of - one primary per group, re-derived on
                      every recheck, swapped by make_person_primary. Null
                      otherwise.
                  duplicate_matched_kind:
                    type: string
                    nullable: true
                    enum:
                      - ln_member_id
                      - ln_id
                      - sn_id
                      - recruiter_id
                      - email
                      - ln_nickname
                      - phone
                    description: >-
                      While status is duplicate: the identifier the check
                      matched on. Null otherwise.
                  linkedin_status:
                    type: string
                    enum:
                      - need_enrichment
                      - enrichment_failed
                      - no_data
                      - blocked
                      - ok
                  email_status:
                    type: string
                    nullable: true
                    enum:
                      - need_search
                      - no_data
                      - bounced
                      - ok
                      - catch_all
                      - unverified
                  phone_status:
                    type: string
                    nullable: true
                    enum:
                      - need_search
                      - no_data
                      - ok
                  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 map (hubspot_contact_id, …) - keys
                      integration-defined, round-tripped as-is; PHP empty map
                      serialises as [].
                  last_enrich_at:
                    type: string
                    nullable: true
                  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 person is in (cr_ps_...), derived
                      from activity or moved by hand (pipeline_stages.md); null
                      = no stage.
                required:
                  - sid
                  - team_sid
                  - playtable_sid
                  - data_source_sid
                  - data_source_item_sid
                  - company_sid
                  - context
                  - ln_member_id
                  - ln_id
                  - sn_id
                  - recruiter_id
                  - work_email
                  - personal_email
                  - work_phone_number
                  - personal_phone_number
                  - status
                  - duplicate_of_sid
                  - duplicate_matched_kind
                  - linkedin_status
                  - email_status
                  - phone_status
                  - tag_sids
                  - external_refs
                  - last_enrich_at
                  - created_at
                  - updated_at
                  - deleted_at
                  - pipeline_stage_sid
              included:
                type: object
                properties:
                  company:
                    type: object
                    nullable: true
                    properties:
                      sid:
                        type: string
                    required:
                      - sid
                    description: CompanyDomain (N:1 via company_sid) - see ./companies.md.
                  field_values:
                    type: array
                    items:
                      type: object
                      properties:
                        sid:
                          type: string
                      required:
                        - sid
                    description: >-
                      PlaytableFieldValueDomain rows - ALL live cells of the
                      person's playtable (the table-row hydration: renders the
                      custom columns), ordered by field position - see
                      ./playtable_field_values.md.
                  workflow_records:
                    type: array
                    items:
                      type: object
                      properties:
                        sid:
                          type: string
                      required:
                        - sid
                    description: >-
                      WorkflowRecordDomain rows in a NON-TERMINAL status only
                      (active memberships; 1:N, limit 20, created_at DESC) - see
                      ./workflow_records.md.
                  last_activities:
                    type: array
                    items:
                      type: object
                      properties:
                        sid:
                          type: string
                      required:
                        - sid
                    description: >-
                      ActivityDomain rows (1:N, limit 20, occurred_at DESC) -
                      the ingested timeline - 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.
                  engagement:
                    type: object
                    properties: {}
                    description: >-
                      The person's engagement counters and dates folded over
                      EVERY fact of the activities ledger (the search document's
                      `engagement` keys, D43: messages sent and received per
                      channel, opens, clicks, invitations sent / accepted /
                      withdrawn, visits, likes, comments, endorsements, bounces,
                      unsubscribes, replies, touches, the last touch and last
                      message with their channel and direction). Every key
                      present: 0 / null until a fact moves it. What the LinkedIn
                      channel and Email channel widget cells draw; shares one
                      read with engagement_by_sender.
                  engagement_by_sender:
                    type: array
                    items:
                      type: object
                      properties:
                        sender_profile_sid:
                          type: string
                      required:
                        - sender_profile_sid
                    description: >-
                      The same counters per sender profile (ub_sp_ sid): the
                      facts whose payload names it. Empty when no fact of the
                      person names a sender profile.
                  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 person carries right now
                      (SIGNALS_RESEARCH.md §5.3: evaluated from the engagement
                      counters across every sender profile), each with the
                      instant its clock started and its age in days. Empty when
                      none holds. Ask it before drafting or deciding a next
                      step; the thread-level names (drafts, escalations, tasks,
                      reactions) are get_conversation's.
                  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: >-
                      Per read kind a watching play keeps fresh on the person
                      (the LinkedIn profile, the company page a people-tab
                      column reads, the posts): the play, its cadence, the last
                      read and the next. One entry per kind at most; empty when
                      no switched-on daily play covers the person. How old a
                      profile read is, and whether the table re-reads it on its
                      own.
            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: People rows matching the filter scope.
            with_email_count:
              type: integer
              minimum: 0
              description: >-
                work_email IS NOT NULL OR personal_email IS NOT NULL
                (multi-column OR).
            with_phone_count:
              type: integer
              minimum: 0
              description: >-
                work_phone_number IS NOT NULL OR personal_phone_number IS NOT
                NULL (multi-column OR).
            with_linkedin_count:
              type: integer
              minimum: 0
              description: >-
                Any LinkedIn identity axis present: ln_member_id, ln_id, sn_id,
                recruiter_id or ln_nickname (multi-column OR).
            with_company_count:
              type: integer
              minimum: 0
              description: company_sid IS NOT NULL (filterable but not groupable column).
            groups:
              type: object
              properties:
                status:
                  anyOf:
                    - type: object
                      additionalProperties:
                        type: number
                    - type: array
                      items: {}
                linkedin_status:
                  anyOf:
                    - type: object
                      additionalProperties:
                        type: number
                    - type: array
                      items: {}
                email_status:
                  anyOf:
                    - type: object
                      additionalProperties:
                        type: number
                    - type: array
                      items: {}
                phone_status:
                  anyOf:
                    - type: object
                      additionalProperties:
                        type: number
                    - type: array
                      items: {}
                playtable_sid:
                  anyOf:
                    - type: object
                      additionalProperties:
                        type: number
                    - type: array
                      items: {}
                data_source_sid:
                  anyOf:
                    - type: object
                      additionalProperties:
                        type: number
                    - type: array
                      items: {}
                signals:
                  anyOf:
                    - type: object
                      additionalProperties:
                        type: number
                    - type: array
                      items: {}
                  description: >-
                    Rows per signal name the person carries at the catalog's
                    default threshold, present names only (a filters
                    aggregation, not a terms axis): how many people of the scope
                    read awaiting_reply, went_quiet, dormant and the rest, in
                    one page_size:0 call (ACCOUNT_PLAYS_RESEARCH.md §4.4: the
                    chips over the People grid).
              required:
                - status
                - linkedin_status
                - email_status
                - phone_status
                - playtable_sid
                - data_source_sid
                - signals
          required:
            - total_count
            - with_email_count
            - with_phone_count
            - with_linkedin_count
            - with_company_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.