---
title: "Frames"
method: GET
path: "/v1/ops/onboarding-funnel/session/{session_id}/frames"
tags: ["ops onboarding funnel"]
---

# Frames

`GET /v1/ops/onboarding-funnel/session/{session_id}/frames`

The screen as it stood at each asked instant of this walk's recording.

Owner, 2026-09-04: "show the screenshot of the screen pls at each step so
I can see what the user sees at each command". PostHog has no such
endpoint — a recording is rrweb events, and only a browser turns those
into pixels — so `runtime/replay_frames.py` renders them once, in a
subprocess, and this answers with whatever exists NOW plus a `status` the
sheet polls: `rendering` while the browser works, `ready` when every
asked instant has a frame or a recorded failure.

Answers in milliseconds and never blocks on the render. Cheap to call
again: a frame already on disk is never drawn twice.

## Path parameters

- `session_id` string, required

## Query parameters

- `at` string[] — ISO instants to draw the screen at

## Headers

- `authorization` string, nullable
- `x-darwin-token` string, nullable

## Response `200`

Successful Response

- object

## Other responses

- `422` — Validation Error

## Changes

> 32 revisions in range; 1 not diffed.

- **2026-09-05** `f1c8ed62c117` — 1 info
  - endpoint added

[Change history](https://skmtc.dev/stormy/apis/stormy-control-plane/changes/v1/ops/onboarding-funnel/session/:session_id/frames/get.md)

---

[API](https://skmtc.dev/stormy/apis/stormy-control-plane.md) · [All operations](https://skmtc.dev/stormy/apis/stormy-control-plane/llms.txt) · [OpenAPI document](https://skmtc.dev/stormy/apis/stormy-control-plane/revisions/b09e3c4ee2af?raw)
