Skip to main content
Webhooks let your application react to events on the UMW platform the moment they happen, without polling the API. When a release is delivered to stores, a statement is generated, or a payout is processed, UMW sends an HTTP POST request containing a structured event payload to an endpoint you register. This guide walks you through registering an endpoint, verifying authenticity, handling the event envelope, and building resilient event consumers.

Setting Up Webhooks

1

Register a Webhook Endpoint

Register the URL where UMW should send events. You can subscribe to specific event types to limit noise to only the signals relevant to your integration.
Response:
The secret field is returned only once at registration time. Store it securely in your secrets manager immediately — you will use it to verify the signature of every incoming event. If you lose the secret, you must rotate it via POST /v1/webhooks/{webhook_id}/rotate-secret.
2

Verify Your Endpoint

After you register, UMW sends a one-time ping event to your endpoint to confirm it is reachable. Your server must respond with an HTTP 200 status code within 10 seconds.Ping event payload:
If your endpoint does not respond with 200 within the timeout window, the webhook will be created in an unverified state and no live events will be delivered until verification succeeds. You can trigger a new ping at any time:
3

Handle Incoming Events

All UMW events share a consistent envelope structure. Parse the outer fields first to identify the event type, then route the data object to your domain-specific handler.Event envelope:Example — release.status.changed event:
Your handler should return an HTTP 200 response as quickly as possible — ideally before performing any heavy business logic. Enqueue events for asynchronous processing to avoid timeouts that would cause UMW to retry delivery unnecessarily.
4

Verify the Signature

Every event UMW delivers includes an X-UMW-Signature header. Validate this signature before processing the event to confirm it originated from UMW and was not tampered with in transit.The signature is computed as an HMAC-SHA256 digest of the raw request body, using your webhook secret as the key. The header value is prefixed with sha256=.
Always use a constant-time comparison function (hmac.compare_digest in Python, crypto.timingSafeEqual in Node.js) when comparing signatures. Standard string equality is vulnerable to timing attacks.

Retry Logic

If your endpoint returns a non-2xx status code, or does not respond within the 30-second timeout window, UMW will automatically retry delivery with exponential backoff. After 5 failed retries, the event is marked as undeliverable and no further attempts are made. You can view all undelivered events and trigger manual redelivery from the UMW developer dashboard or via the API:
UMW retains event history for 30 days. If your endpoint experiences a prolonged outage, use the relevant REST endpoints (e.g., GET /v1/deliveries, GET /v1/royalties) to backfill any state you may have missed from failed webhook deliveries.

Deduplication

UMW guarantees at-least-once delivery — under certain network or infrastructure conditions, your endpoint may receive the same event more than once. Design your event handlers to be idempotent by tracking the id field of each processed event.
A Redis SET NX operation, a unique constraint on a database events table, or any idempotency key store with a TTL of at least 30 days is sufficient for deduplication.

Supported Events