Skip to Content

Videos

Queue video generation from prompts, first and last frames, or reference images.

Base URL: https://app.gavana.ai/api/canvas-agent/v1 · Authentication: HTTP bearer, token format cba_<token-id>.<secret>

Operations

OperationPurposeScopes
POST /videos/generateQueue video generationcanvas:read, asset:read, video:generate

POST /videos/generate

Queue video generation

Starts a retry-safe video job using a connected video model. First, last, and reference frames may be stable image node or asset handles, or public HTTPS image URLs.

  • Operation id: startVideoGeneration
  • Scopes: Requires canvas:read + asset:read + video:generate.
  • CLI equivalent: gavana video generate

Request body (application/json, required)

FieldTypeRequiredNotes
modelstringYesA provider model id or opaque model:<key> handle from GET /models?capability=video.generate. min length 1, max length 650.
connectionIdstringNoPattern ^[A-Za-z0-9_-]{1,180}$.
promptstringYesmin length 1, max length 8000.
idempotencyKeystringYesA stable retry key. Reusing it with the same request returns the original job; reusing it with different inputs returns 409. min length 8, max length 200.
canvasIdstringNoRequired when a frame or reference is a node: handle. Accepts a plain id, canvas:<id>, or canvas:<ownerUid>:<id>.
ownerUidstringNoPattern ^[A-Za-z0-9_-]{1,180}$.
aspectRatiostringNomax length 80.
durationSecondsintegerNomin 1, max 120.
resolutionstringNomax length 80.
generateAudiobooleanNo—
firstFramestringNoA stable image node or asset handle, or a public HTTPS image URL. max length 2048. Pattern ^(?:node:[A-Za-z0-9_-]{1,180}|asset:(?:[A-Za-z0-9_-]{1,180}:)?[A-Za-z0-9_-]{1,180}|https://.+)$.
lastFramestringNoA stable image node or asset handle, or a public HTTPS image URL. max length 2048. Pattern ^(?:node:[A-Za-z0-9_-]{1,180}|asset:(?:[A-Za-z0-9_-]{1,180}:)?[A-Za-z0-9_-]{1,180}|https://.+)$.
referencesarray of VideoFrameReferenceNomax items 9.

Validation rules the service enforces across these fields:

  • lastFrame requires firstFrame
  • node: frame references require canvasId
  • connectionId must match the selected model handle when both are supplied

Responses

StatusPayloadMeaning
202ImageJob | VideoJobAn image, Action, or video job state or finalized result. Image and Action results follow the documented Run retention policy. Video records are retained for 30 days and expose a protected download URL after completion.
defaultErrorResponseA stable machine-readable error. The response always includes X-Request-ID.

202 response body

FieldTypeRequiredNotes
(ImageJob).idstringYesPattern ^job:.
(ImageJob).runstringYesPattern ^run:.
(ImageJob).kindstringYesOne of image, action.
(ImageJob).pollUrlstringYesPattern ^/api/canvas-agent/v1/runs/.
(ImageJob).rawIdstring (uuid)No—
(ImageJob).statusstringYesCurrent temporary job state. Successful results retain the observation record for 24 hours before the first successful server finalization and 15 minutes after it; an authenticated Run GET or pre-callback worker finalization both count. Failed and canceled records keep the normal 24-hour window. Expired tombstones remain seven days. One of preparing, queued, running, finalizing, canceling, succeeded, failed, canceled, expired.
(ImageJob).estimatedSecondsintegerNoTypical provider runtime for the selected model. This is guidance, not a deadline. min 1.
(ImageJob).durationMsintegerNoTotal observed duration once the job is terminal. min 0.
(ImageJob).timingImageJobTimingNo—
(ImageJob).timing.createdAtstring (date-time)No—
(ImageJob).timing.queuedAtstring (date-time)No—
(ImageJob).timing.startedAtstring (date-time)No—
(ImageJob).timing.completedAtstring (date-time)No—
(ImageJob).timing.queueDurationMsintegerNomin 0.
(ImageJob).timing.executionDurationMsintegerNomin 0.
(ImageJob).timing.totalDurationMsintegerNomin 0.
(ImageJob).failureImageJobFailureNo—
(ImageJob).failure.codestringYesOne of provider_authentication_failed, provider_timeout, provider_rate_limited, provider_rejected, provider_unavailable, runtime_failed, action_input_invalid, result_expired.
(ImageJob).failure.messagestringYes—
(ImageJob).failure.retryablebooleanYes—
(ImageJob).failure.providerStatusintegerNomin 400, max 599.
(ImageJob).webhookImageJobWebhookDeliveryNoDurable delivery state. Gavana makes four total attempts. Retryable network failures and 408, 425, 429, or 5xx responses back off for 10 seconds, 60 seconds, then 5 minutes; redirects and other 4xx responses stop delivery.
(ImageJob).webhook.idstringYesPattern ^webhook:.
(ImageJob).webhook.statusstringYesOne of pending, delivering, delivered, failed.
(ImageJob).webhook.attemptsintegerYesmin 0.
(ImageJob).webhook.nextAttemptAtstring (date-time)No—
(ImageJob).webhook.lastAttemptAtstring (date-time)No—
(ImageJob).webhook.deliveredAtstring (date-time)No—
(ImageJob).webhook.lastStatusintegerNomin 100, max 599.
(ImageJob).webhook.errorCodestringNoOne of invalid_destination, delivery_failed, redirect_not_allowed, endpoint_rejected, secret_unavailable, finalization_unavailable, finalization_auth_unavailable, finalization_auth_expired, finalization_failed.
(ImageJob).replayedbooleanNo—
(ImageJob).operationstringNoOne of generate, edit, variations, action.
(ImageJob).actionIdstringNoPattern ^action:.
(ImageJob).actionVersionstringNo—
(ImageJob).canvasIdstringNoPattern ^canvas:.
(ImageJob).canvasRevisionstringNo—
(ImageJob).canvasUrlstring (uri)No—
(ImageJob).canceledAtstring (date-time)No—
(ImageJob).cancelReasonstringNoOne of stale_preparing, user_requested, setup_failed.
(ImageJob).targetsarray of stringNo—
(ImageJob).referencesarray of stringNo—
(ImageJob).referenceInputsarray of ImageReferenceInputNoExact reference handles and optional semantic roles used by the provider request.
(ImageJob).referenceInputs[].handlestringYesPattern ^(?:node:[A-Za-z0-9_-]{1,180}|asset:(?:[A-Za-z0-9_-]{1,180}:)?[A-Za-z0-9_-]{1,180})$.
(ImageJob).referenceInputs[].rolestringNoOne of identity, construction, texture, fit, style.
(ImageJob).imagesarray of ImageJobResultImageNo—
(ImageJob).images[].assetIdstringYesPattern ^asset:.
(ImageJob).images[].nodeIdstringYesPattern ^node:.
(ImageJob).images[].mediaTypestringNoPattern ^image/.
(ImageJob).images[].widthintegerNomin 1.
(ImageJob).images[].heightintegerNomin 1.
(ImageJob).images[].bytesintegerNomin 1.
(ImageJob).images[].previewUrlstring (uri)Yes—
(ImageJob).images[].markdownstringNo—
(ImageJob).completionReviewCanvasCompletionReviewNo—
(ImageJob).completionReview.statusstringYesOne of ready, needs-review, blocked.
(ImageJob).completionReview.doneClaimAllowedbooleanYesFalse while agent-owned spatial or lineage findings remain, or a generated output is pending, failed, or non-durable.
(ImageJob).completionReview.instructionstringYes—
(ImageJob).completionReview.outputsCanvasCompletionOutputsYesGenerated-output count and durable, pending, and failed breakdown.
(ImageJob).completionReview.outputs.countintegerYesmin 0.
(ImageJob).completionReview.outputs.durableCountintegerYesmin 0.
(ImageJob).completionReview.outputs.pendingCountintegerYesmin 0.
(ImageJob).completionReview.outputs.failedCountintegerYesmin 0.
(ImageJob).completionReview.outputs.handlesarray of stringYes—
(ImageJob).completionReview.overlapCanvasCompletionFindingAreaYes—
(ImageJob).completionReview.overlap.statusstringYesOne of clear, needs-review, blocked.
(ImageJob).completionReview.overlap.findingCodesarray of stringYes—
(ImageJob).completionReview.overlap.nodeHandlesarray of stringYes—
(ImageJob).completionReview.overlap.connectionHandlesarray of stringYes—
(ImageJob).completionReview.containmentCanvasCompletionFindingAreaYes—
(ImageJob).completionReview.containment.statusstringYesOne of clear, needs-review, blocked.
(ImageJob).completionReview.containment.findingCodesarray of stringYes—
(ImageJob).completionReview.containment.nodeHandlesarray of stringYes—
(ImageJob).completionReview.containment.connectionHandlesarray of stringYes—
(ImageJob).completionReview.referenceLineageCanvasCompletionFindingAreaYes—
(ImageJob).completionReview.referenceLineage.statusstringYesOne of clear, needs-review, blocked.
(ImageJob).completionReview.referenceLineage.findingCodesarray of stringYes—
(ImageJob).completionReview.referenceLineage.nodeHandlesarray of stringYes—
(ImageJob).completionReview.referenceLineage.connectionHandlesarray of stringYes—
(ImageJob).completionReview.productFidelityCanvasProductFidelityReviewYesA conservative review signal, not an authoritative visual inspection.
(ImageJob).completionReview.productFidelity.statusstringYesOne of not-applicable, needs-review, passed.
(ImageJob).completionReview.productFidelity.reviewedOutputCountintegerYesmin 0.
(ImageJob).completionReview.productFidelity.needsReviewOutputHandlesarray of stringYes—
(ImageJob).completionReview.productFidelity.evidenceMissingOutputHandlesarray of stringYes—
(ImageJob).completionReview.productFidelity.reasonsarray of objectNo—
(ImageJob).completionReview.productFidelity.reasons[].nodeHandlestringYesPattern ^node:.
(ImageJob).completionReview.productFidelity.reasons[].reasonstringYes—
(ImageJob).completionReview.deliveryCanvasCompletionDeliveryYesGenerated-output delivery evidence. A blocked state prevents a Done claim.
(ImageJob).completionReview.delivery.statusstringYesOne of clear, blocked.
(ImageJob).completionReview.delivery.reasonsarray of stringNo—
(ImageJob).completionReview.delivery.pendingOutputHandlesarray of stringYes—
(ImageJob).completionReview.delivery.failedOutputHandlesarray of stringYes—
(ImageJob).completionReview.delivery.nonDurableOutputHandlesarray of stringYes—
(ImageJob).completionReview.blockingFindingCodesarray of stringYes—
(ImageJob).completionReview.advisoryFindingCodesarray of stringYes—
(VideoJob).idstringYesPattern ^job:.
(VideoJob).rawIdstring (uuid)Yes—
(VideoJob).kind“video”Yes—
(VideoJob).operation“generate”Yes—
(VideoJob).pollUrlstringYesPattern ^/api/canvas-agent/v1/jobs/.
(VideoJob).statusstringYesOne of queued, running, succeeded, failed, canceled.
(VideoJob).modelobjectYes—
(VideoJob).model.idstringYes—
(VideoJob).model.namestringYes—
(VideoJob).progressnumberYesmin 0, max 100.
(VideoJob).estimatedSecondsintegerYesmin 1.
(VideoJob).providerRunIdstringNo—
(VideoJob).failureVideoJobFailureNo—
(VideoJob).failure.codestringYesOne of video_generation_failed, canceled.
(VideoJob).failure.messagestringYes—
(VideoJob).failure.retryablebooleanYes—
(VideoJob).videoobjectNo—
(VideoJob).video.downloadUrlstringYesPattern ^/api/canvas-agent/v1/jobs/.+/output$.
(VideoJob).replayedbooleanNo—
(VideoJob).createdAtstring (date-time)Yes—
(VideoJob).updatedAtstring (date-time)Yes—

Example

curl -X POST "https://app.gavana.ai/api/canvas-agent/v1/videos/generate" \ -H "Authorization: Bearer $GAVANA_AGENT_TOKEN" \ -H "Content-Type: application/json" \ -d '{}'

Errors

Every failure uses the shared error envelope described in Errors and X-Request-ID. The response always carries X-Request-ID; share that value with support instead of the request payload.

Last updated on