List check-ins
curl --request GET \
--url https://api.staging.blackbird.xyz/flynet/v1/check_insconst options = {method: 'GET'};
fetch('https://api.staging.blackbird.xyz/flynet/v1/check_ins', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));const options = {method: 'GET'};
fetch('https://api.staging.blackbird.xyz/flynet/v1/check_ins', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));Check-ins
List check-ins
GET
/
check_ins
List check-ins
curl --request GET \
--url https://api.staging.blackbird.xyz/flynet/v1/check_insconst options = {method: 'GET'};
fetch('https://api.staging.blackbird.xyz/flynet/v1/check_ins', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));const options = {method: 'GET'};
fetch('https://api.staging.blackbird.xyz/flynet/v1/check_ins', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));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
Auth: API key in
Combinations AND together.
There is no user field.
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.X-API-Key — no user token needed. Two requirements
beyond the header:
- The key must carry the
read:checkinsscope. Key scopes are set in the body of the key-mint request; the app’sallowed_scopesare not inherited, so a key minted with an empty body gets403here even if its app listsread:checkins. - Send a non-empty
User-Agent. The edge rejects a missing or emptyUser-Agentwith a403HTML body, but any non-empty value — including SDK andcurldefaults — passes.
| Auth state | Response |
|---|---|
No X-API-Key header | 401 MISSING_API_KEY |
Key without read:checkins | 403 insufficient_scope |
Key with read:checkins | 200 |
Filters
| Parameter | Type | Notes |
|---|---|---|
restaurant | UUID | Returns check-ins at any location of this restaurant. |
location | UUID | Returns check-ins at this specific location. |
created_after | ISO 8601 timestamp | Visits created on/after this instant. Epoch seconds rejected. |
created_before | ISO 8601 timestamp | Visits created before this instant. |
page | integer | Zero-indexed. Default 0. |
page_size | integer | Default 50. |
?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
curl "https://api.staging.blackbird.xyz/flynet/v1/check_ins?restaurant={uuid}&created_after=2026-06-01T00:00:00Z" \
-H "X-API-Key: $API_KEY"
Response
{
"check_ins": [
{
"id": "dce67498-5d0a-4455-9bcf-95d54c033b02",
"object": "check_in",
"location": {
"id": "c8d79a1f-6cb8-4e6d-9b58-b2796cd6cdad",
"object": "location",
"name": "CLOVER",
"restaurant": {
"id": "abd27597-6ffd-4ad0-a958-33a7f2d5afe7",
"object": "restaurant",
"name": "FLYBAR",
"cuisine": ["Italian"],
"cohort": "qsr",
"price": 3,
"tags": [],
"asset": {
"preview_1x": "https://images.blackbird.xyz/rock/1x.png?expire=8782ddb89c",
"web_2x": "https://images.blackbird.xyz/rock/2x.png?expire=8782ddb89c",
"full_3x": "https://images.blackbird.xyz/rock/3x.png?expire=8782ddb89c"
},
"website_url": "https://barbutonyc.com",
"instagram_url": null,
"created_at": "2024-01-15T20:21:23.253929Z",
"updated_at": "2026-06-11T09:00:48.460864Z"
},
"neighborhood": {
"id": "df7c85e9-907e-41cf-84f2-efb86175e89b",
"object": "neighborhood",
"name": "Astoria",
"region": "New York, NY"
},
"slug": "flybar-clover",
"address": {
"street": "14-01 Broadway",
"street2": "",
"city": "Astoria",
"state": "NY",
"zipcode": "11106",
"country": "USA"
},
"coordinate": { "latitude": 40.72556, "longitude": -73.99513 },
"phone_number": "+19176229717",
"time_zone": "America/New_York",
"payments_enabled": true,
"is_club": false,
"reservation_url": null,
"reservations_enabled": false,
"google_place_id": null,
"created_at": "2026-05-11T17:20:12.798637Z",
"updated_at": "2026-06-09T17:57:08.762073Z"
},
"blackbird_pay_enabled": true,
"created_at": "2026-06-10T17:32:56.113304Z",
"ended_at": "2026-06-10T17:45:00.949869Z"
}
],
"pagination": {
"total_count": 26,
"total_pages": 26,
"current_page": 0,
"next_page": 1,
"page_size": 1
}
}
Schema
| Field | Type | Notes |
|---|---|---|
id | UUID | Check-in id. |
object | string | Always "check_in". |
location | object | Fully expanded location, including its nested restaurant, neighborhood, address, and coordinate. |
blackbird_pay_enabled | boolean | Whether Blackbird Pay was available for the visit. |
created_at | ISO 8601 timestamp | Visit start — this is the timestamp the date filters apply to. |
ended_at | ISO 8601 timestamp | null | Visit end. null for ongoing visits. |
Errors
400 - bad timestamp format
{
"error": {
"type": "invalid_request_error",
"code": "invalid_parameter",
"message": "Parse attempt failed for value [1748736000]",
"param": null
}
}
400 - malformed UUID
{
"error": {
"type": "invalid_request_error",
"code": "invalid_parameter",
"message": "Invalid UUID string: not-a-uuid",
"param": null
}
}
401 - missing API key
{
"status": 401,
"message": "API key is required...",
"error_code": "MISSING_API_KEY"
}
403 - key missing the scope
{
"error": {
"type": "authorization_error",
"code": "insufficient_scope",
"message": "Missing required scope: read:checkins",
"param": null
}
}
See also
- List my check-ins: a member’s own history, via their OAuth token.
- Check-in feed: render a feed from one filtered call.