Skip to content

Concepts

Webhooks

Events delivered to your endpoints, their signatures, retries and the event log.

On this page

Webhooks tell your system when something happens: a release is approved, goes live, gets its codes; a payout is paid. Register https endpoints in Workspace › API or with /webhooks.

Deliveries#

Each delivery is a POST with a JSON body:

Delivery
{
  "id": "…",
  "event": "release.live",
  "occurredAt": "2026-11-01T09:30:00.000Z",
  "organizationId": "…",
  "livemode": true,
  "data": { "releaseId": "…", "release": { "id": "…", "title": "Night Signals", "status": "LIVE" } }
}

Release events carry the release as GET /releases/{id} shows it. Answer with any 2xx within eight seconds; do slow work after answering.

A failed delivery is tried twice more, about a minute and then about fifteen minutes later; the endpoint's log in the API tab shows each try. GET /events keeps every event for 30 days, so a system that was down can catch up.

Signatures#

Check the X-Stillmore-Signature header before trusting a delivery. It reads t=<unix seconds>,v1=<hex>: an HMAC-SHA256, with the endpoint's secret, of the timestamp, a dot and the raw body (<t>.<raw body>). While a secret is rotated, two v1 signatures come; either one matching is enough.

import { verifyWebhook } from "./stillmore-api";

const rawBody = await request.text();
const ok = await verifyWebhook(rawBody, request.headers.get("x-stillmore-signature"), process.env.WEBHOOK_SECRET!);
if (!ok) return new Response("bad signature", { status: 400 });

Events#

EventWhen
release.submittedA release was submitted for review
release.changes_requestedReview asked for changes
release.rejectedA release was rejected in review
release.approvedA release was approved and is ready to go to the stores
release.sentA release was sent to the stores
release.codes_assignedA release's UPC or ISRCs were assigned or changed
release.store_links_updatedA release's store links were added or changed
release.liveA release went live in the stores
release.provider_rejectedThe delivery partner rejected a release
release.taken_downA release was taken down
takedown.requestedA takedown was requested for a live release
payout.requestedA payout was requested
payout.approvedA payout was approved
payout.rejectedA payout was rejected
payout.paidA payout was paid
payout.failedA payout could not be completed
statement.publishedA royalty statement was published
claim.createdA copyright claim was filed
claim.status_changedA copyright claim changed status