---
title: "Get global meta-feed"
method: GET
path: "/v1/feed/items"
tags: ["feed"]
---

# Get global meta-feed

`GET /v1/feed/items`

Get the global content feed across all creators, powered by the persistent
`creator_feed_items` table.

**How content enters this feed:**
- **Tipped content** appears automatically when any tip with a `source_post_url` is confirmed.
- **Discovered content** (from creator YouTube, Bluesky, Reddit, Medium, Substack, GitHub feeds)
  enters the table only when someone visits `GET /v1/feed/creators/{handle}`. There is no
  background discovery cron — this is intentional to avoid infrastructure cost until demand
  is validated.

Items include tip signal overlays (tip count, total USD, unique tippers).
Filter by platform, time window, and sort order.

This is a public endpoint — no authentication required.

## Query parameters

- `sort` 'recent' | 'tipped' | 'score' | 'published' | 'live' — Sort: recent, tipped, score (grove_score), published (content date), live (last tip time).
- `platform` string, nullable — Filter by platform (youtube, reddit, bluesky, medium, substack, github, x, etc.).
- `window` '24h' | '7d' | '30d' | 'all' — Time window for discovered_at filter.
- `tags` string, nullable — Comma-separated tags to filter by (e.g., 'defi,ethereum'). Items must match ALL tags.
- `limit` integer — Items per page.
- `cursor` string, nullable — Opaque pagination cursor.

## Response `200`

Feed items with optional content metadata

- FeedResponse — Paginated feed response with aggregated tip destinations.
  - `items` FeedItem[], required — Feed items ordered by the requested sort.
    - `url` string, required — Source URL that was tipped.
    - `platform` string, required — Platform identifier (youtube, reddit, bluesky, medium, website, x, github, etc.).
    - `tip_count` integer — Total number of tips to this URL.
    - `total_amount_usd` string — Total USD value of tips to this URL.
    - `unique_tippers` integer — Number of unique accounts that tipped this URL.
    - `last_tipped_at` string, nullable — Timestamp of the most recent tip (ISO 8601).
    - `last_tip_context` TipContextResponse — Social graph context attached to a tip (response model). This is the output version of TipContext - no validation needed since it's read from the database. All fields are optional as tips may have partial or no context.
      - `source_post_url` string, nullable
      - `sender_username` string, nullable
      - `sender_profile_url` string, nullable
      - `sender_platform` string, nullable
      - `sender_grove_handle` string, nullable
      - `recipient_username` string, nullable
      - `recipient_profile_url` string, nullable
      - `recipient_grove_handle` string, nullable
      - `campaign` string, nullable
      - `referrer` string, nullable
      - `custom_metadata` string, nullable
      - `is_discrete_giveaway_entry` boolean
      - `is_paid_message` boolean
    - `content` FeedContent — Enriched content metadata fetched from the source platform. All fields are nullable — enrichment may partially succeed (e.g., title available but no thumbnail). Consumers should handle missing fields gracefully with platform-specific fallback images.
      - `title` string, nullable — Content title (video title, post title, article headline).
      - `description` string, nullable — Content excerpt or description (truncated to 500 chars).
      - `image_url` string, nullable — Thumbnail or preview image URL. HTTPS only. Consumers should proxy via next/image or equivalent.
      - `author_name` string, nullable — Content author or channel name.
      - `published_at` string, nullable — Original publish date (ISO 8601).
    - `enrichment_status` string — Status of content enrichment: 'cached', 'pending', or 'unavailable'.
    - `source` string — How this item entered the feed: 'tipped' or 'discovered' (from creator's platform feed).
    - `creator_handle` string, nullable — Grove handle of the content creator (when known).
    - `creator_avatar_url` string, nullable — Avatar URL of the Grove creator associated with this content (when known).
    - `embed_id` string, nullable — Platform-specific embed identifier (e.g., YouTube video_id).
  - `cursor` string, nullable — Opaque cursor for fetching the next page. Null if no more results.
  - `has_more` boolean — Whether more results exist beyond this page.
  - `total_count` integer, required — Total number of unique tipped URLs matching the filter.

## Other responses

- `422` — Validation Error

---

[API](https://skmtc.net/grove/apis/grove-api.md) · [All operations](https://skmtc.net/grove/apis/grove-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/grove/grove-api/versions/f286b48a8105/schema)
