---
title: "Read safe preview metadata for one exact sign-in check."
method: GET
path: "/story-projects/{projectId}/app-connections/{connectionId}/test-login/{testId}/preview"
tags: ["Sources"]
---

# Read safe preview metadata for one exact sign-in check.

`GET /story-projects/{projectId}/app-connections/{connectionId}/test-login/{testId}/preview`

## Request

- Base URL: `https://docs.sleeperhit.studio/api/v1`
- URL: `https://docs.sleeperhit.studio/api/v1/story-projects/{projectId}/app-connections/{connectionId}/test-login/{testId}/preview`
- Auth: HTTP bearer

Owner-only metadata: current step, state, frame freshness and a canonical owner viewUrl. Owner OAuth clients may read this metadata. Reading never captures a picture or starts a test, and returns no image, image URL, code, runner address or credential. A replaced test is refused instead of following the new check.

## Response `200`

Safe metadata for this exact check.

- AppConnectionTestPreviewResponse
  - `preview` AppConnectionTestPreview, required
    - `connectionId` string, required
    - `testId` string, required
    - `state` 'waiting' | 'running' | 'finished' | 'unavailable' | 'withheld', required
    - `phase` 'signing_in' | 'checking_session' | 'null', nullable, required
    - `message` string, nullable, required
    - `sequence` integer, nullable, required: Authenticated runner sequence, monotonic for the entire exact test including browser page changes; null when no authenticated sequence is available.
    - `capturedAt` string, date-time, nullable, required
    - `frameExpiresAt` string, date-time, nullable, required
    - `hasRecentFrame` boolean, required
    - `viewUrl` string, uri, required: The canonical public project route selecting this connection and exact test. The owner opens it to view the read-only check; never a picture or runner URL.

## Other responses

- `400`: Request payload failed validation. The error message names the offending field.
- `401`: Missing, malformed, revoked, or expired API key.
- `403`: API key is valid but lacks the scope, is blocked by IP allowlist, or the account is disabled.
- `404`: No app connection with that id in this project (`app_connection_not_found`), or the project is not yours (`project_not_found`).
- `409`: `app_connection_test_changed` — the test was replaced; or `project_not_product` — this is not a product project.
- `429`: Rate limit for this API key + IP + route family was exceeded.
- `500`: The API failed unexpectedly. Safe to retry with the same Idempotency-Key.

---

[API](https://skmtc.dev/sleeperhit/apis/sleeper-hit-studio-story-api.md) · [All operations](https://skmtc.dev/sleeperhit/apis/sleeper-hit-studio-story-api/llms.txt) · [OpenAPI document](https://skmtc.dev/sleeperhit/apis/sleeper-hit-studio-story-api/revisions/4534f5d25540?raw)
