---
title: "First-session state and Day-1 checklist for the trial coach"
method: GET
path: "/api/first-run"
tags: ["First run"]
---

# First-session state and Day-1 checklist for the trial coach

`GET /api/first-run`

## Request

- Base URL: `https://api.setluca.com`
- URL: `https://api.setluca.com/api/first-run`
- Auth: API key in cookie `luca.session_token`

One read for everything the Getting Started view needs. That's first-session state, the Day-1 checklist, plan and trial dates, the coach's niche for personalized copy, the demo lead's name, sticky experiment variants, and any trial extension waiting to be claimed. It also backfills experiment assignments for a coach who signed up before a test shipped.

**Session-only.** This endpoint isn't on the API-key allowlist. An organization API key gets a 403 here, whatever scopes it holds.

## Headers

- `Luca-API-Version` '1'

## Response `200`

ok

- FirstRunStateResponse
  - `firstSessionState` 'first_visit' | 'demo_drafting' | 'demo_ready' | 'activated' | 'dismissed' | 'completed', required
  - `checklistState` object, required
    - `items` object
      - `review_first_draft` object
        - `status` 'pending' | 'in_progress' | 'completed' | 'skipped'
        - `startedAt` string, date-time, nullable
        - `completedAt` string, date-time, nullable
      - `approve_or_edit` object
        - `status` 'pending' | 'in_progress' | 'completed' | 'skipped'
        - `startedAt` string, date-time, nullable
        - `completedAt` string, date-time, nullable
      - `check_voice_match` object
        - `status` 'pending' | 'in_progress' | 'completed' | 'skipped'
        - `startedAt` string, date-time, nullable
        - `completedAt` string, date-time, nullable
      - `send_test_message` object
        - `status` 'pending' | 'in_progress' | 'completed' | 'skipped'
        - `startedAt` string, date-time, nullable
        - `completedAt` string, date-time, nullable
      - `explore_ask_luca` object
        - `status` 'pending' | 'in_progress' | 'completed' | 'skipped'
        - `startedAt` string, date-time, nullable
        - `completedAt` string, date-time, nullable
    - `completedAt` string, date-time, nullable
  - `planStatus` string, required
  - `planTier` string, required
  - `trialStartedAt` string, nullable, required
  - `trialEndsAt` string, nullable, required
  - `experimentAssignments` object, required
  - `niche` string, required
  - `demoLeadName` string, nullable, required
  - `extensionOffer` object, nullable, required
    - `reason` 'low_usage' | 'high_usage', required
    - `extraDays` integer, required
    - `messageCap` integer, required
    - `discountPriceUsd` integer, nullable, required
    - `actions` object, required
      - `story_template` boolean
      - `test_message` boolean
    - `claimable` boolean, required
  - `unansweredBeforeTrial` integer, required

## Other responses

- `401`: unauthorized
- `404`: not found
- `429`: rate limited
- `500`: internal error
- `503`: service unavailable

---

[API](https://skmtc.dev/setluca/apis/luca-api.md) · [All operations](https://skmtc.dev/setluca/apis/luca-api/llms.txt) · [OpenAPI document](https://skmtc.dev/setluca/apis/luca-api/revisions/90a200e4100b?raw)
