{"openapi":"3.1.0","info":{"title":"Sóley public API","version":"0.1.0","description":"Public read-only REST endpoints: live Iceland data (weather, roads, safety, aurora, earthquakes, buses) and the operator directory. The primary agent interface is the MCP server at /mcp — see https://soley.travel/en/docs/mcp."},"paths":{"/api/v1/directory":{"get":{"tags":["Directory"],"summary":"List Directory","description":"Search and list active operators on the Soley network.\n\nAll filters are optional and combinable. Returns operator summaries with\nservice lists and MCP endpoint URLs.","operationId":"list_directory_api_v1_directory_get","parameters":[{"name":"location","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Substring match on operator location","title":"Location"},"description":"Substring match on operator location"},{"name":"service_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by service type","title":"Service Type"},"description":"Filter by service type"},{"name":"price_min","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Minimum price ISK","title":"Price Min"},"description":"Minimum price ISK"},{"name":"price_max","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Maximum price ISK","title":"Price Max"},"description":"Maximum price ISK"},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search on name, location, about","title":"Q"},"description":"Free-text search on name, location, about"},{"name":"lat","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Latitude for proximity search","title":"Lat"},"description":"Latitude for proximity search"},{"name":"lon","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Longitude for proximity search","title":"Lon"},"description":"Longitude for proximity search"},{"name":"radius_km","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Radius in km","title":"Radius Km"},"description":"Radius in km"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DirectoryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/directory/{operator_id}":{"get":{"tags":["Directory"],"summary":"Get Operator Detail","description":"Get full details for a single operator including services and FAQs.","operationId":"get_operator_detail_api_v1_directory__operator_id__get","parameters":[{"name":"operator_id","in":"path","required":true,"schema":{"type":"string","title":"Operator Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OperatorDetailResponse"}}}},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Not Found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/iceland/weather":{"get":{"tags":["Iceland Intelligence"],"summary":"Weather","description":"Get current weather for a location in Iceland (public).","operationId":"weather_api_v1_iceland_weather_get","parameters":[{"name":"lat","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Latitude","title":"Lat"},"description":"Latitude"},{"name":"lon","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Longitude","title":"Lon"},"description":"Longitude"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Weather Api V1 Iceland Weather Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/iceland/roads":{"get":{"tags":["Iceland Intelligence"],"summary":"Road Conditions","description":"Get road conditions for a location in Iceland (public).","operationId":"road_conditions_api_v1_iceland_roads_get","parameters":[{"name":"lat","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Latitude","title":"Lat"},"description":"Latitude"},{"name":"lon","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Longitude","title":"Lon"},"description":"Longitude"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Road Conditions Api V1 Iceland Roads Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/iceland/safety":{"get":{"tags":["Iceland Intelligence"],"summary":"Safety Alerts","description":"Get active safety alerts for a location in Iceland (public).","operationId":"safety_alerts_api_v1_iceland_safety_get","parameters":[{"name":"lat","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Latitude","title":"Lat"},"description":"Latitude"},{"name":"lon","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Longitude","title":"Lon"},"description":"Longitude"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Safety Alerts Api V1 Iceland Safety Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/iceland/aurora":{"get":{"tags":["Iceland Intelligence"],"summary":"Aurora Forecast","description":"Get the aurora / northern lights forecast for Iceland (public).","operationId":"aurora_forecast_api_v1_iceland_aurora_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Aurora Forecast Api V1 Iceland Aurora Get"}}}}}}},"/api/v1/iceland/earthquakes":{"get":{"tags":["Iceland Intelligence"],"summary":"Earthquakes","description":"Get recent earthquake activity in Iceland (public).","operationId":"earthquakes_api_v1_iceland_earthquakes_get","parameters":[{"name":"min_magnitude","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Minimum magnitude filter (None = all)","title":"Min Magnitude"},"description":"Minimum magnitude filter (None = all)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Earthquakes Api V1 Iceland Earthquakes Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/iceland/buses/live":{"get":{"tags":["Iceland Intelligence"],"summary":"Live Buses","description":"Get real-time Straeto bus positions (public, 60s cache).\n\nWhen `route` is specified, the response includes the route's geographic\nshape (simplified polyline) so the client can draw the bus's actual path\non a map.","operationId":"live_buses_api_v1_iceland_buses_live_get","parameters":[{"name":"route","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Route number to track — includes route shape geometry","title":"Route"},"description":"Route number to track — includes route shape geometry"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Live Buses Api V1 Iceland Buses Live Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/iceland/buses/map":{"get":{"tags":["Iceland Intelligence"],"summary":"Live Bus Map","description":"Serve the live bus map page.","operationId":"live_bus_map_api_v1_iceland_buses_map_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/health":{"get":{"summary":"Health","description":"Health check endpoint verifying PostgreSQL and Redis connectivity.\n\nAlso reports the running commit SHA + environment so a deploy can be\nverified at a glance. Railway injects ``RAILWAY_GIT_COMMIT_SHA`` into\nthe container; when unset (local dev / non-Railway host) it reads\n\"unknown\". This exists because the 2026-05-19 Railway-outage recovery\nleft the staging auto-deploy webhook dead and the backend served a\nstale commit for hours — with no way to tell which commit was live\nshort of diffing the OpenAPI schema. ``commit`` closes that gap.","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Health Health Get"}}}}}}}},"components":{"schemas":{"DirectoryResponse":{"properties":{"operators":{"items":{"$ref":"#/components/schemas/OperatorSummary"},"type":"array","title":"Operators"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["operators","count"],"title":"DirectoryResponse","description":"Paginated directory search result."},"ErrorResponse":{"properties":{"detail":{"type":"string","title":"Detail"}},"type":"object","required":["detail"],"title":"ErrorResponse","description":"Standard error envelope (matches FastAPI HTTPException format)."},"FAQItem":{"properties":{"question":{"type":"string","title":"Question"},"answer":{"type":"string","title":"Answer"}},"type":"object","required":["question","answer"],"title":"FAQItem","description":"Single FAQ entry for an operator."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"OperatorDetailResponse":{"properties":{"operator_id":{"type":"string","title":"Operator Id"},"name":{"type":"string","title":"Name"},"location":{"type":"string","title":"Location"},"latitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Latitude"},"longitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Longitude"},"about":{"type":"string","title":"About"},"cover_image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cover Image Url"},"is_demo":{"type":"boolean","title":"Is Demo","default":false},"services":{"items":{"$ref":"#/components/schemas/ServiceSummary"},"type":"array","title":"Services"},"faqs":{"items":{"$ref":"#/components/schemas/FAQItem"},"type":"array","title":"Faqs"},"cancellation_policy":{"type":"string","title":"Cancellation Policy"},"cancellation_policy_json":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Cancellation Policy Json"},"mcp_endpoint":{"type":"string","title":"Mcp Endpoint","default":""}},"type":"object","required":["operator_id","name","location","about","cancellation_policy"],"title":"OperatorDetailResponse","description":"Full operator profile with services, FAQs, and cancellation policy."},"OperatorSummary":{"properties":{"operator_id":{"type":"string","title":"Operator Id"},"name":{"type":"string","title":"Name"},"location":{"type":"string","title":"Location"},"latitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Latitude"},"longitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Longitude"},"services":{"items":{"$ref":"#/components/schemas/ServiceSummary"},"type":"array","title":"Services"},"cover_image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cover Image Url"},"is_demo":{"type":"boolean","title":"Is Demo","default":false},"mcp_endpoint":{"type":"string","title":"Mcp Endpoint","default":""}},"type":"object","required":["operator_id","name","location"],"title":"OperatorSummary","description":"Operator card for directory list results."},"ServiceSummary":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"type":{"type":"string","title":"Type"},"price_isk":{"type":"integer","title":"Price Isk"},"max_guests":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Guests"},"photos":{"items":{"type":"string"},"type":"array","title":"Photos"}},"type":"object","required":["id","name","type","price_isk"],"title":"ServiceSummary","description":"Compact service representation for directory listings."},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}