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:- 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 examplecrm.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 (defaultsuccess).ams360_ons: the notification service of AMS360, a supported system type. It recordsams360.notification_receivedevents (see Platform events). The rest of this page describes thenexioandgithubkinds.
- A label, so you and Nexio can recognize the source later.
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 anexio 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:- Serialize the envelope to bytes once.
- Compute the HMAC over the timestamp, a period, and exactly those bytes.
- Send exactly those bytes as the body. Do not let your HTTP client re-serialize the JSON.
401 stale_timestamp). Keep your clock synchronized.
200 OK:
Retries and idempotency
Nexio records each request it answers with200 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: falseand appends nothing. A request first refused with422is refused again with the same422. Retry freely after a timeout or a5xx. - 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, anddedupe_key, so a second append is dropped and the response carries the existingevent_id. Setdedupe_keywhen your system can send the same fact under different delivery IDs.
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
Agithub 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
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.