Skip to main content
Every engine has one draft configuration: a JSON document whose shape depends on the engine type. You edit the draft as often as you like. A run submitted through the API executes a released version, which is an immutable copy of the draft taken when you publish, unless the run pins draft from a sandbox key. This split lets you change an engine without changing what production callers get until you decide to. Three settings are the exception; see Settings read from the saved configuration. Publishing is covered on Versions and releases.

How it works

  1. Read the draft and the type’s default with GET /api/v1/engines/{engine_slug}/config.
  2. Check a candidate with POST /api/v1/engines/{engine_slug}/config/validate. Nothing is saved.
  3. Save it with PUT /api/v1/engines/{engine_slug}/config. The whole draft is replaced, and the saved configuration is archived under its hash.
  4. Publish a version when you want traffic to use it.
Every saved configuration gets a 16-character hash. A run is stamped with the hash of the configuration it executes (engine_config_version_hash), and the worker loads that archived configuration, so a later save or publish does not change a run that already exists.

Draft and released configuration

A save does not change what an API run executes unless the run pins draft: a run that omits engine_version uses the latest released version. See Versions and releases.

Settings read from the saved configuration

Execution settings are versioned: a save changes only the draft, and a run executes the configuration of the version it resolved. Three settings are policies about what your systems receive or how fast they may call, and Nexio reads them from the engine’s current saved configuration instead of from the version:

Read the configuration

Validate before you save

POST /config/validate runs the same configuration checks as a save and saves nothing. A well-formed request with a config object returns 200 whether the config is valid or not; read valid. Malformed JSON, a body over 256 KiB or an absent config answers 400 invalid_request, and an unknown slug answers 404 engine_not_found. The example below is the entity_analysis preset adapted for a supplier review, with one mistake: the dimension key security appears twice.
The response names the repeated key:
Each issue has a path, a message, and, for policy issues, a code (for example provider_not_approved, egress_manifest_version_required, egress_manifest_version_mismatch). Fix the value at path and validate again. A valid configuration returns {"valid": true, "errors": []}.

Save the draft

PUT /api/v1/engines/{engine_slug}/config with {"config": {...}} replaces the draft. The body must be the complete configuration; there is no partial update. A full example is in Declared-contract engines.

Keys shared across types

These keys appear on more than one engine type. The Types column lists where each is accepted; a type that does not list a key refuses it when you save. Each type adds its own keys; the preset shows them.

Request bounds

Every run submission is measured against request bounds before a run is created. The measurement covers the submission serialized as {"input": ..., "offerings": ...} with object keys sorted. A configuration can set request_bounds on comparison, entity_analysis and diligence engines. Two engines Nexio operates have larger bounds of their own. A configuration’s request_bounds replaces the type’s profile field by field, up to the ceiling. 0 keeps the profile value. The bounds that apply are the ones in the configuration of the version the run resolves to. details.path locates the value, starting at $ for the whole submission. A violation returns request_bound_exceeded with status 413 for max_canonical_bytes and the HTTP body, and 400 for the other bounds. No run is created.

The contract page

Each comparison, entity_analysis, matching and triage engine has a Contract page in the portal (Engines, then your engine, then Contract). It renders the request and response contract for the draft configuration, with three example requests (minimal, realistic and full). Two actions build integrations from it:
  • Copy for agents copies integration instructions as one Markdown document, ready to paste into a coding agent’s context.
  • OpenAPI, then Download openapi.json, saves <slug>-openapi.json, an OpenAPI 3.1 file for this engine’s POST /api/v1/engines/{engine_slug}/runs and GET /api/v1/runs/{run_id}.
The Contract page shows the draft. Unpinned runs execute the latest released version. If you have saved changes you have not published, the page describes the next version, not the one serving traffic.

Credentials

Reading configuration accepts the organization key or a scoped key with engines:read bound to the engine. Validate and save accept only the organization key; a scoped key gets 403 insufficient_capability. See Authentication and access.

Versions and releases

Publish the draft and pin versions.

Declared-contract engines

Declare an engine’s input fields and output envelope.

Update engine config

Endpoint reference.

Validate engine config

Endpoint reference.
Last modified on September 25, 2026