Skip to content

marketing.exports.download

A link to a finished export or one of its sidecars

GET/marketing/exports/{id}/download

Operation
marketing.exports.download
MCP tool
marketing_exports_download

A short-lived signed URL for the export's MP4 (asset=video, the default) or one of its sidecars: the cover JPEG, the SRT captions, or the approved transcript. 409 while the export is not finished; 410 once the file was deleted at the end of the retention period; 404 when the export never produced that sidecar.

curl -X GET "https://api.gogoscreen.com/api/v1/marketing/exports/<id>/download" \
  -H "Authorization: Bearer $GOGOSCREEN_API_KEY"
A request to this operation.

At a glance

FactDetail
Scopesmarketing:read
Credentialsa signed in dashboard session or an API key.
Rate limit600 requests a minute per credential, in the read class.
IdempotencyNot applicable. This operation changes nothing.
MCP toolmarketing_exports_download
Always setsCache-Control: private, no-store
Verified emailRequired. An account whose email address is not verified meets 403 email_unverified before the operation runs.

Path parameters

NameTypeRequiredDescription
idstringRequiredThe resource id, from a create answer or the matching list.format: uuid

Query parameters

NameTypeRequiredDescription
assetstringOptionalWhich file to download: the video itself, its cover image, its captions or the narration transcript.Default "video"one of: video, cover, captions, transcript
attachmentbooleanOptionalAsk the signed URL to download rather than play.Default false

Response

Answers 200. Every answer also carries RateLimit-Limit, RateLimit-Remaining and RateLimit-Reset, and every error body carries a requestId.

200 OK

A link to a finished export or one of its sidecars

200 OK body
NameTypeDescription
expiresAtstringWhen the URL stops working.format: date-time
urlstringA signed URL. Short-lived, single-purpose, and not shareable.
200 OK headers
HeaderMeaning
Cache-ControlAlways private, no-store.

Errors

Every refusal is { error: { code, message, details?, requestId } }. Branch on code, never on the sentence. The full catalogue is at Errors.

CodeStatusWhen it happensWhat to do
validation_failed400The merged path, query and body did not match the operation's schema. The schemas are strict, so an unknown field is a failure rather than something ignored, and a string carrying half of a character is refused before it can be stored.Read details.issues. Each entry carries a path, a message and a machine readable code. Fix every named field and send the request again; the same body always fails the same way.
unauthorized401No credential was presented, or the key is unknown, revoked or expired, or an X-API-Key header carried something that is not an API key. details.reason says which.Send Authorization: Bearer gsk_live_…. A revoked or expired key never starts working again, so issue a new one in the developer console. Put a dashboard session token in Authorization, never in X-API-Key.
forbidden_scope403The credential does not carry every scope the operation declares, or it is the wrong kind of credential for it. keys.* and assistant.* are user only and can never be called by a key.details.requiredScopes and details.missingScopes name what is missing. A key's scopes cannot be changed after it is issued, so create a new key with them. When details.allowedActors is present, no key can call this operation at all.
not_found404No resource of that id belongs to this account. A resource that belongs to somebody else answers 404 as well, never 403.Check the id. Do not treat this as a permissions problem.
not_finished409A download was asked for on an export that has not finished.Poll marketing.exports.get until state is succeeded, then download.
expired410The file is past its retention window and has been deleted. The export itself still reads succeeded, with failureCode: "expired".Nothing to retry on this id. Export the revision again if the file is still wanted.
rate_limited429The credential's per minute budget, the account's per minute ceiling, or a daily cap was exceeded. details.scope is minute, day or account, or global when the product's own daily cap on voice previews is spent.Wait the Retry-After seconds and retry. details.limit and details.resetAt say what was hit and when it reopens. The RateLimit-* headers on every answer let a client pace itself before it gets here.
internal_error500An unhandled failure inside this API. The original message is logged and never answered.Retry once, then quote requestId to support. A 5xx deletes the idempotency claim rather than storing it, so retrying under the same key is safe.
storage_unavailable503File storage could not be reached, so no signed URL could be created.Back off and retry. The file itself is unaffected.