---
title: "List Trip Saved Items"
method: GET
path: "/trips/{trip_id}/saved-items"
tags: ["places"]
---

# List Trip Saved Items

`GET /trips/{trip_id}/saved-items`

The user's saved places as this trip sees them: already added, and — on
request, via `include=city_matches` — addable here (in its stated
destination).

## Path parameters

- `trip_id` string, required

## Query parameters

- `include` string, nullable — Comma-separated extras to compute. `city_matches` adds the user's saves in the trip's stated destination that are not yet on this trip.

## Response `200`

Successful Response

- TripSavedItemsResponse — The two halves of "the user's saves, seen from this trip". `saved_item_ids` — saves whose place already lives in this trip's itinerary, matched on the same ids the itinerary de-dups on (Google id first, TripAdvisor id as the fallback). Lets the saved rows render "Added" without an N-request-per-row scan of every trip. `city_matches` — saves in the trip's stated destination that are NOT yet on it, decided by the chat agent's saved-places code but on the label rungs only, so the radius that tunes a prompt cannot move a rendered row. One row per place, newest first, in the SAME item shape as `GET /saved` so clients reuse their saved-row rendering unchanged. The two fields are disjoint by construction. Filled only for a request that asks with `include=city_matches`: it costs a second scan of the user's saves plus a full item enrichment, which the callers that render only the "Added" state would pay for and discard.
  - `saved_item_ids` string[], required
  - `city_matches` SavedItemOut[]
    - `id` string, uuid, required
    - `list_id` string, uuid, nullable, required
    - `place_ref` string, required
    - `place_id` string, nullable, required
    - `caption` string, nullable, required
    - `description` string, nullable
    - `name` string, required
    - `category` string, nullable, required
    - `city` string, nullable, required
    - `state` string, nullable, required
    - `country` string, nullable, required
    - `lat` number, nullable, required
    - `lng` number, nullable, required
    - `image_url` string, nullable, required
    - `image_thumbhash` string, nullable
    - `rating` number, nullable, required
    - `num_reviews` integer, nullable, required
    - `tabelog_tier` integer, nullable
    - `michelin` MichelinDistinction — A place's Michelin Guide distinction, structured. Canonical rationale — the TS mirror and the renderers point here rather than restating it. Rides alongside `michelin_award` rather than replacing it: that field is a pre-rendered label ("★★★"), and a label cannot drive iconography. An award string we don't recognise yields NO distinction (we never paint a mark we can't justify) while still surfacing verbatim in `michelin_award`, so a new tier degrades to text rather than disappearing.
      - `tier` 'stars' | 'bib_gourmand' | 'selected', required
      - `stars` integer, nullable
      - `green_star` boolean
      - `url` string, nullable
      - `cuisine` string, nullable
    - `source` string, required
    - `source_url` string, nullable, required
    - `is_shared` boolean, required
    - `review_state` string, nullable, required
    - `created_at` string, required

## Other responses

- `422` — Validation Error

## Changes

- **2026-09-09** `c3802252fcff` — 2 info
  - added the new optional `query` request parameter `include`
  - added the optional property `city_matches` to the response with the `200` status

[Change history](https://skmtc.dev/stardrift/apis/fastapi/changes/trips/:trip_id/saved-items/get.md)

---

[API](https://skmtc.dev/stardrift/apis/fastapi.md) · [All operations](https://skmtc.dev/stardrift/apis/fastapi/llms.txt) · [OpenAPI document](https://skmtc.dev/stardrift/apis/fastapi/revisions/5ee46d34daa4?raw)
