---
title: "Monitor price for a specific origin, destination, and dates pair"
method: POST
path: "/v1/price_monitoring"
tags: ["Discovery"]
---

# Monitor price for a specific origin, destination, and dates pair

`POST /v1/price_monitoring`

## Request

- Base URL: `https://api.gojinko.com`
- URL: `https://api.gojinko.com/v1/price_monitoring`
- Auth: one of:
  - API key in header `X-API-Key`
  - HTTP bearer

## Request body

- PriceMonitoringRequest
  - `origin` string, required
  - `destination` string, required
  - `departure_date` string, required
  - `return_date` string
  - `origin_type` 'city' | 'airport': How to read the code: `city` searches every airport of the city, `airport` only that one airport. Omit it and the platform applies one rule: a code that names a multi-airport city is searched as the city; every other code is searched as the airport. Untyped NYC, LON or PAR is the city; untyped JFK, LHR or CDG is the airport; and untyped LAX, MIA or LAS — codes a city shares with its main airport — is the CITY, so results can land at any airport of that city. If the user named the airport, send `airport`; if they named the city, omit the field.
  - `destination_type` 'city' | 'airport': How to read the code: `city` searches every airport of the city, `airport` only that one airport. Omit it and the platform applies one rule: a code that names a multi-airport city is searched as the city; every other code is searched as the airport. Untyped NYC, LON or PAR is the city; untyped JFK, LHR or CDG is the airport; and untyped LAX, MIA or LAS — codes a city shares with its main airport — is the CITY, so results can land at any airport of that city. If the user named the airport, send `airport`; if they named the city, omit the field.
  - `cabin_class` 'economy' | 'premium_economy' | 'business' | 'first'
  - `direct_only` boolean: Only direct flights. Cached fares record whether a fare is direct but not how many stops it makes, so this is the only stop filter here; POST /v1/flight_search takes `max_stops`.
  - `max_total` number: Caps the cached fare’s total. Cached fares are priced for one adult, so this is the cap on one adult’s fare.
  - `include_carriers` string[]
  - `exclude_carriers` string[]
  - `accuracy` 'standard' | 'high': How strict the freshness check on cached fares is. `standard` (default) returns fares estimated to be at least 80% likely to still be available at the cached price; `high` raises that to 95%, so fewer fares come back.
  - `currency` string
  - `locale` string
  - `intent` IntentInput
    - `user_intent` string, nullable: The user's natural-language intent: the Alpic PII-stripped paraphrase when available, else a best-effort fallback to the client-provided NL query.

## Response `200`

Cheapest cached itinerary, or stale on a cache miss

