Video APIs that deliver output to your own bucket
Compare 13 video processing APIs on delivering output to a bucket you own. Three can write to S3 through an IAM role, and five document no delivery at all.
A video API that keeps your output in its own storage is fine until you need the file somewhere else. Then every job ends with a download and an upload you run yourself, a retention clock you didn’t set, and a link that expires. The alternative is an API that writes the finished file straight into a bucket you own.
Short version. We read the storage documentation of 13 video processing services. Eight can put output into your bucket, one of them as backup copies only. Most of those want a long-lived access key. Three can write through an IAM role instead, and five keep outputs in their own storage and give you a link.
I build Rendobar, one of the services on this list, so weigh the framing accordingly. Every row below comes from the vendor’s own documentation, linked at the end, as read on 2026-09-13.
The comparison
| Service | Delivers to your bucket | Where it can write | How it gets access | Reads inputs from it |
|---|---|---|---|---|
| Rendobar | Yes, every plan | Amazon S3, Cloudflare R2, Supabase Storage, S3-compatible | One-click IAM role for S3 with no key stored, an API token for R2, sign-in for Supabase, access keys for the rest | Yes |
| AWS Elemental MediaConvert | Yes | Amazon S3 | An IAM service role in your own account. Another account's bucket needs a bucket policy or a canned ACL | Yes |
| Bitmovin | Yes | Amazon S3, Google Cloud Storage, Azure, S3-compatible, SFTP | S3 role-based outputs use an IAM role with an external ID, or an access key pair | Yes |
| Coconut | Yes | Amazon S3, Google Cloud Storage, Azure, DigitalOcean Spaces, Wasabi, Backblaze, S3-compatible | access_key_id and secret_access_key in each job's storage block | URL only |
| Transcodely | Yes | Amazon S3, Google Cloud Storage, Cloudflare R2 | Access keys for S3 and R2, a service account key file for Google Cloud Storage | Yes |
| Transloadit | Yes | Amazon S3, S3-compatible | Key and secret saved as Template Credentials, with an optional session token | Yes |
| Shotstack | Yes | Amazon S3, Google Cloud Storage, Azure, Google Drive, Vimeo | Access key ID and secret entered in the dashboard. Several buckets must share one AWS account | URL only |
| Cloudinary | Backup copies only, paid plans | Amazon S3, Google Cloud Storage, Azure | Backup copies only. The bucket is allowlisted with a marker file named after your cloud | Not in its docs |
| Mux | No | None | Master access creates a temporary MP4 URL, valid for 24 hours, for you to copy out | URL only |
| Rendi | No | None | Outputs stay in Rendi's storage at a storage_url | URL only |
| RenderIO | No | None | FFmpeg outputs are stored on RenderIO's own R2. Bring your own bucket applies to its video download API, Growth plan and up | URL only |
| FFmpeg Micro | No | None | Outputs are downloaded through a signed URL that expires | URL only |
| Very Good FFmpeg | Not in its docs | None | The homepage says output lands at a stable URL and does not mention your own bucket | Not in its docs |
Three ways a service gets into your bucket
The column that matters most is the fourth one, because it decides what you are trusting a vendor to hold.
An access key. You create an IAM user, attach a policy, and paste its key and secret into the vendor’s dashboard. It is the simplest setup, and the key stays valid until someone rotates it. If the vendor’s copy leaks, whoever has it can write to your bucket for as long as you don’t notice.
A cross-account role with an external ID. You create a role in your account that trusts the vendor’s AWS account, with a condition requiring a value the vendor generated for you. The vendor assumes the role and gets credentials that expire within hours. AWS’s documentation explains why the external ID is there: without it, another customer who learns your role’s ARN could ask the vendor to act on your bucket, which AWS calls the confused deputy problem.
A role federated through an identity provider. You create a role that trusts a signed identity token rather than an AWS account, with conditions naming exactly which identity may assume it. Nothing long lived is shared at all. How to let a service write to your S3 bucket without access keys walks through the trust policy line by line.
Services that write through a role
AWS Elemental MediaConvert is the native option, and it works through an IAM service role in your own account. That makes it simple when the bucket and the transcoder live in the same account. Writing into another account’s bucket needs a bucket policy or a canned ACL on top.
Bitmovin offers S3 role-based outputs alongside ordinary access keys. You create the role, Bitmovin supplies an external ID for its trust policy, and its encoder assumes the role to write. It also supports Google Cloud Storage, Azure, SFTP and S3-compatible storage.
Rendobar creates the role for you. Picking Amazon S3 opens a CloudFormation stack filled in for one bucket, and the connection completes when the stack reports back. No access key is created, and deleting the stack revokes access. R2, Supabase and other S3-compatible services connect with a token, a sign-in or a key pair, since a role is an AWS concept.
Services that take an access key
Coconut writes to the widest list of destinations here, from S3 and Google Cloud Storage to Wasabi, Backblaze, Azure and FTP, with the key and secret passed in each job’s storage block. Its inputs are URLs.
Transcodely reads from and writes to S3, Google Cloud Storage and R2, with access keys for S3 and R2 and a service account key file for Google Cloud Storage.
Transloadit stores with its /s3/store robot using a key and secret saved as Template Credentials, and accepts an optional session token. A host parameter points it at S3-compatible services. It also imports from S3.
Shotstack takes an access key ID and secret in its dashboard and can send renders to several buckets at once, as long as they share one AWS account and one set of credentials. It also delivers to Google Cloud Storage, Azure, Google Drive and Vimeo. Source footage goes through its own ingest storage or a URL.
If you use one of these, give the key an IAM policy that allows writing to one bucket and nothing else. A leaked key that can only put objects into a single bucket is a far smaller incident than one attached to an administrator.
Services that keep the output
Mux is a video platform first. Its outputs live in Mux, and master access creates a temporary MP4 URL that expires after 24 hours for you to copy out.
Rendi stores FFmpeg outputs in its own storage and returns a storage_url. FFmpeg Micro hands back a signed download URL that expires. Very Good FFmpeg says output lands at a stable URL and does not mention your own bucket.
RenderIO stores FFmpeg outputs on its own R2. It does advertise bring-your-own bucket for S3, R2 and Google Cloud Storage on its Growth plan and up, but that FAQ belongs to its separate video download API.
Cloudinary sits between the groups. On paid plans it writes backup copies into your S3, Google Cloud Storage or Azure bucket, allowlisted with a marker file. Those are backups of what you uploaded, not deliveries of what a transformation produced.
None of this is a flaw for a platform whose product is hosting and playback. It is a mismatch when the product you are building already has a bucket.
Reading inputs from the bucket
Delivery is half the trip. Five services read inputs straight from your bucket, and the others take a URL. A URL is fine for public files. For a private object it means you mint a presigned link and keep it valid for as long as the job might wait, which fails in a surprising way when the link was signed with an assumed role. Why S3 presigned URLs expire early covers that trap.
How to choose
Four questions settle most of it:
- Is your product hosting and playback? Then a platform that keeps the output is doing its job, and delivery is beside the point.
- Does the output have to land in a bucket you own? Cross off the five that keep it.
- Will your security review accept a long-lived key held by a vendor? If not, the list is the three that use a role.
- Do your inputs live in the same bucket? Prefer a service that reads from it, so private footage never needs a link you maintain.
For the raw FFmpeg side of this market on price, free tiers and agent access, see best FFmpeg API in 2026, compared. For the broader shape of video tools, see video processing API tools compared.
Where this stops
Every row comes from documentation, read on 2026-09-13. We did not connect a bucket to each service and test it, so a capability a vendor supports but does not document is missing here, and one it documents but has since changed is stale. If you spot either, the vendor’s own page wins.
Plan gating is listed only where the docs state it. A blank does not mean every plan includes the feature.
“Reads inputs from it” means the service reads a private object with credentials you configured. Every service here can read a public URL, and any of them can read a presigned one.
For how Rendobar connects a bucket, see the storage connections guide and the connected storage changelog entry.
Frequently asked questions
Which video APIs can write output to my own S3 bucket?
Of the 13 we checked: Rendobar, AWS Elemental MediaConvert, Bitmovin, Coconut, Transcodely, Transloadit and Shotstack deliver output to your bucket. Cloudinary writes backup copies there on paid plans. Mux, Rendi, RenderIO's FFmpeg API, FFmpeg Micro and Very Good FFmpeg keep outputs in their own storage.
Can a video API write to S3 without an access key?
Yes, through an IAM role. MediaConvert uses a service role in your own account, Bitmovin's role-based outputs use a role with an external ID, and Rendobar creates a role scoped to one bucket through a CloudFormation stack. The service then receives short-lived credentials instead of holding a permanent key.
Is it safe to give a video API an AWS access key?
It can be, if the key belongs to an IAM user whose policy allows only the actions it needs on only that bucket. The risk is that an access key is long lived: it stays valid until rotated, so a leak on the vendor's side is a standing credential, where a role session expires within hours.
Does Mux let me export videos to S3?
Not as a delivery. Mux's master access creates a temporary MP4 URL that expires after 24 hours, and you copy the file out yourself. Static renditions work the same way, as downloads from Mux.
What is an external ID in a cross-account IAM role?
A value the service generates for each customer and sends when it assumes your role. Your role's trust policy requires that exact value, so another customer who learns your role ARN still can't make the service act on your bucket. AWS calls the attack it prevents the confused deputy problem.
Sources
- AWS: the confused deputy problem
- MediaConvert IAM permissions
- Bitmovin S3 role-based outputs
- Coconut storage docs
- Transcodely storage setup
- Transloadit /s3/store
- Shotstack S3 destination
- Cloudinary backups
- Mux master access
- Rendi store file endpoint
- RenderIO video API FAQ
- FFmpeg Micro cURL guide
- Very Good FFmpeg homepage
