Get a video extend
Read one extend run by the continuation job id. `merged` is the stitched clip (the deliverable); it is null until the continuation completes and the merge starts. Free.
Read one extend run by the continuation job id. merged is the stitched clip (the deliverable); it is null until the continuation completes and the merge starts. Free.
Authorization
bearerAuth API key authentication. Use your API key as the bearer token: Authorization: Bearer roasos_sk_...
In: header
Path Parameters
uuidResponse Body
application/json
application/json
application/json
application/json
curl -X GET "https://example.com/v1/workflows/extend/497f6eca-6276-4993-bfeb-53cbbbba6f08"{ "data": { "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", "kind": "extend", "stage": "continuation", "continuation": { "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", "kind": "image", "model": "string", "status": "queued", "credits_reserved": 0, "created_at": "string", "completed_at": "string", "error": { "code": "string", "message": "string" }, "result": null, "webhook": { "status": "delivered", "attempts": 0, "last_status": "string", "delivered_at": "string", "failed_at": "string" }, "inputs": { "endpoint": "string", "request": { "property1": null, "property2": null } }, "links": { "self": "string", "status": "string", "result": "string", "events": "string" } }, "merged": { "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", "kind": "image", "model": "string", "status": "queued", "credits_reserved": 0, "created_at": "string", "completed_at": "string", "error": { "code": "string", "message": "string" }, "result": null, "webhook": { "status": "delivered", "attempts": 0, "last_status": "string", "delivered_at": "string", "failed_at": "string" }, "inputs": { "endpoint": "string", "request": { "property1": null, "property2": null } }, "links": { "self": "string", "status": "string", "result": "string", "events": "string" } } }}Extend a video
Continue one video from its last frame and get ONE longer clip: the source, then the new footage. Send exactly one source (`video_url` or `source_generation_id`), a `prompt` for what happens next, and `duration_seconds` for the added length (one of the model's own lengths). The default model is seedance-2.5 (the animate-still role). Any image-to-video model is allowed: kling-4, seedance-2.5, gemini-omni-flash, wan-2.7, veo-3.1, seedance-2, seedance-2-pro, grok-imagine, h3-max, flux-3-max. The shape follows the source, so there is no `aspect_ratio`. When you send no `resolution`, the model resolution closest to the source is used. The server makes two ordinary jobs: the continuation (this response) and, when the continuation completes, one merge that joins the source and the continuation. The quote is both: the continuation plus one merge credit, in `credits_breakdown`. The source plus the continuation must fit in 180 seconds. A `webhook_url` is delivered for the stitched clip. Read the run, and the stitched clip, at `/v1/workflows/extend/{id}` with the job id this call returns. If the merge cannot start, the continuation stays charged and usable, and the stage is `merge_failed`.
Remix an ad
Analyze one ad, storyboard the same structure with your own product and person, and render it. Send exactly one source (`ad_url`, `discover_item_id` or `source_generation_id`) and the `product_id` the remix must sell. Add `avatar_id` to cast your own person, `variants` to render two takes instead of one, and `note` to steer it. `discover_item_id` is how a Discover creative enters a remix: it is the analysis source, and it is the only field that admits one. The same creative sent as `ad_url`, or reached through `source_generation_id`, is refused with `discover_source_not_allowed` — a competitor ad is something you read and re-create, never something you edit. This is the typed door onto the `roasos:remix-ad` skill, so it is an agent run and not a job. `generation_spend_cap_credits` is what lets the run render without asking a person; it defaults to 0, so a remix you say nothing about quotes the board and waits. Send `quote_only: true` to see the ceiling for free, then send the same body with the returned `quote_id`. Read the run at `/v1/agent-runs/{id}`. Anything the run could not auto-approve waits in `pending_approvals`; release it at `/v1/agent-runs/{id}/gates/{gate_id}/approve`.