{"openapi":"3.1.0","info":{"title":"Argus API","description":"Air quality monitoring network dashboard","version":"0.1.0"},"paths":{"/api/sites":{"get":{"summary":"List Sites","operationId":"list_sites_api_sites_get","parameters":[{"name":"network","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Network"}},{"name":"bbox","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"min_lon,min_lat,max_lon,max_lat — rectangle filter","title":"Bbox"},"description":"min_lon,min_lat,max_lon,max_lat — rectangle filter"},{"name":"boroughs","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated borough slugs. Mutually exclusive with bbox.","title":"Boroughs"},"description":"Comma-separated borough slugs. Mutually exclusive with bbox."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SiteResponse"},"title":"Response List Sites Api Sites Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sites/{site_id}":{"get":{"summary":"Get Site","operationId":"get_site_api_sites__site_id__get","parameters":[{"name":"site_id","in":"path","required":true,"schema":{"type":"integer","title":"Site Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sites/{site_id}/readings":{"get":{"summary":"Get Readings","operationId":"get_readings_api_sites__site_id__readings_get","parameters":[{"name":"site_id","in":"path","required":true,"schema":{"type":"integer","title":"Site Id"}},{"name":"measurand","in":"query","required":false,"schema":{"type":"string","default":"pm25","title":"Measurand"}},{"name":"last","in":"query","required":false,"schema":{"type":"string","default":"48h","title":"Last"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReadingsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/summary":{"get":{"summary":"Get Summary","operationId":"get_summary_api_summary_get","parameters":[{"name":"compare","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Set to 'yoy' to include same-week-last-year deltas","title":"Compare"},"description":"Set to 'yoy' to include same-week-last-year deltas"},{"name":"bbox","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"min_lon,min_lat,max_lon,max_lat — rectangle filter","title":"Bbox"},"description":"min_lon,min_lat,max_lon,max_lat — rectangle filter"},{"name":"boroughs","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated borough slugs. Mutually exclusive with bbox.","title":"Boroughs"},"description":"Comma-separated borough slugs. Mutually exclusive with bbox."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SummaryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/boroughs/{slug}/summary":{"get":{"summary":"Get Borough Summary","operationId":"get_borough_summary_api_boroughs__slug__summary_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"include","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Set to 'inactive' to include sites silent for >90 days. Default hides them.","title":"Include"},"description":"Set to 'inactive' to include sites silent for >90 days. Default hides them."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BoroughSummaryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/boroughs/{slug}/sites":{"get":{"summary":"Get Borough Sites","operationId":"get_borough_sites_api_boroughs__slug__sites_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"include","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Set to 'inactive' to include sites silent for >90 days. Default hides them.","title":"Include"},"description":"Set to 'inactive' to include sites silent for >90 days. Default hides them."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BoroughSitesResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/network/headline":{"get":{"summary":"Get Headline","operationId":"get_headline_api_network_headline_get","parameters":[{"name":"bbox","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"min_lon,min_lat,max_lon,max_lat — rectangle filter","title":"Bbox"},"description":"min_lon,min_lat,max_lon,max_lat — rectangle filter"},{"name":"boroughs","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated borough slugs (e.g. southwark,lambeth,lewisham). Mutually exclusive with bbox.","title":"Boroughs"},"description":"Comma-separated borough slugs (e.g. southwark,lambeth,lewisham). Mutually exclusive with bbox."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NetworkHeadlineResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/network/highlights":{"get":{"summary":"Get Highlights","operationId":"get_highlights_api_network_highlights_get","parameters":[{"name":"bbox","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"min_lon,min_lat,max_lon,max_lat — rectangle filter","title":"Bbox"},"description":"min_lon,min_lat,max_lon,max_lat — rectangle filter"},{"name":"boroughs","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated borough slugs. Mutually exclusive with bbox.","title":"Boroughs"},"description":"Comma-separated borough slugs. Mutually exclusive with bbox."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NetworkHighlightsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/networks":{"get":{"summary":"List Networks","description":"All networks Argus ingests, with site counts and freshness.\n\nPowers the public /networks page and serves as the discovery surface\nfor researchers using the bulk-readings API.","operationId":"list_networks_api_networks_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NetworkListingResponse"}}}}}}},"/api/readings/bulk":{"get":{"summary":"Get Readings Bulk","operationId":"get_readings_bulk_api_readings_bulk_get","parameters":[{"name":"sites","in":"query","required":true,"schema":{"type":"string","description":"Comma-separated NETWORK:CODE pairs","title":"Sites"},"description":"Comma-separated NETWORK:CODE pairs"},{"name":"measurand","in":"query","required":true,"schema":{"type":"string","description":"Single canonical measurand (csv/json) or comma-separated list (xlsx)","title":"Measurand"},"description":"Single canonical measurand (csv/json) or comma-separated list (xlsx)"},{"name":"start","in":"query","required":true,"schema":{"type":"string","description":"ISO 8601 UTC","title":"Start"},"description":"ISO 8601 UTC"},{"name":"end","in":"query","required":true,"schema":{"type":"string","description":"ISO 8601 UTC","title":"End"},"description":"ISO 8601 UTC"},{"name":"format","in":"query","required":false,"schema":{"type":"string","pattern":"^(json|csv|xlsx)$","default":"json","title":"Format"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/sites/latest":{"get":{"summary":"Public Sites Latest","description":"Every monitoring site in the Argus DB with a reading for `pollutant`\ninside the last 6 hours, optionally filtered to a region (bbox or\nborough union) and/or a subset of source networks.\n\nDeliberately returns LESS than the keyed /api/sites — no historical\nseries, no full WHO context payload — so the public namespace doesn't\nbecome a backdoor to the full API.","operationId":"public_sites_latest_api_public_sites_latest_get","parameters":[{"name":"pollutant","in":"query","required":false,"schema":{"type":"string","default":"no2","title":"Pollutant"}},{"name":"bbox","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional rectangle filter: min_lon,min_lat,max_lon,max_lat","title":"Bbox"},"description":"Optional rectangle filter: min_lon,min_lat,max_lon,max_lat"},{"name":"boroughs","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional borough-union filter (slugs, comma-separated). Mutually exclusive with bbox.","title":"Boroughs"},"description":"Optional borough-union filter (slugs, comma-separated). Mutually exclusive with bbox."},{"name":"networks","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional comma-separated list of source networks (e.g. 'LAQN,AURN,BL')","title":"Networks"},"description":"Optional comma-separated list of source networks (e.g. 'LAQN,AURN,BL')"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicSitesResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/sites/directory":{"get":{"summary":"Public Sites Directory","description":"Active-sites directory — name, code, network, lat/lon, borough.\n\nNo readings. Powers the typeahead on the /data/ downloader page. The\nexpected client pattern is one fetch on dialog open, then in-memory\nfuzzy filter as the user types. The response is small (<200 KB) and\ncacheable for a few minutes.","operationId":"public_sites_directory_api_public_sites_directory_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicSiteDirectoryResponse"}}}}}}},"/api/public/concentration/manifest":{"get":{"summary":"Public Manifest","operationId":"public_manifest_api_public_concentration_manifest_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicManifestResponse"}}}}}}},"/api/public/concentration/grid":{"get":{"summary":"Public Grid","operationId":"public_grid_api_public_concentration_grid_get","parameters":[{"name":"pollutant","in":"query","required":false,"schema":{"type":"string","default":"no2","title":"Pollutant"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicGridResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/keys/request":{"post":{"summary":"Request Key","operationId":"request_key_api_keys_request_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/KeyRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KeyResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/keys/revoke/{token}":{"get":{"summary":"Revoke Key","operationId":"revoke_key_api_keys_revoke__token__get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/profiles":{"get":{"tags":["profiles"],"summary":"List Profiles","description":"List all profiles (enabled or not) with summary fields.","operationId":"list_profiles_api_profiles_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/profiles/{profile_id}":{"get":{"tags":["profiles"],"summary":"Get Profile Resolved","description":"Full resolved profile after deep-merge.\nMarkdown slots remain as paths; frontend resolves to HTML at build time.","operationId":"get_profile_resolved_api_profiles__profile_id__get","parameters":[{"name":"profile_id","in":"path","required":true,"schema":{"type":"string","title":"Profile Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/profiles/{profile_id}/diagnostic":{"get":{"tags":["profiles"],"summary":"Diagnostic","description":"Validation status for a profile: slug resolution, site existence\n(shape-only — DB check is in the CLI validate command), markdown slot\nexistence, and any warnings.","operationId":"diagnostic_api_profiles__profile_id__diagnostic_get","parameters":[{"name":"profile_id","in":"path","required":true,"schema":{"type":"string","title":"Profile Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/concentration":{"get":{"summary":"Get Concentration","description":"Modelled hourly NO2 at (lat, lon, t).\n\nSee ``argus-concentration-spike.md`` for the contract. The hour\nis implicit — currently the cache holds one hour at a time, so\nthe response returns whatever ``target_hour`` the worker last\nwrote. A future ``?t=`` parameter will let callers ask for a\nhistorical hour once the cache holds multiple.","operationId":"get_concentration_api_concentration_get","parameters":[{"name":"lat","in":"query","required":true,"schema":{"type":"number","description":"Latitude in WGS84 degrees","title":"Lat"},"description":"Latitude in WGS84 degrees"},{"name":"lon","in":"query","required":true,"schema":{"type":"number","description":"Longitude in WGS84 degrees","title":"Lon"},"description":"Longitude in WGS84 degrees"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConcentrationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/concentration/grid":{"get":{"summary":"Get Concentration Grid","description":"Whole modelled surface for the latest cached hour. Used by the\n`/concentration` map page; the per-point endpoint is for hover/click\ndrill-downs.\n\nPayload size: ~85×168 cells × ~5 chars per float ≈ 70KB JSON. Small\nenough to send in one shot. NaN cells encoded as JSON null.","operationId":"get_concentration_grid_api_concentration_grid_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConcentrationGridResponse"}}}}}}},"/api/health":{"get":{"summary":"Health","operationId":"health_api_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"BoroughSiteSummary":{"properties":{"id":{"type":"integer","title":"Id"},"site_code":{"type":"string","title":"Site Code"},"source_network":{"type":"string","title":"Source Network"},"site_name":{"type":"string","title":"Site Name"},"latitude":{"type":"number","title":"Latitude"},"longitude":{"type":"number","title":"Longitude"},"site_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Site Type"},"tier":{"type":"string","title":"Tier"},"latest":{"items":{"$ref":"#/components/schemas/LatestReading"},"type":"array","title":"Latest","default":[]}},"type":"object","required":["id","site_code","source_network","site_name","latitude","longitude","tier"],"title":"BoroughSiteSummary","description":"Site-level row for the borough sites endpoint, with tier tag."},"BoroughSitesResponse":{"properties":{"slug":{"type":"string","title":"Slug"},"name":{"type":"string","title":"Name"},"sites":{"items":{"$ref":"#/components/schemas/BoroughSiteSummary"},"type":"array","title":"Sites"}},"type":"object","required":["slug","name","sites"],"title":"BoroughSitesResponse"},"BoroughSummaryResponse":{"properties":{"slug":{"type":"string","title":"Slug"},"name":{"type":"string","title":"Name"},"site_count":{"type":"integer","title":"Site Count"},"rollup_site_count":{"type":"integer","title":"Rollup Site Count"},"verdicts":{"items":{"$ref":"#/components/schemas/TierVerdict"},"type":"array","title":"Verdicts"},"who_daily_ratio_history":{"items":{"$ref":"#/components/schemas/WhoDailyRatio"},"type":"array","title":"Who Daily Ratio History","default":[]}},"type":"object","required":["slug","name","site_count","rollup_site_count","verdicts"],"title":"BoroughSummaryResponse"},"ConcentrationGridResponse":{"properties":{"lats":{"items":{"type":"number"},"type":"array","title":"Lats"},"lons":{"items":{"type":"number"},"type":"array","title":"Lons"},"values":{"items":{"items":{"anyOf":[{"type":"number"},{"type":"null"}]},"type":"array"},"type":"array","title":"Values"},"bbox":{"additionalProperties":true,"type":"object","title":"Bbox"},"target_hour":{"type":"string","title":"Target Hour"},"generated_at":{"type":"string","title":"Generated At"},"alpha_network":{"type":"string","title":"Alpha Network"},"cal_network":{"type":"string","title":"Cal Network"},"n_sensors_used":{"type":"integer","title":"N Sensors Used"},"sigma_intercept":{"type":"number","title":"Sigma Intercept"},"sigma_slope":{"type":"number","title":"Sigma Slope"},"scale_floor":{"type":"number","title":"Scale Floor"},"q_at_90":{"type":"number","title":"Q At 90"},"blind_spot_codes":{"items":{"type":"string"},"type":"array","title":"Blind Spot Codes"}},"type":"object","required":["lats","lons","values","bbox","target_hour","generated_at","alpha_network","cal_network","n_sensors_used","sigma_intercept","sigma_slope","scale_floor","q_at_90","blind_spot_codes"],"title":"ConcentrationGridResponse","description":"The full cached surface, suitable for client-side rendering of a\nheatmap overlay. Values are µg/m³ NO2; NaN cells (Pan coverage gaps)\nare encoded as null."},"ConcentrationResponse":{"properties":{"value":{"type":"number","title":"Value"},"lo":{"type":"number","title":"Lo"},"hi":{"type":"number","title":"Hi"},"alpha":{"type":"number","title":"Alpha"},"n_sensors_used":{"type":"integer","title":"N Sensors Used"},"source":{"type":"string","title":"Source"},"fallback_monitor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fallback Monitor"},"fallback_distance_m":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Fallback Distance M"},"target_hour":{"type":"string","title":"Target Hour"},"generated_at":{"type":"string","title":"Generated At"}},"type":"object","required":["value","lo","hi","alpha","n_sensors_used","source","fallback_monitor","fallback_distance_m","target_hour","generated_at"],"title":"ConcentrationResponse","description":"Response shape — see argus-concentration-spike.md §\"Endpoint shape\"."},"FreshnessWarning":{"properties":{"network":{"type":"string","title":"Network"},"measurand":{"type":"string","title":"Measurand"},"stale_hours":{"type":"number","title":"Stale Hours"}},"type":"object","required":["network","measurand","stale_hours"],"title":"FreshnessWarning"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HighlightCleanestSite":{"properties":{"id":{"type":"integer","title":"Id"},"site_code":{"type":"string","title":"Site Code"},"source_network":{"type":"string","title":"Source Network"},"site_name":{"type":"string","title":"Site Name"},"latitude":{"type":"number","title":"Latitude"},"longitude":{"type":"number","title":"Longitude"},"site_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Site Type"},"local_authority":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Local Authority"},"last_seen_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Seen At"},"latest":{"items":{"$ref":"#/components/schemas/LatestReading"},"type":"array","title":"Latest","default":[]},"headline_pollutant":{"type":"string","title":"Headline Pollutant"},"headline_ratio":{"type":"number","title":"Headline Ratio"}},"type":"object","required":["id","site_code","source_network","site_name","latitude","longitude","headline_pollutant","headline_ratio"],"title":"HighlightCleanestSite","description":"Site with the lowest WHO daily-guideline ratio in the last 24h.\n\nPairs with `HighlightWorstSite` so the homepage isn't pure\nfear-framing. Same ranking input, opposite sort order."},"HighlightImprovedSite":{"properties":{"id":{"type":"integer","title":"Id"},"site_code":{"type":"string","title":"Site Code"},"source_network":{"type":"string","title":"Source Network"},"site_name":{"type":"string","title":"Site Name"},"latitude":{"type":"number","title":"Latitude"},"longitude":{"type":"number","title":"Longitude"},"site_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Site Type"},"local_authority":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Local Authority"},"last_seen_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Seen At"},"latest":{"items":{"$ref":"#/components/schemas/LatestReading"},"type":"array","title":"Latest","default":[]},"pollutant":{"type":"string","title":"Pollutant"},"delta_pct":{"type":"number","title":"Delta Pct"},"current_mean":{"type":"number","title":"Current Mean"},"previous_mean":{"type":"number","title":"Previous Mean"}},"type":"object","required":["id","site_code","source_network","site_name","latitude","longitude","pollutant","delta_pct","current_mean","previous_mean"],"title":"HighlightImprovedSite","description":"Site with the largest 30-day-over-30-day PM₂.₅ improvement."},"HighlightWorstSite":{"properties":{"id":{"type":"integer","title":"Id"},"site_code":{"type":"string","title":"Site Code"},"source_network":{"type":"string","title":"Source Network"},"site_name":{"type":"string","title":"Site Name"},"latitude":{"type":"number","title":"Latitude"},"longitude":{"type":"number","title":"Longitude"},"site_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Site Type"},"local_authority":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Local Authority"},"last_seen_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Seen At"},"latest":{"items":{"$ref":"#/components/schemas/LatestReading"},"type":"array","title":"Latest","default":[]},"headline_pollutant":{"type":"string","title":"Headline Pollutant"},"headline_ratio":{"type":"number","title":"Headline Ratio"}},"type":"object","required":["id","site_code","source_network","site_name","latitude","longitude","headline_pollutant","headline_ratio"],"title":"HighlightWorstSite","description":"Site with the highest WHO daily-guideline ratio in the last 24h."},"KeyRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"purpose":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Purpose"}},"type":"object","required":["email"],"title":"KeyRequest"},"KeyResponse":{"properties":{"key":{"type":"string","title":"Key"},"name":{"type":"string","title":"Name"},"revoke_url":{"type":"string","title":"Revoke Url"}},"type":"object","required":["key","name","revoke_url"],"title":"KeyResponse"},"LatestReading":{"properties":{"measurand":{"type":"string","title":"Measurand"},"value":{"type":"number","title":"Value"},"units":{"type":"string","title":"Units"},"time":{"type":"string","title":"Time"},"who_status":{"$ref":"#/components/schemas/WHOStatusPair"}},"type":"object","required":["measurand","value","units","time","who_status"],"title":"LatestReading"},"NetworkHeadlineResponse":{"properties":{"text":{"type":"string","title":"Text"},"severity":{"type":"string","title":"Severity"},"generated_at":{"type":"string","title":"Generated At"},"latest_reading_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Latest Reading At"},"worst_ratio":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Worst Ratio"},"worst_ratio_pollutant":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Worst Ratio Pollutant"},"who_daily_ratio_history":{"items":{"$ref":"#/components/schemas/WhoDailyRatio"},"type":"array","title":"Who Daily Ratio History","default":[]},"evidence_links":{"items":{"type":"string"},"type":"array","title":"Evidence Links","default":[]},"freshness_warnings":{"items":{"$ref":"#/components/schemas/FreshnessWarning"},"type":"array","title":"Freshness Warnings","default":[]}},"type":"object","required":["text","severity","generated_at"],"title":"NetworkHeadlineResponse"},"NetworkHighlightsResponse":{"properties":{"worst_site":{"anyOf":[{"$ref":"#/components/schemas/HighlightWorstSite"},{"type":"null"}]},"most_improved_site":{"anyOf":[{"$ref":"#/components/schemas/HighlightImprovedSite"},{"type":"null"}]},"cleanest_site":{"anyOf":[{"$ref":"#/components/schemas/HighlightCleanestSite"},{"type":"null"}]},"network_trend":{"items":{"$ref":"#/components/schemas/NetworkTrendPoint"},"type":"array","title":"Network Trend"},"generated_at":{"type":"string","title":"Generated At"}},"type":"object","required":["worst_site","most_improved_site","network_trend","generated_at"],"title":"NetworkHighlightsResponse"},"NetworkListing":{"properties":{"code":{"type":"string","title":"Code"},"name":{"type":"string","title":"Name"},"operator":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Operator"},"ratification_process":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ratification Process"},"ratification_lag_months":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Ratification Lag Months"},"qa_flag_convention":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Qa Flag Convention"},"qa_flag_notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Qa Flag Notes"},"data_capture_target_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Data Capture Target Pct"},"data_capture_achieved_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Data Capture Achieved Pct"},"data_capture_achieved_year":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Data Capture Achieved Year"},"homepage_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Homepage Url"},"data_licence":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Data Licence"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"},"site_count":{"type":"integer","title":"Site Count"},"latest_reading_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Latest Reading At"}},"type":"object","required":["code","name","site_count"],"title":"NetworkListing","description":"One network in the /api/networks listing."},"NetworkListingResponse":{"properties":{"networks":{"items":{"$ref":"#/components/schemas/NetworkListing"},"type":"array","title":"Networks"}},"type":"object","required":["networks"],"title":"NetworkListingResponse"},"NetworkStats":{"properties":{"measurand":{"type":"string","title":"Measurand"},"total_sites":{"type":"integer","title":"Total Sites"},"meets_guideline":{"type":"integer","title":"Meets Guideline"},"approaching":{"type":"integer","title":"Approaching"},"exceeds":{"type":"integer","title":"Exceeds"},"well_above":{"type":"integer","title":"Well Above"},"yoy_meets_delta":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Yoy Meets Delta"}},"type":"object","required":["measurand","total_sites","meets_guideline","approaching","exceeds","well_above"],"title":"NetworkStats"},"NetworkTrendPoint":{"properties":{"date":{"type":"string","title":"Date"},"mean_pm25":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Mean Pm25"},"mean_no2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Mean No2"}},"type":"object","required":["date","mean_pm25","mean_no2"],"title":"NetworkTrendPoint"},"PublicGridResponse":{"properties":{"pollutant":{"type":"string","title":"Pollutant"},"units":{"type":"string","title":"Units"},"lats":{"items":{"type":"number"},"type":"array","title":"Lats"},"lons":{"items":{"type":"number"},"type":"array","title":"Lons"},"values":{"items":{"items":{"anyOf":[{"type":"number"},{"type":"null"}]},"type":"array"},"type":"array","title":"Values"},"bbox":{"additionalProperties":true,"type":"object","title":"Bbox"},"target_hour":{"type":"string","title":"Target Hour"},"generated_at":{"type":"string","title":"Generated At"}},"type":"object","required":["pollutant","units","lats","lons","values","bbox","target_hour","generated_at"],"title":"PublicGridResponse"},"PublicLatestReading":{"properties":{"value":{"type":"number","title":"Value"},"units":{"type":"string","title":"Units"},"time":{"type":"string","title":"Time"},"who_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Who Pct"}},"type":"object","required":["value","units","time"],"title":"PublicLatestReading"},"PublicManifestResponse":{"properties":{"available":{"items":{"type":"string"},"type":"array","title":"Available"},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["available"],"title":"PublicManifestResponse"},"PublicSiteDirectoryEntry":{"properties":{"network":{"type":"string","title":"Network"},"site_code":{"type":"string","title":"Site Code"},"name":{"type":"string","title":"Name"},"lat":{"type":"number","title":"Lat"},"lon":{"type":"number","title":"Lon"},"site_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Site Type"},"borough":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Borough"}},"type":"object","required":["network","site_code","name","lat","lon"],"title":"PublicSiteDirectoryEntry","description":"Bare directory row for the download-page site search.\n\nNo readings — just enough metadata to render a chip and submit a\nbulk-readings query. Active sites only (any reading within the\nlast 90 days)."},"PublicSiteDirectoryResponse":{"properties":{"sites":{"items":{"$ref":"#/components/schemas/PublicSiteDirectoryEntry"},"type":"array","title":"Sites"}},"type":"object","required":["sites"],"title":"PublicSiteDirectoryResponse"},"PublicSiteLatest":{"properties":{"network":{"type":"string","title":"Network"},"site_code":{"type":"string","title":"Site Code"},"name":{"type":"string","title":"Name"},"lat":{"type":"number","title":"Lat"},"lon":{"type":"number","title":"Lon"},"site_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Site Type"},"latest":{"$ref":"#/components/schemas/PublicLatestReading"}},"type":"object","required":["network","site_code","name","lat","lon","latest"],"title":"PublicSiteLatest"},"PublicSitesResponse":{"properties":{"pollutant":{"type":"string","title":"Pollutant"},"units":{"type":"string","title":"Units"},"sites":{"items":{"$ref":"#/components/schemas/PublicSiteLatest"},"type":"array","title":"Sites"}},"type":"object","required":["pollutant","units","sites"],"title":"PublicSitesResponse"},"ReadingPoint":{"properties":{"time":{"type":"string","title":"Time"},"value":{"type":"number","title":"Value"}},"type":"object","required":["time","value"],"title":"ReadingPoint"},"ReadingsResponse":{"properties":{"site_id":{"type":"integer","title":"Site Id"},"site_code":{"type":"string","title":"Site Code"},"measurand":{"type":"string","title":"Measurand"},"units":{"type":"string","title":"Units"},"readings":{"items":{"$ref":"#/components/schemas/ReadingPoint"},"type":"array","title":"Readings"},"who_status":{"$ref":"#/components/schemas/WHOStatusPair"}},"type":"object","required":["site_id","site_code","measurand","units","readings","who_status"],"title":"ReadingsResponse"},"SiteResponse":{"properties":{"id":{"type":"integer","title":"Id"},"site_code":{"type":"string","title":"Site Code"},"source_network":{"type":"string","title":"Source Network"},"site_name":{"type":"string","title":"Site Name"},"latitude":{"type":"number","title":"Latitude"},"longitude":{"type":"number","title":"Longitude"},"site_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Site Type"},"local_authority":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Local Authority"},"last_seen_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Seen At"},"latest":{"items":{"$ref":"#/components/schemas/LatestReading"},"type":"array","title":"Latest","default":[]}},"type":"object","required":["id","site_code","source_network","site_name","latitude","longitude"],"title":"SiteResponse"},"SummaryResponse":{"properties":{"stats":{"items":{"$ref":"#/components/schemas/NetworkStats"},"type":"array","title":"Stats"},"total_sites":{"type":"integer","title":"Total Sites"}},"type":"object","required":["stats","total_sites"],"title":"SummaryResponse"},"TierVerdict":{"properties":{"tier":{"type":"string","title":"Tier"},"measurand":{"type":"string","title":"Measurand"},"annual_mean":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Annual Mean"},"sites_in_rollup":{"type":"integer","title":"Sites In Rollup"},"uk_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Uk Status"},"uk_limit":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Uk Limit"},"who_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Who Status"},"who_limit":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Who Limit"}},"type":"object","required":["tier","measurand","annual_mean","sites_in_rollup","uk_status","uk_limit","who_status","who_limit"],"title":"TierVerdict","description":"Verdict for a single (tier, measurand) combination — UK headline + WHO context."},"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"},"WHOStatusPair":{"properties":{"daily":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Daily"},"annual":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Annual"}},"type":"object","title":"WHOStatusPair"},"WhoDailyRatio":{"properties":{"date":{"type":"string","title":"Date"},"pm25":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Pm25"},"no2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"No2"}},"type":"object","required":["date"],"title":"WhoDailyRatio","description":"Single day's network-mean WHO 24h ratio per pollutant.\n\nEach value is `(network 24h mean) / (WHO 24h guideline)`. 1.0 sits\nexactly on the guideline; <1 is under; >1 is over. `None` means no\ndata for that pollutant on that day."}}}}