Skip to main content
BETA. Subscriptions are per-stream. Creating and deleting them requires the inventory-os:subscriptions:write scope; listing requires inventory-os:subscriptions:read.
InventoryOS streams are best consumed via webhooks. Register a callback URL on a specific stream; when the stream’s rows change for your merchant, we deliver an HMAC-SHA256-signed JSON POST to that URL. Subscriptions are explicitly per-stream — a partner that wants both 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

Request body: The response includes an hmacSecret (returned once — store it; you’ll need it for signature verification). Treat it like a password.
Each create counts against the per-stream subscription cap (e.g. 3 for settlement, 10 for catalog). Exceeding the cap returns a 409 Conflict — delete an existing subscription first.

List subscriptions

Optional 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 a failureCount 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.