---
title: "Curate Flight Guide"
method: POST
path: "/conv/trips/{trip_id}/flight-curate"
tags: ["conversational"]
---

# Curate Flight Guide

`POST /conv/trips/{trip_id}/flight-curate`

Proxy only a typed, ID-keyed curation overlay for Flight Guide.

## Path parameters

- `trip_id` string, required

## Request body

- FlightGuideCurationRequest — Request one small, deterministic curation batch from a source frame. The browser never supplies flight candidates. ``source_frame_id`` is a server-issued identifier for the canonical search cohort persisted on the trip. ``observation_ids`` optionally targets a small exact set of staged round-trip outbounds or complete itineraries from that cohort; normal progressive curation uses ``cursor`` and remains checkout-ready only. One exact request cannot mix those two decision stages. ``return_for_outbound_observation_id`` explicitly scopes exact IDs to one selected outbound's registered return family.
  - `source_frame_id` string, required
  - `cursor` integer
  - `observation_ids` string[], nullable
  - `return_for_outbound_observation_id` string, nullable
  - `refinement` FlightGuideRefinement — Server-resolved filters for one canonical Flight Guide frame. The browser supplies preferences, never candidate inventory. Brain applies these constraints to the persisted outbound frame and the complete cached Phase-2 return market, selecting at most one checkout observation per outbound.
    - `nonstop_only` boolean
    - `airline_only` string, nullable
    - `avoided_airlines` string[]
    - `origin_airport_codes` string[], nullable
    - `destination_airport_codes` string[], nullable
    - `outbound_depart_after_minutes` integer, nullable
    - `outbound_depart_before_minutes` integer, nullable
    - `return_depart_after_minutes` integer, nullable
    - `return_depart_before_minutes` integer, nullable
  - `locale` 'en' | 'es'

## Response `200`

Successful Response

- FlightGuideCurationResponse — Stable page metadata plus judgment-only patches; never inventory. ``retryable`` means this wave is not finished: some takes were dropped by grounding even after Brain's own repair ask. Every accepted judgment is still included, and ``next_cursor`` already points at the following wave, so a client may re-ask this cursor or move on. ``terminal`` means the model call itself failed; inventory stays usable and the client decides whether to re-ask.
  - `source_frame_id` string, required
  - `status` 'complete' | 'retryable' | 'terminal'
  - `next_cursor` integer, nullable
  - `lead_ids` string[]
  - `judgments` FlightGuideJudgmentPatch[]
    - `observation_id` string, required
    - `verdict` 'great' | 'good' | 'mixed' | 'painful', required
    - `take` string, required
    - `traits` FlightGuideTrait[], required
      - `fact_id` string, required
      - `sentiment` 'positive' | 'neutral' | 'negative', required
      - `display_text` string, required

## Other responses

- `422` — Validation Error

## Changes

- **2026-09-03** `4f4ea4eb6a21` — 1 info
  - added the new optional request property `return_for_outbound_observation_id`
- **2026-09-03** `29c8d734d508` — 1 breaking
  - the `judgments/items/traits` response property's minItems was decreased from `1` to `0` for the response status `200`

[Change history](https://skmtc.dev/helloaxel/apis/client-api-gateway/changes/conv/trips/:trip_id/flight-curate/post.md)

---

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