Nova Reel start_async_invoke S3 output vs a Sume result URL
Nova Reel's start_async_invoke writes output.mp4 to your S3 bucket and needs IAM. A Sume job returns a result_url and durable media.sume.com links.

With Amazon Nova Reel, start_async_invoke() takes an outputDataConfig with an s3Uri, and the finished video is written to that bucket in your AWS account. With Sume you do not provision a bucket: a job returns request_id, status_url and result_url, and the media sits on media.sume.com.
AWS facts are from the Nova user guide page on video generation access; Sume facts from Jobs and results and Runs, read 2026-10-01.
What does Nova Reel need before the first call?
Bedrock writes the file on your behalf, so the AWS role needs bedrock:InvokeModel and s3:PutObject. AWS recommends adding bedrock:GetAsyncInvoke and bedrock:ListAsyncInvokes so you can track status. Each invocation gets a folder in the bucket holding manifest.json, output.mp4 and generation-status.json. AWS says a 6 second video typically takes about 90 seconds.
What does a Sume job return instead?
Submit with mode: "async". The response carries request_id (the job id), status_url, result_url and next_poll_after_seconds. Poll the status until terminal is true, then read the result. The docs list media.sume.com as the host for first-party generated media artifacts.
| Question | Nova Reel | Sume |
|---|---|---|
| Where is the file? | s3Uri you pass in outputDataConfig | Durable media.sume.com HTTPS URL |
| Permissions to set up | bedrock:InvokeModel, s3:PutObject, plus status actions | A Sume API key; no bucket policy |
| Status check | get_async_invoke with the invocation | GET status_url, honoring next_poll_after_seconds |
| Expiry | Your bucket's lifecycle rules | Media URLs do not expire |
Who can open a Sume media URL?
Anyone holding it. The Runs page says the URLs are public to anyone with the link, so proxy or copy them if your product needs per-customer access control. That is the case where your own S3 bucket still makes sense: copy the file there after the job completes. See do Sume video URLs expire for the expiry details.
How do I read the result in code?
Poll, then fetch result_url. Keep the job id so a later process can read the same job.
const headers = { Authorization: "Bearer " + process.env.SUME_API_KEY };
const base = "https://api.sume.com/v1/jobs/";
async function result(jobId: string) {
for (;;) {
const s = await (await fetch(base + jobId + "/status", { headers })).json();
if (s.terminal) break;
await new Promise((r) => setTimeout(r, (s.next_poll_after_seconds ?? 5) * 1000));
}
return (await fetch(base + jobId + "/result", { headers })).json();
}Sources
Related posts
More in Developers
- Avatar video captions error over 60 seconds: split the script
Inline captions on an avatar video are rejected when the estimated duration is over 60 seconds, the same cap as the job. Split long scripts into jobs.
- California SB 1000: no user threshold, new verification tool
SB 1000 recasts the California AI Transparency Act: no user threshold, a disclosure verification tool, no manifest option. What Sume's docs list.
- Green screen removal by API: chromakey in a video filter graph
Sume's video filter allowlists chromakey and colorkey, but an MP4 holds no alpha, so a key must be composited inside the graph. Not AI background removal.
- Claude API compaction block: keep Sume job ids past the summary
The compact-2026-09-04 beta swaps old messages for a signed compaction block. Keep Sume job ids and keys outside it; re-read with jobs_status.
Written by Sume