Generate in Full Quality
November 12, 2026
Table of contents
Turn a finished seedance-2.5-draft video into a full-quality Seedance 2.5 video, the way Dreamina’s “Generate in full quality” button does. Make a cheap 480p draft with POST /videos and model: "seedance-2.5-draft", check it, then send its jobid here. Dreamina builds the full-quality video from that draft, so you get the video you approved rather than a new take on the same prompt.
The video keeps the draft’s prompt, references, length and aspect ratio. US accounts make 1080p, CA accounts 1080p or 4K. Dreamina keeps a draft for 14 days, so a draft older than that can no longer be used.
Full quality costs the same as making the video with seedance-2.5 at that resolution. The draft is an extra run on top of that, whether you then make 1080p or 4K, so it pays off when you would otherwise try a prompt more than once. Prices for the draft and every resolution are in the cost calculator. A draft itself can’t be upscaled or interpolated. A 1080p full-quality video can be upscaled, and any full-quality video interpolated.
The result is a regular video job: poll GET /videos/jobid or use replyUrl. A 4-second 1080p video took one to two minutes in our tests. A step-by-step walkthrough with real videos: How to Draft Seedance 2.5 Videos at 480p and Finish Them in 1080p or 4K.
https://api.useapi.net/v1/dreamina/videos/full-quality
Request Headers
Authorization: Bearer {API token}
Content-Type: application/json
# Alternatively you can use multipart/form-data
# Content-Type: multipart/form-data
API tokenis required, see Setup useapi.net for details.
Request Body
{
"jobid": "j1112160030123456789v-u12345-CA:[email protected]:dreamina",
"resolution": "1080p"
}
jobidis required. The job ID of a completedseedance-2.5-draftjob from POST /videos, at most 14 days old. The video is made on the same account.resolutionis optional,1080p(default) or4k.4kworks on CA accounts only.replyUrlis optional, webhook URL for job status callbacks. Callback body has the same JSON shape as GET /videos/jobidresponse.replyRefis optional, custom reference string passed back in webhook callbacks.
Responses
-
Job created. Poll GET /videos/
jobidfor the result.request.draftJobidis the draft it was made from.{ "jobid": "j1112160330123456789v-u12345-CA:[email protected]:dreamina", "type": "video", "status": "created", "model": "seedance-2.5-draft", "created": "2026-11-12T16:03:06.825Z", "request": { "prompt": "A paper boat drifting down a rain-soaked street gutter", "model": "seedance-2.5-draft", "ratio": "9:16", "duration": 4, "inputMode": "full_quality", "resolution": "1080p", "draftJobid": "j1112160030123456789v-u12345-CA:[email protected]:dreamina" }, "response": { "forecastCost": 209 }, "code": 200 } -
The job is not a finished draft, the draft is older than 14 days, or the resolution is not offered on the account’s region.
{ "error": "Job j1112160030123456789v-u12345-CA:[email protected]:dreamina is not a seedance-2.5-draft job. Make a draft with POST /videos and model seedance-2.5-draft first" }{ "error": "Invalid resolution: 4k. A US draft can be made into 1080p" } -
Invalid API token.
{ "error": "Unauthorized" } -
The draft belongs to another user, or the Dreamina account has no paid plan that includes Seedance 2.5.
{ "error": "Account CA:[email protected] needs a paid Dreamina subscription for seedance-2.5-draft: Dreamina refused the job because the account has no plan that includes it (credits bought separately don't count). Subscribe at https://dreamina.capcut.com/pricing/dreamina-price, or use an account that has one. Dreamina: credit miss role" } -
The Dreamina account is out of credits.
{ "error": "Submit failed: Not enough credits left or no relevant benefits" } -
The draft job is unknown, or Dreamina no longer has the draft, for example because it was deleted from the account with DELETE /assets/
assetId.{ "error": "Draft job not found" } -
Dreamina did not answer when the draft was read. Retry in a minute.
{ "error": "Dreamina did not return draft j1112160030123456789v-u12345-CA:[email protected]:dreamina (HTTP 503). Retry in a minute" }
Examples
-
curl -X POST \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "jobid": "YOUR_COMPLETED_DRAFT_JOBID", "resolution": "1080p" }' \ "https://api.useapi.net/v1/dreamina/videos/full-quality" -
const token = 'YOUR_API_TOKEN'; const response = await fetch('https://api.useapi.net/v1/dreamina/videos/full-quality', { method: 'POST', headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' }, body: JSON.stringify({ jobid: 'YOUR_COMPLETED_DRAFT_JOBID', resolution: '1080p' }) }); const result = await response.json(); console.log('Full-quality job:', result.jobid); const poll = async (jobid) => { while (true) { const res = await fetch(`https://api.useapi.net/v1/dreamina/videos/${jobid}`, { headers: { 'Authorization': `Bearer ${token}` } }); const job = await res.json(); if (job.status === 'completed') { console.log('Video:', job.response.width, 'x', job.response.height, job.response.videoUrl); return job; } if (job.status === 'failed') throw new Error(job.error); await new Promise(r => setTimeout(r, 10000)); } }; await poll(result.jobid); -
import requests import time token = 'YOUR_API_TOKEN' response = requests.post( 'https://api.useapi.net/v1/dreamina/videos/full-quality', headers={ 'Authorization': f'Bearer {token}', 'Content-Type': 'application/json' }, json={ 'jobid': 'YOUR_COMPLETED_DRAFT_JOBID', 'resolution': '1080p' } ) result = response.json() print(f"Full-quality job: {result['jobid']}") jobid = result['jobid'] while True: job = requests.get( f'https://api.useapi.net/v1/dreamina/videos/{jobid}', headers={'Authorization': f'Bearer {token}'} ).json() if job['status'] == 'completed': r = job['response'] print(f"Video: {r['width']}x{r['height']} {r['videoUrl']}") break if job['status'] == 'failed': raise Exception(job.get('error')) time.sleep(10)