---
title: "Workspace performance"
method: POST
path: "/api/playtables/workspace-performance"
tags: ["playtables"]
---

# Workspace performance

`POST /api/playtables/workspace-performance`

## Request

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

How the WHOLE workspace is doing, its Dashboard: every table at once. For the window asked for (days ending today, or a from..to range) and the one before it: the flow of its people and of its accounts over eight steps (added, enrolled in a workflow, reached, engaged, replied, positive, meeting, won), each counted once on the day they first got there, so a reply rate is replied over reached and a change is shown against before; where everyone stands today at each step (here: still in progress; left: gone to a nurture, negative or disqualified stage); the same window counts per table (which table brings replies or meetings); the window's people by source kind and the ones reached per channel; the money open today and won in the window; and the people by stage category at the end of each day. Narrow it with playtable_sids (those tables' people and accounts) or sender_profile_sids (the people those sender profiles first touched or enrolled). Use for "how is outreach going", "is the pipeline growing", "which table works best", "how many people did we reach this week", "how did Julia's outreach go this month". One table's own flow, all time: get_playtable_performance.

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

## Request body

- GetWorkspacePerformanceRequest: Request body of `get_workspace_performance`.
  - `days` integer: The window in the workspace's days, today included (the Dashboard 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.
  - `playtable_sids` string[]: Narrow to these tables: the people homed in them and the accounts of them (a member, or an account one of those people works at). Omit for every table; an unknown sid matches nobody.
  - `sender_profile_sids` string[]: Narrow to the people these sender profiles work: whose first touch (invite, message, InMail or email) went out from one of them, or with a workflow record pinned to one. Enrolled then dates by that record; the accounts kept are theirs.

## Response `200`

`action` success envelope.

