Your solver won't tell you the run is wrong.
SimAPI will.
SimAPI checks simulation output and setup against physical law — catching diverged runs, unit-conversion slips, sensor drift, and impossible values before the data reaches a design review, an autonomy stack, or an ML pipeline.
Install once. Validate every run.
Use the hosted API from a terminal, CI job, or Node workflow. The npm package installs as simapi-cli and exposes the simapi command.
$ curl -fsSL https://sim-api.vercel.app/install.sh | shsimapi--fail-on warning--json
$ simapi validate simulations.json Validation report simulations.json ────────────────────────────────────────────── Status PASSED Validation score 98 Execution time 23ms
The honest numbers
n=9,333 training trials, 30.2% corrupted across 6 failure modes. Three-way comparison: no filtering vs naive IQR/z-score vs SimAPI APIE. Mean ± std across 5 seeds.
30%
of trials corrupted
6 categories including the hardest: measurement noise and sensor drift
93.3%
of corruptions caught
precision 99.8% — near-zero false positives
99.8%
exclusion precision
when flagged, it is genuinely corrupted
| Model | Corrupted | Naive (IQR+Z) | SimAPI APIE | Clean ceiling |
|---|---|---|---|---|
| Neural net (MLP) distribution-sensitive | 3.94% MAPE | 1.13% MAPE | 1.06% MAPE | 0.68% MAPE |
| Gradient boosting robust to outliers | 0.42% MAPE | 0.44% MAPE | 0.42% MAPE | 0.39% MAPE |
Why MLP improves 73%
APIE removes 100% of sensor drift rows — the velocity creep shifts the entire feature distribution. Neural networks are maximally sensitive to this: an MLP trained on drifted velocity learns the wrong v→Cd relationship for 15% of the dataset. Removing these rows lets the model learn the true distribution. MLP goes 3.94% → 1.06%, beating naive filtering by 4.0%.
What naive filtering can’t see
A naive IQR filter removes rows that are statistical outliers column-by-column. Cross-variable corruptions (Re inflated 1.7–2.2× while v is unchanged) produce values inside each column’s individual bounds — IQR catches zero of them. APIE catches 100% by checking Re/v as a physical invariant. Similarly, Pa→kPa unit errors produce plausible individual pressure values — only P/(ρT)≈0.287 instead of 287 reveals the error.
Reproduce: python -m benchmark.run_benchmark — 5 seeds · n≈9,333 train · 63.7s runtime · numbers vary ±1.8% (GBT) / ±3.8% (MLP) across seeds
Put a quality gate in front of every simulation run.
Generate a key, validate a sample run in the browser, then move the same checks into your CLI, SDK, or CI pipeline.