Skip to content

storyboards.get

One storyboard

GET/storyboards/{id}

Operation
storyboards.get
MCP tool
storyboards_get

The plan a render can be made from: the job envelope (state, pollAfterMs, and progress, the current step and whole percent while it plans), the beats with a short-lived screenshot URL each, the steps the run could not resolve, the hint-coverage report — what the hint asked for that the beats do not show — and lengthFit, what the chosen length did to the plan. Poll until state is terminal, then read beats.

curl 'https://api.gogoscreen.com/api/v1/storyboards/3f2b0c1a-9d4e-4a61-b8c2-000000000024' \
  -H "Authorization: Bearer $GOGOSCREEN_API_KEY"
A request to this operation.
json
{
  "storyboard": {
    "id": "3f2b0c1a-9d4e-4a61-b8c2-000000000024",
    "kind": "walkthrough.storyboard",
    "state": "running",
    "internalStatus": "running",
    "stage": null,
    "progress": {
      "stage": "starting",
      "percent": 4,
      "at": "2026-09-21T11:23:00.000Z"
    },
    "error": null,
    "result": null,
    "cost": {
      "secondsReserved": 0,
      "secondsCharged": null,
      "watermark": false
    },
    "artifactsExpired": false,
    "cancellable": true,
    "idempotencyKey": "storyboard-1790012026408",
    "requestId": null,
    "createdAt": "2026-09-21T11:21:00.000Z",
    "startedAt": "2026-09-21T11:21:00.000Z",
    "finishedAt": null,
    "expiresAt": "2026-09-21T11:22:00.000Z",
    "pollAfterMs": 2500
  },
  "title": null,
  "summary": null,
  "hint": "Show the protocol registries page.",
  "targetOrigin": "https://www.iana.org",
  "targetPath": "/",
  "appEntryUrl": null,
  "hadCredentials": false,
  "credentialsHeld": false,
  "beats": [],
  "stuckSteps": [],
  "coverage": {
    "uncovered": [],
    "wider": []
  },
  "lengthFit": null
}
200 response, captured from a real call. Ids, timestamps and signed URLs are replaced; the shape is untouched.

At a glance

FactDetail
Scopesstoryboards: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 toolstoryboards_get
Always setsCache-Control: private, no-store

Path parameters

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

Response

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

200 OK

One storyboard

200 OK body
NameTypeDescription
appEntryUrlstring | nullWhere the walkthrough was actually recorded, when a sign-in proved the app is not at targetOrigin — a product at app.example.com for a site at example.com. Null means the two are the same place.
beatsobject[]
beatIdstring
narrationstring | null
screenshotUrlstring | null
coverageobject
uncoveredstring[]What the hint asked for that the beats do not show.
widerobject[]Pages wider than the recording viewport, clipped at the right edge on camera.
credentialsHeldbooleanWhether the session credential the run used is still held server-side. The credential itself never leaves the server.
hadCredentialsboolean
hintstring | null
lengthFitobject | nullWHAT THE PLAN DID ABOUT THE LENGTH. Null for a storyboard planned before this record existed, which is not the same as adjusted: false.
10 fields inside lengthFit
NameTypeDescription
adjustedbooleanWhether the plan is shorter than the request asked for — steps trimmed, or the length's step budget used up with objectives still open. Plan again at a longer length to get the rest; planning is free.
beatBudgetnumber | nullThe steps that length can hold. An Auto plan derives it from seconds; a fixed length takes its own preset's.
beatsDroppednumberSteps trimmed off the end because the length could not hold them.
beatsKeptnumberSteps in beats, which is what the render will show.
beatsPlannednumberSteps the run proved, before anything was trimmed.
maxSecondsnumber | nullThe ceiling an Auto plan was budgeted against, or null when a fixed length was chosen.
notestring | nullThe sentence to show the customer, e.g. "Plan adjusted to fit 60 seconds: 10 of 13 steps kept." Null when nothing was adjusted.
plannedSecondsnumber | nullWhat the kept steps are worth in seconds — what the video will run to, before the read is measured.
secondsnumber | nullThe length everything below was decided from: the fixed length, or the Auto ceiling.
targetSecondsnumber | nullThe fixed length this plan was made for, or null when it was planned as Auto.
storyboardobject
35 fields inside storyboard
NameTypeDescription
artifactsExpiredbooleanThe work succeeded but its files were deleted at the end of the retention period.
cancellableboolean
costobject
secondsChargednumber | null
secondsReservednumber
watermarkboolean
createdAtstring | nullformat: date-time
errorobject | null
codestring
reasonstring | null
retryableboolean
terminalboolean
expiresAtstring | nullformat: date-time
finishedAtstring | nullformat: date-time
idstring
idempotencyKeystring | null
internalStatusstringA finer-grained status word. Informational; branch on state.
kindstringwalkthrough.render | walkthrough.storyboard | marketing.export | marketing.generation | marketing.source_scan | marketing.source_operation
pollAfterMsnumber | nullWait this long before polling again; null once the state is terminal.
progressobject | nullHOW FAR THE WORK HAS GOT, as last reported, or null — null while nothing has been recorded yet and null for every terminal state, because a finished job is 100 by definition and a failed one has no bar to draw.
atstring | nullWhen it was reported. A reading that has stopped moving means the work has, not that the bar is broken.
percentnumber0 to 100, as last reported for this job. It never goes backwards. Draw exactly this number: nothing here is interpolated and a client that animates between readings is inventing progress.
stagestringA short label for the current step. Show it; do not branch on it.
requestIdstring | null
resultobject | null
7 fields inside result
NameTypeDescription
artifactsobject[]
bytesnumber | null
expiresAtstring | nullformat: date-time
sha256string | null
typestring
urlstring | null
durationSecondsnumber | null
stagestring | null
startedAtstring | nullformat: date-time
statestringThe five public states. Poll until one of succeeded/failed/cancelled.one of: queued, running, succeeded, failed, cancelled
stuckStepsobject[]
summarystring | null
targetOriginstring | null
targetPathstring | null
titlestring | null
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.
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.