Skip to main content
An endpoint receives one of four events. The webhook event types are a fixed set, defined in code, and every one is about a run. Each has the same envelope: id, type, webhook_version, created_at, and data.run. This page shows when each event fires and a full full-mode body for each. Registration, headers, signatures, and retries are on Webhooks. The schema is WebhookEvent in the OpenAPI document. Rules that hold for every event:
  • data.run is built from the stored run with the same status fields GET /api/v1/runs/{run_id} returns, but it is not the same response. It never carries output_phase, completed_deterministic_at, warnings, work_items, input, computed_at_head, served_head or stale; those come only from GET. output is the stored output: it is not trimmed to the operator summary as GET trims a matching run’s output, and no seat’s field policy is applied to it. Read the run with GET when you need what a person would see. Its fields are defined on Runs.
  • output and solutions appear only on completed and degraded runs. solutions appears only for engines that produce ranked solutions. output has the shape of the engine’s own output contract.
  • The event id is a UUID derived from the event type and the run ID, so a retried or resent delivery carries the same id. In one delivery setup, a run.superseded id is derived from the correction instead; see run.superseded.
  • In thin mode, data.run carries only run_id, status, environment, attempt, created_at, completed_at, and error. See Payload modes.
The examples use the contract fixture engine that Nexio publishes for testing (an entity_analysis engine). The run.completed, run.failed and run.superseded examples are sandbox runs with a forced test_scenario (see Sandbox fixtures), so environment is test. Your engine’s output has its own shape, and stage is a progress hint whose values differ by engine.

run.completed

Fires once, when the run reaches completed or degraded. There is no separate degraded event. A degraded run finished and returned an output that is incomplete or of reduced quality. What makes a run degraded depends on the engine type; see Runs. For example, an entity_analysis run whose enrichment source (such as FEMA flood data) timed out stays completed, with the gap recorded in the output’s diagnostics. Check data.run.status and the output’s diagnostics before you treat a result as clean.
The same event for a degraded run differs in status and in the output the engine returned. This example is the fixture engine’s forced degraded result ("test_scenario": "degraded"). Its output carries only an enrichment timeout, which in a live entity_analysis run would leave the run completed.
Webhook deliveries never carry a warnings array. If the engine’s saved configuration turns on expose_warnings (off by default), read the run with GET /api/v1/runs/{run_id} to get it. The setting is read on each request (see Configuration).

run.failed

Fires once, when the run reaches failed. There is no output. error is a readable message and error_details is structured detail. attempt is the attempt on which the run failed; a value above 1 means Nexio retried the run before it gave up. The example is the fixture engine’s forced failed result ("test_scenario": "failed"); a live failure carries the engine’s own error and error_details.

run.cancelled

Fires once, when the run reaches cancelled. A run is cancelled when someone asks for it with POST /api/v1/runs/{run_id}/cancel. A queued run is cancelled at once; a running run stops at its next safe point. There is no output. See Runs for cancellation.

run.superseded

Fires when Nexio attaches a corrected result to a run. Nexio keeps the original result. Corrections are made by Nexio; there is no public route to create one. See Defensibility. Two conditions must both hold:
  1. The engine’s configuration sets notify_on_supersede: true. It is false by default. Which configuration Nexio reads depends on your organization’s delivery setup (see the table below and Configuration).
  2. The endpoint lists run.superseded in events.
Nexio sets your organization’s delivery setup. A new organization starts in the per-run setup. Ask Nexio which one yours uses. In both setups GET /api/v1/runs/{run_id} keeps returning the original output, and a thin endpoint receives no output. In the per-correction setup the corrected output reaches you only in a full run.superseded delivery. In the per-run setup the delivery tells you that a correction exists but does not carry it. The example is a full body in the per-correction setup, correcting the run.completed example above.
Because deliveries are unordered, a run.superseded delivery can reach you before the run.completed for the same run. Key your stored result on run_id. In the per-correction setup, let the corrected output win over the original, whatever order they arrive in.

Events that do not exist

  • There is no run.degraded event. Degraded runs arrive as run.completed.
  • There are no events for runs that are queued or processing. Poll the run for progress.
  • Platform event types such as dataset.refreshed are not webhook events and cannot be listed in an endpoint’s events. Nexio can deliver them to your endpoint through an automation; see Platform event deliveries.

Webhooks

Register, verify, retry, resend.

Runs

Every field of the run object.
Last modified on September 25, 2026