Generate in Full Quality

November 12, 2026

Table of contents

  1. Request Headers
  2. Request Body
  3. Responses
  4. Examples
  5. Try It

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

Request Body

{
  "jobid": "j1112160030123456789v-u12345-CA:[email protected]:dreamina",
  "resolution": "1080p"
}
  • jobid is required. The job ID of a completed seedance-2.5-draft job from POST /videos, at most 14 days old. The video is made on the same account.
  • resolution is optional, 1080p (default) or 4k. 4k works on CA accounts only.
  • replyUrl is optional, webhook URL for job status callbacks. Callback body has the same JSON shape as GET /videos/jobid response.
  • replyRef is optional, custom reference string passed back in webhook callbacks.

Responses

  • 200 OK

    Job created. Poll GET /videos/jobid for the result. request.draftJobid is 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
    }
    
  • 400 Bad Request

    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"
    }
    
  • 401 Unauthorized

    Invalid API token.

    {
      "error": "Unauthorized"
    }
    
  • 403 Forbidden

    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"
    }
    
  • 412 Precondition Failed

    The Dreamina account is out of credits.

    {
      "error": "Submit failed: Not enough credits left or no relevant benefits"
    }
    
  • 404 Not Found

    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"
    }
    
  • 502 Bad Gateway

    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)
    

Try It