roasOS
API referenceWorkflows

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.

GET
/v1/workflows/extend/{id}

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
AuthorizationBearer <token>

API key authentication. Use your API key as the bearer token: Authorization: Bearer roasos_sk_...

In: header

Path Parameters

id*string
Formatuuid

Response 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`.