API Reference
Base URL is the server started by:
Code
serve starts the primary FastAPI server.
Example base URL:
http://127.0.0.1:8000
Interactive API documentation is available at:
http://127.0.0.1:8000/docs(Swagger UI)http://127.0.0.1:8000/redoc(ReDoc)
The server works with the solver the campaign was prepared for (recorded in
RUNS/campaign.json). Several responses depend on it: GET /api/app_config
lists what the solver offers, and a restart, control or GUI request the solver
cannot perform is refused with 400 (for example Solver 'code_aster' does not support restart).
Authentication
Authentication is optional.
If [api].token is configured in csauto.toml (or serve --token is given), each /api/* request must send either:
X-CSAUTO-TOKEN: <token>Authorization: Bearer <token>
Without a valid token, the server returns 401 Unauthorized.
GET /api/solver_logo and GET /api/solver_icon need no token, like the
dashboard's own assets.
Request conventions
Case list query format:
- many endpoints require
casequery parameter - accepted forms:
- repeated query:
?case=case0001&case=case0002 - comma-separated:
?case=case0001,case0002
- repeated query:
Boolean query values (any case):
- true:
1,true,yes,on,t,y - false:
0,false,no,off,f,n - any other value, empty included, is refused with
422
Case validation:
- case IDs are validated and path traversal is blocked
- invalid case values return
400
GET endpoints
GET /api/app_config
Purpose:
- describe what the campaign's solver offers, so a client shows only what works
Response (code_saturne):
Code
Fields:
panels: dashboard tabs, in display ordercapabilities: what the solver can do (residuals,probes,performance,compare,control,restart,gui). Restart, control and GUI requests the solver does not support are refused with400; the residuals, probes and timing endpoints of a solver without them return empty resultscompare_kinds: files offered by Compare; the first one is the defaultkindof/api/compare_runserror_files: files/api/recent_errorsscans by defaulttail_files: Log Tail file names, best first; entries may be globs such as*.mess, and/api/tail_filesresolves them for one casecontrol_actions,restart_modes: an emptyvalue_labelmeans no value is taken; otherwisevalue_kind(intorfloat) says which number is expecteddefault_residual_columns: residual curves plotted firstlogo,icon: whether/api/solver_logoand/api/solver_iconhave an image
For code_aster, panels is status, compare, tail, errors, the only
capability is compare, and control_actions and restart_modes are empty.
GET /api/solver_logo and GET /api/solver_icon
Purpose:
- the solver's logo (dashboard header) and square icon (browser tab)
No authentication. Response content-type: image/svg+xml, or 404 when the
solver has no such image.
GET /api/status
Purpose:
- refresh and return all case rows + detected DOE columns
Query parameters:
log(optional, boolean): if true, logsrefreshactions in case history
Response:
Code
last_mod is a UTC timestamp.
GET /api/perf
Purpose:
- collect timing records from selected cases
Query parameters:
case(required)
Response:
Code
columns are the solver's timing columns (kind is time, int, float or
text). Each record holds case_id plus one value per column key, null
when the log does not give it. Cases without a timing log have no record. Both
lists are empty for a solver without timing columns (code_aster).
GET /api/restart_origin
Purpose:
- infer restart base iteration/time from latest run logs
Query parameters:
case(required)
Response:
{ "origins": { "case0001": { "iteration": 500, "time": 12.5 } } }
GET /api/recent_errors
Purpose:
- scan log files for anomalies (error/warn/info)
Query parameters:
case(required)files(optional comma list): defaults to the solver'serror_files(see/api/app_config)max_hits(optional int1..500, default200)context(optional int0..50, default6): lines before and after hitsev(optional):all,error,warn,info, or comma mixq(optional): plain text filter
Response:
{ "items": [...] }
Each item contains:
case_id,file,severityline_html(highlighted + context)tail_index,tail_total
GET /api/residual_columns
Purpose:
- list available residual columns for selected cases
Query parameters:
case(required)
Response:
{ "columns": ["iteration", "velocity", "pressure", ...] }
GET /api/residuals_svg
Purpose:
- render residuals plot as SVG
Query parameters:
case(required)columns(optional comma/space list, default: the solver'sdefault_residual_columns, else the first two residuals)width(optional int, default900)height(optional int, default500)x_min(optional float, default0)include_history(optional boolean)
Response content-type:
image/svg+xml
GET /api/tail
Purpose:
- return tail content of a case file
Query parameters:
case(required)file(optional, default: the first file/api/tail_fileslists for the case)n(optional int, default200)
Response content-type:
text/plain
GET /api/tail_files
Purpose:
- list the log files the Log Tail panel can show for one case, best first
Query parameters:
case(required)
Response:
Code
The solver's tail_files that exist come first; glob entries become paths
relative to the case. The other *.log files of the latest run follow.
GET /api/tail_lines
Purpose:
- return the last lines of a case file, each with the severity the solver's anomaly patterns give it (what the Log Tail colours)
Query parameters:
case(required)file(optional, same default as/api/tail)n(optional int, default200)
Response:
Code
severity is error, warn or null.
GET /api/resu_files
Purpose:
- list the files of the case's latest run folder, relative to the case
Query parameters:
case(required)limit(optional int, default2000)
Response:
{ "files": [...] }
GET /api/resu_dirs
Purpose:
- list the case's run folders, newest first: the folders the solver reports as
runs (code_saturne: each
RESU/<run>; code_aster:RESUitself)
Query parameters:
case(required)
Response:
{ "dirs": ["20260308-1413", "20260308-1347", ...] }
GET /api/probes
Purpose:
- list the probe/profile files of one or more cases (names merged, no duplicates)
Query parameters:
case(required)scope(optional):probes(default) orprofileslimit(optional int, default200)
Response:
{ "files": [...] }
GET /api/probe_position
Purpose:
- infer probe coordinates from associated coords file when available
Query parameters:
case(required)probe(required)column(optional)
Response:
{ "found": false }- or
{ "found": true, "x": 0.05, "y": 0.05, "z": 0.0, "source": "..." }
GET /api/probe_columns
Purpose:
- list columns available in one or more probe files
Query parameters:
case(required)probe(required, comma or repeated)
Response:
{ "columns": [...] }
GET /api/probe_svg
Purpose:
- render probe/profile plot as SVG
Query parameters:
case(required)probe(required, comma or repeated)axis(optional, defaulttime)columns(optional comma/space list)width(optional int, default900)height(optional int, default500)include_history(optional boolean)x_min(optional float)time_min(legacy alias ifx_minabsent)
Response content-type:
image/svg+xml
GET /api/case_file
Purpose:
- return a readable case file
Query parameters:
case(required)kind(required): a path relative to the case (doe_row.csv,DATA/setup.xml), or a name the solver resolves: code_saturnesetup.xmland run files such asrun_solver.log(from the latest run that has them), code_asterexport
Response content-type:
text/plain
GET /api/compare_runs
Purpose:
- compare a selected file across multiple cases against one base case
Query parameters:
case(required)base(optional, default first selected case)kind(optional, default: the solver's first compare kind,setup.xmlfor code_saturne,exportfor code_aster)filter(optional regex)
Response content-type:
text/plaindiff output
GET /api/settings/telemetry
Purpose:
- read whether anonymous usage telemetry is enabled
Response:
Code
POST endpoints
POST /api/settings/telemetry
Purpose:
- enable or disable anonymous usage telemetry
Payload:
Code
Response: the new setting, as for GET /api/settings/telemetry.
POST /api/case_file
Purpose:
- update an editable case file
Payload:
Code
Response:
Code
POST /api/case_note
Purpose:
- set/update a user note for a case
Payload:
Code
Response:
Code
POST /api/case_convergence
Purpose:
- set convergence label for a finished case
Payload:
Code
Allowed convergence values:
convergednot_converged- empty string (clear)
Constraint:
- case status must be
DONEorFAILED
Response:
Code
POST /api/cleanup_cases
Purpose:
- apply cleanup policies on selected case list
Payload example:
Code
Rules:
casesis requiredkeep_resuanddelete_resuare mutually exclusive; they name run folders as/api/resu_dirslists them- only the run folders the solver reports are deleted (code_saturne: each
RESU/<run>; code_aster:RESUitself, one run per case) RUNNINGandPENDINGcases are skipped- with
prune_resu, aDONEorFAILEDcase left without any run returns toPREPARED
Response:
Code
POST /api/kill_case
Purpose:
- kill one or multiple selected cases
Payload:
Code
Behavior:
- multi-case kill runs in parallel
- docker runs: the case's container is stopped (found from
.csauto.cid, else by its labels among this campaign's containers) - returns
500if any selected case fails to stop
Success response:
Code
POST /api/control_case
Purpose:
- send one of the solver's live control actions to one or more running cases,
an alternative to killing the process. code_saturne drops a
control_fileinto the activeRESU/<run>/directory, which it polls once per time step.
Payload:
Code
action: one of the solver'scontrol_actions(see/api/app_config); code_saturne:stop,extend,checkpoint,flushvalue: a number, required (and positive) when the action has avalue_label, refused otherwise; a whole number when itsvalue_kindisint. Only code_saturne'sextendtakes one (additional time steps).
Behavior:
400for a solver without live control, an unknown action, or a badvalue- multi-case control runs in parallel
- every selected case must currently be
RUNNING extendraises the case's actual configured iteration limit (as code_saturne reports it, not csauto's own--nt/OpenMP thread count) byvalue; repeated extends stack correctly- returns
500if any selected case fails (notRUNNING, no active run folder, etc.) - each action is logged to the case's
.csauto.history.jsonl
Success response:
Code
POST /api/open_gui
Purpose:
- launch the solver's GUI (code_saturne) for one case on server side
Payload:
Code
Notes:
400for a solver without a GUI- requires server
DISPLAY - runtime resolution errors are returned as
500
Success response:
Code
POST /api/run_case
Purpose:
- launch selected cases from web/API, with optional restart settings
Minimal payload:
Code
Restart payload:
Code
Rules:
cases,n,ntare requiredn,nt,max_parallelmust be integers> 0- without
max_parallel, local runs are capped tocpu_count // (n * nt)at once (a scheduler receives every selected case) (max_parallelincsauto.tomlonly applies tocsauto run) - a restart needs the
restartcapability (code_saturne only) restart_modemust be one of the solver'srestart_modes(see/api/app_config); code_saturne:iterations,physical_timerestart_valuemust be positive, and a whole number for anintmode; it needs arestart_mode- without
restart_mode, code_saturne restarts with the limits already in the case's setup restart_path(optional) picks the run to restart from: a run folder name (20260308-1413) or aRESU/<run>/checkpointpath. By default code_saturne restarts from the latest run that has a checkpoint.
A case the solver refuses to launch (a restart without checkpoint, say) keeps
its status, and the other selected cases still launch. The response is then
500 and names the refused cases:
Launch error: 1 case(s) not launched: case0003: No checkpoint found for case0003.
Success response:
Code
Error handling
Common status codes:
200: success400: missing/invalid parameters, or an action the solver does not support401: unauthorized (token)404: resource not found422: a parameter of the wrong type or out of range (for example"n": 1.5)500: internal/runtime/launch errors
Common error messages:
Missing case parameterMissing cases parameterMissing case, probe parametersMissing case, kind, content parametersn, nt, and max_parallel must be integers > 0Solver 'code_aster' does not support restartUnknown restart_mode 'iter' (expected: iterations, physical_time)iterations needs a whole number (Iterations)Invalid action (expected one of: stop, extend, checkpoint, flush)extend needs a positive value (Additional time steps)
cURL examples
Read status:
Code
Read status with token:
Code
See what the campaign's solver offers:
Code
Fetch residual SVG:
Code
Run a case from API:
Code