Skip to main content
GET
List check-ins
Returns the global check-in feed, newest first, optionally narrowed by the filters below. Records are anonymized: each carries the fully expanded location (with its restaurant), but no user field, so the feed cannot be attributed to members. For a member’s own history use GET /users/me/check_ins.
Chef’s warning - The user filter is gone. Passing user= (or user_id=) is silently ignored and returns the full unfiltered list — and since records carry no user field, there is nothing to match client-side either. Filter by restaurant or location.
Tasting note - All filters are optional. A bare GET /check_ins returns the full paginated set (~15.7k records in staging), so page deliberately when you omit filters.
Auth: API key in X-API-Key — no user token needed. Two requirements beyond the header:
  1. The key must carry the read:checkins scope. Key scopes are set in the body of the key-mint request; the app’s allowed_scopes are not inherited, so a key minted with an empty body gets 403 here even if its app lists read:checkins.
  2. Send a non-empty User-Agent. The edge rejects a missing or empty User-Agent with a 403 HTML body, but any non-empty value — including SDK and curl defaults — passes.

Filters

Combinations AND together. ?restaurant={uuid}&created_after=2026-06-01T00:00:00Z returns only that restaurant’s check-ins since the cutoff.
Tasting note - The filter key is the bare resource name, same trap as /memberships: restaurant, not restaurant_id. Unknown filter names (restaurant_id, location_id, user, user_id) are silently ignored and return the unfiltered set. A well-formed UUID that matches nothing is not an error — it returns 200 with an empty list and total_count: 0.

Example

Response

Schema

There is no user field.

Errors

400 - bad timestamp format

400 - malformed UUID

401 - missing API key

403 - key missing the scope

See also