=== useapi.net — universal note === Generated: 2026-05-20 04:11 UTC Authentication (applies to every useapi.net API). Header: Authorization: Bearer user:- Use the COMPLETE token, including the `user:` prefix and the alphanumeric suffix. Do not truncate. Do not URL-encode. A single token authorizes every API under the user's subscription. Service-specific patterns. Identifier names (jobid / taskId / musicId / etc.), job lifecycle, response shapes, webhook semantics, and synchronous-vs-async behavior vary PER API. Use ONLY the service-specific documentation below to determine the correct request body, response shape, polling endpoint, and status values for THIS API. Do not assume conventions from another useapi.net API carry over. For cross-service context (e.g. which APIs expose the same underlying model, billing tiers, model availability matrix), see https://useapi.net/llms.txt === END universal note === useapi.net — Experimental API for AI services. $15/month subscription gives full access to all APIs listed below. Subscribe: https://useapi.net/docs/subscription Support: https://discord.gg/w28uK3cnmF | https://t.me/use_api === URL: https://useapi.net/docs/start-here/setup-dreamina === Document URL: https://useapi.net/docs/start-here/setup-dreamina # Dreamina February 23, 2026 (April 17, 2026) ## Table of contents Approximately 10 minutes to complete setup steps. --- > This is the setup guide for [Dreamina API](/docs/api-dreamina-v1). An active [Dreamina](https://dreamina.capcut.com/) subscription and a [useapi.net subscription](/docs/subscription) are required for the API to work. [Dreamina](https://dreamina.capcut.com/) creates AI-generated videos and images using models from [ByteDance's Seed](https://seed.bytedance.com/) family. The API supports two regions: **US** and **CA** (Canada). Both expose `seedance-2.0` and `seedance-2.0-fast` at 720p and share the same image models. 1080p Seedance 2.0 is CA-only for now — will change once Dreamina adds US support. CA is ~3× cheaper per second for the same Seedance 2.0 models — see the [Cost calculator](#cost-calculator) below. ### VPN setup A VPN with a US or Canadian IP address is required to create a Dreamina account. The VPN is only needed for browser-based account creation — the API handles all requests through its own proxy infrastructure. **For US region accounts:** [Opera](https://www.opera.com/) browser has a built-in free VPN. 1. Download and install [Opera](https://www.opera.com/) if you don't have it already 2. Enable the built-in VPN by clicking the **VPN** badge in the address bar 3. Set the VPN region to **Americas** 4. Verify the VPN is active — you should see "Protected" and an Americas IP address ![](/assets/images/setup-dreamina-1.jpg) **For CA region accounts:** Opera's free VPN does not support the Canadian region. You will need a commercial VPN service that offers Canadian server locations (e.g., NordVPN, ExpressVPN, Surfshark, or similar). Set your VPN to a **Canada** server before creating the account. ### Create a Dreamina account ⚠️ **Use a dedicated email account for this API — do NOT use your personal email.** 1. Navigate to [https://dreamina.capcut.com/](https://dreamina.capcut.com/) with your VPN active and set to the desired region (Americas for US, Canada for CA) 2. Verify your region by checking the URL — US accounts will see `dreamina.capcut.com`, CA accounts may see a Canadian IP in the VPN indicator 3. Click **Sign in** in the bottom-left corner 4. Select **Continue with email** from the login options ![](/assets/images/setup-dreamina-2.jpg) 5. Click **Sign up** to create a new account 6. Enter your **email address** and choose a **password** 7. Click **Continue** to complete registration ![](/assets/images/setup-dreamina-3.jpg) You may need to verify your email address by entering a code sent to your inbox. ### Verify available models Before adding your account to the API, confirm that the desired Seedance models are available: 1. Navigate to [https://dreamina.capcut.com/ai-tool/generate](https://dreamina.capcut.com/ai-tool/generate) 2. Select **AI Video** from the mode selector at the bottom 3. Click the model name to open the model dropdown and verify that your desired models (e.g., Seedance 2.0 Fast, Seedance 2.0) are listed ![](/assets/images/setup-dreamina-5.jpg) If you don't see Seedance 2.0 models, your account may have been created in the wrong region. Create a new account with the correct VPN region. We recommend starting with the **Basic plan** to verify that subscription and generation work end-to-end before upgrading to the **Advanced plan**. The model dropdown is only an advertisement — Dreamina sometimes lists models that fail at execution for a given region or account. Running one successful generation on the Basic plan confirms the model actually works for your account before you commit to a larger plan. ### Verify and add account Use the form below to verify your credentials and add your Dreamina account. Select **Add Account** to complete setup, or **Verify** to test your credentials first. You should receive response `200` if successful. You can also use [POST /accounts](/docs/api-dreamina-v1/post-dreamina-accounts) directly.
### Cost calculator **CA is ~3× cheaper per second** than US for the same Seedance 2.0 models. | Model | US $/sec | CA $/sec | |-------|---------:|---------:| | Seedance 2.0 Fast | $0.113 | **$0.036** | | Seedance 2.0 (720p) | $0.138 | **$0.044** | | Seedance 2.0 (1080p) | — | **$0.108** | Example — 10-second clip: * Seedance 2.0 Fast: **$1.13 on US** vs **$0.36 on CA** * Seedance 2.0 (720p): **$1.38 on US** vs **$0.43 on CA** Plans compared — Advanced monthly (see plans): * **US:** USD$70/mo, 8,645 credits * **CA:** C$94.90/mo ≈ USD$68/mo, 37,070 credits (C$1 ≈ USD$0.72) → ~4.3× more credits per USD 1080p Seedance 2.0 is CA-only for now — will change once Dreamina adds US support. Consider [video upscale](/docs/api-dreamina-v1/post-dreamina-videos-upscale) (720p → 1440p at 2×) as a cheaper alternative to native 1080p.
Show the math **Step 1 — credits per second** (from Dreamina's generation cost label, measured on a 4s clip): | Model | US | CA | |-------|-----|-----| | Seedance 2.0 Fast | 56 cr / 4s = **14 cr/s** | 76 cr / 4s = **19 cr/s** | | Seedance 2.0 (720p) | 68 cr / 4s = **17 cr/s** | 92 cr / 4s = **23 cr/s** | | Seedance 2.0 (1080p) | n/a | 228 cr / 4s = **57 cr/s** | **Step 2 — USD per credit** (Advanced plan pricing from the screenshots above): | Region | Plan rate per 100 credits | USD per credit | |--------|---------------------------|----------------| | US | $0.81 | $0.81 / 100 = **$0.0081** | | CA | C$0.26 × USD$0.72/C$1 = USD$0.187 | USD$0.187 / 100 = **$0.0019** | **Step 3 — USD per second** = credits/sec × USD/credit: | Model | US calc | CA calc | |-------|---------|---------| | Seedance 2.0 Fast | 14 × $0.0081 = **$0.113/s** | 19 × $0.0019 = **$0.036/s** | | Seedance 2.0 (720p) | 17 × $0.0081 = **$0.138/s** | 23 × $0.0019 = **$0.044/s** | | Seedance 2.0 (1080p) | — | 57 × $0.0019 = **$0.108/s** | **Why CA is ~3× cheaper even though it gives 4.3× more credits per USD:** CA burns ~1.35× more credits per second for the same model (19 vs 14, 23 vs 17). Net: `4.3 ÷ 1.35 ≈ 3.2×` cheaper per second in USD.
Plan screenshots ![](/assets/images/setup-dreamina-6-us.jpg) US Advanced — US Dollars ($) ![](/assets/images/setup-dreamina-6.jpg) CA Advanced — Canadian Dollars (C$)
### Important notes - **First generation via browser** — after setting up your account, generate at least one video using the Dreamina website (e.g., a short Seedance 2.0 Fast clip in Omni Reference mode) to ensure the service is working and to accept the Terms of Service. This is a one-time step before using the API. - **VPN not required for API usage** — the VPN is only needed for creating the Dreamina account in the browser. The API handles all requests through its own proxy infrastructure. - **Region is permanent** — use the same region for the account as the VPN used during creation. US accounts must use `region: "US"`, Canadian accounts must use `region: "CA"`. - **Session management** — the API automatically manages your Dreamina session, including refreshing expired sessions. If you see `596` errors, re-add your account via [POST /accounts](/docs/api-dreamina-v1/post-dreamina-accounts). - **Avoid using the same account** simultaneously through both the API and the Dreamina website — it should work, but to play safe it's better to avoid potential session conflicts. - **Avoid logging in from other regions** — do not log in to your Dreamina account from any region other than the one used during creation, as it may change the account's default region. - **Free credits** — new Dreamina accounts receive free credits. Check your balance via [GET /accounts/`account`](/docs/api-dreamina-v1/get-dreamina-accounts-account). === URL: https://useapi.net/docs/api-dreamina-v1/delete-dreamina-accounts-account === Document URL: https://useapi.net/docs/api-dreamina-v1/delete-dreamina-accounts-account ## Delete Account Configuration February 23, 2026 --- Delete a configured Dreamina account. This removes the account from your configuration and cleans up any executing job entries. **Warning:** This action cannot be undone. You will need to reconfigure the account using [POST /accounts](/docs/api-dreamina-v1/post-dreamina-accounts) if you want to use it again. > **https://api.useapi.net/v1/dreamina/accounts/`account`** ### Request Headers ``` yaml Authorization: Bearer {API token} ``` - `API token` is **required**, see [Setup useapi.net](/docs/start-here/setup-useapi) for details. ### Path Parameters - `account` is **required**. ### Responses **200** **200 OK** Account deleted successfully. ```json { "account": "US:user@example.com", "deleted": true, "remaining": 0 } ``` - `remaining` - Number of other accounts still configured. **401** **401 Unauthorized** Invalid API token. ```json { "error": "Unauthorized" } ``` **404** **404 Not Found** Account not found or not configured. ```json { "error": "Unable to find configuration for account US:user@example.com" } ``` ### Examples **Curl** ``` bash curl -X DELETE \ -H "Authorization: Bearer YOUR_API_TOKEN" \ "https://api.useapi.net/v1/dreamina/accounts/US:user@example.com" ``` **JavaScript** ``` javascript const token = 'YOUR_API_TOKEN'; const account = 'US:user@example.com'; const response = await fetch( `https://api.useapi.net/v1/dreamina/accounts/${encodeURIComponent(account)}`, { method: 'DELETE', headers: { 'Authorization': `Bearer ${token}` } } ); const result = await response.json(); console.log('Delete result:', result); ``` **Python** ``` python import requests from urllib.parse import quote token = 'YOUR_API_TOKEN' account = 'US:user@example.com' headers = {'Authorization': f'Bearer {token}'} response = requests.delete( f'https://api.useapi.net/v1/dreamina/accounts/{quote(account, safe="")}', headers=headers ) print('Delete result:', response.json()) ``` ### Try It
=== URL: https://useapi.net/docs/api-dreamina-v1/delete-dreamina-assets-assetid === Document URL: https://useapi.net/docs/api-dreamina-v1/delete-dreamina-assets-assetid ## Delete Asset March 2, 2026 --- Delete a specific asset (image or video) from generation history. The `assetId` is obtained from [GET /assets/`account`](/docs/api-dreamina-v1/get-dreamina-assets-account), completed [GET /images/`jobid`](/docs/api-dreamina-v1/get-dreamina-images-jobid), or [GET /videos/`jobid`](/docs/api-dreamina-v1/get-dreamina-videos-jobid) results. > **https://api.useapi.net/v1/dreamina/assets/`assetId`** ### Request Headers ``` yaml Authorization: Bearer {API token} ``` - `API token` is **required**, see [Setup useapi.net](/docs/start-here/setup-useapi) for details. ### Path Parameters - `assetId` is **required**. ### Responses **200** **200 OK** Asset deleted successfully. ```json { "deleted": true, "assetId": "US:user@example.com-306191111942:7612453183683579150", "account": "US:user@example.com" } ``` **401** **401 Unauthorized** Invalid API token. ```json { "error": "Unauthorized" } ``` **404** **404 Not Found** Account not found or not configured. ```json { "error": "Unable to find configuration for account US:user@example.com" } ``` ### Examples **Curl** ``` bash curl -X DELETE \ -H "Authorization: Bearer YOUR_API_TOKEN" \ "https://api.useapi.net/v1/dreamina/assets/US:user@example.com-306191111942:7612453183683579150" ``` **JavaScript** ``` javascript const token = 'YOUR_API_TOKEN'; const assetId = 'US:user@example.com-306191111942:7612453183683579150'; const response = await fetch( `https://api.useapi.net/v1/dreamina/assets/${encodeURIComponent(assetId)}`, { method: 'DELETE', headers: { 'Authorization': `Bearer ${token}` } } ); const result = await response.json(); console.log('Delete result:', result); ``` **Python** ``` python import requests from urllib.parse import quote token = 'YOUR_API_TOKEN' asset_id = 'US:user@example.com-306191111942:7612453183683579150' response = requests.delete( f'https://api.useapi.net/v1/dreamina/assets/{quote(asset_id, safe="")}', headers={'Authorization': f'Bearer {token}'} ) print('Delete result:', response.json()) ``` ### Try It
=== URL: https://useapi.net/docs/api-dreamina-v1/delete-dreamina-scheduler-jobid === Document URL: https://useapi.net/docs/api-dreamina-v1/delete-dreamina-scheduler-jobid ## Cancel Executing Job February 23, 2026 --- Remove a job from the executing tracker and cancel it. If the job is still in `created` status, it will be marked as failed with the reason "Cancelled by user". > **https://api.useapi.net/v1/dreamina/scheduler/`jobid`** ### Request Headers ``` yaml Authorization: Bearer {API token} ``` - `API token` is **required**, see [Setup useapi.net](/docs/start-here/setup-useapi) for details. ### Path Parameters - `jobid` is **required**. The job ID to remove from the scheduler. ### Responses **200** **200 OK** Job removed from scheduler. ```json { "jobid": "j0223140530123456789v-u12345-US:user@example.com-bot:dreamina", "removed": true } ``` **401** **401 Unauthorized** Invalid API token. ```json { "error": "Unauthorized" } ``` **404** **404 Not Found** Job belongs to a different user. ### Examples **Curl** ``` bash curl -X DELETE \ -H "Authorization: Bearer YOUR_API_TOKEN" \ "https://api.useapi.net/v1/dreamina/scheduler/j0223140530123456789v-u12345-US:user@example.com-bot:dreamina" ``` **JavaScript** ``` javascript const token = 'YOUR_API_TOKEN'; const jobid = 'j0223140530123456789v-u12345-US:user@example.com-bot:dreamina'; const response = await fetch( `https://api.useapi.net/v1/dreamina/scheduler/${jobid}`, { method: 'DELETE', headers: { 'Authorization': `Bearer ${token}` } } ); const result = await response.json(); console.log('Cancel result:', result); ``` **Python** ``` python import requests token = 'YOUR_API_TOKEN' jobid = 'j0223140530123456789v-u12345-US:user@example.com-bot:dreamina' headers = {'Authorization': f'Bearer {token}'} response = requests.delete( f'https://api.useapi.net/v1/dreamina/scheduler/{jobid}', headers=headers ) print('Cancel result:', response.json()) ``` ### Try It
=== URL: https://useapi.net/docs/api-dreamina-v1/get-dreamina-accounts-account === Document URL: https://useapi.net/docs/api-dreamina-v1/get-dreamina-accounts-account ## Get Account Configuration February 23, 2026 (March 2, 2026) --- Get configuration details for a specific Dreamina account, including session status, available models, and credit balance. Can also be called once a day to claim free daily credits. > **https://api.useapi.net/v1/dreamina/accounts/`account`** ### Request Headers ``` yaml Authorization: Bearer {API token} ``` - `API token` is **required**, see [Setup useapi.net](/docs/start-here/setup-useapi) for details. ### Path Parameters - `account` is **required**. ### Responses **200** **200 OK** Account details retrieved with live data from upstream. ```json { "account": "US:user@example.com", "email": "user@example.com", "region": "US", "maxJobs": 10, "sessionExpires": "2026-04-24T12:00:00.000Z", "session": { "expires": "2026-04-24T12:00:00.000Z", "lastRefreshed": "2026-02-23T12:00:00.000Z", "daysUntilExpiry": 60 }, "models": { "video": ["seedance-2.0", "seedance-1.5-pro", "seedance-1.0-mini"], "image": ["seedream-4.5", "seedream-4.1", "seedream-4.0", "nano-banana", "seedream-3.0"] }, "credits": { "total": 24065, "vip": 12000, "gift": 10065, "purchase": 2000, "dailyClaimed": true } } ``` **Note:** The `models`, `credits`, and `session` fields are fetched live from upstream. If upstream queries fail, a summary without these fields is returned. **401** **401 Unauthorized** Invalid API token. ```json { "error": "Unauthorized" } ``` **404** **404 Not Found** Account not found or not configured. ```json { "error": "Unable to find configuration for account US:user@example.com" } ``` ### Model ```typescript { account: string // "US:user@example.com" email: string region: string // "US" maxJobs: number // 1-50 sessionExpires: string // ISO 8601 timestamp session?: { expires: string // ISO 8601 timestamp lastRefreshed: string // ISO 8601 timestamp daysUntilExpiry: number } models?: { video: string[] // Available video model names image: string[] // Available image model names } credits?: { total: number vip: number gift: number purchase: number dailyClaimed: boolean } error?: string // Error message } ``` ### Examples **Curl** ``` bash curl -H "Authorization: Bearer YOUR_API_TOKEN" \ "https://api.useapi.net/v1/dreamina/accounts/US:user@example.com" ``` **JavaScript** ``` javascript const token = 'YOUR_API_TOKEN'; const account = 'US:user@example.com'; const response = await fetch( `https://api.useapi.net/v1/dreamina/accounts/${encodeURIComponent(account)}`, { headers: { 'Authorization': `Bearer ${token}` } } ); const accountConfig = await response.json(); console.log('Account:', accountConfig); console.log('Credits:', accountConfig.credits); console.log('Models:', accountConfig.models); ``` **Python** ``` python import requests from urllib.parse import quote token = 'YOUR_API_TOKEN' account = 'US:user@example.com' headers = {'Authorization': f'Bearer {token}'} response = requests.get( f'https://api.useapi.net/v1/dreamina/accounts/{quote(account, safe="")}', headers=headers ) account_config = response.json() print('Account:', account_config) print('Credits:', account_config.get('credits')) print('Models:', account_config.get('models')) ``` ### Try It
=== URL: https://useapi.net/docs/api-dreamina-v1/get-dreamina-accounts === Document URL: https://useapi.net/docs/api-dreamina-v1/get-dreamina-accounts ## List All Configured Accounts February 23, 2026 --- List all configured Dreamina accounts. To get a specific account with live details use [GET /accounts/`account`](/docs/api-dreamina-v1/get-dreamina-accounts-account). > **https://api.useapi.net/v1/dreamina/accounts** ### Request Headers ``` yaml Authorization: Bearer {API token} ``` - `API token` is **required**, see [Setup useapi.net](/docs/start-here/setup-useapi) for details. ### Responses **200** **200 OK** Returns a map of all configured accounts, keyed by account identifier. ```json { "US:user@example.com": { "account": "US:user@example.com", "email": "user@example.com", "region": "US", "maxJobs": 10, "sessionExpires": "2026-04-24T12:00:00.000Z" } } ``` If no accounts are configured, returns an empty object `{}`. **401** **401 Unauthorized** Invalid API token. ```json { "error": "Unauthorized" } ``` ### Model ```typescript // Map of account identifier to account summary { [account: string]: { account: string // "US:user@example.com" email: string region: string // "US" maxJobs: number sessionExpires: string // ISO 8601 timestamp error?: string // Error message if account has issues } } ``` ### Examples **Curl** ``` bash curl -H "Authorization: Bearer YOUR_API_TOKEN" \ "https://api.useapi.net/v1/dreamina/accounts" ``` **JavaScript** ``` javascript const token = 'YOUR_API_TOKEN'; const response = await fetch('https://api.useapi.net/v1/dreamina/accounts', { headers: { 'Authorization': `Bearer ${token}` } }); const accounts = await response.json(); console.log('Configured accounts:', accounts); ``` **Python** ``` python import requests token = 'YOUR_API_TOKEN' headers = {'Authorization': f'Bearer {token}'} response = requests.get('https://api.useapi.net/v1/dreamina/accounts', headers=headers) print('All accounts:', response.json()) ``` ### Try It
=== URL: https://useapi.net/docs/api-dreamina-v1/get-dreamina-assets-account === Document URL: https://useapi.net/docs/api-dreamina-v1/get-dreamina-assets-account ## List Generation History March 2, 2026 --- List generation history (images and videos) for a specific account. Returns assets with their URLs, dimensions, and reusable `assetRef` values for [POST /images](/docs/api-dreamina-v1/post-dreamina-images) or as in [POST /videos](/docs/api-dreamina-v1/post-dreamina-videos). > **https://api.useapi.net/v1/dreamina/assets/`account`** ### Request Headers ``` yaml Authorization: Bearer {API token} ``` - `API token` is **required**, see [Setup useapi.net](/docs/start-here/setup-useapi) for details. ### Path Parameters - `account` is **required**. ### Query Parameters - `count` is optional. Number of assets to return (1-100, default: `20`). - `offset` is optional. Pagination cursor from a previous response's `nextOffset`. ### Responses **200** **200 OK** Returns generation history with asset details. ```json { "assets": [ { "assetId": "US:user@example.com-306191111942:7612453183683579150", "historyRecordId": "306191111942", "itemId": "7612453183683579150", "type": "image", "coverUrl": "https://p9-sign.douyinpic.com/...", "description": "A stunning aurora borealis over a frozen lake", "assetRef": "US:user@example.com-image:w2560:h1440:s905000-uri:tos-useast5-i-wopfjsm1ax-tx/abc123", "imageUrl": "https://p9-sign.douyinpic.com/...", "width": 2560, "height": 1440, "format": "webp", "createdAt": "2026-03-02T14:06:06.000Z" }, { "assetId": "US:user@example.com-306191137798:7612453244173880589", "historyRecordId": "306191137798", "itemId": "7612453244173880589", "type": "video", "coverUrl": "https://p9-sign.douyinpic.com/...", "description": "A cinematic drone shot", "videoUrl": "https://v16m-default.akamaized.net/...", "width": 1280, "height": 720, "createdAt": "2026-03-02T14:08:07.000Z" } ], "hasMore": true, "nextOffset": 20, "account": "US:user@example.com" } ``` - `assetRef` on image assets can be used directly as `imageRef_N` in [POST /images](/docs/api-dreamina-v1/post-dreamina-images) or as `firstFrameRef` in [POST /videos](/docs/api-dreamina-v1/post-dreamina-videos). - `assetId` can be used with [DELETE /assets/`assetId`](/docs/api-dreamina-v1/delete-dreamina-assets-assetid) to remove an asset. - Videos do not have `assetRef` — only a `videoUrl` for download. **401** **401 Unauthorized** Invalid API token. ```json { "error": "Unauthorized" } ``` **404** **404 Not Found** Account not found or not configured. ```json { "error": "Unable to find configuration for account US:user@example.com" } ``` ### Model ```typescript { assets: Array<{ assetId: string // ID for DELETE /assets/ historyRecordId: string itemId: string type: 'image' | 'video' coverUrl?: string // Thumbnail URL description?: string // Generation prompt assetRef?: string // Reusable ref (images only) imageUrl?: string // Full image URL (images only) videoUrl?: string // Video URL (videos only) width?: number height?: number format?: string // Image format (images only) createdAt?: string // ISO 8601 timestamp }> hasMore: boolean // More pages available nextOffset: number // Pass as offset for next page account: string } ``` ### Examples **Curl** ``` bash curl -H "Authorization: Bearer YOUR_API_TOKEN" \ "https://api.useapi.net/v1/dreamina/assets/US:user@example.com?count=10" ``` **JavaScript** ``` javascript const token = 'YOUR_API_TOKEN'; const account = 'US:user@example.com'; const response = await fetch( `https://api.useapi.net/v1/dreamina/assets/${encodeURIComponent(account)}?count=20`, { headers: { 'Authorization': `Bearer ${token}` } } ); const result = await response.json(); console.log(`Assets: ${result.assets.length}, hasMore: ${result.hasMore}`); result.assets.forEach(a => { console.log(` ${a.type} ${a.assetId} ${a.width}x${a.height}`); if (a.assetRef) console.log(` assetRef: ${a.assetRef}`); }); ``` **Python** ``` python import requests from urllib.parse import quote token = 'YOUR_API_TOKEN' account = 'US:user@example.com' response = requests.get( f'https://api.useapi.net/v1/dreamina/assets/{quote(account, safe="")}', headers={'Authorization': f'Bearer {token}'}, params={'count': 20} ) result = response.json() print(f"Assets: {len(result['assets'])}, hasMore: {result['hasMore']}") for a in result['assets']: print(f" {a['type']} {a['assetId']} {a.get('width')}x{a.get('height')}") ``` ### Try It
=== URL: https://useapi.net/docs/api-dreamina-v1/get-dreamina-images-jobid === Document URL: https://useapi.net/docs/api-dreamina-v1/get-dreamina-images-jobid ## Retrieve Image Job Status March 2, 2026 --- Retrieve the status and result of an image generation or upscale job by its job ID. Use this endpoint to poll for completion after submitting an image via [POST /images](/docs/api-dreamina-v1/post-dreamina-images) or [POST /images/upscale](/docs/api-dreamina-v1/post-dreamina-images-upscale). Jobs are retained for 30 days. > **https://api.useapi.net/v1/dreamina/images/`jobid`** ### Request Headers ``` yaml Authorization: Bearer {API token} ``` - `API token` is **required**, see [Setup useapi.net](/docs/start-here/setup-useapi) for details. ### Path Parameters - `jobid` is **required**, the unique job identifier returned from [POST /images](/docs/api-dreamina-v1/post-dreamina-images) or [POST /images/upscale](/docs/api-dreamina-v1/post-dreamina-images-upscale). ### Responses **200** **200 OK** Returns the job record with current status and details. **Processing (status: created):** ```json { "jobid": "j0302140530123456789i-u12345-US:user@example.com-bot:dreamina", "type": "image", "status": "created", "model": "seedream-4.0", "created": "2026-03-02T14:05:30.123Z", "request": { "prompt": "A stunning aurora borealis over a frozen lake", "model": "seedream-4.0", "ratio": "16:9", "resolution": "2k", "inputMode": "generate" }, "response": { "forecastCost": 0 }, "code": 200 } ``` **Completed (image generation):** ```json { "jobid": "j0302140530123456789i-u12345-US:user@example.com-bot:dreamina", "type": "image", "status": "completed", "model": "seedream-4.0", "created": "2026-03-02T14:05:30.123Z", "updated": "2026-03-02T14:06:06.789Z", "request": { "prompt": "A stunning aurora borealis over a frozen lake", "model": "seedream-4.0", "ratio": "16:9", "resolution": "2k", "inputMode": "generate" }, "response": { "images": [ { "imageUrl": "https://p9-sign.douyinpic.com/...", "imageUri": "tos-useast5-i-wopfjsm1ax-tx/abc123", "width": 2560, "height": 1440, "format": "jpeg", "assetId": "US:user@example.com-306191111942:7612453183683579150", "assetRef": "US:user@example.com-image:w2560:h1440:s905000-uri:tos-useast5-i-wopfjsm1ax-tx/abc123", "itemId": "7612453183683579150" }, { "imageUrl": "https://p9-sign.douyinpic.com/...", "imageUri": "tos-useast5-i-wopfjsm1ax-tx/def456", "width": 2560, "height": 1440, "format": "jpeg", "assetId": "US:user@example.com-306191111942:7612453183683595534", "assetRef": "US:user@example.com-image:w2560:h1440:s911000-uri:tos-useast5-i-wopfjsm1ax-tx/def456", "itemId": "7612453183683595534" } ], "forecastCost": 0, "historyRecordId": "306191111942", "finishTime": 1709391966 }, "code": 200 } ``` **Completed (upscale):** ```json { "jobid": "j0302140630123456789I-u12345-US:user@example.com-bot:dreamina", "type": "upscale", "status": "completed", "model": "seedream-4.0", "created": "2026-03-02T14:06:30.123Z", "updated": "2026-03-02T14:08:07.456Z", "request": { "jobid": "j0302140530123456789i-u12345-US:user@example.com-bot:dreamina", "imageIndex": 0, "resolution": "4k" }, "response": { "images": [ { "imageUrl": "https://p9-sign.douyinpic.com/...", "imageUri": "tos-useast5-i-wopfjsm1ax-tx/upscaled123", "width": 4096, "height": 4096, "format": "jpeg", "assetId": "US:user@example.com-306191137798:7612453244173880589", "assetRef": "US:user@example.com-image:w4096:h4096:s1482000-uri:tos-useast5-i-wopfjsm1ax-tx/upscaled123", "itemId": "7612453244173880589" } ], "forecastCost": 0, "historyRecordId": "306191137798", "finishTime": 1709392087 }, "code": 200 } ``` **Note:** The `assetRef` on each image can be used directly as `imageRef_N` in [POST /images](/docs/api-dreamina-v1/post-dreamina-images) for further generations, without needing to re-upload. **Failed:** ```json { "jobid": "j0302140530123456789i-u12345-US:user@example.com-bot:dreamina", "type": "image", "status": "failed", "model": "seedream-4.0", "created": "2026-03-02T14:05:30.123Z", "updated": "2026-03-02T14:07:15.456Z", "request": { "prompt": "A test prompt", "model": "seedream-4.0", "ratio": "16:9", "resolution": "2k", "inputMode": "generate" }, "error": "fail_code: 2038", "errorDetails": "ContentFiltered", "code": 2038 } ``` **Note:** Jobs older than 1 hour that are still `created` are auto-marked as failed with `"Generation timed out"` (code `408`). **401** **401 Unauthorized** Invalid API token. ```json { "error": "Unauthorized" } ``` **404** **404 Not Found** Job not found, belongs to a different user, or has expired (>30 days). ```json { "error": "Job not found" } ``` ### Model **Completed** Image generation completed. Includes image URLs and metadata. ```typescript { jobid: string // Unique job identifier type: 'image' | 'upscale' // Job type status: 'completed' model: string // Model used created: string // ISO 8601 timestamp updated: string // ISO 8601 timestamp request: { prompt?: string model?: string ratio?: string resolution?: string inputMode?: string // Auto-detected from params imageRef_1?: string // Reference image assetRef (when provided) imageRef_2?: string imageRef_3?: string jobid?: string // Source job (upscale only) imageIndex?: number // Source image index (upscale only) replyUrl?: string replyRef?: string } response: { images: Array<{ imageUrl: string // Direct image URL (JPEG) imageUri: string // Native URI width: number // Image width in pixels height: number // Image height in pixels format: string // "jpeg" assetId: string // Asset identifier assetRef: string // Can be used as imageRef_N in POST /images itemId: string // Upstream item ID }> forecastCost: number // Credit cost historyRecordId: string // Upstream history record finishTime: number // Unix timestamp of completion } code: number // 200 } ``` **Failed** Image generation failed. Includes error details. ```typescript { jobid: string type: 'image' | 'upscale' status: 'failed' model: string created: string updated: string request: { prompt?: string model?: string ratio?: string resolution?: string inputMode?: string replyUrl?: string replyRef?: string } error: string // Error summary errorDetails?: string // Additional details code: number // Error code } ``` **Common error codes:** | Code | Meaning | |------|---------| | 408 | Generation timed out (>1 hour) | | 596 | Account session expired | | 2038 | Content filtered | | 2057 | Upstream processing error | ### Examples **Curl** ```bash curl "https://api.useapi.net/v1/dreamina/images/j0302140530123456789i-u12345-US:user@example.com-bot:dreamina" \ -H "Authorization: Bearer YOUR_API_TOKEN" ``` **JavaScript** ```javascript const apiToken = 'YOUR_API_TOKEN' const jobId = 'j0302140530123456789i-u12345-US:user@example.com-bot:dreamina' async function waitForImages(jobId, intervalMs = 10000) { while (true) { const response = await fetch(`https://api.useapi.net/v1/dreamina/images/${jobId}`, { headers: { 'Authorization': `Bearer ${apiToken}` } }) const job = await response.json() console.log(`Status: ${job.status}`) if (job.status === 'completed') { job.response.images.forEach((img, i) => console.log(` [${i}] ${img.width}x${img.height} ${img.format}`) ) return job } if (job.status === 'failed') throw new Error(job.error) await new Promise(resolve => setTimeout(resolve, intervalMs)) } } const job = await waitForImages(jobId) ``` **Python** ```python import requests import time api_token = 'YOUR_API_TOKEN' job_id = 'j0302140530123456789i-u12345-US:user@example.com-bot:dreamina' def wait_for_images(job_id: str, interval_sec: int = 10) -> dict: while True: job = requests.get( f'https://api.useapi.net/v1/dreamina/images/{job_id}', headers={'Authorization': f'Bearer {api_token}'} ).json() print(f"Status: {job['status']}") if job['status'] == 'completed': for i, img in enumerate(job['response']['images']): print(f" [{i}] {img['width']}x{img['height']} {img['format']}") # Download image img_response = requests.get(img['imageUrl']) with open(f'image_{i}.jpeg', 'wb') as f: f.write(img_response.content) return job if job['status'] == 'failed': raise Exception(f"Job failed: {job.get('error')}") time.sleep(interval_sec) job = wait_for_images(job_id) ``` ### Try It
=== URL: https://useapi.net/docs/api-dreamina-v1/get-dreamina-scheduler === Document URL: https://useapi.net/docs/api-dreamina-v1/get-dreamina-scheduler ## List Executing Jobs February 23, 2026 (March 2, 2026) --- List all currently executing (in-progress) video and image generation jobs, grouped by account. > **https://api.useapi.net/v1/dreamina/scheduler** ### Request Headers ``` yaml Authorization: Bearer {API token} ``` - `API token` is **required**, see [Setup useapi.net](/docs/start-here/setup-useapi) for details. ### Responses **200** **200 OK** Returns executing jobs grouped by account. ```json { "executing": { "US:user@example.com": [ { "jobid": "j0223140530123456789v-u12345-US:user@example.com-bot:dreamina", "submitId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "model": "seedance-2.0", "elapsedSeconds": 45, "replyUrl": "https://your-domain.com/webhook" } ] }, "total": 1 } ``` When no jobs are executing: ```json { "executing": {}, "total": 0 } ``` **401** **401 Unauthorized** Invalid API token. ```json { "error": "Unauthorized" } ``` ### Model ```typescript { executing: { [account: string]: Array<{ jobid: string // Job identifier submitId: string // Upstream submission ID model: string // Model used elapsedSeconds: number // Seconds since job was submitted replyUrl?: string // Webhook URL if configured }> } total: number // Total number of executing jobs } ``` ### Examples **Curl** ``` bash curl -H "Authorization: Bearer YOUR_API_TOKEN" \ "https://api.useapi.net/v1/dreamina/scheduler" ``` **JavaScript** ``` javascript const token = 'YOUR_API_TOKEN'; const response = await fetch('https://api.useapi.net/v1/dreamina/scheduler', { headers: { 'Authorization': `Bearer ${token}` } }); const scheduler = await response.json(); console.log('Executing jobs:', scheduler.total); for (const [account, jobs] of Object.entries(scheduler.executing)) { console.log(` ${account}: ${jobs.length} jobs`); } ``` **Python** ``` python import requests token = 'YOUR_API_TOKEN' headers = {'Authorization': f'Bearer {token}'} response = requests.get('https://api.useapi.net/v1/dreamina/scheduler', headers=headers) scheduler = response.json() print(f"Executing jobs: {scheduler['total']}") for account, jobs in scheduler['executing'].items(): print(f" {account}: {len(jobs)} jobs") ``` ### Try It
=== URL: https://useapi.net/docs/api-dreamina-v1/get-dreamina-videos-jobid === Document URL: https://useapi.net/docs/api-dreamina-v1/get-dreamina-videos-jobid ## Retrieve Job Status March 2, 2026 (April 14, 2026) --- Retrieve the status and result of a video generation, upscale, or interpolation job by its job ID. Use this endpoint to poll for completion after submitting a video via [POST /videos](/docs/api-dreamina-v1/post-dreamina-videos), [POST /videos/upscale](/docs/api-dreamina-v1/post-dreamina-videos-upscale), or [POST /videos/interpolate](/docs/api-dreamina-v1/post-dreamina-videos-interpolate). Jobs are retained for 30 days. > **https://api.useapi.net/v1/dreamina/videos/`jobid`** ### Request Headers ``` yaml Authorization: Bearer {API token} ``` - `API token` is **required**, see [Setup useapi.net](/docs/start-here/setup-useapi) for details. ### Path Parameters - `jobid` is **required**, the unique job identifier returned from [POST /videos](/docs/api-dreamina-v1/post-dreamina-videos), [POST /videos/upscale](/docs/api-dreamina-v1/post-dreamina-videos-upscale), or [POST /videos/interpolate](/docs/api-dreamina-v1/post-dreamina-videos-interpolate). ### Responses **200** **200 OK** Returns the job record with current status and details. **Processing (status: created):** ```json { "jobid": "j0223140530123456789v-u12345-CA:user@example.com-bot:dreamina", "type": "video", "status": "created", "model": "seedance-2.0", "created": "2026-02-23T14:05:30.123Z", "request": { "prompt": "A serene mountain landscape at sunset", "model": "seedance-2.0", "ratio": "16:9", "duration": 5, "inputMode": "prompt" }, "response": { "forecastCost": 125 }, "code": 200 } ``` **Completed:** ```json { "jobid": "j0223140530123456789v-u12345-CA:user@example.com-bot:dreamina", "type": "video", "status": "completed", "model": "seedance-2.0", "created": "2026-02-23T14:05:30.123Z", "updated": "2026-02-23T14:07:15.456Z", "request": { "prompt": "A serene mountain landscape at sunset", "model": "seedance-2.0", "ratio": "16:9", "duration": 5, "inputMode": "prompt" }, "response": { "assetId": "CA:user@example.com-306191137798:7341234567890123456", "videoUrl": "https://v16m-default.tiktokcdn.com/...", "videoUrlBackup": "https://v16m.byteicdn.com/...", "videoUrlWatermarked": "https://v16-cc.capcut.com/...", "watermarked": false, "videoId": "7341234567890123456", "coverUrl": "https://p9-sign.douyinpic.com/...", "width": 1280, "height": 720, "durationMs": 5042, "hasAudio": false, "forecastCost": 125, "finishTime": 1708700835 }, "code": 200 } ``` **Failed:** ```json { "jobid": "j0223140530123456789v-u12345-CA:user@example.com-bot:dreamina", "type": "video", "status": "failed", "model": "seedance-2.0", "created": "2026-02-23T14:05:30.123Z", "updated": "2026-02-23T14:07:15.456Z", "request": { "prompt": "A test prompt", "model": "seedance-2.0", "ratio": "16:9", "duration": 5, "inputMode": "prompt" }, "error": "fail_code: 2043", "errorDetails": "OutputVideoRisk", "code": 2043 } ``` **Note:** Jobs older than 1 hour that are still `created` are auto-marked as failed with `"Generation timed out"` (code `408`). **401** **401 Unauthorized** Invalid API token. ```json { "error": "Unauthorized" } ``` **404** **404 Not Found** Job not found, belongs to a different user, or has expired (>30 days). ```json { "error": "Job not found" } ``` ### Model **Completed** Video generation completed. Includes video URL and metadata. ```typescript { jobid: string // Unique job identifier type: 'video' | 'video-upscale' | 'video-interpolate' // Job type status: 'completed' model: string // Model used created: string // ISO 8601 timestamp updated: string // ISO 8601 timestamp request: { prompt?: string model: string ratio?: string duration?: number inputMode: string // "prompt" | "first_frame" | "end_frame" | "multi_frame" | "unified_edit" resolution?: string // "720p" or "1080p" firstFrameRef?: string endFrameRef?: string frame_1_imageRef?: string // Keyframe refs (multi_frame mode) frame_1_prompt?: string frame_1_duration?: number frame_2_imageRef?: string frame_2_prompt?: string frame_2_duration?: number replyUrl?: string replyRef?: string } response: { assetId: string // For DELETE /assets/ videoUrl: string // Direct MP4 URL — clean (non-watermarked) master when available; falls back to the watermarked variant for models that don't expose a master videoUrlBackup?: string // Alternate CDN host for the same master (use if primary fails) videoUrlBackups?: string[] // Full list of alternate master URLs when more than one is provided videoUrlWatermarked?: string // Watermarked variant, preserved as a fallback and for compliance/traceability of AI-generated content watermarked?: boolean // true when the returned videoUrl carries Dreamina's AIGC transparency badge videoId: string // Dreamina video ID coverUrl: string // Video cover/thumbnail URL width: number // Video width in pixels height: number // Video height in pixels durationMs: number // Video duration in milliseconds hasAudio: boolean // Whether video has audio forecastCost: number // Credit cost finishTime: number // Unix timestamp of completion upscaleJobid?: string // Set after POST /videos/upscale } code: number // 200 } ``` #### Watermark handling Dreamina's backend renders every generated video twice: - A **clean master** served from `v16m-default.tiktokcdn.com` / `v16m.byteicdn.com`. - A **watermarked transcode** served from `v16-cc.capcut.com` with a baked-in top-left "AI" transparency badge and (on non-premium accounts) a bottom-right Dreamina brand mark. `GET /videos/` returns the clean master as `videoUrl` whenever the upstream response exposes one, and keeps the watermarked URL in `videoUrlWatermarked` as a fallback. The `watermarked` flag reflects which variant `videoUrl` is currently pointing at. For models that don't expose a master (e.g. Sora 2), `videoUrl` falls back to the watermarked variant and `watermarked` becomes `true`. The watermark is baked into the MP4 at render time — there is no URL parameter that strips it from the watermarked variant, and attempting to edit the URL invalidates its signature. All video URLs are signed and expire ~7 days after generation. Download promptly. **Failed** Video generation failed. Includes error details. ```typescript { jobid: string // Unique job identifier type: 'video' | 'video-upscale' | 'video-interpolate' status: 'failed' model: string created: string // ISO 8601 timestamp updated: string // ISO 8601 timestamp request: { prompt?: string model: string ratio?: string duration?: number inputMode: string firstFrameRef?: string endFrameRef?: string replyUrl?: string replyRef?: string } error: string // Error summary (e.g., "fail_code: 2043") errorDetails?: string // Additional details (e.g., "OutputVideoRisk") code: number // Error code (e.g., 2043, 408, 596) } ``` **Common error codes:** | Code | Meaning | |------|---------| | 408 | Generation timed out (>1 hour) | | 596 | Account session expired | | 2038 | Content filtered | | 2043 | Output video moderation risk | ### Examples **Curl** ```bash # Get job status curl "https://api.useapi.net/v1/dreamina/videos/j0223140530123456789v-u12345-CA:user@example.com-bot:dreamina" \ -H "Authorization: Bearer YOUR_API_TOKEN" # Poll for completion (check every 10 seconds) while true; do RESULT=$(curl -s "https://api.useapi.net/v1/dreamina/videos/$JOBID" \ -H "Authorization: Bearer YOUR_API_TOKEN") STATUS=$(echo "$RESULT" | jq -r '.status') echo "Status: $STATUS" if [[ "$STATUS" == "completed" ]]; then echo "$RESULT" | jq -r '.response.videoUrl' break fi if [[ "$STATUS" == "failed" ]]; then echo "$RESULT" | jq -r '.error' break fi sleep 10 done ``` **JavaScript** ```javascript const apiToken = 'YOUR_API_TOKEN' const jobId = 'j0223140530123456789v-u12345-CA:user@example.com-bot:dreamina' async function getJobStatus(jobId) { const response = await fetch(`https://api.useapi.net/v1/dreamina/videos/${jobId}`, { headers: { 'Authorization': `Bearer ${apiToken}` } }) return await response.json() } // Poll until completion async function waitForCompletion(jobId, intervalMs = 10000) { while (true) { const job = await getJobStatus(jobId) console.log(`Status: ${job.status}`) if (job.status === 'completed') { console.log('Video URL:', job.response.videoUrl) console.log('Dimensions:', `${job.response.width}x${job.response.height}`) console.log('Duration:', `${job.response.durationMs}ms`) return job } if (job.status === 'failed') { console.error('Job failed:', job.error) throw new Error(job.error) } await new Promise(resolve => setTimeout(resolve, intervalMs)) } } const job = await waitForCompletion(jobId) ``` **Python** ```python import requests import time api_token = 'YOUR_API_TOKEN' job_id = 'j0223140530123456789v-u12345-CA:user@example.com-bot:dreamina' def get_job_status(job_id: str) -> dict: response = requests.get( f'https://api.useapi.net/v1/dreamina/videos/{job_id}', headers={'Authorization': f'Bearer {api_token}'} ) response.raise_for_status() return response.json() def wait_for_completion(job_id: str, interval_sec: int = 10) -> dict: while True: job = get_job_status(job_id) print(f"Status: {job['status']}") if job['status'] == 'completed': print(f"Video URL: {job['response']['videoUrl']}") print(f"Dimensions: {job['response']['width']}x{job['response']['height']}") # Download video video_response = requests.get(job['response']['videoUrl']) with open('output.mp4', 'wb') as f: f.write(video_response.content) print('Video saved to output.mp4') return job if job['status'] == 'failed': raise Exception(f"Job failed: {job.get('error')}") time.sleep(interval_sec) job = wait_for_completion(job_id) ``` ### Try It
=== URL: https://useapi.net/docs/api-dreamina-v1 === Document URL: https://useapi.net/docs/api-dreamina-v1 # Dreamina API v1 February 23, 2026 (April 17, 2026) This is the [experimental](/docs/legal) API for [Dreamina](https://dreamina.capcut.com/) by [ByteDance](https://www.bytedance.com/). [Dreamina](https://dreamina.capcut.com/) creates AI-generated videos and images using models from [ByteDance's Seed](https://seed.bytedance.com/) family. **Video generation models:** | Model | Region | Durations | Resolution | Input Modes | |-------|--------|-----------|------------|-------------| | `seedance-2.0` | US, CA | 4-15s | 720p, 1080p (CA only as of April 17) | Prompt, First/Last Frame, Omni Reference | | `seedance-2.0-fast` | US, CA | 4-15s | 720p | Prompt, First/Last Frame, Omni Reference | | `seedance-1.5-pro` | US, CA | 5, 10, 12s | 720p, 1080p | Prompt, First/Last Frame | | `seedance-1.0-pro` | CA | 5, 10s | 1080p | Prompt, First Frame | | `seedance-1.0-mini` | US, CA | 5, 10s | 720p, 1080p | Prompt, First Frame, Multi-Frame | | `seedance-1.0-fast` | CA | 5, 10s | 720p, 1080p | Prompt, First Frame, Multi-Frame | | `sora2` | CA | 4, 8, 12s | 720p | Prompt, First Frame | 720p works on both regions; 1080p is CA-only as of April 17, 2026. See [Setup Dreamina](/docs/start-here/setup-dreamina) for per-region setup and pricing. **Image generation models (US and CA regions):** | Model | Resolution | Max refs | Auto ratio | Notes | |-------|------------|----------|------------|-------| | `seedream-5.0-lite` | 2K / 4K | 6 | ✓ | Latest Seedream model | | `seedream-4.6` | 2K / 4K | 6 | ✓ | Latest stable | | `seedream-4.5` | 2K / 4K | 6 | ✓ | High quality | | `seedream-4.1` | 2K / 4K | 6 | ✓ | | | `seedream-4.0` | 2K / 4K | 6 | ✓ | Balanced quality/speed | | `nano-banana` | 1K | 3 | ✓ | Fast | | `seedream-3.0` | 1K / 2K | 1 | — | | **Video upscale** — 2x super-resolution via [POST /videos/upscale](/docs/api-dreamina-v1/post-dreamina-videos-upscale). Doubles both width and height (e.g., 720p to 1440p, 1080p to 4K). **Video interpolation** — smooth frame rate boost to 30 or 60 FPS via [POST /videos/interpolate](/docs/api-dreamina-v1/post-dreamina-videos-interpolate). Works on both original and upscaled videos. **Image upscale** to 2K/4K/8K resolution via [POST /images/upscale](/docs/api-dreamina-v1/post-dreamina-images-upscale).
💲 Cost calculator **CA is ~3× cheaper per second** than US for the same Seedance 2.0 models. | Model | US $/sec | CA $/sec | |-------|---------:|---------:| | Seedance 2.0 Fast | $0.113 | **$0.036** | | Seedance 2.0 (720p) | $0.138 | **$0.044** | | Seedance 2.0 (1080p) | — | **$0.108** | Example — 10-second clip: * Seedance 2.0 Fast: **$1.13 on US** vs **$0.36 on CA** * Seedance 2.0 (720p): **$1.38 on US** vs **$0.43 on CA** Plans compared — Advanced monthly (see plans): * **US:** USD$70/mo, 8,645 credits * **CA:** C$94.90/mo ≈ USD$68/mo, 37,070 credits → **~4.3× more credits per USD** See [Setup Dreamina → Cost calculator](/docs/start-here/setup-dreamina#cost-calculator) for the math breakdown and plan screenshots.
⚙️ [Setup Dreamina](/docs/start-here/setup-dreamina) 📦 [Postman collection](https://www.postman.com/useapinet/useapi-net/collection) (April 17, 2026) 🤖 [LLM-friendly API spec](https://useapi.net/assets/aibot/api-dreamina-v1.txt) Feed this to your LLM to build integrations Examples: * [Seedance 2.0 — real-face tutorial (Runway & Dreamina)](/blog/260415) * [Seedance 2.0, Video Upscale](/blog/260402) * [16+ AI Image Models: The Showdown](/blog/260309i) * [Seedream 4.5 and Seedance 2.0](/blog/260302) * [Seedance 2.0](/blog/260223) Developer Community: * Discord Server * Telegram Channel === URL: https://useapi.net/docs/api-dreamina-v1/post-dreamina-accounts === Document URL: https://useapi.net/docs/api-dreamina-v1/post-dreamina-accounts ## Configure Dreamina Account February 23, 2026 (April 2, 2026) --- Configure your Dreamina account for API access using email and password credentials. See [Setup Dreamina](/docs/start-here/setup-dreamina) for details. > **https://api.useapi.net/v1/dreamina/accounts** ### Request Headers ``` yaml Authorization: Bearer {API token} Content-Type: application/json # Alternatively you can use multipart/form-data # Content-Type: multipart/form-data ``` - `API token` is **required**, see [Setup useapi.net](/docs/start-here/setup-useapi) for details. ### Request Body ```json { "email": "user@example.com", "password": "your-password", "region": "CA", "maxJobs": 10 } ``` - `email` is **required**. Dreamina account email address. - `password` is **required**. Dreamina account password. - `region` is **required**. Region code. Supported values: `US`, `CA`. Both regions support Seedance 2.0 at 720p; 1080p Seedance 2.0 is CA-only as of April 17, 2026. See [Setup Dreamina](/docs/start-here/setup-dreamina) for region-specific setup. - `maxJobs` is optional. Maximum concurrent jobs for this account (1-50, default: `10`). ### Responses **200** **200 OK** Account configured successfully. ```json { "account": "CA:user@example.com", "email": "user@example.com", "region": "CA", "maxJobs": 10, "sessionExpires": "2026-04-24T12:00:00.000Z", "session": { "expires": "2026-04-24T12:00:00.000Z", "lastRefreshed": "2026-02-23T12:00:00.000Z", "daysUntilExpiry": 60 }, "models": { "video": ["seedance-2.0-fast", "seedance-2.0", "seedance-1.5-pro", "seedance-1.0-pro", "seedance-1.0-fast", "sora2", "seedance-1.0-mini"], "image": ["seedream-5.0-lite", "seedream-4.6", "seedream-4.5", "seedream-4.1", "seedream-4.0", "nano-banana", "seedream-3.0"] }, "credits": { "total": 500, "vip": 200, "gift": 200, "purchase": 100, "dailyClaimed": false } } ``` **400** **400 Bad Request** Validation error (missing/invalid parameters). ```json { "error": "Parameter email is required" } ``` **401** **401 Unauthorized** Invalid API token. ```json { "error": "Unauthorized" } ``` **402** **402 Payment Required** Subscription expired or insufficient credits. ```json { "error": "Account has no subscription or subscription expired" } ``` **500** **500 Internal Server Error** Login failed (bad credentials, upstream error). ```json { "error": "Login failed: invalid credentials" } ``` ### Model - `account` - Account identifier - `email` - Dreamina account email - `region` - Region code - `maxJobs` - Maximum concurrent jobs - `sessionExpires` - ISO 8601 timestamp when session expires - `session` - Session details including refresh timing - `models` - Available video and image generation models - `credits` - Credit balance breakdown ```typescript { // TypeScript, all fields are optional account: string // "CA:user@example.com" email: string region: string // "US" or "CA" maxJobs: number // 1-50 sessionExpires: string // ISO 8601 timestamp session: { expires: string // ISO 8601 timestamp lastRefreshed: string // ISO 8601 timestamp daysUntilExpiry: number } models: { video: string[] // Available video model names image: string[] // Available image model names } credits: { total: number vip: number gift: number purchase: number dailyClaimed: boolean } error?: string // Error message } ``` ### Examples **Curl** ``` bash curl -H "Accept: application/json" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -X POST "https://api.useapi.net/v1/dreamina/accounts" \ -d '{ "email": "user@example.com", "password": "your-password", "region": "CA" }' ``` **JavaScript** ``` javascript const apiUrl = 'https://api.useapi.net/v1/dreamina/accounts'; const token = 'YOUR_API_TOKEN'; const response = await fetch(apiUrl, { method: 'POST', headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' }, body: JSON.stringify({ email: 'user@example.com', password: 'your-password', region: 'CA' }) }); const result = await response.json(); console.log('Account configured:', result); ``` **Python** ``` python import requests apiUrl = 'https://api.useapi.net/v1/dreamina/accounts' token = 'YOUR_API_TOKEN' headers = { 'Content-Type': 'application/json', 'Authorization': f'Bearer {token}' } body = { 'email': 'user@example.com', 'password': 'your-password', 'region': 'CA' } response = requests.post(apiUrl, headers=headers, json=body) print(response.status_code, response.json()) ``` ### Try It
=== URL: https://useapi.net/docs/api-dreamina-v1/post-dreamina-assets-account === Document URL: https://useapi.net/docs/api-dreamina-v1/post-dreamina-assets-account ## Upload Assets February 23, 2026 (April 3, 2026) --- Upload images, videos, and audio files to Dreamina for use in video and image generation. **Images** (max 10 MB): | Content-Type | File Extension | | ------------ | -------------- | | image/jpeg | jpeg, jpg | | image/png | png | | image/webp | webp | **Videos** (max 50 MB, 2-15.4 seconds, 200-2160px): | Content-Type | File Extension | | ------------ | -------------- | | video/mp4 | mp4 | | video/quicktime | mov | | video/webm | webm | **Audio** (max 15 MB, 2-15 seconds): | Content-Type | File Extension | | ------------ | -------------- | | audio/mpeg | mp3 | | audio/mp3 | mp3 | | audio/wav | wav | | audio/mp4 | m4a | | audio/aac | aac | The returned `assetRef` is used as: - **Images:** `firstFrameRef`, `endFrameRef`, `frame_N_imageRef`, or `omni_N_imageRef` in [POST /videos](/docs/api-dreamina-v1/post-dreamina-videos), and `imageRef_N` in [POST /images](/docs/api-dreamina-v1/post-dreamina-images). - **Videos:** `omni_N_videoRef` in [POST /videos](/docs/api-dreamina-v1/post-dreamina-videos) Omni Reference mode (max 3 per request, total duration max 15.4s). - **Audio:** `omni_N_audioRef` in [POST /videos](/docs/api-dreamina-v1/post-dreamina-videos) Omni Reference mode (max 3 per request, total duration max 15s). > **https://api.useapi.net/v1/dreamina/assets/`account`** ### Request Headers ``` yaml Authorization: Bearer {API token} Content-Type: select from the table above ``` - `API token` is **required**, see [Setup useapi.net](/docs/start-here/setup-useapi) for details. - `Content-Type` is **required**, see table above. ### Path Parameters - `account` is **required**. ### Request Body Binary image content (raw bytes). ### Responses **200** **200 OK** Asset uploaded successfully. Returns the `assetRef` for use in video and image generation. **Image response:** ```json { "assetRef": "CA:user@example.com-image:w2560:h1440:s580914-uri:tos-alisg-i-wopfjsm1ax-sg/abc123", "account": "CA:user@example.com", "width": 2560, "height": 1440, "size": 580914 } ``` **Video response:** ```json { "assetRef": "CA:user@example.com-video:w1070:h1904:s1656759:d5880-vid:v10762g50003d77lv1nog65ie0vi8oh0", "account": "CA:user@example.com", "type": "video", "width": 1070, "height": 1904, "duration": 5880, "size": 1656759 } ``` **Audio response:** ```json { "assetRef": "CA:user@example.com-audio:w480:h360:s562605:d14040-vid:v10762g50003d77l5uvog65nl4esjs2g", "account": "CA:user@example.com", "type": "audio", "duration": 14040, "size": 562605 } ``` - `assetRef` - Reference ID for use in generation endpoints. - `type` - Asset type: `image`, `video`, or `audio` (omitted for images for backward compatibility). - `width` - Width in pixels (images and videos). - `height` - Height in pixels (images and videos). - `duration` - Duration in milliseconds (videos and audio). - `size` - File size in bytes. - `account` - Account used for the upload. **assetRef formats:** - Image: `-image:w:h:s-uri:` - Video: `-video:w:h:s:d-vid:` - Audio: `-audio:w:h:s:d-vid:` **400** **400 Bad Request** Invalid request (empty content, unsupported content type, file too large, or duration out of range). ```json { "error": "Content-Type (image/bmp) not supported. Valid values: image/jpeg, image/png, image/webp, video/mp4, video/quicktime, video/webm, audio/mpeg, audio/mp3, audio/wav, audio/x-wav, audio/mp4, audio/aac" } ``` ```json { "error": "video exceeds 50MB limit (52.1MB)" } ``` ```json { "error": "Audio duration 16.5s exceeds 15s limit" } ``` **401** **401 Unauthorized** Invalid API token. ```json { "error": "Unauthorized" } ``` **404** **404 Not Found** Account not found or not configured. ```json { "error": "Unable to find configuration for account US:user@example.com" } ``` **596** **596 Session Error** Account session expired. Re-add the account using [POST /accounts](/docs/api-dreamina-v1/post-dreamina-accounts) with correct credentials. ```json { "error": "Session expired" } ``` ### Model ```typescript { assetRef: string // Reference ID for POST /videos and POST /images account: string // "CA:user@example.com" type?: string // "image", "video", or "audio" (omitted for images) width?: number // Width in pixels (images and videos) height?: number // Height in pixels (images and videos) duration?: number // Duration in milliseconds (videos and audio) size?: number // File size in bytes imageRef?: string // Legacy alias for assetRef (backward compatibility, images only) error?: string // Error message } ``` ### Examples **Curl** ``` bash curl -X POST \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: image/jpeg" \ --data-binary @/path/to/your/image.jpeg \ "https://api.useapi.net/v1/dreamina/assets/US:user@example.com" ``` **JavaScript** ``` javascript const token = 'YOUR_API_TOKEN'; const account = 'US:user@example.com'; const apiUrl = `https://api.useapi.net/v1/dreamina/assets/${encodeURIComponent(account)}`; // Load image - Example 1: From local file (Node.js) const fsp = require('fs').promises; const blob = new Blob([await fsp.readFile('./image.jpeg')]); // Load image - Example 2: From file input element // const imageFile = document.getElementById('image-file'); // const blob = imageFile.files[0]; const response = await fetch(apiUrl, { method: 'POST', headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': blob.type || 'image/jpeg' }, body: blob }); const result = await response.json(); console.log('Upload result:', result); console.log('assetRef:', result.assetRef); ``` **Python** ``` python import requests from urllib.parse import quote token = 'YOUR_API_TOKEN' account = 'US:user@example.com' api_url = f'https://api.useapi.net/v1/dreamina/assets/{quote(account, safe="")}' with open('./image.jpeg', 'rb') as image_file: file_content = image_file.read() headers = { 'Authorization': f'Bearer {token}', 'Content-Type': 'image/jpeg' } response = requests.post(api_url, headers=headers, data=file_content) result = response.json() print('Upload result:', result) print('assetRef:', result.get('assetRef')) ``` ### Try It
=== URL: https://useapi.net/docs/api-dreamina-v1/post-dreamina-images-upscale === Document URL: https://useapi.net/docs/api-dreamina-v1/post-dreamina-images-upscale ## Upscale Image March 2, 2026 --- Upscale a generated image to higher resolution (2K, 4K, or 8K). Requires a completed image generation job from [POST /images](/docs/api-dreamina-v1/post-dreamina-images). Upscale is asynchronous — poll [GET /images/`jobid`](/docs/api-dreamina-v1/get-dreamina-images-jobid) for the result. > **https://api.useapi.net/v1/dreamina/images/upscale** ### Request Headers ``` yaml Authorization: Bearer {API token} Content-Type: application/json ``` - `API token` is **required**, see [Setup useapi.net](/docs/start-here/setup-useapi) for details. ### Request Body ```json { "jobid": "j0302140530123456789i-u12345-US:user@example.com-bot:dreamina", "imageIndex": 0, "upscaleResolution": "4k" } ``` - `jobid` is **required**. The job ID of a completed image generation job from [POST /images](/docs/api-dreamina-v1/post-dreamina-images). - `imageIndex` is optional. Index of the image to upscale from the source job (0-3, default: `0`). Each generation produces up to 4 images. - `upscaleResolution` is optional. Target resolution (default: `4k`). Supported values: `2k`, `4k`, `8k`. - `originalImageStrength` is optional. How much of the original image to preserve (0-1, default: `0.65`). - `detailStrength` is optional. Detail enhancement level (0-1, default: `0.5`). - `replyUrl` is optional, webhook URL for job status callbacks. Callback body has the same JSON shape as [GET /images/`jobid`](/docs/api-dreamina-v1/get-dreamina-images-jobid) response. - `replyRef` is optional, custom reference string passed back in webhook callbacks. - `maxJobs` is optional, override max concurrent jobs for this request (1-50). ### Responses **200** **200 OK** Upscale job created. Poll [GET /images/`jobid`](/docs/api-dreamina-v1/get-dreamina-images-jobid) for the result. ```json { "jobid": "j0302140630123456789I-u12345-US:user@example.com-bot:dreamina", "type": "upscale", "status": "created", "model": "seedream-4.0", "created": "2026-03-02T14:06:30.123Z", "request": { "jobid": "j0302140530123456789i-u12345-US:user@example.com-bot:dreamina", "imageIndex": 0, "resolution": "4k" }, "response": { "forecastCost": 0 }, "code": 200 } ``` **400** **400 Bad Request** Validation error. ```json { "error": "Parameter jobid is required" } ``` ```json { "error": "Source image job is created, must be completed" } ``` **401** **401 Unauthorized** Invalid API token. ```json { "error": "Unauthorized" } ``` **404** **404 Not Found** Source image job not found. ```json { "error": "Source image job not found" } ``` ### Examples **Curl** ``` bash curl -X POST \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "jobid": "j0302140530123456789i-u12345-US:user@example.com-bot:dreamina", "imageIndex": 0, "upscaleResolution": "4k" }' \ "https://api.useapi.net/v1/dreamina/images/upscale" ``` **JavaScript** ``` javascript const token = 'YOUR_API_TOKEN'; const response = await fetch('https://api.useapi.net/v1/dreamina/images/upscale', { method: 'POST', headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' }, body: JSON.stringify({ jobid: 'j0302140530123456789i-u12345-US:user@example.com-bot:dreamina', imageIndex: 0, upscaleResolution: '4k' }) }); const result = await response.json(); console.log('Upscale job:', result.jobid); // Poll for completion const poll = async (jobid) => { while (true) { const res = await fetch(`https://api.useapi.net/v1/dreamina/images/${jobid}`, { headers: { 'Authorization': `Bearer ${token}` } }); const job = await res.json(); if (job.status === 'completed') { console.log('Upscaled:', job.response.images[0].width, 'x', job.response.images[0].height); return job; } if (job.status === 'failed') throw new Error(job.error); await new Promise(r => setTimeout(r, 10000)); } }; await poll(result.jobid); ``` **Python** ``` python import requests import time token = 'YOUR_API_TOKEN' response = requests.post( 'https://api.useapi.net/v1/dreamina/images/upscale', headers={ 'Authorization': f'Bearer {token}', 'Content-Type': 'application/json' }, json={ 'jobid': 'j0302140530123456789i-u12345-US:user@example.com-bot:dreamina', 'imageIndex': 0, 'upscaleResolution': '4k' } ) result = response.json() print(f"Upscale job: {result['jobid']}") # Poll for completion jobid = result['jobid'] while True: job = requests.get( f'https://api.useapi.net/v1/dreamina/images/{jobid}', headers={'Authorization': f'Bearer {token}'} ).json() if job['status'] == 'completed': img = job['response']['images'][0] print(f"Upscaled: {img['width']}x{img['height']}") break if job['status'] == 'failed': raise Exception(job.get('error')) time.sleep(10) ``` ### Try It
=== URL: https://useapi.net/docs/api-dreamina-v1/post-dreamina-images === Document URL: https://useapi.net/docs/api-dreamina-v1/post-dreamina-images ## Generate Images March 4, 2026 (April 2, 2026) --- Generate images using Dreamina AI models from text prompts with optional reference images. All image generation is asynchronous — this endpoint returns immediately with a job ID. Poll [GET /images/`jobid`](/docs/api-dreamina-v1/get-dreamina-images-jobid) for completion, or use `replyUrl` webhook for automatic callbacks. Each generation produces up to 4 images. Generation typically completes within 15-120 seconds depending on the model and resolution. ### Models (US and CA regions) | Model | Resolutions | Default | Max Refs | Prompt Required | Auto Ratio | |-------|-------------|---------|----------|-----------------|------------| | `seedream-5.0-lite`
(**free**) | 2k, 4k | 2k | 6 | No
(imageRef_x only) | Yes | | `seedream-4.6`
(default, **free**) | 2k, 4k | 2k | 6 | No
(imageRef_x only) | Yes | | `seedream-4.5` | 2k, 4k | 2k | 6 | No
(imageRef_x only) | Yes | | `seedream-4.1` | 2k, 4k | 2k | 6 | No
(imageRef_x only) | Yes | | `seedream-4.0`
(**free**) | 2k, 4k | 2k | 6 | No
(imageRef_x only) | Yes | | `nano-banana` | 1k | 1k | 3 | Yes | Yes | | `seedream-3.0` | 1k, 2k | 1k | 1 | Yes | No | > **https://api.useapi.net/v1/dreamina/images** ### Request Headers ``` yaml Authorization: Bearer {API token} Content-Type: application/json # Alternatively you can use multipart/form-data # Content-Type: multipart/form-data ``` - `API token` is **required**, see [Setup useapi.net](/docs/start-here/setup-useapi) for details. ### Request Body ```json { "prompt": "A stunning aurora borealis over a frozen lake at midnight", "model": "seedream-4.6", "ratio": "16:9", "resolution": "2k" } ``` - `account` is optional. Specific account to use. Auto-selected (random with available capacity) if omitted. Not needed when `imageRef_N` provided — account is derived from the reference. - `prompt` is **required**, optional when model supports `imageRef_N`. Maximum 1600 characters. - `model` is optional, see [Models](#models-us-and-ca-regions) above. - `ratio` is optional, image aspect ratio (default: `auto` for models that support it, `1:1` otherwise). Supported values: `auto`, `1:1`, `3:4`, `16:9`, `4:3`, `9:16`, `2:3`, `3:2`, `21:9`. - `resolution` is optional, output resolution tier (default depends on model — see Model Capabilities). Supported values: `1k`, `2k`, `4k`. - `imageRef_1`…`imageRef_6` are optional. Reference images from [POST /assets/`account`](/docs/api-dreamina-v1/post-dreamina-assets-account) or completed image job `assetRef`. Must be contiguous, max per model see [Models](#models-us-and-ca-regions). - `imageStrength` is optional, reference image influence strength (0-1, default: `0.5`). - `replyUrl` is optional, webhook URL for job status callbacks. Callback body has the same JSON shape as [GET /images/`jobid`](/docs/api-dreamina-v1/get-dreamina-images-jobid) response. - `replyRef` is optional, custom reference string passed back in webhook callbacks. - `maxJobs` is optional, override max concurrent jobs for this request (1-50). ### Responses **200** **200 OK** Job created successfully. Images are generating in the background. ```json { "jobid": "j0302140530123456789i-u12345-US:user@example.com-bot:dreamina", "type": "image", "status": "created", "model": "seedream-4.6", "created": "2026-03-02T14:05:30.123Z", "request": { "prompt": "A stunning aurora borealis over a frozen lake at midnight", "model": "seedream-4.6", "ratio": "16:9", "resolution": "2k", "inputMode": "generate", "replyUrl": "https://your-domain.com/webhook", "replyRef": "my-ref-123" }, "response": { "forecastCost": 0 }, "code": 200 } ``` Poll [GET /images/`jobid`](/docs/api-dreamina-v1/get-dreamina-images-jobid) for completion status, or use `replyUrl` for webhook callbacks. **400** **400 Bad Request** Validation error. ```json { "error": "Parameter model (invalid-model) valid values: seedream-5.0-lite, seedream-4.6, seedream-4.5, seedream-4.1, seedream-4.0, nano-banana, seedream-3.0" } ``` **401** **401 Unauthorized** Invalid API token. ```json { "error": "Unauthorized" } ``` **429** **429 Too Many Requests** All accounts at maximum capacity. ```json { "error": "All accounts at capacity" } ``` ### Model ```typescript { jobid: string // Unique job identifier type: 'image' // Job type status: 'created' // Initial status model: string // Model used created: string // ISO 8601 timestamp request: { prompt?: string model: string ratio?: string resolution?: string inputMode: string // Auto-detected from params imageRef_1?: string // Reference image assetRef (when provided) imageRef_2?: string imageRef_3?: string replyUrl?: string replyRef?: string } response: { forecastCost: number // Estimated credit cost } code: number // HTTP status code error?: string } ``` ### Examples **Curl** ``` bash # Text-to-image curl -X POST \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "prompt": "A stunning aurora borealis over a frozen lake", "model": "seedream-4.6", "ratio": "16:9", "resolution": "2k" }' \ "https://api.useapi.net/v1/dreamina/images" # With reference image curl -X POST \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "prompt": "A dreamy reinterpretation with soft pastel colors", "model": "seedream-4.1", "imageRef_1": "US:user@example.com-image:w685:h900:s86866-uri:tos-useast5-i-wopfjsm1ax-tx/abc123", "imageStrength": 0.5 }' \ "https://api.useapi.net/v1/dreamina/images" ``` **JavaScript** ``` javascript const token = 'YOUR_API_TOKEN'; const apiUrl = 'https://api.useapi.net/v1/dreamina/images'; // Text-to-image const response = await fetch(apiUrl, { method: 'POST', headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' }, body: JSON.stringify({ prompt: 'A stunning aurora borealis over a frozen lake', model: 'seedream-4.6', ratio: '16:9', resolution: '2k' }) }); const result = await response.json(); console.log('Job created:', result.jobid); // Poll for completion const poll = async (jobid) => { while (true) { const res = await fetch(`https://api.useapi.net/v1/dreamina/images/${jobid}`, { headers: { 'Authorization': `Bearer ${token}` } }); const job = await res.json(); console.log('Status:', job.status); if (job.status === 'completed') { console.log('Images:', job.response.images.length); job.response.images.forEach((img, i) => console.log(` [${i}] ${img.width}x${img.height} ${img.imageUrl}`) ); return job; } if (job.status === 'failed') throw new Error(job.error); await new Promise(r => setTimeout(r, 10000)); } }; const completed = await poll(result.jobid); ``` **Python** ``` python import requests import time token = 'YOUR_API_TOKEN' api_url = 'https://api.useapi.net/v1/dreamina/images' headers = { 'Authorization': f'Bearer {token}', 'Content-Type': 'application/json' } # Text-to-image data = { 'prompt': 'A stunning aurora borealis over a frozen lake', 'model': 'seedream-4.6', 'ratio': '16:9', 'resolution': '2k' } response = requests.post(api_url, headers=headers, json=data) result = response.json() print(f"Job created: {result['jobid']}") # Poll for completion jobid = result['jobid'] while True: job = requests.get( f'https://api.useapi.net/v1/dreamina/images/{jobid}', headers={'Authorization': f'Bearer {token}'} ).json() print(f"Status: {job['status']}") if job['status'] == 'completed': for i, img in enumerate(job['response']['images']): print(f" [{i}] {img['width']}x{img['height']} {img['imageUrl']}") break if job['status'] == 'failed': raise Exception(job.get('error')) time.sleep(10) ``` ### Try It
=== URL: https://useapi.net/docs/api-dreamina-v1/post-dreamina-videos-interpolate === Document URL: https://useapi.net/docs/api-dreamina-v1/post-dreamina-videos-interpolate ## Interpolate Video April 2, 2026 --- Interpolate a generated video to higher frame rate (30 or 60 FPS from the original 24 FPS). Creates smoother motion by generating intermediate frames. Requires a completed video generation or video upscale job. Each video can only be interpolated once. You can interpolate both original and upscaled videos. Interpolation is asynchronous — poll [GET /videos/`jobid`](/docs/api-dreamina-v1/get-dreamina-videos-jobid) for the result. > **https://api.useapi.net/v1/dreamina/videos/interpolate** ### Request Headers ``` yaml Authorization: Bearer {API token} Content-Type: application/json ``` - `API token` is **required**, see [Setup useapi.net](/docs/start-here/setup-useapi) for details. ### Request Body ```json { "jobid": "j0302140530123456789v-u12345-CA:user@example.com-bot:dreamina", "fps": 60 } ``` - `jobid` is **required**. The job ID of a completed video generation job from [POST /videos](/docs/api-dreamina-v1/post-dreamina-videos) or a completed video upscale job from [POST /videos/upscale](/docs/api-dreamina-v1/post-dreamina-videos-upscale). - `fps` is **required**. Target frame rate. Supported values: `30`, `60`. - `replyUrl` is optional, webhook URL for job status callbacks. Callback body has the same JSON shape as [GET /videos/`jobid`](/docs/api-dreamina-v1/get-dreamina-videos-jobid) response. - `replyRef` is optional, custom reference string passed back in webhook callbacks. - `maxJobs` is optional, override max concurrent jobs for this request (1-50). ### Responses **200** **200 OK** Interpolation job created. Poll [GET /videos/`jobid`](/docs/api-dreamina-v1/get-dreamina-videos-jobid) for the result. ```json { "jobid": "j0302140630123456789F-u12345-CA:user@example.com-bot:dreamina", "type": "video-interpolate", "status": "created", "model": "seedance-2.0-fast", "created": "2026-04-02T10:06:30.123Z", "request": { "jobid": "j0302140530123456789v-u12345-CA:user@example.com-bot:dreamina", "fps": 60 }, "response": { "forecastCost": 66 }, "code": 200 } ``` **400** **400 Bad Request** Validation error. ```json { "error": "Source video job is created, must be completed" } ``` ```json { "error": "Source video already interpolated: j0302140630123456789F-u12345-CA:user@example.com-bot:dreamina" } ``` ```json { "error": "Parameter fps (24) valid values: 30, 60" } ``` **401** **401 Unauthorized** Invalid API token. ```json { "error": "Unauthorized" } ``` **404** **404 Not Found** Source video job not found. ```json { "error": "Source video job not found" } ``` ### Examples **Curl** ``` bash # Interpolate a generated video to 60 FPS curl -X POST \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "jobid": "YOUR_COMPLETED_VIDEO_JOBID", "fps": 60 }' \ "https://api.useapi.net/v1/dreamina/videos/interpolate" # Interpolate an upscaled video to 30 FPS curl -X POST \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "jobid": "YOUR_COMPLETED_UPSCALE_JOBID", "fps": 30 }' \ "https://api.useapi.net/v1/dreamina/videos/interpolate" ``` **JavaScript** ``` javascript const token = 'YOUR_API_TOKEN'; const response = await fetch('https://api.useapi.net/v1/dreamina/videos/interpolate', { method: 'POST', headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' }, body: JSON.stringify({ jobid: 'YOUR_COMPLETED_VIDEO_JOBID', fps: 60 }) }); const result = await response.json(); console.log('Interpolate job:', result.jobid); // Poll for completion 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 URL:', 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); ``` **Python** ``` python import requests import time token = 'YOUR_API_TOKEN' response = requests.post( 'https://api.useapi.net/v1/dreamina/videos/interpolate', headers={ 'Authorization': f'Bearer {token}', 'Content-Type': 'application/json' }, json={ 'jobid': 'YOUR_COMPLETED_VIDEO_JOBID', 'fps': 60 } ) result = response.json() print(f"Interpolate job: {result['jobid']}") # Poll for completion 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': print(f"Video URL: {job['response']['videoUrl']}") break if job['status'] == 'failed': raise Exception(job.get('error')) time.sleep(10) ``` ### Try It
=== URL: https://useapi.net/docs/api-dreamina-v1/post-dreamina-videos-upscale === Document URL: https://useapi.net/docs/api-dreamina-v1/post-dreamina-videos-upscale ## Upscale Video April 2, 2026 --- Upscale a generated video to 2x resolution (super resolution). Doubles both width and height — for example, 720p (1280x720) becomes 1440p (2560x1440), and 1080p (1920x1080) becomes 4K (3840x2160). Requires a completed video generation job from [POST /videos](/docs/api-dreamina-v1/post-dreamina-videos). Each video can only be upscaled once. Upscale is asynchronous — poll [GET /videos/`jobid`](/docs/api-dreamina-v1/get-dreamina-videos-jobid) for the result. > **https://api.useapi.net/v1/dreamina/videos/upscale** ### Request Headers ``` yaml Authorization: Bearer {API token} Content-Type: application/json ``` - `API token` is **required**, see [Setup useapi.net](/docs/start-here/setup-useapi) for details. ### Request Body ```json { "jobid": "j0302140530123456789v-u12345-CA:user@example.com-bot:dreamina" } ``` - `jobid` is **required**. The job ID of a completed video generation job from [POST /videos](/docs/api-dreamina-v1/post-dreamina-videos). Must be a video generation job (not an upscale job). - `replyUrl` is optional, webhook URL for job status callbacks. Callback body has the same JSON shape as [GET /videos/`jobid`](/docs/api-dreamina-v1/get-dreamina-videos-jobid) response. - `replyRef` is optional, custom reference string passed back in webhook callbacks. - `maxJobs` is optional, override max concurrent jobs for this request (1-50). ### Responses **200** **200 OK** Upscale job created. Poll [GET /videos/`jobid`](/docs/api-dreamina-v1/get-dreamina-videos-jobid) for the result. ```json { "jobid": "j0302140630123456789V-u12345-CA:user@example.com-bot:dreamina", "type": "video-upscale", "status": "created", "model": "seedance-2.0-fast", "created": "2026-04-02T00:24:24.535Z", "request": { "jobid": "j0302140530123456789v-u12345-CA:user@example.com-bot:dreamina" }, "response": { "forecastCost": 30 }, "code": 200 } ``` **400** **400 Bad Request** Validation error. ```json { "error": "Source video job is created, must be completed" } ``` ```json { "error": "Source video already upscaled: j0302140630123456789V-u12345-CA:user@example.com-bot:dreamina" } ``` **401** **401 Unauthorized** Invalid API token. ```json { "error": "Unauthorized" } ``` **404** **404 Not Found** Source video job not found. ```json { "error": "Source video job not found" } ``` ### Examples **Curl** ``` bash curl -X POST \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "jobid": "YOUR_COMPLETED_VIDEO_JOBID" }' \ "https://api.useapi.net/v1/dreamina/videos/upscale" ``` **JavaScript** ``` javascript const token = 'YOUR_API_TOKEN'; const response = await fetch('https://api.useapi.net/v1/dreamina/videos/upscale', { method: 'POST', headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' }, body: JSON.stringify({ jobid: 'YOUR_COMPLETED_VIDEO_JOBID' }) }); const result = await response.json(); console.log('Upscale job:', result.jobid); // Poll for completion 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('Upscaled:', job.response.width, 'x', job.response.height); console.log('Video URL:', 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); ``` **Python** ``` python import requests import time token = 'YOUR_API_TOKEN' response = requests.post( 'https://api.useapi.net/v1/dreamina/videos/upscale', headers={ 'Authorization': f'Bearer {token}', 'Content-Type': 'application/json' }, json={ 'jobid': 'YOUR_COMPLETED_VIDEO_JOBID' } ) result = response.json() print(f"Upscale job: {result['jobid']}") # Poll for completion 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"Upscaled: {r['width']}x{r['height']}") print(f"Video URL: {r['videoUrl']}") break if job['status'] == 'failed': raise Exception(job.get('error')) time.sleep(10) ``` ### Try It
=== URL: https://useapi.net/docs/api-dreamina-v1/post-dreamina-videos === Document URL: https://useapi.net/docs/api-dreamina-v1/post-dreamina-videos ## Generate Videos February 23, 2026 (April 17, 2026) --- Generate videos using Dreamina AI models from text prompts with optional image frames. All video generation is asynchronous — this endpoint returns immediately with a job ID. Poll [GET /videos/`jobid`](/docs/api-dreamina-v1/get-dreamina-videos-jobid) for completion, or use `replyUrl` webhook for automatic callbacks. Video generation typically completes within 60-180 seconds depending on the model and duration. ### Input Modes The input mode is automatically determined from the provided parameters: | Mode | API Value | Trigger | Description | |------|-----------|---------|-------------| | Prompt | `prompt` | No image refs | Text-to-video generation | | First Frame | `first_frame` | `firstFrameRef` provided | Video starts from uploaded image | | First/Last Frame | `end_frame` | `firstFrameRef` + `endFrameRef` | Video transitions between two images | | Multi-Frame | `multi_frame` | `frame_N_imageRef` params | 2-10 keyframe images with per-frame prompts | | Omni Reference | `unified_edit` | `omni_N_imageRef`/`omni_N_videoRef`/`omni_N_audioRef` in prompt | Interleaved text, image, video, and audio references (Seedance 2.0 only) | > **Aspect ratio auto-detection:** When using `first_frame` or `end_frame` modes, the video aspect ratio is automatically detected from the uploaded image dimensions. The `ratio` parameter cannot be specified with image refs — the closest standard ratio (21:9, 16:9, 4:3, 1:1, 3:4, 9:16) is used. When using `firstFrameRef` + `endFrameRef`, both images must have the same aspect ratio. ### Model Capabilities | Model | Region | Durations | Resolution | Input Modes | |-------|--------|-----------|------------|-------------| | `seedance-2.0` | US, CA | 4-15s | 720p, 1080p (CA only as of April 17) | Prompt, First/Last Frame, Omni Reference | | `seedance-2.0-fast` | US, CA | 4-15s | 720p | Prompt, First/Last Frame, Omni Reference | | `seedance-1.5-pro` | US, CA | 5, 10, 12s | 720p, 1080p | Prompt, First/Last Frame | | `seedance-1.0-pro` | CA | 5, 10s | 1080p | Prompt, First Frame | | `seedance-1.0-mini` | US, CA | 5, 10s | 720p, 1080p | Prompt, First Frame, Multi-Frame | | `seedance-1.0-fast` | CA | 5, 10s | 720p, 1080p | Prompt, First Frame, Multi-Frame | | `sora2` | CA | 4, 8, 12s | 720p | Prompt, First Frame | 720p works on both regions; 1080p is CA-only as of April 17, 2026. See [Setup Dreamina](/docs/start-here/setup-dreamina) for per-region setup and pricing. > **Seedance 2.0 / 2.0 Fast:** Real human faces are not supported and may be rejected by content moderation. Use illustrated, anime, or stylized characters instead. For a working real-face workflow, see the [Seedance 2.0 — real-face tutorial (Runway & Dreamina)](/blog/260415) — it uses Runway to generate the real-face start frame and Dreamina Seedance 2.0 for the motion, sidestepping Dreamina's direct content moderation. > **https://api.useapi.net/v1/dreamina/videos** ### Request Headers ``` yaml Authorization: Bearer {API token} Content-Type: application/json # Alternatively you can use multipart/form-data # Content-Type: multipart/form-data ``` - `API token` is **required**, see [Setup useapi.net](/docs/start-here/setup-useapi) for details. ### Request Body ```json { "prompt": "A serene mountain landscape at sunset with camera slowly panning right", "model": "seedance-2.0", "ratio": "16:9", "duration": 5 } ``` - `account` is optional. Specific account to use. Auto-inferred from image refs if provided. Auto-selected (random with available capacity) if omitted. - `prompt` is **required** for `prompt` mode. Optional for `first_frame` and `end_frame`. Cannot be used with `multi_frame` mode (use `frame_N_prompt` instead). Maximum 5000 characters. - `model` is optional, the AI model to use (default: `seedance-2.0`). Available models depend on account region — see Model Capabilities table. - `ratio` is optional, video aspect ratio (default: `16:9`). Cannot be specified when image refs are provided (image aspect ratio is used). - `duration` is optional, video duration in seconds (default: `5`). Valid values depend on model — see Model Capabilities table. - `resolution` is optional, output resolution: `720p` or `1080p` (default: `720p`). Supported by `seedance-2.0` (CA accounts only at 1080p), `seedance-1.5-pro`, `seedance-1.0-mini`, and `seedance-1.0-fast`. Model `seedance-1.0-pro` is always `1080p`. `seedance-2.0-fast` and `sora2` are 720p only. - `firstFrameRef` is optional, `imageRef` from [POST /assets/`account`](/docs/api-dreamina-v1/post-dreamina-assets-account) for the starting frame. Triggers `first_frame` mode. - `endFrameRef` is optional, `imageRef` for the ending frame. Triggers `end_frame` mode. Requires `firstFrameRef`. - `frame_N_imageRef` is optional (N=1-10), `imageRef` for keyframe N. Triggers `multi_frame` mode when at least 2 frames are provided. - `frame_N_prompt` is optional, per-frame prompt for multi_frame mode. Maximum 5000 characters. - `frame_N_duration` is optional, per-frame duration in seconds for multi_frame mode (1-6, default: `5`). - `replyUrl` is optional, webhook URL for job status callbacks. Receives POST requests with the job record on submission and on completion/failure. Callback body has the same JSON shape as [GET /videos/`jobid`](/docs/api-dreamina-v1/get-dreamina-videos-jobid) response. - `replyRef` is optional, custom reference string passed back in webhook callbacks. - `omni_N_imageRef` is optional (N=1-9), `assetRef` (image type) for inline image in Omni Reference mode. Reference in the prompt using `@imageN` (e.g., `"Make @image1 dance with @image2"`). Requires Seedance 2.0 or 2.0 Fast. - `omni_N_videoRef` is optional (N=1-3), `assetRef` (video type) for inline video in Omni Reference mode. Upload video via [POST /assets/`account`](/docs/api-dreamina-v1/post-dreamina-assets-account) with `Content-Type: video/mp4`. Reference in the prompt using `@videoN` (e.g., `"@image1 moving like @video1"`). - `omni_N_audioRef` is optional (N=1-3), `assetRef` (audio type) for inline audio in Omni Reference mode. Upload audio via [POST /assets/`account`](/docs/api-dreamina-v1/post-dreamina-assets-account) with `Content-Type: audio/mpeg`. Reference in the prompt using `@audioN` (e.g., `"@image1 dancing while @audio1 plays"`). - `maxJobs` is optional, override max concurrent jobs for this request (1-50). **Omni Reference constraints:** - Only supported by `seedance-2.0` and `seedance-2.0-fast` models - Prompt must contain `@imageN`, `@videoN`, and/or `@audioN` placeholders matching the provided `omni_N_*Ref` params - Maximum 9 image references, 3 video references, and 3 audio references per request - Maximum 12 total materials combined - Total video duration across all `omni_N_videoRef` cannot exceed 15.4 seconds - Total audio duration across all `omni_N_audioRef` cannot exceed 15 seconds - Individual video: 2-15.4 seconds, 200-2160px, max 50 MB - Individual audio: 2-15 seconds, max 15 MB - Cannot be combined with `firstFrameRef`, `endFrameRef`, or `frame_N_imageRef` **Multi-frame constraints:** - Minimum 2 frames, maximum 10 frames - No gaps allowed (frame_1 through frame_N must be contiguous) - All frame images must have the same aspect ratio - Top-level `prompt` cannot be used (use `frame_N_prompt` instead) - `firstFrameRef`/`endFrameRef` cannot be combined with multi_frame - Total duration of non-last frames must equal a valid model duration ### Responses **200** **200 OK** Job created successfully. Video is generating in the background. ```json { "jobid": "j0223140530123456789v-u12345-CA:user@example.com-bot:dreamina", "type": "video", "status": "created", "model": "seedance-2.0", "created": "2026-02-23T14:05:30.123Z", "request": { "prompt": "A serene mountain landscape at sunset with camera slowly panning right", "model": "seedance-2.0", "ratio": "16:9", "duration": 5, "inputMode": "prompt" }, "response": { "forecastCost": 125 }, "code": 200 } ``` Poll [GET /videos/`jobid`](/docs/api-dreamina-v1/get-dreamina-videos-jobid) for completion status, or use `replyUrl` for webhook callbacks. **400** **400 Bad Request** Validation error. ```json { "error": "Parameter model (invalid-model) valid values: seedance-2.0, seedance-1.5-pro, seedance-1.0-mini" } ``` **401** **401 Unauthorized** Invalid API token. ```json { "error": "Unauthorized" } ``` **402** **402 Payment Required** Subscription expired or insufficient credits. ```json { "error": "Account has no subscription or subscription expired" } ``` **429** **429 Too Many Requests** All accounts at maximum capacity. Wait for current jobs to complete or increase `maxJobs`. ```json { "error": "All accounts at capacity" } ``` **596** **596 Session Error** Account session expired. Re-add the account using [POST /accounts](/docs/api-dreamina-v1/post-dreamina-accounts) with correct credentials. ```json { "error": "Session expired" } ``` ### Model ```typescript { jobid: string // Unique job identifier type: 'video' // Job type status: 'created' // Initial status model: string // Model used created: string // ISO 8601 timestamp request: { prompt?: string model: string ratio?: string // "16:9", "9:16", etc. duration?: number // Seconds inputMode: string // "prompt" | "first_frame" | "end_frame" | "multi_frame" | "unified_edit" resolution?: string // "720p" or "1080p" firstFrameRef?: string // assetRef (image) for first frame endFrameRef?: string // assetRef (image) for end frame frame_1_imageRef?: string // Keyframe refs (multi_frame mode) frame_1_prompt?: string frame_1_duration?: number frame_2_imageRef?: string frame_2_prompt?: string frame_2_duration?: number omni_1_imageRef?: string // Omni image refs (use @image1 in prompt) omni_2_imageRef?: string omni_1_videoRef?: string // Omni video refs (use @video1 in prompt) omni_1_audioRef?: string // Omni audio refs (use @audio1 in prompt) replyUrl?: string // Webhook URL replyRef?: string // Custom reference } response: { forecastCost: number // Estimated credit cost } code: number // HTTP status code error?: string // Error message } ``` ### Examples **Curl** ``` bash # Text-to-video curl -X POST \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "prompt": "A serene mountain landscape at sunset", "model": "seedance-2.0", "ratio": "16:9", "duration": 5 }' \ "https://api.useapi.net/v1/dreamina/videos" # Image-to-video (first frame — ratio auto-detected from image) curl -X POST \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "prompt": "Camera slowly pans across the scene", "model": "seedance-2.0", "firstFrameRef": "CA:user@example.com-image:w685:h900:s86866-uri:tos-useast5-i-wopfjsm1ax-tx/abc123", "duration": 5 }' \ "https://api.useapi.net/v1/dreamina/videos" # Omni Reference (image + audio) curl -X POST \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "prompt": "@image1 slowly moving forward while @audio1 plays in background", "model": "seedance-2.0", "ratio": "16:9", "duration": 4, "omni_1_imageRef": "CA:user@example.com-image:w2560:h1440:s580914-uri:tos-alisg-i-wopfjsm1ax-sg/abc123", "omni_1_audioRef": "CA:user@example.com-audio:d14040-vid:v10762g50003d77l5uvog65nl4esjs2g" }' \ "https://api.useapi.net/v1/dreamina/videos" ``` **JavaScript** ``` javascript const token = 'YOUR_API_TOKEN'; const apiUrl = 'https://api.useapi.net/v1/dreamina/videos'; // Text-to-video const response = await fetch(apiUrl, { method: 'POST', headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' }, body: JSON.stringify({ prompt: 'A serene mountain landscape at sunset', model: 'seedance-2.0', ratio: '16:9', duration: 5 }) }); const result = await response.json(); console.log('Job created:', result.jobid); // Poll for completion 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(); console.log('Status:', job.status); if (job.status === 'completed') { console.log('Video URL:', job.response.videoUrl); return job; } if (job.status === 'failed') throw new Error(job.error); await new Promise(r => setTimeout(r, 10000)); } }; const completed = await poll(result.jobid); ``` **Python** ``` python import requests import time token = 'YOUR_API_TOKEN' api_url = 'https://api.useapi.net/v1/dreamina/videos' headers = { 'Authorization': f'Bearer {token}', 'Content-Type': 'application/json' } # Text-to-video data = { 'prompt': 'A serene mountain landscape at sunset', 'model': 'seedance-2.0', 'ratio': '16:9', 'duration': 5 } response = requests.post(api_url, headers=headers, json=data) result = response.json() print(f"Job created: {result['jobid']}") # Poll for completion jobid = result['jobid'] while True: job = requests.get( f'https://api.useapi.net/v1/dreamina/videos/{jobid}', headers={'Authorization': f'Bearer {token}'} ).json() print(f"Status: {job['status']}") if job['status'] == 'completed': print(f"Video URL: {job['response']['videoUrl']}") break if job['status'] == 'failed': raise Exception(job.get('error')) time.sleep(10) ``` ### Try It
=== URL: https://useapi.net/docs/start-here/setup-faceswap === Document URL: https://useapi.net/docs/start-here/setup-faceswap # Setup InsightFaceSwap ## Table of contents Approximately 3 minutes to complete setup steps. --- > This is the setup guide for [InsightFaceSwap API](/docs/api-faceswap-v1). A [Discord](https://discord.com) account and a [useapi.net subscription](/docs/subscription) are required for the API to work. ## Create Discord account You need a [Discord](https://discord.com) account to interact with [InsightFaceSwap Discord bot](https://discord.gg/Ym3X8U59ZN). Create a [new account](https://discord.com/register) if you don't have one already. Please note even if you have an existing Discord account we are **strongly** recommending creating a separate Discord account specifically designated to be used with useapi.net API. ## Create Discord server Please log in to your Discord account and create a new Discord server following [official instructions](https://support.discord.com/hc/en-us/articles/204849977-How-do-I-create-a-server-). ## Create `#api` text channel on your Discord server Once you created the Discord server you need to create a designated for API-related work text channel. You can refer to [official instructions](https://support.discord.com/hc/en-us/articles/4412085582359-Text-Channels-Text-Chat-In-Voice-Channels) to learn about Discord channels and how to manage them on your server. We suggest naming the text channel `#api` for clarity and also making that channel private. Please see [Midjourney instructions](https://docs.midjourney.com/docs/invite-the-bot) to learn how you can restrict the bot to a single private channel. ## Join Picsi.Ai - Powered by InsightFace Discord Server Follow Picsi.Ai [instructions](https://github.com/deepinsight/insightface/blob/master/web-demos/swapping_discord/README.md) and join official [Picsi.Ai - Powered by InsightFace Discord Server](https://discord.gg/Ym3X8U59ZN). ## Add InsightFaceSwap bot to your Discord server Please follow [official instructions](https://discord.com/channels/1095014106576212101/1128550062683865178/1189604165006135379) to add InsightFaceSwap bot to your Discord server created earlier. ## Example of Discord server with private `#api` text channel and InsightFace bot Below you can see we created `useapi` Discord server with private `#api` text channel: ![](/assets/images/discord_faceswap_server_setup_example.png) InsightFace bot invited to the server and has access to private `#api` text channel ![](/assets/images/discord_faceswap_channel_setup_example.png) ## Test InsightFace bot Navigate to the created above `#api` text channel and execute few InsightFaceSwap bot command(s) to make sure it works. ## Make a note of your server id and channel id values Your Discord URL looks like `https://discord.com/channels//` In the screenshot above URL is `https://discord.com/channels/1122226477161144546/1122277481822456166` where `1122226477161144546` is your Discord server id and `1122277481822456166` is your private `#api` channel id. Save both server id and channel id values, you will need those numbers for API. ## Obtain Discord token There are many tutorials describing how to obtain Discord tokens. Please refer to the following links bellow for additional guidance: - [How to Find Your Discord Token](https://discordhelp.net/discord-token) - [How To Get Your Discord Token](https://pcstrike.com/how-to-get-discord-token/) - [How to get Discord Token](https://linuxhint.com/get-discord-token/) Keep in mind that anyone with a Discord token can have **full access** to your Discord account so please keep it **safe** and **secure**. To reset your Discord token simply change your Discord password. ## Verify Discord access Once all the above steps are completed you should have the following: - Discord token - Discord server id number - Discord private `#api` channel id number This only verifies that the token, server id and channel id values are correct. To complete setup, you **MUST** proceed to [POST account/`channel`](/docs/api-faceswap-v1/post-faceswap-account-channel) and complete the configuration. ##### Server
##### Channel
=== URL: https://useapi.net/docs/api-faceswap-v1 === Document URL: https://useapi.net/docs/api-faceswap-v1 # InsightFaceSwap API v1 February 2024 This is [experimental](/docs/legal) API for [InsightFaceSwap Discord Bot](https://discord.gg/Ym3X8U59ZN) by [Picsi.Ai](https://www.picsi.ai/). InsightFaceSwap allows users to swap faces from source image(s) onto different target images. It offers free and paid [subscription](https://www.patreon.com/picsi) models. Paid subscribers have access to a wide selection of extra features such as [HiFidelity Mode](https://www.patreon.com/posts/89036144), [ARTIFY](https://www.patreon.com/posts/picsi-ai-v2-0-97389077), oldify/youngify, morphing multiple faces in one image, and [many more](https://discord.com/channels/1095014106576212101/1128550062683865178). [Setup InsightFaceSwap](/docs/start-here/setup-faceswap) [Postman collection](https://www.postman.com/useapinet/useapi-net/collection) (January 20, 2026) [LLM-friendly API spec](https://useapi.net/assets/aibot/api-faceswap-v1.txt) Feed this to your LLM to build integrations Official documentation links: - [Discord support channel](https://discord.com/channels/1095014106576212101/1128550062683865178) - [Patreon support channel](https://www.patreon.com/picsi/posts) - [YouTube channel](https://www.youtube.com/@PicsiAi) #### Example source code on GitHub * [Face swap and animate images generated by Midjourney using InsightFaceSwap and Pika (using webhook)](https://github.com/useapi/examples/tree/main/imagine-faceswap-animate) February 19, 2024 Developer Community: * Discord Server * Telegram Channel * Reddit Group === URL: https://useapi.net/docs/api-faceswap-v1/del-faceswap-account-channel === Document URL: https://useapi.net/docs/api-faceswap-v1/del-faceswap-account-channel ## Delete InsightFaceSwap account --- > **https://api.useapi.net/v1/faceswap/account/`channel`** The `channel` value should correspond to an account configured previously via a [POST](/docs/api-faceswap-v1/post-faceswap-account-channel) request. ##### Request Headers ``` yaml Authorization: Bearer {API token} ``` - `API token` is **required**, see [Setup useapi.net](/docs/start-here/setup-useapi) for details. ##### Responses **204** **204 No Content** **401** **401 Unauthorized** ```json { "error": "Unauthorized", "code": 401 } ``` **404** **404 Not Found** ##### Model ```typescript { // TypeScript, all fields are optional error: string, errorDetails: string, code: number } ``` ##### Examples **Curl** ``` bash curl -H "Accept: application/json" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer …" \ -X DELETE https://api.useapi.net/v1/faceswap/account/ ``` **JavaScript** ``` javascript const channel = "Previously configured channel id"; const apiUrl = `https://api.useapi.net/v1/faceswap/account/${channnel}`; const token = "API token"; const data = { method: 'DELETE', headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' } }; const response = await fetch(apiUrl, data); const result = await response.json(); console.log("response", {response, result}); ``` **Python** ``` python import requests channel = "Previously configured channel id" apiUrl = f"https://api.useapi.net/v1/faceswap/account/{channel}" token = "API token" headers = { "Content-Type": "application/json", "Authorization" : f"Bearer {token}" } response = requests.delete(apiUrl, headers=headers) print(response, response.json()) ``` === URL: https://useapi.net/docs/api-faceswap-v1/del-faceswap-delid === Document URL: https://useapi.net/docs/api-faceswap-v1/del-faceswap-delid ## InsightFaceSwap [/delid](https://github.com/deepinsight/insightface/blob/master/web-demos/swapping_discord/README.md#delid-name) command --- Use this endpoint to submit the InsightFaceSwap [/delid](https://github.com/deepinsight/insightface/blob/master/web-demos/swapping_discord/README.md#delid-name) command to your [InsightFaceSwap Discord channel](/docs/start-here/setup-faceswap). The result will be returned in the response body and can also be sent as a callback to an optional [`replyUrl`](#request-body). This is a blocking call, you will **not** be able to make another call to the same InsightFaceSwap Discord channel until the current call is completed. The average execution time is approximately 3 to 10 seconds. If you expect high load and need to make multiple concurrent calls, please consider setting up [multiple InsightFaceSwap accounts](/docs/api-faceswap-v1/post-faceswap-account-channel). It is **important** not to use the InsightFaceSwap account setup for API access for any purposes other than its intended use, such as executing `/delid` or any other InsightFaceSwap commands _manually_ or in conjunction with _any other_ automation tools. The useapi.net API internally tracks the usage of the InsightFaceSwap account, including the number of currently active executions. Using it for other activities may cause API to function incorrectly. > **https://api.useapi.net/v1/faceswap/delid** ##### Request Headers ``` yaml Authorization: Bearer {API token} Content-Type: multipart/form-data ``` - `API token` is **required**, see [Setup useapi.net](/docs/start-here/setup-useapi) for details. ##### Request Body ```json { "channel": "Discord channel id", "idname": "idname param", } ``` - `channel` is optional when only one [faceswap/account](/docs/api-faceswap-v1/get-faceswap-account) configured. However, if you have multiple accounts configured, this parameter becomes **required**. - `idname` is **required**, please refer to InsightFaceSwap [/delid](https://github.com/deepinsight/insightface/blob/master/web-demos/swapping_discord/README.md#delid-name) for details. - `replyUrl` is optional, if not provided value from [useapi.net account](/docs/account-management/get-account) will be used. Place here your callback URL. API will call the provided `replyUrl` once job completed or failed. Maximum length 1024 characters. We recommend using sites like [webhook.site](https://webhook.site) to test callback URL functionality. - `replyRef` is optional, place here your reference id which will be stored and returned along with this job response / result. Maximum length 1024 characters. ##### Responses **200** **200 OK** Field `content` contains message generated by InsightFaceSwap. ```json { "jobid": "", "verb": "faceswap-delid", "status": "completed", "idname": "me", "created": "2023-09-09T02:04:49.667Z", "updated": "2023-09-09T02:04:53.490Z", "discord": "", "server": "", "channel": "", "replyUrl": "https://webhook.site/abc", "replyRef": "", "messageId": "", "content": "idname me deleted", "timestamp": "2023-09-09T02:04:51.926000+00:00", "code": 200 } ``` **400** **400 Bad Request** ```json { "error": "Required param idname is missing or empty" "Optional param replyRef is too long" "Optional param replyUrl is too long" "Required param channel is missing or empty" "Configuration not found for channel , to create POST v1/faceswap/account/" "code": 400 } ``` **401** **401 Unauthorized** ```json { "error": "Unauthorized", "code": 401 } ``` **402** **402 Payment Required** ```json { "error": "Account has no subscription or subscription expired", "code": 402 } ``` **429** **429 Too Many Requests** Wait in a loop for **at least** 10..30 seconds and retry again. There are two possible cases for API response 429. 1. API query is full and can not accept new [faceswap/delid](#insightfaceswap-delid-command) requests. ```json { "error": "Unable to lock Discord after attempts", "code": 429 } ``` 2. The API received an HTTP status 429 from the Discord API when it attempted to POST to the `/interactions` endpoint. Under normal circumstances, this should be a rare occurrence because the API is designed to strictly adhere to Discord rate limits. However, in certain scenarios, Discord may still issue a 429 response. ```json { "error": "Discord /interactions failed with HTTP status 429", "errorDetails": "{\"global\":true,\"message\":\"You are being rate limited.\",\"retry_after\":10}", "code": 429 } ``` ##### Model ```typescript { // TypeScript, all fields are optional jobid: string, verb: 'faceswap-delid', status: 'completed' | 'failed', idname: string, created: string, // YYYY-MM-DDTHH:mm:ss.sssZ, IS0 8601, UTC updated: string, // YYYY-MM-DDTHH:mm:ss.sssZ, IS0 8601, UTC discord: string, // Provided for debugging purposes only, contains the first 3 and the last 3 characters of the original value server: string, channel: string, replyUrl: string, replyRef: string, messageId: string, content: string, // Contains message generated by InsightFaceSwap timestamp: string, error: string, errorDetails: string, code: number } ``` ##### Examples **Curl** ``` bash curl -H "Accept: application/json" \ -H "Authorization: Bearer …" \ -X DELETE https://api.useapi.net/v1/faceswap/delid \ -F "channel=" \ -F "idname=" ``` **JavaScript** ``` javascript const main = async () => { const apiUrl = "https://api.useapi.net/v1/faceswap/delid"; const token = "API token"; const channel = "Discord channel"; const idname = "idname"; const data = { method: 'DELETE', headers: { 'Authorization': `Bearer ${token}` } }; const formData = new FormData(); formData.append("channel", channel); formData.append("idname", idname); data.body = formData; const response = await fetch(apiUrl, data); const result = await response.json(); console.log("response", { response, result }); }; main() ``` **Python** ``` python import requests api_url = "https://api.useapi.net/v1/faceswap/delid" token = "API token" channel = "Discord channel" idname = "idname" headers = { 'Authorization': f'Bearer {token}' } files = { 'channel': (None, channel), 'idname': (None, idname) } response = requests.delete(api_url, headers=headers, files=files) print(response, response.json()) ``` === URL: https://useapi.net/docs/api-faceswap-v1/get-faceswap-account-channel === Document URL: https://useapi.net/docs/api-faceswap-v1/get-faceswap-account-channel ## Retrieve InsightFaceSwap configuration for `channel` --- > **https://api.useapi.net/v1/faceswap/account/`channel`** The `channel` value should correspond to an account configured previously via a [POST](/docs/api-faceswap-v1/post-faceswap-account-channel) request. ##### Request Headers ``` yaml Authorization: Bearer {API token} Content-Type: application/json ``` - `API token` is **required**, see [Setup useapi.net](/docs/start-here/setup-useapi) for details. ##### Responses **200** **200 OK** ```json { "server": "Discord server id", "channel": "Discord channel id", "discord": "Discord token", "credits": { "timestamp": "2024-02-01T02:05:24.991000+00:00", "total": 50, "used": 18 } } ``` **401** **401 Unauthorized** ```json { "error": "Unauthorized", "code": 401 } ``` **404** **404 Not Found** Configuration not found. To create configuration use [faceswap/account/`channel`](/docs/api-faceswap-v1/post-faceswap-account-channel). ##### Model ```typescript { // TypeScript, all fields are optional discord: string, server: string, channel: string, credits: { timestamp: string, total: number, used: number } } ``` ##### Examples **Curl** ``` bash curl https://api.useapi.net/v1/faceswap/account/ \ -H "Accept: application/json" \ -H "Authorization: Bearer …" ``` **JavaScript** ``` javascript const token = "API token"; const channel = "Previously configured channel id"; const apiUrl = `https://api.useapi.net/v1/faceswap/account/${channel}`; const response = await fetch(apiUrl, { headers: { "Authorization": `Bearer ${token}`, }, }); const result = await response.json(); console.log("response", {response, result}); ``` **Python** ``` python import requests token = "API token" channel = "Previously configured channel id" apiUrl = f"https://api.useapi.net/v1/faceswap/account/{channel}" headers = { "Content-Type": "application/json", "Authorization" : f"Bearer {token}" } response = requests.get(apiUrl, headers=headers) print(response, response.json()) ``` === URL: https://useapi.net/docs/api-faceswap-v1/get-faceswap-account === Document URL: https://useapi.net/docs/api-faceswap-v1/get-faceswap-account ## Retrieve InsightFaceSwap accounts information --- Before you start using the API, you **must** [configure](/docs/start-here/setup-faceswap) at least one InsightFaceSwap Discord account. You may specify multiple InsightFaceSwap accounts, the API will automatically perform load balancing by randomly selecting an account with available credits before making calls to InsightFaceSwap Discord bot. This endpoint retrieves the complete list of configured accounts for InsightFaceSwap. > **https://api.useapi.net/v1/faceswap/account** ##### Request Headers ``` yaml Authorization: Bearer {API token} Content-Type: application/json ``` - `API token` is **required**, see [Setup useapi.net](/docs/start-here/setup-useapi) for details. ##### Responses **200** **200 OK** ```json { "Discord channel A": { "server": "Discord server A", "channel": "Discord channel A", "discord": "Discord token A", "credits": { "timestamp": "2024-02-01T02:05:24.991000+00:00", "total": 50, "used": 18 }, }, "Discord channel B": { "server": "Discord server B", "channel": "Discord channel B", "discord": "Discord token B" }, "Discord channel N": { "server": "Discord server N", "channel": "Discord channel N", "discord": "Discord token N", "credits": { "timestamp": "2024-02-01T03:17:48.159000+00:00", "total": 200, "used": 115 } } } ``` **401** **401 Unauthorized** ```json { "error": "Unauthorized", "code": 401 } ``` **404** **404 Not Found** Configuration not found. To create configuration use [faceswap/account/`channel`](/docs/api-faceswap-v1/post-faceswap-account-channel). ##### Model ```typescript { // TypeScript, all fields are optional [channel: string]: { discord: string, server: string, channel: string, credits: { timestamp: string, total: number, used: number } } } ``` ##### Examples **Curl** ``` bash curl https://api.useapi.net/v1/faceswap/account \ -H "Accept: application/json" \ -H "Authorization: Bearer …" ``` **JavaScript** ``` javascript const token = "API token"; const apiUrl = "https://api.useapi.net/v1/faceswap/account"; const response = await fetch(apiUrl, { headers: { "Authorization": `Bearer ${token}`, }, }); const result = await response.json(); console.log("response", {response, result}); ``` **Python** ``` python import requests token = "API token" apiUrl = "https://api.useapi.net/v1/faceswap/account" headers = { "Content-Type": "application/json", "Authorization" : f"Bearer {token}" } response = requests.get(apiUrl, headers=headers) print(response, response.json()) ``` === URL: https://useapi.net/docs/api-faceswap-v1/get-faceswap-jobid === Document URL: https://useapi.net/docs/api-faceswap-v1/get-faceswap-jobid ## Retrieve InsightFaceSwap job status and results --- Use this endpoint to retrieve status and results of - [faceswap/headshot](/docs/api-faceswap-v1/post-faceswap-headshot) - [faceswap/changebg](/docs/api-faceswap-v1/post-faceswap-changebg) - [faceswap/picsi](/docs/api-faceswap-v1/post-faceswap-picsi) with initial jobs status returned `started` If you specified optional parameter [`replyUrl`](/docs/api-faceswap-v1/post-faceswap-headshot#request-body) you technically do not need to use this endpoint to retrieve results since API will call provided `replyUrl` once job generation completed. **Important** API periodically polls (checks) Discord every 15 to 60 seconds (depending on the load) and updates all currently executed jobs statuses and results. Polling interval is used for safety reasons, aiming to prevent any potential issues with Discord and InsightFaceSwap, such as bans or excessive requests. Jobs lifespan guaranteed to be at least 31 days, after that they will be expired and may be recycled. > **https://api.useapi.net/v1/faceswap/jobs/?jobid=`jobid`** ##### Request Headers ``` yaml Authorization: Bearer {API token} ``` - `API token` is **required**, see [Setup useapi.net](/docs/start-here/setup-useapi) for details. ##### Query Parameter `jobid` is **required**, use value returned by - [faceswap/headshot](/docs/api-faceswap-v1/post-faceswap-headshot) - [faceswap/changebg](/docs/api-faceswap-v1/post-faceswap-changebg) - [faceswap/picsi](/docs/api-faceswap-v1/post-faceswap-picsi) with initial jobs status returned `started` ##### Responses **200** **200 OK** If field `status` value is *created*, *started* or *progress* wait in a loop for **at least** 10..30 seconds and retry again. When completed retrieve generated images or video from `attachments` array. Field `content` contains message generated by InsightFaceSwap reflecting current generation parameters and progress. Optional array `embeds` contains additional information. ```json { "jobid": "", "verb": "faceswap-headshot", "status": "completed", "created": "2023-09-09T02:04:49.667Z", "updated": "2023-09-09T02:19:20.256Z", "prompt": "me, a mad king with an evil smile, wearing medieval royal blue attire and a crown. --no green --square", "discord": "", "server": "", "channel": "", "messageId": "", "content": "<@Discord user id> Picsi.Ai Headshot Job Submitted [jobid: 8a1f574fdbf79e8cd57e070476d9d5f3] [credits: 4] [prompt: 'a mad king with an evil smile, wearing medieval royal blue attire and a crown. --no green --square'] [time: