Skip to Content
eventdoordocs home

Pagination

How Eventdoor REST API list operations page their results with a limit and a cursor.

List operations return one page at a time. You choose the page size with limit and move to the next page with cursor.

Query parameters

ParameterTypeDefaultDescription
limitinteger | "all"20Items per page: 1-100, or all for the whole list in one response. An integer out of range is clamped to 1-100, not refused, except 0: 0 or a value that is not a number means the default, 20.
cursorstringThe paging.next value from the previous page. Leave it out for the first page.

The response

A list response holds the items, the total count and the paging state:

A page of broadcasts
{
  "broadcasts": [ ... ],
  "total": 134,
  "paging": { "next": "eyJvIjoyMH0", "hasMore": true }
}
  • The list key is hubs, broadcasts or changes, depending on the operation.
  • total is the number of items across all pages.
  • paging.next is the cursor for the next page, and null on the last page.
  • paging.hasMore says whether another page follows.

The change history has no total; see The change history is different.

To read the next page, pass paging.next back as ?cursor=, with the same filters. Treat the cursor as opaque: don't build or change one yourself. On a hub or broadcast list, a cursor the API cannot read returns the first page.

Read every page

This loop reads every broadcast in a hub, 100 at a time.

Read every page (needs jq)
cursor=""
while :; do
  args=(-s -G -H "Authorization: Bearer $EVENTDOOR_TOKEN" --data-urlencode "limit=100")
  [ -n "$cursor" ] && args+=(--data-urlencode "cursor=$cursor")
  page=$(curl "${args[@]}" "$EVENTDOOR_API/organizations/acme/hubs/home-games/broadcasts")
  echo "$page" | jq -r '.broadcasts[].slug'
  [ "$(echo "$page" | jq -r '.paging.hasMore')" = "true" ] || break
  cursor=$(echo "$page" | jq -r '.paging.next')
done

Each page is one request against your rate limit. limit=all returns the whole list in one request, which also costs one.

Filters

Filters narrow a list before it is paged. Keep the same filters on every page of one read.

Broadcast lists

List broadcasts in a hub and list an organization's broadcasts take:

ParameterValues
stateupcoming, active, live or past. live is not paged: see below.
startsAfter, startsBefore, endsAfter, endsBeforeA date-time, for example 2026-03-01T00:00:00Z
tag, tagCategoryA tag or tag-category slug
collection, collectionCategoryA collection or collection-category slug
collectionItemA collection item id
modelive or vod

state=live returns at most limit broadcasts in one response, with paging.hasMore false and no next, even when more are live. total counts every live broadcast. Pass limit=all to get them all, or compare total with the number returned.

Upcoming broadcasts in a hub
curl -s -G -H "Authorization: Bearer $EVENTDOOR_TOKEN" \
  --data-urlencode "state=upcoming" \
  "$EVENTDOOR_API/organizations/acme/hubs/home-games/broadcasts"

Hub lists

List hubs takes:

ParameterValues
queryText to search hub names for
parentIdA parent hub's id, or root for top-level hubs only
stateupcoming, active or past
startsAfter, startsBefore, endsAfter, endsBeforeA date-time
tag, tagCategory, collection, collectionCategory, collectionItemAs for broadcasts

Filter by tag category

All three lists also filter by tag: any other query parameter is read as a tag-category slug, and its value as a comma-separated list of tag slugs in that category. Within one category a row matches any of the tags; across categories it must match every category. For example, ?age_group=5-8,9-12&sport=swimming returns rows tagged 5-8 or 9-12 in age_group and also tagged swimming in sport.

Because an unrecognised parameter is read as a tag category, a misspelt filter returns an empty list rather than an error.

With at least one tag-category filter, add facets=true to get a facets array next to paging: for each category you filter on, its tags and how many rows would match each tag under your other category filters.

The change history is different

Listing a broadcast's changes pages the same way, with cursor and paging, with four differences:

  • Its limit is 1-50, default 20. It has no all.
  • An integer limit out of range, including 0, is clamped to 1-50. Anything else, including all, means 20, with no error.
  • A cursor it cannot read is refused with 400 Invalid cursor instead of returning the first page.
  • Its response has changes and paging only, with no total.