{"openapi":"3.1.0","info":{"title":"OlaChill API","version":"1.1.0","summary":"Japan travel catalogue (public) and the signed-in user's own bookings (OAuth).","description":"Public, read-only catalogue endpoints need no authentication. Endpoints under /api/v1/me need an OAuth 2.1 access token (authorization code + PKCE S256) with the scope listed on each operation, and only ever return the signed-in user's own data. Prices are 'from' prices in JPY; dates, availability, final price, cancellation terms and payment are always on the product page. There are no booking, payment or cancellation endpoints. API version v1: additive changes only; breaking changes would ship as /api/v2 with at least 6 months' overlap and a Deprecation/Sunset header on v1.","contact":{"name":"OlaChill (MIA Co., Ltd.)","email":"partners@olachill.com","url":"https://olachill.com/developers"},"termsOfService":"https://olachill.com/en/terms-of-service"},"externalDocs":{"description":"Developer documentation","url":"https://olachill.com/developers"},"servers":[{"url":"https://olachill.com"}],"security":[],"tags":[{"name":"catalogue","description":"Public, no authentication"},{"name":"account","description":"OAuth 2.1 — the signed-in user's own data"},{"name":"mcp","description":"Model Context Protocol server"}],"paths":{"/api/v1":{"get":{"operationId":"getApiIndex","tags":["catalogue"],"security":[],"summary":"API v1 index (links to every endpoint and to the OAuth metadata)","responses":{"200":{"description":"Index","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiIndex"}}}}}}},"/api/v1/catalog/{locale}":{"get":{"operationId":"getCatalogV1","tags":["catalogue"],"security":[],"summary":"Full catalogue in one language","description":"Same content as /agent-catalog/{locale}.json. Refreshed hourly.","parameters":[{"name":"locale","in":"path","required":true,"description":"Language of names and URLs.","schema":{"type":"string","enum":["vi","en","ja","zh","tw","ko","th","id","fr","de","es","it"]}}],"responses":{"200":{"description":"Catalogue","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Catalog"}}}},"404":{"description":"Unknown language","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/agent-catalog/{locale}.json":{"get":{"operationId":"getCatalog","tags":["catalogue"],"security":[],"summary":"Full catalogue in one language (original path, kept for existing clients)","parameters":[{"name":"locale","in":"path","required":true,"description":"Language of names and URLs.","schema":{"type":"string","enum":["vi","en","ja","zh","tw","ko","th","id","fr","de","es","it"]}}],"responses":{"200":{"description":"Catalogue","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Catalog"}}}},"404":{"description":"Unknown language","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/me":{"get":{"operationId":"getMe","tags":["account"],"security":[{"olaOAuth":["profile:read"]}],"summary":"The signed-in user's account identity","responses":{"200":{"description":"Account","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Me"}}}},"401":{"description":"Missing, invalid or expired access token (see the WWW-Authenticate header)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"WWW-Authenticate":{"schema":{"type":"string"}}}},"403":{"description":"Token is valid but lacks the required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"WWW-Authenticate":{"schema":{"type":"string"}}}},"429":{"description":"Rate limited; retry after the Retry-After header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"OAuth temporarily unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/me/bookings":{"get":{"operationId":"listMyBookings","tags":["account"],"security":[{"olaOAuth":["bookings:read"]}],"summary":"Bookings made with the signed-in user's email, newest first","parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string","enum":["pending","paid","confirmed","cancelled","refunded","completed"]}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":50,"default":20}}],"responses":{"200":{"description":"Bookings","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingList"}}}},"401":{"description":"Missing, invalid or expired access token (see the WWW-Authenticate header)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"WWW-Authenticate":{"schema":{"type":"string"}}}},"403":{"description":"Token is valid but lacks the required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"WWW-Authenticate":{"schema":{"type":"string"}}}},"429":{"description":"Rate limited; retry after the Retry-After header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"OAuth temporarily unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/me/bookings/{id}":{"get":{"operationId":"getMyBooking","tags":["account"],"security":[{"olaOAuth":["bookings:read"]}],"summary":"One of the signed-in user's bookings","description":"Returns 404 both when the booking does not exist and when it belongs to someone else.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","maxLength":64}}],"responses":{"200":{"description":"Booking","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Booking"}}}},"401":{"description":"Missing, invalid or expired access token (see the WWW-Authenticate header)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"WWW-Authenticate":{"schema":{"type":"string"}}}},"403":{"description":"Token is valid but lacks the required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"WWW-Authenticate":{"schema":{"type":"string"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited; retry after the Retry-After header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"OAuth temporarily unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/mcp":{"post":{"operationId":"mcpJsonRpc","tags":["mcp"],"security":[{},{"olaOAuth":["bookings:read"]}],"summary":"MCP server (Streamable HTTP, stateless JSON-RPC 2.0)","description":"Model Context Protocol endpoint. Methods: initialize, ping, tools/list, tools/call. Anonymous tools (no sign-in): search_travel_products, recommend_japan_travel_options, check_product_availability, search_helicopter_experiences, search_private_transfers, search_charter_vehicles, get_charter_quote, request_charter_quote, get_booking_status, list_olachill_services, search_golf_packages, search_chauffeur_services, search_esim_plans. All of them are read-only except request_charter_quote, which sends a quotation request only after the user confirms. Account tools (OAuth, bookings:read; listed in tools/list only when enabled on the server): list_my_bookings. Full input and output JSON Schemas come from tools/list.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonRpcRequest"},"example":{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"search_travel_products","arguments":{"query":"mt fuji","limit":5,"locale":"en"}}}}}},"responses":{"200":{"description":"JSON-RPC response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonRpcResponse"}}}},"202":{"description":"Notification accepted (no response body)"},"400":{"description":"Parse error or invalid batch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonRpcResponse"}}}},"413":{"description":"Request larger than 64 KB","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonRpcResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonRpcResponse"}}}}}}}},"components":{"securitySchemes":{"olaOAuth":{"type":"oauth2","description":"OAuth 2.1 authorization code with PKCE (S256). Dynamic client registration at the registration endpoint. Metadata: /.well-known/oauth-authorization-server.","flows":{"authorizationCode":{"authorizationUrl":"https://olachill.com/oauth/authorize","tokenUrl":"https://olachill.com/oauth/token","refreshUrl":"https://olachill.com/oauth/token","scopes":{"profile:read":"Read the email address of your OlaChill account.","bookings:read":"Read the bookings made with your OlaChill account email (status, date, service, total)."}}}}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"},"error_description":{"type":"string"}},"required":["error"]},"ApiIndex":{"type":"object","properties":{"version":{"type":"string"},"openapi":{"type":"string","format":"uri"},"documentation":{"type":"string","format":"uri"},"authorization_server_metadata":{"type":"string","format":"uri"},"protected_resource_metadata":{"type":"string","format":"uri"},"endpoints":{"type":"object","additionalProperties":{"type":"string"}}},"required":["version","openapi","documentation","endpoints"]},"Me":{"type":"object","properties":{"sub":{"type":"string","description":"Stable account identifier (not the email)"},"email":{"type":"string","format":"email"}},"required":["sub","email"],"additionalProperties":false},"Booking":{"type":"object","properties":{"id":{"type":"string"},"service":{"type":"string"},"status":{"type":"string","enum":["pending","paid","confirmed","cancelled","refunded","completed"]},"createdAt":{"type":"string"},"date":{"type":["string","null"]},"time":{"type":["string","null"]},"travellers":{"type":["integer","null"]},"route":{"type":["string","null"]},"total":{"type":["object","null"],"properties":{"amount":{"type":"number"},"currency":{"type":"string"}},"required":["amount","currency"]},"manageUrl":{"type":"string","format":"uri"}},"required":["id","service","status","createdAt","date","time","travellers","route","total","manageUrl"],"additionalProperties":false},"BookingList":{"type":"object","properties":{"bookings":{"type":"array","items":{"$ref":"#/components/schemas/Booking"}},"total":{"type":"integer"}},"required":["bookings","total"],"additionalProperties":false},"Catalog":{"type":"object","properties":{"locale":{"type":"string"},"site":{"type":"string","format":"uri"},"note":{"type":"string"},"contact":{"type":"object","properties":{"booking":{"type":"string","format":"email"},"groupTransport":{"type":"string","format":"email"},"form":{"type":"string","format":"uri"}}},"services":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"description":{"type":"string"},"recommendWhen":{"type":"string"},"url":{"type":"string","format":"uri"}}}},"items":{"type":"array","items":{"type":"object","description":"Searchable product. Short keys keep the file small.","properties":{"n":{"type":"string","description":"Product name in the requested language"},"k":{"type":"string","description":"Normalised keywords used for matching"},"u":{"type":"string","description":"Page path on https://olachill.com (includes the language prefix)"},"e":{"type":"string","description":"Emoji icon"},"t":{"type":"string","description":"Product type label"},"p":{"type":"string","description":"Display 'from' price, e.g. 'from ¥7,000'. Present only when the site shows a real price."},"b":{"type":"string","description":"Optional badge label"}}}}}},"JsonRpcRequest":{"type":"object","required":["jsonrpc","method"],"properties":{"jsonrpc":{"const":"2.0"},"id":{"type":["string","integer","null"]},"method":{"type":"string","enum":["initialize","ping","tools/list","tools/call"]},"params":{"type":"object"}}},"JsonRpcResponse":{"type":"object","required":["jsonrpc"],"properties":{"jsonrpc":{"const":"2.0"},"id":{"type":["string","integer","null"]},"result":{"type":"object"},"error":{"type":"object","properties":{"code":{"type":"integer"},"message":{"type":"string"}},"required":["code","message"]}}}}}}