{"openapi":"3.0.0","paths":{"/v1/web/search":{"get":{"description":"Ranked web results for a query, plus the panels the results page carries: a knowledge panel, a direct answer and nearby places. Fetched by a miner on a residential connection.","operationId":"WebController_search","parameters":[{"name":"page","required":false,"in":"query","description":"1 based, up to 5. Use `next_page` from the response.","schema":{"example":1,"type":"number"}},{"name":"country","required":false,"in":"query","description":"ISO 3166-1 alpha-2. Defaults to `us`.","schema":{"example":"us","type":"string"}},{"name":"query","required":true,"in":"query","schema":{"example":"best pour over kettle","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebSearchResponseDto"}}}},"400":{"description":"A parameter is missing, invalid or not recognized.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorDto"}}}},"401":{"description":"Invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorDto"}}}},"429":{"description":"Monthly quota exhausted. Hard stop, no overage.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorDto"}}}},"500":{"description":"With `code` `unavailable`, the request could not be completed right now. The failure is transient: retry after the number of seconds in the `Retry-After` header. Any other `code` is an internal error.","headers":{"Retry-After":{"description":"Seconds to wait before retrying. Sent with `code` `unavailable`.","schema":{"type":"integer","example":30}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorDto"}}}}},"security":[{"api_key":[]},{"x-api-key":[]}],"summary":"Search the web","tags":["web"]}},"/v1/web/fetch":{"get":{"description":"Opens a URL in a real browser on a residential connection and returns what a reader would see: the page as markdown, its title, its language, its publication date where it states one, and the links it carries. Pages that refuse a plain HTTP client usually answer this one.","operationId":"WebController_fetch","parameters":[{"name":"url","required":true,"in":"query","description":"The page to read. Must be a public http(s) URL: private, loopback and link local addresses are refused.","schema":{"example":"https://example.com/articles/coffee","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebFetchResponseDto"}}}},"400":{"description":"A parameter is missing, invalid or not recognized.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorDto"}}}},"401":{"description":"Invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorDto"}}}},"429":{"description":"Monthly quota exhausted. Hard stop, no overage.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorDto"}}}},"500":{"description":"With `code` `unavailable`, the request could not be completed right now. The failure is transient: retry after the number of seconds in the `Retry-After` header. Any other `code` is an internal error.","headers":{"Retry-After":{"description":"Seconds to wait before retrying. Sent with `code` `unavailable`.","schema":{"type":"integer","example":30}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorDto"}}}}},"security":[{"api_key":[]},{"x-api-key":[]}],"summary":"Read one page","tags":["web"]}},"/v1/news/search":{"get":{"description":"Recent stories for a query, newest and most relevant first, with the publisher and how long ago each was published.","operationId":"NewsController_search","parameters":[{"name":"page","required":false,"in":"query","description":"1 based, up to 5.","schema":{"example":1,"type":"number"}},{"name":"country","required":false,"in":"query","description":"ISO 3166-1 alpha-2. Defaults to `us`.","schema":{"example":"us","type":"string"}},{"name":"query","required":true,"in":"query","schema":{"example":"coffee prices","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewsSearchResponseDto"}}}},"400":{"description":"A parameter is missing, invalid or not recognized.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorDto"}}}},"401":{"description":"Invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorDto"}}}},"429":{"description":"Monthly quota exhausted. Hard stop, no overage.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorDto"}}}},"500":{"description":"With `code` `unavailable`, the request could not be completed right now. The failure is transient: retry after the number of seconds in the `Retry-After` header. Any other `code` is an internal error.","headers":{"Retry-After":{"description":"Seconds to wait before retrying. Sent with `code` `unavailable`.","schema":{"type":"integer","example":30}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorDto"}}}}},"security":[{"api_key":[]},{"x-api-key":[]}],"summary":"Search news stories","tags":["news"]}},"/v1/places/search":{"get":{"description":"Businesses and points of interest for a query, with category, address, rating and review count. Targeted with `near`, which is a map viewport rather than a place name.","operationId":"PlacesController_search","parameters":[{"name":"page","required":false,"in":"query","description":"1 based, up to 4. A deep page costs a miner real work.","schema":{"example":1,"type":"number"}},{"name":"country","required":false,"in":"query","description":"ISO 3166-1 alpha-2. Defaults to `us`.","schema":{"example":"us","type":"string"}},{"name":"near","required":false,"in":"query","description":"Where to look: `lat,lng` or `lat,lng,zoom`. Zoom runs 3 (region) to 21 (street); it defaults to 14.","schema":{"example":"30.2672,-97.7431,14","type":"string"}},{"name":"query","required":true,"in":"query","schema":{"example":"coffee","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlacesSearchResponseDto"}}}},"400":{"description":"A parameter is missing, invalid or not recognized.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorDto"}}}},"401":{"description":"Invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorDto"}}}},"429":{"description":"Monthly quota exhausted. Hard stop, no overage.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorDto"}}}},"500":{"description":"With `code` `unavailable`, the request could not be completed right now. The failure is transient: retry after the number of seconds in the `Retry-After` header. Any other `code` is an internal error.","headers":{"Retry-After":{"description":"Seconds to wait before retrying. Sent with `code` `unavailable`.","schema":{"type":"integer","example":30}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorDto"}}}}},"security":[{"api_key":[]},{"x-api-key":[]}],"summary":"Find places","tags":["places"]}},"/v1/places/{id}":{"get":{"description":"Everything the listing leaves out for one place: address, phone, website, opening hours, coordinates and the description. Takes the `id` a places search returned.","operationId":"PlacesController_details","parameters":[{"name":"id","required":true,"in":"path","description":"The `id` of a place from a places search.","schema":{"example":"san1.QkFEQ0FGRTAxMjM0NTY3ODk","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlaceDetailsResponseDto"}}}},"400":{"description":"A parameter is missing, invalid or not recognized.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorDto"}}}},"401":{"description":"Invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorDto"}}}},"404":{"description":"The id is not one this API issued.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorDto"}}}},"429":{"description":"Monthly quota exhausted. Hard stop, no overage.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorDto"}}}},"500":{"description":"With `code` `unavailable`, the request could not be completed right now. The failure is transient: retry after the number of seconds in the `Retry-After` header. Any other `code` is an internal error.","headers":{"Retry-After":{"description":"Seconds to wait before retrying. Sent with `code` `unavailable`.","schema":{"type":"integer","example":30}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorDto"}}}}},"security":[{"api_key":[]},{"x-api-key":[]}],"summary":"One place in full","tags":["places"]}},"/v1/places/{id}/reviews":{"get":{"description":"What people wrote about a place, most relevant first, up to ten. Takes the `id` a places search returned. One page: `next_page` is always null.","operationId":"PlacesController_reviews","parameters":[{"name":"id","required":true,"in":"path","description":"The `id` of a place from a places search.","schema":{"example":"san1.QkFEQ0FGRTAxMjM0NTY3ODk","type":"string"}},{"name":"page","required":false,"in":"query","description":"1 based. Only page 1 exists for this resource.","schema":{"example":1,"type":"number"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlaceReviewsResponseDto"}}}},"400":{"description":"A parameter is missing, invalid or not recognized.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorDto"}}}},"401":{"description":"Invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorDto"}}}},"404":{"description":"The id is not one this API issued.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorDto"}}}},"429":{"description":"Monthly quota exhausted. Hard stop, no overage.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorDto"}}}},"500":{"description":"With `code` `unavailable`, the request could not be completed right now. The failure is transient: retry after the number of seconds in the `Retry-After` header. Any other `code` is an internal error.","headers":{"Retry-After":{"description":"Seconds to wait before retrying. Sent with `code` `unavailable`.","schema":{"type":"integer","example":30}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorDto"}}}}},"security":[{"api_key":[]},{"x-api-key":[]}],"summary":"Reviews for one place","tags":["places"]}},"/v1/hotels/search":{"get":{"description":"Hotels and rentals for a destination and a set of dates, with nightly and total rates, rating, star class and amenities. Prices are for the exact stay, so the dates are required.","operationId":"HotelsController_search","parameters":[{"name":"page","required":false,"in":"query","description":"1 based, up to 5.","schema":{"example":1,"type":"number"}},{"name":"country","required":false,"in":"query","description":"ISO 3166-1 alpha-2. Defaults to `us`.","schema":{"example":"us","type":"string"}},{"name":"currency","required":false,"in":"query","description":"ISO 4217. Defaults to the currency of `country`.","schema":{"example":"USD","type":"string"}},{"name":"stars","required":false,"in":"query","description":"Comma list of star classes, 1 to 5.","schema":{"example":"4,5","type":"string"}},{"name":"check_out","required":true,"in":"query","description":"YYYY-MM-DD. 1 to 30 nights after `check_in`.","schema":{"example":"2026-10-19","type":"string"}},{"name":"check_in","required":true,"in":"query","description":"YYYY-MM-DD. Not in the past.","schema":{"example":"2026-10-15","type":"string"}},{"name":"query","required":true,"in":"query","description":"The destination: a city, a neighbourhood or a landmark.","schema":{"example":"Tokyo","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HotelsSearchResponseDto"}}}},"400":{"description":"A parameter is missing, invalid or not recognized.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorDto"}}}},"401":{"description":"Invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorDto"}}}},"429":{"description":"Monthly quota exhausted. Hard stop, no overage.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorDto"}}}},"500":{"description":"With `code` `unavailable`, the request could not be completed right now. The failure is transient: retry after the number of seconds in the `Retry-After` header. Any other `code` is an internal error.","headers":{"Retry-After":{"description":"Seconds to wait before retrying. Sent with `code` `unavailable`.","schema":{"type":"integer","example":30}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorDto"}}}}},"security":[{"api_key":[]},{"x-api-key":[]}],"summary":"Find places to stay","tags":["hotels"]}},"/v1/hotels/{id}":{"get":{"description":"Everything the listing leaves out for one property: address, site, description, check-in and check-out times, the full amenity list and who is offering the stay. Takes the `id` a hotels search returned. Give the dates to get rates: without them no prices are quoted, because every rate is a function of the stay.","operationId":"HotelsController_details","parameters":[{"name":"id","required":true,"in":"path","description":"The `id` of a property from a hotels search.","schema":{"example":"san1.QkFEQ0FGRTAxMjM0NTY3ODk","type":"string"}},{"name":"country","required":false,"in":"query","description":"ISO 3166-1 alpha-2. Defaults to `us`.","schema":{"example":"us","type":"string"}},{"name":"currency","required":false,"in":"query","description":"ISO 4217. Defaults to the currency of `country`.","schema":{"example":"USD","type":"string"}},{"name":"check_out","required":false,"in":"query","description":"YYYY-MM-DD. 1 to 30 nights after `check_in`.","schema":{"example":"2026-10-18","type":"string"}},{"name":"check_in","required":false,"in":"query","description":"YYYY-MM-DD. Not in the past. Required with `check_out`.","schema":{"example":"2026-10-15","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HotelDetailsResponseDto"}}}},"400":{"description":"A parameter is missing, invalid or not recognized.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorDto"}}}},"401":{"description":"Invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorDto"}}}},"404":{"description":"The id is not one this API issued.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorDto"}}}},"429":{"description":"Monthly quota exhausted. Hard stop, no overage.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorDto"}}}},"500":{"description":"With `code` `unavailable`, the request could not be completed right now. The failure is transient: retry after the number of seconds in the `Retry-After` header. Any other `code` is an internal error.","headers":{"Retry-After":{"description":"Seconds to wait before retrying. Sent with `code` `unavailable`.","schema":{"type":"integer","example":30}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorDto"}}}}},"security":[{"api_key":[]},{"x-api-key":[]}],"summary":"One property in full","tags":["hotels"]}},"/v1/hotels/{id}/reviews":{"get":{"description":"What guests wrote about a property, most relevant first. Takes the `id` a hotels search returned. One page: the listing offers no further reviews.","operationId":"HotelsController_reviews","parameters":[{"name":"id","required":true,"in":"path","description":"The `id` of a property from a hotels search.","schema":{"example":"san1.QkFEQ0FGRTAxMjM0NTY3ODk","type":"string"}},{"name":"page","required":false,"in":"query","description":"1 based. Only page 1 exists for this resource.","schema":{"example":1,"type":"number"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HotelReviewsResponseDto"}}}},"400":{"description":"A parameter is missing, invalid or not recognized.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorDto"}}}},"401":{"description":"Invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorDto"}}}},"404":{"description":"The id is not one this API issued.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorDto"}}}},"429":{"description":"Monthly quota exhausted. Hard stop, no overage.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorDto"}}}},"500":{"description":"With `code` `unavailable`, the request could not be completed right now. The failure is transient: retry after the number of seconds in the `Retry-After` header. Any other `code` is an internal error.","headers":{"Retry-After":{"description":"Seconds to wait before retrying. Sent with `code` `unavailable`.","schema":{"type":"integer","example":30}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorDto"}}}}},"security":[{"api_key":[]},{"x-api-key":[]}],"summary":"Reviews for one property","tags":["hotels"]}},"/v1/flights/search":{"get":{"description":"Itineraries for a route and date. Supplying `return_date` makes it a round trip; leaving it out makes it one way. A round trip lists outbound options, each with an `id` you pass to the returns endpoint to see what pairs with it.","operationId":"FlightsController_search","parameters":[{"name":"country","required":false,"in":"query","description":"ISO 3166-1 alpha-2. Defaults to `us`.","schema":{"example":"us","type":"string"}},{"name":"cabin","required":false,"in":"query","description":"Cabin class. Defaults to `economy`. Any other cabin needs three-letter airport or city codes in `from` and `to`.","schema":{"enum":["economy","premium_economy","business","first"],"type":"string"}},{"name":"currency","required":false,"in":"query","description":"ISO 4217. Defaults to the currency of `country`.","schema":{"example":"USD","type":"string"}},{"name":"return_date","required":false,"in":"query","description":"YYYY-MM-DD, after `departure_date`. Omit for one way.","schema":{"example":"2026-10-19","type":"string"}},{"name":"departure_date","required":true,"in":"query","description":"YYYY-MM-DD. Not in the past.","schema":{"example":"2026-10-15","type":"string"}},{"name":"to","required":true,"in":"query","schema":{"example":"NRT","type":"string"}},{"name":"from","required":true,"in":"query","description":"Airport code or city name.","schema":{"example":"SIN","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlightsSearchResponseDto"}}}},"400":{"description":"A parameter is missing, invalid or not recognized.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorDto"}}}},"401":{"description":"Invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorDto"}}}},"429":{"description":"Monthly quota exhausted. Hard stop, no overage.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorDto"}}}},"500":{"description":"With `code` `unavailable`, the request could not be completed right now. The failure is transient: retry after the number of seconds in the `Retry-After` header. Any other `code` is an internal error.","headers":{"Retry-After":{"description":"Seconds to wait before retrying. Sent with `code` `unavailable`.","schema":{"type":"integer","example":30}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorDto"}}}}},"security":[{"api_key":[]},{"x-api-key":[]}],"summary":"Search flights","tags":["flights"]}},"/v1/flights/status":{"get":{"description":"Where a flight number is in its day: the airports it connects, terminals and gates where they are announced, the scheduled times and the estimated or actual ones once they move. Only a few days either side of today are covered, so a day outside that answers 404.","operationId":"FlightsController_status","parameters":[{"name":"country","required":false,"in":"query","description":"ISO 3166-1 alpha-2. Defaults to `us`.","schema":{"example":"us","type":"string"}},{"name":"date","required":false,"in":"query","description":"YYYY-MM-DD. Omit for the day the source opens on, which is the flight happening now.","schema":{"example":"2026-09-12","type":"string"}},{"name":"flight","required":true,"in":"query","description":"Airline code and number, with or without a space.","schema":{"example":"BA112","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlightStatusResponseDto"}}}},"400":{"description":"A parameter is missing, invalid or not recognized.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorDto"}}}},"401":{"description":"Invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorDto"}}}},"404":{"description":"No status for that flight on that day.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorDto"}}}},"429":{"description":"Monthly quota exhausted. Hard stop, no overage.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorDto"}}}},"500":{"description":"With `code` `unavailable`, the request could not be completed right now. The failure is transient: retry after the number of seconds in the `Retry-After` header. Any other `code` is an internal error.","headers":{"Retry-After":{"description":"Seconds to wait before retrying. Sent with `code` `unavailable`.","schema":{"type":"integer","example":30}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorDto"}}}}},"security":[{"api_key":[]},{"x-api-key":[]}],"summary":"Live status of one flight","tags":["flights"]}},"/v1/flights/{id}/returns":{"get":{"description":"The return legs that pair with an outbound itinerary from a round trip search. Send the same route, dates and cabin alongside the itinerary id; `return_date` is required here.","operationId":"FlightsController_returns","parameters":[{"name":"id","required":true,"in":"path","description":"The `id` of an outbound itinerary from a round trip search.","schema":{"example":"san1.QkFEQ0FGRTAxMjM0NTY3ODk","type":"string"}},{"name":"country","required":false,"in":"query","description":"ISO 3166-1 alpha-2. Defaults to `us`.","schema":{"example":"us","type":"string"}},{"name":"cabin","required":false,"in":"query","description":"Cabin class. Defaults to `economy`. Any other cabin needs three-letter airport or city codes in `from` and `to`. Send the same cabin as the search that produced the `id`, or the itinerary will not be found.","schema":{"enum":["economy","premium_economy","business","first"],"type":"string"}},{"name":"currency","required":false,"in":"query","description":"ISO 4217. Defaults to the currency of `country`.","schema":{"example":"USD","type":"string"}},{"name":"return_date","required":true,"in":"query","schema":{"example":"2026-10-19","type":"string"}},{"name":"departure_date","required":true,"in":"query","schema":{"example":"2026-10-15","type":"string"}},{"name":"to","required":true,"in":"query","schema":{"example":"NRT","type":"string"}},{"name":"from","required":true,"in":"query","schema":{"example":"SIN","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlightsSearchResponseDto"}}}},"400":{"description":"A parameter is missing, invalid or not recognized.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorDto"}}}},"401":{"description":"Invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorDto"}}}},"404":{"description":"That itinerary is no longer listed, or was found under another cabin. Run the search again for a fresh id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorDto"}}}},"429":{"description":"Monthly quota exhausted. Hard stop, no overage.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorDto"}}}},"500":{"description":"With `code` `unavailable`, the request could not be completed right now. The failure is transient: retry after the number of seconds in the `Retry-After` header. Any other `code` is an internal error.","headers":{"Retry-After":{"description":"Seconds to wait before retrying. Sent with `code` `unavailable`.","schema":{"type":"integer","example":30}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorDto"}}}}},"security":[{"api_key":[]},{"x-api-key":[]}],"summary":"Return options for one outbound itinerary","tags":["flights"]}},"/v1/flights/{id}/bookings":{"get":{"description":"Who sells this itinerary and for how much. Takes the `id` of a one-way itinerary or of a return option, with the same route, dates and cabin as the search that produced it. Each option carries a `link` that takes a person to the seller; the links stop working after a day, so ask again rather than storing them.","operationId":"FlightsController_bookings","parameters":[{"name":"id","required":true,"in":"path","description":"The `id` of a one-way itinerary or of a return option.","schema":{"example":"san1.QkFEQ0FGRTAxMjM0NTY3ODk","type":"string"}},{"name":"country","required":false,"in":"query","description":"ISO 3166-1 alpha-2. Defaults to `us`.","schema":{"example":"us","type":"string"}},{"name":"cabin","required":false,"in":"query","description":"Cabin class. Defaults to `economy`. Any other cabin needs three-letter airport or city codes in `from` and `to`. Send the same cabin as the search that produced the `id`, or the itinerary will not be found.","schema":{"enum":["economy","premium_economy","business","first"],"type":"string"}},{"name":"currency","required":false,"in":"query","description":"ISO 4217. Defaults to the currency of `country`.","schema":{"example":"USD","type":"string"}},{"name":"return_date","required":false,"in":"query","description":"Required when the id came from a round trip.","schema":{"example":"2026-10-19","type":"string"}},{"name":"departure_date","required":true,"in":"query","schema":{"example":"2026-10-15","type":"string"}},{"name":"to","required":true,"in":"query","schema":{"example":"NRT","type":"string"}},{"name":"from","required":true,"in":"query","schema":{"example":"SIN","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlightBookingsResponseDto"}}}},"400":{"description":"A parameter is missing, invalid or not recognized.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorDto"}}}},"401":{"description":"Invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorDto"}}}},"404":{"description":"That itinerary is no longer listed, or was found under another cabin. Run the search again for a fresh id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorDto"}}}},"429":{"description":"Monthly quota exhausted. Hard stop, no overage.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorDto"}}}},"500":{"description":"With `code` `unavailable`, the request could not be completed right now. The failure is transient: retry after the number of seconds in the `Retry-After` header. Any other `code` is an internal error.","headers":{"Retry-After":{"description":"Seconds to wait before retrying. Sent with `code` `unavailable`.","schema":{"type":"integer","example":30}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorDto"}}}}},"security":[{"api_key":[]},{"x-api-key":[]}],"summary":"Ways to book one itinerary","tags":["flights"]}},"/v1/finance/quote":{"get":{"description":"The current price for a ticker, index, currency pair or crypto pair, with a chart series for the requested window, headline statistics, recent stories and published financials.","operationId":"FinanceController_quote","parameters":[{"name":"window","required":false,"in":"query","description":"Chart range. Defaults to 1D and is always echoed back.","schema":{"enum":["1D","5D","1M","6M","YTD","1Y","5Y","MAX"],"type":"string"}},{"name":"symbol","required":true,"in":"query","description":"A ticker, not free text. `AAPL:NASDAQ`, `.DJI:INDEXDJX`, `EUR-USD`, `BTC-USD`, or a bare `AAPL`.","schema":{"example":"AAPL:NASDAQ","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinanceQuoteResponseDto"}}}},"400":{"description":"A parameter is missing, invalid or not recognized.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorDto"}}}},"401":{"description":"Invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorDto"}}}},"404":{"description":"No quote exists for this symbol.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorDto"}}}},"429":{"description":"Monthly quota exhausted. Hard stop, no overage.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorDto"}}}},"500":{"description":"With `code` `unavailable`, the request could not be completed right now. The failure is transient: retry after the number of seconds in the `Retry-After` header. Any other `code` is an internal error.","headers":{"Retry-After":{"description":"Seconds to wait before retrying. Sent with `code` `unavailable`.","schema":{"type":"integer","example":30}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorDto"}}}}},"security":[{"api_key":[]},{"x-api-key":[]}],"summary":"Quote and chart for one symbol","tags":["finance"]}},"/v1/shopping/search":{"get":{"description":"Ranked products for a query, with the price, the rating, the delivery terms to `country` and a link to buy. Pass a row's `id` to `/v1/shopping/{id}` for the full product. Only products that can be bought for `country` are listed. One page: there are no further results. Every price states its own currency.","operationId":"ShoppingController_search","parameters":[{"name":"country","required":false,"in":"query","description":"ISO 3166-1 alpha-2. Defaults to `us`.","schema":{"example":"us","type":"string"}},{"name":"query","required":true,"in":"query","description":"What to shop for.","schema":{"example":"wireless headphones","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShoppingSearchResponseDto"}}}},"400":{"description":"A parameter is missing, invalid or not recognized.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorDto"}}}},"401":{"description":"Invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorDto"}}}},"429":{"description":"Monthly quota exhausted. Hard stop, no overage.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorDto"}}}},"500":{"description":"With `code` `unavailable`, the request could not be completed right now. The failure is transient: retry after the number of seconds in the `Retry-After` header. Any other `code` is an internal error.","headers":{"Retry-After":{"description":"Seconds to wait before retrying. Sent with `code` `unavailable`.","schema":{"type":"integer","example":30}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorDto"}}}}},"security":[{"api_key":[]},{"x-api-key":[]}],"summary":"Find products to buy","tags":["shopping"]}},"/v1/shopping/{id}":{"get":{"description":"Everything a search row leaves out for one product: its description, highlights, specification table and images, and every way to buy it with its own price and link. The default option comes first and is marked `selected`. A product that cannot be shipped to `country` has no price on that offer and says why in `availability`. Takes the `id` a shopping search (or an offer) returned.","operationId":"ShoppingController_product","parameters":[{"name":"id","required":true,"in":"path","description":"The `id` of a row from a shopping search.","schema":{"example":"san1.QkFEQ0FGRTAxMjM0NTY3ODk","type":"string"}},{"name":"country","required":false,"in":"query","description":"ISO 3166-1 alpha-2. Defaults to `us`.","schema":{"example":"us","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductResponseDto"}}}},"400":{"description":"A parameter is missing, invalid or not recognized.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorDto"}}}},"401":{"description":"Invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorDto"}}}},"404":{"description":"The id is not one this API issued, or the marketplace no longer lists the product.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorDto"}}}},"429":{"description":"Monthly quota exhausted. Hard stop, no overage.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorDto"}}}},"500":{"description":"With `code` `unavailable`, the request could not be completed right now. The failure is transient: retry after the number of seconds in the `Retry-After` header. Any other `code` is an internal error.","headers":{"Retry-After":{"description":"Seconds to wait before retrying. Sent with `code` `unavailable`.","schema":{"type":"integer","example":30}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorDto"}}}}},"security":[{"api_key":[]},{"x-api-key":[]}],"summary":"One product and how to buy it","tags":["shopping"]}},"/v1/account":{"get":{"description":"What the presented key can still spend this month. Check it before a long run of searches.","operationId":"AccountController_account","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicAccountDto"}}}},"400":{"description":"A parameter is missing, invalid or not recognized.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorDto"}}}},"401":{"description":"Invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorDto"}}}}},"security":[{"api_key":[]},{"x-api-key":[]}],"summary":"Plan and remaining budget","tags":["account"]}}},"info":{"title":"SAN API","description":"Web data and context for agents, served by a network of miners running real browsers on residential connections. One resource per thing an agent asks for: search the web, read the news, find places, hotels and flights, and quote a symbol. Present an API key as `Authorization: Bearer san_...`. Every response is snake_case JSON and every error is `{ error: { code, message, param } }`.","version":"0.0.8","contact":{}},"tags":[{"name":"web","description":"Web search"},{"name":"news","description":"News search"},{"name":"places","description":"Places search"},{"name":"hotels","description":"Stays search"},{"name":"flights","description":"Flight search"},{"name":"finance","description":"Quotes and charts"},{"name":"shopping","description":"Products and sellers"},{"name":"account","description":"Plan and remaining budget"}],"servers":[],"components":{"securitySchemes":{"api_key":{"scheme":"bearer","bearerFormat":"JWT","type":"http","description":"Public API key: `Authorization: Bearer san_...`."},"x-api-key":{"type":"apiKey","in":"header","name":"X-Api-Key","description":"The same public API key, as a header."}},"schemas":{"PublicErrorBodyDto":{"type":"object","properties":{"code":{"type":"string","enum":["unauthorized","missing_parameter","invalid_parameter","not_found","quota_exceeded","rate_limited","unavailable","expired","internal_error"],"example":"missing_parameter"},"message":{"type":"string","example":"Missing parameter `query`."},"param":{"type":"string","example":"query","description":"The parameter at fault, when one parameter is at fault."}},"required":["code","message"]},"PublicErrorDto":{"type":"object","properties":{"error":{"$ref":"#/components/schemas/PublicErrorBodyDto"}},"required":["error"]},"WebResultDto":{"type":"object","properties":{"position":{"type":"number","example":1,"description":"Rank within this page, 1 based."},"title":{"type":"string","example":"How to brew better coffee"},"link":{"type":"string","example":"https://example.com/brewing-guide","description":"Destination URL; absent when the destination could not be resolved."},"displayed_link":{"type":"string","example":"example.com","description":"The host as shown to a reader."},"snippet":{"type":"string","example":"A short extract from the page."},"date":{"type":"string","example":"3 Sep 2026","description":"Publication date, when one is shown."}},"required":["position","title"]},"AnswerDto":{"type":"object","properties":{"type":{"type":"string","enum":["calculator","weather","dictionary","translation","unit_converter","currency","snippet","finance"],"example":"snippet","description":"What kind of answer this is. Absent when it is unclear."},"title":{"type":"string","example":"Coffee"},"result":{"type":"string","example":"3 minutes","description":"The short direct answer, when there is one."},"snippet":{"type":"string","example":"Longer supporting text."},"link":{"type":"string","example":"https://example.com/coffee"}}},"LocalPlaceDto":{"type":"object","properties":{"position":{"type":"number","example":1},"name":{"type":"string","example":"Radio Coffee and Beer"},"type":{"type":"string","example":"Coffee shop"},"address":{"type":"string","example":"3504 Manchaca Rd"},"rating":{"type":"number","example":4.6},"reviews":{"type":"number","example":1198}},"required":["position","name"]},"WebSearchResponseDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Id of this request. Quote it when reporting a problem."},"took_ms":{"type":"number","example":1420,"description":"How long the request took, in milliseconds."},"request":{"type":"object","additionalProperties":true,"description":"The parameters as accepted, after defaults and normalization. What the request actually ran with.","example":{"query":"coffee","country":"us","page":1}},"next_page":{"type":"number","nullable":true,"example":2,"description":"The next page to ask for, or null when there is no further page. Never a page this endpoint would reject."},"results":{"type":"array","items":{"$ref":"#/components/schemas/WebResultDto"}},"knowledge_panel":{"type":"object","additionalProperties":true,"description":"The entity panel for the query, when one is shown. Beside `title`, `type`, `description` and `source`, every fact is its own top-level string key with a normalized name (`date_of_birth`, `origin`).","example":{"title":"Coffee","type":"Drink","description":"Coffee is a beverage brewed from roasted coffee beans.","source":{"name":"Wikipedia","link":"https://en.wikipedia.org/wiki/Coffee"},"origin":"Ethiopia"}},"answer":{"$ref":"#/components/schemas/AnswerDto"},"local_places":{"description":"Nearby businesses shown for a local query. Use the places resource for a full list.","type":"array","items":{"$ref":"#/components/schemas/LocalPlaceDto"}}},"required":["id","took_ms","request","next_page","results"]},"PageLinkDto":{"type":"object","properties":{"text":{"type":"string","example":"Brewing guide","description":"The link text as the page prints it. May be empty."},"href":{"type":"string","example":"https://example.com/brewing-guide","description":"Absolute, resolved against the page."}},"required":["text","href"]},"FetchedPageDto":{"type":"object","properties":{"url":{"type":"string","example":"https://example.com/articles/coffee","description":"The URL as it was asked for."},"final_url":{"type":"string","example":"https://example.com/articles/coffee?ref=home","description":"Where the browser ended up, redirects followed."},"title":{"type":"string","example":"How to brew better coffee"},"content":{"type":"string","example":"# How to brew better coffee\n\nStart with fresh beans.","description":"The readable content of the page as markdown: headings, paragraphs, lists, quotes, code, tables and links. Navigation, adverts and other furniture are left out. Capped at 200,000 characters."},"content_type":{"type":"string","enum":["markdown"],"example":"markdown"},"language":{"type":"string","example":"en","description":"BCP 47, as the page declares it."},"published":{"type":"string","example":"2026-09-10T15:38:56.973Z","description":"Publication date, present only when the page states one in ISO 8601. A date written in prose is not guessed at."},"links":{"description":"Outbound links inside the content, in page order, deduplicated. Up to 200.","type":"array","items":{"$ref":"#/components/schemas/PageLinkDto"}},"fetched_at":{"type":"string","example":"2026-09-10T21:39:24.045Z","description":"When the page was read."},"truncated":{"type":"boolean","example":true,"description":"Present only when the page was longer than the cap."}},"required":["url","final_url","title","content","content_type","links","fetched_at"]},"WebFetchResponseDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Id of this request. Quote it when reporting a problem."},"took_ms":{"type":"number","example":1420,"description":"How long the request took, in milliseconds."},"request":{"type":"object","additionalProperties":true,"description":"The parameters as accepted, after defaults and normalization. What the request actually ran with.","example":{"query":"coffee","country":"us","page":1}},"page":{"$ref":"#/components/schemas/FetchedPageDto"}},"required":["id","took_ms","request","page"]},"NewsResultDto":{"type":"object","properties":{"position":{"type":"number","example":1},"title":{"type":"string","example":"Coffee prices hit a ten year high"},"link":{"type":"string","example":"https://example.com/story","description":"Destination URL; absent when the destination could not be resolved."},"source":{"type":"string","example":"Reuters","description":"Publisher."},"date":{"type":"string","example":"2 hours ago","description":"As shown on the story card."},"snippet":{"type":"string"},"thumbnail":{"type":"string","description":"Card image, when one is shown."}},"required":["position","title"]},"NewsSearchResponseDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Id of this request. Quote it when reporting a problem."},"took_ms":{"type":"number","example":1420,"description":"How long the request took, in milliseconds."},"request":{"type":"object","additionalProperties":true,"description":"The parameters as accepted, after defaults and normalization. What the request actually ran with.","example":{"query":"coffee","country":"us","page":1}},"next_page":{"type":"number","nullable":true,"example":2,"description":"The next page to ask for, or null when there is no further page. Never a page this endpoint would reject."},"results":{"type":"array","items":{"$ref":"#/components/schemas/NewsResultDto"}}},"required":["id","took_ms","request","next_page","results"]},"PlaceResultDto":{"type":"object","properties":{"id":{"type":"string","example":"san1.QkFEQ0FGRTAxMjM0NTY3ODk","description":"Opaque handle for this place. Absent when the listing carried no detail page."},"position":{"type":"number","example":1},"name":{"type":"string","example":"Radio Coffee and Beer"},"type":{"type":"string","example":"Coffee shop"},"address":{"type":"string","example":"3504 Manchaca Rd, Austin, TX"},"rating":{"type":"number","example":4.6},"reviews":{"type":"number","example":1198},"price":{"type":"string","example":"$$","description":"Price level as shown."}},"required":["position","name"]},"PlacesSearchResponseDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Id of this request. Quote it when reporting a problem."},"took_ms":{"type":"number","example":1420,"description":"How long the request took, in milliseconds."},"request":{"type":"object","additionalProperties":true,"description":"The parameters as accepted, after defaults and normalization. What the request actually ran with.","example":{"query":"coffee","country":"us","page":1}},"next_page":{"type":"number","nullable":true,"example":2,"description":"The next page to ask for, or null when there is no further page. Never a page this endpoint would reject."},"results":{"type":"array","items":{"$ref":"#/components/schemas/PlaceResultDto"}}},"required":["id","took_ms","request","next_page","results"]},"PlaceDetailsRequestEchoDto":{"type":"object","properties":{"id":{"type":"string","example":"san1.QkFEQ0FGRTAxMjM0NTY3ODk"}},"required":["id"]},"PlaceHoursDto":{"type":"object","properties":{"day":{"type":"string","example":"Monday"},"open":{"type":"string","example":"08:00","description":"24 hour HH:MM. Absent on a day the place is closed."},"close":{"type":"string","example":"22:00","description":"24 hour HH:MM. `24:00` means it does not close that day."}},"required":["day"]},"CoordinatesDto":{"type":"object","properties":{"lat":{"type":"number","example":30.2953381},"lng":{"type":"number","example":-97.7365673}},"required":["lat","lng"]},"PlaceDetailDto":{"type":"object","properties":{"name":{"type":"string","example":"Radio Coffee and Beer"},"type":{"type":"string","example":"Coffee shop"},"address":{"type":"string","example":"12 Example St, Springfield"},"phone":{"type":"string","example":"+1 555-0100"},"website":{"type":"string","example":"https://example.com/","description":"The business's own site."},"rating":{"type":"number","example":4.6},"reviews":{"type":"number","example":1198},"price":{"type":"string","example":"$$","description":"Price level as shown."},"hours":{"nullable":true,"description":"One entry per opening span, so a day with two shifts appears twice, and a day with no times is a day it is closed. Null when the page lists no hours at all.","type":"array","items":{"$ref":"#/components/schemas/PlaceHoursDto"}},"open_now":{"type":"boolean","example":true,"description":"Only when the page states it."},"coordinates":{"$ref":"#/components/schemas/CoordinatesDto"},"description":{"type":"string","example":"Roomy cafe and beer garden with a food truck out back."}},"required":["name","hours"]},"PlaceDetailsResponseDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Id of this request. Quote it when reporting a problem."},"took_ms":{"type":"number","example":1420,"description":"How long the request took, in milliseconds."},"request":{"additionalProperties":true,"description":"The parameters as accepted, after defaults and normalization. What the request actually ran with.","example":{"id":"san1.QkFEQ0FGRTAxMjM0NTY3ODk"},"allOf":[{"$ref":"#/components/schemas/PlaceDetailsRequestEchoDto"}]},"place":{"$ref":"#/components/schemas/PlaceDetailDto"}},"required":["id","took_ms","request","place"]},"PlaceReviewsRequestEchoDto":{"type":"object","properties":{"id":{"type":"string","example":"san1.QkFEQ0FGRTAxMjM0NTY3ODk"},"page":{"type":"number","example":1}},"required":["id","page"]},"PlaceReviewDto":{"type":"object","properties":{"position":{"type":"number","example":1,"description":"Rank within this page, 1 based."},"author":{"type":"string","example":"Alex M"},"rating":{"type":"number","example":5,"description":"Stars, 1 to 5."},"date":{"type":"string","example":"2 months ago","description":"As displayed, which is usually relative."},"text":{"type":"string","example":"Great coffee and plenty of room to work.","description":"Absent for a rating left with no words."},"owner_reply":{"type":"string","example":"Thanks for visiting, see you soon."}},"required":["position","author"]},"PlaceReviewsResponseDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Id of this request. Quote it when reporting a problem."},"took_ms":{"type":"number","example":1420,"description":"How long the request took, in milliseconds."},"request":{"additionalProperties":true,"description":"The parameters as accepted, after defaults and normalization. What the request actually ran with.","example":{"id":"san1.QkFEQ0FGRTAxMjM0NTY3ODk","page":1},"allOf":[{"$ref":"#/components/schemas/PlaceReviewsRequestEchoDto"}]},"next_page":{"type":"number","nullable":true,"example":2,"description":"The next page to ask for, or null when there is no further page. Never a page this endpoint would reject."},"results":{"type":"array","items":{"$ref":"#/components/schemas/PlaceReviewDto"}}},"required":["id","took_ms","request","next_page","results"]},"MoneyDto":{"type":"object","properties":{"amount":{"type":"number","example":180,"description":"The amount as a number."},"display":{"type":"string","example":"$180","description":"The same amount as displayed, with its currency."}},"required":["amount","display"]},"HotelResultDto":{"type":"object","properties":{"id":{"type":"string","example":"san1.QkFEQ0FGRTAxMjM0NTY3ODk","description":"Opaque handle for this property."},"position":{"type":"number","example":1},"name":{"type":"string","example":"Park Hotel Tokyo"},"type":{"type":"string","enum":["hotel","vacation_rental"],"example":"hotel"},"rate_per_night":{"description":"Nightly rate. Absent when the property quotes no rate for the stay (sold out or no availability). Never 0.","allOf":[{"$ref":"#/components/schemas/MoneyDto"}]},"total_rate":{"description":"Total for the stay. Absent when the property quotes no rate for the stay (sold out or no availability). Never 0.","allOf":[{"$ref":"#/components/schemas/MoneyDto"}]},"rating":{"type":"number","example":4.3},"reviews":{"type":"number","example":2841},"stars":{"type":"number","example":4,"description":"Star class, 1 to 5."},"amenities":{"example":["Free Wi-Fi","Pool"],"type":"array","items":{"type":"string"}}},"required":["position","name","type"]},"HotelsSearchResponseDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Id of this request. Quote it when reporting a problem."},"took_ms":{"type":"number","example":1420,"description":"How long the request took, in milliseconds."},"request":{"type":"object","additionalProperties":true,"description":"The parameters as accepted, after defaults and normalization. What the request actually ran with.","example":{"query":"coffee","country":"us","page":1}},"next_page":{"type":"number","nullable":true,"example":2,"description":"The next page to ask for, or null when there is no further page. Never a page this endpoint would reject."},"results":{"type":"array","items":{"$ref":"#/components/schemas/HotelResultDto"}},"total_results":{"type":"number","example":15000,"description":"Total matches reported for the search."},"currency":{"type":"string","example":"USD","description":"ISO 4217 code the prices are quoted in."}},"required":["id","took_ms","request","next_page","results"]},"HotelDetailsRequestEchoDto":{"type":"object","properties":{"id":{"type":"string","example":"san1.QkFEQ0FGRTAxMjM0NTY3ODk"},"check_in":{"type":"string","example":"2026-10-15"},"check_out":{"type":"string","example":"2026-10-18"},"currency":{"type":"string","example":"USD"},"country":{"type":"string","example":"us"}},"required":["id","currency","country"]},"BookingOptionDto":{"type":"object","properties":{"provider":{"type":"string","example":"Somewhere Travel"},"rate_per_night":{"description":"Nightly rate. Absent when the property quotes no rate for the stay (sold out or no availability). Never 0.","allOf":[{"$ref":"#/components/schemas/MoneyDto"}]},"total_rate":{"description":"Total for the stay. Absent when the property quotes no rate for the stay (sold out or no availability). Never 0.","allOf":[{"$ref":"#/components/schemas/MoneyDto"}]},"link":{"type":"string","example":"https://example.com/book/asakusa-view?checkin=2026-10-15","description":"The partner's own booking URL. Absent when the listing carried no destination that could be handed on."}},"required":["provider"]},"RatingBucketDto":{"type":"object","properties":{"stars":{"type":"number","example":5,"description":"1 to 5."},"percent":{"type":"number","example":47,"description":"Whole percent of all reviews at this star rating."}},"required":["stars","percent"]},"HotelDetailDto":{"type":"object","properties":{"name":{"type":"string","example":"Park Hotel Tokyo"},"type":{"type":"string","enum":["hotel","vacation_rental"],"example":"hotel"},"stars":{"type":"number","example":4,"description":"Star class, 1 to 5."},"rating":{"type":"number","example":4.3},"reviews":{"type":"number","example":2841},"address":{"type":"string","example":"1-7-1 Higashi-Shimbashi, Minato City, Tokyo"},"phone":{"type":"string","example":"+81 3-6252-1111","description":"Rarely listed: most property pages give a site and no number."},"website":{"type":"string","example":"https://example.com/tokyo/","description":"The property's own site."},"description":{"type":"string","example":"A high-rise hotel with city views, 5 minutes from the station."},"check_in_time":{"type":"string","example":"15:00","description":"24 hour HH:MM."},"check_out_time":{"type":"string","example":"11:00","description":"24 hour HH:MM."},"amenities":{"example":["Pool","Wi-Fi (free)","Breakfast (extra charge)"],"description":"Each with the page's own qualifier where it states one.","type":"array","items":{"type":"string"}},"booking_options":{"description":"Who is offering the stay, and for how much. Present only when `check_in` and `check_out` were given: every rate is a function of the dates.","type":"array","items":{"$ref":"#/components/schemas/BookingOptionDto"}},"rating_breakdown":{"description":"Share of reviews at each star rating, highest first.","type":"array","items":{"$ref":"#/components/schemas/RatingBucketDto"}}},"required":["name"]},"HotelDetailsResponseDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Id of this request. Quote it when reporting a problem."},"took_ms":{"type":"number","example":1420,"description":"How long the request took, in milliseconds."},"request":{"additionalProperties":true,"description":"The parameters as accepted, after defaults and normalization. What the request actually ran with.","example":{"id":"san1.QkFEQ0FGRTAxMjM0NTY3ODk","check_in":"2026-10-15","check_out":"2026-10-18","currency":"USD","country":"us"},"allOf":[{"$ref":"#/components/schemas/HotelDetailsRequestEchoDto"}]},"hotel":{"$ref":"#/components/schemas/HotelDetailDto"}},"required":["id","took_ms","request","hotel"]},"HotelReviewsRequestEchoDto":{"type":"object","properties":{"id":{"type":"string","example":"san1.QkFEQ0FGRTAxMjM0NTY3ODk"},"page":{"type":"number","example":1}},"required":["id","page"]},"HotelReviewDto":{"type":"object","properties":{"position":{"type":"number","example":1,"description":"Rank within this page, 1 based."},"author":{"type":"string","example":"Alex M"},"rating":{"type":"number","example":4.5,"description":"Stars, 1 to 5. Halves are real."},"date":{"type":"string","example":"2 months ago","description":"As displayed, which is usually relative."},"text":{"type":"string","example":"Spotless rooms and a great location.","description":"Absent for a rating left with no words. A review quoted from another travel site is an excerpt and ends in an ellipsis."}},"required":["position","author"]},"HotelReviewsResponseDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Id of this request. Quote it when reporting a problem."},"took_ms":{"type":"number","example":1420,"description":"How long the request took, in milliseconds."},"request":{"additionalProperties":true,"description":"The parameters as accepted, after defaults and normalization. What the request actually ran with.","example":{"id":"san1.QkFEQ0FGRTAxMjM0NTY3ODk","page":1},"allOf":[{"$ref":"#/components/schemas/HotelReviewsRequestEchoDto"}]},"next_page":{"type":"number","nullable":true,"example":2,"description":"The next page to ask for, or null when there is no further page. Never a page this endpoint would reject."},"results":{"type":"array","items":{"$ref":"#/components/schemas/HotelReviewDto"}}},"required":["id","took_ms","request","next_page","results"]},"FlightAirportDto":{"type":"object","properties":{"id":{"type":"string","example":"SIN"},"name":{"type":"string","example":"Singapore Changi Airport"},"time":{"type":"string","example":"2026-10-15 09:20","description":"Local time at this airport, 24 hour."}}},"FlightSegmentDto":{"type":"object","properties":{"from":{"$ref":"#/components/schemas/FlightAirportDto"},"to":{"$ref":"#/components/schemas/FlightAirportDto"},"departure":{"type":"string","example":"2026-10-15 09:20","description":"Same value as `from.time`."},"arrival":{"type":"string","example":"2026-10-15 17:35","description":"Same value as `to.time`."},"airline":{"type":"string","example":"Singapore Airlines"},"flight_number":{"type":"string","example":"SQ 634","description":"Rarely available on a search result."},"duration":{"type":"number","example":435,"description":"Minutes in the air."},"aircraft":{"type":"string","example":"Boeing 787"}},"required":["from","to"]},"FlightLayoverDto":{"type":"object","properties":{"id":{"type":"string","example":"HKG"},"name":{"type":"string","example":"Hong Kong International Airport"},"duration":{"type":"number","example":180,"description":"Minutes on the ground."},"overnight":{"type":"boolean","example":false}}},"ItineraryDto":{"type":"object","properties":{"position":{"type":"number","example":1},"id":{"type":"string","example":"san1.QkFEQ0FGRTAxMjM0NTY3ODk","description":"Opaque handle for this itinerary. On a round trip outbound it opens the returns endpoint; on a one way or a return option it opens the bookings endpoint."},"recommended":{"type":"boolean","example":true,"description":"Present on the itineraries ranked best for this route."},"price":{"type":"number","example":698},"currency":{"type":"string","example":"USD"},"total_duration":{"type":"number","example":495,"description":"Door to door minutes."},"segments":{"type":"array","items":{"$ref":"#/components/schemas/FlightSegmentDto"}},"layovers":{"type":"array","items":{"$ref":"#/components/schemas/FlightLayoverDto"}},"carbon_grams":{"type":"number","example":421000,"description":"Estimated emissions for this itinerary, in grams."},"next_day":{"type":"boolean","example":true,"description":"Present when the itinerary lands on a later calendar day."},"type":{"type":"string","example":"Round trip"}},"required":["position","segments"]},"PriceInsightsDto":{"type":"object","properties":{"lowest_price":{"type":"number","example":457},"price_level":{"type":"string","example":"typical"}}},"SelectedOutboundDto":{"type":"object","properties":{"segments":{"type":"array","items":{"$ref":"#/components/schemas/FlightSegmentDto"}}},"required":["segments"]},"FlightsSearchResponseDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Id of this request. Quote it when reporting a problem."},"took_ms":{"type":"number","example":1420,"description":"How long the request took, in milliseconds."},"request":{"type":"object","additionalProperties":true,"description":"The parameters as accepted, after defaults and normalization. What the request actually ran with.","example":{"query":"coffee","country":"us","page":1}},"results":{"type":"array","items":{"$ref":"#/components/schemas/ItineraryDto"}},"next_page":{"type":"number","nullable":true,"example":null,"description":"Always null: one search returns the whole set."},"price_insights":{"$ref":"#/components/schemas/PriceInsightsDto"},"selected_outbound":{"description":"The outbound these return options were listed for.","allOf":[{"$ref":"#/components/schemas/SelectedOutboundDto"}]}},"required":["id","took_ms","request","results","next_page"]},"FlightStatusEndpointDto":{"type":"object","properties":{"id":{"type":"string","example":"JFK","description":"IATA code."},"name":{"type":"string","example":"New York","description":"The city, which is what the source names."},"terminal":{"type":"string","example":"8"},"gate":{"type":"string","example":"14","description":"Absent until a gate is announced."}}},"FlightStatusDto":{"type":"object","properties":{"flight":{"type":"string","example":"BA112","description":"Normalized, with no space."},"airline":{"type":"string","example":"British Airways"},"date":{"type":"string","example":"2026-09-10","description":"The day being reported."},"status":{"type":"string","enum":["scheduled","on_time","delayed","departed","landed","cancelled","unknown"],"example":"on_time","description":"Where the flight is in its day. `unknown` means the source worded it in a way this API does not map, never that the flight is missing."},"from":{"$ref":"#/components/schemas/FlightStatusEndpointDto"},"to":{"$ref":"#/components/schemas/FlightStatusEndpointDto"},"scheduled_departure":{"type":"string","example":"2026-09-10 18:30","description":"Local time at the departure airport, 24 hour."},"scheduled_arrival":{"type":"string","example":"2026-09-11 06:40","description":"Local time at the arrival airport, 24 hour."},"estimated_departure":{"type":"string","example":"2026-09-10 18:45"},"estimated_arrival":{"type":"string","example":"2026-09-11 05:52"},"actual_departure":{"type":"string","example":"2026-09-10 18:41","description":"Present once the flight has actually left."},"actual_arrival":{"type":"string","example":"2026-09-11 06:37","description":"Present once the flight has actually landed."},"available_dates":{"example":["2026-09-09","2026-09-10","2026-09-11","2026-09-12"],"description":"The days that can be asked for. Only a few days either side of today are covered.","type":"array","items":{"type":"string"}}},"required":["flight","status","from","to","available_dates"]},"FlightStatusResponseDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Id of this request. Quote it when reporting a problem."},"took_ms":{"type":"number","example":1420,"description":"How long the request took, in milliseconds."},"request":{"type":"object","additionalProperties":true,"description":"The parameters as accepted, after defaults and normalization. What the request actually ran with.","example":{"query":"coffee","country":"us","page":1}},"status":{"$ref":"#/components/schemas/FlightStatusDto"}},"required":["id","took_ms","request","status"]},"FlightBookingDto":{"type":"object","properties":{"id":{"type":"string","example":"3f1c2d84-2b0e-4a8c-9f2a-8e1d4d6c0b11"},"provider":{"type":"string","example":"Booking.com","description":"Who is selling."},"fare_name":{"type":"string","example":"Airline","description":"The option's own label where the source prints one."},"price":{"type":"number","example":616},"currency":{"type":"string","example":"USD"},"baggage":{"example":["1 free carry-on","1st checked bag available for a fee"],"type":"array","items":{"type":"string"}},"conditions":{"example":["Separate tickets booked together"],"type":"array","items":{"type":"string"}},"link":{"type":"string","example":"https://platform.example.com/flights/3f1c2d84-2b0e-4a8c-9f2a-8e1d4d6c0b11","description":"Open this to book. It is a page that carries a person to the seller; the seller has no address of its own until someone books."},"expires_at":{"type":"string","example":"2026-09-12T04:20:00.000Z","description":"After this the link is gone and a fresh one must be asked for."}},"required":["id","provider","link","expires_at"]},"FlightBookingsResponseDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Id of this request. Quote it when reporting a problem."},"took_ms":{"type":"number","example":1420,"description":"How long the request took, in milliseconds."},"request":{"type":"object","additionalProperties":true,"description":"The parameters as accepted, after defaults and normalization. What the request actually ran with.","example":{"query":"coffee","country":"us","page":1}},"bookings":{"description":"Ways to buy this itinerary, best first.","type":"array","items":{"$ref":"#/components/schemas/FlightBookingDto"}}},"required":["id","took_ms","request","bookings"]},"FinanceMarketDto":{"type":"object","properties":{"price":{"type":"number","example":338.9},"currency":{"type":"string","example":"USD"},"change":{"type":"number","example":0.54},"change_percent":{"type":"number","example":0.16},"direction":{"type":"string","enum":["up","down"],"example":"up"},"label":{"type":"string","example":"After hours"}}},"FinanceQuoteDto":{"type":"object","properties":{"symbol":{"type":"string","example":"GOOGL"},"name":{"type":"string","example":"Alphabet Inc Class A"},"exchange":{"type":"string","example":"NASDAQ"},"price":{"type":"number","example":338.36},"currency":{"type":"string","example":"USD","description":"ISO 4217. The empty string for an index, which has none."},"change":{"type":"number","example":-0.1},"change_percent":{"type":"number","example":-0.03},"direction":{"type":"string","enum":["up","down"],"example":"down"},"as_of":{"type":"string","example":"2026-09-08T16:00:01-04:00","description":"When the quote was taken, ISO 8601 with the market offset."},"market":{"description":"The pre or after hours quote, when the market is closed.","allOf":[{"$ref":"#/components/schemas/FinanceMarketDto"}]},"notes":{"example":["Closed: Sep 8, 4:00 PM EDT"],"description":"Free text lines shown under the price.","type":"array","items":{"type":"string"}}},"required":["symbol","name"]},"FinanceChartPointDto":{"type":"object","properties":{"date":{"type":"string","example":"2026-09-08T09:30:00-04:00"},"price":{"type":"number","example":337.11},"volume":{"type":"number","example":1204300}},"required":["date","price"]},"FinanceAboutInfoDto":{"type":"object","properties":{"label":{"type":"string","example":"CEO"},"value":{"type":"string","example":"Sundar Pichai"},"link":{"type":"string","example":"https://example.com"}},"required":["label","value"]},"FinanceAboutDto":{"type":"object","properties":{"title":{"type":"string","example":"About Alphabet Inc Class A"},"description":{"type":"string","example":"Alphabet Inc. is a holding company."},"description_link":{"type":"string","example":"https://example.com/about"},"info":{"type":"array","items":{"$ref":"#/components/schemas/FinanceAboutInfoDto"}}},"required":["title","info"]},"FinanceNewsDto":{"type":"object","properties":{"title":{"type":"string","example":"Alphabet shares rise on cloud growth"},"link":{"type":"string","example":"https://example.com/story"},"source":{"type":"string","example":"Reuters"},"date":{"type":"string","example":"17 minutes ago"},"thumbnail":{"type":"string"}},"required":["title","link"]},"FinanceFinancialRowDto":{"type":"object","properties":{"title":{"type":"string","example":"Revenue"},"value":{"type":"string","example":"96.43B"},"change":{"type":"string","example":"13.79%"}},"required":["title","value"]},"FinanceFinancialPeriodDto":{"type":"object","properties":{"date":{"type":"string","example":"Jun 2026"},"period_type":{"type":"string","example":"Quarterly"},"rows":{"type":"array","items":{"$ref":"#/components/schemas/FinanceFinancialRowDto"}}},"required":["date","period_type","rows"]},"FinanceFinancialsDto":{"type":"object","properties":{"title":{"type":"string","example":"Income statement"},"periods":{"type":"array","items":{"$ref":"#/components/schemas/FinanceFinancialPeriodDto"}}},"required":["title","periods"]},"FinanceRelatedItemDto":{"type":"object","properties":{"symbol":{"type":"string","example":"GOOG:NASDAQ"},"name":{"type":"string","example":"Alphabet Inc Class C"},"price":{"type":"number","example":339.1},"currency":{"type":"string","example":"USD"},"change":{"type":"number","example":1.2},"change_percent":{"type":"number","example":0.35},"direction":{"type":"string","enum":["up","down"],"example":"up"}},"required":["symbol"]},"FinanceRelatedDto":{"type":"object","properties":{"title":{"type":"string","example":"You may be interested in"},"items":{"type":"array","items":{"$ref":"#/components/schemas/FinanceRelatedItemDto"}}},"required":["items"]},"FinanceQuoteResponseDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Id of this request. Quote it when reporting a problem."},"took_ms":{"type":"number","example":1420,"description":"How long the request took, in milliseconds."},"request":{"type":"object","additionalProperties":true,"description":"The parameters as accepted, after defaults and normalization. What the request actually ran with.","example":{"query":"coffee","country":"us","page":1}},"quote":{"$ref":"#/components/schemas/FinanceQuoteDto"},"chart":{"description":"The series for the requested `window`, oldest point first.","type":"array","items":{"$ref":"#/components/schemas/FinanceChartPointDto"}},"stats":{"type":"object","additionalProperties":{"type":"string"},"description":"Headline statistics as flat keys, e.g. `market_cap`, `pe_ratio`, `dividend_yield`. Values are shown exactly as they are published.","example":{"market_cap":"4.09T","pe_ratio":"25.43","avg_volume":"31.51M"}},"about":{"$ref":"#/components/schemas/FinanceAboutDto"},"news":{"type":"array","items":{"$ref":"#/components/schemas/FinanceNewsDto"}},"financials":{"type":"array","items":{"$ref":"#/components/schemas/FinanceFinancialsDto"}},"related":{"description":"Other symbols shown beside this one.","type":"array","items":{"$ref":"#/components/schemas/FinanceRelatedDto"}}},"required":["id","took_ms","request","quote","chart"]},"PriceDto":{"type":"object","properties":{"amount":{"type":"number","example":499.99,"description":"The amount as a number."},"currency":{"type":"string","example":"USD","description":"ISO 4217 code of the currency this price is in."},"display":{"type":"string","example":"$499.99","description":"The price exactly as shown."}},"required":["amount","currency","display"]},"ShoppingResultDto":{"type":"object","properties":{"id":{"type":"string","example":"san1.QkFEQ0FGRTAxMjM0NTY3ODk","description":"Opaque handle for this product, to pass to `/v1/shopping/{id}`. Absent when the product cannot be looked up."},"position":{"type":"number","example":1,"description":"Rank within this page, 1 based."},"marketplace":{"type":"string","example":"amazon.com","description":"The online marketplace selling this product, when there is one."},"external_id":{"type":"string","example":"B0CX23V2ZK","description":"The marketplace's own product id."},"title":{"type":"string","example":"Sony PlayStation 5 Console Slim Digital Edition"},"price":{"description":"The current price.","allOf":[{"$ref":"#/components/schemas/PriceDto"}]},"original_price":{"description":"The price before a discount.","allOf":[{"$ref":"#/components/schemas/PriceDto"}]},"seller":{"type":"string","example":"Best Buy","description":"The headline seller. A product may be offered by several; ask for the product to see them all."},"more_offers":{"type":"boolean","example":true,"description":"More sellers than the one named are offering this product. Never a count."},"rating":{"type":"number","example":4.3,"description":"Out of 5."},"reviews":{"type":"number","example":3400,"description":"Review count. May be rounded above a thousand."},"delivery":{"type":"string","example":"Free delivery by Mon"},"returns":{"type":"string","example":"30-day returns"},"condition":{"type":"string","example":"Pre-owned","description":"Absent on a new item."},"tag":{"type":"string","example":"25% OFF","description":"A promotional badge, exactly as shown."},"thumbnail":{"type":"string","example":"https://example.com/images/console.jpg"},"link":{"type":"string","example":"https://example.com/product/console-slim","description":"The marketplace's own page for this product, when there is one."}},"required":["position","title"]},"ShoppingSearchResponseDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Id of this request. Quote it when reporting a problem."},"took_ms":{"type":"number","example":1420,"description":"How long the request took, in milliseconds."},"request":{"type":"object","additionalProperties":true,"description":"The parameters as accepted, after defaults and normalization. What the request actually ran with.","example":{"query":"coffee","country":"us","page":1}},"next_page":{"type":"number","nullable":true,"example":2,"description":"The next page to ask for, or null when there is no further page. Never a page this endpoint would reject."},"results":{"type":"array","items":{"$ref":"#/components/schemas/ShoppingResultDto"}}},"required":["id","took_ms","request","next_page","results"]},"ProductRequestEchoDto":{"type":"object","properties":{"id":{"type":"string","example":"san1.QkFEQ0FGRTAxMjM0NTY3ODk"},"country":{"type":"string","example":"us"}},"required":["id","country"]},"ProductSpecDto":{"type":"object","properties":{"label":{"type":"string","example":"Storage"},"value":{"type":"string","example":"1 TB SSD"}},"required":["label","value"]},"AttributeDto":{"type":"object","properties":{"name":{"type":"string","example":"Color"},"value":{"type":"string","example":"Black"}},"required":["name","value"]},"ProductOfferDto":{"type":"object","properties":{"position":{"type":"number","example":1,"description":"Rank within the offer list, 1 based."},"id":{"type":"string","example":"san1.QkFEQ0FGRTAxMjM0NTY3ODk","description":"Opaque handle for this option, to pass to `/v1/shopping/{id}`."},"external_id":{"type":"string","example":"B0CX23V2ZK","description":"The marketplace's own id for this option."},"selected":{"type":"boolean","example":true,"description":"The default option. Listed first; absent on every other offer."},"attributes":{"description":"What sets this option apart from the others.","type":"array","items":{"$ref":"#/components/schemas/AttributeDto"}},"seller":{"type":"string","example":"Best Buy"},"price":{"description":"Absent when no price is shown for the requested country, for example when the item cannot be shipped there.","allOf":[{"$ref":"#/components/schemas/PriceDto"}]},"price_from":{"description":"The lowest of several offers for this option.","allOf":[{"$ref":"#/components/schemas/PriceDto"}]},"original_price":{"$ref":"#/components/schemas/PriceDto"},"discount":{"type":"string","example":"33% off"},"badge":{"type":"string","example":"Best price"},"title":{"type":"string","example":"PlayStation 5 Slim Digital, 1TB, white","description":"The seller's own title for the variant it is offering."},"stock":{"type":"string","example":"In stock online"},"availability":{"type":"string","example":"In Stock","description":"Availability as stated, including why an item cannot be shipped to the requested country."},"seller_rating":{"type":"number","example":4.7,"description":"The SELLER's rating out of 5, not the product's."},"delivery":{"type":"string","example":"Free delivery - Free 30-day returns"},"import_charges":{"type":"string","example":"$133.46 Shipping and Import Charges to Singapore","description":"Import charges as stated for the requested country."},"link":{"type":"string","example":"https://example.com/product/console-slim","description":"Where to buy it, absent when the destination could not be resolved."}},"required":["position"]},"ProductDetailDto":{"type":"object","properties":{"marketplace":{"type":"string","example":"amazon.com","description":"The online marketplace selling this product, when there is one."},"external_id":{"type":"string","example":"B0CX23V2ZK","description":"The marketplace's own product id."},"name":{"type":"string","example":"Sony PlayStation 5 Console Slim Digital Edition"},"description":{"type":"string","example":"A slimmer console with a 1TB SSD and no disc drive."},"highlights":{"example":["1TB of storage","No disc drive"],"description":"The product page's own highlight bullets.","type":"array","items":{"type":"string"}},"specs":{"description":"The specification table as stated, deduplicated by label.","type":"array","items":{"$ref":"#/components/schemas/ProductSpecDto"}},"images":{"example":["https://example.com/images/console.jpg"],"type":"array","items":{"type":"string"}},"rating":{"type":"number","example":4.7,"description":"Out of 5."},"reviews":{"type":"number","example":27877,"description":"Exact rating count."},"rating_breakdown":{"description":"Share of ratings at each star level, in whole percent.","type":"array","items":{"$ref":"#/components/schemas/RatingBucketDto"}},"offers":{"description":"Every way to buy it: its sellers or its options (colour, size), the default first. Empty is a real answer: some products are catalogued with nobody selling them.","type":"array","items":{"$ref":"#/components/schemas/ProductOfferDto"}}},"required":["name","offers"]},"ProductResponseDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Id of this request. Quote it when reporting a problem."},"took_ms":{"type":"number","example":1420,"description":"How long the request took, in milliseconds."},"request":{"additionalProperties":true,"description":"The parameters as accepted, after defaults and normalization. What the request actually ran with.","example":{"id":"san1.QkFEQ0FGRTAxMjM0NTY3ODk","country":"us"},"allOf":[{"$ref":"#/components/schemas/ProductRequestEchoDto"}]},"product":{"$ref":"#/components/schemas/ProductDetailDto"}},"required":["id","took_ms","request","product"]},"PublicAccountDto":{"type":"object","properties":{"account_id":{"type":"string","format":"uuid"},"email":{"type":"string","example":"someone@example.com"},"api_key":{"type":"string","example":"san_a1B2c3D4…","description":"The presented key, masked to its display prefix."},"plan":{"type":"string","example":"starter","description":"Plan code."},"plan_name":{"type":"string","example":"Starter"},"plan_price_usd":{"type":"number","example":12,"description":"Price per billing interval, in US dollars."},"quota":{"type":"number","example":4000,"description":"Requests included this month."},"used":{"type":"number","example":12,"description":"Requests used this month."},"remaining":{"type":"number","example":3988},"resets_at":{"type":"string","example":"2026-10-01T00:00:00.000Z","description":"When the monthly counter resets."}},"required":["account_id","email","api_key","plan","plan_name","plan_price_usd","quota","used","remaining","resets_at"]}}}}