curl --request POST \
--url https://api.usenexio.com/api/v1/engines \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"slug": "vendor-review",
"label": "Vendor review",
"description": "Checks a supplier profile against vendor requirements.",
"engine_type": "entity_analysis"
}
'import requests
url = "https://api.usenexio.com/api/v1/engines"
payload = {
"slug": "vendor-review",
"label": "Vendor review",
"description": "Checks a supplier profile against vendor requirements.",
"engine_type": "entity_analysis"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
slug: 'vendor-review',
label: 'Vendor review',
description: 'Checks a supplier profile against vendor requirements.',
engine_type: 'entity_analysis'
})
};
fetch('https://api.usenexio.com/api/v1/engines', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"id": "550e8400-e29b-41d4-a716-446655440000",
"slug": "vendor-review",
"label": "Vendor review",
"description": "Checks a supplier profile against vendor requirements.",
"engine_type": "entity_analysis",
"status": "active",
"group_key": "",
"created_at": "2026-04-01T10:00:00Z",
"updated_at": "2026-04-01T10:00:00Z"
}Create engine
Create an engine of a registered engine type, with that type’s default configuration. Organization API key only.
curl --request POST \
--url https://api.usenexio.com/api/v1/engines \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"slug": "vendor-review",
"label": "Vendor review",
"description": "Checks a supplier profile against vendor requirements.",
"engine_type": "entity_analysis"
}
'import requests
url = "https://api.usenexio.com/api/v1/engines"
payload = {
"slug": "vendor-review",
"label": "Vendor review",
"description": "Checks a supplier profile against vendor requirements.",
"engine_type": "entity_analysis"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
slug: 'vendor-review',
label: 'Vendor review',
description: 'Checks a supplier profile against vendor requirements.',
engine_type: 'entity_analysis'
})
};
fetch('https://api.usenexio.com/api/v1/engines', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"id": "550e8400-e29b-41d4-a716-446655440000",
"slug": "vendor-review",
"label": "Vendor review",
"description": "Checks a supplier profile against vendor requirements.",
"engine_type": "entity_analysis",
"status": "active",
"group_key": "",
"created_at": "2026-04-01T10:00:00Z",
"updated_at": "2026-04-01T10:00:00Z"
}Authorizations
Send the key as Authorization: Bearer <key>. Two kinds of key exist.
Organization keys are issued in the portal (Settings, then API keys),
each bound to one environment, shaped nx_<environment slug>_<64 hex>. They carry
no capabilities and pass every capability check, with one exception:
routes under /records, /actions, /operations,
/api/v1/engines/{id}/opportunities, /api/v1/graph and
/api/v1/catalog/documents accept an
organization key only when its environment is live, and refuse any
other with 403 scoped_key_required. Revocation takes effect within 60
seconds.
Scoped keys are issued by Nexio on request, shaped
nxsk_v1_<24 hex key id>_<43 character secret>. Each is bound to one
org, one environment, a set of engines and a set of capabilities. A
malformed, unknown or revoked nxsk_ key fails with 401 and is never
retried as an organization key. Revocation takes effect on the next
request. A scoped key without a route's capability gets 403
insufficient_capability; a scoped key not bound to the engine gets 403
engine_binding_forbidden.
Key-grantable capabilities: engines:read, runs:write, runs:read,
runs:defensibility:read, runs:test, catalog:read,
catalog:documents:read, webhooks:manage, conversations:use,
conversations:export, records:read, records:opportunities:run,
actions:write, actions:read, graph:read, records:analyze.
Routes that accept organization keys only (every scoped key gets 403
insufficient_capability): environment management, engine create,
update, configuration and publish, and conversation instance
authoring. Each operation description names the capability a scoped
key needs.
Body
URL-safe identifier. 3 to 50 lowercase alphanumeric characters and hyphens. Must start and end with an alphanumeric character.
3 - 50^[a-z0-9][a-z0-9-]*[a-z0-9]$Human-readable engine name, 1 to 100 UTF-8 bytes.
1Engine type. Fixed at creation. This is the creatable set; see
Engines overview for what each type
does. Any other value is rejected with invalid_engine_type. The
response enums are wider because retired types remain readable on
existing rows.
comparison, matching, entity_analysis, diligence, triage, opportunity Optional engine description, at most 500 UTF-8 bytes.
Response
Engine created with default configuration.
Engine metadata returned by management endpoints.
Engine identifier.
URL-safe engine slug, unique within the organization.
Human-readable engine name.
Optional engine description.
Engine type, one entry of the registry Nexio ships (see
Engine types). comparison ranks
alternatives supplied in the request. matching discovers, qualifies
and ranks candidates from connected data. entity_analysis assesses
one subject against requirements; with a declared output contract it
is a declared-contract engine (see
Declared-contract engines).
diligence verifies a claimed event against live web sources.
triage classifies and ranks a whole population in one request.
opportunity runs over a connected system of record on the cadence
its configuration sets rather than per request.
converse and property_risk are retired: they cannot be created,
and a run against an engine that still carries one returns
invalid_engine_type. They remain in this response enum because
older engine rows are still readable.
comparison, matching, entity_analysis, diligence, triage, opportunity, converse, property_risk Engine status. An archived engine answers 403 engine_archived on run submission, configuration saves, publishing and the version reads.
active, archived Key of the engine's semantic group within the organization, or an empty string when ungrouped. Groups label what an engine serves and carry handling guidance in their description; they never gate any operation.
RFC 3339 creation timestamp.
RFC 3339 last-update timestamp.