- PriceMonitoringResponse
  - `priced_for` 'one_adult', required: Whose price the cached fares in this answer are: always `one_adult`. Every cached total is one adult's fare; this request takes no passenger counts. Price the whole party with `POST /v1/flight_search`.
  - `status` 'ok' | 'stale', required: `ok`: the cache held a matching itinerary and the cheapest is in `flight`. `stale`: no matching cached itinerary, and `flight` is absent; retry later, or price live with `POST /v1/flight_search`.
  - `monitored_at` string
  - `flight` MonitoredFlight
    - `offer_token` string
    - `total_price` object: One adult's fare (`priced_for: "one_adult"`): the cache holds one-adult fares only. To price the whole party, pass `offer_token` to `POST /v1/flight_search` with the party.
      - `amount` number: Alternative to `value` on some endpoints (the two never appear together); its scale depends on decimal_places. When this object carries decimal_places, amount is an INTEGER in minor units — divide by 10 ** decimal_places (e.g. select_ancillaries total_with_ancillaries). When there is no decimal_places field, amount is a decimal in MAJOR units, safe to display as-is (e.g. trip and checkout totals).
      - `value` integer: Integer amount in MINOR units, always paired with decimal_places — divide by 10 ** decimal_places to display. Example: value 15977 with decimal_places 2 is 159.77 USD. Rendering this field directly shows prices 100x too high for 2-decimal currencies.
      - `currency` string: ISO 4217 currency code.
      - `decimal_places` integer: Scale of the integer value/amount: display = integer / 10 ** decimal_places. Always sent alongside minor-unit amounts. Usually the ISO 4217 digits of the currency (2 for USD/EUR/GBP, 0 for JPY/KRW, 3 for BHD/JOD/KWD) but currency-converted prices can carry a different scale — ALWAYS use the decimal_places sent with the amount, never a hardcoded 2. Only if the field is genuinely absent on a value-shaped object, fall back to the ISO digits for the currency.
      - `display` string: The same figure as a string ready to show: the ISO 4217 code, a space, then the amount, e.g. "USD 159.77". With decimal_places it is written at exactly that scale (value 1561500, JPY, decimal_places 2 is "JPY 15615.00"); without, at the ISO digits of the currency. Show this; compute with the number. Absent when the figure is not money (a cancellation step expressed as a percent or a number of nights) or could not be read unambiguously.
    - `outbound_carrier` MonitoredCarrier
      - `code` string
      - `name` string
      - `flight_number` string: Provider flight number, forwarded unchanged. Depending on the upstream provider it may be a bare number such as `460` or a composed designator such as `AS460`; the carrier code is also carried separately when known.
    - `inbound_carrier` MonitoredCarrier
      - `code` string
      - `name` string
      - `flight_number` string: Provider flight number, forwarded unchanged. Depending on the upstream provider it may be a bare number such as `460` or a composed designator such as `AS460`; the carrier code is also carried separately when known.
    - `outbound_stops` number: Number of stops on the outbound journey. Always sent, `0` for a non-stop.
    - `inbound_stops` number: Number of stops on the return journey. Omitted on a one-way monitor and, unlike `outbound_stops`, also when the return is non-stop. When a return leg is present (`inbound_departure_local` is sent), read an absent `inbound_stops` as `0`.
    - `outbound_duration_minutes` number
    - `inbound_duration_minutes` number
    - `outbound_departure_local` string: Local time at the airport, RFC 3339 WITH that airport’s UTC offset (e.g. `2026-07-15T10:15:00-04:00`), despite the `_local` suffix: the same kind of instant as the datetimes on a cached itinerary leg, not the zone-less `*_local` wall-clock fields of a booked or exchanged itinerary. Parse it as an instant; do not assume UTC and do not compare two of these as strings. On the rare airport whose timezone the platform does not know, the value keeps its local wall-clock digits but is written as UTC (`…Z`).
    - `outbound_arrival_local` string: Local time at the airport, RFC 3339 WITH that airport’s UTC offset (e.g. `2026-07-15T10:15:00-04:00`), despite the `_local` suffix: the same kind of instant as the datetimes on a cached itinerary leg, not the zone-less `*_local` wall-clock fields of a booked or exchanged itinerary. Parse it as an instant; do not assume UTC and do not compare two of these as strings. On the rare airport whose timezone the platform does not know, the value keeps its local wall-clock digits but is written as UTC (`…Z`).
    - `inbound_departure_local` string: Local time at the airport, RFC 3339 WITH that airport’s UTC offset (e.g. `2026-07-15T10:15:00-04:00`), despite the `_local` suffix: the same kind of instant as the datetimes on a cached itinerary leg, not the zone-less `*_local` wall-clock fields of a booked or exchanged itinerary. Parse it as an instant; do not assume UTC and do not compare two of these as strings. On the rare airport whose timezone the platform does not know, the value keeps its local wall-clock digits but is written as UTC (`…Z`).
    - `inbound_arrival_local` string: Local time at the airport, RFC 3339 WITH that airport’s UTC offset (e.g. `2026-07-15T10:15:00-04:00`), despite the `_local` suffix: the same kind of instant as the datetimes on a cached itinerary leg, not the zone-less `*_local` wall-clock fields of a booked or exchanged itinerary. Parse it as an instant; do not assume UTC and do not compare two of these as strings. On the rare airport whose timezone the platform does not know, the value keeps its local wall-clock digits but is written as UTC (`…Z`).
    - `cabin_class` string
    - `fare_brand` string
  - `request_echo` unknown

## Other responses

- `400`: Bad request
- `401`: Authentication required
- `402`: Payment required — organization balance exhausted
- `404`: Resource not found
- `409`: The operation conflicts with the current state of the resource
- `410`: The resource this request names no longer exists
- `422`: Validation error
- `429`: Rate limit or quota exceeded
- `502`: The travel provider rejected the request, or an upstream call failed
- `503`: No travel provider can serve the request right now
- `504`: The travel provider did not answer in time

---

[API](https://skmtc.dev/gojinko/apis/jinko-public-api.md) - [All operations](https://skmtc.dev/gojinko/apis/jinko-public-api/llms.txt) - [OpenAPI document](https://skmtc.dev/gojinko/apis/jinko-public-api/revisions/ac5046767e4c?raw)
