output_downloads array alongside output. Each entry is a link on Goro’s own
domain that downloads the file when opened.
No API key. The token is the authorization, which is what makes these links
something you can hand to a person, put in an email, or open on a phone that has
never signed in to Goro.
What a run returns
output_downloads is absent entirely when a run produced no files, which is
most of them. An endpoint that returns scraped rows has exactly the result shape
it always had.
The provider’s own URL stays in output, untouched. Use it when you want to
stream the file into a video player or fetch it yourself; use the download link
when a person is going to click it.
Why not just use the provider’s URL
Three things the raw link cannot do. It is not our address. It is a hostname nobody recognises, on a CDN we do not control. If Goro changes providers, every link already handed out is a dead end. Afiles.usegoro.ai link keeps working across that.
It does not reliably download. Whether clicking a URL saves a file or opens
a player is decided by the Content-Disposition header, which is set by the
server holding the file. On a link this route serves, that header is ours.
It expires on somebody else’s schedule and says nothing when it does. A
Goro link expires on our clock and, when the file really is gone, answers with a
sentence explaining which retention ran out.
Nothing is re-hosted
The file stays exactly where the provider put it. Goro does not copy generated media into its own storage, and this route did not change that: it resolves the token to a run you own, reads the URL that run already recorded, and either redirects you to it or streams it through with a download header attached. That is a deliberate limit rather than an optimisation. Re-hosting output would mean a new bucket, a new retention clock and a standing store of customer files that the Privacy Policy would have to start describing. It does not exist, so there is nothing to describe.Playing instead of saving
Add?inline=1 to get a redirect to the file where it actually lives, with no
download header and Goro out of the path:
How long a link lasts
Seven days from when the run returned it, and shorter in practice, because the file itself has to still exist:
The practical rule: collect what you need soon after the run. A link that
outlives its file answers
410 with an explanation rather than a broken
download.
Errors
These are HTML pages, not JSON envelopes, because a person clicked the link.Security
A download link is a capability: whoever holds it can fetch that one file until it expires. Treat it the way you would treat any signed URL.- The token names a run id and an index, never a URL, so it cannot be edited to point Goro at an address it did not produce.
- It is signed, so a token built by hand does not verify.
- It resolves only inside the workspace that owns the run.
- It is scoped to a single output item, not to the run.
- Responses are sent
private, no-store, so nothing in between keeps a copy.
Send a file the other way
Uploads, handles, and the page a user opens to hand your agent a file.