S3 write destinations are supported today. Google Cloud Storage and Azure Blob Storage are planned. Reading inputs from
s3:// URIs is not yet supported — continue providing inputs via assetId or a public HTTPS url.How it works
- You create an IAM role in your AWS account that AudioShake can assume.
- You register the integration in AudioShake — this returns an External ID unique to your integration.
- You add the External ID to your role’s trust policy.
- You include
writeDestinationin your/tasksrequests.
Setup
1. Create an S3 bucket
In the AWS console, create the bucket AudioShake should write to (or use an existing one). Bucket names are globally unique — pick something likeacme-audioshake-outputs.
2. Create an IAM role in your AWS account
In the AWS IAM console, create a new role — for example,AudioshakeS3AccessRole. The role needs two policies: a trust policy that lets AudioShake assume the role, and a permissions policy that grants write access to your bucket prefix.
Trust policy. On the first step of the role wizard (“Select trusted entity”), choose Custom trust policy — not “AWS account” — so you can trust AudioShake’s specific role rather than its entire account. Paste the JSON below into the editor. The Principal is AudioShake’s published service ARN — copy it verbatim. The External ID is a placeholder for now; you’ll fill it in after registering the integration in step 4.
Trust policy
<BUCKET_NAME> and <PREFIX> with your bucket and the prefix you want AudioShake to write under (e.g. outputs):
Permissions policy
3. (Optional) Restrict writes via a bucket policy
For defense-in-depth, you can also add a bucket policy that allows only this role to write to the prefix. In the bucket’s Permissions tab, set the bucket policy to:Bucket policy
4. Register the integration with AudioShake
You can register the integration through the Dashboard or via the API.- Dashboard
- API
In the AudioShake Dashboard, go to Settings > Storage Integrations and click Add storage integration. Fill in:
- Type — AWS S3
- Bucket / Storage name — your bucket name (no
s3://prefix or path) - AWS region — e.g.
us-east-1 - Role ARN — the ARN of the role you created in step 2
5. Add the External ID to your trust policy
Back in the AWS IAM console, open your role’s Trust relationships tab and replace<EXTERNAL_ID_PLACEHOLDER> with the External ID from step 4:
6. (Optional) Test the integration
Verify that AudioShake can write to your bucket by sending aPOST to /storage-integrations/test:
<writeDestination>/.verify/<timestamp>_<uuid>.json. A 200 response means the integration is working.
Using a custom write destination
Once the integration is active, includewriteDestination in your Create Task request as an s3:// URI under your registered bucket:
Where outputs land
AudioShake organizes outputs under yourwriteDestination by task and target:
output[].link download URLs.
Path rules
writeDestinationmust begin withs3://followed by a bucket and a prefix.- The bucket in
writeDestinationmust match a registered storage integration.
Security
- AudioShake assumes your role only at task runtime, with a session named
audioshake-task-<taskId>for auditability in CloudTrail. - Access is bounded by the permissions policy you attach to the role — AudioShake can only do what you grant.
- The External ID condition prevents the confused-deputy problem — without it, another AudioShake customer could not be tricked into assuming your role.
- You can revoke access immediately by removing the trust relationship, detaching the permissions policy, or deleting the role.
Troubleshooting
| Symptom | Likely cause |
|---|---|
| Task is rejected on submit | The bucket in writeDestination doesn’t match a registered storage integration |
Task fails with an AssumeRole error | Trust policy missing AudioShake’s principal, or the External ID doesn’t match |
| Task creates but writes fail with access denied | Permissions policy doesn’t grant s3:PutObject on the writeDestination prefix, or the bucket policy restricts the role |
| Outputs land in AudioShake storage instead of your bucket | writeDestination was omitted from the /tasks request |