Mux · event: video.asset.ready ·
content type: application/json
This is a representative sample — fake IDs, real structure. To see a payload with your data, point the provider at a capture URL (button below).
One click creates a free capture bin with this exact payload already in it — pretty-printed, headers inspectable, replayable to your own endpoint:
Then paste the bin's URL into Mux's webhook settings to capture a real delivery. No signup.
content-type: application/json user-agent: Mux Webhooks mux-signature: t=1788518532,v1=6527e21900964221b9bedaadc871fe7f2e306afd6903d6d1f4a36d683b106f30
{
"type": "video.asset.ready",
"object": {
"type": "asset",
"id": "l02fMrbCu0002269XRD7LpcHhrm01p02fGKPE7"
},
"id": "9d5a78f0-85c1-11f1-b6a4-2e7d9c3f5b18",
"environment": {
"name": "Production",
"id": "qp3vk7"
},
"data": {
"tracks": [
{
"type": "video",
"max_width": 1920,
"max_height": 1080,
"max_frame_rate": 29.97,
"id": "l02fMrbCu0002269XRD7LpcHhrm01p02fGKPE7",
"duration": 23.857167
},
{
"type": "audio",
"max_channels": 2,
"max_channel_layout": "stereo",
"id": "Qju5vBizvFzB9502bYNqOVzNWRrVo5Sn",
"duration": 23.823
}
],
"status": "ready",
"playback_ids": [
{
"id": "vNWRrVo5SnQju5vBizv02bYNqOFzB95Qz",
"policy": "public"
}
],
"max_stored_resolution": "HD",
"max_stored_frame_rate": 29.97,
"id": "l02fMrbCu0002269XRD7LpcHhrm01p02fGKPE7",
"duration": 23.857167,
"created_at": "2026-08-30T10:41:07.000Z",
"aspect_ratio": "16:9"
},
"created_at": "2026-08-30T10:42:12.000Z",
"accessor_source": null,
"accessor": null,
"request_id": null
}
Mux-Signature header and the secret
hookden-mux-sample-signing-secret into the
signature debugger (Mux scheme), or set the
Mux scheme on a capture bin for live ✓/✗ badges. It's
t=<unix>,v1=<hex> — hex HMAC-SHA256 over
timestamp.rawBody, i.e. Stripe's exact wire format under a
different header; Stripe verification code works if you swap the header
name. v1 is the only valid scheme today. Mux SDKs default to a
5-minute timestamp tolerance (verified vs mux.com docs, 2026-08-30).signing_secret once, in the
create response only — you cannot retrieve it again (same trap as
Frame.io). Verifying with the secret of your other environment's endpoint
is a classic silent failure.type yourself. The
environment object in the payload tells you which one fired.id (a UUID), not on receipt. Mux also rate limits
GET /assets precisely so you don't poll instead of listening.data mirrors the Asset object: status: "ready" means
you can stream via playback_ids[0].id — but
playback_ids is only present if the asset was created with a
playback policy (the docs' own sample payload omits it); don't make your
handler require it. video.asset.created can arrive with
status still preparing — gate downstream work on
ready, and handle video.asset.errored (bad input URL /
not-a-video are the common causes).mux webhooks listen --forward-to localhost…) and can fire
synthetic ones (mux webhooks trigger video.asset.ready) — but CLI
forwarding is explicitly for local dev with no delivery guarantees.
For a durable record, point Mux at a capture bin and
relay to localhost — byte-identical bodies, so the
signature above still verifies downstream.Reproduce this delivery against any endpoint (your handler, a bin, staging):
$ curl -X POST https://your-endpoint.example/hook \
-H 'content-type: application/json' \
-H 'user-agent: Mux Webhooks' \
-H 'mux-signature: t=1788518532,v1=6527e21900964221b9bedaadc871fe7f2e306afd6903d6d1f4a36d683b106f30' \
-d '{
"type": "video.asset.ready",
"object": {
"type": "asset",
"id": "l02fMrbCu0002269XRD7LpcHhrm01p02fGKPE7"
},
"id": "9d5a78f0-85c1-11f1-b6a4-2e7d9c3f5b18",
"environment": {
"name": "Production",
"id": "qp3vk7"
},
"data": {
"tracks": [
{
"type": "video",
"max_width": 1920,
"max_height": 1080,
"max_frame_rate": 29.97,
"id": "l02fMrbCu0002269XRD7LpcHhrm01p02fGKPE7",
"duration": 23.857167
},
{
"type": "audio",
"max_channels": 2,
"max_channel_layout": "stereo",
"id": "Qju5vBizvFzB9502bYNqOVzNWRrVo5Sn",
"duration": 23.823
}
],
"status": "ready",
"playback_ids": [
{
"id": "vNWRrVo5SnQju5vBizv02bYNqOFzB95Qz",
"policy": "public"
}
],
"max_stored_resolution": "HD",
"max_stored_frame_rate": 29.97,
"id": "l02fMrbCu0002269XRD7LpcHhrm01p02fGKPE7",
"duration": 23.857167,
"created_at": "2026-08-30T10:41:07.000Z",
"aspect_ratio": "16:9"
},
"created_at": "2026-08-30T10:42:12.000Z",
"accessor_source": null,
"accessor": null,
"request_id": null
}'