major.minor (for example 1.0, 1.3, 2.0). Each version points at one archived configuration and at the request and response schemas derived from it. Runs choose a version at submission and keep it for their whole life. Versions let you change an engine while production callers keep a fixed contract until they choose to move.
How it works
- You save changes to the draft configuration. Runs that do not pin
draftexecute as before. Three settings,expose_warnings,notify_on_supersedeandquotas.requests_per_minute, are read from the saved configuration. See Configuration. - You publish. Nexio validates the configuration, runs the evaluation gate, derives the request and response schemas, decides the version number, and records the release.
- Each run submitted through the API resolves its
engine_versionpin at submission and is stamped with the resolved version and configuration hash. - The worker executes the stamped configuration. A later publish does not move a run that already exists.
500 engine_version_none_released. From a sandbox key you can run the draft with engine_version: "draft" before you publish.
Pins
Sendengine_version in the run request body.
Anything else, including a bare major (
1) or a three-part version (1.0.0), is refused with 400 engine_version_invalid_format.
Pin policies
Each engine has one pin policy.What is stamped on a run
GET /api/v1/runs/{run_id} and webhook payloads return engine_version (the resolved N.M, or draft) and engine_config_version_hash (the 16-character hash of the configuration the run executed). Store both with your own record of the result.
What a version freezes
A version freezes the configuration bytes and the request and response schemas. It does not freeze model output, external data, provider behavior or latency. Two runs on the same version with the same input can differ where a model or an external source is involved.Publish a version
POST /api/v1/engines/{engine_slug}/versions releases the current draft. The body is optional.
200:
already_released: true and creates nothing.
Publishing from the portal (the version control in the top bar on an engine’s pages) is done by Nexio today. It shows a preview of the version number and the breaking-change reasons before Nexio confirms. Your integration publishes through POST /api/v1/engines/{engine_slug}/versions, and both paths pass the same evaluation gate.
Version numbers
The first release is1.0. After that, Nexio compares the new schemas with the latest release and bumps the major or the minor.
On engines with the default pin policy, a change is major when:
- an output field is removed, or its type changes;
- a new input field is required;
- an input field’s type changes;
- an optional input field becomes required.
exact_required engines, any change to the request schema or the response schema is major, with reasons request_schema_changed and response_schema_changed. A configuration change that leaves both schemas identical is minor.
is_breaking_from_previous_major is true only on an N.0 release that follows an earlier major. reasons lists what made a major bump.
The evaluation gate
Publishing runs the evaluation gate against the candidate configuration:- An engine with no evaluation set publishes without a gate.
- Every release needs a pass on each evaluation set that declares a tolerance, that is, a limit on how many labeled cases may disagree with their labels.
- The first release of an engine that has evaluation sets, none of which declares a tolerance, needs a completed evaluation of the candidate with no case errors.
- Later releases are not blocked by sets without a tolerance.
gate_verified is true only on an engine’s first release, and only when the passing evaluation compared the candidate against labeled cases. Later releases read false, even when they passed the gate. cold_start_eval_set_id names that set. Nexio manages evaluation sets; see Evaluation.
List and read versions
200, newest first:
GET /api/v1/engines/{engine_slug}/versions/{version} returns one entry in the same shape. The route returns schema hashes, not schema bodies. For the generic fixture engine, the schema bodies are published in the supported contract versions registry; for your own engines, read the schema on the Contract page or in the downloaded OpenAPI file.
Upgrade a pinned integration
1
Record the baseline
Store the exact version your live requests pin and its two schema hashes.
2
Review the target
Read the target version with
GET /api/v1/engines/{engine_slug}/versions/{version}: its changelog, is_breaking_from_previous_major and schema hashes. Compare the hashes with your baseline. Equal hashes mean the contract did not change. The bump and reasons fields appear only in the publish response, not in later reads, so keep that response if you need them.3
Test in a sandbox
Submit representative requests pinned to the target
N.M from a sandbox key. Check parsing, polling and webhook handling against the results.4
Change the pin
Deploy your integration with the new exact pin. On
exact_required engines, never send N.x.5
Keep the evidence
Store the resolved
engine_version and engine_config_version_hash from each run with your records.Errors
Resolving a pin at run submission:
Publishing:
Reading versions:
400 engine_version_invalid_format for a malformed {version}, 404 engine_version_not_found, 404 engine_not_found, 403 engine_archived for an archived engine.
Credentials
Listing and reading versions accept the organization key or a scoped key withengines:read bound to the engine. Publishing accepts only the organization key. See Authentication and access.
Runs
How a pinned run executes and reports.
Evaluation
Evaluation sets and the release gate.
Publish engine version
Endpoint reference.
Supported contract versions
The fixture registry and API versioning.