---
title: "Playtable performance"
method: POST
path: "/api/playtables/{sid}/performance"
tags: ["playtables"]
---

# Playtable performance

`POST /api/playtables/{sid}/performance`

## Request

- Base URL: `https://beta.getsales.io/playtables/v1`
- URL: `https://beta.getsales.io/playtables/v1/api/playtables/{sid}/performance`
- Auth: HTTP bearer and API key in header `Team-SID`

How ONE table is doing, its Overview. All time: the flow of its people and of its accounts over seven milestones (in_table, reached, engaged, replied, positive, meeting, won), each with how many got at least that far, who sits at it by current stage (here) and who left from it by exit stage (left); the money on its accounts by deal size (open pipeline, won, lost, the accounts without a size counted); its data sources with how far their people got. A person counts at every milestone up to the furthest the ledger or the stages say they reached (a stage stands for its category's milestone; a nurture, negative or disqualified stage is an exit), so the flow narrows by construction. For the window asked for (days ending today, or a from..to range) and the one before it, day by day in the workspace's zone: people added, reached, replied, turned positive, won, and the deal size won; sum each half and compare. Use for "how is this table doing", "where do people drop out", "how much is in the pipeline", "which source works". What happened to whom: search_activities with filter.playtable_sid.

Contract:
- MCP tool `get_playtable_performance`, registry package `mcp.playtables/playtables`, mount `playtables.tables`.
- Operation `action`, response envelope `action`.
- Flags: read only.

## Path parameters

- `sid` string, required: Playtable sid (pt_tb_…).

## Request body

- GetPlaytablePerformanceRequest: Request body of `get_playtable_performance`.
  - `days` integer: The window in the workspace's days, today included (the Overview shows 30 by default; its 24 hours is 1, today). Either this or from + to, never both. The series covers twice as many days: this window and the one before it, to compare against.
  - `from` string: A custom range instead of `days`: its first day, YYYY-MM-DD in the workspace's zone, with `to`.
  - `to` string: The custom range's last day, YYYY-MM-DD, at or after `from` and at most 90 days after it.

## Response `200`

`action` success envelope.

- GetPlaytablePerformanceResponse
  - `success` true, required
  - `operation` 'action', required
  - `action` string, required: kebab-case verb; matches the route segment.
  - `item` unknown, required
  - `result` object, required
    - `sid` string, required
    - `zone` string, required: The workspace's IANA timezone; UTC when it has none.
    - `days` integer, required
    - `from` string, required: The window shown: its first day, YYYY-MM-DD in `zone`.
    - `to` string, required: Its last day, both included.
    - `series` object[], required: 2 x days days, oldest first: the window before the shown one, then the shown one.
      - `date` string, required: The workspace's calendar day, YYYY-MM-DD.
      - `added` integer, required: People whose row was created that day.
      - `reached` integer, required: People first reached that day (a connection request, a message, an InMail or an email went out).
      - `replied` integer, required: People whose first reply at or after the first touch came that day.
      - `positive` integer, required: People first moved into a positive stage that day.
      - `won` integer, required: People first moved into Closed-Won that day.
      - `won_value` number, required: The deal sizes of the accounts whose first person was won that day.
    - `flow` object, required
      - `people` object, required
        - `milestones` object[], required
          - `key` 'in_table' | 'reached' | 'engaged' | 'replied' | 'positive' | 'meeting' | 'won', required
          - `count` integer, required: Got at least this far (this step and every step beyond): count(M) = count(M+1) + sum(here) + sum(left).
          - `here` object, required: Whose furthest step this is and who is still in progress, by current pipeline stage sid (cr_ps_; "none" = no stage).
          - `left` object, required: Whose furthest step this is and who left from it, by the exit stage they are on (a nurture, negative or disqualified stage sid).
      - `accounts` object, required: The table's own accounts and every account its people work at: an account got as far as its furthest person in this table and left when its own stage is an exit.
        - `milestones` object[], required
          - `key` 'in_table' | 'reached' | 'engaged' | 'replied' | 'positive' | 'meeting' | 'won', required
          - `count` integer, required: Got at least this far (this step and every step beyond): count(M) = count(M+1) + sum(here) + sum(left).
          - `here` object, required: Whose furthest step this is and who is still in progress, by current pipeline stage sid (cr_ps_; "none" = no stage).
          - `left` object, required: Whose furthest step this is and who left from it, by the exit stage they are on (a nurture, negative or disqualified stage sid).
    - `money` object, required
      - `open_value` number, required: Deal sizes of the accounts at Positive or Meeting, not won, not on an exit stage.
      - `open_accounts` integer, required
      - `open_unpriced_accounts` integer, required: Of the open accounts, the ones without a deal size.
      - `won_value` number, required
      - `won_accounts` integer, required
      - `won_priced_accounts` integer, required
      - `lost_accounts` integer, required: Accounts on a negative stage.
    - `sources` object[], required: The table's data sources, most people first, with how far their people got.
      - `data_source_sid` string, nullable, required: ds_sc_; null = the people added by hand.
      - `people` integer, required
      - `reached` integer, required
      - `engaged` integer, required
      - `replied` integer, required
      - `positive` integer, required
      - `won` integer, required
  - `meta` object, required
    - `trace_id` string, required: UUID v7; same 128-bit value as the X-Trace-Id header.
    - `span_id` string, required: 16 hex chars, root span of this request.
    - `timestamp` string, required: ISO 8601 UTC (Y-m-dTH:i:sZ), response time.
    - `duration_ms` integer, required: Server-side wall clock.
    - `team_sid` string, nullable: 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` string, nullable: user | agent | api_key | system. Null when unauthenticated; absent from pre-2026-08-20 backends.

## Other responses

- `4XX`: 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.
- `5XX`: MCP error envelope with `error.code` internal_error or service_unavailable.

---

[API](https://skmtc.dev/getsales/apis/getsales-public-contract-gs-service-playtables.md) - [All operations](https://skmtc.dev/getsales/apis/getsales-public-contract-gs-service-playtables/llms.txt) - [OpenAPI document](https://skmtc.dev/getsales/apis/getsales-public-contract-gs-service-playtables/revisions/aa394506515d?raw)