- GetWorkspacePerformanceResponse
  - `success` true, required
  - `operation` 'action', required
  - `action` string, required: kebab-case verb; matches the route segment.
  - `item` unknown, required
  - `result` object, 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.
    - `scope` object, required: What the answer was narrowed to, as asked, each list once per sid; an empty list is no scope on that axis.
      - `playtable_sids` string[], required
      - `sender_profile_sids` string[], required
    - `steps` string[], required: The eight steps, in order.
    - `flow` object, required
      - `people` object, required
        - `shown` object, required: The window asked for: each person (or account) once per step, on the day they first got there.
          - `added` integer, required: Rows created (people), or accounts created.
          - `enrolled` integer, required: First entered a workflow.
          - `reached` integer, required: First touched: a connection request, a message, an InMail or an email went out.
          - `engaged` integer, required: First accepted our invite or replied.
          - `replied` integer, required: First replied at or after the first touch.
          - `positive` integer, required: First moved into a positive stage.
          - `meeting` integer, required: First moved into Meeting Requested, Meeting Scheduled or Closed-Won.
          - `won` integer, required: First moved into Closed-Won.
        - `before` object, required: The same for the window before it: the base of a change.
          - `added` integer, required: Rows created (people), or accounts created.
          - `enrolled` integer, required: First entered a workflow.
          - `reached` integer, required: First touched: a connection request, a message, an InMail or an email went out.
          - `engaged` integer, required: First accepted our invite or replied.
          - `replied` integer, required: First replied at or after the first touch.
          - `positive` integer, required: First moved into a positive stage.
          - `meeting` integer, required: First moved into Meeting Requested, Meeting Scheduled or Closed-Won.
          - `won` integer, required: First moved into Closed-Won.
        - `now` object[], required: Where everyone stands today, one row per step in order.
          - `key` 'added' | 'enrolled' | 'reached' | 'engaged' | 'replied' | 'positive' | 'meeting' | 'won', required
          - `here` integer, required: Whose furthest step this is and who is still in progress there (not on an exit stage).
          - `left` integer, required: Whose furthest step this is and who left from it to a nurture, negative or disqualified stage.
      - `accounts` object, required: Every account of the workspace: an account got as far as its furthest person, on the day the first of them did, and left when its own stage is an exit.
        - `shown` object, required: The window asked for: each person (or account) once per step, on the day they first got there.
          - `added` integer, required: Rows created (people), or accounts created.
          - `enrolled` integer, required: First entered a workflow.
          - `reached` integer, required: First touched: a connection request, a message, an InMail or an email went out.
          - `engaged` integer, required: First accepted our invite or replied.
          - `replied` integer, required: First replied at or after the first touch.
          - `positive` integer, required: First moved into a positive stage.
          - `meeting` integer, required: First moved into Meeting Requested, Meeting Scheduled or Closed-Won.
          - `won` integer, required: First moved into Closed-Won.
        - `before` object, required: The same for the window before it: the base of a change.
          - `added` integer, required: Rows created (people), or accounts created.
          - `enrolled` integer, required: First entered a workflow.
          - `reached` integer, required: First touched: a connection request, a message, an InMail or an email went out.
          - `engaged` integer, required: First accepted our invite or replied.
          - `replied` integer, required: First replied at or after the first touch.
          - `positive` integer, required: First moved into a positive stage.
          - `meeting` integer, required: First moved into Meeting Requested, Meeting Scheduled or Closed-Won.
          - `won` integer, required: First moved into Closed-Won.
        - `now` object[], required: Where everyone stands today, one row per step in order.
          - `key` 'added' | 'enrolled' | 'reached' | 'engaged' | 'replied' | 'positive' | 'meeting' | 'won', required
          - `here` integer, required: Whose furthest step this is and who is still in progress there (not on an exit stage).
          - `left` integer, required: Whose furthest step this is and who left from it to a nurture, negative or disqualified stage.
    - `series` object[], required: People, 2 x days days, oldest first: the window before the shown one, then the shown one.
      - `added` integer, required: Rows created (people), or accounts created.
      - `enrolled` integer, required: First entered a workflow.
      - `reached` integer, required: First touched: a connection request, a message, an InMail or an email went out.
      - `engaged` integer, required: First accepted our invite or replied.
      - `replied` integer, required: First replied at or after the first touch.
      - `positive` integer, required: First moved into a positive stage.
      - `meeting` integer, required: First moved into Meeting Requested, Meeting Scheduled or Closed-Won.
      - `won` integer, required: First moved into Closed-Won.
      - `date` string, required: The workspace's calendar day, YYYY-MM-DD.
    - `added` object, required
      - `by_source_type` object, required: The window's people by the kind of source that added them (ai_search, sender_search, find_people, csv, webhook; manual = by hand).
      - `sources_count` integer, required: How many sources added someone in the window, by hand counted as one.
    - `reached` object, required
      - `by_channel` object, required
        - `linkedin` integer, required: People whose first LinkedIn touch fell in the window.
        - `email` integer, required: People whose first email fell in the window; a person on both channels counts in each.
    - `engaged` object, required
      - `accepted` integer, required: People who first accepted our invite in the window.
    - `tables` object[], required: The window's people counts per table, the most positive first.
      - `added` integer, required: Rows created (people), or accounts created.
      - `enrolled` integer, required: First entered a workflow.
      - `reached` integer, required: First touched: a connection request, a message, an InMail or an email went out.
      - `engaged` integer, required: First accepted our invite or replied.
      - `replied` integer, required: First replied at or after the first touch.
      - `positive` integer, required: First moved into a positive stage.
      - `meeting` integer, required: First moved into Meeting Requested, Meeting Scheduled or Closed-Won.
      - `won` integer, required: First moved into Closed-Won.
      - `playtable_sid` string, required: Playtable sid (pt_tb_…).
      - `won_value` number, required: The deal sizes of the accounts won through this table's people in the window.
    - `money` object, required
      - `open_value` number, required: Deal sizes of the accounts at Positive or Meeting, not won, not on an exit stage, today.
      - `open_accounts` integer, required
      - `open_unpriced_accounts` integer, required: Of the open accounts, the ones without a deal size.
      - `won_value` number, required: Deal sizes of the accounts won in the window.
      - `won_accounts` integer, required
      - `won_value_before` number, required: The same for the window before.
      - `won_accounts_before` integer, required
    - `stages_by_day` object[], required: The people by stage category at the end of each day of the window, oldest first: today's stages walked back through the stage moves.
      - `date` string, required
      - `cold` integer, required: Everyone alive that day on no other category: a cold stage, or no stage.
      - `approaching` integer, required
      - `engaging` integer, required
      - `positive` integer, required
      - `nurture` integer, required
      - `negative` integer, required
      - `disqualified` 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)
