Skip to main content
Inbound events let a system you run tell Nexio that something happened: a record changed in your CRM, a deploy finished, a batch job completed. Each accepted request appends one platform event to your organization’s log, where an automation can react to it. The route is POST /api/v1/events/ingest/{source_key}, and it is public API. The route takes no API key. A request from a nexio or github ingest source is authenticated by an HMAC-SHA256 signature that covers the raw body, made with that source’s signing secret. An ingest source is a registered sender for one organization. Its source_key in the URL alone decides which organization the event belongs to. The one exception is an ams360_ons source, which Nexio registers on request: AMS360 cannot sign a body, so that source authenticates by the authentication code AMS360 sends with each notification, and a missing or wrong code answers 401 invalid_credentials.

Get an ingest source

Nexio registers ingest sources for you; there is no self-serve API or portal page. Tell Nexio:
  1. The kind of sender. Source kinds are a fixed set of three, defined in code:
    • nexio: your own code posts events in the Nexio envelope described below. Give Nexio the list of event types the source may send, for example crm.account_updated. The types are your own vocabulary: any name is accepted except a reserved type.
    • github: a GitHub repository webhook that reports deployments. Give Nexio the repository (owner/name), the deployment environments to accept, and optionally the deployment statuses to accept (default success).
    • ams360_ons: the notification service of AMS360, a supported system type. It records ams360.notification_received events (see Platform events). The rest of this page describes the nexio and github kinds.
  2. A label, so you and Nexio can recognize the source later.
Nexio gives you back, once: A source accepts no events until Nexio enables it. A request with a valid signature to a disabled source gets 403 ingest_source_disabled.

Send an event

Envelope

The request body for a nexio source is a JSON object: Nexio sets org_id from the source, produced_by to ingest, and transition_cause to world_change. A sender cannot set them. Unknown top-level fields are ignored.

Headers

Signature

This is the same scheme Nexio uses to sign outbound webhooks, applied in the other direction:
  1. Serialize the envelope to bytes once.
  2. Compute the HMAC over the timestamp, a period, and exactly those bytes.
  3. Send exactly those bytes as the body. Do not let your HTTP client re-serialize the JSON.
Nexio refuses a timestamp more than 300 seconds from its clock (401 stale_timestamp). Keep your clock synchronized.
Response 200 OK:

Retries and idempotency

Nexio records each request it answers with 200 or 422 against its source and delivery ID (X-Nexio-Delivery, or X-GitHub-Delivery for a GitHub source), together with a SHA-256 of the body and the outcome.
  • Same delivery ID, same bytes: Nexio returns the first answer again with inserted: false and appends nothing. A request first refused with 422 is refused again with the same 422. Retry freely after a timeout or a 5xx.
  • Same delivery ID, different bytes: 409 delivery_id_reused. Use a new delivery ID for new content.
  • Different delivery ID, same event identity: the log keeps one event per type, subject, and dedupe_key, so a second append is dropped and the response carries the existing event_id. Set dedupe_key when your system can send the same fact under different delivery IDs.
Requests refused with any other status are not recorded, so they do not use up a delivery ID. To retry, resend the same body with the same X-Nexio-Delivery. Compute a new timestamp and signature for each attempt; the body bytes must stay identical.

Status codes

Requests are checked in this order: rate limit, body, source key, signature, source enabled, content. The first failure answers.

Rate limits

Both limits use a sliding one-minute window. A refused request gets 429 rate_limited with Retry-After.

GitHub deployments

A github source accepts GitHub’s own webhook format, so you point a repository webhook straight at Nexio. In the repository’s settings on GitHub, add a webhook with:
  • Payload URL: https://api.usenexio.com/api/v1/events/ingest/<source_key>
  • Content type: application/json
  • Secret: the evsec_... signing secret
  • Events: Deployment statuses
GitHub signs each request with X-Hub-Signature-256: sha256=<hex> over the raw body and sends X-GitHub-Delivery and X-GitHub-Event. All three are required. GitHub requests carry no timestamp, so Nexio does not check their age. What Nexio does with each request: The event’s subject is repository/<owner>/<name> and its dedupe key is deployment/<environment>/<commit_sha>, so one commit deployed to one environment is one event, whatever number of statuses GitHub sends. The event body is described under Event types.

Secret rotation

Ask Nexio to rotate a source’s secret. Nexio returns the new secret once, and the previous secret keeps working for 24 hours. Switch your sender to the new secret inside that window. After 24 hours only the new secret verifies.

Limits

Send an inbound event

The endpoint reference.

Automations

What Nexio can do when your event arrives.
Last modified on September 25, 2026