Score a scenario render with a driving model
Open-loop episode evaluation of one scenario by an offered driving model: the scenario’s authored drive stays in control while the model’s cameras render live and every plan is scored against the drive that followed it. modelVersionId names an available model of GET /api/v1/evaluation-options and is required (400 validation_failed, param modelVersionId, detail.code model_required). API versions before 2026-10-24 accept a request without it and run the default model, with a model_defaulted note and a SimForge-Warning header. The episode costs 300 cents per scenario (estimate basis per_scenario; maxCostCents at least 300), charged only when it succeeds with a verified, scored result.
Authorizations
A sfc_at_… access token from simforge login, or an sfk_… API key. An operation's security lists the scopes the credential must hold.
Headers
1 - 200Body
The scenario to evaluate. Its latest revision is used unless revisionId names one explicitly.
1 - 128^[A-Za-z0-9_.:-]+$The model to evaluate: an offered model's id from GET /api/v1/evaluation-options, or a registered model version in this workspace. Required from API version 2026-10-24; older versions run the default model without it and say so.
1 - 128^[A-Za-z0-9_.:-]+$x >= 0Open-loop evaluations run as a non-reactive episode: the scenario's authored drive stays in control while the model's cameras are rendered live and each plan is scored against the drive that followed it.
episode The scenario revision to evaluate, including its pinned map; absent: the latest revision.
1 - 128^[A-Za-z0-9_.:-]+$The texture tier for the live episode cameras; absent: the model family's open-loop tier.
uastc-full, bc7-512 Seconds between scored prediction instants. Episode evaluations run at 0.5 s (2 Hz).
The model's parameters by name (GET /api/v1/evaluation-options lists each model's params with their type, bounds, default and loops); absent ones take their defaults. A name the model does not take in this loop, or a value it does not take, is refused naming params..
Alias of params.seed (sent both ways, the two must agree). Absent: the model's default seed.
x >= 0Alias of params.numTrajSamples (sent both ways, the two must agree): trajectory samples per instant. Absent: the model's default, or the one count a model returns (its param's fixed value).
1 <= x <= 64Response
Quote or idempotent replay.
true Legacy: alpamayo.openloop for the default model or a workspace alias of it, policy.openloop for every other model (before API version 2026-10-24: the lane it ran on, the default model's family lane or policy.openloop). Name the model by model.modelVersionId.
The scenario it would evaluate.
Why the same request without dryRun would be refused now, with that submission's code and detail (cloud_not_open with detail.code model_unavailable while no worker serves the model). Null when allowed.
Warnings attached to the evaluation while it runs, including model_defaulted before API version 2026-10-24 when the request names no model. Empty when nothing.
x >= 0The model version it would run (before API version 2026-10-24, the default model when the request names none); model.modelVersionId.
model.name.
The model's parameters it runs with, by name, defaults filled in (what params sent, else each one's default).
True when a parameter whose comparability is custom (a sampling setting, a navigation instruction) was off its default: compare it only with runs of the same params.