> ## Documentation Index
> Fetch the complete documentation index at: https://docs.flynet.org/llms.txt
> Use this file to discover all available pages before exploring further.

# 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`](/api-reference/users/list-check-ins).

<Warning>
  **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`.
</Warning>

<Note>
  **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.
</Note>

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.

| 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`.                                                 |

Combinations AND together. `?restaurant={uuid}&created_after=2026-06-01T00:00:00Z`
returns only that restaurant's check-ins since the cutoff.

<Note>
  **Tasting note** - The filter key is the bare resource name, same trap
  as [`/memberships`](/api-reference/memberships/list): `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`.
</Note>

## Example

```bash theme={null}
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

```json theme={null}
{
  "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.                                                                    |

There is **no user field**.

## Errors

### 400 - bad timestamp format

```json theme={null}
{
  "error": {
    "type": "invalid_request_error",
    "code": "invalid_parameter",
    "message": "Parse attempt failed for value [1748736000]",
    "param": null
  }
}
```

### 400 - malformed UUID

```json theme={null}
{
  "error": {
    "type": "invalid_request_error",
    "code": "invalid_parameter",
    "message": "Invalid UUID string: not-a-uuid",
    "param": null
  }
}
```

### 401 - missing API key

```json theme={null}
{
  "status": 401,
  "message": "API key is required...",
  "error_code": "MISSING_API_KEY"
}
```

### 403 - key missing the scope

```json theme={null}
{
  "error": {
    "type": "authorization_error",
    "code": "insufficient_scope",
    "message": "Missing required scope: read:checkins",
    "param": null
  }
}
```

## See also

* [List my check-ins](/api-reference/users/list-check-ins): a member's own history, via their OAuth token.
* [Check-in feed](/recipes/mains/check-in-feed): render a feed from one filtered call.
