get_pass_roster
A project's members against the dates its pass plans sell — who holds which date, where each stands on it, and who was moved from where when a date was cancelled.
Read the Pass Roster the dashboard draws, as a page of rows: one row per member holding a date within the span, with their standing on every date they hold and the cancelled dates they were moved off. It is the tool for "who is on Saturday", "who was rolled over from Thursday and to where", and "who still has not joined the queue".
The columns ride under meta.dates, the dates beyond the span that holders were moved onto
under meta.moved_to_dates, so a departure always names a date you can read, and every move
off a column folded by destination under meta.relocations, so "twelve moved from Thursday
to the following Thursday" is one line rather than twelve rows.
The span is eight weeks either side of now unless you say otherwise
from and to narrow or widen the span; a date is a column when it ends after
from and starts before to. plan_id keeps to one plan's dates and holders,
and a search text keeps the members whose name or email contains it, as the
page's own filters do.
The standings are the roster's words: in (admitted), queued (in the join queue, admitted
when the date opens), holds (bought and not in the queue yet, the one to nudge), missed
(held and never joined once the date ran), ended (the date ended or access was taken away)
and covered (held through another purchase as well, which is the one that admits them).
Requires ability
The token behind the MCP session must hold it, or the call is refused with TOKEN_MISSING_ABILITY.
Runs the same action as
The REST endpoint and this tool share one action, so validation, permissions and events are identical.
Annotations
It reads and never changes anything.
Arguments
project_id*stringUUID of the project whose roster to read.
plan_idstringoptionalUUID of one pass or series plan of the project, to keep to its dates and holders.
searchstringoptionalKeep the members whose name or email contains this text (up to 100 characters).
fromstringoptionalISO-8601 instant: only dates ending at or after it are columns. Eight weeks before now when omitted.
tostringoptionalISO-8601 instant: only dates starting at or before it are columns. Eight weeks after now when omitted.
limitintegeroptionalMaximum rows to return per page (1..100).
1max100pageintegeroptional1-indexed page number.
1What it returns
{ "data": [ { "member": { "id": "2a91c4e7-6f38-4b52-8e0d-9c1a7b3f5d80", "project_id": "7f3d1c92-8b45-4e6a-9d21-5c8e0a4b6f13", "name": "Gus Moved", "email": "gus@example.com", "status": "customer" }, "dates": [ { "window_id": "3d5a8c72-b016-4e94-8fa7-61c209d4e738", "standing": "holds", "claim_id": "c1f2e3d4-5a6b-4c7d-8e9f-0a1b2c3d4e5f", "subscription_id": "5b7e2d40-1a86-4c39-97f2-e83d0b16c5a4", "plan_name": "Thursday Football Pass", "from_series": false, "moved_from_window_id": "9c1f4e27-5a8b-4d63-b2e0-8f7a6c5d4e31", "last_reminded_at": null } ], "departures": [ { "window_id": "9c1f4e27-5a8b-4d63-b2e0-8f7a6c5d4e31", "to_window_id": "3d5a8c72-b016-4e94-8fa7-61c209d4e738", "reason": "window_cancelled", "moved_at": "2026-11-06T09:15:02+00:00", "move_id": "0f9e8d7c-6b5a-4f3e-9d2c-1b0a9f8e7d6c" } ] } ], "meta": { "page": 1, "limit": 25, "total": 1, "has_more": false, "span": { "from": "2026-09-11T12:00:00+00:00", "to": "2027-01-01T12:00:00+00:00" }, "dates": [ { "id": "9c1f4e27-5a8b-4d63-b2e0-8f7a6c5d4e31", "plan_id": "c4e82f16-93a7-4d5b-b81c-6e0f27a94d3b", "plan_name": "Thursday Football Pass", "starts_at": "2026-11-05T21:30:00+00:00", "ends_at": "2026-11-06T06:00:00+00:00", "timezone": "America/Chicago", "local_range": "Thu 5 Nov 2026, 15:30 – Fri 6 Nov, 00:00 CST", "status": "canceled" } ], "moved_to_dates": [], "relocations": [ { "from_window_id": "9c1f4e27-5a8b-4d63-b2e0-8f7a6c5d4e31", "to_window_id": "3d5a8c72-b016-4e94-8fa7-61c209d4e738", "count": 12, "last_moved_at": "2026-11-06T09:15:02+00:00" } ] }}| Field | Type | Notes |
|---|---|---|
member | object | A summary: id, name, address and status. get_subscriber has the rest. |
dates[].window_id | string UUID | The date, one of meta.dates or meta.moved_to_dates. |
dates[].standing | string | in, queued, holds, missed, ended or covered. |
dates[].moved_from_window_id | string UUID | The date the claim last came from; null when it never moved. |
departures[].to_window_id | string UUID | The date the member was moved to; null when their pass was ended instead. |
departures[].reason | string | window_cancelled, series_date_substituted or paid_after_window. |
meta.relocations[].count | integer | How many holders made that hop, across every member, not only the page. |
meta.dates is the slim column shape: for whether a date is still on sale and how many hold
it, read it with get_pass_window by its id.
How it fails
VALIDATION_FAILEDfrom or to is not an ISO-8601 instant.
RESOURCE_NOT_FOUNDunknown project_id or plan_id, a plan of another project, or a project outside the token's scope.
AUTHENTICATION_REQUIREDno authenticated user on the request.
TOKEN_MISSING_ABILITYtoken lacks project-user:view-any.
How is this guide?
Last updated on
get_broadcast
Read one broadcast by the id the send answered with, with its tallies, the sentence the creator reads, the failures by reason and the first fifty members it could not reach.
get_subscriber
One project member by UUID, in the list_subscribers row shape. Returns two email addresses verbatim — scrub before forwarding.