{"API Documentation":{"GET /files":{"description":"List all files in the configured S3 bucket","responses":{"200":{"forecast":"[<file paths>]","status":"success"}}},"GET /health":{"description":"Health check, no auth required","responses":{"200":{"status":"ok"}}},"GET /rte/generation-forecast":{"description":"Fetch generation forecast data from the RTE (French grid operator) API","parameters":{"end_date":"End date (ISO 8601)","production_type":"Production type filter, e.g. WIND, SOLAR","start_date":"Start date (ISO 8601)"},"responses":{"200":{"data":"<RTE API response>","status":"success"},"400":{"data":"<RTE API error>","status":"failure"},"500":{"error":"..."}}},"GET /save":{"description":"Save the local test.csv cache file to S3 as a gzip-compressed CSV","responses":{"200":{"message":"...","status":"success|failure"}}},"GET /users":{"description":"List configured users and their settings (tokens excluded). Restricted to the legacy/admin caller","responses":{"200":{"username":{"enabled":"...","permissions":"[...]"}},"403":{"message":"Admin only"}}},"POST /correction":{"description":"Get wind/solar park correction data, either the latest quarter-hour ('last') or for a specific day, with caching","json":{"DATETIME":"'last' or a specific date in 'dd.mm.yyyy' format","ORIENT":"Pandas to_dict orient, e.g. 'records'","PTYPE":"Park type (0 = wind, 1 = solar)"},"responses":{"200":{"correction":"<data>","status":"success"}}},"POST /forecasts":{"description":"Read forecast CSV(s) from S3, optionally over a date range, with Germany-specific shutoff/redispatch corrections applied for dates before 2025-03-19","json":{"FILEPATH":"S3 file key to read (required for single-file requests, or as fallback)","FORECAST":"Forecast version suffix, e.g. '_last' (optional)","FROM":"Range start (optional, used with TO and FORECAST for multi-file range requests)","ORIENT":"Pandas to_dict orient, e.g. 'records'","TO":"Range end (optional)"},"responses":{"200":{"data":"<forecast data>","status":"success"},"400":{"message":"No JSON received","status":"failure"}}},"POST /procedure":{"description":"Call an Oracle stored procedure under wet_trader.<PROCEDURE>. 'get' procedures return rows, 'merge' procedures return a status message","json":{"...":"Any additional keys are passed as procedure parameters","ORIENT":"Pandas to_dict orient for 'get' procedures, default 'records'","PROCEDURE":"Procedure name (must contain 'get' or 'merge')"},"responses":{"200":{"data_or_message":"...","status":"success"},"400":{"message":"...","status":"error"}}},"POST /query":{"description":"Run a named, parameterized SQL file from core/queries/","json":{"END":"End parameter substituted into the query","FILENAME":"SQL file name without extension, e.g. 'get_grid_ts_ge'","ORIENT":"Pandas to_dict orient, e.g. 'records'","START":"Start parameter substituted into the query"},"responses":{"200":{"data":"<query results>","status":"success"},"400":{"message":"No JSON received","status":"failure"}}},"POST /table":{"description":"Query a full database table under WET_TRADER, cached daily and refreshed after 15:00 UTC","json":{"ORIENT":"Pandas to_dict orient, e.g. 'records'","TABLE":"Table name (queried as WET_TRADER.<TABLE>)"},"responses":{"200":{"data":"<table data>","status":"success"},"400":{"message":"No JSON received","status":"failure"}}},"POST /trades":{"description":"Fetch and aggregate executed trade statistics from PowerBot for the given contracts","json":{"DELIVERY_END":"Delivery period end","DELIVERY_START":"Delivery period start","EIC":"List of EIC codes","PRODUCT":"Product type"},"responses":{"200":{"data":{"stats":"[...]"},"status":"success"},"400":{"message":"No JSON received","status":"failure"}}}}}
