---
title: "The ranked backlog of prepared growth moves. Live (pending) moves only by default; resolved moves (shipped, skipped, archived, expired) keep stale ranks, so they are excluded unless ?include=resolved is passed."
method: GET
path: "/api/v1/feed"
---

# The ranked backlog of prepared growth moves. Live (pending) moves only by default; resolved moves (shipped, skipped, archived, expired) keep stale ranks, so they are excluded unless ?include=resolved is passed.

`GET /api/v1/feed`

## Request

- Base URL: `https://afterlaunch.io`
- URL: `https://afterlaunch.io/api/v1/feed`
- Auth: HTTP bearer

## Query parameters

- `include` 'resolved'
- `since` string, date-time
- `verbosity` 'compact' | 'full'

## Response `200`

The ranked moves, best first. total_live counts the live (pending) backlog regardless of the include or since filters. snapshot_status, current_phase, deep_scan_eta_seconds and poll_after_seconds are always present and mirror the MCP list_feed tool.

- object
  - `data` object, required
    - `moves` object[]
      - `id` string, uuid
      - `title` string
      - `why` string, nullable
      - `area` string
      - `dimension` string, nullable
      - `action_kind` string, nullable: The move shape. Open text (not an enum) so the vocabulary can grow without a migration. Values include the brief taxonomy (html_edit, social_post, long_form_content, ...) and the synthesised-move kinds (community_answer, community_reply, community_insight, seo_fix, keyword_gap, ai_answer, competitor_response, gsc_capture, backlink_outreach, ...). community_reply / community_insight are the Community Radar moves (dark behind COMMUNITY_RADAR_ENABLED).
      - `target` string, nullable
      - `status` string
      - `rank` integer
      - `opportunity_score` number
      - `is_today_move` boolean
      - `estimated_minutes` integer, nullable
      - `first_seen_at` string, date-time
      - `posture` 'act' | 'draft_only' | 'founder_voice' | 'null', nullable: Who may do this move. 'act': the connected agent may complete it itself (a listing, a change to the founder's own site). 'draft_only': the agent drafts, a person posts (every community reply; Reddit always). 'founder_voice': the founder only, because the value is that it is them or the step binds their identity (a post from their own account, outreach from their own address, an OAuth grant, a profile claim). Always present; null for a move with no actor. Use it to split the moves into the agent's jobs and the founder's without a get_move per row.
      - `has_draft` boolean: Whether readable full-draft material is waiting on this move. Always present. False when the material is a brief, absent, or unavailable behind the post-trial access wall. Read draft_kind for the first two cases and the response-level drafts_withheld flag for the last.
      - `draft_kind` 'full_draft' | 'brief' | 'null', nullable: What the readable move material is: 'full_draft' is an inspectable artefact, 'brief' is an assignment to complete, and null means absent or withheld. This describes the material; it does not certify quality or publication.
      - `draft_content` string, nullable: The complete, trimmed move material. It may be a full draft or a brief as declared by draft_kind. Present ONLY when ?verbosity=full is passed: the default list is compact because bodies were most of its weight. GET /api/v1/moves/{id} serves the body of one move.
    - `total_live` integer: How many moves are live (status pending) on this product.
    - `snapshot_status` 'building' | 'ready': The onboarding / deep-scan status, always present: 'building' while the deep scan is still running, 'ready' once it has finished.
    - `current_phase` string, nullable: A short honest label of what the deep scan is doing right now while building; null when ready.
    - `deep_scan_eta_seconds` integer, nullable: While building, the rough number of seconds until the deep scan is expected to finish (floored so it stays positive); null when ready.
    - `poll_after_seconds` integer, nullable: While building, how long to wait before polling the feed again; null when ready.
    - `more_moves_generating` boolean: Present and true ONLY while the deep scan is still running (stronger stage-B moves are still being generated and will land on a later read). Absent once the scan has finished. When present, re-read the feed after suggested_recheck_after_seconds before treating this list as final.
    - `suggested_recheck_after_seconds` integer: How long to wait before re-reading the feed when more_moves_generating is present. Absent otherwise.
  - `meta` object, required
    - `enrollment_id` string, uuid, required
    - `generated_at` string, date-time, required

## Other responses

- `400`: An invalid since value (not a parseable timestamp).
- `401`: Missing, invalid or revoked API key.
- `403`: The key does not carry the scope this endpoint requires.
- `429`: Per-key rate limit exceeded. Honour Retry-After.

---

[API](https://skmtc.dev/afterlaunch/apis/afterlaunch-public-api.md) · [All operations](https://skmtc.dev/afterlaunch/apis/afterlaunch-public-api/llms.txt) · [OpenAPI document](https://skmtc.dev/afterlaunch/apis/afterlaunch-public-api/revisions/d67a599194a4?raw)
