BETA. Subscriptions are per-stream. Creating and deleting them requires the
inventory-os:subscriptions:write scope; listing requires inventory-os:subscriptions:read.catalog and
inventory-level fanouts creates two subscriptions, one on each stream.
Endpoints
There is no update (
PATCH) or get-by-id endpoint, and no DLQ/replay endpoint. Rotation
= delete + recreate (a fresh hmacSecret is issued on every create).Create a subscription
The response includes an
hmacSecret (returned once — store it; you’ll need it for
signature verification). Treat it like a password.
settlement, 10 for
catalog). Exceeding the cap returns a 409 Conflict — delete an existing subscription first.
List subscriptions
status filter: ACTIVE, PAUSED, or EXPIRED. The hmacSecret is never
re-surfaced on reads.
Delete a subscription
Available events
Each stream emits exactly one event —<stream>.changed — when an underlying row mutates for
your merchant.
Subscribing to an event not in the target stream’s vocabulary returns a
400 Bad Request.
HMAC verification (Node.js)
The signing secret (hmacSecret) is 32 random bytes, hex-encoded — the same shape as the
affiliate webhook secret, so a shared HMAC verifier works across both surfaces. Verify the
signature on every delivery; never trust a payload without verification.
Capture the raw body before any JSON parsing — most Node.js frameworks parse before
the handler runs. In Express, register a
bodyParser.raw for the webhook path or set
verify: (req, _, buf) => { req.rawBody = buf.toString("utf8"); } on bodyParser.json.Reliability
Each subscription carries afailureCount and a status (ACTIVE / PAUSED / EXPIRED).
Repeated delivery failures increment failureCount; persistently failing subscriptions move out
of ACTIVE. Inspect a subscription’s state via the list endpoint.
Related
- Getting started — auth, scopes, rate limits
- InventoryOS overview — the eight streams
- Settlement stream — the highest-value webhook surface for lenders