{"service":"F1 E-Ink Calendar API","version":"1.3.0","statistics":{"enabled":true,"aggregate_only":true,"disabled_response":"410 when MINIMAL_DATA_MODE=true","performance_sample_rate":0.1,"privacy":"Performance ingestion discards unknown and legacy visitor metadata. Default storage: hourly usage totals and coarse performance histograms."},"description":"Generate 800x480 BMP images for E-Ink displays showing F1 race schedules","endpoints":{"/":{"method":"GET","description":"Interactive preview page with live image generation"},"/calendar.bmp":{"method":"GET","description":"Generate F1 calendar as BMP image (800x480)","parameters":{"track_style":{"type":"string","default":"relief","values":["relief","poster","clean","lino","riso","screenprint","contours","geometric","blueprint","ribbon","mosaic","halftone","negative","papercut","typographic","artdeco","stencil","pixel"]},"track_source":{"type":"string","default":"jules","values":["jules","commons"]},"track_accent":{"type":"string","default":"all","values":["all","mono","red","yellow","blue","green","warm","red-blue","red-green","yellow-blue","yellow-green","cool","red-yellow-blue","red-yellow-green","red-blue-green","yellow-blue-green"]},"lang":{"type":"string","description":"Language code for calendar text","values":["cs","de","en","es","fr","it","ja","nl","pl","pt-BR","sk","tr","zh-CN"],"default":"en","example":"?lang=cs"},"year":{"type":"integer","description":"Season year for specific race","example":"?year=2025","optional":true},"round":{"type":"integer","description":"Round number (1-24) for specific race","example":"?round=5","optional":true},"tz":{"type":"string","description":"Timezone for schedule times (IANA format)","example":"?tz=America/New_York","default":"Europe/Prague","optional":true},"display":{"type":"string","description":"Display output mode","values":["1bit","bwr","bwry","spectra6"],"default":"1bit","example":"?display=bwry","optional":true},"weather":{"type":"boolean","description":"Enable or disable weather overlay","values":[true,false],"default":true,"example":"?weather=false","optional":true},"weather_type":{"type":"string","description":"Weather source to render ('race' normalizes to 'race_day'; 'off' disables weather)","values":["race_day","race","current","off"],"default":"race_day","example":"?weather_type=current","optional":true}},"response":{"content_type":"image/bmp","dimensions":"800x480","color_depth":"1-bit monochrome, 4-bit indexed B/W/R, 4-bit indexed B/W/R/Y, or indexed Spectra 6"},"examples":["/calendar.bmp","/calendar.bmp?lang=cs","/calendar.bmp?year=2025&round=1","/calendar.bmp?lang=en&tz=America/Los_Angeles","/calendar.bmp?display=bwr","/calendar.bmp?display=bwry","/calendar.bmp?display=spectra6&weather_type=current"]},"/teams.bmp":{"method":"GET","description":"Generate F1 teams and drivers BMP image (800x480)","parameters":{"lang":{"type":"string","description":"Language code for teams text","values":["cs","de","en","es","fr","it","ja","nl","pl","pt-BR","sk","tr","zh-CN"],"default":"en","example":"?lang=cs"},"year":{"type":"integer","description":"Season year for team data","example":"?year=2026","optional":true},"display":{"type":"string","description":"Display output mode","values":["1bit","bwr","bwry","spectra6"],"default":"1bit","example":"?display=bwr","optional":true}},"response":{"content_type":"image/bmp","dimensions":"800x480","color_depth":"1-bit monochrome, 4-bit indexed B/W/R, 4-bit indexed B/W/R/Y, or indexed Spectra 6"},"examples":["/teams.bmp","/teams.bmp?lang=cs","/teams.bmp?year=2026","/teams.bmp?display=bwr","/teams.bmp?display=spectra6"]},"/api":{"method":"GET","description":"API documentation (this endpoint)"},"/api/tracks":{"method":"GET","description":"Track artwork choices and catalogue"},"/api/tracks/{circuit_id}":{"method":"GET","description":"Per-file attribution"},"/api/tracks/{circuit_id}.{svg|png|bmp}":{"method":"GET","description":"Attributed standalone artwork","parameters":["display","track_style","track_source","track_accent"]},"/credits":{"method":"GET","description":"Artwork authors and licences"},"/api/docs":{"method":"GET","description":"API documentation (alias for /api)"},"/api/stats":{"method":"GET","description":"Request statistics for the last 24h, including calendar map choices; 410 when MINIMAL_DATA_MODE=true","calendar_map_breakdowns":{"requests.by_track_style":"Counts by requested track_style","requests.by_track_source":"Counts by requested track_source","requests.by_track_accent":"Counts by requested track_accent","legacy":"Historic requests with unrecorded map choices; new requests record resolved defaults even when query parameters are omitted"}},"/api/stats/history":{"method":"GET","description":"Historical hourly request statistics; 410 when MINIMAL_DATA_MODE=true"},"/api/perf-metrics":{"methods":["GET","POST"],"description":"GET: performance summaries. POST: numeric Web Vitals and a known page category only. Both return 410 when MINIMAL_DATA_MODE=true.","measurement_version":3,"legacy_compatibility":"Version markers 1 and 2 remain accepted. Obsolete visitor/device fields and unknown fields are ignored, never stored.","timing_resolution_ms":50,"cls_resolution":0.01},"/api/races/{year}":{"method":"GET","description":"Get list of races for a season","parameters":{"year":{"type":"integer","description":"Season year","in":"path"}}},"/api/race/{year}/{round_num}":{"method":"GET","description":"Get detailed race information","parameters":{"year":{"type":"integer","description":"Season year","in":"path"},"round_num":{"type":"integer","description":"Round number","in":"path"}}},"/health":{"method":"GET","description":"Process liveness check"},"/health/ready":{"method":"GET","description":"SQLite, persistent storage, and generation readiness check"}},"e_ink_usage":{"description":"For E-Ink displays, fetch /calendar.bmp and display directly","recommended_refresh":"Every 1-6 hours (data updates hourly)","display_compatibility":"Any 800x480 E-Ink display (e.g., Waveshare 7.5\")"}}