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

# Check-in feed

> Filtered timeline with embedded venue context.

# Check-in feed

**Goal:** Render an activity feed from one filtered call.\
**Prep time:** \~5 minutes

## Off the shelf

The [`CheckInFeed` component](/components) from `@flynetdev/react` renders a member's recent check-ins for you. Wrap it in a `FlynetProvider` with a `FlynetMemberClient` built from the member's OAuth token, and it fetches client-side under the `read:user_checkins` scope.

```tsx app/feed.tsx theme={null}
"use client";
import { FlynetMemberClient } from "@flynetdev/core";
import { FlynetProvider, CheckInFeed } from "@flynetdev/react";

export function Feed({ accessToken }: { accessToken: string }) {
  const member = new FlynetMemberClient({ accessToken });
  return (
    <FlynetProvider member={member}>
      <CheckInFeed />
    </FlynetProvider>
  );
}
```

For an anonymized feed of recent check-ins at one venue, reach for [`RecentVisits`](/components) instead.

## From scratch

To filter the global feed yourself, or build the row markup by hand, it's one call.

## What you will use

* `GET /flynet/v1/check_ins`

## Code

The venue feed is **API-key** auth (server-side; the key needs `read:checkins`):

```bash theme={null}
curl -sS "https://api.staging.blackbird.xyz/flynet/v1/check_ins?restaurant={uuid}&sort_order=desc&page_size=25" \
  -H "X-API-Key: $API_KEY"
```

```typescript theme={null}
const params = new URLSearchParams({
  restaurant: "{uuid}",
  sort_order: "desc",
  page_size: "25",
});

const res = await fetch(
  `https://api.staging.blackbird.xyz/flynet/v1/check_ins?${params}`,
  { headers: { "X-API-Key": process.env.API_KEY! } }
);

const data = await res.json();
const first = data.check_ins[0];
console.log(first?.location.restaurant.name, first?.created_at);
```

Each row embeds `location` with `restaurant` and `neighborhood`, plus
timestamps, so one call powers a complete feed row.
Check-ins carry no member identity — render venue and time, not a name.

<Note>
  **Tasting note** - To show a member their *own* visit history, use
  [`/users/me/check_ins`](/concepts/data-model): the subject comes from
  the token, no UUID needed.
</Note>

<Note>
  **Tasting note** - `ended_at` may be `null` for ongoing visits. Handle it
  explicitly in UI.
</Note>

## Narrow by venue or time

`/check_ins` is an anonymized venue feed. Narrow it to one brand or one
location, optionally bounded by time:

```bash theme={null}
curl "https://api.staging.blackbird.xyz/flynet/v1/check_ins?restaurant={uuid}&created_after=2026-04-01T00:00:00Z&page_size=25" \
  -H "X-API-Key: $API_KEY"
```

<Note>
  **Tasting note** - `/check_ins` filters are optional
  (`[restaurant, location, created_after, created_before]`), and a
  bare unfiltered list returns the full paginated set rather than a
  400\. Always page deliberately when you omit filters. See
  [the reference](/api-reference/check-ins/list) for the full filter matrix.
</Note>

Combinations AND together: `?restaurant={uuid}&created_after=2026-04-01T00:00:00Z`
returns that brand's check-ins since the cutoff — the basis for a venue
heatmap.

**Next:** [First payment](/recipes/mains/first-payment) - accept FLY from a member.
