{"openapi":"3.1.0","info":{"title":"Swiss Tariff Hub API","description":"Dynamic Swiss electricity tariffs from grid operators, normalised to 15-minute UTC slots. Prices are in CHF/kWh. Authenticate with the X-API-Key header. Daily quota: 100 requests (Free), 1,000 (Pro), shared by all keys of an account; it resets at midnight Swiss time.","version":"1.0.0"},"paths":{"/api/v1/tariffs":{"get":{"summary":"List all active dynamic tariffs, with grid operator, ZIP coverage and publication time","operationId":"get_tariffs_api_v1_tariffs_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Not available on your plan"},"429":{"description":"Daily quota exceeded (resets at midnight Swiss time)"}},"description":"List all active dynamic tariffs, with grid operator, ZIP coverage and publication time.","security":[{"ApiKeyAuth":[]}]}},"/api/v1/prices":{"get":{"summary":"15-minute price slots (energy, grid, residual) for one tariff and one Swiss local day","operationId":"get_prices_endpoint_api_v1_prices_get","parameters":[{"name":"start_time","in":"query","required":true,"schema":{"type":"string","description":"Date/time start UTC (es. 2026-03-16T00:00:00Z)","title":"Start Time"},"description":"Date/time start UTC (es. 2026-03-16T00:00:00Z)"},{"name":"tariff_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Tariff ID (alternativa a zip_code)","title":"Tariff Id"},"description":"Tariff ID (alternativa a zip_code)"},{"name":"zip_code","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"CAP svizzero, es. 6810 (alternativa a tariff_id)","title":"Zip Code"},"description":"CAP svizzero, es. 6810 (alternativa a tariff_id)"},{"name":"end_time","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Date/time end UTC (optional, default: +1 day)","title":"End Time"},"description":"Date/time end UTC (optional, default: +1 day)"},{"name":"municipality","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Municipality name or BFS number, e.g. Massagno or 5196 (alternative to zip_code, exact where a postal code is shared)","title":"Municipality"},"description":"Municipality name or BFS number, e.g. Massagno or 5196 (alternative to zip_code, exact where a postal code is shared)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Not available on your plan"},"429":{"description":"Daily quota exceeded (resets at midnight Swiss time)"}},"description":"15-minute price slots (energy, grid, residual) for one tariff and one Swiss local day. Identify the tariff with tariff_id or zip_code.","security":[{"ApiKeyAuth":[]}]}},"/api/v1/prices/today":{"get":{"summary":"Shortcut for today's 15-minute price slots (Swiss local day) of one tariff","description":"Shortcut for today's 15-minute price slots (Swiss local day) of one tariff.","operationId":"get_today_prices_api_v1_prices_today_get","parameters":[{"name":"zip_code","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"CAP svizzero, es. 6810","title":"Zip Code"},"description":"CAP svizzero, es. 6810"},{"name":"tariff_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Tariff ID diretto, es. aem_tariffa_dinamica","title":"Tariff Id"},"description":"Tariff ID diretto, es. aem_tariffa_dinamica"},{"name":"municipality","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Municipality name or BFS number, e.g. Massagno or 5196","title":"Municipality"},"description":"Municipality name or BFS number, e.g. Massagno or 5196"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Not available on your plan"},"429":{"description":"Daily quota exceeded (resets at midnight Swiss time)"}},"security":[{"ApiKeyAuth":[]}]}},"/api/v1/prices/all":{"get":{"summary":"15-minute price slots of every tariff for one Swiss local day","description":"15-minute price slots of every tariff for one Swiss local day. Pro plan.","operationId":"get_all_prices_endpoint_api_v1_prices_all_get","parameters":[{"name":"start_time","in":"query","required":true,"schema":{"type":"string","description":"Date/time start UTC (es. 2026-03-17T00:00:00Z)","title":"Start Time"},"description":"Date/time start UTC (es. 2026-03-17T00:00:00Z)"},{"name":"end_time","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Date/time end UTC (optional, default: +1 day)","title":"End Time"},"description":"Date/time end UTC (optional, default: +1 day)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Not available on your plan"},"429":{"description":"Daily quota exceeded (resets at midnight Swiss time)"}},"security":[{"ApiKeyAuth":[]}]}},"/api/v1/summary/daily":{"get":{"summary":"Daily aggregates (average, minimum, maximum with time) for the last N days","operationId":"get_daily_summary_api_v1_summary_daily_get","parameters":[{"name":"tariff_id","in":"query","required":true,"schema":{"type":"string","title":"Tariff Id"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":30,"minimum":1,"default":5,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Not available on your plan"},"429":{"description":"Daily quota exceeded (resets at midnight Swiss time)"}},"description":"Daily aggregates (average, minimum, maximum with time) for the last N days.","security":[{"ApiKeyAuth":[]}]}},"/api/v1/summary/monthly":{"get":{"summary":"Monthly aggregates for the last N months","operationId":"get_monthly_summary_api_v1_summary_monthly_get","parameters":[{"name":"tariff_id","in":"query","required":true,"schema":{"type":"string","title":"Tariff Id"}},{"name":"months","in":"query","required":false,"schema":{"type":"integer","maximum":6,"minimum":1,"default":3,"title":"Months"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Not available on your plan"},"429":{"description":"Daily quota exceeded (resets at midnight Swiss time)"}},"description":"Monthly aggregates for the last N months. Pro plan.","security":[{"ApiKeyAuth":[]}]}},"/api/v1/latest":{"get":{"summary":"Most recent date with published prices for a tariff","operationId":"get_latest_api_v1_latest_get","parameters":[{"name":"tariff_id","in":"query","required":true,"schema":{"type":"string","title":"Tariff Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Not available on your plan"},"429":{"description":"Daily quota exceeded (resets at midnight Swiss time)"}},"description":"Most recent date with published prices for a tariff.","security":[{"ApiKeyAuth":[]}]}},"/api/v1/coverage":{"get":{"summary":"Postal codes covered by each tariff, with the municipalities they serve","description":"Postal codes covered by each tariff, with the municipalities they serve. All plans.","operationId":"get_coverage_api_v1_coverage_get","parameters":[{"name":"tariff_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Only this tariff (optional)","title":"Tariff Id"},"description":"Only this tariff (optional)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Not available on your plan"},"429":{"description":"Daily quota exceeded (resets at midnight Swiss time)"}},"security":[{"ApiKeyAuth":[]}]}},"/api/v1/health":{"get":{"summary":"Data availability per tariff (today and tomorrow)","operationId":"health_api_v1_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Not available on your plan"},"429":{"description":"Daily quota exceeded (resets at midnight Swiss time)"}},"description":"Data availability per tariff (today and tomorrow). No API key required."}},"/api/v1/smart":{"get":{"summary":"Consumption advice for the day: signal, best and worst slots, hourly averages","operationId":"get_smart_summary_api_v1_smart_get","parameters":[{"name":"date_str","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date Str"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Not available on your plan"},"429":{"description":"Daily quota exceeded (resets at midnight Swiss time)"}},"description":"Consumption advice for the day: signal, best and worst slots, hourly averages. Pro plan.","security":[{"ApiKeyAuth":[]}]}}},"components":{"schemas":{"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key"}}},"servers":[{"url":"https://swisstariffhub.ch"}]}