---
title: "Read Shared Goal"
method: GET
path: "/goals/shared/{share_id}"
tags: ["goals"]
---

# Read Shared Goal

`GET /goals/shared/{share_id}`

One published goal, for anyone holding the link.

**No cookie and no Origin**, unlike every other route here: this serves only
what an athlete deliberately published, to a stranger who was handed a URL,
and requiring a browser session would mean the recipient needs one before
they can read a page meant for them. A revoked goal is not published, so it
404s the moment it is taken down.

## Path parameters

- `share_id` string, required

## Response `200`

Successful Response

- GoalSharePage — The published goal, as a stranger sees it. **The promise, at a distance — and its picture.** The goal's name, when it is, how precisely that date is known, what kind of goal it is, the sport, the dated history of it changing, and the goal's picture: wonderland goals.md makes the picture the page's highlight and what the link preview carries, both sides published, what the goal asks and where the athlete stands, gap and all. ``factors`` is the owner-side shape exactly (:class:`~cheshire.goals.models.GoalFactor`): positions on the goal's own scale, never the readings behind them — a body-read factor publishes as a position, and the sleep or recovery data underneath it never leaves. What is absent is still the point. The document body, the checkpoints and fallbacks, the athlete's reasons — the why and what chose the event stay theirs to tell (wonderland #45) — and every session id, none of it is here. Sharing a goal must feel safe; it must never feel like exposing something internal. Three layers keep it that way: this model is `extra="forbid"` so an added field cannot ride along silently, the validator below walks the serialized payload for forbidden keys and internal markers, and the row is projected field by named field rather than dumped. **The field list is settled** by wonderland goals.md's share-page section (the human review the earlier note here waited on). Trimming a field is cheap; un-leaking one is not.
  - `share_id` string, required
  - `slug` string, required
  - `name` string, required
  - `kind` 'destination' | 'practice', required
  - `target_date` string, date, required
  - `target_precision` 'day' | 'month' | 'quarter' | 'season', required
  - `sport` string, nullable
  - `locale` string, required
  - `factors` object[]
  - `revisions` GoalShareRevision[]
    - `published_at` string, date-time, required
    - `name` string, required
    - `target_date` string, date, required
    - `target_precision` 'day' | 'month' | 'quarter' | 'season', required

## Other responses

- `422` — Validation Error

---

[API](https://skmtc.dev/imperfect/apis/imperfect-api.md) · [All operations](https://skmtc.dev/imperfect/apis/imperfect-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/imperfect/imperfect-api/revisions/cc2293a44257/schema)
