{"openapi":"3.1.0","info":{"title":"UK Mosque Jamaat Directory","description":"Published congregational prayer timetables for UK mosques.","version":"0.1.0"},"paths":{"/v1/mosques":{"get":{"tags":["mosques"],"summary":"List Mosques","operationId":"list_mosques_v1_mosques_get","parameters":[{"name":"city","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"}},{"name":"bbox","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bbox"}},{"name":"near","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Near"}},{"name":"radius_km","in":"query","required":false,"schema":{"anyOf":[{"type":"number","exclusiveMinimum":0},{"type":"null"}],"title":"Radius Km"}},{"name":"has_times","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Times"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":200,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MosqueOut"},"title":"Response List Mosques V1 Mosques Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mosques/{mosque_id}":{"get":{"tags":["mosques"],"summary":"Get Mosque","operationId":"get_mosque_v1_mosques__mosque_id__get","parameters":[{"name":"mosque_id","in":"path","required":true,"schema":{"type":"string","title":"Mosque Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MosqueOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mosques/{mosque_id}/times":{"get":{"tags":["times"],"summary":"Mosque Times","operationId":"mosque_times_v1_mosques__mosque_id__times_get","parameters":[{"name":"mosque_id","in":"path","required":true,"schema":{"type":"string","title":"Mosque Id"}},{"name":"date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date"}},{"name":"from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"From"}},{"name":"to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"To"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/DayTimes"},"title":"Response Mosque Times V1 Mosques  Mosque Id  Times Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/times":{"get":{"tags":["times"],"summary":"Times","operationId":"times_v1_times_get","parameters":[{"name":"date","in":"query","required":true,"schema":{"type":"string","format":"date","title":"Date"}},{"name":"prayer","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/Prayer"},{"type":"null"}],"title":"Prayer"}},{"name":"bbox","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bbox"}},{"name":"near","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Near"}},{"name":"radius_km","in":"query","required":false,"schema":{"anyOf":[{"type":"number","exclusiveMinimum":0},{"type":"null"}],"title":"Radius Km"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PrayerTimeOut"},"title":"Response Times V1 Times Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/snapshot":{"get":{"tags":["times"],"summary":"Snapshot","operationId":"snapshot_v1_snapshot_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SnapshotOut"}}}}}}},"/v1/health":{"get":{"tags":["status"],"summary":"Health","operationId":"health_v1_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthOut"}}}}}}},"/":{"get":{"summary":"Index","operationId":"index__get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/suggestions":{"get":{"summary":"Suggestions","operationId":"suggestions_suggestions_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Q"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/all":{"get":{"summary":"Mosques","operationId":"mosques_all_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Q"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"lat","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":90,"minimum":-90},{"type":"null"}],"title":"Lat"}},{"name":"lng","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":180,"minimum":-180},{"type":"null"}],"title":"Lng"}},{"name":"radius_miles","in":"query","required":false,"schema":{"type":"number","maximum":100,"minimum":1,"default":5,"title":"Radius Miles"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/search":{"get":{"summary":"Search","operationId":"search_search_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Q"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"lat","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":90,"minimum":-90},{"type":"null"}],"title":"Lat"}},{"name":"lng","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":180,"minimum":-180},{"type":"null"}],"title":"Lng"}},{"name":"radius_miles","in":"query","required":false,"schema":{"type":"number","maximum":100,"minimum":1,"default":5,"title":"Radius Miles"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/city/{city_slug}":{"get":{"summary":"City Directory","operationId":"city_directory_city__city_slug__get","parameters":[{"name":"city_slug","in":"path","required":true,"schema":{"type":"string","title":"City Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/developers":{"get":{"summary":"Developers","operationId":"developers_developers_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/mosque/{mosque_ref}":{"get":{"summary":"Mosque Detail","operationId":"mosque_detail_mosque__mosque_ref__get","parameters":[{"name":"mosque_ref","in":"path","required":true,"schema":{"type":"string","title":"Mosque Ref"}},{"name":"src","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Src"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/mosque/{mosque_ref}/map-session":{"post":{"summary":"Mapbox Session","operationId":"mapbox_session_mosque__mosque_ref__map_session_post","parameters":[{"name":"mosque_ref","in":"path","required":true,"schema":{"type":"string","title":"Mosque Ref"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MapboxSessionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"DayTimes":{"properties":{"date":{"type":"string","format":"date","title":"Date"},"fajr":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fajr"},"dhuhr":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dhuhr"},"asr":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Asr"},"maghrib":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Maghrib"},"isha":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Isha"},"jumuah":{"items":{"$ref":"#/components/schemas/JumuahSession"},"type":"array","title":"Jumuah"},"begin":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Begin"}},"type":"object","required":["date"],"title":"DayTimes"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HealthOut":{"properties":{"status":{"type":"string","enum":["ok","degraded"],"title":"Status"},"mosques":{"type":"integer","title":"Mosques"},"sources_live":{"type":"integer","title":"Sources Live"},"sources_stale":{"type":"integer","title":"Sources Stale"},"refresh":{"anyOf":[{"$ref":"#/components/schemas/RefreshHealthOut"},{"type":"null"}]}},"type":"object","required":["status","mosques","sources_live","sources_stale","refresh"],"title":"HealthOut"},"JumuahSession":{"properties":{"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"time":{"type":"string","title":"Time"}},"type":"object","required":["label","time"],"title":"JumuahSession"},"MapboxSessionRequest":{"properties":{"nonce":{"type":"string","maxLength":2000,"minLength":20,"title":"Nonce"}},"type":"object","required":["nonce"],"title":"MapboxSessionRequest"},"MosqueOut":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"address":{"type":"string","title":"Address"},"website_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website Url"},"lat":{"type":"number","title":"Lat"},"lng":{"type":"number","title":"Lng"},"coordinate_precision":{"type":"string","enum":["postcode_centroid","building","entrance"],"title":"Coordinate Precision"}},"type":"object","required":["id","name","address","website_url","lat","lng","coordinate_precision"],"title":"MosqueOut"},"Prayer":{"type":"string","enum":["fajr","dhuhr","asr","maghrib","isha","jumuah"],"title":"Prayer"},"PrayerTimeOut":{"properties":{"mosque_id":{"type":"string","title":"Mosque Id"},"name":{"type":"string","title":"Name"},"lat":{"type":"number","title":"Lat"},"lng":{"type":"number","title":"Lng"},"coordinate_precision":{"type":"string","enum":["postcode_centroid","building","entrance"],"title":"Coordinate Precision"},"prayer":{"$ref":"#/components/schemas/Prayer"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"jamaah_time":{"type":"string","title":"Jamaah Time"},"begin_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Begin Time"}},"type":"object","required":["mosque_id","name","lat","lng","coordinate_precision","prayer","label","jamaah_time","begin_time"],"title":"PrayerTimeOut"},"RefreshHealthOut":{"properties":{"run_id":{"type":"integer","title":"Run Id"},"status":{"type":"string","title":"Status"},"started_at":{"type":"string","title":"Started At"},"heartbeat_at":{"type":"string","title":"Heartbeat At"},"completed_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Completed At"},"current_phase":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Phase"},"extract_total":{"type":"integer","title":"Extract Total"},"extract_failed":{"type":"integer","title":"Extract Failed"},"media_total":{"type":"integer","title":"Media Total"},"media_activated":{"type":"integer","title":"Media Activated"},"media_model_calls":{"type":"integer","title":"Media Model Calls"},"media_budget":{"type":"integer","title":"Media Budget"},"media_budget_exhausted":{"type":"boolean","title":"Media Budget Exhausted"},"media_cache_hits":{"type":"integer","title":"Media Cache Hits"},"media_drifted":{"type":"integer","title":"Media Drifted"},"media_due":{"type":"integer","title":"Media Due"},"media_budget_deferred":{"type":"integer","title":"Media Budget Deferred"},"media_transient_failed":{"type":"integer","title":"Media Transient Failed"},"media_quota_deferred":{"type":"integer","title":"Media Quota Deferred"},"media_persistent_failed":{"type":"integer","title":"Media Persistent Failed"},"media_reviewed":{"type":"integer","title":"Media Reviewed"},"media_backoff_skipped":{"type":"integer","title":"Media Backoff Skipped"},"media_artifacts_accepted":{"type":"integer","title":"Media Artifacts Accepted"},"stale_before":{"type":"integer","title":"Stale Before"},"stale_after":{"type":"integer","title":"Stale After"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["run_id","status","started_at","heartbeat_at","completed_at","current_phase","extract_total","extract_failed","media_total","media_activated","media_model_calls","media_budget","media_budget_exhausted","media_cache_hits","media_drifted","media_due","media_budget_deferred","media_transient_failed","media_quota_deferred","media_persistent_failed","media_reviewed","media_backoff_skipped","media_artifacts_accepted","stale_before","stale_after","error"],"title":"RefreshHealthOut"},"SnapshotMosqueOut":{"properties":{"mosque":{"$ref":"#/components/schemas/MosqueOut"},"times":{"items":{"$ref":"#/components/schemas/DayTimes"},"type":"array","title":"Times"}},"type":"object","required":["mosque","times"],"title":"SnapshotMosqueOut"},"SnapshotOut":{"properties":{"generated_at":{"type":"string","format":"date","title":"Generated At"},"count":{"type":"integer","title":"Count"},"mosques":{"items":{"$ref":"#/components/schemas/SnapshotMosqueOut"},"type":"array","title":"Mosques"}},"type":"object","required":["generated_at","count","mosques"],"title":"SnapshotOut"},"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"}}},"servers":[{"url":"/mosques"}]}