From 8346c7ab37b02125dc2e451858f0b2fd694a4636 Mon Sep 17 00:00:00 2001 From: Abdelrahman Essawy Date: Sat, 10 Oct 2026 10:05:33 +0300 Subject: [PATCH] docs: document output.file.sha256 on job output files Every file example now shows the field: a real digest on single-file outputs and null on the files of a multi-file output. The Job page says what it is and when it is null, and the ffmpeg page says how to verify a download with it. --- concepts/job.mdx | 17 ++++++++++------- guides/webhooks.mdx | 3 ++- jobs/ffmpeg.mdx | 19 ++++++++++++------- jobs/image-edit.mdx | 1 + jobs/image-generate.mdx | 1 + jobs/image-upscale.mdx | 1 + quickstart.mdx | 2 ++ 7 files changed, 29 insertions(+), 15 deletions(-) diff --git a/concepts/job.mdx b/concepts/job.mdx index e8d1985..61c18c3 100644 --- a/concepts/job.mdx +++ b/concepts/job.mdx @@ -127,12 +127,15 @@ Each entry in `file` and `files` is the same shape: "path": "output.mp4", "type": "video", "size": 4194304, + "sha256": "9f2c41d0b7a3e5f48c1d6e02a97b3c5f1e8d4a60b2c7f9e3d5a1b8c4e6f0a41e", "meta": { "format": "mp4", "width": 1280, "height": 720, "durationMs": 30000 } } ``` `url` is a signed link that expires at `output.expiresAt`. `path` is the filename the job wrote. `type` is an open enum (`video`, `image`, `audio`, `captions`, `playlist`, `data`, `other`), so tolerate values you do not recognize. `size` is bytes, and `meta` carries probed `format`, `width`, `height`, and `durationMs` when known. +`sha256` is the SHA-256 of the file's bytes as 64 lowercase hex characters. Hash your download, or the copy delivered to your own bucket, and compare the two strings to confirm you have the file the job produced. The field is always present. It is `null` for a job that completed before 10 October 2026 and for the individual files of a multi-file output. + ### Four patterns, one shape Which fields are populated depends on what the job produced. @@ -145,9 +148,9 @@ The common case for transform jobs. `file` is the output, `files` lists it, `dat ```json { "data": null, - "file": { "url": "https://api.rendobar.com/dl/job_abc123?token=", "path": "output.mp4", "type": "video", "size": 4194304 }, + "file": { "url": "https://api.rendobar.com/dl/job_abc123?token=", "path": "output.mp4", "type": "video", "size": 4194304, "sha256": "9f2c41d0b7a3e5f48c1d6e02a97b3c5f1e8d4a60b2c7f9e3d5a1b8c4e6f0a41e" }, "files": [ - { "url": "https://api.rendobar.com/dl/job_abc123?token=", "path": "output.mp4", "type": "video", "size": 4194304 } + { "url": "https://api.rendobar.com/dl/job_abc123?token=", "path": "output.mp4", "type": "video", "size": 4194304, "sha256": "9f2c41d0b7a3e5f48c1d6e02a97b3c5f1e8d4a60b2c7f9e3d5a1b8c4e6f0a41e" } ], "expiresAt": 1735689600000 } @@ -161,10 +164,10 @@ An HLS or DASH stream. `file` is the manifest, typed `playlist`. Point a player ```json { "data": null, - "file": { "url": "https://api.rendobar.com/v/job_abc123//master.m3u8", "path": "master.m3u8", "type": "playlist", "size": 412 }, + "file": { "url": "https://api.rendobar.com/v/job_abc123//master.m3u8", "path": "master.m3u8", "type": "playlist", "size": 412, "sha256": null }, "files": [ - { "url": "https://api.rendobar.com/v/job_abc123//master.m3u8", "path": "master.m3u8", "type": "playlist", "size": 412 }, - { "url": "https://api.rendobar.com/v/job_abc123//seg_000.ts", "path": "seg_000.ts", "type": "video", "size": 1048576 } + { "url": "https://api.rendobar.com/v/job_abc123//master.m3u8", "path": "master.m3u8", "type": "playlist", "size": 412, "sha256": null }, + { "url": "https://api.rendobar.com/v/job_abc123//seg_000.ts", "path": "seg_000.ts", "type": "video", "size": 1048576, "sha256": null } ], "expiresAt": 1735689600000 } @@ -180,8 +183,8 @@ An unordered set with no single headline, such as an image sequence or a resolut "data": null, "file": null, "files": [ - { "url": "https://api.rendobar.com/v/job_abc123//frame_000.png", "path": "frame_000.png", "type": "image", "size": 204800 }, - { "url": "https://api.rendobar.com/v/job_abc123//frame_001.png", "path": "frame_001.png", "type": "image", "size": 205120 } + { "url": "https://api.rendobar.com/v/job_abc123//frame_000.png", "path": "frame_000.png", "type": "image", "size": 204800, "sha256": null }, + { "url": "https://api.rendobar.com/v/job_abc123//frame_001.png", "path": "frame_001.png", "type": "image", "size": 205120, "sha256": null } ], "expiresAt": 1735689600000 } diff --git a/guides/webhooks.mdx b/guides/webhooks.mdx index 27e956b..150d4e5 100644 --- a/guides/webhooks.mdx +++ b/guides/webhooks.mdx @@ -173,9 +173,10 @@ A `job.completed` delivery. `output.file.url` is a signed, time-limited URL, and "path": "output.mp4", "type": "video", "size": 15234567, + "sha256": "9f2c41d0b7a3e5f48c1d6e02a97b3c5f1e8d4a60b2c7f9e3d5a1b8c4e6f0a41e", "meta": { "format": "mp4", "width": 1920, "height": 1080, "durationMs": 127500 } }, - "files": [{ "url": "https://r2.rendobar.com/...", "path": "output.mp4", "type": "video", "size": 15234567 }], + "files": [{ "url": "https://r2.rendobar.com/...", "path": "output.mp4", "type": "video", "size": 15234567, "sha256": "9f2c41d0b7a3e5f48c1d6e02a97b3c5f1e8d4a60b2c7f9e3d5a1b8c4e6f0a41e" }], "expiresAt": 1707440415000 }, "cost": { "amount": 50000000, "currency": "USD", "formatted": "$0.05" }, diff --git a/jobs/ffmpeg.mdx b/jobs/ffmpeg.mdx index adba725..0cba160 100644 --- a/jobs/ffmpeg.mdx +++ b/jobs/ffmpeg.mdx @@ -354,6 +354,7 @@ A command that writes one file sets `output.file` to that file, and `output.file "path": "output.mp4", "type": "video", "size": 4194304, + "sha256": "9f2c41d0b7a3e5f48c1d6e02a97b3c5f1e8d4a60b2c7f9e3d5a1b8c4e6f0a41e", "meta": { "format": "mp4", "width": 1280, "height": 720, "durationMs": 30000 } }, "files": [ @@ -362,6 +363,7 @@ A command that writes one file sets `output.file` to that file, and `output.file "path": "output.mp4", "type": "video", "size": 4194304, + "sha256": "9f2c41d0b7a3e5f48c1d6e02a97b3c5f1e8d4a60b2c7f9e3d5a1b8c4e6f0a41e", "meta": { "format": "mp4", "width": 1280, "height": 720, "durationMs": 30000 } } ], @@ -371,6 +373,8 @@ A command that writes one file sets `output.file` to that file, and `output.file } ``` +`sha256` is the SHA-256 of the output file. To confirm a download or a delivered copy, hash it with `sha256sum` and compare the result with `output.file.sha256`. You do not need a second job with `-f hash` to get a checksum of an output. + A command that writes a stream (HLS or DASH) sets `output.file` to the manifest, typed `playlist`. Point a player at `output.file.url` directly. `output.files` carries the manifest plus every segment: ```json @@ -394,12 +398,13 @@ A command that writes a stream (HLS or DASH) sets `output.file` to the manifest, "url": "https://api.rendobar.com/v/job_abc123//master.m3u8", "path": "master.m3u8", "type": "playlist", - "size": 412 + "size": 412, + "sha256": null }, "files": [ - { "url": "https://api.rendobar.com/v/job_abc123//master.m3u8", "path": "master.m3u8", "type": "playlist", "size": 412 }, - { "url": "https://api.rendobar.com/v/job_abc123//seg_000.ts", "path": "seg_000.ts", "type": "video", "size": 1048576 }, - { "url": "https://api.rendobar.com/v/job_abc123//seg_001.ts", "path": "seg_001.ts", "type": "video", "size": 1041203 } + { "url": "https://api.rendobar.com/v/job_abc123//master.m3u8", "path": "master.m3u8", "type": "playlist", "size": 412, "sha256": null }, + { "url": "https://api.rendobar.com/v/job_abc123//seg_000.ts", "path": "seg_000.ts", "type": "video", "size": 1048576, "sha256": null }, + { "url": "https://api.rendobar.com/v/job_abc123//seg_001.ts", "path": "seg_001.ts", "type": "video", "size": 1041203, "sha256": null } ], "expiresAt": 1735689600000 } @@ -418,9 +423,9 @@ A command that writes an unordered set (image sequence, `-f segment`, a resoluti "data": null, "file": null, "files": [ - { "url": "https://api.rendobar.com/v/job_abc123//frame_000.png", "path": "frame_000.png", "type": "image", "size": 204800 }, - { "url": "https://api.rendobar.com/v/job_abc123//frame_001.png", "path": "frame_001.png", "type": "image", "size": 205120 }, - { "url": "https://api.rendobar.com/v/job_abc123//frame_002.png", "path": "frame_002.png", "type": "image", "size": 203904 } + { "url": "https://api.rendobar.com/v/job_abc123//frame_000.png", "path": "frame_000.png", "type": "image", "size": 204800, "sha256": null }, + { "url": "https://api.rendobar.com/v/job_abc123//frame_001.png", "path": "frame_001.png", "type": "image", "size": 205120, "sha256": null }, + { "url": "https://api.rendobar.com/v/job_abc123//frame_002.png", "path": "frame_002.png", "type": "image", "size": 203904, "sha256": null } ], "expiresAt": 1735689600000 } diff --git a/jobs/image-edit.mdx b/jobs/image-edit.mdx index 8ca7d83..2a087d0 100644 --- a/jobs/image-edit.mdx +++ b/jobs/image-edit.mdx @@ -186,6 +186,7 @@ A completed job carries a single webp file in `output.file`, typed `image`. `out "path": "output.webp", "type": "image", "size": 498000, + "sha256": "9f2c41d0b7a3e5f48c1d6e02a97b3c5f1e8d4a60b2c7f9e3d5a1b8c4e6f0a41e", "meta": { "format": "webp", "width": 1024, "height": 1024 } }, "files": [ diff --git a/jobs/image-generate.mdx b/jobs/image-generate.mdx index 987fdd4..37d2ddc 100644 --- a/jobs/image-generate.mdx +++ b/jobs/image-generate.mdx @@ -108,6 +108,7 @@ A completed job carries a single webp file in `output.file`. `output.data` is `n "path": "output.webp", "type": "image", "size": 512000, + "sha256": "9f2c41d0b7a3e5f48c1d6e02a97b3c5f1e8d4a60b2c7f9e3d5a1b8c4e6f0a41e", "meta": { "format": "webp", "width": 1024, "height": 1024 } }, "files": [ diff --git a/jobs/image-upscale.mdx b/jobs/image-upscale.mdx index 215bfa1..b3c7074 100644 --- a/jobs/image-upscale.mdx +++ b/jobs/image-upscale.mdx @@ -153,6 +153,7 @@ png rather than webp on purpose. Re-compressing lossily is the one thing that wo "path": "output.png", "type": "image", "size": 4194304, + "sha256": "9f2c41d0b7a3e5f48c1d6e02a97b3c5f1e8d4a60b2c7f9e3d5a1b8c4e6f0a41e", "meta": { "format": "png", "width": 3840, "height": 2160 } }, "expiresAt": 1735689600000 diff --git a/quickstart.mdx b/quickstart.mdx index 715721e..d2f4127 100644 --- a/quickstart.mdx +++ b/quickstart.mdx @@ -125,6 +125,7 @@ When `status` is `complete`, the response contains an `output` object. The file "path": "output.mp4", "type": "video", "size": 4194304, + "sha256": "9f2c41d0b7a3e5f48c1d6e02a97b3c5f1e8d4a60b2c7f9e3d5a1b8c4e6f0a41e", "meta": { "format": "mp4", "width": 1280, "height": 720, "durationMs": 30000 } }, "files": [ @@ -133,6 +134,7 @@ When `status` is `complete`, the response contains an `output` object. The file "path": "output.mp4", "type": "video", "size": 4194304, + "sha256": "9f2c41d0b7a3e5f48c1d6e02a97b3c5f1e8d4a60b2c7f9e3d5a1b8c4e6f0a41e", "meta": { "format": "mp4", "width": 1280, "height": 720, "durationMs": 30000 } } ],