List memberships
curl --request GET \
--url https://api.staging.blackbird.xyz/flynet/v1/users/me/membershipsconst options = {method: 'GET'};
fetch('https://api.staging.blackbird.xyz/flynet/v1/users/me/memberships', 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/users/me/memberships', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));Memberships
List memberships
GET
/
users
/
me
/
memberships
List memberships
curl --request GET \
--url https://api.staging.blackbird.xyz/flynet/v1/users/me/membershipsconst options = {method: 'GET'};
fetch('https://api.staging.blackbird.xyz/flynet/v1/users/me/memberships', 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/users/me/memberships', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));Returns the authenticated member’s paginated membership records, one per
restaurant, each carrying a
Auth: OAuth access token carrying
check_in_count and the member’s
membership_tier at that restaurant. The subject is resolved from the
access token, so there is no member ID in the path. This is the
canonical source for the member’s per-restaurant check-in totals: filter
by restaurant and sum check_in_count across the result.
Chef’s warning - The filter key is
restaurant (a UUID), not
restaurant_id. Passing restaurant_id is silently ignored and
returns the full unfiltered list. The field on each record is
restaurant_id; the filter param is restaurant. Mind the asymmetry.Tasting note - There is no
GET /users/me/memberships/{id}; the
filtered list is the only accessor. Server-side sorting isn’t applied:
sort and friends are accepted but ignored, so sort check_in_count
client-side for leaderboards.read:memberships. A token missing
that scope returns 403 with error="insufficient_scope" in the
WWW-Authenticate header.
Example
curl "https://api.staging.blackbird.xyz/flynet/v1/users/me/memberships?restaurant=2cb56d03-4417-4b60-afe3-be819ecde8ac&page=0&page_size=50" \
-H "Authorization: Bearer $ACCESS_TOKEN"
Response
{
"memberships": [
{
"id": "011ac10e-7f27-4355-847a-c51e2e7e5625",
"object": "membership",
"restaurant_id": "2cb56d03-4417-4b60-afe3-be819ecde8ac",
"check_in_count": 1,
"last_check_in_date": "2026-05-26T16:30:45.825827Z",
"membership_tier": {
"id": "8a71471b-c07c-4e05-9888-7ecd8e1bc609",
"object": "membership_tier",
"name": "Member",
"artist": "Andrew Braswell",
"asset": {
"preview_1x": "https://images.blackbird.xyz/.../343_490.png",
"web_2x": "https://images.blackbird.xyz/.../343_490.png",
"full_3x": "https://images.blackbird.xyz/.../343_490.png"
}
}
}
],
"pagination": {
"total_count": 875,
"total_pages": 18,
"current_page": 0,
"next_page": 1,
"page_size": 50
}
}
Schema
| Field | Type | Notes |
|---|---|---|
memberships | array | One record per (member, restaurant) pair. Does not embed the member. |
memberships[].restaurant_id | UUID | The restaurant this membership belongs to. |
memberships[].check_in_count | integer | This member’s check-ins at this restaurant. Sum across the filtered list for the per-restaurant total. |
memberships[].last_check_in_date | ISO 8601 timestamp | Most recent check-in, or null. |
memberships[].membership_tier | object | { id, object, name, artist, asset }. name is an open string (e.g. Member, VIP, Friend), not a fixed enum. |
pagination | object | Standard pagination wrapper. page_size is uncapped. |
Query parameters
| Param | Type | Notes |
|---|---|---|
restaurant | UUID | Filter to one restaurant. Use this, not restaurant_id. |
page | integer | Zero-indexed. |
page_size | integer | Default 50. Uncapped. |
See also
- Get my status: the member’s tier and level.