- An outcome is an event in the run’s life after delivery: viewed, accepted, overridden, or a final result. Outcomes are append-only and idempotent.
- An annotation is a person’s judgment of the run: a rating, a required comment, and an optional pointer at the part of the output it is about.
Outcomes
POST /api/v1/engines/{engine_slug}/runs/{run_id}/outcomes
Event types
Timestamps are RFC 3339 with an offset of at most 23 hours. Nexio stores identifiers as sent and does not check them against the run. The identifier fields (
accepted_carrier_id, chosen_carrier_id, carrier_id, broker_id), the placement_outcome type with its status values, and the reason_code list are a fixed set; the full field list is in the endpoint reference.
reason_code on overridden must come from the override reason taxonomy, version 2026-08-31-unified. Send that version in reason_taxonomy_version, or leave it out (or send an empty string) and Nexio stamps it. Any other version is refused. reason_text is at most 1,000 characters, counted as Unicode characters, not bytes. It is required, and cannot be only whitespace, when reason_code is other.
Record an outcome
201 on the first write, and 200 with the same body on an identical retry:
Idempotency
- An
event_idis unique within your organization and the key’s environment bucket: live keys share one bucket, and test keys, including every named sandbox, share the other. The same ID can be used once in live and once in test. Two sandboxes do not get separate namespaces: an ID already used from one sandbox never records a second outcome from another. - Sending the same
event_idagain with the same run, engine, event type and payload returns200and records nothing new. Payloads are compared as JSON, so key order and whitespace do not matter. - Sending it with anything different returns
409 event_id_reused. - A retry is recognized even after the run itself has been removed by retention, so a late retry never turns into a
404. - The run must belong to your organization, your key’s environment, and the engine in the path. Otherwise
404 run_not_found.
Outcome errors
Annotations
POST /api/v1/engines/{engine_slug}/runs/{run_id}/annotations
Annotations sent over the API are stamped
source: "api", so they are distinguishable from annotations made in the portal’s run review. Annotations are not idempotent: each call creates a new annotation. Unknown body fields are ignored. The run is found by its ID in your organization and environment; unlike outcomes, the engine slug in the path is not checked against the run.
201:
submitter_user_id appears only on annotations made by a signed-in portal user.
Annotation errors
How the signal is used
Outcomes and annotations are inputs to the engine’s evaluation work, which Nexio operates in the portal:- The Judge view compares automated quality verdicts with human annotations, to show how far the automated judge can be trusted.
- For engines of the
comparison,entity_analysisandopportunitytypes, the improvement pass on the Proposals view reads recent annotations, outcome counts, judge verdicts and evaluation results, and drafts a configuration change as a proposal. A person approves or rejects it. Approval releases a new version behind the evaluation gate: a minor version by default, or a major version on anexact_requiredengine when the change breaks its request or response schema.
Credentials
Both routes accept the organization key, or a scoped key withruns:write bound to the run’s engine. See Authentication and access.
Evaluation
Evaluation sets, the judge, and improvement proposals.
Submit run outcome
Endpoint reference.