Get bulk plays for a series or puzzle
GET/api/v2/analytics/plays
Retrieves play-by-play data in bulk across all users for a series or for a specific puzzle. Intended for high-throughput bulk pulls (data exports, downstream analytics pipelines, dashboards).
For per-user play history, use the separate /api/v2/plays endpoint, which accepts a
userId parameter. User-scoped retrieval is not supported on this endpoint.
Supported Modes:
Determined by the presence of the puzzleId query parameter:
- All plays in a series: omit
puzzleId— returns every play across every puzzle in the series. - All plays for a single puzzle: include
puzzleId— returns every user's play on that puzzle.
Puzzle Type Support:
- Grid Games (Crossword, Codeword, KrissKross, Sudoku): Box completion statistics
- Quiz Games: Question attempt statistics
- Word Search & Word Flower: Word finding progress
- Jigsaw: Piece placement progress
Time Range Filtering:
- Use
from(inclusive) and/orto(inclusive) to filter plays by start time (startedAt, ISO 8601 format). - If neither is provided, all plays are considered.
- If only
fromis provided, plays from that time onwards are considered. - If only
tois provided, plays up to that time are considered. - If both are provided, plays between
fromandto(inclusive) are considered.
Pagination and Ordering:
Results are paginated with the limit and offset query parameters and are ordered by startedAt in descending order (most recent starts first).
Parameter limit (integer) specifies the maximum number of plays to return per request (default 1000, maximum 1000) and offset denotes the number of plays to skip (in the descending order of startedAt) before starting to return results. To retrieve all the plays using this endpoint:
- Call the endpoint with
offset=0. - Process the returned plays.
- If the
hasMorefield is set totrue, request the next page by increasingoffsetbylimit. - Repeat step 3 until a response returns
hasMorefield as false, indicating there are no more results.
User Info (Lead-Generation Fields):
Set getUserInfo=true to include a userInfo object on each play, containing the
lead-generation fields (field_1, field_2, field_3) collected for that user.
User info is returned only when the account is configured to collect user information;
otherwise the userInfo field is omitted from each play.
Examples:
All plays in a series:
curl -L 'http://localhost:8080/pmm-dev/api/v2/analytics/plays?series=demo-api' \
-H 'Authorization: Bearer YOUR_JWT_TOKEN' \
-H 'Accept: application/json'
All plays for a single puzzle:
curl -L 'http://localhost:8080/pmm-dev/api/v2/analytics/plays?series=demo-api&puzzleId=123ba400' \
-H 'Authorization: Bearer YOUR_JWT_TOKEN' \
-H 'Accept: application/json'
Plays in a series with user info:
curl -L 'http://localhost:8080/pmm-dev/api/v2/analytics/plays?series=demo-api&getUserInfo=true' \
-H 'Authorization: Bearer YOUR_JWT_TOKEN' \
-H 'Accept: application/json'
Request
Responses
- 200
- 400
- 401
- 403
- 500
Bulk list of plays for the requested series or puzzle.
Each play includes common fields and a playProgress object containing
puzzle type specific statistics and progress information.
Bad request. Possible errorCode values for this endpoint:
INVALID_PARAMETER(116) — generic input validation; conditions include:seriesis missing.fromortois provided but not in ISO 8601 format. (Each is independently optional; supplying only one is allowed and the other defaults.)- Both
fromandtoare provided andfromis later thanto. puzzleIdis malformed.
Caller is not authenticated.
Possible errorCode values:
UNAUTHENTICATED_ACCESS(108) — noAuthorizationheader presented.EXPIRED_TOKEN(98) — bearer token expired.INVALID_TOKEN(99) — bearer token malformed or signature invalid.
Forbidden. Returned when the caller does not have access to the requested series, or when
the caller attempts a user-scoped lookup by passing userId (not supported on this endpoint;
use /api/v2/plays for per-user history). Possible errorCode values for this endpoint:
NO_ACCESS_TO_SET(84) — caller has no access to the requested series, or attempted a user-scoped scenario which is not open to API token callers on this endpoint.
An internal server error occurred while processing the request.
Possible errorCode values include IO_FAILURE (128) and other internal failures.