{"openapi":"3.0.0","info":{"title":"Cheap.dev AI Media API","description":"Low-cost AI video, image, avatar, face, voice, and media-processing APIs for developers and coding agents.\n\n## Agent quickstart\n\n- Install the generated skill: [https://cheap.dev/SKILL.md](https://cheap.dev/SKILL.md)\n- Read this OpenAPI document: [https://cheap.dev/openapi.json](https://cheap.dev/openapi.json)\n- Create an API token: [Cheap.dev token portal](https://cheap.dev/account/token)\n\nSend the token as `Authorization: Bearer sk_...` and use `https://cheap.dev` as the API server.","version":"1.0.0","license":{"name":"MIT","url":"https://opensource.org/licenses/MIT"}},"servers":[{"url":"https://cheap.dev","description":"Cheap.dev production API gateway"}],"paths":{"/api/v1/r2/get_upload_presigned_url":{"post":{"summary":"Get pre-signed upload URL","description":"Legacy endpoint for generating a pre-signed R2 PUT URL.\nPrefer /api/v1/r2/upload-presigned-url for new integrations.\nIf bucket is omitted, files are uploaded to 3days-apac by default.\nurlPrefix changes the leading object-key path and defaults to adam2eve.\ncdnDomain changes the CDN domain suffix and defaults to the existing makefun.ai behavior.\nThe returned key is scoped to {urlPrefix}/{env}/user/{user_id}/.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body. Required fields: `key`.\n### Behavior\n- Validates the submitted payload and performs the operation described by the request schema.\n- Conditional fields, mutually exclusive inputs, limits, and defaults are enforced as documented by their schemas.\n### Response\n- On `200`, consume the fields defined by that response schema below.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Bad Request - Invalid parameters.\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `POST /api/v1/r2/upload-presigned-url` — Get pre-signed upload URL.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Miscellaneous"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"key":{"type":"string","description":"key parameter","example":"example_key"},"bucket":{"type":"string","description":"R2 bucket. Defaults to 3days-apac.","example":"3days-apac"},"urlPrefix":{"type":"string","description":"Leading object-key path. Defaults to adam2eve.","example":"adam2eve"},"cdnDomain":{"type":"string","description":"CDN domain suffix without scheme or path. Defaults to the existing makefun.ai behavior.","example":"makefun.ai"},"expiresIn":{"type":"integer","minimum":60,"description":"expiresIn parameter","example":60},"contentType":{"type":"string","description":"MIME type to bind to the upload request.","example":"image/png"},"fileSize":{"type":"number","required":false,"description":"Optional file size in bytes. When provided, the pre-signed URL binds Content-Length.","example":1048576},"contentLength":{"type":"number","required":false,"description":"Optional Content-Length in bytes. Takes priority over fileSize if both are provided.","example":1048576}},"required":["key"],"example":{"key":"example_key","bucket":"3days-apac","urlPrefix":"adam2eve","cdnDomain":"makefun.ai","expiresIn":60,"contentType":"image/png","fileSize":1048576,"contentLength":1048576}},"example":{"key":"example_key","bucket":"3days-apac","urlPrefix":"adam2eve","cdnDomain":"makefun.ai","expiresIn":60,"contentType":"image/png","fileSize":1048576,"contentLength":1048576}}}},"responses":{"200":{"description":"Item retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/R2UploadPresignedUrlResponse"}}}},"400":{"description":"Bad Request - Invalid parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"postApiV1R2GetUploadPresignedUrl","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/r2/get_upload_presigned_url\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{\n  \"key\": \"example_key\",\n  \"bucket\": \"3days-apac\",\n  \"urlPrefix\": \"adam2eve\",\n  \"cdnDomain\": \"makefun.ai\",\n  \"expiresIn\": 60,\n  \"contentType\": \"image/png\",\n  \"fileSize\": 1048576,\n  \"contentLength\": 1048576\n}'"}]}},"/api/v1/generation/quote":{"post":{"summary":"Estimate generation credit consumption","description":"Returns a credit estimate without creating a task, calling a generation provider, or charging credits.\nFor agent use, send `endpoint` plus the exact `requestBody` intended for that generation endpoint.\nOnly pricing-related fields are interpreted; a successful quote does not validate the complete generation request.\nThe legacy normalized quote body remains supported for backward compatibility.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body. Required fields: `endpoint`, `requestBody`.\n### Behavior\n- Validates the submitted payload and performs the operation described by the request schema.\n- Conditional fields, mutually exclusive inputs, limits, and defaults are enforced as documented by their schemas.\n### Response\n- On `200`, consume the fields defined by that response schema below.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Unsupported endpoint or invalid/missing pricing input.\n- `401` — Missing or invalid bearer token.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Credits"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"endpoint":{"type":"string","description":"Generation route path. A leading `POST ` is accepted but optional.","example":"/api/v1/userWan25/start"},"requestBody":{"type":"object","additionalProperties":true,"description":"The exact JSON body intended for the generation request.","example":{"model":"wan2.7-i2v","task_type":"first_last_frame","duration":"5","resolution":"720p","audio":true,"image_url":"https://example.com/first.png","last_frame_url":"https://example.com/last.png"}}},"required":["endpoint","requestBody"],"example":{"endpoint":"/api/v1/userWan25/start","requestBody":{"model":"wan2.7-i2v","task_type":"first_last_frame","duration":"5","resolution":"720p","audio":true,"image_url":"https://example.com/first.png","last_frame_url":"https://example.com/last.png"}}},"example":{"endpoint":"/api/v1/userWan25/start","requestBody":{"model":"wan2.7-i2v","task_type":"first_last_frame","duration":"5","resolution":"720p","audio":true,"image_url":"https://example.com/first.png","last_frame_url":"https://example.com/last.png"}}}}},"responses":{"200":{"description":"Credit estimate. `generationRequestValidated=false` means only pricing inputs were checked.","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"400":{"description":"Unsupported endpoint or invalid/missing pricing input"},"401":{"description":"Missing or invalid bearer token"}},"operationId":"postApiV1GenerationQuote","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/generation/quote\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{\n  \"endpoint\": \"/api/v1/userWan25/start\",\n  \"requestBody\": {\n    \"model\": \"wan2.7-i2v\",\n    \"task_type\": \"first_last_frame\",\n    \"duration\": \"5\",\n    \"resolution\": \"720p\",\n    \"audio\": true,\n    \"image_url\": \"https://example.com/first.png\",\n    \"last_frame_url\": \"https://example.com/last.png\"\n  }\n}'"}]}},"/api/v1/anchor/list":{"post":{"summary":"List available avatars","description":"Returns the system and user-specific avatars available to the authenticated API user.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body when using the optional controls documented in the request schema.\n### Behavior\n- Returns the collection visible in the current request and authorization context.\n- Apply the documented pagination and filter parameters when present; use response metadata to continue paging.\n- Record fields and status values have the same meaning as in the corresponding detail operation.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Bad Request - Invalid parameters.\n- `401` — Unauthorized - Invalid or missing JWT token.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Generate Avatar Videos"],"security":[{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"web_type":{"type":"string","description":"Optional client type. Use a2e or tyzn to include default system avatars alongside user-specific avatars.","enum":["a2e","tyzn"],"example":"a2e"}},"required":[],"example":{"web_type":"a2e"}},"example":{"web_type":"a2e"}}}},"responses":{"200":{"description":"Operation completed successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AvatarListResponse"}}}},"400":{"description":"Bad Request - Invalid parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"postApiV1AnchorList","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/anchor/list\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{\n  \"web_type\": \"a2e\"\n}'"}]}},"/api/v1/anchor/tts_list":{"post":{"summary":"List system voices (TTS presets)","description":"List available system TTS voices/presets for the current user.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- No request body or operation-specific parameters are required.\n### Behavior\n- Returns the collection visible in the current request and authorization context.\n- Apply the documented pagination and filter parameters when present; use response metadata to continue paging.\n- Record fields and status values have the same meaning as in the corresponding detail operation.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Bad Request - Invalid parameters.\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `POST /api/v1/anchor/language_list` — List supported languages/regions for voices.\n- `POST /api/v1/anchor/voice_list` — List available voices by country/region.\n- `GET /api/v1/anchor/voice_list` — List available voices (GET)\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["TTS and Voice Clone"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Voice preset list","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"400":{"description":"Bad Request - Invalid parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"postApiV1AnchorTtsList","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/anchor/tts_list\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/anchor/language_list":{"post":{"summary":"List supported languages/regions for voices","description":"List supported language & region options. Optional `voice_map_type` can be used to filter results.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body when using the optional controls documented in the request schema.\n### Behavior\n- Returns the collection visible in the current request and authorization context.\n- Apply the documented pagination and filter parameters when present; use response metadata to continue paging.\n- Record fields and status values have the same meaning as in the corresponding detail operation.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Bad Request - Invalid parameters.\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `POST /api/v1/anchor/tts_list` — List system voices (TTS presets)\n- `POST /api/v1/anchor/voice_list` — List available voices by country/region.\n- `GET /api/v1/anchor/voice_list` — List available voices (GET)\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["TTS and Voice Clone"],"security":[{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"voice_map_type":{"type":"string","description":"Filter by locale mapping type (e.g. en-US)","example":"en-US"}},"required":[],"example":{"voice_map_type":"en-US"}},"example":{"voice_map_type":"en-US"}}}},"responses":{"200":{"description":"Language/region list","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"400":{"description":"Bad Request - Invalid parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"postApiV1AnchorLanguageList","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/anchor/language_list\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{\n  \"voice_map_type\": \"en-US\"\n}'"}]}},"/api/v1/anchor/voice_list":{"post":{"summary":"List available voices by country/region","description":"List available voices filtered by `country`, `region`, and `voice_map_type`.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body when using the optional controls documented in the request schema.\n### Behavior\n- Returns the collection visible in the current request and authorization context.\n- Apply the documented pagination and filter parameters when present; use response metadata to continue paging.\n- Record fields and status values have the same meaning as in the corresponding detail operation.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Bad Request - Invalid parameters.\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `POST /api/v1/anchor/tts_list` — List system voices (TTS presets)\n- `POST /api/v1/anchor/language_list` — List supported languages/regions for voices.\n- `GET /api/v1/anchor/voice_list` — List available voices (GET)\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["TTS and Voice Clone"],"security":[{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"country":{"type":"string","description":"Country/language code (default en)","example":"en"},"region":{"type":"string","description":"Region code (default US)","example":"US"},"voice_map_type":{"type":"string","description":"Locale mapping type (default en-US)","example":"en-US"}},"required":[],"example":{"country":"en","region":"US","voice_map_type":"en-US"}},"example":{"country":"en","region":"US","voice_map_type":"en-US"}}}},"responses":{"200":{"description":"Voice list","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"400":{"description":"Bad Request - Invalid parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"postApiV1AnchorVoiceList","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/anchor/voice_list\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{\n  \"country\": \"en\",\n  \"region\": \"US\",\n  \"voice_map_type\": \"en-US\"\n}'"}]},"get":{"summary":"List available voices (GET)","description":"List available voices. Defaults: country=en, region=US, voice_map_type=en-US.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supported query parameters: `country`, `region`, `voice_map_type`. Omitted values use the defaults shown in the parameter schema.\n### Behavior\n- Returns the collection visible in the current request and authorization context.\n- Apply the documented pagination and filter parameters when present; use response metadata to continue paging.\n- Record fields and status values have the same meaning as in the corresponding detail operation.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `POST /api/v1/anchor/tts_list` — List system voices (TTS presets)\n- `POST /api/v1/anchor/language_list` — List supported languages/regions for voices.\n- `POST /api/v1/anchor/voice_list` — List available voices by country/region.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["TTS and Voice Clone"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Item retrieved successfully","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"country","in":"query","required":false,"schema":{"type":"string","default":"en","example":"en"},"description":"country parameter"},{"name":"region","in":"query","required":false,"schema":{"type":"string","default":"US","example":"US"},"description":"region parameter"},{"name":"voice_map_type","in":"query","required":false,"schema":{"type":"string","default":"en-US","example":"en-US"},"description":"voice_map_type parameter"}],"operationId":"getApiV1AnchorVoiceList","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/anchor/voice_list\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]}},"/api/v1/video/send_tts":{"post":{"summary":"Generate text-to-speech audio","description":"Convert text to speech using AI voices with customizable parameters.\n### Voice Selection\nMust provide **either** `tts_id` (system voice) **or** `user_voice_id` (custom cloned voice):\n- `tts_id`: Use built-in system voice (400+ voices available)\n- `user_voice_id`: Use your own custom cloned voice (requires `country` and `region` parameters)\n### Text Limitations\n- **API users**: Maximum 1000 characters per request\n- **Web users**: Maximum 3000 characters per request\n- Text length is calculated including all Unicode characters\n### Rate Limiting & Captcha\nFor non-API users, captcha verification may be required after frequent usage:\n- Use `type` parameter to specify captcha type (`turnstile` or `aliyun_captcha`)\n- Provide corresponding `turnstile_token` or `captchaVerifyParam` when captcha is required\n- API token users skip captcha verification.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body. Required fields: `msg`.\n### Behavior\n- Validates the submitted payload and performs the operation described by the request schema.\n- Conditional fields, mutually exclusive inputs, limits, and defaults are enforced as documented by their schemas.\n### Response\n- On `200`, consume the fields defined by that response schema below.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Invalid request parameters.\n- `401` — Unauthorized - Invalid or missing JWT token.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["TTS and Voice Clone"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"msg":{"type":"string","description":"Text content to convert to speech (1-3000 characters)","example":"Welcome. Let's start your AI journey.","minLength":1,"maxLength":3000},"tts_id":{"type":"string","description":"System voice ID (MongoDB ObjectId). Must provide either tts_id or user_voice_id.","example":"66dc3c1b7dc1f1c483cc5ab8"},"user_voice_id":{"type":"string","description":"Custom cloned voice ID (MongoDB ObjectId). Must provide either tts_id or user_voice_id.","example":"66f1234567890abcdef12345"},"country":{"type":"string","description":"Locale language part (e.g. 'en', 'zh', 'pt', 'ja'). Optional when using user_voice_id, defaults to 'en'. Combine with `region` to form locale like 'en-US'/'zh-CN'. Values should come from POST /api/v1/anchor/language_list (top-level `value`).","example":"en","default":"en"},"region":{"type":"string","description":"Locale region part (e.g. 'US', 'CN', 'BR', 'JP'). Optional when using user_voice_id, defaults to 'US'. Combine with `country` to form locale like 'en-US'/'zh-CN'. Values should come from POST /api/v1/anchor/language_list (child `value`).","example":"US","default":"US"},"speechRate":{"type":"number","description":"Speech speed multiplier (0.5-2.0)","example":1,"minimum":0.5,"maximum":2,"default":1},"type":{"type":"string","description":"Captcha type (required when captcha verification is needed)","enum":["turnstile","aliyun_captcha"],"example":"turnstile"},"turnstile_token":{"type":"string","description":"Captcha token (required when type is 'turnstile')","example":"0x4AAAAAAxxxxxxxxxxxxxxxxxx"},"captchaVerifyParam":{"type":"string","description":"Captcha verification parameter (required when type is 'aliyun_captcha')","example":"xxxxxxxxxxxx"}},"required":["msg"],"example":{"msg":"Welcome. Let's start your AI journey.","tts_id":"66dc3c1b7dc1f1c483cc5ab8","user_voice_id":"66f1234567890abcdef12345","country":"en","region":"US","speechRate":1,"type":"turnstile","turnstile_token":"0x4AAAAAAxxxxxxxxxxxxxxxxxx","captchaVerifyParam":"xxxxxxxxxxxx"}},"example":{"msg":"Welcome. Let's start your AI journey.","tts_id":"66dc3c1b7dc1f1c483cc5ab8","user_voice_id":"66f1234567890abcdef12345","country":"en","region":"US","speechRate":1,"type":"turnstile","turnstile_token":"0x4AAAAAAxxxxxxxxxxxxxxxxxx","captchaVerifyParam":"xxxxxxxxxxxx"}}}},"responses":{"200":{"description":"Text-to-speech generation successful","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"400":{"description":"Invalid request parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"postApiV1VideoSendTts","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/video/send_tts\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{\n  \"msg\": \"Welcome. Let's start your AI journey.\",\n  \"tts_id\": \"66dc3c1b7dc1f1c483cc5ab8\",\n  \"user_voice_id\": \"66f1234567890abcdef12345\",\n  \"country\": \"en\",\n  \"region\": \"US\",\n  \"speechRate\": 1,\n  \"type\": \"turnstile\",\n  \"turnstile_token\": \"0x4AAAAAAxxxxxxxxxxxxxxxxxx\",\n  \"captchaVerifyParam\": \"xxxxxxxxxxxx\"\n}'"}]}},"/api/v1/tts/preview/list":{"get":{"summary":"Get TTS preview list","description":"Return the authenticated user's non-deleted TTS preview records created during the last 24 hours, ordered for recent-preview playback.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supported query parameters: `pageSize`, `current`. Omitted values use the defaults shown in the parameter schema.\n### Behavior\n- Returns the collection visible in the current request and authorization context.\n- Apply the documented pagination and filter parameters when present; use response metadata to continue paging.\n- Record fields and status values have the same meaning as in the corresponding detail operation.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `DELETE /api/v1/tts/preview/{id}` — Delete TTS preview record.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["TTS and Voice Clone"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"TTS preview list retrieved successfully","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"pageSize","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":20,"example":20},"description":"Number of items per page"},{"name":"current","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"example":1},"description":"Current page number"}],"operationId":"getApiV1TtsPreviewList","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/tts/preview/list\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]}},"/api/v1/tts/preview/{id}":{"delete":{"summary":"Delete TTS preview record","description":"Soft-delete the authenticated user's TTS preview record identified by `id`; the underlying audio object is not physically removed by this operation.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supply `id` in the URL path.\n### Behavior\n- Deletes or marks the selected resource as deleted according to the endpoint's documented lifecycle rules.\n- Use the resource identifier from a list, creation, or detail response; deleting one resource does not affect unrelated records.\n- Do not assume an in-progress task can be cancelled unless the endpoint explicitly documents that behavior.\n### Response\n- A `200` response confirms that the deletion request was applied to the selected record.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n- `404` — Record not found.\n### Related Operations\n- `GET /api/v1/tts/preview/list` — Get TTS preview list.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["TTS and Voice Clone"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"TTS preview record deleted successfully","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Record not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","example":"507f1f77bcf86cd799439011"},"description":"TTS preview record ID to delete"}],"operationId":"deleteApiV1TtsPreviewId","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X DELETE \"https://cheap.dev/api/v1/tts/preview/{id}\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/video/generate":{"post":{"summary":"Generate AI video with avatar","description":"Generate AI video with avatar using audio source and selected avatar. Either audioSrc or custom_voice is required. For background replacement, use back_id for system backgrounds or custom_back_id for backgrounds created by /api/v1/custom_back/add. The avatar must have an original background saved, or the request must provide anchor_background_img or anchor_background_color.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body. Required fields: `anchor_id`, `anchor_type`.\n- API-token callers may include `webhook_url` and `webhook_token` for best-effort terminal-state notifications; ordinary JWT/cookie calls ignore these fields.\n### Behavior\n- This is an asynchronous operation: a successful submission creates a task and returns before processing finishes.\n- Persist the returned task identifier and use the corresponding detail or list operation to observe progress.\n- Treat the detail endpoint as the source of truth even when webhook delivery is enabled.\n### Response\n- A `200` response confirms task acceptance; it does not by itself mean media generation has completed.\n- Retain the returned identifier and wait for a documented terminal status before using output URLs.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Bad Request - Invalid parameters or missing required audio source.\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/video/detail` — detail.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Generate Avatar Videos"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"type":"object","properties":{"title":{"type":"string","maxLength":40,"description":"Video title (optional, max 40 characters)","example":"My AI Video"},"audioSrc":{"type":"string","description":"Audio source URL (required if custom_voice not provided)","example":"https://example.com/audio.mp3"},"custom_voice":{"type":"string","description":"Custom voice audio URL (required if audioSrc not provided)","example":"https://example.com/custom_voice.wav"},"anchor_id":{"type":"string","pattern":"^[a-fA-F0-9]{24}$","description":"Avatar/anchor ID (MongoDB ObjectId)","example":"507f1f77bcf86cd799439011"},"anchor_type":{"type":"number","description":"Avatar type (0 for system avatar, 1 for custom avatar)","example":0},"anchor_background_img":{"type":"string","description":"Original avatar background image URL. Required for background replacement if the avatar record does not already have background_img or background_color.","example":"https://example.com/original-avatar-background.jpg"},"anchor_background_color":{"type":"string","description":"Original avatar background color in RGBA format. Required for background replacement if the avatar record does not already have background_img or background_color.","example":"rgba(255,255,255,1)"},"back_id":{"type":"string","pattern":"^[a-fA-F0-9]{24}$","description":"System background template ID (MongoDB ObjectId). Mutually exclusive with custom_back_id; sending both returns error 30005.","example":"507f1f77bcf86cd799439012"},"face_swap_id":{"type":"string","pattern":"^[a-fA-F0-9]{24}$","description":"Face swap template ID (MongoDB ObjectId)","example":"507f1f77bcf86cd799439013"},"custom_back_id":{"type":"string","pattern":"^[a-fA-F0-9]{24}$","description":"Custom background ID returned by /api/v1/custom_back/add (MongoDB ObjectId). Mutually exclusive with back_id; sending both returns error 30005.","example":"507f1f77bcf86cd799439014"},"color":{"type":"string","description":"Color setting in RGBA format","example":"rgba(0,0,0,1)"},"wl_model":{"type":"string","description":"Watermark/logo model setting","example":"default"},"isSkipRs":{"type":"boolean","description":"Skip resolution scaling","example":false},"web_bg_width":{"type":"number","default":0,"description":"Output canvas/background width. Required when using back_id, custom_back_id, or color.","example":1920},"web_bg_height":{"type":"number","default":0,"description":"Output canvas/background height. Required when using back_id, custom_back_id, or color.","example":1080},"web_people_width":{"type":"number","default":0,"description":"Avatar width in output layout. Required when using back_id, custom_back_id, or color.","example":800},"web_people_height":{"type":"number","default":0,"description":"Avatar height in output layout. Required when using back_id, custom_back_id, or color.","example":600},"web_people_x":{"type":"number","default":0,"description":"Avatar X position in web layout","example":100},"web_people_y":{"type":"number","default":0,"description":"Avatar Y position in web layout","example":50},"web_dist_bg_width":{"type":"number","default":-1,"description":"Distributed background width","example":1920},"web_dist_bg_height":{"type":"number","default":-1,"description":"Distributed background height","example":1080},"web_dist_bg_x":{"type":"number","default":0,"description":"Distributed background X position","example":0},"web_dist_bg_y":{"type":"number","default":0,"description":"Distributed background Y position","example":0},"resolution":{"type":"number","default":1080,"description":"Video resolution (height in pixels)","example":1080},"msg":{"type":"string","description":"Additional message or notes","example":"Custom video generation"},"erode_factor":{"type":"number","description":"Erosion factor for image processing","example":0.5},"isSkipGp":{"type":"boolean","description":"Skip green screen processing","example":false},"isCaptionEnabled":{"type":"boolean","description":"Enable captions/subtitles","example":true},"gp_model":{"type":"object","description":"Green screen processing model settings","properties":{"compose_mode":{"type":"string","description":"Composition mode","example":"overlay"},"compose_ratio":{"type":"number","description":"Composition ratio","example":0.8}}},"isToPublicPool":{"type":"boolean","description":"Add to public pool for sharing","example":false},"lip_model":{"type":"string","description":"Lip sync model selection","example":"default"},"captionAlign":{"type":"object","description":"Caption alignment and styling settings","properties":{"language":{"type":"string","description":"Caption language","example":"en"},"PrimaryColour":{"type":"string","description":"Primary text color in RGBA format","example":"rgba(255,255,255,1)"},"title":{"type":"string","description":"Caption title","example":"Video Caption"},"TitleBoxColour":{"type":"string","description":"Title box background color in RGBA format","example":"rgba(0,0,0,0.5)"},"FontName":{"type":"string","description":"Font family name","example":"Arial"},"Fontsize":{"type":"integer","description":"Font size in pixels","example":24},"subtitle_position":{"type":"number","description":"Subtitle vertical position (0-1)","example":0.9},"OutlineColour":{"type":"string","description":"Text outline color in RGBA format","example":"rgba(0,0,0,1)"},"BackColour":{"type":"string","description":"Text background color in RGBA format","example":"rgba(0,0,0,0.3)"}}}},"required":["anchor_id","anchor_type"]},{"$ref":"#/components/schemas/WebhookInput"}]},"example":{}}}},"responses":{"200":{"description":"Video generation started successfully","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"400":{"description":"Bad Request - Invalid parameters or missing required audio source","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"postApiV1VideoGenerate","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/video/generate\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/video/detail":{"get":{"summary":"Get record details","description":"detail.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supported query parameters: `video_id`. Omitted values use the defaults shown in the parameter schema.\n### Behavior\n- Retrieves the current server-side representation of the requested resource or task.\n- For asynchronous tasks, inspect the documented status and result fields before consuming generated media.\n- Repeat the request only as needed for polling and stop after the task reaches a terminal state.\n### Response\n- On `200`, consume the fields defined by that response schema below.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `POST /api/v1/video/generate` — Generate AI video with avatar.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Generate Avatar Videos"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Operation completed successfully","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"video_id","in":"query","required":true,"schema":{"type":"string","example":"507f1f77bcf86cd799439011"},"description":"Video task ID returned by the generate endpoint"}],"operationId":"getApiV1VideoDetail","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/video/detail\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]}},"/api/v1/custom_avatar/add":{"post":{"summary":"Add new record","description":"Create a custom avatar in the authenticated user's library from the submitted avatar media and metadata.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- No request body or operation-specific parameters are required.\n### Behavior\n- Reads the requested information without creating a generation task.\n- Use the returned fields as documented; availability may depend on the caller and current resource state.\n### Response\n- On `200`, consume the fields defined by that response schema below.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Bad Request - Invalid parameters.\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `POST /api/v1/custom_avatar/list` — List items.\n- `POST /api/v1/custom_avatar/del` — del.\n- `GET /api/v1/custom_avatar/all_tags` — all tags.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Create Avatars"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Item created successfully","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"400":{"description":"Bad Request - Invalid parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"postApiV1CustomAvatarAdd","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/custom_avatar/add\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/custom_avatar/list":{"post":{"summary":"Create/Run list","description":"Return the authenticated user's custom avatars using the submitted pagination and filtering controls.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- No request body or operation-specific parameters are required.\n### Behavior\n- Returns the collection visible in the current request and authorization context.\n- Apply the documented pagination and filter parameters when present; use response metadata to continue paging.\n- Record fields and status values have the same meaning as in the corresponding detail operation.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Bad Request - Invalid parameters.\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `POST /api/v1/custom_avatar/add` — Add new item.\n- `POST /api/v1/custom_avatar/del` — del.\n- `GET /api/v1/custom_avatar/all_tags` — all tags.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Create Avatars"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Item retrieved successfully","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"400":{"description":"Bad Request - Invalid parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"postApiV1CustomAvatarList","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/custom_avatar/list\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/custom_avatar/del":{"post":{"summary":"Delete record","description":"Remove the authenticated user's custom avatar identified by the submitted record ID.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- No request body or operation-specific parameters are required.\n### Behavior\n- Reads the requested information without creating a generation task.\n- Use the returned fields as documented; availability may depend on the caller and current resource state.\n### Response\n- On `200`, consume the fields defined by that response schema below.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Bad Request - Invalid parameters.\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `POST /api/v1/custom_avatar/list` — List items.\n- `POST /api/v1/custom_avatar/add` — Add new item.\n- `GET /api/v1/custom_avatar/all_tags` — all tags.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Create Avatars"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Operation completed successfully","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"400":{"description":"Bad Request - Invalid parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"postApiV1CustomAvatarDel","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/custom_avatar/del\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/custom_avatar/all_tags":{"get":{"summary":"List all tags","description":"Return the distinct tags available for organizing and filtering the authenticated user's custom avatars.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- No request body or operation-specific parameters are required.\n### Behavior\n- Returns the collection visible in the current request and authorization context.\n- Apply the documented pagination and filter parameters when present; use response metadata to continue paging.\n- Record fields and status values have the same meaning as in the corresponding detail operation.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `POST /api/v1/custom_avatar/list` — List items.\n- `POST /api/v1/custom_avatar/add` — Add new item.\n- `POST /api/v1/custom_avatar/del` — del.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Create Avatars"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Operation completed successfully","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"getApiV1CustomAvatarAllTags","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/custom_avatar/all_tags\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]}},"/api/v1/custom_avatar/{_id}":{"put":{"tags":["Create Avatars"],"summary":"Update record","description":"update.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supply `_id` in the URL path.\n### Behavior\n- Updates the identified resource using the fields accepted by the request schema and the operation's access controls.\n- Fields omitted from the request retain their existing values unless the schema states otherwise.\n- Read the returned record or call the detail operation to confirm the persisted state.\n### Response\n- On `200`, consume the fields defined by that response schema below.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Bad Request.\n- `401` — Unauthorized - Invalid or missing JWT token.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"},"example":{"success":true,"data":{},"timestamp":"2025-01-14T18:22:13.726Z"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearerAuth":[]}],"parameters":[{"name":"_id","in":"path","required":true,"schema":{"type":"string","example":"507f1f77bcf86cd799439011"},"description":"_id parameter"}],"operationId":"putApiV1CustomAvatarId","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X PUT \"https://cheap.dev/api/v1/custom_avatar/{_id}\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/custom_back/add":{"post":{"summary":"Add new custom background","description":"Create a custom background in the authenticated user's library from the submitted background image and metadata.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body. Required fields: `img_url`.\n### Behavior\n- Validates the submitted payload and performs the operation described by the request schema.\n- Conditional fields, mutually exclusive inputs, limits, and defaults are enforced as documented by their schemas.\n### Response\n- On `200`, consume the fields defined by that response schema below.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Bad Request - Invalid parameters or missing img_url.\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `POST /api/v1/custom_back/list` — List items.\n- `POST /api/v1/custom_back/del` — del.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Background Matting"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"img_url":{"type":"string","description":"URL of the background image to add","example":"https://example.com/background.jpg"}},"required":["img_url"],"example":{"img_url":"https://example.com/background.jpg"}},"example":{"img_url":"https://example.com/background.jpg"}}}},"responses":{"200":{"description":"Background item created successfully","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"400":{"description":"Bad Request - Invalid parameters or missing img_url","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"postApiV1CustomBackAdd","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/custom_back/add\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{\n  \"img_url\": \"https://example.com/background.jpg\"\n}'"}]}},"/api/v1/custom_back/list":{"post":{"summary":"Create/Run list","description":"Return the authenticated user's custom backgrounds using the submitted pagination and filtering controls.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- No request body or operation-specific parameters are required.\n### Behavior\n- Returns the collection visible in the current request and authorization context.\n- Apply the documented pagination and filter parameters when present; use response metadata to continue paging.\n- Record fields and status values have the same meaning as in the corresponding detail operation.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Bad Request - Invalid parameters.\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `POST /api/v1/custom_back/add` — Add new custom background.\n- `POST /api/v1/custom_back/del` — del.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Background Matting"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Item retrieved successfully","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"400":{"description":"Bad Request - Invalid parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"postApiV1CustomBackList","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/custom_back/list\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/custom_back/del":{"post":{"summary":"Delete record","description":"Remove the authenticated user's custom background identified by the submitted record ID.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- No request body or operation-specific parameters are required.\n### Behavior\n- Reads the requested information without creating a generation task.\n- Use the returned fields as documented; availability may depend on the caller and current resource state.\n### Response\n- On `200`, consume the fields defined by that response schema below.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Bad Request - Invalid parameters.\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `POST /api/v1/custom_back/list` — List items.\n- `POST /api/v1/custom_back/add` — Add new custom background.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Background Matting"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Operation completed successfully","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"400":{"description":"Bad Request - Invalid parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"postApiV1CustomBackDel","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/custom_back/del\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/custom_back/allBackground":{"post":{"tags":["Background Matting"],"summary":"List all backgrounds","description":"allBackground.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- No request body or operation-specific parameters are required.\n### Behavior\n- Returns the collection visible in the current request and authorization context.\n- Apply the documented pagination and filter parameters when present; use response metadata to continue paging.\n- Record fields and status values have the same meaning as in the corresponding detail operation.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Bad Request.\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `POST /api/v1/custom_back/randomBackground` — randomBackground.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"},"example":{"success":true,"data":{},"timestamp":"2025-01-14T18:22:13.726Z"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearerAuth":[]}],"operationId":"postApiV1CustomBackAllBackground","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/custom_back/allBackground\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/custom_back/randomBackground":{"post":{"tags":["Background Matting"],"summary":"Get a random background","description":"randomBackground.\n### Request\n- This operation does not declare bearer authentication in the published specification.\n- No request body or operation-specific parameters are required.\n### Behavior\n- Returns the collection visible in the current request and authorization context.\n- Apply the documented pagination and filter parameters when present; use response metadata to continue paging.\n- Record fields and status values have the same meaning as in the corresponding detail operation.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Bad Request.\n### Related Operations\n- `POST /api/v1/custom_back/allBackground` — allBackground.","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"},"example":{"success":true,"data":{},"timestamp":"2025-01-14T18:22:13.726Z"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"postApiV1CustomBackRandomBackground","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/custom_back/randomBackground\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{}'"}]}},"/api/v1/userVoice/training":{"post":{"summary":"Start voice training","description":"Create an asynchronous custom-voice training task from the submitted voice samples.\n- **Concurrency:** A user may submit only one training request at a time; concurrent submissions are rejected by the service guard.\n- **Charging:** Coin usage depends on `model`. A failed creation attempt rolls back the charge automatically.\n- **Status:** After creation, poll `GET /api/v1/userVoice/trainingRecord` and inspect `current_status` for progress.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body. Required fields: `name`, `voice_urls`.\n- API-token callers may include `webhook_url` and `webhook_token` for best-effort terminal-state notifications; ordinary JWT/cookie calls ignore these fields.\n### Behavior\n- This is an asynchronous operation: a successful submission creates a task and returns before processing finishes.\n- Persist the returned task identifier and use the corresponding detail or list operation to observe progress.\n- Treat the detail endpoint as the source of truth even when webhook delivery is enabled.\n### Response\n- A `200` response confirms task acceptance; it does not by itself mean media generation has completed.\n- Retain the returned identifier and wait for a documented terminal status before using output URLs.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Bad Request - Invalid training data.\n- `401` — Unauthorized - Invalid or missing JWT token.\n- `403` — Forbidden - Voice clone limit exceeded.\n### Related Operations\n- `DELETE /api/v1/userVoice/{_id}` — Delete voice training record.\n- `GET /api/v1/userVoice/{_id}` — Get voice training record detail.\n- `PUT /api/v1/userVoice/{_id}` — Update voice training record name.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["TTS and Voice Clone"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/UserVoiceTrainingRequest"},{"$ref":"#/components/schemas/WebhookInput"}]},"example":{}}}},"responses":{"200":{"description":"Voice training record created successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessUserVoiceResponse"}}}},"400":{"description":"Bad Request - Invalid training data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden - Voice clone limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"postApiV1UserVoiceTraining","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/userVoice/training\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/userVoice/trainingRecord":{"get":{"summary":"Get voice training records","description":"Return the authenticated user's voice-training records across queued, processing, completed, and failed states.\n- **Ordering:** Records are sorted by `createdAt` in descending order, newest first.\n- **Status values:** `current_status` may be `sent`, `pendding`, `processing`, `completed`, or `failed`.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- No request body or operation-specific parameters are required.\n### Behavior\n- Returns the collection visible in the current request and authorization context.\n- Apply the documented pagination and filter parameters when present; use response metadata to continue paging.\n- Record fields and status values have the same meaning as in the corresponding detail operation.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `DELETE /api/v1/userVoice/{_id}` — Delete voice training record.\n- `GET /api/v1/userVoice/{_id}` — Get voice training record detail.\n- `PUT /api/v1/userVoice/{_id}` — Update voice training record name.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["TTS and Voice Clone"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessUserVoiceListResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"getApiV1UserVoiceTrainingRecord","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/userVoice/trainingRecord\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]}},"/api/v1/userVoice/completedRecord":{"get":{"summary":"Get completed voice training records","description":"Return only the authenticated user's completed voice-training records (`current_status=completed`).\n- **Ordering:** Records are sorted by `createdAt` in descending order, newest first.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- No request body or operation-specific parameters are required.\n### Behavior\n- Returns the collection visible in the current request and authorization context.\n- Apply the documented pagination and filter parameters when present; use response metadata to continue paging.\n- Record fields and status values have the same meaning as in the corresponding detail operation.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `DELETE /api/v1/userVoice/{_id}` — Delete voice training record.\n- `GET /api/v1/userVoice/{_id}` — Get voice training record detail.\n- `PUT /api/v1/userVoice/{_id}` — Update voice training record name.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["TTS and Voice Clone"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessUserVoiceListResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"getApiV1UserVoiceCompletedRecord","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/userVoice/completedRecord\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]}},"/api/v1/userVoice/{_id}":{"delete":{"summary":"Delete voice training record","description":"Soft-delete the authenticated user's voice-training record by setting `deleted=true`; the stored record is not physically removed.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supply `_id` in the URL path.\n### Behavior\n- Deletes or marks the selected resource as deleted according to the endpoint's documented lifecycle rules.\n- Use the resource identifier from a list, creation, or detail response; deleting one resource does not affect unrelated records.\n- Do not assume an in-progress task can be cancelled unless the endpoint explicitly documents that behavior.\n### Response\n- A `200` response confirms that the deletion request was applied to the selected record.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userVoice/{_id}` — Get voice training record detail.\n- `PUT /api/v1/userVoice/{_id}` — Update voice training record name.\n- `POST /api/v1/userVoice/training` — Start voice training.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["TTS and Voice Clone"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"},"example":{"success":true,"data":{},"timestamp":"2025-01-14T18:22:13.726Z"}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"_id","in":"path","required":true,"schema":{"type":"string","example":"507f1f77bcf86cd799439011"},"description":"MongoDB ObjectId of the voice training record"}],"operationId":"deleteApiV1UserVoiceId","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X DELETE \"https://cheap.dev/api/v1/userVoice/{_id}\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]},"get":{"summary":"Get voice training record detail","description":"Return one voice-training record owned by the authenticated user, identified by `_id`.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supply `_id` in the URL path.\n### Behavior\n- Retrieves the current server-side representation of the requested resource or task.\n- For asynchronous tasks, inspect the documented status and result fields before consuming generated media.\n- Repeat the request only as needed for polling and stop after the task reaches a terminal state.\n### Response\n- On `200`, consume the fields defined by that response schema below.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Bad Request - Invalid _id.\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `DELETE /api/v1/userVoice/{_id}` — Delete voice training record.\n- `PUT /api/v1/userVoice/{_id}` — Update voice training record name.\n- `POST /api/v1/userVoice/training` — Start voice training.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["TTS and Voice Clone"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessUserVoiceResponse"}}}},"400":{"description":"Bad Request - Invalid _id","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"_id","in":"path","required":true,"schema":{"type":"string","example":"507f1f77bcf86cd799439011"},"description":"MongoDB ObjectId of the voice training record"}],"operationId":"getApiV1UserVoiceId","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/userVoice/{_id}\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]},"put":{"summary":"Update voice training record name","description":"Rename the authenticated user's voice-training record identified by `_id`; no training inputs or status fields are changed.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supply `_id` in the URL path.\n- Send an `application/json` body. Required fields: `name`.\n### Behavior\n- Updates the identified resource using the fields accepted by the request schema and the operation's access controls.\n- Fields omitted from the request retain their existing values unless the schema states otherwise.\n- Read the returned record or call the detail operation to confirm the persisted state.\n### Response\n- On `200`, consume the fields defined by that response schema below.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Bad Request - Invalid request body.\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `DELETE /api/v1/userVoice/{_id}` — Delete voice training record.\n- `GET /api/v1/userVoice/{_id}` — Get voice training record detail.\n- `POST /api/v1/userVoice/training` — Start voice training.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["TTS and Voice Clone"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserVoiceUpdateRequest"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"},"example":{"success":true,"data":{},"timestamp":"2025-01-14T18:22:13.726Z"}}}},"400":{"description":"Bad Request - Invalid request body","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"_id","in":"path","required":true,"schema":{"type":"string","example":"507f1f77bcf86cd799439011"},"description":"MongoDB ObjectId of the voice training record"}],"operationId":"putApiV1UserVoiceId","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X PUT \"https://cheap.dev/api/v1/userVoice/{_id}\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/userVideoTwin/upload":{"post":{"tags":["Video Twin"],"summary":"Upload file","description":"upload.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- No request body or operation-specific parameters are required.\n### Behavior\n- Reads the requested information without creating a generation task.\n- Use the returned fields as documented; availability may depend on the caller and current resource state.\n### Response\n- On `200`, consume the fields defined by that response schema below.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Bad Request.\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userVideoTwin/records` — Get video twin records.\n- `GET /api/v1/userVideoTwin/{_id}` — detail.\n- `POST /api/v1/userVideoTwin/training` — training.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"},"example":{"success":true,"data":{},"timestamp":"2025-01-14T18:22:13.726Z"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearerAuth":[]}],"operationId":"postApiV1UserVideoTwinUpload","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/userVideoTwin/upload\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/userVideoTwin/training":{"post":{"tags":["Video Twin"],"summary":"Start training","description":"training.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- No request body or operation-specific parameters are required.\n### Behavior\n- Reads the requested information without creating a generation task.\n- Use the returned fields as documented; availability may depend on the caller and current resource state.\n### Response\n- On `200`, consume the fields defined by that response schema below.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Bad Request.\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userVideoTwin/records` — Get video twin records.\n- `GET /api/v1/userVideoTwin/{_id}` — detail.\n- `POST /api/v1/userVideoTwin/upload` — upload.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"},"example":{"success":true,"data":{},"timestamp":"2025-01-14T18:22:13.726Z"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearerAuth":[]}],"operationId":"postApiV1UserVideoTwinTraining","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/userVideoTwin/training\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/userVideoTwin/uploadStatus":{"get":{"summary":"Get video twin upload status","description":"Check the upload status of video twin files for the authenticated user.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- No request body or operation-specific parameters are required.\n### Behavior\n- Retrieves the current server-side representation of the requested resource or task.\n- For asynchronous tasks, inspect the documented status and result fields before consuming generated media.\n- Repeat the request only as needed for polling and stop after the task reaches a terminal state.\n### Response\n- On `200`, consume the fields defined by that response schema below.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userVideoTwin/records` — Get video twin records.\n- `GET /api/v1/userVideoTwin/{_id}` — detail.\n- `POST /api/v1/userVideoTwin/upload` — upload.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Video Twin"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Upload status retrieved successfully","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"getApiV1UserVideoTwinUploadStatus","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/userVideoTwin/uploadStatus\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]}},"/api/v1/userVideoTwin/userRecords":{"get":{"summary":"Get user video twin records","description":"Return every video-twin record available to the authenticated user, including its current training state and result metadata.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- No request body or operation-specific parameters are required.\n### Behavior\n- Returns the collection visible in the current request and authorization context.\n- Apply the documented pagination and filter parameters when present; use response metadata to continue paging.\n- Record fields and status values have the same meaning as in the corresponding detail operation.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userVideoTwin/records` — Get video twin records.\n- `GET /api/v1/userVideoTwin/{_id}` — detail.\n- `POST /api/v1/userVideoTwin/upload` — upload.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Video Twin"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Video twin records retrieved successfully","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"getApiV1UserVideoTwinUserRecords","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/userVideoTwin/userRecords\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]}},"/api/v1/userVideoTwin/remove":{"post":{"summary":"Remove video twin","description":"Remove the video twin identified in the request from the authenticated user's collection without affecting unrelated records.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body. Required fields: `_id`.\n### Behavior\n- Validates the submitted payload and performs the operation described by the request schema.\n- Conditional fields, mutually exclusive inputs, limits, and defaults are enforced as documented by their schemas.\n### Response\n- On `200`, consume the fields defined by that response schema below.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Bad Request - Invalid video twin ID.\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userVideoTwin/records` — Get video twin records.\n- `GET /api/v1/userVideoTwin/{_id}` — detail.\n- `POST /api/v1/userVideoTwin/upload` — upload.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Video Twin"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"_id":{"type":"string","description":"ID of the video twin to remove","example":"507f1f77bcf86cd799439011"}},"required":["_id"],"example":{"_id":"507f1f77bcf86cd799439011"}},"example":{"_id":"507f1f77bcf86cd799439011"}}}},"responses":{"200":{"description":"Video twin removed successfully","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"400":{"description":"Bad Request - Invalid video twin ID","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"postApiV1UserVideoTwinRemove","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/userVideoTwin/remove\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{\n  \"_id\": \"507f1f77bcf86cd799439011\"\n}'"}]}},"/api/v1/userVideoTwin/records":{"get":{"summary":"Get video twin records","description":"Retrieve paginated video twin records with optional filters.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supported query parameters: `pageNum`, `pageSize`, `status`. Omitted values use the defaults shown in the parameter schema.\n### Behavior\n- Returns the collection visible in the current request and authorization context.\n- Apply the documented pagination and filter parameters when present; use response metadata to continue paging.\n- Record fields and status values have the same meaning as in the corresponding detail operation.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userVideoTwin/{_id}` — detail.\n- `POST /api/v1/userVideoTwin/upload` — upload.\n- `POST /api/v1/userVideoTwin/training` — training.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Video Twin"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Records retrieved successfully","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"pageNum","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"example":1},"description":"Page number (starts from 1)"},{"name":"pageSize","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":10,"example":10},"description":"Number of records per page"},{"name":"status","in":"query","required":false,"schema":{"type":"string","example":"completed","enum":["pending","processing","completed","failed"]},"description":"Filter by status"}],"operationId":"getApiV1UserVideoTwinRecords","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/userVideoTwin/records\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]}},"/api/v1/userVideoTwin/startTraining":{"post":{"summary":"Start video twin training","description":"Begin training a new video twin model with image or video source.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body when using the optional controls documented in the request schema.\n### Behavior\n- Validates the submitted payload and performs the operation described by the request schema.\n- Conditional fields, mutually exclusive inputs, limits, and defaults are enforced as documented by their schemas.\n### Response\n- On `200`, consume the fields defined by that response schema below.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Bad Request - Invalid parameters.\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userVideoTwin/records` — Get video twin records.\n- `GET /api/v1/userVideoTwin/{_id}` — detail.\n- `POST /api/v1/userVideoTwin/upload` — upload.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Video Twin"],"security":[{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Name for the video twin","example":"My Video Twin"},"image_url":{"type":"string","description":"URL of the source image","example":"https://example.com/face.jpg"},"video_url":{"type":"string","description":"URL of the source video","example":"https://example.com/video.mp4"},"video_background_image":{"type":"string","description":"URL of background image","example":"https://example.com/bg.jpg"},"video_background_color":{"type":"string","description":"Background color in RGBA format","example":"rgba(255,255,255,1)"}},"required":[],"example":{"name":"My Video Twin","image_url":"https://example.com/face.jpg","video_url":"https://example.com/video.mp4","video_background_image":"https://example.com/bg.jpg","video_background_color":"rgba(255,255,255,1)"}},"example":{"name":"My Video Twin","image_url":"https://example.com/face.jpg","video_url":"https://example.com/video.mp4","video_background_image":"https://example.com/bg.jpg","video_background_color":"rgba(255,255,255,1)"}}}},"responses":{"200":{"description":"Video twin training started successfully","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"400":{"description":"Bad Request - Invalid parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"postApiV1UserVideoTwinStartTraining","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/userVideoTwin/startTraining\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{\n  \"name\": \"My Video Twin\",\n  \"image_url\": \"https://example.com/face.jpg\",\n  \"video_url\": \"https://example.com/video.mp4\",\n  \"video_background_image\": \"https://example.com/bg.jpg\",\n  \"video_background_color\": \"rgba(255,255,255,1)\"\n}'"}]}},"/api/v1/userVideoTwin/continueTraining":{"post":{"summary":"Continue video twin training","description":"Continue training an existing video twin model that was previously paused.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body. Required fields: `_id`.\n### Behavior\n- Validates the submitted payload and performs the operation described by the request schema.\n- Conditional fields, mutually exclusive inputs, limits, and defaults are enforced as documented by their schemas.\n### Response\n- On `200`, consume the fields defined by that response schema below.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Bad Request - Invalid video twin ID.\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userVideoTwin/records` — Get video twin records.\n- `GET /api/v1/userVideoTwin/{_id}` — detail.\n- `POST /api/v1/userVideoTwin/upload` — upload.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Video Twin"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"_id":{"type":"string","description":"ID of the video twin to continue training","example":"507f1f77bcf86cd799439011"}},"required":["_id"],"example":{"_id":"507f1f77bcf86cd799439011"}},"example":{"_id":"507f1f77bcf86cd799439011"}}}},"responses":{"200":{"description":"Training continued successfully","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"400":{"description":"Bad Request - Invalid video twin ID","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"postApiV1UserVideoTwinContinueTraining","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/userVideoTwin/continueTraining\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{\n  \"_id\": \"507f1f77bcf86cd799439011\"\n}'"}]}},"/api/v1/userVideoTwin/trainingRecords":{"get":{"summary":"Get training records","description":"Retrieve all video twin training records for the authenticated user.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- No request body or operation-specific parameters are required.\n### Behavior\n- Returns the collection visible in the current request and authorization context.\n- Apply the documented pagination and filter parameters when present; use response metadata to continue paging.\n- Record fields and status values have the same meaning as in the corresponding detail operation.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userVideoTwin/records` — Get video twin records.\n- `GET /api/v1/userVideoTwin/{_id}` — detail.\n- `POST /api/v1/userVideoTwin/upload` — upload.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Video Twin"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Training records retrieved successfully","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"getApiV1UserVideoTwinTrainingRecords","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/userVideoTwin/trainingRecords\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]}},"/api/v1/userVideoTwin/batchDetail":{"post":{"summary":"Batch query task details","description":"Query details for multiple tasks at once by providing an array of task IDs.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body. Required fields: `ids`.\n### Behavior\n- Fetches several task records in one request, reducing the number of individual detail calls.\n- Results remain subject to the same authentication and ownership checks as single-record lookups.\n- Match returned records by their identifiers instead of relying on response ordering.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userVideoTwin/records` — Get video twin records.\n- `GET /api/v1/userVideoTwin/{_id}` — detail.\n- `POST /api/v1/userVideoTwin/upload` — upload.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Video Twin"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"ids":{"type":"array","items":{"type":"string","example":"example"},"description":"Array of task IDs to query","example":["example"]}},"required":["ids"],"example":{"ids":["example"]}},"example":{"ids":["example"]}}}},"responses":{"200":{"description":"Batch details retrieved successfully"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"postApiV1UserVideoTwinBatchDetail","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/userVideoTwin/batchDetail\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{\n  \"ids\": [\n    \"example\"\n  ]\n}'"}]}},"/api/v1/userVideoTwin/{_id}":{"get":{"tags":["Video Twin"],"summary":"Get record details","description":"detail.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supply `_id` in the URL path.\n### Behavior\n- Retrieves the current server-side representation of the requested resource or task.\n- For asynchronous tasks, inspect the documented status and result fields before consuming generated media.\n- Repeat the request only as needed for polling and stop after the task reaches a terminal state.\n### Response\n- On `200`, consume the fields defined by that response schema below.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Bad Request.\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userVideoTwin/records` — Get video twin records.\n- `POST /api/v1/userVideoTwin/upload` — upload.\n- `POST /api/v1/userVideoTwin/training` — training.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"},"example":{"success":true,"data":{},"timestamp":"2025-01-14T18:22:13.726Z"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearerAuth":[]}],"parameters":[{"name":"_id","in":"path","required":true,"schema":{"type":"string","example":"507f1f77bcf86cd799439011"},"description":"_id parameter"}],"operationId":"getApiV1UserVideoTwinId","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/userVideoTwin/{_id}\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]}},"/api/v1/userVideoTwin/retry":{"post":{"tags":["Video Twin"],"summary":"Retry a failed task","description":"retry.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- No request body or operation-specific parameters are required.\n### Behavior\n- Requests another processing attempt for an eligible failed task.\n- Eligibility, charging, and state transitions follow the task-specific rules exposed by the response.\n- Continue monitoring the same or returned task identifier after the retry is accepted.\n### Response\n- A `200` response confirms task acceptance; it does not by itself mean media generation has completed.\n- Retain the returned identifier and wait for a documented terminal status before using output URLs.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Bad Request.\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userVideoTwin/records` — Get video twin records.\n- `GET /api/v1/userVideoTwin/{_id}` — detail.\n- `POST /api/v1/userVideoTwin/upload` — upload.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"},"example":{"success":true,"data":{},"timestamp":"2025-01-14T18:22:13.726Z"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearerAuth":[]}],"operationId":"postApiV1UserVideoTwinRetry","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/userVideoTwin/retry\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/userVideoTwin/eyeContact":{"post":{"summary":"Start eye contact enhancement","description":"Enhance video twin with improved eye contact using AI processing.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body when using the optional controls documented in the request schema.\n### Behavior\n- Validates the submitted payload and performs the operation described by the request schema.\n- Conditional fields, mutually exclusive inputs, limits, and defaults are enforced as documented by their schemas.\n### Response\n- On `200`, consume the fields defined by that response schema below.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Bad Request - Invalid parameters.\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userVideoTwin/records` — Get video twin records.\n- `GET /api/v1/userVideoTwin/{_id}` — detail.\n- `POST /api/v1/userVideoTwin/upload` — upload.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Video Twin"],"security":[{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"_id":{"type":"string","description":"ID of the video twin to enhance","example":"507f1f77bcf86cd799439011"}},"required":[],"example":{"_id":"507f1f77bcf86cd799439011"}},"example":{"_id":"507f1f77bcf86cd799439011"}}}},"responses":{"200":{"description":"Eye contact enhancement started successfully","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"400":{"description":"Bad Request - Invalid parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"postApiV1UserVideoTwinEyeContact","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/userVideoTwin/eyeContact\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{\n  \"_id\": \"507f1f77bcf86cd799439011\"\n}'"}]}},"/api/v1/userFaceSwapImage/add":{"post":{"summary":"Add a new face image for face swapping","description":"Add a new face image to the user's face swap image collection.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body. Required fields: `face_url`.\n### Behavior\n- Validates the submitted payload and performs the operation described by the request schema.\n- Conditional fields, mutually exclusive inputs, limits, and defaults are enforced as documented by their schemas.\n### Response\n- On `200`, consume the fields defined by that response schema below.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Bad Request - Invalid parameters.\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userFaceSwapImage/records` — Get user's face swap image records.\n- `DELETE /api/v1/userFaceSwapImage/{_id}` — Remove a face swap image.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Face Swap"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"face_url":{"type":"string","description":"URL of the face image to be used for face swapping","example":"https://example.com/face-image.jpg"}},"required":["face_url"],"example":{"face_url":"https://example.com/face-image.jpg"}},"example":{"face_url":"https://example.com/face-image.jpg"}}}},"responses":{"200":{"description":"Face image added successfully","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"400":{"description":"Bad Request - Invalid parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"postApiV1UserFaceSwapImageAdd","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/userFaceSwapImage/add\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{\n  \"face_url\": \"https://example.com/face-image.jpg\"\n}'"}]}},"/api/v1/userFaceSwapImage/records":{"get":{"summary":"Get user's face swap image records","description":"Return the authenticated user's saved face-swap source images and their reusable record identifiers.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- No request body or operation-specific parameters are required.\n### Behavior\n- Returns the collection visible in the current request and authorization context.\n- Apply the documented pagination and filter parameters when present; use response metadata to continue paging.\n- Record fields and status values have the same meaning as in the corresponding detail operation.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `DELETE /api/v1/userFaceSwapImage/{_id}` — Remove a face swap image.\n- `POST /api/v1/userFaceSwapImage/add` — Add a new face image for face swapping.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Face Swap"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Face swap image records retrieved successfully","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"getApiV1UserFaceSwapImageRecords","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/userFaceSwapImage/records\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]}},"/api/v1/userFaceSwapImage/{_id}":{"delete":{"summary":"Remove a face swap image","description":"Delete a specific face swap image from the user's collection.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supply `_id` in the URL path.\n### Behavior\n- Deletes or marks the selected resource as deleted according to the endpoint's documented lifecycle rules.\n- Use the resource identifier from a list, creation, or detail response; deleting one resource does not affect unrelated records.\n- Do not assume an in-progress task can be cancelled unless the endpoint explicitly documents that behavior.\n### Response\n- A `200` response confirms that the deletion request was applied to the selected record.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Bad Request - Invalid ID format.\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userFaceSwapImage/records` — Get user's face swap image records.\n- `POST /api/v1/userFaceSwapImage/add` — Add a new face image for face swapping.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Face Swap"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Face swap image deleted successfully","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"400":{"description":"Bad Request - Invalid ID format","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"_id","in":"path","required":true,"schema":{"type":"string","example":"507f1f77bcf86cd799439011"},"description":"ID of the face swap image to delete"}],"operationId":"deleteApiV1UserFaceSwapImageId","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X DELETE \"https://cheap.dev/api/v1/userFaceSwapImage/{_id}\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/userFaceSwapPreview/add":{"post":{"summary":"Create a new face swap preview task","description":"Create a face swap preview task using video and face image URLs.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body. Required fields: `video_url`, `face_url`.\n### Behavior\n- Validates the submitted payload and performs the operation described by the request schema.\n- Conditional fields, mutually exclusive inputs, limits, and defaults are enforced as documented by their schemas.\n### Response\n- On `200`, consume the fields defined by that response schema below.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Bad Request - Invalid parameters.\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userFaceSwapPreview/status` — Get face swap preview status.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Face Swap"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"video_url":{"type":"string","description":"URL of the video to swap face in","example":"https://example.com/video.mp4"},"face_url":{"type":"string","description":"URL of the face image to swap with","example":"https://example.com/face.jpg"}},"required":["video_url","face_url"],"example":{"video_url":"https://example.com/video.mp4","face_url":"https://example.com/face.jpg"}},"example":{"video_url":"https://example.com/video.mp4","face_url":"https://example.com/face.jpg"}}}},"responses":{"200":{"description":"Face swap preview task created successfully","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"400":{"description":"Bad Request - Invalid parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"postApiV1UserFaceSwapPreviewAdd","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/userFaceSwapPreview/add\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{\n  \"video_url\": \"https://example.com/video.mp4\",\n  \"face_url\": \"https://example.com/face.jpg\"\n}'"}]}},"/api/v1/userFaceSwapPreview/status":{"get":{"summary":"Get face swap preview status","description":"Check the processing status of a specific face swap preview task.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supported query parameters: `_id`. Omitted values use the defaults shown in the parameter schema.\n### Behavior\n- Retrieves the current server-side representation of the requested resource or task.\n- For asynchronous tasks, inspect the documented status and result fields before consuming generated media.\n- Repeat the request only as needed for polling and stop after the task reaches a terminal state.\n### Response\n- On `200`, consume the fields defined by that response schema below.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Bad Request - Invalid task ID format.\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `POST /api/v1/userFaceSwapPreview/add` — Create a new face swap preview task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Face Swap"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Preview status retrieved successfully","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"400":{"description":"Bad Request - Invalid task ID format","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"_id","in":"query","required":true,"schema":{"type":"string","example":"507f1f77bcf86cd799439011"},"description":"ID of the face swap preview task"}],"operationId":"getApiV1UserFaceSwapPreviewStatus","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/userFaceSwapPreview/status\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]}},"/api/v1/userFaceSwapTask/add":{"post":{"summary":"Create a new face swap task","description":"Create a face swap task with video, face image, and optional cover image.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body. Required fields: `name`, `video_url`, `face_url`.\n- API-token callers may include `webhook_url` and `webhook_token` for best-effort terminal-state notifications; ordinary JWT/cookie calls ignore these fields.\n### Behavior\n- This is an asynchronous operation: a successful submission creates a task and returns before processing finishes.\n- Persist the returned task identifier and use the corresponding detail or list operation to observe progress.\n- Treat the detail endpoint as the source of truth even when webhook delivery is enabled.\n### Response\n- A `200` response confirms task acceptance; it does not by itself mean media generation has completed.\n- Retain the returned identifier and wait for a documented terminal status before using output URLs.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Bad Request - Invalid parameters.\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userFaceSwapTask/records` — Get user's face swap task records.\n- `GET /api/v1/userFaceSwapTask/{_id}` — Get face swap task details.\n- `DELETE /api/v1/userFaceSwapTask/{_id}` — Delete face swap task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Face Swap"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"type":"object","properties":{"name":{"type":"string","description":"Name of the face swap task","example":"My Face Swap Video"},"video_url":{"type":"string","description":"URL of the video to swap face in","example":"https://example.com/video.mp4"},"face_url":{"type":"string","description":"URL of the face image to swap with","example":"https://example.com/face.jpg"},"cover_url":{"type":"string","required":false,"description":"Optional cover image URL","example":"https://example.com/cover.jpg"},"model_version":{"type":"string","required":false,"enum":["v1","v2"],"description":"Face swap model version: v1 (JAH pipeline, default), v2 (ComfyUI, image only)","example":"v1"}},"required":["name","video_url","face_url"]},{"$ref":"#/components/schemas/WebhookInput"}]},"example":{}}}},"responses":{"200":{"description":"Face swap task created successfully","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"400":{"description":"Bad Request - Invalid parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"postApiV1UserFaceSwapTaskAdd","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/userFaceSwapTask/add\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/userFaceSwapTask/records":{"get":{"summary":"Get user's face swap task records","description":"Retrieve paginated list of face swap tasks for the authenticated user.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supported query parameters: `pageNum`, `pageSize`. Omitted values use the defaults shown in the parameter schema.\n### Behavior\n- Returns the collection visible in the current request and authorization context.\n- Apply the documented pagination and filter parameters when present; use response metadata to continue paging.\n- Record fields and status values have the same meaning as in the corresponding detail operation.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Bad Request - Invalid pagination parameters.\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userFaceSwapTask/{_id}` — Get face swap task details.\n- `DELETE /api/v1/userFaceSwapTask/{_id}` — Delete face swap task.\n- `POST /api/v1/userFaceSwapTask/add` — Create a new face swap task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Face Swap"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Task records retrieved successfully","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"400":{"description":"Bad Request - Invalid pagination parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"pageNum","in":"query","required":true,"schema":{"type":"integer","minimum":1,"default":1,"example":1},"description":"Page number (starts from 1)"},{"name":"pageSize","in":"query","required":true,"schema":{"type":"integer","minimum":1,"maximum":100,"default":10,"example":10},"description":"Number of records per page"}],"operationId":"getApiV1UserFaceSwapTaskRecords","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/userFaceSwapTask/records\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]}},"/api/v1/userFaceSwapTask/status":{"get":{"summary":"Get user's face swap task status","description":"Get overall face swap task status information for the authenticated user.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- No request body or operation-specific parameters are required.\n### Behavior\n- Retrieves the current server-side representation of the requested resource or task.\n- For asynchronous tasks, inspect the documented status and result fields before consuming generated media.\n- Repeat the request only as needed for polling and stop after the task reaches a terminal state.\n### Response\n- On `200`, consume the fields defined by that response schema below.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userFaceSwapTask/records` — Get user's face swap task records.\n- `GET /api/v1/userFaceSwapTask/{_id}` — Get face swap task details.\n- `DELETE /api/v1/userFaceSwapTask/{_id}` — Delete face swap task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Face Swap"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Task status retrieved successfully","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"getApiV1UserFaceSwapTaskStatus","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/userFaceSwapTask/status\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]}},"/api/v1/userFaceSwapTask/batchDetail":{"post":{"summary":"Batch query task details","description":"Query details for multiple tasks at once by providing an array of task IDs.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body. Required fields: `ids`.\n### Behavior\n- Fetches several task records in one request, reducing the number of individual detail calls.\n- Results remain subject to the same authentication and ownership checks as single-record lookups.\n- Match returned records by their identifiers instead of relying on response ordering.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userFaceSwapTask/records` — Get user's face swap task records.\n- `GET /api/v1/userFaceSwapTask/{_id}` — Get face swap task details.\n- `DELETE /api/v1/userFaceSwapTask/{_id}` — Delete face swap task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Face Swap"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"ids":{"type":"array","items":{"type":"string","example":"example"},"description":"Array of task IDs to query","example":["example"]}},"required":["ids"],"example":{"ids":["example"]}},"example":{"ids":["example"]}}}},"responses":{"200":{"description":"Batch details retrieved successfully"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"postApiV1UserFaceSwapTaskBatchDetail","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/userFaceSwapTask/batchDetail\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{\n  \"ids\": [\n    \"example\"\n  ]\n}'"}]}},"/api/v1/userFaceSwapTask/{_id}":{"get":{"summary":"Get face swap task details","description":"Retrieve detailed information about a specific face swap task.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supply `_id` in the URL path.\n### Behavior\n- Retrieves the current server-side representation of the requested resource or task.\n- For asynchronous tasks, inspect the documented status and result fields before consuming generated media.\n- Repeat the request only as needed for polling and stop after the task reaches a terminal state.\n### Response\n- On `200`, consume the fields defined by that response schema below.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Bad Request - Invalid task ID format.\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userFaceSwapTask/records` — Get user's face swap task records.\n- `DELETE /api/v1/userFaceSwapTask/{_id}` — Delete face swap task.\n- `POST /api/v1/userFaceSwapTask/add` — Create a new face swap task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Face Swap"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Task details retrieved successfully","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"400":{"description":"Bad Request - Invalid task ID format","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"_id","in":"path","required":true,"schema":{"type":"string","example":"507f1f77bcf86cd799439011"},"description":"ID of the face swap task"}],"operationId":"getApiV1UserFaceSwapTaskId","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/userFaceSwapTask/{_id}\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]},"delete":{"summary":"Delete face swap task","description":"Delete a face swap task from the user's collection (DELETE method)\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supply `_id` in the URL path.\n### Behavior\n- Deletes or marks the selected resource as deleted according to the endpoint's documented lifecycle rules.\n- Use the resource identifier from a list, creation, or detail response; deleting one resource does not affect unrelated records.\n- Do not assume an in-progress task can be cancelled unless the endpoint explicitly documents that behavior.\n### Response\n- A `200` response confirms that the deletion request was applied to the selected record.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Bad Request - Invalid task ID format.\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userFaceSwapTask/records` — Get user's face swap task records.\n- `GET /api/v1/userFaceSwapTask/{_id}` — Get face swap task details.\n- `POST /api/v1/userFaceSwapTask/add` — Create a new face swap task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Face Swap"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Task deleted successfully","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"400":{"description":"Bad Request - Invalid task ID format","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"_id","in":"path","required":true,"schema":{"type":"string","example":"507f1f77bcf86cd799439011"},"description":"ID of the face swap task to delete"}],"operationId":"deleteApiV1UserFaceSwapTaskId","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X DELETE \"https://cheap.dev/api/v1/userFaceSwapTask/{_id}\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/userDubbing/startDubbing":{"post":{"tags":["AI Dubbing"],"summary":"Start AI dubbing task","description":"startDubbing.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body when using the optional controls documented in the request schema.\n- API-token callers may include `webhook_url` and `webhook_token` for best-effort terminal-state notifications; ordinary JWT/cookie calls ignore these fields.\n### Behavior\n- This is an asynchronous operation: a successful submission creates a task and returns before processing finishes.\n- Persist the returned task identifier and use the corresponding detail or list operation to observe progress.\n- Treat the detail endpoint as the source of truth even when webhook delivery is enabled.\n### Response\n- A `200` response confirms task acceptance; it does not by itself mean media generation has completed.\n- Retain the returned identifier and wait for a documented terminal status before using output URLs.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Bad Request.\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userDubbing/allRecords` — Get all task records.\n- `GET /api/v1/userDubbing/{_id}` — Get task details.\n- `DELETE /api/v1/userDubbing/{_id}` — Delete dubbing task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"},"example":{"success":true,"data":{},"timestamp":"2025-01-14T18:22:13.726Z"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookInput"}}}},"operationId":"postApiV1UserDubbingStartDubbing","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/userDubbing/startDubbing\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/userDubbing/allRecords":{"get":{"summary":"Get all task records","description":"Return the authenticated user's dubbing tasks, newest first, using the requested page number and page size.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supported query parameters: `pageNum`, `pageSize`. Omitted values use the defaults shown in the parameter schema.\n### Behavior\n- Returns the collection visible in the current request and authorization context.\n- Apply the documented pagination and filter parameters when present; use response metadata to continue paging.\n- Record fields and status values have the same meaning as in the corresponding detail operation.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userDubbing/{_id}` — Get task details.\n- `DELETE /api/v1/userDubbing/{_id}` — Delete dubbing task.\n- `POST /api/v1/userDubbing/startDubbing` — startDubbing.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["AI Dubbing"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Task list retrieved successfully"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"pageNum","in":"query","required":false,"schema":{"type":"integer","minimum":1,"example":1},"description":"Page number"},{"name":"pageSize","in":"query","required":false,"schema":{"type":"integer","example":10},"description":"Page size"}],"operationId":"getApiV1UserDubbingAllRecords","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/userDubbing/allRecords\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]}},"/api/v1/userDubbing/allProcessing":{"get":{"tags":["AI Dubbing"],"summary":"List processing records","description":"allProcessing.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- No request body or operation-specific parameters are required.\n### Behavior\n- Returns the collection visible in the current request and authorization context.\n- Apply the documented pagination and filter parameters when present; use response metadata to continue paging.\n- Record fields and status values have the same meaning as in the corresponding detail operation.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Bad Request.\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userDubbing/allRecords` — Get all task records.\n- `GET /api/v1/userDubbing/{_id}` — Get task details.\n- `DELETE /api/v1/userDubbing/{_id}` — Delete dubbing task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"},"example":{"success":true,"data":{},"timestamp":"2025-01-14T18:22:13.726Z"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearerAuth":[]}],"operationId":"getApiV1UserDubbingAllProcessing","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/userDubbing/allProcessing\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]}},"/api/v1/userDubbing/{_id}":{"get":{"summary":"Get task details","description":"Return the authenticated user's dubbing task identified by `_id`, including its current processing status and available output fields.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supply `_id` in the URL path.\n### Behavior\n- Retrieves the current server-side representation of the requested resource or task.\n- For asynchronous tasks, inspect the documented status and result fields before consuming generated media.\n- Repeat the request only as needed for polling and stop after the task reaches a terminal state.\n### Response\n- On `200`, consume the fields defined by that response schema below.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userDubbing/allRecords` — Get all task records.\n- `DELETE /api/v1/userDubbing/{_id}` — Delete dubbing task.\n- `POST /api/v1/userDubbing/startDubbing` — startDubbing.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["AI Dubbing"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Task details retrieved successfully"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"_id","in":"path","required":true,"schema":{"type":"string","example":"507f1f77bcf86cd799439011"},"description":"Task ID"}],"operationId":"getApiV1UserDubbingId","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/userDubbing/{_id}\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]},"delete":{"summary":"Delete dubbing task","description":"Remove the authenticated user's dubbing task identified by `_id` from the task history without affecting other dubbing records.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supply `_id` in the URL path.\n### Behavior\n- Deletes or marks the selected resource as deleted according to the endpoint's documented lifecycle rules.\n- Use the resource identifier from a list, creation, or detail response; deleting one resource does not affect unrelated records.\n- Do not assume an in-progress task can be cancelled unless the endpoint explicitly documents that behavior.\n### Response\n- A `200` response confirms that the deletion request was applied to the selected record.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Bad Request - Invalid task ID.\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userDubbing/allRecords` — Get all task records.\n- `GET /api/v1/userDubbing/{_id}` — Get task details.\n- `POST /api/v1/userDubbing/startDubbing` — startDubbing.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["AI Dubbing"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Task deleted successfully","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"400":{"description":"Bad Request - Invalid task ID","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"_id","in":"path","required":true,"schema":{"type":"string","example":"507f1f77bcf86cd799439011"},"description":"ID of the dubbing task"}],"operationId":"deleteApiV1UserDubbingId","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X DELETE \"https://cheap.dev/api/v1/userDubbing/{_id}\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/userCaptionRemoval/start":{"post":{"summary":"Start caption removal task","description":"Create an asynchronous caption-removal task for the submitted source video and return the record used to monitor processing.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body. Required fields: `name`, `source_url`.\n- API-token callers may include `webhook_url` and `webhook_token` for best-effort terminal-state notifications; ordinary JWT/cookie calls ignore these fields.\n### Behavior\n- This is an asynchronous operation: a successful submission creates a task and returns before processing finishes.\n- Persist the returned task identifier and use the corresponding detail or list operation to observe progress.\n- Treat the detail endpoint as the source of truth even when webhook delivery is enabled.\n### Response\n- A `200` response confirms task acceptance; it does not by itself mean media generation has completed.\n- Retain the returned identifier and wait for a documented terminal status before using output URLs.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Bad Request - Invalid parameters.\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userCaptionRemoval/allRecords` — Get all task records.\n- `GET /api/v1/userCaptionRemoval/{_id}` — Get task details.\n- `DELETE /api/v1/userCaptionRemoval/{_id}` — Delete caption removal task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Caption Removal"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"type":"object","properties":{"name":{"type":"string","description":"Name of the caption removal task","example":"Remove captions from video"},"source_url":{"type":"string","description":"URL of the source video","example":"https://example.com/video.mp4"}},"required":["name","source_url"]},{"$ref":"#/components/schemas/WebhookInput"}]},"example":{}}}},"responses":{"200":{"description":"Caption removal task started successfully","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"400":{"description":"Bad Request - Invalid parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"postApiV1UserCaptionRemovalStart","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/userCaptionRemoval/start\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/userCaptionRemoval/allRecords":{"get":{"summary":"Get all task records","description":"Return the authenticated user's caption-removal tasks, newest first, using the requested page number and page size.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supported query parameters: `pageNum`, `pageSize`. Omitted values use the defaults shown in the parameter schema.\n### Behavior\n- Returns the collection visible in the current request and authorization context.\n- Apply the documented pagination and filter parameters when present; use response metadata to continue paging.\n- Record fields and status values have the same meaning as in the corresponding detail operation.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userCaptionRemoval/{_id}` — Get task details.\n- `DELETE /api/v1/userCaptionRemoval/{_id}` — Delete caption removal task.\n- `POST /api/v1/userCaptionRemoval/start` — Start caption removal task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Caption Removal"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Task list retrieved successfully"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"pageNum","in":"query","required":false,"schema":{"type":"integer","minimum":1,"example":1},"description":"Page number"},{"name":"pageSize","in":"query","required":false,"schema":{"type":"integer","example":10},"description":"Page size"}],"operationId":"getApiV1UserCaptionRemovalAllRecords","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/userCaptionRemoval/allRecords\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]}},"/api/v1/userCaptionRemoval/allProcessing":{"get":{"tags":["Caption Removal"],"summary":"List processing records","description":"allProcessing.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- No request body or operation-specific parameters are required.\n### Behavior\n- Returns the collection visible in the current request and authorization context.\n- Apply the documented pagination and filter parameters when present; use response metadata to continue paging.\n- Record fields and status values have the same meaning as in the corresponding detail operation.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Bad Request.\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userCaptionRemoval/allRecords` — Get all task records.\n- `GET /api/v1/userCaptionRemoval/{_id}` — Get task details.\n- `DELETE /api/v1/userCaptionRemoval/{_id}` — Delete caption removal task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"},"example":{"success":true,"data":{},"timestamp":"2025-01-14T18:22:13.726Z"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearerAuth":[]}],"operationId":"getApiV1UserCaptionRemovalAllProcessing","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/userCaptionRemoval/allProcessing\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]}},"/api/v1/userCaptionRemoval/batchDetail":{"post":{"summary":"Batch query task details","description":"Query details for multiple tasks at once by providing an array of task IDs.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body. Required fields: `ids`.\n### Behavior\n- Fetches several task records in one request, reducing the number of individual detail calls.\n- Results remain subject to the same authentication and ownership checks as single-record lookups.\n- Match returned records by their identifiers instead of relying on response ordering.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userCaptionRemoval/allRecords` — Get all task records.\n- `GET /api/v1/userCaptionRemoval/{_id}` — Get task details.\n- `DELETE /api/v1/userCaptionRemoval/{_id}` — Delete caption removal task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Caption Removal"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"ids":{"type":"array","items":{"type":"string","example":"example"},"description":"Array of task IDs to query","example":["example"]}},"required":["ids"],"example":{"ids":["example"]}},"example":{"ids":["example"]}}}},"responses":{"200":{"description":"Batch details retrieved successfully"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"postApiV1UserCaptionRemovalBatchDetail","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/userCaptionRemoval/batchDetail\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{\n  \"ids\": [\n    \"example\"\n  ]\n}'"}]}},"/api/v1/userCaptionRemoval/{_id}":{"get":{"summary":"Get task details","description":"Return the authenticated user's caption-removal task identified by `_id`, including its current processing status and available output fields.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supply `_id` in the URL path.\n### Behavior\n- Retrieves the current server-side representation of the requested resource or task.\n- For asynchronous tasks, inspect the documented status and result fields before consuming generated media.\n- Repeat the request only as needed for polling and stop after the task reaches a terminal state.\n### Response\n- On `200`, consume the fields defined by that response schema below.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userCaptionRemoval/allRecords` — Get all task records.\n- `DELETE /api/v1/userCaptionRemoval/{_id}` — Delete caption removal task.\n- `POST /api/v1/userCaptionRemoval/start` — Start caption removal task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Caption Removal"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Task details retrieved successfully"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"_id","in":"path","required":true,"schema":{"type":"string","example":"507f1f77bcf86cd799439011"},"description":"Task ID"}],"operationId":"getApiV1UserCaptionRemovalId","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/userCaptionRemoval/{_id}\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]},"delete":{"summary":"Delete caption removal task","description":"Remove the authenticated user's caption-removal task identified by `_id` from the task history without affecting other records.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supply `_id` in the URL path.\n### Behavior\n- Deletes or marks the selected resource as deleted according to the endpoint's documented lifecycle rules.\n- Use the resource identifier from a list, creation, or detail response; deleting one resource does not affect unrelated records.\n- Do not assume an in-progress task can be cancelled unless the endpoint explicitly documents that behavior.\n### Response\n- A `200` response confirms that the deletion request was applied to the selected record.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Bad Request - Invalid task ID.\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userCaptionRemoval/allRecords` — Get all task records.\n- `GET /api/v1/userCaptionRemoval/{_id}` — Get task details.\n- `POST /api/v1/userCaptionRemoval/start` — Start caption removal task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Caption Removal"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Task deleted successfully","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"400":{"description":"Bad Request - Invalid task ID","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"_id","in":"path","required":true,"schema":{"type":"string","example":"507f1f77bcf86cd799439011"},"description":"ID of the caption removal task"}],"operationId":"deleteApiV1UserCaptionRemovalId","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X DELETE \"https://cheap.dev/api/v1/userCaptionRemoval/{_id}\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/userCaptionRemoval/retry":{"post":{"tags":["Caption Removal"],"summary":"Retry a failed task","description":"retry.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- No request body or operation-specific parameters are required.\n### Behavior\n- Requests another processing attempt for an eligible failed task.\n- Eligibility, charging, and state transitions follow the task-specific rules exposed by the response.\n- Continue monitoring the same or returned task identifier after the retry is accepted.\n### Response\n- A `200` response confirms task acceptance; it does not by itself mean media generation has completed.\n- Retain the returned identifier and wait for a documented terminal status before using output URLs.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Bad Request.\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userCaptionRemoval/allRecords` — Get all task records.\n- `GET /api/v1/userCaptionRemoval/{_id}` — Get task details.\n- `DELETE /api/v1/userCaptionRemoval/{_id}` — Delete caption removal task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"},"example":{"success":true,"data":{},"timestamp":"2025-01-14T18:22:13.726Z"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearerAuth":[]}],"operationId":"postApiV1UserCaptionRemovalRetry","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/userCaptionRemoval/retry\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/userUpscale/start":{"post":{"summary":"Start upscale task","description":"Create an asynchronous media-upscaling task for the submitted image or video source and return the record used to monitor processing.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body. Required fields: `source_url`.\n- API-token callers may include `webhook_url` and `webhook_token` for best-effort terminal-state notifications; ordinary JWT/cookie calls ignore these fields.\n### Behavior\n- This is an asynchronous operation: a successful submission creates a task and returns before processing finishes.\n- Persist the returned task identifier and use the corresponding detail or list operation to observe progress.\n- Treat the detail endpoint as the source of truth even when webhook delivery is enabled.\n### Response\n- A `200` response confirms task acceptance; it does not by itself mean media generation has completed.\n- Retain the returned identifier and wait for a documented terminal status before using output URLs.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Bad Request.\n- `401` — Unauthorized.\n### Related Operations\n- `GET /api/v1/userUpscale/allRecords` — Get all task records.\n- `GET /api/v1/userUpscale/{_id}` — Get task details.\n- `DELETE /api/v1/userUpscale/{_id}` — Delete task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Upscale"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"type":"object","properties":{"name":{"type":"string","description":"Name of the upscale task","example":"Upscale media"},"source_url":{"type":"string","description":"URL of the source image or video","example":"https://example.com/video.mp4"}},"required":["source_url"]},{"$ref":"#/components/schemas/WebhookInput"}]},"example":{}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"},"example":{"success":true,"data":{},"timestamp":"2025-01-14T18:22:13.726Z"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"postApiV1UserUpscaleStart","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/userUpscale/start\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/userUpscale/allRecords":{"get":{"summary":"Get all task records","description":"Return the authenticated user's media-upscaling tasks, newest first, using the requested page number and page size.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supported query parameters: `pageNum`, `pageSize`. Omitted values use the defaults shown in the parameter schema.\n### Behavior\n- Returns the collection visible in the current request and authorization context.\n- Apply the documented pagination and filter parameters when present; use response metadata to continue paging.\n- Record fields and status values have the same meaning as in the corresponding detail operation.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userUpscale/{_id}` — Get task details.\n- `DELETE /api/v1/userUpscale/{_id}` — Delete task.\n- `POST /api/v1/userUpscale/start` — Start upscale task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Upscale"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Task list retrieved successfully"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"pageNum","in":"query","required":false,"schema":{"type":"integer","minimum":1,"example":1},"description":"Page number"},{"name":"pageSize","in":"query","required":false,"schema":{"type":"integer","example":10},"description":"Page size"}],"operationId":"getApiV1UserUpscaleAllRecords","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/userUpscale/allRecords\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]}},"/api/v1/userUpscale/batchDetail":{"post":{"summary":"Batch query task details","description":"Query details for multiple tasks at once by providing an array of task IDs.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body. Required fields: `ids`.\n### Behavior\n- Fetches several task records in one request, reducing the number of individual detail calls.\n- Results remain subject to the same authentication and ownership checks as single-record lookups.\n- Match returned records by their identifiers instead of relying on response ordering.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- Non-success responses use the published error envelope; surface the returned message and code to diagnostics.\n### Related Operations\n- `GET /api/v1/userUpscale/allRecords` — Get all task records.\n- `GET /api/v1/userUpscale/{_id}` — Get task details.\n- `DELETE /api/v1/userUpscale/{_id}` — Delete task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Upscale"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"ids":{"type":"array","items":{"type":"string","example":"example"},"description":"Array of task IDs to query","example":["example"]}},"required":["ids"],"example":{"ids":["example"]}},"example":{"ids":["example"]}}}},"responses":{"200":{"description":"Batch details retrieved successfully"}},"operationId":"postApiV1UserUpscaleBatchDetail","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/userUpscale/batchDetail\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{\n  \"ids\": [\n    \"example\"\n  ]\n}'"}]}},"/api/v1/userUpscale/{_id}":{"get":{"summary":"Get task details","description":"Return the authenticated user's media-upscaling task identified by `_id`, including its current processing status and available output fields.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supply `_id` in the URL path.\n### Behavior\n- Retrieves the current server-side representation of the requested resource or task.\n- For asynchronous tasks, inspect the documented status and result fields before consuming generated media.\n- Repeat the request only as needed for polling and stop after the task reaches a terminal state.\n### Response\n- On `200`, consume the fields defined by that response schema below.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- Non-success responses use the published error envelope; surface the returned message and code to diagnostics.\n### Related Operations\n- `GET /api/v1/userUpscale/allRecords` — Get all task records.\n- `DELETE /api/v1/userUpscale/{_id}` — Delete task.\n- `POST /api/v1/userUpscale/start` — Start upscale task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Upscale"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Task details retrieved successfully"}},"parameters":[{"name":"_id","in":"path","required":true,"schema":{"type":"string","example":"507f1f77bcf86cd799439011"},"description":"Task ID"}],"operationId":"getApiV1UserUpscaleId","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/userUpscale/{_id}\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]},"delete":{"summary":"Delete task","description":"Remove the authenticated user's media-upscaling task identified by `_id` from the task history without affecting other records.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supply `_id` in the URL path.\n### Behavior\n- Deletes or marks the selected resource as deleted according to the endpoint's documented lifecycle rules.\n- Use the resource identifier from a list, creation, or detail response; deleting one resource does not affect unrelated records.\n- Do not assume an in-progress task can be cancelled unless the endpoint explicitly documents that behavior.\n### Response\n- A `200` response confirms that the deletion request was applied to the selected record.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userUpscale/allRecords` — Get all task records.\n- `GET /api/v1/userUpscale/{_id}` — Get task details.\n- `POST /api/v1/userUpscale/start` — Start upscale task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Upscale"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Task deleted successfully"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"_id","in":"path","required":true,"schema":{"type":"string","example":"507f1f77bcf86cd799439011"},"description":"Task ID to delete"}],"operationId":"deleteApiV1UserUpscaleId","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X DELETE \"https://cheap.dev/api/v1/userUpscale/{_id}\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/userText2Image/start":{"post":{"summary":"Start text to image generation","description":"Create an asynchronous text-to-image task from the prompt and selected model settings, then return the record used to monitor generated images.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body. Required fields: `prompt`.\n- API-token callers may include `webhook_url` and `webhook_token` for best-effort terminal-state notifications; ordinary JWT/cookie calls ignore these fields.\n### Behavior\n- This is an asynchronous operation: a successful submission creates a task and returns before processing finishes.\n- Persist the returned task identifier and use the corresponding detail or list operation to observe progress.\n- Treat the detail endpoint as the source of truth even when webhook delivery is enabled.\n### Response\n- A `200` response confirms task acceptance; it does not by itself mean media generation has completed.\n- Retain the returned identifier and wait for a documented terminal status before using output URLs.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Bad Request - Invalid parameters.\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userText2Image/allRecords` — Get all text to image records.\n- `GET /api/v1/userText2Image/{_id}` — Get text to image record detail.\n- `DELETE /api/v1/userText2Image/{_id}` — Delete task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Text to Image"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"type":"object","properties":{"name":{"type":"string","description":"Name of the text to image task (optional, auto-generated if not provided)","example":"My Generated Image"},"prompt":{"type":"string","description":"Text prompt for image generation","example":"A beautiful sunset over mountains"},"width":{"type":"number","description":"Image width","default":1024,"example":1024},"height":{"type":"number","description":"Image height","default":1024,"example":1024},"model_type":{"type":"string","description":"Model type to use for generation","enum":["a2e","seedream"],"default":"a2e","example":"a2e"},"input_images":{"type":"array","description":"Reference images for A2E/Seedream model. A2E max 2 images; Seedream 5.0 Pro max 10 images.","items":{"type":"string"},"maxItems":10,"example":["https://example.com/image1.jpg","https://example.com/image2.jpg"]},"skip_face_enhance":{"type":"boolean","description":"Whether to disable face similarity enhancement for A2E image edit. Defaults to false.","default":false,"example":false},"aspect_ratio":{"type":"string","description":"Aspect ratio for Seedream model","enum":["1:1","4:3","3:4","16:9","9:16","2:3","3:2","21:9"],"example":"1:1"},"max_images":{"type":"integer","description":"Maximum number of images to generate (creates multiple tasks internally)","minimum":1,"maximum":8,"example":1}},"required":["prompt"]},{"$ref":"#/components/schemas/WebhookInput"}]},"example":{}}}},"responses":{"200":{"description":"Text to image task started successfully","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"400":{"description":"Bad Request - Invalid parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"postApiV1UserText2ImageStart","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/userText2Image/start\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/userText2Image/allRecords":{"get":{"summary":"Get all text to image records","description":"Retrieve paginated list of all text to image generation records for the authenticated user.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supported query parameters: `pageNum`, `pageSize`. Omitted values use the defaults shown in the parameter schema.\n### Behavior\n- Returns the collection visible in the current request and authorization context.\n- Apply the documented pagination and filter parameters when present; use response metadata to continue paging.\n- Record fields and status values have the same meaning as in the corresponding detail operation.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized.\n### Related Operations\n- `GET /api/v1/userText2Image/{_id}` — Get text to image record detail.\n- `DELETE /api/v1/userText2Image/{_id}` — Delete task.\n- `POST /api/v1/userText2Image/start` — Start text to image generation.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Text to Image"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Records retrieved successfully"},"401":{"description":"Unauthorized"}},"parameters":[{"name":"pageNum","in":"query","required":false,"schema":{"type":"integer","default":1,"example":1},"description":"Page number"},{"name":"pageSize","in":"query","required":false,"schema":{"type":"integer","default":10,"example":10},"description":"Number of records per page"}],"operationId":"getApiV1UserText2ImageAllRecords","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/userText2Image/allRecords\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]}},"/api/v1/userText2Image/batchDetail":{"post":{"summary":"Batch query task details","description":"Query details for multiple tasks at once by providing an array of task IDs.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body. Required fields: `ids`.\n### Behavior\n- Fetches several task records in one request, reducing the number of individual detail calls.\n- Results remain subject to the same authentication and ownership checks as single-record lookups.\n- Match returned records by their identifiers instead of relying on response ordering.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userText2Image/allRecords` — Get all text to image records.\n- `GET /api/v1/userText2Image/{_id}` — Get text to image record detail.\n- `DELETE /api/v1/userText2Image/{_id}` — Delete task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Text to Image"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"ids":{"type":"array","items":{"type":"string","example":"example"},"description":"Array of task IDs to query","example":["example"]}},"required":["ids"],"example":{"ids":["example"]}},"example":{"ids":["example"]}}}},"responses":{"200":{"description":"Batch details retrieved successfully"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"postApiV1UserText2ImageBatchDetail","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/userText2Image/batchDetail\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{\n  \"ids\": [\n    \"example\"\n  ]\n}'"}]}},"/api/v1/userText2Image/{_id}":{"get":{"summary":"Get text to image record detail","description":"Retrieve detailed information of a specific text to image generation record.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supply `_id` in the URL path.\n### Behavior\n- Retrieves the current server-side representation of the requested resource or task.\n- For asynchronous tasks, inspect the documented status and result fields before consuming generated media.\n- Repeat the request only as needed for polling and stop after the task reaches a terminal state.\n### Response\n- On `200`, consume the fields defined by that response schema below.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized.\n- `404` — Record not found.\n### Related Operations\n- `GET /api/v1/userText2Image/allRecords` — Get all text to image records.\n- `DELETE /api/v1/userText2Image/{_id}` — Delete task.\n- `POST /api/v1/userText2Image/start` — Start text to image generation.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Text to Image"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Record detail retrieved successfully"},"401":{"description":"Unauthorized"},"404":{"description":"Record not found"}},"parameters":[{"name":"_id","in":"path","required":true,"schema":{"type":"string","example":"507f1f77bcf86cd799439011"},"description":"Record ID"}],"operationId":"getApiV1UserText2ImageId","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/userText2Image/{_id}\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]},"delete":{"summary":"Delete task","description":"Remove the authenticated user's text-to-image task identified by `_id` from the task history without affecting other generated-image records.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supply `_id` in the URL path.\n### Behavior\n- Deletes or marks the selected resource as deleted according to the endpoint's documented lifecycle rules.\n- Use the resource identifier from a list, creation, or detail response; deleting one resource does not affect unrelated records.\n- Do not assume an in-progress task can be cancelled unless the endpoint explicitly documents that behavior.\n### Response\n- A `200` response confirms that the deletion request was applied to the selected record.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userText2Image/allRecords` — Get all text to image records.\n- `GET /api/v1/userText2Image/{_id}` — Get text to image record detail.\n- `POST /api/v1/userText2Image/start` — Start text to image generation.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Text to Image"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Task deleted successfully"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"_id","in":"path","required":true,"schema":{"type":"string","example":"507f1f77bcf86cd799439011"},"description":"Task ID to delete"}],"operationId":"deleteApiV1UserText2ImageId","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X DELETE \"https://cheap.dev/api/v1/userText2Image/{_id}\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/userText2Image/quickAddAvatar":{"post":{"summary":"Quick add avatar from generated image","description":"Create a custom avatar directly from a text to image generation result.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body. Required fields: `_id`.\n### Behavior\n- Validates the submitted payload and performs the operation described by the request schema.\n- Conditional fields, mutually exclusive inputs, limits, and defaults are enforced as documented by their schemas.\n### Response\n- On `200`, consume the fields defined by that response schema below.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Bad request.\n- `401` — Unauthorized.\n### Related Operations\n- `GET /api/v1/userText2Image/allRecords` — Get all text to image records.\n- `GET /api/v1/userText2Image/{_id}` — Get text to image record detail.\n- `DELETE /api/v1/userText2Image/{_id}` — Delete task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Text to Image"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"_id":{"type":"string","description":"Text to image record ID","example":"507f1f77bcf86cd799439011"},"gender":{"type":"string","enum":["female","male"],"description":"Avatar gender","example":"female"}},"required":["_id"],"example":{"_id":"507f1f77bcf86cd799439011","gender":"female"}},"example":{"_id":"507f1f77bcf86cd799439011","gender":"female"}}}},"responses":{"200":{"description":"Avatar created successfully"},"400":{"description":"Bad request"},"401":{"description":"Unauthorized"}},"operationId":"postApiV1UserText2ImageQuickAddAvatar","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/userText2Image/quickAddAvatar\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{\n  \"_id\": \"507f1f77bcf86cd799439011\",\n  \"gender\": \"female\"\n}'"}]}},"/api/v1/userNanoBanana/start":{"post":{"summary":"Start Nano Banana image generation","description":"Generate images using Nano Banana models with advanced conversational capabilities and NSFW content pre-filtering.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body. Required fields: `name`, `prompt`.\n- API-token callers may include `webhook_url` and `webhook_token` for best-effort terminal-state notifications; ordinary JWT/cookie calls ignore these fields.\n### Behavior\n- This is an asynchronous operation: a successful submission creates a task and returns before processing finishes.\n- Persist the returned task identifier and use the corresponding detail or list operation to observe progress.\n- Treat the detail endpoint as the source of truth even when webhook delivery is enabled.\n### Response\n- A `200` response confirms task acceptance; it does not by itself mean media generation has completed.\n- Retain the returned identifier and wait for a documented terminal status before using output URLs.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Bad Request - Invalid parameters.\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userNanoBanana/allRecords` — Get Nano Banana task list.\n- `GET /api/v1/userNanoBanana/detail/{id}` — Get task details.\n- `DELETE /api/v1/userNanoBanana/delete/{id}` — Delete task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Nano Banana"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"type":"object","properties":{"name":{"type":"string","description":"Name of the image generation task","example":"Beautiful Landscape"},"prompt":{"type":"string","description":"Text prompt for image generation","example":"A serene mountain landscape at sunset with a crystal clear lake"},"model":{"type":"string","description":"Model to use for generation. Options: nano-banana (no resolution control, auto edit mode with images), nano-banana-pro (with resolution control), nano-banana-2 (with resolution control), nano-banana-2-lite (1K only)","enum":["nano-banana","nano-banana-pro","nano-banana-2","nano-banana-2-lite"],"default":"nano-banana-pro","example":"nano-banana-pro"},"input_images":{"type":"array","items":{"type":"string"},"description":"Array of input image URLs (for editing and composition modes)","example":["https://example.com/image1.jpg"]},"aspect_ratio":{"type":"string","description":"Aspect ratio of the generated image. Options: auto, 16:9, 1:1, 9:16, 4:3, 3:4, 2:3, 3:2, 4:5, 5:4, 21:9","enum":["auto","16:9","1:1","9:16","4:3","3:4","2:3","3:2","4:5","5:4","21:9"],"default":"auto","example":"auto"},"image_size":{"type":"string","description":"Size of the generated image. Options: 1K, 2K, 4K. Note: supported by nano-banana-pro and nano-banana-2 models; nano-banana-2-lite is always forced to 1K.","enum":["1K","2K","4K"],"default":"1K","example":"1K"},"google_search":{"type":"boolean","description":"Use Google Web Search grounding to generate images based on real-time information. Only supported by nano-banana-2 model.","default":false},"force_generate":{"type":"boolean","description":"Force generation even if NSFW content is detected. Defaults to true for API users, false for web users","default":true}},"required":["name","prompt"]},{"$ref":"#/components/schemas/WebhookInput"}]},"example":{}}}},"responses":{"200":{"description":"Nano Banana task started successfully or NSFW content detected","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"400":{"description":"Bad Request - Invalid parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"postApiV1UserNanoBananaStart","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/userNanoBanana/start\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/userNanoBanana/allRecords":{"get":{"summary":"Get Nano Banana task list","description":"Retrieve paginated list of user's Nano Banana image generation tasks.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supported query parameters: `pageNum`, `pageSize`, `status`. Omitted values use the defaults shown in the parameter schema.\n### Behavior\n- Returns the collection visible in the current request and authorization context.\n- Apply the documented pagination and filter parameters when present; use response metadata to continue paging.\n- Record fields and status values have the same meaning as in the corresponding detail operation.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userNanoBanana/detail/{id}` — Get task details.\n- `DELETE /api/v1/userNanoBanana/delete/{id}` — Delete task.\n- `POST /api/v1/userNanoBanana/start` — Start Nano Banana image generation.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Nano Banana"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Task list retrieved successfully","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"pageNum","in":"query","required":true,"schema":{"type":"integer","minimum":1,"example":1},"description":"Page number"},{"name":"pageSize","in":"query","required":true,"schema":{"type":"integer","minimum":1,"maximum":100,"example":1},"description":"Number of items per page"},{"name":"status","in":"query","required":false,"schema":{"type":"string","enum":["initialized","processing","completed","failed"],"example":"initialized"},"description":"Filter by task status"}],"operationId":"getApiV1UserNanoBananaAllRecords","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/userNanoBanana/allRecords\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]}},"/api/v1/userNanoBanana/batchDetail":{"post":{"summary":"Batch query task details","description":"Query details for multiple tasks at once by providing an array of task IDs.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body. Required fields: `ids`.\n### Behavior\n- Fetches several task records in one request, reducing the number of individual detail calls.\n- Results remain subject to the same authentication and ownership checks as single-record lookups.\n- Match returned records by their identifiers instead of relying on response ordering.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userNanoBanana/allRecords` — Get Nano Banana task list.\n- `GET /api/v1/userNanoBanana/detail/{id}` — Get task details.\n- `DELETE /api/v1/userNanoBanana/delete/{id}` — Delete task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Nano Banana"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"ids":{"type":"array","items":{"type":"string","example":"example"},"description":"Array of task IDs to query","example":["example"]}},"required":["ids"],"example":{"ids":["example"]}},"example":{"ids":["example"]}}}},"responses":{"200":{"description":"Batch details retrieved successfully"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"postApiV1UserNanoBananaBatchDetail","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/userNanoBanana/batchDetail\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{\n  \"ids\": [\n    \"example\"\n  ]\n}'"}]}},"/api/v1/userNanoBanana/detail/{id}":{"get":{"summary":"Get task details","description":"Retrieve detailed information about a specific Nano Banana task.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supply `id` in the URL path.\n### Behavior\n- Retrieves the current server-side representation of the requested resource or task.\n- For asynchronous tasks, inspect the documented status and result fields before consuming generated media.\n- Repeat the request only as needed for polling and stop after the task reaches a terminal state.\n### Response\n- On `200`, consume the fields defined by that response schema below.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n- `404` — Task not found.\n### Related Operations\n- `GET /api/v1/userNanoBanana/allRecords` — Get Nano Banana task list.\n- `DELETE /api/v1/userNanoBanana/delete/{id}` — Delete task.\n- `POST /api/v1/userNanoBanana/start` — Start Nano Banana image generation.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Nano Banana"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Task details retrieved successfully"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Task not found"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","example":"507f1f77bcf86cd799439011"},"description":"Task ID"}],"operationId":"getApiV1UserNanoBananaDetailId","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/userNanoBanana/detail/{id}\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]}},"/api/v1/userNanoBanana/delete/{id}":{"delete":{"summary":"Delete task","description":"Soft-delete the authenticated user's Nano Banana image task identified by `id`, preserving the stored record while excluding it from normal task lists.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supply `id` in the URL path.\n### Behavior\n- Deletes or marks the selected resource as deleted according to the endpoint's documented lifecycle rules.\n- Use the resource identifier from a list, creation, or detail response; deleting one resource does not affect unrelated records.\n- Do not assume an in-progress task can be cancelled unless the endpoint explicitly documents that behavior.\n### Response\n- A `200` response confirms that the deletion request was applied to the selected record.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n- `404` — Task not found.\n### Related Operations\n- `GET /api/v1/userNanoBanana/allRecords` — Get Nano Banana task list.\n- `GET /api/v1/userNanoBanana/detail/{id}` — Get task details.\n- `POST /api/v1/userNanoBanana/start` — Start Nano Banana image generation.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Nano Banana"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Task deleted successfully"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Task not found"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","example":"507f1f77bcf86cd799439011"},"description":"Task ID to delete"}],"operationId":"deleteApiV1UserNanoBananaDeleteId","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X DELETE \"https://cheap.dev/api/v1/userNanoBanana/delete/{id}\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/userPhotobook/start":{"post":{"summary":"Start photobook generation","description":"Create a photobook generation task using one face image and optional location/clothing prompts. The service will generate 4, 8, 12, or 16 final photos depending on total_count.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body. Required fields: `face_image_url`.\n### Behavior\n- Validates the submitted payload and performs the operation described by the request schema.\n- Conditional fields, mutually exclusive inputs, limits, and defaults are enforced as documented by their schemas.\n### Response\n- On `200`, consume the fields defined by that response schema below.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Bad Request - Invalid parameters.\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userPhotobook/allRecords` — Get photobook records.\n- `GET /api/v1/userPhotobook/{id}` — Get photobook record detail.\n- `DELETE /api/v1/userPhotobook/{id}` — Delete photobook record.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Photobook"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Display name for this photobook batch","example":"Summer Travel Album"},"face_image_url":{"type":"string","description":"Source face image URL used for all generated photos","example":"https://example.com/face.jpg"},"location":{"type":"string","description":"Scene or location prompt","example":"Paris street cafe at golden hour"},"clothing":{"type":"string","description":"Clothing prompt applied during the image edit step","example":"elegant white dress"},"total_count":{"type":"integer","description":"Total number of photos to generate","enum":[4,8,12,16],"default":4,"example":8}},"required":["face_image_url"],"example":{"name":"Summer Travel Album","face_image_url":"https://example.com/face.jpg","location":"Paris street cafe at golden hour","clothing":"elegant white dress","total_count":8}},"example":{"name":"Summer Travel Album","face_image_url":"https://example.com/face.jpg","location":"Paris street cafe at golden hour","clothing":"elegant white dress","total_count":8}}}},"responses":{"200":{"description":"Photobook task started successfully","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"400":{"description":"Bad Request - Invalid parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"postApiV1UserPhotobookStart","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/userPhotobook/start\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{\n  \"name\": \"Summer Travel Album\",\n  \"face_image_url\": \"https://example.com/face.jpg\",\n  \"location\": \"Paris street cafe at golden hour\",\n  \"clothing\": \"elegant white dress\",\n  \"total_count\": 8\n}'"}]}},"/api/v1/userPhotobook/allRecords":{"get":{"summary":"Get photobook records","description":"Return the authenticated user's photobook-generation records using `pageNum` and `pageSize`, with newest records presented first.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supported query parameters: `pageNum`, `pageSize`. Omitted values use the defaults shown in the parameter schema.\n### Behavior\n- Returns the collection visible in the current request and authorization context.\n- Apply the documented pagination and filter parameters when present; use response metadata to continue paging.\n- Record fields and status values have the same meaning as in the corresponding detail operation.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Bad Request - Invalid pagination parameters.\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userPhotobook/{id}` — Get photobook record detail.\n- `DELETE /api/v1/userPhotobook/{id}` — Delete photobook record.\n- `POST /api/v1/userPhotobook/start` — Start photobook generation.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Photobook"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Photobook records retrieved successfully","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"400":{"description":"Bad Request - Invalid pagination parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"pageNum","in":"query","required":false,"schema":{"type":"integer","default":1,"example":1},"description":"Page number"},{"name":"pageSize","in":"query","required":false,"schema":{"type":"integer","default":20,"example":20},"description":"Page size"}],"operationId":"getApiV1UserPhotobookAllRecords","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/userPhotobook/allRecords\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]}},"/api/v1/userPhotobook/batchDetail":{"post":{"summary":"Batch query task details","description":"Query details for multiple photobook tasks at once by providing an array of task IDs. Only records owned by the authenticated user are returned.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body. Required fields: `ids`.\n### Behavior\n- Fetches several task records in one request, reducing the number of individual detail calls.\n- Results remain subject to the same authentication and ownership checks as single-record lookups.\n- Match returned records by their identifiers instead of relying on response ordering.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userPhotobook/allRecords` — Get photobook records.\n- `GET /api/v1/userPhotobook/{id}` — Get photobook record detail.\n- `DELETE /api/v1/userPhotobook/{id}` — Delete photobook record.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Photobook"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"ids":{"type":"array","items":{"type":"string","example":"example"},"description":"Array of photobook task IDs to query","example":["example"]}},"required":["ids"],"example":{"ids":["example"]}},"example":{"ids":["example"]}}}},"responses":{"200":{"description":"Batch details retrieved successfully"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"postApiV1UserPhotobookBatchDetail","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/userPhotobook/batchDetail\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{\n  \"ids\": [\n    \"example\"\n  ]\n}'"}]}},"/api/v1/userPhotobook/{id}":{"get":{"summary":"Get photobook record detail","description":"Get one photobook record by id. The endpoint also syncs the latest pipeline status before returning.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supply `id` in the URL path.\n### Behavior\n- Retrieves the current server-side representation of the requested resource or task.\n- For asynchronous tasks, inspect the documented status and result fields before consuming generated media.\n- Repeat the request only as needed for polling and stop after the task reaches a terminal state.\n### Response\n- On `200`, consume the fields defined by that response schema below.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n- `404` — Record not found.\n### Related Operations\n- `GET /api/v1/userPhotobook/allRecords` — Get photobook records.\n- `DELETE /api/v1/userPhotobook/{id}` — Delete photobook record.\n- `POST /api/v1/userPhotobook/start` — Start photobook generation.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Photobook"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Photobook record detail retrieved successfully","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Record not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","example":"507f1f77bcf86cd799439011"},"description":"Photobook record id"}],"operationId":"getApiV1UserPhotobookId","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/userPhotobook/{id}\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]},"delete":{"summary":"Delete photobook record","description":"Remove the photobook record identified by `id` only when it belongs to the authenticated user; unrelated photobook records are unchanged.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supply `id` in the URL path.\n### Behavior\n- Deletes or marks the selected resource as deleted according to the endpoint's documented lifecycle rules.\n- Use the resource identifier from a list, creation, or detail response; deleting one resource does not affect unrelated records.\n- Do not assume an in-progress task can be cancelled unless the endpoint explicitly documents that behavior.\n### Response\n- A `200` response confirms that the deletion request was applied to the selected record.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Bad Request - Photobook record cannot be deleted in its current status (for example, processing)\n- `401` — Unauthorized - Invalid or missing JWT token.\n- `404` — Not Found - Photobook record does not exist or is not accessible by the current user.\n### Related Operations\n- `GET /api/v1/userPhotobook/allRecords` — Get photobook records.\n- `GET /api/v1/userPhotobook/{id}` — Get photobook record detail.\n- `POST /api/v1/userPhotobook/start` — Start photobook generation.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Photobook"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Photobook record deleted successfully","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"400":{"description":"Bad Request - Photobook record cannot be deleted in its current status (for example, processing)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not Found - Photobook record does not exist or is not accessible by the current user","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","example":"507f1f77bcf86cd799439011"},"description":"Photobook record id"}],"operationId":"deleteApiV1UserPhotobookId","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X DELETE \"https://cheap.dev/api/v1/userPhotobook/{id}\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/userGptImage/start":{"post":{"summary":"Start GPT Image generation or editing","description":"Generate images from text or edit existing images using GPT Image (4o Image) model.\n**Features:**\n- Text-to-Image generation\n- Image-to-Image editing (supports up to 16 reference images)\n- High-fidelity visuals with accurate text rendering\n**Output:**\n- Images are stored in R2 storage and expire after 3 days.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body. Required fields: `name`, `prompt`.\n- API-token callers may include `webhook_url` and `webhook_token` for best-effort terminal-state notifications; ordinary JWT/cookie calls ignore these fields.\n### Behavior\n- This is an asynchronous operation: a successful submission creates a task and returns before processing finishes.\n- Persist the returned task identifier and use the corresponding detail or list operation to observe progress.\n- Treat the detail endpoint as the source of truth even when webhook delivery is enabled.\n### Response\n- A `200` response confirms task acceptance; it does not by itself mean media generation has completed.\n- Retain the returned identifier and wait for a documented terminal status before using output URLs.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userGptImage/list` — Get GPT Image task list.\n- `GET /api/v1/userGptImage/detail/{id}` — Get task details.\n- `DELETE /api/v1/userGptImage/{id}` — Delete GPT Image task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["GPT Image"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"type":"object","properties":{"name":{"type":"string","description":"Name of the image generation task"},"prompt":{"type":"string","description":"Text prompt for image generation (max 3000 chars)"},"input_images":{"type":"array","items":{"type":"string"},"description":"Array of input image URLs for image-to-image editing (up to 16 images for GPT Image 1.5)"},"model":{"type":"string","enum":["gpt-image-1.5","gpt-image-2"],"default":"gpt-image-1.5","description":"Model variant. gpt-image-1.5 (20/35 coins) supports both aspect_ratio and quality. gpt-image-2 (25/35/45 coins per image based on resolution: 1K=25, 2K=35, 4K=45; aspect_ratio=auto is billed as 1K, aspect_ratio=1:1 + 4K is downgraded to 2K) follows the current model spec: quality is fixed to medium; aspect_ratio exposes 9 ratios (auto/1:1/9:16/21:9/16:9/4:3/3:2/3:4/2:3); resolution supports 1K/2K/4K."},"aspect_ratio":{"type":"string","enum":["auto","1:1","9:16","21:9","16:9","4:3","3:2","3:4","2:3"],"default":"1:1","description":"gpt-image-1.5 only supports 1:1/3:2/2:3 (other values are normalized to 1:1). gpt-image-2 supports 9 ratios. Note: 5:4/4:5 are not exposed because fallback generation would lose the aspect ratio."},"quality":{"type":"string","enum":["medium","high"],"default":"medium","description":"Image quality level. Only used by gpt-image-1.5"},"resolution":{"type":"string","enum":["1K","2K","4K"],"default":"1K","description":"Image resolution. Only used by gpt-image-2. Constraints: aspect_ratio=1:1 cannot use 4K; aspect_ratio=auto (or omitted) only supports 1K, otherwise upstream will reject the task."},"force_generate":{"type":"boolean","description":"Force generation even if NSFW content is detected"}},"required":["name","prompt"]},{"$ref":"#/components/schemas/WebhookInput"}]},"example":{}}}},"responses":{"200":{"description":"Task started successfully or NSFW content detected"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"postApiV1UserGptImageStart","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/userGptImage/start\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/userGptImage/list":{"get":{"summary":"Get GPT Image task list","description":"Return the authenticated user's GPT Image generation and editing tasks using the requested pagination controls.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supported query parameters: `page`, `page_size`. Omitted values use the defaults shown in the parameter schema.\n### Behavior\n- Returns the collection visible in the current request and authorization context.\n- Apply the documented pagination and filter parameters when present; use response metadata to continue paging.\n- Record fields and status values have the same meaning as in the corresponding detail operation.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userGptImage/detail/{id}` — Get task details.\n- `DELETE /api/v1/userGptImage/{id}` — Delete GPT Image task.\n- `POST /api/v1/userGptImage/start` — Start GPT Image generation or editing.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["GPT Image"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Task list retrieved successfully"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":1,"example":1},"description":"page parameter"},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","default":20,"example":20},"description":"page_size parameter"}],"operationId":"getApiV1UserGptImageList","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/userGptImage/list\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]}},"/api/v1/userGptImage/batchDetail":{"post":{"summary":"Batch query task details","description":"Query details for multiple tasks at once by providing an array of task IDs.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body. Required fields: `ids`.\n### Behavior\n- Fetches several task records in one request, reducing the number of individual detail calls.\n- Results remain subject to the same authentication and ownership checks as single-record lookups.\n- Match returned records by their identifiers instead of relying on response ordering.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userGptImage/list` — Get GPT Image task list.\n- `GET /api/v1/userGptImage/detail/{id}` — Get task details.\n- `DELETE /api/v1/userGptImage/{id}` — Delete GPT Image task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["GPT Image"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"ids":{"type":"array","items":{"type":"string","example":"example"},"description":"Array of task IDs to query","example":["example"]}},"required":["ids"],"example":{"ids":["example"]}},"example":{"ids":["example"]}}}},"responses":{"200":{"description":"Batch details retrieved successfully"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"postApiV1UserGptImageBatchDetail","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/userGptImage/batchDetail\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{\n  \"ids\": [\n    \"example\"\n  ]\n}'"}]}},"/api/v1/userGptImage/detail/{id}":{"get":{"summary":"Get task details","description":"Return the authenticated user's GPT Image generation or editing task identified by `id`, including its current status and generated image fields.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supply `id` in the URL path.\n### Behavior\n- Retrieves the current server-side representation of the requested resource or task.\n- For asynchronous tasks, inspect the documented status and result fields before consuming generated media.\n- Repeat the request only as needed for polling and stop after the task reaches a terminal state.\n### Response\n- On `200`, consume the fields defined by that response schema below.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userGptImage/list` — Get GPT Image task list.\n- `DELETE /api/v1/userGptImage/{id}` — Delete GPT Image task.\n- `POST /api/v1/userGptImage/start` — Start GPT Image generation or editing.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["GPT Image"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Task detail retrieved successfully"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","example":"507f1f77bcf86cd799439011"},"description":"id parameter"}],"operationId":"getApiV1UserGptImageDetailId","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/userGptImage/detail/{id}\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]}},"/api/v1/userGptImage/{id}":{"delete":{"summary":"Delete GPT Image task","description":"Soft-delete the authenticated user's GPT Image task identified by `id`; the task is excluded from subsequent list results.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supply `id` in the URL path.\n### Behavior\n- Deletes or marks the selected resource as deleted according to the endpoint's documented lifecycle rules.\n- Use the resource identifier from a list, creation, or detail response; deleting one resource does not affect unrelated records.\n- Do not assume an in-progress task can be cancelled unless the endpoint explicitly documents that behavior.\n### Response\n- A `200` response confirms that the deletion request was applied to the selected record.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userGptImage/list` — Get GPT Image task list.\n- `GET /api/v1/userGptImage/detail/{id}` — Get task details.\n- `POST /api/v1/userGptImage/start` — Start GPT Image generation or editing.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["GPT Image"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Task deleted successfully"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","example":"507f1f77bcf86cd799439011"},"description":"id parameter"}],"operationId":"deleteApiV1UserGptImageId","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X DELETE \"https://cheap.dev/api/v1/userGptImage/{id}\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/userWan26Image/start":{"post":{"summary":"Start a new Wan2.6-Image generation task","description":"Create an asynchronous Wan 2.6 image task from a text prompt, with optional input images and generation controls defined by the request schema.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body. Required fields: `name`, `prompt`.\n- API-token callers may include `webhook_url` and `webhook_token` for best-effort terminal-state notifications; ordinary JWT/cookie calls ignore these fields.\n### Behavior\n- This is an asynchronous operation: a successful submission creates a task and returns before processing finishes.\n- Persist the returned task identifier and use the corresponding detail or list operation to observe progress.\n- Treat the detail endpoint as the source of truth even when webhook delivery is enabled.\n### Response\n- A `200` response confirms task acceptance; it does not by itself mean media generation has completed.\n- Retain the returned identifier and wait for a documented terminal status before using output URLs.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userWan26Image/list` — Get task list.\n- `GET /api/v1/userWan26Image/detail/{id}` — Get task details.\n- `DELETE /api/v1/userWan26Image/{id}` — Delete task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Wan2.6 Image"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"type":"object","properties":{"name":{"type":"string"},"prompt":{"type":"string","description":"Text prompt (max 2000 chars)"},"input_images":{"type":"array","items":{"type":"string"},"description":"Input images for editing (0-4 images)"},"aspect_ratio":{"type":"string","enum":["1:1","3:2","2:3","4:3","3:4","16:9","9:16","21:9"],"default":"1:1"},"negative_prompt":{"type":"string","description":"Negative prompt (max 500 chars)"},"prompt_extend":{"type":"boolean","default":true,"description":"Enable smart prompt rewriting"},"force_generate":{"type":"boolean"}},"required":["name","prompt"]},{"$ref":"#/components/schemas/WebhookInput"}]},"example":{}}}},"responses":{"200":{"description":"Task started successfully or NSFW content detected"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"postApiV1UserWan26ImageStart","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/userWan26Image/start\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/userWan26Image/list":{"get":{"summary":"Get task list","description":"Return the authenticated user's Wan 2.6 image tasks using the requested pagination controls.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supported query parameters: `page`, `page_size`. Omitted values use the defaults shown in the parameter schema.\n### Behavior\n- Returns the collection visible in the current request and authorization context.\n- Apply the documented pagination and filter parameters when present; use response metadata to continue paging.\n- Record fields and status values have the same meaning as in the corresponding detail operation.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userWan26Image/detail/{id}` — Get task details.\n- `DELETE /api/v1/userWan26Image/{id}` — Delete task.\n- `POST /api/v1/userWan26Image/start` — Start a new Wan2.6-Image generation task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Wan2.6 Image"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Task list retrieved successfully"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":1,"example":1},"description":"page parameter"},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","default":20,"example":20},"description":"page_size parameter"}],"operationId":"getApiV1UserWan26ImageList","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/userWan26Image/list\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]}},"/api/v1/userWan26Image/detail/{id}":{"get":{"summary":"Get task details","description":"Return the authenticated user's Wan 2.6 image task identified by `id`, including its current status and generated image fields.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supply `id` in the URL path.\n### Behavior\n- Retrieves the current server-side representation of the requested resource or task.\n- For asynchronous tasks, inspect the documented status and result fields before consuming generated media.\n- Repeat the request only as needed for polling and stop after the task reaches a terminal state.\n### Response\n- On `200`, consume the fields defined by that response schema below.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userWan26Image/list` — Get task list.\n- `DELETE /api/v1/userWan26Image/{id}` — Delete task.\n- `POST /api/v1/userWan26Image/start` — Start a new Wan2.6-Image generation task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Wan2.6 Image"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Task detail retrieved successfully"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","example":"507f1f77bcf86cd799439011"},"description":"id parameter"}],"operationId":"getApiV1UserWan26ImageDetailId","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/userWan26Image/detail/{id}\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]}},"/api/v1/userWan26Image/batchDetail":{"post":{"summary":"Batch query task details","description":"Query details for multiple tasks at once by providing an array of task IDs.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body. Required fields: `ids`.\n### Behavior\n- Fetches several task records in one request, reducing the number of individual detail calls.\n- Results remain subject to the same authentication and ownership checks as single-record lookups.\n- Match returned records by their identifiers instead of relying on response ordering.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userWan26Image/list` — Get task list.\n- `GET /api/v1/userWan26Image/detail/{id}` — Get task details.\n- `DELETE /api/v1/userWan26Image/{id}` — Delete task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Wan2.6 Image"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"ids":{"type":"array","items":{"type":"string","example":"example"},"description":"Array of task IDs to query","example":["example"]}},"required":["ids"],"example":{"ids":["example"]}},"example":{"ids":["example"]}}}},"responses":{"200":{"description":"Batch details retrieved successfully"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"postApiV1UserWan26ImageBatchDetail","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/userWan26Image/batchDetail\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{\n  \"ids\": [\n    \"example\"\n  ]\n}'"}]}},"/api/v1/userWan26Image/{id}":{"delete":{"summary":"Delete task","description":"Soft-delete the authenticated user's Wan 2.6 image task identified by `id`; the task is excluded from subsequent list results.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supply `id` in the URL path.\n### Behavior\n- Deletes or marks the selected resource as deleted according to the endpoint's documented lifecycle rules.\n- Use the resource identifier from a list, creation, or detail response; deleting one resource does not affect unrelated records.\n- Do not assume an in-progress task can be cancelled unless the endpoint explicitly documents that behavior.\n### Response\n- A `200` response confirms that the deletion request was applied to the selected record.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userWan26Image/list` — Get task list.\n- `GET /api/v1/userWan26Image/detail/{id}` — Get task details.\n- `POST /api/v1/userWan26Image/start` — Start a new Wan2.6-Image generation task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Wan2.6 Image"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Task deleted successfully"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","example":"507f1f77bcf86cd799439011"},"description":"id parameter"}],"operationId":"deleteApiV1UserWan26ImageId","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X DELETE \"https://cheap.dev/api/v1/userWan26Image/{id}\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/userWan27Image/start":{"post":{"summary":"Start a new Wan2.7-Image generation task","description":"Create an asynchronous Wan 2.7 image task from a text prompt, with optional input images and generation controls defined by the request schema.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body. Required fields: `name`, `prompt`.\n- API-token callers may include `webhook_url` and `webhook_token` for best-effort terminal-state notifications; ordinary JWT/cookie calls ignore these fields.\n### Behavior\n- This is an asynchronous operation: a successful submission creates a task and returns before processing finishes.\n- Persist the returned task identifier and use the corresponding detail or list operation to observe progress.\n- Treat the detail endpoint as the source of truth even when webhook delivery is enabled.\n### Response\n- A `200` response confirms task acceptance; it does not by itself mean media generation has completed.\n- Retain the returned identifier and wait for a documented terminal status before using output URLs.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userWan27Image/list` — Get task list.\n- `GET /api/v1/userWan27Image/detail/{id}` — Get task details.\n- `DELETE /api/v1/userWan27Image/{id}` — Delete task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Wan2.7 Image"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"type":"object","properties":{"name":{"type":"string"},"prompt":{"type":"string","description":"Text prompt (max 5000 chars)"},"model":{"type":"string","enum":["wan2.7-image","wan2.7-image-pro"],"default":"wan2.7-image"},"input_images":{"type":"array","items":{"type":"string"},"description":"Input images for editing (0-9 images, max 20MB each)"},"aspect_ratio":{"type":"string","enum":["1:1","3:2","2:3","4:3","3:4","16:9","9:16","21:9"],"default":"1:1"},"bbox_list":{"type":"array","description":"Bounding boxes for interactive editing"},"force_generate":{"type":"boolean"}},"required":["name","prompt"]},{"$ref":"#/components/schemas/WebhookInput"}]},"example":{}}}},"responses":{"200":{"description":"Task started successfully or NSFW content detected"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"postApiV1UserWan27ImageStart","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/userWan27Image/start\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/userWan27Image/list":{"get":{"summary":"Get task list","description":"Return the authenticated user's Wan 2.7 image tasks using the requested pagination controls.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supported query parameters: `page`, `page_size`. Omitted values use the defaults shown in the parameter schema.\n### Behavior\n- Returns the collection visible in the current request and authorization context.\n- Apply the documented pagination and filter parameters when present; use response metadata to continue paging.\n- Record fields and status values have the same meaning as in the corresponding detail operation.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userWan27Image/detail/{id}` — Get task details.\n- `DELETE /api/v1/userWan27Image/{id}` — Delete task.\n- `POST /api/v1/userWan27Image/start` — Start a new Wan2.7-Image generation task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Wan2.7 Image"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Task list retrieved successfully"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":1,"example":1},"description":"page parameter"},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","default":20,"example":20},"description":"page_size parameter"}],"operationId":"getApiV1UserWan27ImageList","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/userWan27Image/list\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]}},"/api/v1/userWan27Image/detail/{id}":{"get":{"summary":"Get task details","description":"Return the authenticated user's Wan 2.7 image task identified by `id`, including its current status and generated image fields.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supply `id` in the URL path.\n### Behavior\n- Retrieves the current server-side representation of the requested resource or task.\n- For asynchronous tasks, inspect the documented status and result fields before consuming generated media.\n- Repeat the request only as needed for polling and stop after the task reaches a terminal state.\n### Response\n- On `200`, consume the fields defined by that response schema below.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userWan27Image/list` — Get task list.\n- `DELETE /api/v1/userWan27Image/{id}` — Delete task.\n- `POST /api/v1/userWan27Image/start` — Start a new Wan2.7-Image generation task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Wan2.7 Image"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Task detail retrieved successfully"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","example":"507f1f77bcf86cd799439011"},"description":"id parameter"}],"operationId":"getApiV1UserWan27ImageDetailId","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/userWan27Image/detail/{id}\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]}},"/api/v1/userWan27Image/batchDetail":{"post":{"summary":"Batch query task details","description":"Query details for multiple tasks at once by providing an array of task IDs.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body. Required fields: `ids`.\n### Behavior\n- Fetches several task records in one request, reducing the number of individual detail calls.\n- Results remain subject to the same authentication and ownership checks as single-record lookups.\n- Match returned records by their identifiers instead of relying on response ordering.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userWan27Image/list` — Get task list.\n- `GET /api/v1/userWan27Image/detail/{id}` — Get task details.\n- `DELETE /api/v1/userWan27Image/{id}` — Delete task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Wan2.7 Image"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"ids":{"type":"array","items":{"type":"string","example":"example"},"description":"Array of task IDs to query","example":["example"]}},"required":["ids"],"example":{"ids":["example"]}},"example":{"ids":["example"]}}}},"responses":{"200":{"description":"Batch details retrieved successfully"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"postApiV1UserWan27ImageBatchDetail","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/userWan27Image/batchDetail\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{\n  \"ids\": [\n    \"example\"\n  ]\n}'"}]}},"/api/v1/userWan27Image/{id}":{"delete":{"summary":"Delete task","description":"Soft-delete the authenticated user's Wan 2.7 image task identified by `id`; the task is excluded from subsequent list results.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supply `id` in the URL path.\n### Behavior\n- Deletes or marks the selected resource as deleted according to the endpoint's documented lifecycle rules.\n- Use the resource identifier from a list, creation, or detail response; deleting one resource does not affect unrelated records.\n- Do not assume an in-progress task can be cancelled unless the endpoint explicitly documents that behavior.\n### Response\n- A `200` response confirms that the deletion request was applied to the selected record.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userWan27Image/list` — Get task list.\n- `GET /api/v1/userWan27Image/detail/{id}` — Get task details.\n- `POST /api/v1/userWan27Image/start` — Start a new Wan2.7-Image generation task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Wan2.7 Image"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Task deleted successfully"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","example":"507f1f77bcf86cd799439011"},"description":"id parameter"}],"operationId":"deleteApiV1UserWan27ImageId","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X DELETE \"https://cheap.dev/api/v1/userWan27Image/{id}\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/userQwen2Image/start":{"post":{"summary":"Start a new Qwen2 image generation/edit task","description":"Create an asynchronous Qwen2 task for text-to-image generation or image editing, according to `creation_mode` and the supplied input images.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body. Required fields: `name`, `prompt`.\n- API-token callers may include `webhook_url` and `webhook_token` for best-effort terminal-state notifications; ordinary JWT/cookie calls ignore these fields.\n### Behavior\n- This is an asynchronous operation: a successful submission creates a task and returns before processing finishes.\n- Persist the returned task identifier and use the corresponding detail or list operation to observe progress.\n- Treat the detail endpoint as the source of truth even when webhook delivery is enabled.\n### Response\n- A `200` response confirms task acceptance; it does not by itself mean media generation has completed.\n- Retain the returned identifier and wait for a documented terminal status before using output URLs.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userQwen2Image/list` — List Qwen2 image tasks.\n- `GET /api/v1/userQwen2Image/detail/{id}` — Get Qwen2 image task details.\n- `DELETE /api/v1/userQwen2Image/{id}` — Delete a Qwen2 image task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Qwen Image"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"type":"object","properties":{"name":{"type":"string","description":"Task name"},"prompt":{"type":"string","description":"Image generation or editing prompt"},"model":{"type":"string","enum":["qwen-image-2.0","qwen-image-2.0-pro","qwen-image-3.0","qwen-image-3.0-pro"],"default":"qwen-image-2.0"},"input_images":{"type":"array","items":{"type":"string"},"description":"Optional public reference image URLs"},"size":{"type":"string","enum":["1024*1024","1328*880","880*1328","1152*864","864*1152","1280*720","720*1280","1512*648","2048*2048","2048*1365","1365*2048","2048*1536","1536*2048","2048*1152","1152*2048"],"description":"1K sizes are supported by all Qwen Image models. 2K sizes (2048*) are supported only by qwen-image-3.0-pro.","default":"1024*1024"}},"required":["name","prompt"]},{"$ref":"#/components/schemas/WebhookInput"}]},"example":{}}}},"responses":{"200":{"description":"Task created successfully"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"postApiV1UserQwen2ImageStart","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/userQwen2Image/start\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/userQwen2Image/list":{"get":{"summary":"List Qwen2 image tasks","description":"Return the authenticated user's Qwen2 image generation and editing tasks using the requested pagination controls.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- No request body or operation-specific parameters are required.\n### Behavior\n- Returns the collection visible in the current request and authorization context.\n- Apply the documented pagination and filter parameters when present; use response metadata to continue paging.\n- Record fields and status values have the same meaning as in the corresponding detail operation.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userQwen2Image/detail/{id}` — Get Qwen2 image task details.\n- `DELETE /api/v1/userQwen2Image/{id}` — Delete a Qwen2 image task.\n- `POST /api/v1/userQwen2Image/start` — Start a new Qwen2 image generation/edit task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Qwen Image"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Task list"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"getApiV1UserQwen2ImageList","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/userQwen2Image/list\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]}},"/api/v1/userQwen2Image/detail/{id}":{"get":{"summary":"Get Qwen2 image task details","description":"Return the authenticated user's Qwen2 image task identified by `id`, including its current status and generated image fields.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supply `id` in the URL path.\n### Behavior\n- Retrieves the current server-side representation of the requested resource or task.\n- For asynchronous tasks, inspect the documented status and result fields before consuming generated media.\n- Repeat the request only as needed for polling and stop after the task reaches a terminal state.\n### Response\n- On `200`, consume the fields defined by that response schema below.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userQwen2Image/list` — List Qwen2 image tasks.\n- `DELETE /api/v1/userQwen2Image/{id}` — Delete a Qwen2 image task.\n- `POST /api/v1/userQwen2Image/start` — Start a new Qwen2 image generation/edit task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Qwen Image"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Task details"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","example":"507f1f77bcf86cd799439011"},"description":"id parameter"}],"operationId":"getApiV1UserQwen2ImageDetailId","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/userQwen2Image/detail/{id}\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]}},"/api/v1/userQwen2Image/batchDetail":{"post":{"summary":"Batch get Qwen2 image task details","description":"Return up to 200 authenticated-user Qwen2 image tasks matching the submitted `ids`; callers should match records by identifier.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body. Required fields: `ids`.\n### Behavior\n- Fetches several task records in one request, reducing the number of individual detail calls.\n- Results remain subject to the same authentication and ownership checks as single-record lookups.\n- Match returned records by their identifiers instead of relying on response ordering.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userQwen2Image/list` — List Qwen2 image tasks.\n- `GET /api/v1/userQwen2Image/detail/{id}` — Get Qwen2 image task details.\n- `DELETE /api/v1/userQwen2Image/{id}` — Delete a Qwen2 image task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Qwen Image"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"ids":{"type":"array","items":{"type":"string","example":"example"},"description":"Array of task IDs to query","example":["example"]}},"required":["ids"],"example":{"ids":["example"]}},"example":{"ids":["example"]}}}},"responses":{"200":{"description":"Task details"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"postApiV1UserQwen2ImageBatchDetail","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/userQwen2Image/batchDetail\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{\n  \"ids\": [\n    \"example\"\n  ]\n}'"}]}},"/api/v1/userQwen2Image/{id}":{"delete":{"summary":"Delete a Qwen2 image task","description":"Soft-delete the authenticated user's Qwen2 image task identified by `id`; the task is excluded from subsequent list results.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supply `id` in the URL path.\n### Behavior\n- Deletes or marks the selected resource as deleted according to the endpoint's documented lifecycle rules.\n- Use the resource identifier from a list, creation, or detail response; deleting one resource does not affect unrelated records.\n- Do not assume an in-progress task can be cancelled unless the endpoint explicitly documents that behavior.\n### Response\n- A `200` response confirms that the deletion request was applied to the selected record.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userQwen2Image/list` — List Qwen2 image tasks.\n- `GET /api/v1/userQwen2Image/detail/{id}` — Get Qwen2 image task details.\n- `POST /api/v1/userQwen2Image/start` — Start a new Qwen2 image generation/edit task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Qwen Image"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Task deleted"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","example":"507f1f77bcf86cd799439011"},"description":"id parameter"}],"operationId":"deleteApiV1UserQwen2ImageId","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X DELETE \"https://cheap.dev/api/v1/userQwen2Image/{id}\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/userFlux2/start":{"post":{"summary":"Start Flux 2 Pro image generation or editing","description":"Generate high-quality images from text or edit existing images using Flux 2 Pro model.\n**Features:**\n- Text-to-Image generation with advanced prompt understanding\n- Image-to-Image editing (supports up to 8 reference images)\n- Character consistency across multiple images\n- Text rendering within images\n- High-quality output with professional-grade results\n**Processing Time:**\n- Usually 20-60 seconds\n**Output:**\n- Images are stored in R2 storage (7days-apac bucket) and expire after 7 days.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body. Required fields: `name`, `prompt`.\n- API-token callers may include `webhook_url` and `webhook_token` for best-effort terminal-state notifications; ordinary JWT/cookie calls ignore these fields.\n### Behavior\n- This is an asynchronous operation: a successful submission creates a task and returns before processing finishes.\n- Persist the returned task identifier and use the corresponding detail or list operation to observe progress.\n- Treat the detail endpoint as the source of truth even when webhook delivery is enabled.\n### Response\n- A `200` response confirms task acceptance; it does not by itself mean media generation has completed.\n- Retain the returned identifier and wait for a documented terminal status before using output URLs.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Invalid request parameters.\n- `401` — Unauthorized - Invalid or missing token.\n- `402` — Insufficient credits.\n- `500` — Internal server error.\n### Related Operations\n- `GET /api/v1/userFlux2/list` — Get Flux 2 Pro task list.\n- `GET /api/v1/userFlux2/detail/{id}` — Get task details.\n- `DELETE /api/v1/userFlux2/{id}` — Delete Flux 2 Pro task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Flux 2"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"type":"object","properties":{"name":{"type":"string","description":"Name of the image generation task","example":"Elon Musk and Mark Zuckerberg boxing"},"prompt":{"type":"string","description":"Text prompt for image generation or editing instruction.\n","example":"Elon Musk and Mark Zuckerberg boxing in a professional ring"},"input_images":{"type":"array","items":{"type":"string"},"description":"Array of input image URLs for image-to-image editing or multi-image composition (up to 8 images).\nWhen provided, automatically switches to image-to-image mode for character consistency.\n","example":["https://example.com/reference1.jpg","https://example.com/reference2.jpg"]},"aspect_ratio":{"type":"string","description":"Aspect ratio of the generated image. Options: 1:1, 16:9, 9:16, 4:3, 3:4, 2:3, 3:2, custom, match_input_image","enum":["1:1","16:9","9:16","4:3","3:4","2:3","3:2","custom","match_input_image"],"default":"9:16","example":"9:16"},"resolution":{"type":"string","description":"Resolution of the generated image.\n- 1K: ~1 megapixel\n- 2K: ~2 megapixels\n","enum":["1K","2K"],"default":"1K","example":"1K"},"force_generate":{"type":"boolean","description":"Force generation even if NSFW content is detected. Defaults to true for API users, false for web users","default":true}},"required":["name","prompt"]},{"$ref":"#/components/schemas/WebhookInput"}]},"example":{}}}},"responses":{"200":{"description":"Flux 2 Pro task started successfully or NSFW content detected","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"400":{"description":"Invalid request parameters","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Unauthorized - Invalid or missing token","content":{"application/json":{"schema":{"type":"object"}}}},"402":{"description":"Insufficient credits","content":{"application/json":{"schema":{"type":"object"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object"}}}}},"operationId":"postApiV1UserFlux2Start","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/userFlux2/start\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/userFlux2/list":{"get":{"summary":"Get Flux 2 Pro task list","description":"Retrieve paginated list of user's Flux 2 Pro image generation tasks.\nTasks are sorted by creation date (newest first).\nOnly returns tasks that haven't expired (7 days retention).\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supported query parameters: `page`, `page_size`, `status`. Omitted values use the defaults shown in the parameter schema.\n### Behavior\n- Returns the collection visible in the current request and authorization context.\n- Apply the documented pagination and filter parameters when present; use response metadata to continue paging.\n- Record fields and status values have the same meaning as in the corresponding detail operation.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userFlux2/detail/{id}` — Get task details.\n- `DELETE /api/v1/userFlux2/{id}` — Delete Flux 2 Pro task.\n- `POST /api/v1/userFlux2/start` — Start Flux 2 Pro image generation or editing.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Flux 2"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Task list retrieved successfully","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"example":1},"description":"Page number (starting from 1)"},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":20,"example":20},"description":"Number of items per page (max 100)"},{"name":"status","in":"query","required":false,"schema":{"type":"string","enum":["initialized","processing","completed","failed"],"example":"initialized"},"description":"Filter by task status"}],"operationId":"getApiV1UserFlux2List","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/userFlux2/list\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]}},"/api/v1/userFlux2/batchDetail":{"post":{"summary":"Batch query task details","description":"Query details for multiple tasks at once by providing an array of task IDs.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body. Required fields: `ids`.\n### Behavior\n- Fetches several task records in one request, reducing the number of individual detail calls.\n- Results remain subject to the same authentication and ownership checks as single-record lookups.\n- Match returned records by their identifiers instead of relying on response ordering.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userFlux2/list` — Get Flux 2 Pro task list.\n- `GET /api/v1/userFlux2/detail/{id}` — Get task details.\n- `DELETE /api/v1/userFlux2/{id}` — Delete Flux 2 Pro task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Flux 2"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"ids":{"type":"array","items":{"type":"string","example":"example"},"description":"Array of task IDs to query","example":["example"]}},"required":["ids"],"example":{"ids":["example"]}},"example":{"ids":["example"]}}}},"responses":{"200":{"description":"Batch details retrieved successfully"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"postApiV1UserFlux2BatchDetail","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/userFlux2/batchDetail\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{\n  \"ids\": [\n    \"example\"\n  ]\n}'"}]}},"/api/v1/userFlux2/detail/{id}":{"get":{"summary":"Get task details","description":"Retrieve detailed information about a specific Flux 2 Pro task, including generation status, image URL, and processing time.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supply `id` in the URL path.\n### Behavior\n- Retrieves the current server-side representation of the requested resource or task.\n- For asynchronous tasks, inspect the documented status and result fields before consuming generated media.\n- Repeat the request only as needed for polling and stop after the task reaches a terminal state.\n### Response\n- On `200`, consume the fields defined by that response schema below.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n- `404` — Task not found.\n### Related Operations\n- `GET /api/v1/userFlux2/list` — Get Flux 2 Pro task list.\n- `DELETE /api/v1/userFlux2/{id}` — Delete Flux 2 Pro task.\n- `POST /api/v1/userFlux2/start` — Start Flux 2 Pro image generation or editing.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Flux 2"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Task detail retrieved successfully","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Task not found","content":{"application/json":{"schema":{"type":"object"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","example":"507f1f77bcf86cd799439011"},"description":"Task ID"}],"operationId":"getApiV1UserFlux2DetailId","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/userFlux2/detail/{id}\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]}},"/api/v1/userFlux2/{id}":{"delete":{"summary":"Delete Flux 2 Pro task","description":"Soft-delete the authenticated user's Flux 2 Pro image task identified by `id`, preserving the stored record while excluding it from normal task lists.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supply `id` in the URL path.\n### Behavior\n- Deletes or marks the selected resource as deleted according to the endpoint's documented lifecycle rules.\n- Use the resource identifier from a list, creation, or detail response; deleting one resource does not affect unrelated records.\n- Do not assume an in-progress task can be cancelled unless the endpoint explicitly documents that behavior.\n### Response\n- A `200` response confirms that the deletion request was applied to the selected record.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userFlux2/list` — Get Flux 2 Pro task list.\n- `GET /api/v1/userFlux2/detail/{id}` — Get task details.\n- `POST /api/v1/userFlux2/start` — Start Flux 2 Pro image generation or editing.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Flux 2"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Task deleted successfully"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","example":"507f1f77bcf86cd799439011"},"description":"id parameter"}],"operationId":"deleteApiV1UserFlux2Id","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X DELETE \"https://cheap.dev/api/v1/userFlux2/{id}\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/userKlingImage/start":{"post":{"summary":"Start Kling 3.0 image generation","description":"Create one or more asynchronous Kling 3.0 image tasks from the prompt and optional reference images, subject to the request's `n` limit.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body. Required fields: `name`, `prompt`.\n- API-token callers may include `webhook_url` and `webhook_token` for best-effort terminal-state notifications; ordinary JWT/cookie calls ignore these fields.\n### Behavior\n- This is an asynchronous operation: a successful submission creates a task and returns before processing finishes.\n- Persist the returned task identifier and use the corresponding detail or list operation to observe progress.\n- Treat the detail endpoint as the source of truth even when webhook delivery is enabled.\n### Response\n- A `200` response confirms task acceptance; it does not by itself mean media generation has completed.\n- Retain the returned identifier and wait for a documented terminal status before using output URLs.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userKlingImage/list` — List Kling image tasks.\n- `GET /api/v1/userKlingImage/detail/{id}` — Get Kling image task details.\n- `DELETE /api/v1/userKlingImage/{id}` — Delete a Kling image task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Kling Image"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"type":"object","properties":{"name":{"type":"string","description":"Task name"},"prompt":{"type":"string","description":"Image generation prompt"},"input_images":{"type":"array","items":{"type":"string"},"description":"Optional public reference image URLs"},"aspect_ratio":{"type":"string","enum":["1:1","16:9","9:16","4:3","3:4","2:3","3:2","21:9"],"default":"9:16"},"resolution":{"type":"string","enum":["1k","2k"],"default":"1k"},"n":{"type":"integer","minimum":1,"maximum":9}},"required":["name","prompt"]},{"$ref":"#/components/schemas/WebhookInput"}]},"example":{}}}},"responses":{"200":{"description":"Task created successfully"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"postApiV1UserKlingImageStart","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/userKlingImage/start\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/userKlingImage/list":{"get":{"summary":"List Kling image tasks","description":"Return the authenticated user's Kling image tasks using the requested pagination controls.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- No request body or operation-specific parameters are required.\n### Behavior\n- Returns the collection visible in the current request and authorization context.\n- Apply the documented pagination and filter parameters when present; use response metadata to continue paging.\n- Record fields and status values have the same meaning as in the corresponding detail operation.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userKlingImage/detail/{id}` — Get Kling image task details.\n- `DELETE /api/v1/userKlingImage/{id}` — Delete a Kling image task.\n- `POST /api/v1/userKlingImage/start` — Start Kling 3.0 image generation.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Kling Image"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Task list"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"getApiV1UserKlingImageList","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/userKlingImage/list\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]}},"/api/v1/userKlingImage/batchDetail":{"post":{"summary":"Batch get Kling image task details","description":"Return up to 200 authenticated-user Kling image tasks matching the submitted `ids`; callers should match records by identifier.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body. Required fields: `ids`.\n### Behavior\n- Fetches several task records in one request, reducing the number of individual detail calls.\n- Results remain subject to the same authentication and ownership checks as single-record lookups.\n- Match returned records by their identifiers instead of relying on response ordering.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userKlingImage/list` — List Kling image tasks.\n- `GET /api/v1/userKlingImage/detail/{id}` — Get Kling image task details.\n- `DELETE /api/v1/userKlingImage/{id}` — Delete a Kling image task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Kling Image"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"ids":{"type":"array","items":{"type":"string","example":"example"},"description":"Array of task IDs to query","example":["example"]}},"required":["ids"],"example":{"ids":["example"]}},"example":{"ids":["example"]}}}},"responses":{"200":{"description":"Task details"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"postApiV1UserKlingImageBatchDetail","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/userKlingImage/batchDetail\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{\n  \"ids\": [\n    \"example\"\n  ]\n}'"}]}},"/api/v1/userKlingImage/detail/{id}":{"get":{"summary":"Get Kling image task details","description":"Return the authenticated user's Kling image task identified by `id`, including its current status and generated image fields.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supply `id` in the URL path.\n### Behavior\n- Retrieves the current server-side representation of the requested resource or task.\n- For asynchronous tasks, inspect the documented status and result fields before consuming generated media.\n- Repeat the request only as needed for polling and stop after the task reaches a terminal state.\n### Response\n- On `200`, consume the fields defined by that response schema below.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userKlingImage/list` — List Kling image tasks.\n- `DELETE /api/v1/userKlingImage/{id}` — Delete a Kling image task.\n- `POST /api/v1/userKlingImage/start` — Start Kling 3.0 image generation.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Kling Image"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Task details"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","example":"507f1f77bcf86cd799439011"},"description":"id parameter"}],"operationId":"getApiV1UserKlingImageDetailId","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/userKlingImage/detail/{id}\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]}},"/api/v1/userKlingImage/{id}":{"delete":{"summary":"Delete a Kling image task","description":"Soft-delete the authenticated user's Kling image task identified by `id`; the task is excluded from subsequent list results.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supply `id` in the URL path.\n### Behavior\n- Deletes or marks the selected resource as deleted according to the endpoint's documented lifecycle rules.\n- Use the resource identifier from a list, creation, or detail response; deleting one resource does not affect unrelated records.\n- Do not assume an in-progress task can be cancelled unless the endpoint explicitly documents that behavior.\n### Response\n- A `200` response confirms that the deletion request was applied to the selected record.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userKlingImage/list` — List Kling image tasks.\n- `GET /api/v1/userKlingImage/detail/{id}` — Get Kling image task details.\n- `POST /api/v1/userKlingImage/start` — Start Kling 3.0 image generation.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Kling Image"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Task deleted"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","example":"507f1f77bcf86cd799439011"},"description":"id parameter"}],"operationId":"deleteApiV1UserKlingImageId","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X DELETE \"https://cheap.dev/api/v1/userKlingImage/{id}\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/userImageEdit/start":{"post":{"summary":"Start image editing task","description":"Edit images using AI with different edit types like clothing or product editing.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body. Required fields: `edit_type`, `image_urls`.\n- API-token callers may include `webhook_url` and `webhook_token` for best-effort terminal-state notifications; ordinary JWT/cookie calls ignore these fields.\n### Behavior\n- This is an asynchronous operation: a successful submission creates a task and returns before processing finishes.\n- Persist the returned task identifier and use the corresponding detail or list operation to observe progress.\n- Treat the detail endpoint as the source of truth even when webhook delivery is enabled.\n### Response\n- A `200` response confirms task acceptance; it does not by itself mean media generation has completed.\n- Retain the returned identifier and wait for a documented terminal status before using output URLs.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Bad Request - Invalid parameters.\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userImageEdit/allRecords` — Get all task records.\n- `GET /api/v1/userImageEdit/{_id}` — Get task details.\n- `DELETE /api/v1/userImageEdit/{_id}` — Delete task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Image Edit"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"type":"object","properties":{"name":{"type":"string","description":"Name of the image edit task","default":"","example":"Clothing Edit"},"edit_type":{"type":"string","enum":["clothing","product"],"description":"Type of edit to perform","example":"clothing"},"image_urls":{"type":"array","minItems":2,"items":{"type":"string","format":"uri","pattern":"^https?://.*"},"description":"Array of image URLs to edit (minimum 2)","example":["https://example.com/image1.jpg","https://example.com/image2.jpg"]},"timeout":{"type":"number","default":120,"description":"Processing timeout in seconds","example":120}},"required":["edit_type","image_urls"]},{"$ref":"#/components/schemas/WebhookInput"}]},"example":{}}}},"responses":{"200":{"description":"Image edit task started successfully","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"400":{"description":"Bad Request - Invalid parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"postApiV1UserImageEditStart","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/userImageEdit/start\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/userImageEdit/allRecords":{"get":{"summary":"Get all task records","description":"Return the authenticated user's image-editing tasks, newest first, using the requested page number and page size.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supported query parameters: `pageNum`, `pageSize`. Omitted values use the defaults shown in the parameter schema.\n### Behavior\n- Returns the collection visible in the current request and authorization context.\n- Apply the documented pagination and filter parameters when present; use response metadata to continue paging.\n- Record fields and status values have the same meaning as in the corresponding detail operation.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userImageEdit/{_id}` — Get task details.\n- `DELETE /api/v1/userImageEdit/{_id}` — Delete task.\n- `POST /api/v1/userImageEdit/start` — Start image editing task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Image Edit"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Task list retrieved successfully"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"pageNum","in":"query","required":false,"schema":{"type":"integer","minimum":1,"example":1},"description":"Page number"},{"name":"pageSize","in":"query","required":false,"schema":{"type":"integer","example":10},"description":"Page size"}],"operationId":"getApiV1UserImageEditAllRecords","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/userImageEdit/allRecords\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]}},"/api/v1/userImageEdit/batchDetail":{"post":{"summary":"Batch query task details","description":"Query details for multiple tasks at once by providing an array of task IDs.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body. Required fields: `ids`.\n### Behavior\n- Fetches several task records in one request, reducing the number of individual detail calls.\n- Results remain subject to the same authentication and ownership checks as single-record lookups.\n- Match returned records by their identifiers instead of relying on response ordering.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userImageEdit/allRecords` — Get all task records.\n- `GET /api/v1/userImageEdit/{_id}` — Get task details.\n- `DELETE /api/v1/userImageEdit/{_id}` — Delete task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Image Edit"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"ids":{"type":"array","items":{"type":"string","example":"example"},"description":"Array of task IDs to query","example":["example"]}},"required":["ids"],"example":{"ids":["example"]}},"example":{"ids":["example"]}}}},"responses":{"200":{"description":"Batch details retrieved successfully"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"postApiV1UserImageEditBatchDetail","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/userImageEdit/batchDetail\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{\n  \"ids\": [\n    \"example\"\n  ]\n}'"}]}},"/api/v1/userImageEdit/{_id}":{"get":{"summary":"Get task details","description":"Return the authenticated user's image-editing task identified by `_id`, including its current processing status and generated image fields.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supply `_id` in the URL path.\n### Behavior\n- Retrieves the current server-side representation of the requested resource or task.\n- For asynchronous tasks, inspect the documented status and result fields before consuming generated media.\n- Repeat the request only as needed for polling and stop after the task reaches a terminal state.\n### Response\n- On `200`, consume the fields defined by that response schema below.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userImageEdit/allRecords` — Get all task records.\n- `DELETE /api/v1/userImageEdit/{_id}` — Delete task.\n- `POST /api/v1/userImageEdit/start` — Start image editing task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Image Edit"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Task details retrieved successfully"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"_id","in":"path","required":true,"schema":{"type":"string","example":"507f1f77bcf86cd799439011"},"description":"Task ID"}],"operationId":"getApiV1UserImageEditId","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/userImageEdit/{_id}\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]},"delete":{"summary":"Delete task","description":"Remove the authenticated user's image-editing task identified by `_id` from the task history without affecting other generated-image records.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supply `_id` in the URL path.\n### Behavior\n- Deletes or marks the selected resource as deleted according to the endpoint's documented lifecycle rules.\n- Use the resource identifier from a list, creation, or detail response; deleting one resource does not affect unrelated records.\n- Do not assume an in-progress task can be cancelled unless the endpoint explicitly documents that behavior.\n### Response\n- A `200` response confirms that the deletion request was applied to the selected record.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userImageEdit/allRecords` — Get all task records.\n- `GET /api/v1/userImageEdit/{_id}` — Get task details.\n- `POST /api/v1/userImageEdit/start` — Start image editing task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Image Edit"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Task deleted successfully"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"_id","in":"path","required":true,"schema":{"type":"string","example":"507f1f77bcf86cd799439011"},"description":"Task ID to delete"}],"operationId":"deleteApiV1UserImageEditId","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X DELETE \"https://cheap.dev/api/v1/userImageEdit/{_id}\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/userImage2Video/start":{"post":{"summary":"Start image to video conversion","description":"Convert an image to video using AI generation with custom prompts.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body. Required fields: `image_url`.\n- API-token callers may include `webhook_url` and `webhook_token` for best-effort terminal-state notifications; ordinary JWT/cookie calls ignore these fields.\n### Behavior\n- This is an asynchronous operation: a successful submission creates a task and returns before processing finishes.\n- Persist the returned task identifier and use the corresponding detail or list operation to observe progress.\n- Treat the detail endpoint as the source of truth even when webhook delivery is enabled.\n### Response\n- A `200` response confirms task acceptance; it does not by itself mean media generation has completed.\n- Retain the returned identifier and wait for a documented terminal status before using output URLs.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Bad Request - Invalid parameters.\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userImage2Video/allRecords` — List image to video tasks.\n- `POST /api/v1/userImage2Video/{_id}/markShared` — markShared.\n- `POST /api/v1/userImage2Video/{_id}/markDownloaded` — markDownloaded.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Image to Video"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"type":"object","properties":{"name":{"type":"string","description":"Name of the image to video task","example":"My Image Animation"},"image_url":{"type":"string","description":"URL of the source image","example":"https://example.com/image.jpg"},"prompt":{"type":"string","description":"Generation prompt","example":"Make the person in the image wave their hand"},"negative_prompt":{"type":"string","description":"Negative prompt to avoid unwanted features","example":"blurry, distorted, static"},"lora":{"type":"string","description":"Lora ID. If provided, prompt/negative_prompt can be omitted (prompt will be overwritten by lora preset on backend)."},"model_type":{"type":"string","enum":["GENERAL","FLF2V"],"default":"GENERAL","description":"Model type for generation"},"model_version":{"type":"string","enum":["a2e","a2e-v2"],"default":"a2e","description":"Algorithm model version. a2e-v2 costs more per second, is not covered by plan waivers, and ignores auto_add_audio because it generates audio by itself."},"end_image_url":{"type":"string","description":"End image URL (required for FLF2V model)","example":"https://example.com/end_image.jpg"},"extend_prompt":{"type":"boolean","default":true,"description":"Whether to extend the prompt automatically"},"number_of_images":{"type":"integer","minimum":1,"maximum":8,"default":1,"description":"Number of videos to generate at once","example":1},"video_time":{"type":"integer","minimum":5,"maximum":20,"default":5,"description":"Video time in seconds (5, 10, 15, or 20 seconds)","example":5},"video_length":{"type":"integer","minimum":1,"maximum":1000,"description":"(Deprecated) Video length in frames. Prefer video_time. Backend converts frames to seconds internally.","example":81},"skip_face_enhance":{"type":"boolean","default":false,"description":"Whether to skip face similarity enhancement. Defaults to false (enhancing face similarity)."},"mask_face":{"type":"boolean","description":"Web NSFW preflight result. Set true only after the user confirms masking a detected human face."},"minor_suspected_skip":{"type":"boolean","default":false,"description":"If suspected minor is detected (10 <= age < 15), set to true to acknowledge and proceed"}},"required":["image_url"]},{"$ref":"#/components/schemas/WebhookInput"}]},"example":{}}}},"responses":{"200":{"description":"Image to video task started successfully","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"400":{"description":"Bad Request - Invalid parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"postApiV1UserImage2VideoStart","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/userImage2Video/start\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/userImage2Video/allRecords":{"get":{"summary":"List image to video tasks","description":"List current user's image to video tasks (only non-expired records will be returned).\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supported query parameters: `pageNum`, `pageSize`. Omitted values use the defaults shown in the parameter schema.\n### Behavior\n- Returns the collection visible in the current request and authorization context.\n- Apply the documented pagination and filter parameters when present; use response metadata to continue paging.\n- Record fields and status values have the same meaning as in the corresponding detail operation.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Bad Request - Invalid parameters.\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `POST /api/v1/userImage2Video/{_id}/markShared` — markShared.\n- `POST /api/v1/userImage2Video/{_id}/markDownloaded` — markDownloaded.\n- `POST /api/v1/userImage2Video/{_id}/markCopied` — markCopied.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Image to Video"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Task list fetched successfully","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"400":{"description":"Bad Request - Invalid parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"pageNum","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"example":1},"description":"pageNum parameter"},{"name":"pageSize","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":10,"example":10},"description":"pageSize parameter"}],"operationId":"getApiV1UserImage2VideoAllRecords","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/userImage2Video/allRecords\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]}},"/api/v1/userImage2Video/batchDetail":{"post":{"summary":"Batch query task details","description":"Query details for multiple tasks at once by providing an array of task IDs.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body. Required fields: `ids`.\n### Behavior\n- Fetches several task records in one request, reducing the number of individual detail calls.\n- Results remain subject to the same authentication and ownership checks as single-record lookups.\n- Match returned records by their identifiers instead of relying on response ordering.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userImage2Video/allRecords` — List image to video tasks.\n- `POST /api/v1/userImage2Video/{_id}/markShared` — markShared.\n- `POST /api/v1/userImage2Video/{_id}/markDownloaded` — markDownloaded.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Image to Video"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"ids":{"type":"array","items":{"type":"string","example":"example"},"description":"Array of task IDs to query","example":["example"]}},"required":["ids"],"example":{"ids":["example"]}},"example":{"ids":["example"]}}}},"responses":{"200":{"description":"Batch details retrieved successfully"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"postApiV1UserImage2VideoBatchDetail","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/userImage2Video/batchDetail\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{\n  \"ids\": [\n    \"example\"\n  ]\n}'"}]}},"/api/v1/userImage2Video/avgProcessingTime":{"get":{"tags":["Image to Video"],"summary":"Get average processing time","description":"avgProcessingTime.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- No request body or operation-specific parameters are required.\n### Behavior\n- Retrieves the current server-side representation of the requested resource or task.\n- For asynchronous tasks, inspect the documented status and result fields before consuming generated media.\n- Repeat the request only as needed for polling and stop after the task reaches a terminal state.\n### Response\n- On `200`, consume the fields defined by that response schema below.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Bad Request.\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userImage2Video/allRecords` — List image to video tasks.\n- `POST /api/v1/userImage2Video/{_id}/markShared` — markShared.\n- `POST /api/v1/userImage2Video/{_id}/markDownloaded` — markDownloaded.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"},"example":{"success":true,"data":{},"timestamp":"2025-01-14T18:22:13.726Z"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearerAuth":[]}],"operationId":"getApiV1UserImage2VideoAvgProcessingTime","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/userImage2Video/avgProcessingTime\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]}},"/api/v1/userImage2Video/unlimitedQueueLevel":{"get":{"tags":["Image to Video"],"summary":"unlimitedQueueLevel","description":"unlimitedQueueLevel.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- No request body or operation-specific parameters are required.\n### Behavior\n- Retrieves the current server-side representation of the requested resource or task.\n- For asynchronous tasks, inspect the documented status and result fields before consuming generated media.\n- Repeat the request only as needed for polling and stop after the task reaches a terminal state.\n### Response\n- On `200`, consume the fields defined by that response schema below.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Bad Request.\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userImage2Video/allRecords` — List image to video tasks.\n- `POST /api/v1/userImage2Video/{_id}/markShared` — markShared.\n- `POST /api/v1/userImage2Video/{_id}/markDownloaded` — markDownloaded.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"},"example":{"success":true,"data":{},"timestamp":"2025-01-14T18:22:13.726Z"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearerAuth":[]}],"operationId":"getApiV1UserImage2VideoUnlimitedQueueLevel","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/userImage2Video/unlimitedQueueLevel\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]}},"/api/v1/userImage2Video/{_id}/markShared":{"post":{"tags":["Image to Video"],"summary":"Mark record as shared","description":"markShared.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supply `_id` in the URL path.\n### Behavior\n- Records the named client interaction for the identified task.\n- The operation does not regenerate or otherwise modify the task's media output.\n### Response\n- On `200`, consume the fields defined by that response schema below.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Bad Request.\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userImage2Video/allRecords` — List image to video tasks.\n- `POST /api/v1/userImage2Video/{_id}/markDownloaded` — markDownloaded.\n- `POST /api/v1/userImage2Video/{_id}/markCopied` — markCopied.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"},"example":{"success":true,"data":{},"timestamp":"2025-01-14T18:22:13.726Z"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearerAuth":[]}],"parameters":[{"name":"_id","in":"path","required":true,"schema":{"type":"string","example":"507f1f77bcf86cd799439011"},"description":"_id parameter"}],"operationId":"postApiV1UserImage2VideoIdMarkShared","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/userImage2Video/{_id}/markShared\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/userImage2Video/{_id}/markDownloaded":{"post":{"tags":["Image to Video"],"summary":"Mark record as downloaded","description":"markDownloaded.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supply `_id` in the URL path.\n### Behavior\n- Records the named client interaction for the identified task.\n- The operation does not regenerate or otherwise modify the task's media output.\n### Response\n- On `200`, consume the fields defined by that response schema below.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Bad Request.\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userImage2Video/allRecords` — List image to video tasks.\n- `POST /api/v1/userImage2Video/{_id}/markShared` — markShared.\n- `POST /api/v1/userImage2Video/{_id}/markCopied` — markCopied.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"},"example":{"success":true,"data":{},"timestamp":"2025-01-14T18:22:13.726Z"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearerAuth":[]}],"parameters":[{"name":"_id","in":"path","required":true,"schema":{"type":"string","example":"507f1f77bcf86cd799439011"},"description":"_id parameter"}],"operationId":"postApiV1UserImage2VideoIdMarkDownloaded","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/userImage2Video/{_id}/markDownloaded\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/userImage2Video/{_id}/markCopied":{"post":{"tags":["Image to Video"],"summary":"Mark record as copied","description":"markCopied.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supply `_id` in the URL path.\n### Behavior\n- Records the named client interaction for the identified task.\n- The operation does not regenerate or otherwise modify the task's media output.\n### Response\n- On `200`, consume the fields defined by that response schema below.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Bad Request.\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userImage2Video/allRecords` — List image to video tasks.\n- `POST /api/v1/userImage2Video/{_id}/markShared` — markShared.\n- `POST /api/v1/userImage2Video/{_id}/markDownloaded` — markDownloaded.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"},"example":{"success":true,"data":{},"timestamp":"2025-01-14T18:22:13.726Z"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearerAuth":[]}],"parameters":[{"name":"_id","in":"path","required":true,"schema":{"type":"string","example":"507f1f77bcf86cd799439011"},"description":"_id parameter"}],"operationId":"postApiV1UserImage2VideoIdMarkCopied","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/userImage2Video/{_id}/markCopied\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/userImage2Video/{_id}":{"get":{"summary":"Get image to video task detail","description":"Get one image to video task detail by id.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supply `_id` in the URL path.\n### Behavior\n- Retrieves the current server-side representation of the requested resource or task.\n- For asynchronous tasks, inspect the documented status and result fields before consuming generated media.\n- Repeat the request only as needed for polling and stop after the task reaches a terminal state.\n### Response\n- On `200`, consume the fields defined by that response schema below.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Bad Request - Invalid parameters.\n- `401` — Unauthorized - Invalid or missing JWT token.\n- `404` — Not Found - Task not found.\n### Related Operations\n- `GET /api/v1/userImage2Video/allRecords` — List image to video tasks.\n- `POST /api/v1/userImage2Video/{_id}/markShared` — markShared.\n- `POST /api/v1/userImage2Video/{_id}/markDownloaded` — markDownloaded.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Image to Video"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Task detail fetched successfully","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"400":{"description":"Bad Request - Invalid parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not Found - Task not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"_id","in":"path","required":true,"schema":{"type":"string","example":"507f1f77bcf86cd799439011"},"description":"Task ID"}],"operationId":"getApiV1UserImage2VideoId","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/userImage2Video/{_id}\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]},"delete":{"summary":"Delete an image to video task","description":"Delete a user's image to video task. Only final status tasks can be deleted (initialized/completed/failed). initialized tasks will be refunded.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supply `_id` in the URL path.\n### Behavior\n- Deletes or marks the selected resource as deleted according to the endpoint's documented lifecycle rules.\n- Use the resource identifier from a list, creation, or detail response; deleting one resource does not affect unrelated records.\n- Do not assume an in-progress task can be cancelled unless the endpoint explicitly documents that behavior.\n### Response\n- A `200` response confirms that the deletion request was applied to the selected record.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Bad Request - Task in processing or invalid parameters.\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userImage2Video/allRecords` — List image to video tasks.\n- `POST /api/v1/userImage2Video/{_id}/markShared` — markShared.\n- `POST /api/v1/userImage2Video/{_id}/markDownloaded` — markDownloaded.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Image to Video"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Task deleted successfully","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"400":{"description":"Bad Request - Task in processing or invalid parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"_id","in":"path","required":true,"schema":{"type":"string","example":"507f1f77bcf86cd799439011"},"description":"Task ID"}],"operationId":"deleteApiV1UserImage2VideoId","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X DELETE \"https://cheap.dev/api/v1/userImage2Video/{_id}\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/userImage2Video/prompt_extension":{"post":{"summary":"Extend prompt for image to video","description":"Extend prompt and negative prompt with LLM for general image2video.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body. Required fields: `reference_id`, `image_url`, `prompt`, `negative_prompt`.\n### Behavior\n- Validates the submitted payload and performs the operation described by the request schema.\n- Conditional fields, mutually exclusive inputs, limits, and defaults are enforced as documented by their schemas.\n### Response\n- On `200`, consume the fields defined by that response schema below.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Bad Request - Invalid parameters.\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userImage2Video/allRecords` — List image to video tasks.\n- `POST /api/v1/userImage2Video/{_id}/markShared` — markShared.\n- `POST /api/v1/userImage2Video/{_id}/markDownloaded` — markDownloaded.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Image to Video"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"reference_id":{"type":"string","example":"507f1f77bcf86cd799439011"},"image_url":{"type":"string","example":"https://example.com/image.jpg"},"prompt":{"type":"string","example":"high quality, clear, cinematic"},"negative_prompt":{"type":"string","example":"blurry, low quality, watermark, distorted"},"lang":{"type":"string","default":"en","example":"en"},"max_length":{"type":"integer","description":"Optional hard character limit for generated prompts. This is not a target length.","example":1},"stream":{"type":"boolean","description":"Set to true to return Server-Sent Events. Events include delta, result, done, and error.","example":false},"template":{"type":"string","enum":["default","cinematic"],"default":"default","description":"Prompt style. \"default\" keeps the original single-shot rewrite. \"cinematic\" returns a multi-shot film structure (scene bible, SHOT 1..N, Audio), intended for models that support cuts and audio.\n","example":"default"},"shot_count":{"type":"integer","default":2,"description":"Number of shots for the cinematic template. Any integer is accepted; the server clamps out-of-range values to 1-4. Ignored by the default template.\n","example":2},"with_audio":{"type":"boolean","default":true,"description":"Whether the cinematic template appends an Audio section. Ignored by the default template.","example":true}},"required":["reference_id","image_url","prompt","negative_prompt"],"example":{"reference_id":"507f1f77bcf86cd799439011","image_url":"https://example.com/image.jpg","prompt":"high quality, clear, cinematic","negative_prompt":"blurry, low quality, watermark, distorted","lang":"en","max_length":1,"stream":false,"template":"default","shot_count":2,"with_audio":true}},"example":{"reference_id":"507f1f77bcf86cd799439011","image_url":"https://example.com/image.jpg","prompt":"high quality, clear, cinematic","negative_prompt":"blurry, low quality, watermark, distorted","lang":"en","max_length":1,"stream":false,"template":"default","shot_count":2,"with_audio":true}}}},"responses":{"200":{"description":"Prompt extended successfully","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"400":{"description":"Bad Request - Invalid parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"postApiV1UserImage2VideoPromptExtension","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/userImage2Video/prompt_extension\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{\n  \"reference_id\": \"507f1f77bcf86cd799439011\",\n  \"image_url\": \"https://example.com/image.jpg\",\n  \"prompt\": \"high quality, clear, cinematic\",\n  \"negative_prompt\": \"blurry, low quality, watermark, distorted\",\n  \"lang\": \"en\",\n  \"max_length\": 1,\n  \"stream\": false,\n  \"template\": \"default\",\n  \"shot_count\": 2,\n  \"with_audio\": true\n}'"}]}},"/api/v1/userImage2Video/flf2v_prompt_extension":{"post":{"summary":"Extend prompt for FLF2V image to video","description":"Extend prompt and negative prompt with LLM for FLF2V (requires end_image_url).\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body. Required fields: `reference_id`, `image_url`, `end_image_url`, `prompt`, `negative_prompt`.\n### Behavior\n- Validates the submitted payload and performs the operation described by the request schema.\n- Conditional fields, mutually exclusive inputs, limits, and defaults are enforced as documented by their schemas.\n### Response\n- On `200`, consume the fields defined by that response schema below.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Bad Request - Invalid parameters.\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userImage2Video/allRecords` — List image to video tasks.\n- `POST /api/v1/userImage2Video/{_id}/markShared` — markShared.\n- `POST /api/v1/userImage2Video/{_id}/markDownloaded` — markDownloaded.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Image to Video"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"reference_id":{"type":"string","example":"507f1f77bcf86cd799439011"},"image_url":{"type":"string","example":"https://example.com/image.jpg"},"end_image_url":{"type":"string","example":"https://example.com/image.jpg"},"prompt":{"type":"string","example":"high quality, clear, cinematic"},"negative_prompt":{"type":"string","example":"blurry, low quality, watermark, distorted"},"lang":{"type":"string","default":"en","example":"en"},"max_length":{"type":"integer","description":"Optional hard character limit for generated prompts. This is not a target length.","example":1},"stream":{"type":"boolean","description":"Set to true to return Server-Sent Events. Events include delta, result, done, and error.","example":false}},"required":["reference_id","image_url","end_image_url","prompt","negative_prompt"],"example":{"reference_id":"507f1f77bcf86cd799439011","image_url":"https://example.com/image.jpg","end_image_url":"https://example.com/image.jpg","prompt":"high quality, clear, cinematic","negative_prompt":"blurry, low quality, watermark, distorted","lang":"en","max_length":1,"stream":false}},"example":{"reference_id":"507f1f77bcf86cd799439011","image_url":"https://example.com/image.jpg","end_image_url":"https://example.com/image.jpg","prompt":"high quality, clear, cinematic","negative_prompt":"blurry, low quality, watermark, distorted","lang":"en","max_length":1,"stream":false}}}},"responses":{"200":{"description":"Prompt extended successfully","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"400":{"description":"Bad Request - Invalid parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"postApiV1UserImage2VideoFlf2vPromptExtension","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/userImage2Video/flf2v_prompt_extension\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{\n  \"reference_id\": \"507f1f77bcf86cd799439011\",\n  \"image_url\": \"https://example.com/image.jpg\",\n  \"end_image_url\": \"https://example.com/image.jpg\",\n  \"prompt\": \"high quality, clear, cinematic\",\n  \"negative_prompt\": \"blurry, low quality, watermark, distorted\",\n  \"lang\": \"en\",\n  \"max_length\": 1,\n  \"stream\": false\n}'"}]}},"/api/v1/userWan25/start":{"post":{"summary":"Start Wan video generation","description":"Start a Wan video generation task. This endpoint supports Wan 2.5 image-to-video, Wan 2.6 image-to-video and Wan 2.7 multi-mode video generation.\nFor Wan 2.7, set `model` to `wan2.7-i2v` and select the generation mode with `task_type`:\n- `text_to_video`: text prompt only. Do not provide image/video material.\n- `first_frame`: image-to-video from one first-frame image. Requires `image_url`.\n- `first_last_frame`: image-to-video with first and last frame control. Requires `image_url` and `last_frame_url`.\n- `reference_image`: reference-to-video. Requires 1 to 5 ordered image/video entries in `reference_media`; legacy pure-image clients may continue using `reference_image_urls`.\n- `video_extend`: extend an existing video clip. Requires `first_clip_url`; optional `last_frame_url`.\n- `video_edit`: edit an existing video. Requires `edit_video_url`; optional `reference_image_urls` with up to 3 image URLs.\n`text_to_video`, `first_last_frame`, `reference_image`, `video_extend` and `video_edit` are only available when `model=wan2.7-i2v`.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body. Required fields: `prompt`.\n- API-token callers may include `webhook_url` and `webhook_token` for best-effort terminal-state notifications; ordinary JWT/cookie calls ignore these fields.\n### Behavior\n- This is an asynchronous operation: a successful submission creates a task and returns before processing finishes.\n- Persist the returned task identifier and use the corresponding detail or list operation to observe progress.\n- Treat the detail endpoint as the source of truth even when webhook delivery is enabled.\n### Response\n- A `200` response confirms task acceptance; it does not by itself mean media generation has completed.\n- Retain the returned identifier and wait for a documented terminal status before using output URLs.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Bad Request - Invalid parameters.\n- `401` — Unauthorized - Invalid or missing JWT token.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Wan Image to Video"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"type":"object","properties":{"name":{"type":"string","description":"Optional display name for the task","example":"My Wan Video"},"image_url":{"type":"string","description":"Source image URL. Required for `first_frame` and `first_last_frame`.","example":"https://example.com/image.jpg"},"prompt":{"type":"string","description":"Generation prompt","example":"Make the person in the image wave their hand"},"negative_prompt":{"type":"string","description":"Negative prompt to avoid unwanted features","example":"blurry, distorted"},"duration":{"type":"string","enum":["2","3","4","5","6","7","8","9","10","11","12","13","14","15"],"default":"5","description":"Video duration in seconds. Wan2.7 reference_image supports 2-15 with images only or 2-10 when a reference video is present; text_to_video/first_frame/first_last_frame/video_extend use 5/10/15; video_edit uses 5-10. Wan 2.5 only supports 5/10."},"resolution":{"type":"string","enum":["480p","720p","1080p"],"default":"720p","description":"Video resolution"},"ratio":{"type":"string","enum":["16:9","9:16","1:1","4:3","3:4"],"default":"16:9","description":"Video aspect ratio. Only used by Wan 2.7 `text_to_video` and `reference_image`."},"enable_prompt_expansion":{"type":"boolean","default":false,"description":"Whether to enable prompt rewriting using LLM"},"multi_shots":{"type":"boolean","default":false,"description":"Enable intelligent multi-shot segmentation (only active when enable_prompt_expansion is true)"},"model":{"type":"string","enum":["wan2.5-i2v-preview","wan2.6-i2v","wan2.6-i2v-flash","wan2.7-i2v"],"default":"wan2.5-i2v-preview","description":"AI model version (wan2.6-i2v and wan2.7-i2v require VIP/Max user, wan2.6-i2v-flash is available to all users)"},"task_type":{"type":"string","enum":["text_to_video","first_frame","first_last_frame","reference_image","video_extend","video_edit"],"default":"first_frame","description":"Wan 2.7 generation mode. Only used when `model=wan2.7-i2v`."},"last_frame_url":{"type":"string","description":"Last-frame image URL. Required for `first_last_frame`; optional for `video_extend`.","example":"https://example.com/last-frame.jpg"},"first_clip_url":{"type":"string","description":"Existing video clip URL. Required for Wan 2.7 `video_extend`.","example":"https://example.com/clip.mp4"},"edit_video_url":{"type":"string","description":"Input video URL. Required for Wan 2.7 `video_edit`.","example":"https://example.com/input-video.mp4"},"reference_image_urls":{"type":"array","items":{"type":"string"},"description":"Legacy pure-image reference URLs for Wan 2.7 `reference_image`; optional for `video_edit` (up to 3 images).","example":["https://example.com/reference-1.jpg","https://example.com/reference-2.jpg"]},"reference_media":{"type":"array","minItems":1,"maxItems":5,"description":"Ordered Wan2.7 reference-to-video media. Input videos are billed together with output duration according to the official 5-second input cap.","items":{"type":"object","required":["type","url"],"properties":{"type":{"type":"string","enum":["reference_image","reference_video"]},"url":{"type":"string"},"duration":{"type":"number","description":"Reference video duration in seconds. The server probes metadata when omitted."}}}},"seed":{"type":"number","minimum":0,"maximum":2147483647,"description":"Random seed for reproducibility. Value must be in the range [0, 2147483647]. If not specified, system generates a random seed."},"audio":{"type":"boolean","default":true,"description":"Whether to generate audio for the video"},"audio_url":{"type":"string","description":"URL of audio file to use for first-frame/first-last-frame video generation. Supports WAV/MP3, 3-30s duration, max 15MB. If longer than video duration, audio will be truncated.","example":"https://example.com/audio.mp3"}},"required":["prompt"],"x-duration-options-by-task-type":{"text_to_video":["5","10","15"],"first_frame":["5","10","15"],"first_last_frame":["5","10","15"],"reference_image":["2","3","4","5","6","7","8","9","10","11","12","13","14","15"],"video_extend":["5","10","15"],"video_edit":["5","6","7","8","9","10"]},"anyOf":[{"title":"Wan 2.5 first frame","type":"object","properties":{"model":{"type":"string","enum":["wan2.5-i2v-preview"]},"task_type":{"type":"string","enum":["first_frame"],"default":"first_frame"},"duration":{"type":"string","enum":["5","10"],"default":"5"}}},{"title":"Wan 2.6 first frame","type":"object","properties":{"model":{"type":"string","enum":["wan2.6-i2v","wan2.6-i2v-flash"]},"task_type":{"type":"string","enum":["first_frame"]},"duration":{"type":"string","enum":["5","10","15"],"default":"5"}}},{"title":"Wan 2.7 text to video","type":"object","properties":{"model":{"type":"string","enum":["wan2.7-i2v"]},"task_type":{"type":"string","enum":["text_to_video"]},"duration":{"type":"string","enum":["5","10","15"],"default":"5"}}},{"title":"Wan 2.7 first frame","type":"object","properties":{"model":{"type":"string","enum":["wan2.7-i2v"]},"task_type":{"type":"string","enum":["first_frame"]},"duration":{"type":"string","enum":["5","10","15"],"default":"5"}}},{"title":"Wan 2.7 first and last frame","type":"object","properties":{"model":{"type":"string","enum":["wan2.7-i2v"]},"task_type":{"type":"string","enum":["first_last_frame"]},"duration":{"type":"string","enum":["5","10","15"],"default":"5"}}},{"title":"Wan 2.7 reference image","type":"object","properties":{"model":{"type":"string","enum":["wan2.7-i2v"]},"task_type":{"type":"string","enum":["reference_image"]},"duration":{"type":"string","enum":["2","3","4","5","6","7","8","9","10","11","12","13","14","15"],"default":"5"}}},{"title":"Wan 2.7 video extension","type":"object","properties":{"model":{"type":"string","enum":["wan2.7-i2v"]},"task_type":{"type":"string","enum":["video_extend"]},"duration":{"type":"string","enum":["5","10","15"],"default":"5"}}},{"title":"Wan 2.7 video edit","type":"object","properties":{"model":{"type":"string","enum":["wan2.7-i2v"]},"task_type":{"type":"string","enum":["video_edit"]},"duration":{"type":"string","enum":["5","6","7","8","9","10"],"default":"5"}}}]},{"$ref":"#/components/schemas/WebhookInput"}]},"example":{}}}},"responses":{"200":{"description":"Wan video task started successfully","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"400":{"description":"Bad Request - Invalid parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"postApiV1UserWan25Start","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/userWan25/start\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/userWan25/allRecords":{"get":{"summary":"Get all Wan 2.5 tasks","description":"Return the authenticated user's Wan 2.5 image-to-video tasks using the requested pagination controls, including current status and available output metadata.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supported query parameters: `pageNum`, `pageSize`. Omitted values use the defaults shown in the parameter schema.\n### Behavior\n- Returns the collection visible in the current request and authorization context.\n- Apply the documented pagination and filter parameters when present; use response metadata to continue paging.\n- Record fields and status values have the same meaning as in the corresponding detail operation.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userWan25/{_id}` — Get Wan 2.5 task details.\n- `DELETE /api/v1/userWan25/{_id}` — Delete a Wan 2.5 task.\n- `POST /api/v1/userWan25/batchDetail` — Batch query task details.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Wan Image to Video"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Task list retrieved successfully","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"pageNum","in":"query","required":false,"schema":{"type":"integer","default":1,"example":1},"description":"Page number"},{"name":"pageSize","in":"query","required":false,"schema":{"type":"integer","default":10,"example":10},"description":"Number of items per page"}],"operationId":"getApiV1UserWan25AllRecords","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/userWan25/allRecords\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]}},"/api/v1/userWan25/batchDetail":{"post":{"summary":"Batch query task details","description":"Query details for multiple tasks at once by providing an array of task IDs.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body. Required fields: `ids`.\n### Behavior\n- Fetches several task records in one request, reducing the number of individual detail calls.\n- Results remain subject to the same authentication and ownership checks as single-record lookups.\n- Match returned records by their identifiers instead of relying on response ordering.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userWan25/allRecords` — Get all Wan 2.5 tasks.\n- `GET /api/v1/userWan25/{_id}` — Get Wan 2.5 task details.\n- `DELETE /api/v1/userWan25/{_id}` — Delete a Wan 2.5 task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Wan Image to Video"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"ids":{"type":"array","items":{"type":"string","example":"example"},"description":"Array of task IDs to query","example":["example"]}},"required":["ids"],"example":{"ids":["example"]}},"example":{"ids":["example"]}}}},"responses":{"200":{"description":"Batch details retrieved successfully"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"postApiV1UserWan25BatchDetail","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/userWan25/batchDetail\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{\n  \"ids\": [\n    \"example\"\n  ]\n}'"}]}},"/api/v1/userWan25/{_id}":{"get":{"summary":"Get Wan 2.5 task details","description":"Return the authenticated user's Wan 2.5 image-to-video task identified by `_id`, including its generation settings, current status, and available video output.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supply `_id` in the URL path.\n### Behavior\n- Retrieves the current server-side representation of the requested resource or task.\n- For asynchronous tasks, inspect the documented status and result fields before consuming generated media.\n- Repeat the request only as needed for polling and stop after the task reaches a terminal state.\n### Response\n- On `200`, consume the fields defined by that response schema below.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userWan25/allRecords` — Get all Wan 2.5 tasks.\n- `DELETE /api/v1/userWan25/{_id}` — Delete a Wan 2.5 task.\n- `POST /api/v1/userWan25/batchDetail` — Batch query task details.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Wan Image to Video"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Task details retrieved successfully","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"_id","in":"path","required":true,"schema":{"type":"string","example":"507f1f77bcf86cd799439011"},"description":"Task ID"}],"operationId":"getApiV1UserWan25Id","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/userWan25/{_id}\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]},"delete":{"summary":"Delete a Wan 2.5 task","description":"Remove the authenticated user's Wan 2.5 image-to-video task identified by `_id` from normal task history without affecting unrelated tasks.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supply `_id` in the URL path.\n### Behavior\n- Deletes or marks the selected resource as deleted according to the endpoint's documented lifecycle rules.\n- Use the resource identifier from a list, creation, or detail response; deleting one resource does not affect unrelated records.\n- Do not assume an in-progress task can be cancelled unless the endpoint explicitly documents that behavior.\n### Response\n- A `200` response confirms that the deletion request was applied to the selected record.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userWan25/allRecords` — Get all Wan 2.5 tasks.\n- `GET /api/v1/userWan25/{_id}` — Get Wan 2.5 task details.\n- `POST /api/v1/userWan25/batchDetail` — Batch query task details.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Wan Image to Video"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Task deleted successfully","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"_id","in":"path","required":true,"schema":{"type":"string","example":"507f1f77bcf86cd799439011"},"description":"Task ID"}],"operationId":"deleteApiV1UserWan25Id","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X DELETE \"https://cheap.dev/api/v1/userWan25/{_id}\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/userWan26R2V/start":{"post":{"summary":"Start reference-to-video generation","description":"Generate a video from reference images/videos using Wan 2.6 R2V Flash.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body. Required fields: `prompt`, `reference_urls`.\n- API-token callers may include `webhook_url` and `webhook_token` for best-effort terminal-state notifications; ordinary JWT/cookie calls ignore these fields.\n### Behavior\n- This is an asynchronous operation: a successful submission creates a task and returns before processing finishes.\n- Persist the returned task identifier and use the corresponding detail or list operation to observe progress.\n- Treat the detail endpoint as the source of truth even when webhook delivery is enabled.\n### Response\n- A `200` response confirms task acceptance; it does not by itself mean media generation has completed.\n- Retain the returned identifier and wait for a documented terminal status before using output URLs.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userWan26R2V/allRecords` — Get all R2V tasks.\n- `GET /api/v1/userWan26R2V/{_id}` — Get R2V task details.\n- `DELETE /api/v1/userWan26R2V/{_id}` — Delete a R2V task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Wan 2.6 R2V Flash"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"type":"object","properties":{"model":{"type":"string","enum":["wan2.6-r2v-flash","wan2.6-r2v"],"default":"wan2.6-r2v-flash","description":"Model variant (flash=faster+cheaper, standard=higher quality audio-only)"},"name":{"type":"string","description":"Task name"},"reference_urls":{"type":"array","items":{"type":"string"},"description":"Array of reference image/video URLs (max 5)"},"prompt":{"type":"string","description":"Generation prompt (use character1, character2 to reference inputs)"},"duration":{"type":"string","enum":["5","10"],"default":"5"},"resolution":{"type":"string","enum":["720p","1080p"],"default":"720p","description":"Resolution tier, combined with aspect_ratio to determine actual size"},"aspect_ratio":{"type":"string","enum":["16:9","9:16","1:1","4:3","3:4"],"default":"16:9","description":"Aspect ratio for the output video"},"shot_type":{"type":"string","enum":["single","multi"],"default":"single"},"audio":{"type":"boolean","default":true}},"required":["prompt","reference_urls"]},{"$ref":"#/components/schemas/WebhookInput"}]},"example":{}}}},"responses":{"200":{"description":"Task started successfully"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"postApiV1UserWan26R2VStart","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/userWan26R2V/start\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/userWan26R2V/allRecords":{"get":{"summary":"Get all R2V tasks","description":"Return the authenticated user's Wan 2.6 reference-to-video tasks using the requested pagination controls.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supported query parameters: `pageNum`, `pageSize`. Omitted values use the defaults shown in the parameter schema.\n### Behavior\n- Returns the collection visible in the current request and authorization context.\n- Apply the documented pagination and filter parameters when present; use response metadata to continue paging.\n- Record fields and status values have the same meaning as in the corresponding detail operation.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userWan26R2V/{_id}` — Get R2V task details.\n- `DELETE /api/v1/userWan26R2V/{_id}` — Delete a R2V task.\n- `POST /api/v1/userWan26R2V/start` — Start reference-to-video generation.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Wan 2.6 R2V Flash"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Task list retrieved"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"pageNum","in":"query","required":false,"schema":{"type":"integer","default":1,"example":1},"description":"pageNum parameter"},{"name":"pageSize","in":"query","required":false,"schema":{"type":"integer","default":10,"example":10},"description":"pageSize parameter"}],"operationId":"getApiV1UserWan26R2VAllRecords","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/userWan26R2V/allRecords\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]}},"/api/v1/userWan26R2V/batchDetail":{"post":{"summary":"Batch query task details","description":"Query details for multiple tasks at once by providing an array of task IDs.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body. Required fields: `ids`.\n### Behavior\n- Fetches several task records in one request, reducing the number of individual detail calls.\n- Results remain subject to the same authentication and ownership checks as single-record lookups.\n- Match returned records by their identifiers instead of relying on response ordering.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userWan26R2V/allRecords` — Get all R2V tasks.\n- `GET /api/v1/userWan26R2V/{_id}` — Get R2V task details.\n- `DELETE /api/v1/userWan26R2V/{_id}` — Delete a R2V task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Wan 2.6 R2V Flash"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"ids":{"type":"array","items":{"type":"string","example":"example"},"description":"Array of task IDs to query","example":["example"]}},"required":["ids"],"example":{"ids":["example"]}},"example":{"ids":["example"]}}}},"responses":{"200":{"description":"Batch details retrieved successfully"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"postApiV1UserWan26R2VBatchDetail","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/userWan26R2V/batchDetail\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{\n  \"ids\": [\n    \"example\"\n  ]\n}'"}]}},"/api/v1/userWan26R2V/{_id}":{"get":{"summary":"Get R2V task details","description":"Return the authenticated user's Wan 2.6 reference-to-video task identified by `_id`, including its current status and video output fields.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supply `_id` in the URL path.\n### Behavior\n- Retrieves the current server-side representation of the requested resource or task.\n- For asynchronous tasks, inspect the documented status and result fields before consuming generated media.\n- Repeat the request only as needed for polling and stop after the task reaches a terminal state.\n### Response\n- On `200`, consume the fields defined by that response schema below.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userWan26R2V/allRecords` — Get all R2V tasks.\n- `DELETE /api/v1/userWan26R2V/{_id}` — Delete a R2V task.\n- `POST /api/v1/userWan26R2V/start` — Start reference-to-video generation.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Wan 2.6 R2V Flash"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Task details retrieved"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"_id","in":"path","required":true,"schema":{"type":"string","example":"507f1f77bcf86cd799439011"},"description":"_id parameter"}],"operationId":"getApiV1UserWan26R2VId","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/userWan26R2V/{_id}\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]},"delete":{"summary":"Delete a R2V task","description":"Soft-delete the authenticated user's Wan 2.6 reference-to-video task identified by `_id`.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supply `_id` in the URL path.\n### Behavior\n- Deletes or marks the selected resource as deleted according to the endpoint's documented lifecycle rules.\n- Use the resource identifier from a list, creation, or detail response; deleting one resource does not affect unrelated records.\n- Do not assume an in-progress task can be cancelled unless the endpoint explicitly documents that behavior.\n### Response\n- A `200` response confirms that the deletion request was applied to the selected record.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userWan26R2V/allRecords` — Get all R2V tasks.\n- `GET /api/v1/userWan26R2V/{_id}` — Get R2V task details.\n- `POST /api/v1/userWan26R2V/start` — Start reference-to-video generation.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Wan 2.6 R2V Flash"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Task deleted successfully"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"_id","in":"path","required":true,"schema":{"type":"string","example":"507f1f77bcf86cd799439011"},"description":"_id parameter"}],"operationId":"deleteApiV1UserWan26R2VId","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X DELETE \"https://cheap.dev/api/v1/userWan26R2V/{_id}\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/userWanSpicy/start":{"post":{"summary":"Start Wan Spicy image-to-video generation","description":"Start a Wan Spicy image-to-video task via mulerouter.ai/carrothub.\n- wan2.7-i2v-spicy: with audio support, resolution 720p/1080p, duration 2-15 seconds.\n- wan2.2-i2v-spicy: no audio, resolution 480p/720p, duration 5 or 8 seconds.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body. Required fields: `prompt`, `image_url`, `resolution`, `duration`.\n- API-token callers may include `webhook_url` and `webhook_token` for best-effort terminal-state notifications; ordinary JWT/cookie calls ignore these fields.\n### Behavior\n- This is an asynchronous operation: a successful submission creates a task and returns before processing finishes.\n- Persist the returned task identifier and use the corresponding detail or list operation to observe progress.\n- Treat the detail endpoint as the source of truth even when webhook delivery is enabled.\n### Response\n- A `200` response confirms task acceptance; it does not by itself mean media generation has completed.\n- Retain the returned identifier and wait for a documented terminal status before using output URLs.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userWanSpicy/allRecords` — Get all Wan Spicy tasks.\n- `GET /api/v1/userWanSpicy/{_id}` — Get Wan Spicy task details.\n- `DELETE /api/v1/userWanSpicy/{_id}` — Delete a Wan Spicy task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Wan Image to Video"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"type":"object","properties":{"model":{"type":"string","enum":["wan2.7-i2v-spicy","wan2.2-i2v-spicy"],"default":"wan2.7-i2v-spicy","description":"Model variant (2.7 supports audio, 2.2 no audio)"},"name":{"type":"string","description":"Optional display name for the task"},"prompt":{"type":"string","description":"Generation prompt"},"negative_prompt":{"type":"string","description":"Negative prompt (only valid when model = wan2.7-i2v-spicy)"},"image_url":{"type":"string","description":"Reference image URL (https only)"},"audio_url":{"type":"string","description":"Audio URL (https, .wav/.mp3, only valid when model = wan2.7-i2v-spicy)"},"resolution":{"type":"string","enum":["480p","720p","1080p"],"description":"Resolution tier (wan2.7 720p/1080p, wan2.2 480p/720p)"},"duration":{"type":"number","description":"Output duration in seconds (wan2.7 2-15, wan2.2 5 or 8)"},"prompt_extend":{"type":"boolean","default":true},"seed":{"type":"integer","description":"Random seed"},"minor_suspected_skip":{"type":"boolean","default":false,"description":"Skip pre-charge minor-suspect prompt for the input image"}},"required":["prompt","image_url","resolution","duration"]},{"$ref":"#/components/schemas/WebhookInput"}]},"example":{}}}},"responses":{"200":{"description":"Task started successfully"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"postApiV1UserWanSpicyStart","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/userWanSpicy/start\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/userWanSpicy/allRecords":{"get":{"summary":"Get all Wan Spicy tasks","description":"Return the authenticated user's Wan Spicy image-to-video tasks using the requested pagination controls.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supported query parameters: `pageNum`, `pageSize`. Omitted values use the defaults shown in the parameter schema.\n### Behavior\n- Returns the collection visible in the current request and authorization context.\n- Apply the documented pagination and filter parameters when present; use response metadata to continue paging.\n- Record fields and status values have the same meaning as in the corresponding detail operation.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userWanSpicy/{_id}` — Get Wan Spicy task details.\n- `DELETE /api/v1/userWanSpicy/{_id}` — Delete a Wan Spicy task.\n- `POST /api/v1/userWanSpicy/start` — Start Wan Spicy image-to-video generation.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Wan Image to Video"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Task list retrieved"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"pageNum","in":"query","required":false,"schema":{"type":"integer","default":1,"example":1},"description":"pageNum parameter"},{"name":"pageSize","in":"query","required":false,"schema":{"type":"integer","default":10,"example":10},"description":"pageSize parameter"}],"operationId":"getApiV1UserWanSpicyAllRecords","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/userWanSpicy/allRecords\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]}},"/api/v1/userWanSpicy/batchDetail":{"post":{"summary":"Batch query task details","description":"Query details for multiple tasks at once by providing an array of task IDs.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body. Required fields: `ids`.\n### Behavior\n- Fetches several task records in one request, reducing the number of individual detail calls.\n- Results remain subject to the same authentication and ownership checks as single-record lookups.\n- Match returned records by their identifiers instead of relying on response ordering.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userWanSpicy/allRecords` — Get all Wan Spicy tasks.\n- `GET /api/v1/userWanSpicy/{_id}` — Get Wan Spicy task details.\n- `DELETE /api/v1/userWanSpicy/{_id}` — Delete a Wan Spicy task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Wan Image to Video"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"ids":{"type":"array","items":{"type":"string","example":"example"},"description":"Array of task IDs to query","example":["example"]}},"required":["ids"],"example":{"ids":["example"]}},"example":{"ids":["example"]}}}},"responses":{"200":{"description":"Batch details retrieved successfully"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"postApiV1UserWanSpicyBatchDetail","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/userWanSpicy/batchDetail\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{\n  \"ids\": [\n    \"example\"\n  ]\n}'"}]}},"/api/v1/userWanSpicy/{_id}":{"get":{"summary":"Get Wan Spicy task details","description":"Return the authenticated user's Wan Spicy image-to-video task identified by `_id`, including its current status and video output fields.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supply `_id` in the URL path.\n### Behavior\n- Retrieves the current server-side representation of the requested resource or task.\n- For asynchronous tasks, inspect the documented status and result fields before consuming generated media.\n- Repeat the request only as needed for polling and stop after the task reaches a terminal state.\n### Response\n- On `200`, consume the fields defined by that response schema below.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userWanSpicy/allRecords` — Get all Wan Spicy tasks.\n- `DELETE /api/v1/userWanSpicy/{_id}` — Delete a Wan Spicy task.\n- `POST /api/v1/userWanSpicy/start` — Start Wan Spicy image-to-video generation.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Wan Image to Video"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Task details retrieved"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"_id","in":"path","required":true,"schema":{"type":"string","example":"507f1f77bcf86cd799439011"},"description":"_id parameter"}],"operationId":"getApiV1UserWanSpicyId","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/userWanSpicy/{_id}\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]},"delete":{"summary":"Delete a Wan Spicy task","description":"Soft-delete the authenticated user's Wan Spicy image-to-video task identified by `_id`.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supply `_id` in the URL path.\n### Behavior\n- Deletes or marks the selected resource as deleted according to the endpoint's documented lifecycle rules.\n- Use the resource identifier from a list, creation, or detail response; deleting one resource does not affect unrelated records.\n- Do not assume an in-progress task can be cancelled unless the endpoint explicitly documents that behavior.\n### Response\n- A `200` response confirms that the deletion request was applied to the selected record.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userWanSpicy/allRecords` — Get all Wan Spicy tasks.\n- `GET /api/v1/userWanSpicy/{_id}` — Get Wan Spicy task details.\n- `POST /api/v1/userWanSpicy/start` — Start Wan Spicy image-to-video generation.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Wan Image to Video"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Task deleted successfully"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"_id","in":"path","required":true,"schema":{"type":"string","example":"507f1f77bcf86cd799439011"},"description":"_id parameter"}],"operationId":"deleteApiV1UserWanSpicyId","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X DELETE \"https://cheap.dev/api/v1/userWanSpicy/{_id}\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/userHappyhorseVideo/start":{"post":{"summary":"Start HappyHorse video generation task (T2V / I2V / R2V / Video-Edit)","description":"Generate a video using HappyHorse models on Alibaba DashScope. If model_version is omitted, new tasks keep the legacy 1.0 behavior.\nSupported modes:\n  - t2v: text → video (happyhorse-1.0-t2v / happyhorse-1.1-t2v)\n  - i2v: image first_frame → video (happyhorse-1.0-i2v / happyhorse-1.1-i2v)\n  - r2v: reference images → video (happyhorse-1.0-r2v / happyhorse-1.1-r2v)\n  - video-edit: video + reference images → edited video (happyhorse-1.0-video-edit)\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body. Required fields: `mode`.\n- API-token callers may include `webhook_url` and `webhook_token` for best-effort terminal-state notifications; ordinary JWT/cookie calls ignore these fields.\n### Behavior\n- This is an asynchronous operation: a successful submission creates a task and returns before processing finishes.\n- Persist the returned task identifier and use the corresponding detail or list operation to observe progress.\n- Treat the detail endpoint as the source of truth even when webhook delivery is enabled.\n### Response\n- A `200` response confirms task acceptance; it does not by itself mean media generation has completed.\n- Retain the returned identifier and wait for a documented terminal status before using output URLs.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userHappyhorseVideo/allRecords` — List HappyHorse tasks.\n- `GET /api/v1/userHappyhorseVideo/{_id}` — Get HappyHorse task details.\n- `DELETE /api/v1/userHappyhorseVideo/{_id}` — Delete a HappyHorse task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["HappyHorse Video"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"type":"object","properties":{"mode":{"type":"string","enum":["t2v","i2v","r2v","video-edit"],"description":"Generation mode"},"name":{"type":"string","description":"Task name"},"model_version":{"type":"string","enum":["1.0","1.1"],"default":"1.0","description":"Model version for t2v / i2v / r2v. video-edit always uses 1.0. HappyHorse 1.0 keeps the legacy duration/ratio options; 1.1 supports 3-15s, additional aspect ratios, and 480P/720P/1080P."},"prompt":{"type":"string","description":"Required for t2v / r2v / video-edit; optional for i2v"},"image_url":{"type":"string","description":"First frame image URL (i2v only)"},"reference_image_urls":{"type":"array","items":{"type":"string"},"description":"Reference images (r2v requires 1-9; video-edit allows 0-5)"},"edit_video_url":{"type":"string","description":"Input video URL (video-edit only)"},"input_video_seconds":{"type":"number","description":"Frontend-detected input video duration in seconds (used to estimate coins for video-edit)"},"duration":{"type":"string","enum":["3","4","5","6","7","8","9","10","11","12","13","14","15"],"default":"5","description":"Output duration (seconds). model_version=1.0 supports 5/10/15; model_version=1.1 supports 3-15. Ignored for video-edit (decided by input video)."},"resolution":{"type":"string","enum":["480P","720P","1080P"],"default":"720P","description":"Output resolution. 480P is only supported by HappyHorse 1.1 t2v / i2v / r2v; 1.0 and video-edit support 720P / 1080P."},"ratio":{"type":"string","enum":["16:9","9:16","1:1","4:3","3:4","4:5","5:4","9:21","21:9"],"default":"16:9","description":"Aspect ratio (t2v / r2v only). model_version=1.0 supports 16:9, 9:16, 1:1, 4:3, 3:4; model_version=1.1 also supports 4:5, 5:4, 9:21, 21:9."},"audio_setting":{"type":"string","enum":["auto","origin"],"default":"auto","description":"Audio control (video-edit only). auto = model decides; origin = keep input video audio."},"seed":{"type":"integer","description":"Random seed [0, 2147483647]"},"watermark":{"type":"boolean","default":true,"description":"DashScope watermark switch"},"minor_suspected_skip":{"type":"boolean","default":false}},"required":["mode"]},{"$ref":"#/components/schemas/WebhookInput"}]},"example":{}}}},"responses":{"200":{"description":"Task created successfully"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"postApiV1UserHappyhorseVideoStart","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/userHappyhorseVideo/start\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/userHappyhorseVideo/allRecords":{"get":{"summary":"List HappyHorse tasks","description":"Return the authenticated user's HappyHorse text-to-video, image-to-video, reference-to-video, and video-edit tasks using pagination.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supported query parameters: `pageNum`, `pageSize`. Omitted values use the defaults shown in the parameter schema.\n### Behavior\n- Returns the collection visible in the current request and authorization context.\n- Apply the documented pagination and filter parameters when present; use response metadata to continue paging.\n- Record fields and status values have the same meaning as in the corresponding detail operation.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userHappyhorseVideo/{_id}` — Get HappyHorse task details.\n- `DELETE /api/v1/userHappyhorseVideo/{_id}` — Delete a HappyHorse task.\n- `POST /api/v1/userHappyhorseVideo/start` — Start HappyHorse video generation task (T2V / I2V / R2V / Video-Edit)\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["HappyHorse Video"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Task list"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"pageNum","in":"query","required":false,"schema":{"type":"integer","default":1,"example":1},"description":"pageNum parameter"},{"name":"pageSize","in":"query","required":false,"schema":{"type":"integer","default":10,"example":10},"description":"pageSize parameter"}],"operationId":"getApiV1UserHappyhorseVideoAllRecords","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/userHappyhorseVideo/allRecords\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]}},"/api/v1/userHappyhorseVideo/batchDetail":{"post":{"summary":"Batch query task details","description":"Return up to 200 authenticated-user HappyHorse video tasks matching the submitted `ids`; callers should match records by identifier.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body. Required fields: `ids`.\n### Behavior\n- Fetches several task records in one request, reducing the number of individual detail calls.\n- Results remain subject to the same authentication and ownership checks as single-record lookups.\n- Match returned records by their identifiers instead of relying on response ordering.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userHappyhorseVideo/allRecords` — List HappyHorse tasks.\n- `GET /api/v1/userHappyhorseVideo/{_id}` — Get HappyHorse task details.\n- `DELETE /api/v1/userHappyhorseVideo/{_id}` — Delete a HappyHorse task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["HappyHorse Video"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"ids":{"type":"array","items":{"type":"string","example":"example"},"example":["example"]}},"required":["ids"],"example":{"ids":["example"]}},"example":{"ids":["example"]}}}},"responses":{"200":{"description":"Batch details"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"postApiV1UserHappyhorseVideoBatchDetail","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/userHappyhorseVideo/batchDetail\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{\n  \"ids\": [\n    \"example\"\n  ]\n}'"}]}},"/api/v1/userHappyhorseVideo/{_id}":{"get":{"summary":"Get HappyHorse task details","description":"Return the authenticated user's HappyHorse video task identified by `_id`, including its mode, current status, and video output fields.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supply `_id` in the URL path.\n### Behavior\n- Retrieves the current server-side representation of the requested resource or task.\n- For asynchronous tasks, inspect the documented status and result fields before consuming generated media.\n- Repeat the request only as needed for polling and stop after the task reaches a terminal state.\n### Response\n- On `200`, consume the fields defined by that response schema below.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userHappyhorseVideo/allRecords` — List HappyHorse tasks.\n- `DELETE /api/v1/userHappyhorseVideo/{_id}` — Delete a HappyHorse task.\n- `POST /api/v1/userHappyhorseVideo/start` — Start HappyHorse video generation task (T2V / I2V / R2V / Video-Edit)\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["HappyHorse Video"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Task detail"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"_id","in":"path","required":true,"schema":{"type":"string","example":"507f1f77bcf86cd799439011"},"description":"_id parameter"}],"operationId":"getApiV1UserHappyhorseVideoId","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/userHappyhorseVideo/{_id}\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]},"delete":{"summary":"Delete a HappyHorse task","description":"Soft-delete the authenticated user's HappyHorse video task identified by `_id`.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supply `_id` in the URL path.\n### Behavior\n- Deletes or marks the selected resource as deleted according to the endpoint's documented lifecycle rules.\n- Use the resource identifier from a list, creation, or detail response; deleting one resource does not affect unrelated records.\n- Do not assume an in-progress task can be cancelled unless the endpoint explicitly documents that behavior.\n### Response\n- A `200` response confirms that the deletion request was applied to the selected record.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/userHappyhorseVideo/allRecords` — List HappyHorse tasks.\n- `GET /api/v1/userHappyhorseVideo/{_id}` — Get HappyHorse task details.\n- `POST /api/v1/userHappyhorseVideo/start` — Start HappyHorse video generation task (T2V / I2V / R2V / Video-Edit)\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["HappyHorse Video"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Task deleted"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"_id","in":"path","required":true,"schema":{"type":"string","example":"507f1f77bcf86cd799439011"},"description":"_id parameter"}],"operationId":"deleteApiV1UserHappyhorseVideoId","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X DELETE \"https://cheap.dev/api/v1/userHappyhorseVideo/{_id}\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/talkingPhoto/start":{"post":{"summary":"Start talking photo generation","description":"Create an asynchronous talking-photo task from the submitted portrait image and audio or text input, then return the task record used to monitor video generation.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body. Required fields: `name`, `image_url`, `prompt`, `negative_prompt`.\n- API-token callers may include `webhook_url` and `webhook_token` for best-effort terminal-state notifications; ordinary JWT/cookie calls ignore these fields.\n### Behavior\n- This is an asynchronous operation: a successful submission creates a task and returns before processing finishes.\n- Persist the returned task identifier and use the corresponding detail or list operation to observe progress.\n- Treat the detail endpoint as the source of truth even when webhook delivery is enabled.\n### Response\n- A `200` response confirms task acceptance; it does not by itself mean media generation has completed.\n- Retain the returned identifier and wait for a documented terminal status before using output URLs.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Bad Request - Invalid parameters.\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/talkingPhoto/allRecords` — Get all task records.\n- `GET /api/v1/talkingPhoto/{_id}` — Get task details.\n- `DELETE /api/v1/talkingPhoto/{_id}` — Delete task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Talking Photo"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"type":"object","properties":{"name":{"type":"string","description":"Name of the talking photo task","example":"My Talking Photo"},"image_url":{"type":"string","description":"URL of the source image","example":"https://example.com/photo.jpg"},"audio_url":{"type":"string","description":"Optional audio URL","example":"https://example.com/audio.mp3"},"duration":{"type":"integer","description":"Duration in seconds","minimum":1,"maximum":20,"default":3,"example":5},"prompt":{"type":"string","description":"Generation prompt","example":"Make this person smile and speak"},"negative_prompt":{"type":"string","description":"Negative prompt to avoid unwanted features","example":"blurry, distorted"}},"required":["name","image_url","prompt","negative_prompt"]},{"$ref":"#/components/schemas/WebhookInput"}]},"example":{}}}},"responses":{"200":{"description":"Talking photo task started successfully","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"400":{"description":"Bad Request - Invalid parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"postApiV1TalkingPhotoStart","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/talkingPhoto/start\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/talkingPhoto/allRecords":{"get":{"summary":"Get all task records","description":"Return the authenticated user's talking-photo tasks, newest first, using the requested page number and page size.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supported query parameters: `pageNum`, `pageSize`. Omitted values use the defaults shown in the parameter schema.\n### Behavior\n- Returns the collection visible in the current request and authorization context.\n- Apply the documented pagination and filter parameters when present; use response metadata to continue paging.\n- Record fields and status values have the same meaning as in the corresponding detail operation.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/talkingPhoto/{_id}` — Get task details.\n- `DELETE /api/v1/talkingPhoto/{_id}` — Delete task.\n- `POST /api/v1/talkingPhoto/start` — Start talking photo generation.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Talking Photo"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Task list retrieved successfully"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"pageNum","in":"query","required":false,"schema":{"type":"integer","minimum":1,"example":1},"description":"Page number"},{"name":"pageSize","in":"query","required":false,"schema":{"type":"integer","example":10},"description":"Page size"}],"operationId":"getApiV1TalkingPhotoAllRecords","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/talkingPhoto/allRecords\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]}},"/api/v1/talkingPhoto/batchDetail":{"post":{"summary":"Batch query task details","description":"Query details for multiple tasks at once by providing an array of task IDs.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body. Required fields: `ids`.\n### Behavior\n- Fetches several task records in one request, reducing the number of individual detail calls.\n- Results remain subject to the same authentication and ownership checks as single-record lookups.\n- Match returned records by their identifiers instead of relying on response ordering.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/talkingPhoto/allRecords` — Get all task records.\n- `GET /api/v1/talkingPhoto/{_id}` — Get task details.\n- `DELETE /api/v1/talkingPhoto/{_id}` — Delete task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Talking Photo"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"ids":{"type":"array","items":{"type":"string","example":"example"},"description":"Array of task IDs to query","example":["example"]}},"required":["ids"],"example":{"ids":["example"]}},"example":{"ids":["example"]}}}},"responses":{"200":{"description":"Batch details retrieved successfully"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"postApiV1TalkingPhotoBatchDetail","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/talkingPhoto/batchDetail\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{\n  \"ids\": [\n    \"example\"\n  ]\n}'"}]}},"/api/v1/talkingPhoto/{_id}":{"get":{"summary":"Get task details","description":"Return the authenticated user's talking-photo task identified by `_id`, including its current processing status and available video output.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supply `_id` in the URL path.\n### Behavior\n- Retrieves the current server-side representation of the requested resource or task.\n- For asynchronous tasks, inspect the documented status and result fields before consuming generated media.\n- Repeat the request only as needed for polling and stop after the task reaches a terminal state.\n### Response\n- On `200`, consume the fields defined by that response schema below.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/talkingPhoto/allRecords` — Get all task records.\n- `DELETE /api/v1/talkingPhoto/{_id}` — Delete task.\n- `POST /api/v1/talkingPhoto/start` — Start talking photo generation.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Talking Photo"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Task details retrieved successfully"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"_id","in":"path","required":true,"schema":{"type":"string","example":"507f1f77bcf86cd799439011"},"description":"Task ID"}],"operationId":"getApiV1TalkingPhotoId","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/talkingPhoto/{_id}\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]},"delete":{"summary":"Delete task","description":"Remove the authenticated user's talking-photo task identified by `_id` from the task history without affecting other generated videos.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supply `_id` in the URL path.\n### Behavior\n- Deletes or marks the selected resource as deleted according to the endpoint's documented lifecycle rules.\n- Use the resource identifier from a list, creation, or detail response; deleting one resource does not affect unrelated records.\n- Do not assume an in-progress task can be cancelled unless the endpoint explicitly documents that behavior.\n### Response\n- A `200` response confirms that the deletion request was applied to the selected record.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/talkingPhoto/allRecords` — Get all task records.\n- `GET /api/v1/talkingPhoto/{_id}` — Get task details.\n- `POST /api/v1/talkingPhoto/start` — Start talking photo generation.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Talking Photo"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Task deleted successfully"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"_id","in":"path","required":true,"schema":{"type":"string","example":"507f1f77bcf86cd799439011"},"description":"Task ID to delete"}],"operationId":"deleteApiV1TalkingPhotoId","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X DELETE \"https://cheap.dev/api/v1/talkingPhoto/{_id}\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/talkingVideo/start":{"post":{"summary":"Start talking video generation","description":"Create an asynchronous talking-video task from the submitted source video and audio or text input, then return the record used to monitor generation.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body. Required fields: `name`, `video_url`, `prompt`, `negative_prompt`.\n- API-token callers may include `webhook_url` and `webhook_token` for best-effort terminal-state notifications; ordinary JWT/cookie calls ignore these fields.\n### Behavior\n- This is an asynchronous operation: a successful submission creates a task and returns before processing finishes.\n- Persist the returned task identifier and use the corresponding detail or list operation to observe progress.\n- Treat the detail endpoint as the source of truth even when webhook delivery is enabled.\n### Response\n- A `200` response confirms task acceptance; it does not by itself mean media generation has completed.\n- Retain the returned identifier and wait for a documented terminal status before using output URLs.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Bad Request - Invalid parameters.\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/talkingVideo/allRecords` — Get all task records.\n- `GET /api/v1/talkingVideo/{_id}` — Get task details.\n- `DELETE /api/v1/talkingVideo/{_id}` — Delete task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Talking Video"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"type":"object","properties":{"name":{"type":"string","description":"Name of the talking video task","example":"My Talking Video"},"video_url":{"type":"string","description":"URL of the source video","example":"https://example.com/video.mp4"},"audio_url":{"type":"string","description":"Optional audio URL","example":"https://example.com/audio.mp3"},"duration":{"type":"integer","description":"Duration in seconds","minimum":1,"maximum":20,"default":3,"example":5},"prompt":{"type":"string","description":"Generation prompt","example":"Make this person smile and speak"},"negative_prompt":{"type":"string","description":"Negative prompt to avoid unwanted features","example":"blurry, distorted"}},"required":["name","video_url","prompt","negative_prompt"]},{"$ref":"#/components/schemas/WebhookInput"}]},"example":{}}}},"responses":{"200":{"description":"Talking video task started successfully","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"400":{"description":"Bad Request - Invalid parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"postApiV1TalkingVideoStart","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/talkingVideo/start\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/talkingVideo/allRecords":{"get":{"summary":"Get all task records","description":"Return the authenticated user's talking-video tasks, newest first, using the requested page number and page size.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supported query parameters: `pageNum`, `pageSize`. Omitted values use the defaults shown in the parameter schema.\n### Behavior\n- Returns the collection visible in the current request and authorization context.\n- Apply the documented pagination and filter parameters when present; use response metadata to continue paging.\n- Record fields and status values have the same meaning as in the corresponding detail operation.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/talkingVideo/{_id}` — Get task details.\n- `DELETE /api/v1/talkingVideo/{_id}` — Delete task.\n- `POST /api/v1/talkingVideo/start` — Start talking video generation.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Talking Video"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Task list retrieved successfully"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"pageNum","in":"query","required":false,"schema":{"type":"integer","minimum":1,"example":1},"description":"Page number"},{"name":"pageSize","in":"query","required":false,"schema":{"type":"integer","example":10},"description":"Page size"}],"operationId":"getApiV1TalkingVideoAllRecords","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/talkingVideo/allRecords\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]}},"/api/v1/talkingVideo/batchDetail":{"post":{"summary":"Batch query task details","description":"Query details for multiple tasks at once by providing an array of task IDs.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body. Required fields: `ids`.\n### Behavior\n- Fetches several task records in one request, reducing the number of individual detail calls.\n- Results remain subject to the same authentication and ownership checks as single-record lookups.\n- Match returned records by their identifiers instead of relying on response ordering.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/talkingVideo/allRecords` — Get all task records.\n- `GET /api/v1/talkingVideo/{_id}` — Get task details.\n- `DELETE /api/v1/talkingVideo/{_id}` — Delete task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Talking Video"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"ids":{"type":"array","items":{"type":"string","example":"example"},"description":"Array of task IDs to query","example":["example"]}},"required":["ids"],"example":{"ids":["example"]}},"example":{"ids":["example"]}}}},"responses":{"200":{"description":"Batch details retrieved successfully"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"postApiV1TalkingVideoBatchDetail","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/talkingVideo/batchDetail\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{\n  \"ids\": [\n    \"example\"\n  ]\n}'"}]}},"/api/v1/talkingVideo/{_id}":{"get":{"summary":"Get task details","description":"Return the authenticated user's talking-video task identified by `_id`, including its current processing status and available video output.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supply `_id` in the URL path.\n### Behavior\n- Retrieves the current server-side representation of the requested resource or task.\n- For asynchronous tasks, inspect the documented status and result fields before consuming generated media.\n- Repeat the request only as needed for polling and stop after the task reaches a terminal state.\n### Response\n- On `200`, consume the fields defined by that response schema below.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/talkingVideo/allRecords` — Get all task records.\n- `DELETE /api/v1/talkingVideo/{_id}` — Delete task.\n- `POST /api/v1/talkingVideo/start` — Start talking video generation.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Talking Video"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Task details retrieved successfully"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"_id","in":"path","required":true,"schema":{"type":"string","example":"507f1f77bcf86cd799439011"},"description":"Task ID"}],"operationId":"getApiV1TalkingVideoId","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/talkingVideo/{_id}\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]},"delete":{"summary":"Delete task","description":"Remove the authenticated user's talking-video task identified by `_id` from the task history without affecting other generated videos.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supply `_id` in the URL path.\n### Behavior\n- Deletes or marks the selected resource as deleted according to the endpoint's documented lifecycle rules.\n- Use the resource identifier from a list, creation, or detail response; deleting one resource does not affect unrelated records.\n- Do not assume an in-progress task can be cancelled unless the endpoint explicitly documents that behavior.\n### Response\n- A `200` response confirms that the deletion request was applied to the selected record.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/talkingVideo/allRecords` — Get all task records.\n- `GET /api/v1/talkingVideo/{_id}` — Get task details.\n- `POST /api/v1/talkingVideo/start` — Start talking video generation.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Talking Video"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Task deleted successfully"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"_id","in":"path","required":true,"schema":{"type":"string","example":"507f1f77bcf86cd799439011"},"description":"Task ID to delete"}],"operationId":"deleteApiV1TalkingVideoId","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X DELETE \"https://cheap.dev/api/v1/talkingVideo/{_id}\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/virtualTryOn/start":{"post":{"summary":"Start virtual try-on task","description":"Start a virtual try-on task with clothing images on person photos.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body. Required fields: `image_urls`.\n- API-token callers may include `webhook_url` and `webhook_token` for best-effort terminal-state notifications; ordinary JWT/cookie calls ignore these fields.\n### Behavior\n- This is an asynchronous operation: a successful submission creates a task and returns before processing finishes.\n- Persist the returned task identifier and use the corresponding detail or list operation to observe progress.\n- Treat the detail endpoint as the source of truth even when webhook delivery is enabled.\n### Response\n- A `200` response confirms task acceptance; it does not by itself mean media generation has completed.\n- Retain the returned identifier and wait for a documented terminal status before using output URLs.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Bad Request - Invalid parameters.\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/virtualTryOn/allRecords` — Get all virtual try-on records.\n- `GET /api/v1/virtualTryOn/{_id}` — Get virtual try-on task detail.\n- `DELETE /api/v1/virtualTryOn/{_id}` — Delete virtual try-on task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Virtual Try-On"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"type":"object","properties":{"name":{"type":"string","description":"Name of the virtual try-on task","default":"","example":"Summer Dress Try-On"},"image_urls":{"type":"array","minItems":2,"maxItems":4,"items":{"type":"string","format":"uri","pattern":"^https?://.*"},"description":"Array of 2 image URLs - [0] person image, [1] clothing image","example":["https://example.com/person.jpg","https://example.com/dress.jpg"]},"timeout":{"type":"number","default":120,"description":"Processing timeout in seconds","example":120}},"required":["image_urls"]},{"$ref":"#/components/schemas/WebhookInput"}]},"example":{}}}},"responses":{"200":{"description":"Virtual try-on task started successfully","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"400":{"description":"Bad Request - Invalid parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"postApiV1VirtualTryOnStart","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/virtualTryOn/start\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/virtualTryOn/allRecords":{"get":{"summary":"Get all virtual try-on records","description":"Retrieve paginated list of virtual try-on tasks for the current user.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supported query parameters: `pageNum`, `pageSize`. Omitted values use the defaults shown in the parameter schema.\n### Behavior\n- Returns the collection visible in the current request and authorization context.\n- Apply the documented pagination and filter parameters when present; use response metadata to continue paging.\n- Record fields and status values have the same meaning as in the corresponding detail operation.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Bad Request - Invalid parameters.\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/virtualTryOn/{_id}` — Get virtual try-on task detail.\n- `DELETE /api/v1/virtualTryOn/{_id}` — Delete virtual try-on task.\n- `POST /api/v1/virtualTryOn/start` — Start virtual try-on task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Virtual Try-On"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Virtual try-on records retrieved successfully","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"400":{"description":"Bad Request - Invalid parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"pageNum","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"example":1},"description":"Page number for pagination"},{"name":"pageSize","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":10,"example":10},"description":"Number of items per page"}],"operationId":"getApiV1VirtualTryOnAllRecords","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/virtualTryOn/allRecords\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]}},"/api/v1/virtualTryOn/batchDetail":{"post":{"summary":"Batch query task details","description":"Query details for multiple tasks at once by providing an array of task IDs.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body. Required fields: `ids`.\n### Behavior\n- Fetches several task records in one request, reducing the number of individual detail calls.\n- Results remain subject to the same authentication and ownership checks as single-record lookups.\n- Match returned records by their identifiers instead of relying on response ordering.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/virtualTryOn/allRecords` — Get all virtual try-on records.\n- `GET /api/v1/virtualTryOn/{_id}` — Get virtual try-on task detail.\n- `DELETE /api/v1/virtualTryOn/{_id}` — Delete virtual try-on task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Virtual Try-On"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"ids":{"type":"array","items":{"type":"string","example":"example"},"description":"Array of task IDs to query","example":["example"]}},"required":["ids"],"example":{"ids":["example"]}},"example":{"ids":["example"]}}}},"responses":{"200":{"description":"Batch details retrieved successfully"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"postApiV1VirtualTryOnBatchDetail","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/virtualTryOn/batchDetail\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{\n  \"ids\": [\n    \"example\"\n  ]\n}'"}]}},"/api/v1/virtualTryOn/{_id}":{"get":{"summary":"Get virtual try-on task detail","description":"Retrieve detailed information of a virtual try-on task by its ID.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supply `_id` in the URL path.\n### Behavior\n- Retrieves the current server-side representation of the requested resource or task.\n- For asynchronous tasks, inspect the documented status and result fields before consuming generated media.\n- Repeat the request only as needed for polling and stop after the task reaches a terminal state.\n### Response\n- On `200`, consume the fields defined by that response schema below.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Bad Request - Invalid parameters.\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/virtualTryOn/allRecords` — Get all virtual try-on records.\n- `DELETE /api/v1/virtualTryOn/{_id}` — Delete virtual try-on task.\n- `POST /api/v1/virtualTryOn/start` — Start virtual try-on task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Virtual Try-On"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Virtual try-on task detail retrieved successfully","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"400":{"description":"Bad Request - Invalid parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"_id","in":"path","required":true,"schema":{"type":"string","example":"507f1f77bcf86cd799439011"},"description":"Virtual try-on task ID"}],"operationId":"getApiV1VirtualTryOnId","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/virtualTryOn/{_id}\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]},"delete":{"summary":"Delete virtual try-on task","description":"Remove the authenticated user's virtual try-on task identified by `_id` from the task history without affecting other generated try-on results.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supply `_id` in the URL path.\n### Behavior\n- Deletes or marks the selected resource as deleted according to the endpoint's documented lifecycle rules.\n- Use the resource identifier from a list, creation, or detail response; deleting one resource does not affect unrelated records.\n- Do not assume an in-progress task can be cancelled unless the endpoint explicitly documents that behavior.\n### Response\n- A `200` response confirms that the deletion request was applied to the selected record.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Bad Request - Invalid parameters.\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/virtualTryOn/allRecords` — Get all virtual try-on records.\n- `GET /api/v1/virtualTryOn/{_id}` — Get virtual try-on task detail.\n- `POST /api/v1/virtualTryOn/start` — Start virtual try-on task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Virtual Try-On"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Virtual try-on task deleted successfully","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"400":{"description":"Bad Request - Invalid parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"_id","in":"path","required":true,"schema":{"type":"string","example":"507f1f77bcf86cd799439011"},"description":"Virtual try-on task ID"}],"operationId":"deleteApiV1VirtualTryOnId","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X DELETE \"https://cheap.dev/api/v1/virtualTryOn/{_id}\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/transactionRecord/creditsHistory":{"get":{"summary":"Get credits history","description":"Retrieve paginated credits transaction history for the authenticated user. Positive amounts are credit grants or purchases; negative amounts are credit consumption.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supported query parameters: `pageNum`, `pageSize`, `is_consumption`, `startDate`, `endDate`. Omitted values use the defaults shown in the parameter schema.\n### Behavior\n- Returns the collection visible in the current request and authorization context.\n- Apply the documented pagination and filter parameters when present; use response metadata to continue paging.\n- Record fields and status values have the same meaning as in the corresponding detail operation.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Bad Request - Invalid query parameters.\n- `401` — Unauthorized - Invalid or missing token.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Credits"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Credits history retrieved successfully","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"400":{"description":"Bad Request - Invalid query parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"pageNum","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"example":1},"description":"Page number, starting from 1."},{"name":"pageSize","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":10,"example":10},"description":"Number of records per page."},{"name":"is_consumption","in":"query","required":false,"schema":{"type":"boolean","example":false},"description":"When true, only returns consumption records; when false, only returns credit income records."},{"name":"startDate","in":"query","required":false,"schema":{"type":"string","example":"example"},"description":"Inclusive ISO date-time lower bound for createdAt."},{"name":"endDate","in":"query","required":false,"schema":{"type":"string","example":"example"},"description":"Inclusive ISO date-time upper bound for createdAt."}],"operationId":"getApiV1TransactionRecordCreditsHistory","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/transactionRecord/creditsHistory\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]}},"/api/v1/r2/upload-presigned-url":{"post":{"summary":"Get pre-signed upload URL","description":"Generate a pre-signed R2 PUT URL for direct browser/client upload.\nIf bucket is omitted, files are uploaded to 3days-apac by default.\nurlPrefix changes the leading object-key path and defaults to adam2eve outside site runtimes.\ncdnDomain changes the CDN domain suffix and defaults to the existing makefun.ai behavior outside site runtimes.\nSite runtimes reject urlPrefix and cdnDomain overrides to preserve isolated storage routing.\nThe returned key is scoped to {urlPrefix}/{env}/user/{user_id}/.\nUse cdnUrl as the public file URL after the PUT upload succeeds.\nAPI-token calls are charged using the R2 pricing rule; normal logged-in web/app calls are free.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body. Required fields: `key`.\n### Behavior\n- Validates the submitted payload and performs the operation described by the request schema.\n- Conditional fields, mutually exclusive inputs, limits, and defaults are enforced as documented by their schemas.\n### Response\n- On `200`, consume the fields defined by that response schema below.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Bad Request - Invalid parameters.\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `POST /api/v1/r2/get_upload_presigned_url` — Get pre-signed upload URL.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Miscellaneous"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"key":{"type":"string","description":"key parameter","example":"example_key"},"bucket":{"type":"string","description":"R2 bucket. Defaults to 3days-apac.","example":"3days-apac"},"urlPrefix":{"type":"string","description":"Leading object-key path outside site runtimes. Site runtimes reject this override.","example":"adam2eve"},"cdnDomain":{"type":"string","description":"CDN domain suffix outside site runtimes. Site runtimes reject this override.","example":"makefun.ai"},"expiresIn":{"type":"integer","minimum":60,"description":"expiresIn parameter","example":60},"contentType":{"type":"string","description":"MIME type to bind to the upload request.","example":"image/png"},"fileSize":{"type":"number","required":false,"description":"Optional file size in bytes. When provided, the pre-signed URL binds Content-Length.","example":1048576},"contentLength":{"type":"number","required":false,"description":"Optional Content-Length in bytes. Takes priority over fileSize if both are provided.","example":1048576}},"required":["key"],"example":{"key":"example_key","bucket":"3days-apac","urlPrefix":"adam2eve","cdnDomain":"makefun.ai","expiresIn":60,"contentType":"image/png","fileSize":1048576,"contentLength":1048576}},"example":{"key":"example_key","bucket":"3days-apac","urlPrefix":"adam2eve","cdnDomain":"makefun.ai","expiresIn":60,"contentType":"image/png","fileSize":1048576,"contentLength":1048576}}}},"responses":{"200":{"description":"Operation completed successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/R2UploadPresignedUrlResponse"}}}},"400":{"description":"Bad Request - Invalid parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"postApiV1R2UploadPresignedUrl","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/r2/upload-presigned-url\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{\n  \"key\": \"example_key\",\n  \"bucket\": \"3days-apac\",\n  \"urlPrefix\": \"adam2eve\",\n  \"cdnDomain\": \"makefun.ai\",\n  \"expiresIn\": 60,\n  \"contentType\": \"image/png\",\n  \"fileSize\": 1048576,\n  \"contentLength\": 1048576\n}'"}]}},"/api/v1/thinkSound/start":{"post":{"summary":"Start ThinkSound generation","description":"Generate audio-visual content from video using AI with customizable parameters.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body. Required fields: `video_url`.\n- API-token callers may include `webhook_url` and `webhook_token` for best-effort terminal-state notifications; ordinary JWT/cookie calls ignore these fields.\n### Behavior\n- This is an asynchronous operation: a successful submission creates a task and returns before processing finishes.\n- Persist the returned task identifier and use the corresponding detail or list operation to observe progress.\n- Treat the detail endpoint as the source of truth even when webhook delivery is enabled.\n### Response\n- A `200` response confirms task acceptance; it does not by itself mean media generation has completed.\n- Retain the returned identifier and wait for a documented terminal status before using output URLs.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Bad Request - Invalid parameters or video format.\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/thinkSound/allRecords` — Get all ThinkSound records.\n- `DELETE /api/v1/thinkSound/{_id}` — Delete ThinkSound task.\n- `GET /api/v1/thinkSound/{_id}` — Get ThinkSound task details.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["ThinkSound"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"type":"object","properties":{"name":{"type":"string","description":"Name of the ThinkSound task","example":"My Audio-Visual Generation"},"video_url":{"type":"string","description":"URL of the source video (must be .mp4, .avi, .mov, or .mkv)","example":"https://example.com/video.mp4"},"caption":{"type":"string","description":"Caption for the generation","default":"","example":"Generate audio for this silent video"},"cot_description":{"type":"string","description":"Chain of thought description","default":"","example":"Detailed description of the audio generation process"},"seed":{"type":"number","description":"Random seed for reproducible results","example":12345}},"required":["video_url"]},{"$ref":"#/components/schemas/WebhookInput"}]},"example":{}}}},"responses":{"200":{"description":"ThinkSound generation started successfully","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"400":{"description":"Bad Request - Invalid parameters or video format","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"postApiV1ThinkSoundStart","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/thinkSound/start\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/thinkSound/{_id}":{"delete":{"summary":"Delete ThinkSound task","description":"Remove the authenticated user's ThinkSound generation task identified by `_id` from the task history without affecting other generated-audio records.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supply `_id` in the URL path.\n### Behavior\n- Deletes or marks the selected resource as deleted according to the endpoint's documented lifecycle rules.\n- Use the resource identifier from a list, creation, or detail response; deleting one resource does not affect unrelated records.\n- Do not assume an in-progress task can be cancelled unless the endpoint explicitly documents that behavior.\n### Response\n- A `200` response confirms that the deletion request was applied to the selected record.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Bad Request - Invalid task ID.\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/thinkSound/allRecords` — Get all ThinkSound records.\n- `GET /api/v1/thinkSound/{_id}` — Get ThinkSound task details.\n- `POST /api/v1/thinkSound/start` — Start ThinkSound generation.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["ThinkSound"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"ThinkSound task deleted successfully","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"400":{"description":"Bad Request - Invalid task ID","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"_id","in":"path","required":true,"schema":{"type":"string","example":"507f1f77bcf86cd799439011"},"description":"ID of the ThinkSound task to delete"}],"operationId":"deleteApiV1ThinkSoundId","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X DELETE \"https://cheap.dev/api/v1/thinkSound/{_id}\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]},"get":{"summary":"Get ThinkSound task details","description":"Retrieve detailed information about a specific ThinkSound generation task.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supply `_id` in the URL path.\n### Behavior\n- Retrieves the current server-side representation of the requested resource or task.\n- For asynchronous tasks, inspect the documented status and result fields before consuming generated media.\n- Repeat the request only as needed for polling and stop after the task reaches a terminal state.\n### Response\n- On `200`, consume the fields defined by that response schema below.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Bad Request - Invalid task ID format.\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/thinkSound/allRecords` — Get all ThinkSound records.\n- `DELETE /api/v1/thinkSound/{_id}` — Delete ThinkSound task.\n- `POST /api/v1/thinkSound/start` — Start ThinkSound generation.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["ThinkSound"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"ThinkSound task details retrieved successfully","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"400":{"description":"Bad Request - Invalid task ID format","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"_id","in":"path","required":true,"schema":{"type":"string","example":"507f1f77bcf86cd799439011"},"description":"ID of the ThinkSound task"}],"operationId":"getApiV1ThinkSoundId","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/thinkSound/{_id}\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]}},"/api/v1/thinkSound/allRecords":{"get":{"summary":"Get all ThinkSound records","description":"Retrieve paginated list of ThinkSound generation tasks for the authenticated user.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supported query parameters: `pageNum`, `pageSize`. Omitted values use the defaults shown in the parameter schema.\n### Behavior\n- Returns the collection visible in the current request and authorization context.\n- Apply the documented pagination and filter parameters when present; use response metadata to continue paging.\n- Record fields and status values have the same meaning as in the corresponding detail operation.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Bad Request - Invalid pagination parameters.\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `DELETE /api/v1/thinkSound/{_id}` — Delete ThinkSound task.\n- `GET /api/v1/thinkSound/{_id}` — Get ThinkSound task details.\n- `POST /api/v1/thinkSound/start` — Start ThinkSound generation.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["ThinkSound"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"ThinkSound records retrieved successfully","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"400":{"description":"Bad Request - Invalid pagination parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"pageNum","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"example":1},"description":"Page number (starts from 1)"},{"name":"pageSize","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":10,"example":10},"description":"Number of records per page"}],"operationId":"getApiV1ThinkSoundAllRecords","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/thinkSound/allRecords\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]}},"/api/v1/thinkSound/batchDetail":{"post":{"summary":"Batch query task details","description":"Query details for multiple tasks at once by providing an array of task IDs.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body. Required fields: `ids`.\n### Behavior\n- Fetches several task records in one request, reducing the number of individual detail calls.\n- Results remain subject to the same authentication and ownership checks as single-record lookups.\n- Match returned records by their identifiers instead of relying on response ordering.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/thinkSound/allRecords` — Get all ThinkSound records.\n- `DELETE /api/v1/thinkSound/{_id}` — Delete ThinkSound task.\n- `GET /api/v1/thinkSound/{_id}` — Get ThinkSound task details.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["ThinkSound"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"ids":{"type":"array","items":{"type":"string","example":"example"},"description":"Array of task IDs to query","example":["example"]}},"required":["ids"],"example":{"ids":["example"]}},"example":{"ids":["example"]}}}},"responses":{"200":{"description":"Batch details retrieved successfully"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"postApiV1ThinkSoundBatchDetail","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/thinkSound/batchDetail\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{\n  \"ids\": [\n    \"example\"\n  ]\n}'"}]}},"/api/v1/motionTransfer/start":{"post":{"summary":"Start motion transfer task","description":"Start a motion transfer task to transfer motion from video to image.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body. Required fields: `image_url`, `video_url`.\n- API-token callers may include `webhook_url` and `webhook_token` for best-effort terminal-state notifications; ordinary JWT/cookie calls ignore these fields.\n### Behavior\n- This is an asynchronous operation: a successful submission creates a task and returns before processing finishes.\n- Persist the returned task identifier and use the corresponding detail or list operation to observe progress.\n- Treat the detail endpoint as the source of truth even when webhook delivery is enabled.\n### Response\n- A `200` response confirms task acceptance; it does not by itself mean media generation has completed.\n- Retain the returned identifier and wait for a documented terminal status before using output URLs.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Bad Request - Invalid parameters.\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/motionTransfer/allRecords` — Get all motion transfer records.\n- `GET /api/v1/motionTransfer/{_id}` — Get motion transfer task detail.\n- `DELETE /api/v1/motionTransfer/{_id}` — Delete motion transfer task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Motion Transfer"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"type":"object","properties":{"name":{"type":"string","description":"Name of the motion transfer task","default":"","example":"Dance Motion Transfer"},"image_url":{"type":"string","format":"uri","pattern":"^https?://.*","description":"Reference image URL for motion transfer","example":"https://example.com/person.jpg"},"video_url":{"type":"string","format":"uri","pattern":"^https?://.*","description":"Control video URL for motion source","example":"https://example.com/dance.mp4"},"positive_prompt":{"type":"string","description":"Positive prompt for motion transfer","example":"high quality motion transfer, natural pose transition, smooth movement"},"negative_prompt":{"type":"string","description":"Negative prompt for motion transfer","example":"blurry, distorted limbs, unnatural poses, deformation"},"timeout":{"type":"number","default":300,"description":"Processing timeout in seconds","example":300}},"required":["image_url","video_url"]},{"$ref":"#/components/schemas/WebhookInput"}]},"example":{}}}},"responses":{"200":{"description":"Motion transfer task started successfully","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"400":{"description":"Bad Request - Invalid parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"postApiV1MotionTransferStart","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/motionTransfer/start\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/motionTransfer/allRecords":{"get":{"summary":"Get all motion transfer records","description":"Retrieve paginated list of motion transfer tasks for the current user.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supported query parameters: `pageNum`, `pageSize`. Omitted values use the defaults shown in the parameter schema.\n### Behavior\n- Returns the collection visible in the current request and authorization context.\n- Apply the documented pagination and filter parameters when present; use response metadata to continue paging.\n- Record fields and status values have the same meaning as in the corresponding detail operation.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Bad Request - Invalid parameters.\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/motionTransfer/{_id}` — Get motion transfer task detail.\n- `DELETE /api/v1/motionTransfer/{_id}` — Delete motion transfer task.\n- `POST /api/v1/motionTransfer/start` — Start motion transfer task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Motion Transfer"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Motion transfer records retrieved successfully","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"400":{"description":"Bad Request - Invalid parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"pageNum","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"example":1},"description":"Page number for pagination"},{"name":"pageSize","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":10,"example":10},"description":"Number of items per page"}],"operationId":"getApiV1MotionTransferAllRecords","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/motionTransfer/allRecords\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]}},"/api/v1/motionTransfer/batchDetail":{"post":{"summary":"Batch query task details","description":"Query details for multiple tasks at once by providing an array of task IDs.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body. Required fields: `ids`.\n### Behavior\n- Fetches several task records in one request, reducing the number of individual detail calls.\n- Results remain subject to the same authentication and ownership checks as single-record lookups.\n- Match returned records by their identifiers instead of relying on response ordering.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/motionTransfer/allRecords` — Get all motion transfer records.\n- `GET /api/v1/motionTransfer/{_id}` — Get motion transfer task detail.\n- `DELETE /api/v1/motionTransfer/{_id}` — Delete motion transfer task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Motion Transfer"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"ids":{"type":"array","items":{"type":"string","example":"example"},"description":"Array of task IDs to query","example":["example"]}},"required":["ids"],"example":{"ids":["example"]}},"example":{"ids":["example"]}}}},"responses":{"200":{"description":"Batch details retrieved successfully"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"postApiV1MotionTransferBatchDetail","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/motionTransfer/batchDetail\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{\n  \"ids\": [\n    \"example\"\n  ]\n}'"}]}},"/api/v1/motionTransfer/{_id}":{"get":{"summary":"Get motion transfer task detail","description":"Retrieve detailed information of a motion transfer task by its ID.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supply `_id` in the URL path.\n### Behavior\n- Retrieves the current server-side representation of the requested resource or task.\n- For asynchronous tasks, inspect the documented status and result fields before consuming generated media.\n- Repeat the request only as needed for polling and stop after the task reaches a terminal state.\n### Response\n- On `200`, consume the fields defined by that response schema below.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Bad Request - Invalid parameters.\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/motionTransfer/allRecords` — Get all motion transfer records.\n- `DELETE /api/v1/motionTransfer/{_id}` — Delete motion transfer task.\n- `POST /api/v1/motionTransfer/start` — Start motion transfer task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Motion Transfer"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Motion transfer task detail retrieved successfully","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"400":{"description":"Bad Request - Invalid parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"_id","in":"path","required":true,"schema":{"type":"string","example":"507f1f77bcf86cd799439011"},"description":"Motion transfer task ID"}],"operationId":"getApiV1MotionTransferId","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/motionTransfer/{_id}\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]},"delete":{"summary":"Delete motion transfer task","description":"Remove the authenticated user's motion-transfer task identified by `_id` from the task history without affecting other generated videos.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supply `_id` in the URL path.\n### Behavior\n- Deletes or marks the selected resource as deleted according to the endpoint's documented lifecycle rules.\n- Use the resource identifier from a list, creation, or detail response; deleting one resource does not affect unrelated records.\n- Do not assume an in-progress task can be cancelled unless the endpoint explicitly documents that behavior.\n### Response\n- A `200` response confirms that the deletion request was applied to the selected record.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Bad Request - Invalid parameters.\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/motionTransfer/allRecords` — Get all motion transfer records.\n- `GET /api/v1/motionTransfer/{_id}` — Get motion transfer task detail.\n- `POST /api/v1/motionTransfer/start` — Start motion transfer task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Motion Transfer"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Motion transfer task deleted successfully","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"400":{"description":"Bad Request - Invalid parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"_id","in":"path","required":true,"schema":{"type":"string","example":"507f1f77bcf86cd799439011"},"description":"Motion transfer task ID"}],"operationId":"deleteApiV1MotionTransferId","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X DELETE \"https://cheap.dev/api/v1/motionTransfer/{_id}\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/actorSwap/start":{"post":{"summary":"Start actor swap task","description":"Generate actor swap video by swapping actor from image to video.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body. Required fields: `image_url`, `video_url`.\n- API-token callers may include `webhook_url` and `webhook_token` for best-effort terminal-state notifications; ordinary JWT/cookie calls ignore these fields.\n### Behavior\n- This is an asynchronous operation: a successful submission creates a task and returns before processing finishes.\n- Persist the returned task identifier and use the corresponding detail or list operation to observe progress.\n- Treat the detail endpoint as the source of truth even when webhook delivery is enabled.\n### Response\n- A `200` response confirms task acceptance; it does not by itself mean media generation has completed.\n- Retain the returned identifier and wait for a documented terminal status before using output URLs.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/actorSwap/allRecords` — Get all task records.\n- `GET /api/v1/actorSwap/{_id}` — Get task details.\n- `DELETE /api/v1/actorSwap/{_id}` — Delete task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Actor Swap"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"type":"object","properties":{"name":{"type":"string","description":"Name of the actor swap task","example":"My Actor Swap"},"image_url":{"type":"string","description":"URL of the reference actor image","format":"uri","example":"https://example.com/actor.jpg"},"video_url":{"type":"string","description":"URL of the control video","format":"uri","example":"https://example.com/video.mp4"},"prompt":{"type":"string","description":"Positive prompt for generation","example":"high quality, realistic"},"negative_prompt":{"type":"string","description":"Negative prompt to avoid unwanted features","example":"blurry, distorted"},"timeout":{"type":"integer","description":"Timeout in seconds","default":300,"example":300}},"required":["image_url","video_url"]},{"$ref":"#/components/schemas/WebhookInput"}]},"example":{}}}},"responses":{"200":{"description":"Actor swap task started successfully","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"postApiV1ActorSwapStart","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/actorSwap/start\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/actorSwap/allRecords":{"get":{"summary":"Get all task records","description":"Return the authenticated user's actor-swap tasks, newest first, using the requested page number and page size.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supported query parameters: `pageNum`, `pageSize`. Omitted values use the defaults shown in the parameter schema.\n### Behavior\n- Returns the collection visible in the current request and authorization context.\n- Apply the documented pagination and filter parameters when present; use response metadata to continue paging.\n- Record fields and status values have the same meaning as in the corresponding detail operation.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/actorSwap/{_id}` — Get task details.\n- `DELETE /api/v1/actorSwap/{_id}` — Delete task.\n- `POST /api/v1/actorSwap/start` — Start actor swap task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Actor Swap"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Task list retrieved successfully"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"pageNum","in":"query","required":false,"schema":{"type":"integer","minimum":1,"example":1},"description":"Page number"},{"name":"pageSize","in":"query","required":false,"schema":{"type":"integer","example":10},"description":"Page size"}],"operationId":"getApiV1ActorSwapAllRecords","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/actorSwap/allRecords\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]}},"/api/v1/actorSwap/batchDetail":{"post":{"summary":"Batch query task details","description":"Query details for multiple tasks at once by providing an array of task IDs.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body. Required fields: `ids`.\n### Behavior\n- Fetches several task records in one request, reducing the number of individual detail calls.\n- Results remain subject to the same authentication and ownership checks as single-record lookups.\n- Match returned records by their identifiers instead of relying on response ordering.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/actorSwap/allRecords` — Get all task records.\n- `GET /api/v1/actorSwap/{_id}` — Get task details.\n- `DELETE /api/v1/actorSwap/{_id}` — Delete task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Actor Swap"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"ids":{"type":"array","items":{"type":"string","example":"example"},"description":"Array of task IDs to query","example":["example"]}},"required":["ids"],"example":{"ids":["example"]}},"example":{"ids":["example"]}}}},"responses":{"200":{"description":"Batch details retrieved successfully"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"postApiV1ActorSwapBatchDetail","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/actorSwap/batchDetail\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{\n  \"ids\": [\n    \"example\"\n  ]\n}'"}]}},"/api/v1/actorSwap/{_id}":{"get":{"summary":"Get task details","description":"Return the authenticated user's actor-swap task identified by `_id`, including its current processing status and available video output.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supply `_id` in the URL path.\n### Behavior\n- Retrieves the current server-side representation of the requested resource or task.\n- For asynchronous tasks, inspect the documented status and result fields before consuming generated media.\n- Repeat the request only as needed for polling and stop after the task reaches a terminal state.\n### Response\n- On `200`, consume the fields defined by that response schema below.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/actorSwap/allRecords` — Get all task records.\n- `DELETE /api/v1/actorSwap/{_id}` — Delete task.\n- `POST /api/v1/actorSwap/start` — Start actor swap task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Actor Swap"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Task details retrieved successfully"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"_id","in":"path","required":true,"schema":{"type":"string","example":"507f1f77bcf86cd799439011"},"description":"Task ID"}],"operationId":"getApiV1ActorSwapId","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/actorSwap/{_id}\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]},"delete":{"summary":"Delete task","description":"Remove the authenticated user's actor-swap task identified by `_id` from the task history without affecting other generated videos.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supply `_id` in the URL path.\n### Behavior\n- Deletes or marks the selected resource as deleted according to the endpoint's documented lifecycle rules.\n- Use the resource identifier from a list, creation, or detail response; deleting one resource does not affect unrelated records.\n- Do not assume an in-progress task can be cancelled unless the endpoint explicitly documents that behavior.\n### Response\n- A `200` response confirms that the deletion request was applied to the selected record.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/actorSwap/allRecords` — Get all task records.\n- `GET /api/v1/actorSwap/{_id}` — Get task details.\n- `POST /api/v1/actorSwap/start` — Start actor swap task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Actor Swap"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Task deleted successfully"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"_id","in":"path","required":true,"schema":{"type":"string","example":"507f1f77bcf86cd799439011"},"description":"Task ID to delete"}],"operationId":"deleteApiV1ActorSwapId","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X DELETE \"https://cheap.dev/api/v1/actorSwap/{_id}\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/productAvatar/start":{"post":{"summary":"Generate product avatar with AI (Async)","description":"Generate AI-powered product avatar by combining product and person images with customizable positioning and styling.\n**⚠️ IMPORTANT: This is an ASYNCHRONOUS operation**\n### Async Workflow\n1. **Submit Task** - Call this endpoint to create a new generation task\n   - Returns immediately with task `_id` and status `initialized`\n   - Task is queued for processing\n2. **Processing States** - The task goes through these states:\n   - `initialized` → Task created, waiting in queue\n   - `sent` → Task submitted to AI service\n   - `pending` → Task received by AI service\n   - `processing` → AI is generating the image\n   - `completed` → Generation finished successfully\n   - `failed` → Generation failed (check `failed_message`)\n3. **Get Results** - Poll for task status and results:\n   - Use `GET /api/v1/productAvatar/{_id}` to check status\n   - Use `GET /api/v1/productAvatar/allRecords` to list all tasks\n   - When `current_status` is `completed`, `result_image_url` contains the generated image\n4. **Timeout Handling**:\n   - Tasks timeout after 2 hours and automatically fail\n   - Credits are automatically refunded on timeout or failure\n### Best Practices\n- Poll every 3-5 seconds to check task status\n- Handle both `completed` and `failed` states\n- Store the returned `_id` to query results later.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body. Required fields: `image_urls`, `product_rect`.\n- API-token callers may include `webhook_url` and `webhook_token` for best-effort terminal-state notifications; ordinary JWT/cookie calls ignore these fields.\n### Behavior\n- This is an asynchronous operation: a successful submission creates a task and returns before processing finishes.\n- Persist the returned task identifier and use the corresponding detail or list operation to observe progress.\n- Treat the detail endpoint as the source of truth even when webhook delivery is enabled.\n### Response\n- A `200` response confirms task acceptance; it does not by itself mean media generation has completed.\n- Retain the returned identifier and wait for a documented terminal status before using output URLs.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Bad Request - Invalid parameters or missing required fields.\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/productAvatar/allRecords` — List all product avatar tasks.\n- `GET /api/v1/productAvatar/{_id}` — Query task status and get result.\n- `DELETE /api/v1/productAvatar/{_id}` — Delete a product avatar task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Product Avatar"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"type":"object","properties":{"name":{"type":"string","description":"Name for the product avatar generation task (optional)","example":"My Product Avatar"},"image_urls":{"type":"array","description":"Array of image URLs - [0] product image, [1] person image","minItems":2,"maxItems":2,"items":{"type":"string","format":"uri","pattern":"^https?://.+","description":"Image URL (must be HTTP/HTTPS)"},"example":["https://example.com/product.jpg","https://example.com/person.jpg"]},"product_rect":{"type":"object","description":"Product positioning and transformation parameters","required":["x","y","width","height","rotation","scale"],"properties":{"x":{"type":"number","description":"X coordinate position","example":100},"y":{"type":"number","description":"Y coordinate position","example":150},"width":{"type":"number","description":"Width of the product area","example":200},"height":{"type":"number","description":"Height of the product area","example":300},"rotation":{"type":"number","description":"Rotation angle in degrees","example":0},"scale":{"type":"number","description":"Scale factor for the product","example":1}}},"prompt":{"type":"string","description":"Additional prompt for AI generation (optional)","example":"Professional product showcase"},"timeout":{"type":"number","description":"Processing timeout in seconds","default":120,"example":120}},"required":["image_urls","product_rect"]},{"$ref":"#/components/schemas/WebhookInput"}]},"example":{}}}},"responses":{"200":{"description":"Product avatar generation started successfully","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"400":{"description":"Bad Request - Invalid parameters or missing required fields","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"postApiV1ProductAvatarStart","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/productAvatar/start\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/productAvatar/allRecords":{"get":{"summary":"List all product avatar tasks","description":"Retrieve a paginated list of all product avatar generation tasks for the authenticated user.\nUse this endpoint to monitor task progress and retrieve results.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supported query parameters: `pageNum`, `pageSize`. Omitted values use the defaults shown in the parameter schema.\n### Behavior\n- Returns the collection visible in the current request and authorization context.\n- Apply the documented pagination and filter parameters when present; use response metadata to continue paging.\n- Record fields and status values have the same meaning as in the corresponding detail operation.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/productAvatar/{_id}` — Query task status and get result.\n- `DELETE /api/v1/productAvatar/{_id}` — Delete a product avatar task.\n- `POST /api/v1/productAvatar/start` — Generate product avatar with AI (Async)\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Product Avatar"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successfully retrieved task list","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"pageNum","in":"query","required":false,"schema":{"type":"integer","default":1,"example":1},"description":"Page number (starting from 1)"},{"name":"pageSize","in":"query","required":false,"schema":{"type":"integer","default":10,"example":10},"description":"Number of items per page"}],"operationId":"getApiV1ProductAvatarAllRecords","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/productAvatar/allRecords\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]}},"/api/v1/productAvatar/batchDetail":{"post":{"summary":"Batch query task details","description":"Query details for multiple tasks at once by providing an array of task IDs.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body. Required fields: `ids`.\n### Behavior\n- Fetches several task records in one request, reducing the number of individual detail calls.\n- Results remain subject to the same authentication and ownership checks as single-record lookups.\n- Match returned records by their identifiers instead of relying on response ordering.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/productAvatar/allRecords` — List all product avatar tasks.\n- `GET /api/v1/productAvatar/{_id}` — Query task status and get result.\n- `DELETE /api/v1/productAvatar/{_id}` — Delete a product avatar task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Product Avatar"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"ids":{"type":"array","items":{"type":"string","example":"example"},"description":"Array of task IDs to query","example":["example"]}},"required":["ids"],"example":{"ids":["example"]}},"example":{"ids":["example"]}}}},"responses":{"200":{"description":"Batch details retrieved successfully"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"postApiV1ProductAvatarBatchDetail","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/productAvatar/batchDetail\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{\n  \"ids\": [\n    \"example\"\n  ]\n}'"}]}},"/api/v1/productAvatar/{_id}":{"get":{"summary":"Query task status and get result","description":"Retrieve detailed information about a specific product avatar generation task.\nUse this endpoint to poll for task status and get the result when completed.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supply `_id` in the URL path.\n### Behavior\n- Retrieves the current server-side representation of the requested resource or task.\n- For asynchronous tasks, inspect the documented status and result fields before consuming generated media.\n- Repeat the request only as needed for polling and stop after the task reaches a terminal state.\n### Response\n- On `200`, consume the fields defined by that response schema below.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Bad Request - Invalid task ID.\n- `401` — Unauthorized - Invalid or missing JWT token.\n- `404` — Task not found.\n### Related Operations\n- `GET /api/v1/productAvatar/allRecords` — List all product avatar tasks.\n- `DELETE /api/v1/productAvatar/{_id}` — Delete a product avatar task.\n- `POST /api/v1/productAvatar/start` — Generate product avatar with AI (Async)\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Product Avatar"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successfully retrieved task details","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"400":{"description":"Bad Request - Invalid task ID","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Task not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"_id","in":"path","required":true,"schema":{"type":"string","example":"507f1f77bcf86cd799439011"},"description":"Task ID returned from the start endpoint"}],"operationId":"getApiV1ProductAvatarId","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/productAvatar/{_id}\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]},"delete":{"summary":"Delete a product avatar task","description":"Soft delete a product avatar task. The task data will be marked as deleted but not removed from the database.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supply `_id` in the URL path.\n### Behavior\n- Deletes or marks the selected resource as deleted according to the endpoint's documented lifecycle rules.\n- Use the resource identifier from a list, creation, or detail response; deleting one resource does not affect unrelated records.\n- Do not assume an in-progress task can be cancelled unless the endpoint explicitly documents that behavior.\n### Response\n- A `200` response confirms that the deletion request was applied to the selected record.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Bad Request - Invalid task ID.\n- `401` — Unauthorized - Invalid or missing JWT token.\n- `404` — Task not found.\n### Related Operations\n- `GET /api/v1/productAvatar/allRecords` — List all product avatar tasks.\n- `GET /api/v1/productAvatar/{_id}` — Query task status and get result.\n- `POST /api/v1/productAvatar/start` — Generate product avatar with AI (Async)\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Product Avatar"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Task deleted successfully","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"400":{"description":"Bad Request - Invalid task ID","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Task not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"_id","in":"path","required":true,"schema":{"type":"string","example":"507f1f77bcf86cd799439011"},"description":"Task ID to delete"}],"operationId":"deleteApiV1ProductAvatarId","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X DELETE \"https://cheap.dev/api/v1/productAvatar/{_id}\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/headSwap/start":{"post":{"summary":"Start head swap generation","description":"Generate a head swap result by replacing the head in a target image/video with a source head.\n**Supported modes:**\n- **Image to Image**: Provide an image as `target_image_url` to get a head-swapped image\n- **Image to Video**: Provide a video as `target_image_url` to get a head-swapped video (max 15 seconds)\n**Content moderation:**\n- Minor detection is performed on input images\n- If a minor is detected (age < 10), the request will be rejected with code 1003\n- If a suspected minor is detected (10 <= age < 15), set `minor_suspected_skip: true` to proceed\n**Async workflow:**\n1. Task is created with status `initialized`\n2. Task is queued and sent to algorithm service (status: `sent`)\n3. Algorithm processes the task (status: `processing`)\n4. Result is ready (status: `completed`) or failed (status: `failed`)\n5. Use `/api/v1/headSwap/{_id}` to poll for status updates.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body. Required fields: `image_url`, `target_image_url`.\n- API-token callers may include `webhook_url` and `webhook_token` for best-effort terminal-state notifications; ordinary JWT/cookie calls ignore these fields.\n### Behavior\n- This is an asynchronous operation: a successful submission creates a task and returns before processing finishes.\n- Persist the returned task identifier and use the corresponding detail or list operation to observe progress.\n- Treat the detail endpoint as the source of truth even when webhook delivery is enabled.\n### Response\n- A `200` response confirms task acceptance; it does not by itself mean media generation has completed.\n- Retain the returned identifier and wait for a documented terminal status before using output URLs.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Invalid request parameters or insufficient coins.\n- `401` — Unauthorized - Invalid or missing JWT token.\n- `403` — Content moderation failed (code 1003 = minor detected, code 1004 = suspected minor)\n### Related Operations\n- `GET /api/v1/headSwap/allRecords` — Get all head swap records.\n- `GET /api/v1/headSwap/{_id}` — Get head swap task detail.\n- `DELETE /api/v1/headSwap/{_id}` — Delete head swap task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Head Swap"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"type":"object","properties":{"image_url":{"type":"string","description":"URL of the source head image (the head to be transplanted)","format":"uri","example":"https://example.com/head.jpg"},"target_image_url":{"type":"string","description":"URL of the target body image or video (where the head will be placed)","format":"uri","example":"https://example.com/body.jpg"},"minor_suspected_skip":{"type":"boolean","description":"Skip suspected minor warning (for ages 10-14). Use with caution.","default":false,"example":false}},"required":["image_url","target_image_url"]},{"$ref":"#/components/schemas/WebhookInput"}]},"example":{}}}},"responses":{"200":{"description":"Head swap task started successfully","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"400":{"description":"Invalid request parameters or insufficient coins"},"401":{"description":"Unauthorized - Invalid or missing bearer token"},"403":{"description":"Content moderation failed (code 1003 = minor detected, code 1004 = suspected minor)"}},"operationId":"postApiV1HeadSwapStart","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/headSwap/start\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/headSwap/allRecords":{"get":{"summary":"Get all head swap records","description":"Get a paginated list of the current user's head swap tasks.\nResults are sorted by creation time (newest first) and filtered by expiration.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supported query parameters: `pageNum`, `pageSize`. Omitted values use the defaults shown in the parameter schema.\n### Behavior\n- Returns the collection visible in the current request and authorization context.\n- Apply the documented pagination and filter parameters when present; use response metadata to continue paging.\n- Record fields and status values have the same meaning as in the corresponding detail operation.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/headSwap/{_id}` — Get head swap task detail.\n- `DELETE /api/v1/headSwap/{_id}` — Delete head swap task.\n- `POST /api/v1/headSwap/start` — Start head swap generation.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Head Swap"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Head swap records retrieved successfully","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token"}},"parameters":[{"name":"pageNum","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"example":1},"description":"Page number (starts from 1)"},{"name":"pageSize","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":10,"example":10},"description":"Number of items per page"}],"operationId":"getApiV1HeadSwapAllRecords","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/headSwap/allRecords\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]}},"/api/v1/headSwap/batchDetail":{"post":{"summary":"Batch query task details","description":"Query details for multiple tasks at once by providing an array of task IDs.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body. Required fields: `ids`.\n### Behavior\n- Fetches several task records in one request, reducing the number of individual detail calls.\n- Results remain subject to the same authentication and ownership checks as single-record lookups.\n- Match returned records by their identifiers instead of relying on response ordering.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/headSwap/allRecords` — Get all head swap records.\n- `GET /api/v1/headSwap/{_id}` — Get head swap task detail.\n- `DELETE /api/v1/headSwap/{_id}` — Delete head swap task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Head Swap"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"ids":{"type":"array","items":{"type":"string","example":"example"},"description":"Array of task IDs to query","example":["example"]}},"required":["ids"],"example":{"ids":["example"]}},"example":{"ids":["example"]}}}},"responses":{"200":{"description":"Batch details retrieved successfully"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"postApiV1HeadSwapBatchDetail","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/headSwap/batchDetail\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{\n  \"ids\": [\n    \"example\"\n  ]\n}'"}]}},"/api/v1/headSwap/{_id}":{"get":{"summary":"Get head swap task detail","description":"Get detailed information of a specific head swap task by ID.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supply `_id` in the URL path.\n### Behavior\n- Retrieves the current server-side representation of the requested resource or task.\n- For asynchronous tasks, inspect the documented status and result fields before consuming generated media.\n- Repeat the request only as needed for polling and stop after the task reaches a terminal state.\n### Response\n- On `200`, consume the fields defined by that response schema below.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Invalid task ID format.\n- `401` — Unauthorized - Invalid or missing JWT token.\n- `404` — Task not found.\n### Related Operations\n- `GET /api/v1/headSwap/allRecords` — Get all head swap records.\n- `DELETE /api/v1/headSwap/{_id}` — Delete head swap task.\n- `POST /api/v1/headSwap/start` — Start head swap generation.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Head Swap"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Task detail retrieved successfully","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"400":{"description":"Invalid task ID format"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Task not found"}},"parameters":[{"name":"_id","in":"path","required":true,"schema":{"type":"string","example":"507f1f77bcf86cd799439011"},"description":"Head swap task ID (MongoDB ObjectId)"}],"operationId":"getApiV1HeadSwapId","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/headSwap/{_id}\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]},"delete":{"summary":"Delete head swap task","description":"Delete a head swap task by ID.\n**Status behavior:**\n- `initialized`: Can be deleted with coin refund (task not yet sent to algorithm service)\n- `sent/pending/processing`: Cannot be deleted, returns 400 error (task is processing)\n- `completed/failed`: Can be deleted without refund (task already completed or failed)\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supply `_id` in the URL path.\n### Behavior\n- Deletes or marks the selected resource as deleted according to the endpoint's documented lifecycle rules.\n- Use the resource identifier from a list, creation, or detail response; deleting one resource does not affect unrelated records.\n- Do not assume an in-progress task can be cancelled unless the endpoint explicitly documents that behavior.\n### Response\n- A `200` response confirms that the deletion request was applied to the selected record.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Cannot delete task in processing state.\n- `401` — Unauthorized - Invalid or missing JWT token.\n- `404` — Task not found.\n### Related Operations\n- `GET /api/v1/headSwap/allRecords` — Get all head swap records.\n- `GET /api/v1/headSwap/{_id}` — Get head swap task detail.\n- `POST /api/v1/headSwap/start` — Start head swap generation.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Head Swap"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Task deleted successfully","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"400":{"description":"Cannot delete task in processing state"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Task not found"}},"parameters":[{"name":"_id","in":"path","required":true,"schema":{"type":"string","example":"507f1f77bcf86cd799439011"},"description":"Head swap task ID (MongoDB ObjectId)"}],"operationId":"deleteApiV1HeadSwapId","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X DELETE \"https://cheap.dev/api/v1/headSwap/{_id}\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/veoVideo/start":{"post":{"summary":"Start Veo 3.1 video generation","description":"Generate videos using Google DeepMind's Veo 3.1 AI model. Supports text-to-video, image-to-video, and reference-based generation.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body. Required fields: `prompt`.\n- API-token callers may include `webhook_url` and `webhook_token` for best-effort terminal-state notifications; ordinary JWT/cookie calls ignore these fields.\n### Behavior\n- This is an asynchronous operation: a successful submission creates a task and returns before processing finishes.\n- Persist the returned task identifier and use the corresponding detail or list operation to observe progress.\n- Treat the detail endpoint as the source of truth even when webhook delivery is enabled.\n### Response\n- A `200` response confirms task acceptance; it does not by itself mean media generation has completed.\n- Retain the returned identifier and wait for a documented terminal status before using output URLs.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Bad Request - Invalid parameters.\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `POST /api/v1/veoVideo/batchDetail` — Batch query task details.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Veo Video"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"type":"object","properties":{"name":{"type":"string","description":"Name of the video generation task (optional, auto-generated if not provided)","example":"My Veo Video"},"prompt":{"type":"string","description":"Text prompt describing the video content. Can be empty to use default placeholder text.","example":"Two person street interview in New York City. Sample Dialogue: Host: \"Did you hear the news?\" Person: \"Yes! Veo 3.1 is now available on A2E. If you want to see it, go check their website.\""},"generationType":{"type":"string","enum":["TEXT_2_VIDEO","FIRST_AND_LAST_FRAMES_2_VIDEO","REFERENCE_2_VIDEO"],"description":"Type of generation (TEXT_2_VIDEO for text-only, FIRST_AND_LAST_FRAMES_2_VIDEO for image frames, REFERENCE_2_VIDEO for reference images)","default":"TEXT_2_VIDEO","example":"TEXT_2_VIDEO"},"imageUrls":{"type":"array","items":{"type":"string"},"description":"Image URLs for image-to-video generation. For FIRST_AND_LAST_FRAMES_2_VIDEO mode, 1-2 images (start/end frames). For REFERENCE_2_VIDEO mode, 1-3 reference images.","example":["https://example.com/start_frame.jpg","https://example.com/end_frame.jpg"]},"model":{"type":"string","enum":["veo3","veo3_fast"],"description":"Generation model (veo3 for quality, veo3_fast for speed)","default":"veo3_fast","example":"veo3_fast"},"aspectRatio":{"type":"string","enum":["16:9","9:16","Auto"],"description":"Video aspect ratio (Auto will determine automatically)","default":"Auto","example":"16:9"},"watermark":{"type":"string","description":"Custom watermark text (optional)","example":"MyBrand"},"seeds":{"type":"number","description":"Random seed for reproducible generation (10000-99999, optional)","example":12345}},"required":["prompt"]},{"$ref":"#/components/schemas/WebhookInput"}]},"example":{}}}},"responses":{"200":{"description":"Video generation task started successfully","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"400":{"description":"Bad Request - Invalid parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"postApiV1VeoVideoStart","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/veoVideo/start\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/veoVideo/allRecords":{"get":{"summary":"Get all Veo video records","description":"Retrieve paginated list of user's Veo video generation records.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supported query parameters: `pageNum`, `pageSize`. Omitted values use the defaults shown in the parameter schema.\n### Behavior\n- Returns the collection visible in the current request and authorization context.\n- Apply the documented pagination and filter parameters when present; use response metadata to continue paging.\n- Record fields and status values have the same meaning as in the corresponding detail operation.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/veoVideo/{_id}` — Get Veo video detail.\n- `DELETE /api/v1/veoVideo/{_id}` — Delete Veo video record.\n- `GET /api/v1/veoVideo/{_id}/1080p` — Get 1080P HD video.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Veo Video"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Records retrieved successfully"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"pageNum","in":"query","required":false,"schema":{"type":"integer","default":1,"example":1},"description":"Page number"},{"name":"pageSize","in":"query","required":false,"schema":{"type":"integer","default":10,"example":10},"description":"Number of records per page"}],"operationId":"getApiV1VeoVideoAllRecords","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/veoVideo/allRecords\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]}},"/api/v1/veoVideo/batchDetail":{"post":{"summary":"Batch query task details","description":"Query details for multiple tasks at once by providing an array of task IDs.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body. Required fields: `ids`.\n### Behavior\n- Fetches several task records in one request, reducing the number of individual detail calls.\n- Results remain subject to the same authentication and ownership checks as single-record lookups.\n- Match returned records by their identifiers instead of relying on response ordering.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `POST /api/v1/veoVideo/start` — Start Veo 3.1 video generation.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Veo Video"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"ids":{"type":"array","items":{"type":"string","example":"example"},"description":"Array of task IDs to query","example":["example"]}},"required":["ids"],"example":{"ids":["example"]}},"example":{"ids":["example"]}}}},"responses":{"200":{"description":"Batch details retrieved successfully"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"postApiV1VeoVideoBatchDetail","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/veoVideo/batchDetail\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{\n  \"ids\": [\n    \"example\"\n  ]\n}'"}]}},"/api/v1/veoVideo/{_id}":{"get":{"summary":"Get Veo video detail","description":"Retrieve detailed information of a specific Veo video generation record.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supply `_id` in the URL path.\n### Behavior\n- Retrieves the current server-side representation of the requested resource or task.\n- For asynchronous tasks, inspect the documented status and result fields before consuming generated media.\n- Repeat the request only as needed for polling and stop after the task reaches a terminal state.\n### Response\n- On `200`, consume the fields defined by that response schema below.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/veoVideo/allRecords` — Get all Veo video records.\n- `DELETE /api/v1/veoVideo/{_id}` — Delete Veo video record.\n- `GET /api/v1/veoVideo/{_id}/1080p` — Get 1080P HD video.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Veo Video"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Video detail retrieved successfully"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"_id","in":"path","required":true,"schema":{"type":"string","example":"507f1f77bcf86cd799439011"},"description":"Video record ID"}],"operationId":"getApiV1VeoVideoId","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/veoVideo/{_id}\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]},"delete":{"summary":"Delete Veo video record","description":"Soft-delete the authenticated user's Veo video task identified by `_id`, preserving the stored record while excluding it from normal task lists.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supply `_id` in the URL path.\n### Behavior\n- Deletes or marks the selected resource as deleted according to the endpoint's documented lifecycle rules.\n- Use the resource identifier from a list, creation, or detail response; deleting one resource does not affect unrelated records.\n- Do not assume an in-progress task can be cancelled unless the endpoint explicitly documents that behavior.\n### Response\n- A `200` response confirms that the deletion request was applied to the selected record.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/veoVideo/allRecords` — Get all Veo video records.\n- `GET /api/v1/veoVideo/{_id}` — Get Veo video detail.\n- `GET /api/v1/veoVideo/{_id}/1080p` — Get 1080P HD video.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Veo Video"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Video record deleted successfully"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"_id","in":"path","required":true,"schema":{"type":"string","example":"507f1f77bcf86cd799439011"},"description":"Video record ID"}],"operationId":"deleteApiV1VeoVideoId","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X DELETE \"https://cheap.dev/api/v1/veoVideo/{_id}\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/veoVideo/{_id}/1080p":{"get":{"summary":"Get 1080P HD video","description":"Retrieve 1080P high-definition version of the video (only available for 16:9 aspect ratio)\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supply `_id` in the URL path.\n### Behavior\n- Reads the requested information without creating a generation task.\n- Use the returned fields as documented; availability may depend on the caller and current resource state.\n### Response\n- On `200`, consume the fields defined by that response schema below.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Invalid aspect ratio or missing task ID.\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/veoVideo/allRecords` — Get all Veo video records.\n- `GET /api/v1/veoVideo/{_id}` — Get Veo video detail.\n- `DELETE /api/v1/veoVideo/{_id}` — Delete Veo video record.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Veo Video"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"1080P video retrieved successfully"},"202":{"description":"1080P video is being processed, please try again later"},"400":{"description":"Invalid aspect ratio or missing task ID"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"_id","in":"path","required":true,"schema":{"type":"string","example":"507f1f77bcf86cd799439011"},"description":"Video record ID"}],"operationId":"getApiV1VeoVideoId1080p","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/veoVideo/{_id}/1080p\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]}},"/api/v1/klingVideo/start":{"post":{"summary":"Start Kling video generation","description":"Generate videos using Kling Official API.\n**Modes:**\n- `text-to-video` – generate video from text prompt\n- `image-to-video` – generate video from an image (+ optional end frame in PRO)\n- `motion-control` – transfer motion from a video onto an image\n**Versions:** `2.6` (5s/10s) and `3.0` (standard/fast: 3s–15s)\n**Quality:** `std` (Standard), `pro` (Professional), or `4k` (Kling 3.0 Native 4K for text/image video).\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body. Required fields: `mode`, `prompt`.\n- API-token callers may include `webhook_url` and `webhook_token` for best-effort terminal-state notifications; ordinary JWT/cookie calls ignore these fields.\n### Behavior\n- This is an asynchronous operation: a successful submission creates a task and returns before processing finishes.\n- Persist the returned task identifier and use the corresponding detail or list operation to observe progress.\n- Treat the detail endpoint as the source of truth even when webhook delivery is enabled.\n### Response\n- A `200` response confirms task acceptance; it does not by itself mean media generation has completed.\n- Retain the returned identifier and wait for a documented terminal status before using output URLs.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Bad Request - Invalid parameters.\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/klingVideo/allRecords` — Get all Kling video records.\n- `GET /api/v1/klingVideo/{_id}` — Get Kling video detail.\n- `PUT /api/v1/klingVideo/{_id}` — Update Kling video name.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Kling Video"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"type":"object","properties":{"name":{"type":"string","description":"Name of the video generation task","example":"My Kling Video"},"mode":{"type":"string","enum":["text-to-video","image-to-video","motion-control"],"description":"Generation mode: text-to-video, image-to-video, or motion-control","example":"image-to-video"},"prompt":{"type":"string","description":"Text prompt describing the desired video","example":"A beautiful sunset over the ocean"},"version":{"type":"string","enum":["2.6","3.0"],"description":"Kling model version. 2.6 supports 5s/10s, 3.0 supports 5s/10s/15s","default":"2.6","example":"3.0"},"model_version":{"type":"string","enum":["standard","fast"],"description":"Kling 3.0 model variant. fast requires version=3.0, supports text-to-video/image-to-video, supports 3–15s, and uses resolution instead of quality_mode=4k.","default":"standard","example":"fast"},"resolution":{"type":"string","enum":["720p","1080p"],"description":"Output resolution for model_version=fast","default":"720p","example":"720p"},"quality_mode":{"type":"string","enum":["std","pro","4k"],"description":"Quality mode. 4K is only available for Kling 3.0 text-to-video and image-to-video","default":"std","example":"std"},"duration":{"type":"string","enum":["3","4","5","6","7","8","9","10","11","12","13","14","15"],"description":"Video duration in seconds. Kling 2.6 supports 5s/10s; Kling 3.0 supports 3–15s.","default":"5","example":"5"},"image_url":{"type":"string","description":"Input image URL (required for image-to-video and motion-control modes)","example":"https://example.com/input.jpg"},"video_url":{"type":"string","description":"Input video URL (required for motion-control mode)","example":"https://example.com/input.mp4"},"aspect_ratio":{"type":"string","enum":["16:9","9:16","1:1"],"description":"Video aspect ratio (text-to-video mode only)","default":"16:9","example":"16:9"},"sound":{"type":"boolean","description":"Enable audio generation. For v2.6 only available in PRO mode (STD does not support sound). v3.0 supports sound in STD/PRO. 4K is billed as a separate quality tier.","default":false,"example":false},"end_image_url":{"type":"string","description":"End frame image URL (image-to-video + PRO mode only). Cannot be used with sound in v2.6","example":"https://example.com/end_frame.jpg"},"character_orientation":{"type":"string","enum":["video","image"],"description":"Character orientation for motion-control mode. 'image' limits duration to 3-10s, 'video' allows 3-30s","default":"video","example":"video"},"negative_prompt":{"type":"string","description":"Negative prompt to avoid certain elements","example":"blurry, low quality"},"seed":{"type":"number","description":"Random seed for reproducibility","example":12345}},"required":["mode","prompt"]},{"$ref":"#/components/schemas/WebhookInput"}]},"example":{}}}},"responses":{"200":{"description":"Video generation task started successfully","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"400":{"description":"Bad Request - Invalid parameters"},"401":{"description":"Unauthorized - Invalid or missing bearer token"}},"operationId":"postApiV1KlingVideoStart","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/klingVideo/start\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/klingVideo/allRecords":{"get":{"summary":"Get all Kling video records","description":"Retrieve all Kling video generation records for the authenticated user.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supported query parameters: `pageNum`, `pageSize`. Omitted values use the defaults shown in the parameter schema.\n### Behavior\n- Returns the collection visible in the current request and authorization context.\n- Apply the documented pagination and filter parameters when present; use response metadata to continue paging.\n- Record fields and status values have the same meaning as in the corresponding detail operation.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/klingVideo/{_id}` — Get Kling video detail.\n- `PUT /api/v1/klingVideo/{_id}` — Update Kling video name.\n- `DELETE /api/v1/klingVideo/{_id}` — Delete Kling video.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Kling Video"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successfully retrieved records","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"pageNum","in":"query","required":false,"schema":{"type":"integer","default":1,"example":1},"description":"Page number"},{"name":"pageSize","in":"query","required":false,"schema":{"type":"integer","default":20,"example":20},"description":"Items per page"}],"operationId":"getApiV1KlingVideoAllRecords","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/klingVideo/allRecords\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]}},"/api/v1/klingVideo/batchDetail":{"post":{"summary":"Batch query task details","description":"Query details for multiple tasks at once by providing an array of task IDs.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body. Required fields: `ids`.\n### Behavior\n- Fetches several task records in one request, reducing the number of individual detail calls.\n- Results remain subject to the same authentication and ownership checks as single-record lookups.\n- Match returned records by their identifiers instead of relying on response ordering.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/klingVideo/allRecords` — Get all Kling video records.\n- `GET /api/v1/klingVideo/{_id}` — Get Kling video detail.\n- `PUT /api/v1/klingVideo/{_id}` — Update Kling video name.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Kling Video"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"ids":{"type":"array","items":{"type":"string","example":"example"},"description":"Array of task IDs to query","example":["example"]}},"required":["ids"],"example":{"ids":["example"]}},"example":{"ids":["example"]}}}},"responses":{"200":{"description":"Batch details retrieved successfully"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"postApiV1KlingVideoBatchDetail","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/klingVideo/batchDetail\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{\n  \"ids\": [\n    \"example\"\n  ]\n}'"}]}},"/api/v1/klingVideo/{_id}":{"get":{"summary":"Get Kling video detail","description":"Get detailed information about a specific Kling video generation task.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supply `_id` in the URL path.\n### Behavior\n- Retrieves the current server-side representation of the requested resource or task.\n- For asynchronous tasks, inspect the documented status and result fields before consuming generated media.\n- Repeat the request only as needed for polling and stop after the task reaches a terminal state.\n### Response\n- On `200`, consume the fields defined by that response schema below.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n- `404` — Task not found.\n### Related Operations\n- `GET /api/v1/klingVideo/allRecords` — Get all Kling video records.\n- `PUT /api/v1/klingVideo/{_id}` — Update Kling video name.\n- `DELETE /api/v1/klingVideo/{_id}` — Delete Kling video.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Kling Video"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successfully retrieved task details"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Task not found"}},"parameters":[{"name":"_id","in":"path","required":true,"schema":{"type":"string","example":"507f1f77bcf86cd799439011"},"description":"Task ID"}],"operationId":"getApiV1KlingVideoId","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/klingVideo/{_id}\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]},"put":{"summary":"Update Kling video name","description":"Rename the authenticated user's Kling video task identified by `_id`; generation settings, processing status, and output media are unchanged.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supply `_id` in the URL path.\n- Send an `application/json` body. Required fields: `name`.\n### Behavior\n- Updates the identified resource using the fields accepted by the request schema and the operation's access controls.\n- Fields omitted from the request retain their existing values unless the schema states otherwise.\n- Read the returned record or call the detail operation to confirm the persisted state.\n### Response\n- On `200`, consume the fields defined by that response schema below.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n- `404` — Task not found.\n### Related Operations\n- `GET /api/v1/klingVideo/allRecords` — Get all Kling video records.\n- `GET /api/v1/klingVideo/{_id}` — Get Kling video detail.\n- `DELETE /api/v1/klingVideo/{_id}` — Delete Kling video.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Kling Video"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"New name for the task","example":"My Task"}},"required":["name"],"example":{"name":"My Task"}},"example":{"name":"My Task"}}}},"responses":{"200":{"description":"Name updated successfully"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Task not found"}},"parameters":[{"name":"_id","in":"path","required":true,"schema":{"type":"string","example":"507f1f77bcf86cd799439011"},"description":"Task ID"}],"operationId":"putApiV1KlingVideoId","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X PUT \"https://cheap.dev/api/v1/klingVideo/{_id}\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{\n  \"name\": \"My Task\"\n}'"}]},"delete":{"summary":"Delete Kling video","description":"Remove the authenticated user's Kling video task identified by `_id` from normal task history without affecting unrelated tasks.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supply `_id` in the URL path.\n### Behavior\n- Deletes or marks the selected resource as deleted according to the endpoint's documented lifecycle rules.\n- Use the resource identifier from a list, creation, or detail response; deleting one resource does not affect unrelated records.\n- Do not assume an in-progress task can be cancelled unless the endpoint explicitly documents that behavior.\n### Response\n- A `200` response confirms that the deletion request was applied to the selected record.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n- `404` — Task not found.\n### Related Operations\n- `GET /api/v1/klingVideo/allRecords` — Get all Kling video records.\n- `GET /api/v1/klingVideo/{_id}` — Get Kling video detail.\n- `PUT /api/v1/klingVideo/{_id}` — Update Kling video name.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Kling Video"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Task deleted successfully"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Task not found"}},"parameters":[{"name":"_id","in":"path","required":true,"schema":{"type":"string","example":"507f1f77bcf86cd799439011"},"description":"Task ID"}],"operationId":"deleteApiV1KlingVideoId","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X DELETE \"https://cheap.dev/api/v1/klingVideo/{_id}\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/klingOmni/start":{"post":{"summary":"Start Kling Omni video generation","description":"Generate videos using Kling Omni API (model: kling-v3-omni).\nThis is a simplified wrapper around the official Kling API.\n**Key Features:**\n- Multi-reference images: up to 7 images, use `<<<image_N>>>` tags in prompt\n- Multi-shot editing: AI Director (intelligence) or manual (customize) storyboard\n- Native sound generation via `sound` parameter\n- Flexible duration: 3–15 seconds\n**Simplified vs Official API:**\n- `image_list`: accepts `string[]` (image URLs); official uses `[{image_url, type?}]`, auto-converted on server\n- `sound`: accepts `boolean`; official uses `\"on\"/\"off\"`, auto-converted on server\n- `multi_prompt`: items need `prompt` + `duration`; server auto-adds `index` field for official API\n- `prompt` is required when `multi_shot=false` or `shot_type=intelligence`\n- `multi_prompt` total duration must equal `duration` when `shot_type=customize`.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body when using the optional controls documented in the request schema.\n- API-token callers may include `webhook_url` and `webhook_token` for best-effort terminal-state notifications; ordinary JWT/cookie calls ignore these fields.\n### Behavior\n- This is an asynchronous operation: a successful submission creates a task and returns before processing finishes.\n- Persist the returned task identifier and use the corresponding detail or list operation to observe progress.\n- Treat the detail endpoint as the source of truth even when webhook delivery is enabled.\n### Response\n- A `200` response confirms task acceptance; it does not by itself mean media generation has completed.\n- Retain the returned identifier and wait for a documented terminal status before using output URLs.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Bad Request - Invalid parameters.\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/klingOmni/allRecords` — Get all Kling Omni video records.\n- `GET /api/v1/klingOmni/{_id}` — Get Kling Omni video detail.\n- `PUT /api/v1/klingOmni/{_id}` — Update Kling Omni video name.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Kling Omni"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"type":"object","properties":{"name":{"type":"string","description":"Task name (internal use)","example":"My Kling Omni Video"},"prompt":{"type":"string","description":"Text prompt. Use <<<image_N>>> to reference images. Required when multi_shot=false or shot_type=intelligence.","example":"<<<image_1>>> walks towards <<<image_2>>> in a sunny park"},"image_list":{"type":"array","items":{"type":"string"},"description":"Reference image URLs (up to 7, jpg/jpeg/png, max 10MB). Simplified: pass URLs directly; server converts to official [{image_url}] format.","example":["https://example.com/ref1.jpg"]},"mode":{"type":"string","enum":["std","pro"],"description":"Video generation mode. std=standard (720p), pro=professional (1080p)","default":"std"},"duration":{"type":"string","description":"Video duration in seconds (3–15)","default":"5"},"aspect_ratio":{"type":"string","enum":["16:9","9:16","1:1"],"default":"16:9"},"sound":{"type":"boolean","description":"Enable native sound generation. Simplified: pass boolean; server converts to official 'on'/'off'.","default":false},"multi_shot":{"type":"boolean","description":"Enable multi-shot mode","default":false},"shot_type":{"type":"string","enum":["intelligence","customize"],"description":"Shot type. Required when multi_shot=true."},"multi_prompt":{"type":"array","description":"Manual storyboard (required when shot_type=customize, 1–6 items, total duration must equal duration). Server auto-adds index field for official API.","items":{"type":"object","required":["prompt","duration"],"properties":{"prompt":{"type":"string","description":"Prompt for this shot (max 512 chars)","example":"<<<image_1>>> stands up and waves"},"duration":{"type":"string","description":"Duration in seconds","example":"3"}}}}},"required":[]},{"$ref":"#/components/schemas/WebhookInput"}]},"example":{}}}},"responses":{"200":{"description":"Video generation task started successfully","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"400":{"description":"Bad Request - Invalid parameters"},"401":{"description":"Unauthorized - Invalid or missing bearer token"}},"operationId":"postApiV1KlingOmniStart","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/klingOmni/start\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/klingOmni/allRecords":{"get":{"summary":"Get all Kling Omni video records","description":"Retrieve paginated list of Kling Omni video generation tasks for the authenticated user.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supported query parameters: `pageNum`, `pageSize`. Omitted values use the defaults shown in the parameter schema.\n### Behavior\n- Returns the collection visible in the current request and authorization context.\n- Apply the documented pagination and filter parameters when present; use response metadata to continue paging.\n- Record fields and status values have the same meaning as in the corresponding detail operation.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized.\n### Related Operations\n- `GET /api/v1/klingOmni/{_id}` — Get Kling Omni video detail.\n- `PUT /api/v1/klingOmni/{_id}` — Update Kling Omni video name.\n- `DELETE /api/v1/klingOmni/{_id}` — Delete Kling Omni video.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Kling Omni"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Records retrieved successfully","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"401":{"description":"Unauthorized"}},"parameters":[{"name":"pageNum","in":"query","required":false,"schema":{"type":"integer","default":1,"example":1},"description":"Page number"},{"name":"pageSize","in":"query","required":false,"schema":{"type":"integer","default":20,"example":20},"description":"Number of records per page"}],"operationId":"getApiV1KlingOmniAllRecords","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/klingOmni/allRecords\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]}},"/api/v1/klingOmni/batchDetail":{"post":{"summary":"Batch get Kling Omni video details","description":"Get details of multiple Kling Omni tasks by their IDs (max 200).\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body. Required fields: `ids`.\n### Behavior\n- Fetches several task records in one request, reducing the number of individual detail calls.\n- Results remain subject to the same authentication and ownership checks as single-record lookups.\n- Match returned records by their identifiers instead of relying on response ordering.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized.\n### Related Operations\n- `GET /api/v1/klingOmni/allRecords` — Get all Kling Omni video records.\n- `GET /api/v1/klingOmni/{_id}` — Get Kling Omni video detail.\n- `PUT /api/v1/klingOmni/{_id}` — Update Kling Omni video name.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Kling Omni"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"ids":{"type":"array","items":{"type":"string","example":"example"},"description":"Array of task IDs","example":["example"]}},"required":["ids"],"example":{"ids":["example"]}},"example":{"ids":["example"]}}}},"responses":{"200":{"description":"Batch details retrieved successfully","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"401":{"description":"Unauthorized"}},"operationId":"postApiV1KlingOmniBatchDetail","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/klingOmni/batchDetail\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{\n  \"ids\": [\n    \"example\"\n  ]\n}'"}]}},"/api/v1/klingOmni/{_id}":{"get":{"summary":"Get Kling Omni video detail","description":"Get detailed information about a specific Kling Omni video generation task.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supply `_id` in the URL path.\n### Behavior\n- Retrieves the current server-side representation of the requested resource or task.\n- For asynchronous tasks, inspect the documented status and result fields before consuming generated media.\n- Repeat the request only as needed for polling and stop after the task reaches a terminal state.\n### Response\n- On `200`, consume the fields defined by that response schema below.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized.\n- `404` — Task not found.\n### Related Operations\n- `GET /api/v1/klingOmni/allRecords` — Get all Kling Omni video records.\n- `PUT /api/v1/klingOmni/{_id}` — Update Kling Omni video name.\n- `DELETE /api/v1/klingOmni/{_id}` — Delete Kling Omni video.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Kling Omni"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Task detail retrieved successfully","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"401":{"description":"Unauthorized"},"404":{"description":"Task not found"}},"parameters":[{"name":"_id","in":"path","required":true,"schema":{"type":"string","example":"507f1f77bcf86cd799439011"},"description":"Task ID"}],"operationId":"getApiV1KlingOmniId","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/klingOmni/{_id}\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]},"put":{"summary":"Update Kling Omni video name","description":"Rename the authenticated user's Kling Omni video task identified by `_id`; generation settings, processing status, and output media are unchanged.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supply `_id` in the URL path.\n- Send an `application/json` body. Required fields: `name`.\n### Behavior\n- Updates the identified resource using the fields accepted by the request schema and the operation's access controls.\n- Fields omitted from the request retain their existing values unless the schema states otherwise.\n- Read the returned record or call the detail operation to confirm the persisted state.\n### Response\n- On `200`, consume the fields defined by that response schema below.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized.\n- `404` — Task not found.\n### Related Operations\n- `GET /api/v1/klingOmni/allRecords` — Get all Kling Omni video records.\n- `GET /api/v1/klingOmni/{_id}` — Get Kling Omni video detail.\n- `DELETE /api/v1/klingOmni/{_id}` — Delete Kling Omni video.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Kling Omni"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"New name for the task","example":"My Task"}},"required":["name"],"example":{"name":"My Task"}},"example":{"name":"My Task"}}}},"responses":{"200":{"description":"Updated successfully"},"401":{"description":"Unauthorized"},"404":{"description":"Task not found"}},"parameters":[{"name":"_id","in":"path","required":true,"schema":{"type":"string","example":"507f1f77bcf86cd799439011"},"description":"Task ID"}],"operationId":"putApiV1KlingOmniId","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X PUT \"https://cheap.dev/api/v1/klingOmni/{_id}\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{\n  \"name\": \"My Task\"\n}'"}]},"delete":{"summary":"Delete Kling Omni video","description":"Soft-delete the authenticated user's Kling Omni video task identified by `_id`, preserving the stored record while excluding it from normal task lists.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supply `_id` in the URL path.\n### Behavior\n- Deletes or marks the selected resource as deleted according to the endpoint's documented lifecycle rules.\n- Use the resource identifier from a list, creation, or detail response; deleting one resource does not affect unrelated records.\n- Do not assume an in-progress task can be cancelled unless the endpoint explicitly documents that behavior.\n### Response\n- A `200` response confirms that the deletion request was applied to the selected record.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized.\n- `404` — Task not found.\n### Related Operations\n- `GET /api/v1/klingOmni/allRecords` — Get all Kling Omni video records.\n- `GET /api/v1/klingOmni/{_id}` — Get Kling Omni video detail.\n- `PUT /api/v1/klingOmni/{_id}` — Update Kling Omni video name.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Kling Omni"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Deleted successfully"},"401":{"description":"Unauthorized"},"404":{"description":"Task not found"}},"parameters":[{"name":"_id","in":"path","required":true,"schema":{"type":"string","example":"507f1f77bcf86cd799439011"},"description":"Task ID"}],"operationId":"deleteApiV1KlingOmniId","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X DELETE \"https://cheap.dev/api/v1/klingOmni/{_id}\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/grokVideo/start":{"post":{"summary":"Start Grok Imagine video generation","description":"Generate videos using Grok Imagine. Supports both text-to-video and image-to-video modes.\n**Modes:**\n- `text-to-video`: Generate video from a text prompt. Requires `prompt`.\n- `image-to-video`: Generate video from a reference image. Requires at least one image in `image_urls` (or `image_url`).\n**Duration:** `6`, `10`, or `15` seconds.\n**Model version:** `legacy` (default) uses the existing Grok Imagine path. `1.5` uses Grok Imagine Video 1.5 and only supports `image-to-video`.\n**Mode:** `fun`, `normal` (default), or `spicy`.\nThis is an asynchronous API. After calling this endpoint, poll `/api/v1/grokVideo/{_id}` to check task status until `current_status` becomes `completed` or `failed`.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body when using the optional controls documented in the request schema.\n- API-token callers may include `webhook_url` and `webhook_token` for best-effort terminal-state notifications; ordinary JWT/cookie calls ignore these fields.\n### Behavior\n- This is an asynchronous operation: a successful submission creates a task and returns before processing finishes.\n- Persist the returned task identifier and use the corresponding detail or list operation to observe progress.\n- Treat the detail endpoint as the source of truth even when webhook delivery is enabled.\n### Response\n- A `200` response confirms task acceptance; it does not by itself mean media generation has completed.\n- Retain the returned identifier and wait for a documented terminal status before using output URLs.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Bad Request - Invalid parameters.\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/grokVideo/allRecords` — Get Grok Video task list.\n- `GET /api/v1/grokVideo/{_id}` — Get Grok Video task detail.\n- `DELETE /api/v1/grokVideo/{_id}` — Delete Grok Video task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Grok Video"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"type":"object","properties":{"name":{"type":"string","description":"Name of the video generation task (optional, for identifying the task)","example":"My Grok Video"},"model_type":{"type":"string","enum":["text-to-video","image-to-video"],"description":"Generation mode. `text-to-video` generates video from text prompt, `image-to-video` generates video from a reference image.","default":"text-to-video","example":"text-to-video"},"model_version":{"type":"string","enum":["legacy","1.5"],"description":"Model version. `1.5` uses Grok Imagine Video 1.5 and only supports image-to-video.","default":"legacy","example":"1.5"},"prompt":{"type":"string","description":"Text prompt describing the video content. Required for text-to-video mode, optional for image-to-video mode.","example":"A cat playing with a ball of yarn in a cozy living room, warm lighting, cinematic style"},"mode":{"type":"string","enum":["fun","normal","spicy"],"description":"Generation style mode. For image-to-video, upstream may fallback spicy to normal.","default":"normal","example":"normal"},"image_urls":{"type":"array","items":{"type":"string"},"description":"Array of reference image URLs for image-to-video mode. At least one image is required when `model_type` is `image-to-video`.","example":["https://example.com/reference.jpg"]},"image_url":{"type":"string","description":"Single reference image URL (alternative to `image_urls`). Will be prepended to `image_urls` array.","example":"https://example.com/image.jpg"},"aspect_ratio":{"type":"string","enum":["auto","1:1","16:9","9:16","4:3","3:4","3:2","2:3"],"description":"Video aspect ratio. Legacy text-to-video supports 1:1/16:9/9:16; legacy image-to-video can additionally accept 4:3/3:4/3:2/2:3 depending on the selected generation path. Grok 1.5 accepts the full list including auto.","default":"16:9","example":"16:9"},"duration":{"type":"string","enum":["6","10","15"],"description":"Video duration in seconds.","default":"6","example":"6"},"nsfw_checker":{"type":"boolean","description":"Whether to enable additional NSFW checking for Grok 1.5.","default":false}},"required":[]},{"$ref":"#/components/schemas/WebhookInput"}]},"example":{}}}},"responses":{"200":{"description":"Video generation task started successfully","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"400":{"description":"Bad Request - Invalid parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"postApiV1GrokVideoStart","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/grokVideo/start\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/grokVideo/allRecords":{"get":{"summary":"Get Grok Video task list","description":"Retrieve paginated list of user's Grok Imagine video generation tasks, ordered by creation time (newest first).\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supported query parameters: `pageNum`, `pageSize`. Omitted values use the defaults shown in the parameter schema.\n### Behavior\n- Returns the collection visible in the current request and authorization context.\n- Apply the documented pagination and filter parameters when present; use response metadata to continue paging.\n- Record fields and status values have the same meaning as in the corresponding detail operation.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized.\n### Related Operations\n- `GET /api/v1/grokVideo/{_id}` — Get Grok Video task detail.\n- `DELETE /api/v1/grokVideo/{_id}` — Delete Grok Video task.\n- `POST /api/v1/grokVideo/start` — Start Grok Imagine video generation.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Grok Video"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Task list retrieved successfully","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"pageNum","in":"query","required":false,"schema":{"type":"integer","default":1,"example":1},"description":"Page number (starts from 1)"},{"name":"pageSize","in":"query","required":false,"schema":{"type":"integer","default":10,"example":10},"description":"Number of items per page"}],"operationId":"getApiV1GrokVideoAllRecords","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/grokVideo/allRecords\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]}},"/api/v1/grokVideo/batchDetail":{"post":{"summary":"Batch query task details","description":"Query details for multiple tasks at once by providing an array of task IDs.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body. Required fields: `ids`.\n### Behavior\n- Fetches several task records in one request, reducing the number of individual detail calls.\n- Results remain subject to the same authentication and ownership checks as single-record lookups.\n- Match returned records by their identifiers instead of relying on response ordering.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/grokVideo/allRecords` — Get Grok Video task list.\n- `GET /api/v1/grokVideo/{_id}` — Get Grok Video task detail.\n- `DELETE /api/v1/grokVideo/{_id}` — Delete Grok Video task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Grok Video"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"ids":{"type":"array","items":{"type":"string","example":"example"},"description":"Array of task IDs to query","example":["example"]}},"required":["ids"],"example":{"ids":["example"]}},"example":{"ids":["example"]}}}},"responses":{"200":{"description":"Batch details retrieved successfully"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"postApiV1GrokVideoBatchDetail","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/grokVideo/batchDetail\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{\n  \"ids\": [\n    \"example\"\n  ]\n}'"}]}},"/api/v1/grokVideo/{_id}":{"get":{"summary":"Get Grok Video task detail","description":"Retrieve detailed information of a specific Grok Imagine video generation task by ID. Use this endpoint to poll task status after creation.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supply `_id` in the URL path.\n### Behavior\n- Retrieves the current server-side representation of the requested resource or task.\n- For asynchronous tasks, inspect the documented status and result fields before consuming generated media.\n- Repeat the request only as needed for polling and stop after the task reaches a terminal state.\n### Response\n- On `200`, consume the fields defined by that response schema below.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized.\n### Related Operations\n- `GET /api/v1/grokVideo/allRecords` — Get Grok Video task list.\n- `DELETE /api/v1/grokVideo/{_id}` — Delete Grok Video task.\n- `POST /api/v1/grokVideo/start` — Start Grok Imagine video generation.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Grok Video"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Task detail retrieved successfully","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"_id","in":"path","required":true,"schema":{"type":"string","example":"507f1f77bcf86cd799439011"},"description":"Task ID (MongoDB ObjectId)"}],"operationId":"getApiV1GrokVideoId","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/grokVideo/{_id}\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]},"delete":{"summary":"Delete Grok Video task","description":"Remove the authenticated user's Grok Imagine video task identified by `_id` from normal task history without affecting unrelated tasks.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supply `_id` in the URL path.\n### Behavior\n- Deletes or marks the selected resource as deleted according to the endpoint's documented lifecycle rules.\n- Use the resource identifier from a list, creation, or detail response; deleting one resource does not affect unrelated records.\n- Do not assume an in-progress task can be cancelled unless the endpoint explicitly documents that behavior.\n### Response\n- A `200` response confirms that the deletion request was applied to the selected record.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized.\n### Related Operations\n- `GET /api/v1/grokVideo/allRecords` — Get Grok Video task list.\n- `GET /api/v1/grokVideo/{_id}` — Get Grok Video task detail.\n- `POST /api/v1/grokVideo/start` — Start Grok Imagine video generation.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Grok Video"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Task deleted successfully","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"_id","in":"path","required":true,"schema":{"type":"string","example":"507f1f77bcf86cd799439011"},"description":"Task ID (MongoDB ObjectId)"}],"operationId":"deleteApiV1GrokVideoId","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X DELETE \"https://cheap.dev/api/v1/grokVideo/{_id}\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/hailuoVideo/start":{"post":{"summary":"Start Hailuo video generation","description":"Generate videos using Hailuo. Only supports image-to-video mode.\n**Required:** `prompt` and at least one image in `image_urls`.\n**Duration:** `6` or `10` seconds.\n**Resolution:** `768P` (default) or `1080P` (not available for 10s).\nThis is an asynchronous API. After calling this endpoint, poll `/api/v1/hailuoVideo/{_id}` to check task status.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body when using the optional controls documented in the request schema.\n- API-token callers may include `webhook_url` and `webhook_token` for best-effort terminal-state notifications; ordinary JWT/cookie calls ignore these fields.\n### Behavior\n- This is an asynchronous operation: a successful submission creates a task and returns before processing finishes.\n- Persist the returned task identifier and use the corresponding detail or list operation to observe progress.\n- Treat the detail endpoint as the source of truth even when webhook delivery is enabled.\n### Response\n- A `200` response confirms task acceptance; it does not by itself mean media generation has completed.\n- Retain the returned identifier and wait for a documented terminal status before using output URLs.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/hailuoVideo/allRecords` — Get Hailuo Video task list.\n- `GET /api/v1/hailuoVideo/{_id}` — Get Hailuo Video task detail.\n- `DELETE /api/v1/hailuoVideo/{_id}` — Delete Hailuo Video task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Hailuo Video Generation"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"type":"object","properties":{"name":{"type":"string","description":"Task name (optional)","example":"My Hailuo Video"},"prompt":{"type":"string","description":"Text prompt describing the video content. Required.","example":"A cat playing with a ball of yarn"},"image_urls":{"type":"array","items":{"type":"string"},"description":"Array of reference image URLs. At least one is required.","example":["https://example.com/image.jpg"]},"image_url":{"type":"string","description":"Single reference image URL (alternative to image_urls)."},"resolution":{"type":"string","enum":["768P","1080P"],"description":"Output video resolution. 1080P is not supported for 10s duration.","default":"768P"},"duration":{"type":"string","enum":["6","10"],"description":"Video duration in seconds.","default":"6"}},"required":[]},{"$ref":"#/components/schemas/WebhookInput"}]},"example":{}}}},"responses":{"200":{"description":"Task started successfully","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"postApiV1HailuoVideoStart","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/hailuoVideo/start\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/hailuoVideo/allRecords":{"get":{"summary":"Get Hailuo Video task list","description":"Return the authenticated user's Hailuo video-generation tasks using the requested pagination controls.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supported query parameters: `pageNum`, `pageSize`. Omitted values use the defaults shown in the parameter schema.\n### Behavior\n- Returns the collection visible in the current request and authorization context.\n- Apply the documented pagination and filter parameters when present; use response metadata to continue paging.\n- Record fields and status values have the same meaning as in the corresponding detail operation.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/hailuoVideo/{_id}` — Get Hailuo Video task detail.\n- `DELETE /api/v1/hailuoVideo/{_id}` — Delete Hailuo Video task.\n- `POST /api/v1/hailuoVideo/start` — Start Hailuo video generation.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Hailuo Video Generation"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Task list"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"pageNum","in":"query","required":false,"schema":{"type":"integer","default":1,"example":1},"description":"pageNum parameter"},{"name":"pageSize","in":"query","required":false,"schema":{"type":"integer","default":10,"example":10},"description":"pageSize parameter"}],"operationId":"getApiV1HailuoVideoAllRecords","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/hailuoVideo/allRecords\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]}},"/api/v1/hailuoVideo/{_id}":{"get":{"summary":"Get Hailuo Video task detail","description":"Return the authenticated user's Hailuo video task identified by `_id`, including its current status and video output fields.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supply `_id` in the URL path.\n### Behavior\n- Retrieves the current server-side representation of the requested resource or task.\n- For asynchronous tasks, inspect the documented status and result fields before consuming generated media.\n- Repeat the request only as needed for polling and stop after the task reaches a terminal state.\n### Response\n- On `200`, consume the fields defined by that response schema below.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/hailuoVideo/allRecords` — Get Hailuo Video task list.\n- `DELETE /api/v1/hailuoVideo/{_id}` — Delete Hailuo Video task.\n- `POST /api/v1/hailuoVideo/start` — Start Hailuo video generation.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Hailuo Video Generation"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Task detail"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"_id","in":"path","required":true,"schema":{"type":"string","example":"507f1f77bcf86cd799439011"},"description":"_id parameter"}],"operationId":"getApiV1HailuoVideoId","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/hailuoVideo/{_id}\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]},"delete":{"summary":"Delete Hailuo Video task","description":"Soft-delete the authenticated user's Hailuo video task identified by `_id`.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supply `_id` in the URL path.\n### Behavior\n- Deletes or marks the selected resource as deleted according to the endpoint's documented lifecycle rules.\n- Use the resource identifier from a list, creation, or detail response; deleting one resource does not affect unrelated records.\n- Do not assume an in-progress task can be cancelled unless the endpoint explicitly documents that behavior.\n### Response\n- A `200` response confirms that the deletion request was applied to the selected record.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/hailuoVideo/allRecords` — Get Hailuo Video task list.\n- `GET /api/v1/hailuoVideo/{_id}` — Get Hailuo Video task detail.\n- `POST /api/v1/hailuoVideo/start` — Start Hailuo video generation.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Hailuo Video Generation"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Deleted"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"_id","in":"path","required":true,"schema":{"type":"string","example":"507f1f77bcf86cd799439011"},"description":"_id parameter"}],"operationId":"deleteApiV1HailuoVideoId","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X DELETE \"https://cheap.dev/api/v1/hailuoVideo/{_id}\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/minimaxH3Video/start":{"post":{"summary":"Start MiniMax H3 video generation","description":"Generate videos using MiniMax H3. Supports three modes via `mode`:\n`text-to-video`, `image-to-video` (first/last frame) and `reference-to-video` (reference images/videos/audios).\n**Required:** `prompt`. For `image-to-video`, `first_frame_url` is required.\nFor `reference-to-video`, at least one of `reference_image_urls` / `reference_video_urls` / `reference_audio_urls` is required.\n**Duration:** integer seconds between `4` and `15`.\n**Resolution:** `768P` or `2K` (default).\n**Aspect ratio:** for `text-to-video` one of `21:9`, `16:9`, `4:3`, `1:1`, `3:4`, `9:16`;\n`reference-to-video` additionally supports `adaptive` (default). Ignored for `image-to-video`.\nThis is an asynchronous API. After calling this endpoint, poll `/api/v1/minimaxH3Video/{_id}` to check task status.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body. Required fields: `prompt`.\n- API-token callers may include `webhook_url` and `webhook_token` for best-effort terminal-state notifications; ordinary JWT/cookie calls ignore these fields.\n### Behavior\n- This is an asynchronous operation: a successful submission creates a task and returns before processing finishes.\n- Persist the returned task identifier and use the corresponding detail or list operation to observe progress.\n- Treat the detail endpoint as the source of truth even when webhook delivery is enabled.\n### Response\n- A `200` response confirms task acceptance; it does not by itself mean media generation has completed.\n- Retain the returned identifier and wait for a documented terminal status before using output URLs.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/minimaxH3Video/allRecords` — Get MiniMax H3 Video task list.\n- `GET /api/v1/minimaxH3Video/{_id}` — Get MiniMax H3 Video task detail.\n- `DELETE /api/v1/minimaxH3Video/{_id}` — Delete MiniMax H3 Video task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["MiniMax H3 Video Generation"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"type":"object","properties":{"name":{"type":"string","description":"Task name (optional)","example":"My MiniMax H3 Video"},"mode":{"type":"string","enum":["text-to-video","image-to-video","reference-to-video"],"description":"Generation mode.","default":"text-to-video"},"prompt":{"type":"string","description":"Text prompt describing the video content. Required.","example":"A cinematic sunrise over snowy mountains"},"first_frame_url":{"type":"string","description":"First frame image URL. Required for image-to-video."},"last_frame_url":{"type":"string","description":"Last frame image URL (optional, image-to-video only)."},"reference_image_urls":{"type":"array","items":{"type":"string"},"description":"Reference image URLs (reference-to-video only)."},"reference_video_urls":{"type":"array","items":{"type":"string"},"description":"Reference video URLs (reference-to-video only)."},"reference_audio_urls":{"type":"array","items":{"type":"string"},"description":"Reference audio URLs (reference-to-video only)."},"resolution":{"type":"string","enum":["768P","2K"],"description":"Output video resolution.","default":"2K"},"duration":{"type":"string","description":"Video duration in seconds (4-15).","default":"12"},"aspect_ratio":{"type":"string","enum":["adaptive","21:9","16:9","4:3","1:1","3:4","9:16"],"description":"Output aspect ratio (text-to-video / reference-to-video)."}},"required":["prompt"]},{"$ref":"#/components/schemas/WebhookInput"}]},"example":{}}}},"responses":{"200":{"description":"Task started successfully","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"postApiV1MinimaxH3VideoStart","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/minimaxH3Video/start\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/minimaxH3Video/allRecords":{"get":{"summary":"Get MiniMax H3 Video task list","description":"Return the authenticated user's MiniMax H3 video-generation tasks using the requested pagination controls.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supported query parameters: `pageNum`, `pageSize`. Omitted values use the defaults shown in the parameter schema.\n### Behavior\n- Returns the collection visible in the current request and authorization context.\n- Apply the documented pagination and filter parameters when present; use response metadata to continue paging.\n- Record fields and status values have the same meaning as in the corresponding detail operation.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/minimaxH3Video/{_id}` — Get MiniMax H3 Video task detail.\n- `DELETE /api/v1/minimaxH3Video/{_id}` — Delete MiniMax H3 Video task.\n- `POST /api/v1/minimaxH3Video/start` — Start MiniMax H3 video generation.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["MiniMax H3 Video Generation"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Task list"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"pageNum","in":"query","required":false,"schema":{"type":"integer","default":1,"example":1},"description":"pageNum parameter"},{"name":"pageSize","in":"query","required":false,"schema":{"type":"integer","default":10,"example":10},"description":"pageSize parameter"}],"operationId":"getApiV1MinimaxH3VideoAllRecords","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/minimaxH3Video/allRecords\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]}},"/api/v1/minimaxH3Video/batchDetail":{"post":{"summary":"Batch query MiniMax H3 Video task details","description":"Return details for several of the authenticated user's MiniMax H3 video tasks in one request.\nDuplicate ids are removed and at most 200 ids are processed per call.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body. Required fields: `ids`.\n### Behavior\n- Fetches several task records in one request, reducing the number of individual detail calls.\n- Results remain subject to the same authentication and ownership checks as single-record lookups.\n- Match returned records by their identifiers instead of relying on response ordering.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/minimaxH3Video/allRecords` — Get MiniMax H3 Video task list.\n- `GET /api/v1/minimaxH3Video/{_id}` — Get MiniMax H3 Video task detail.\n- `DELETE /api/v1/minimaxH3Video/{_id}` — Delete MiniMax H3 Video task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["MiniMax H3 Video Generation"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"ids":{"type":"array","items":{"type":"string","example":"example"},"description":"Task ids to query. An empty array returns an empty result.","example":["0123456789abcdef01234567"]}},"required":["ids"],"example":{"ids":["0123456789abcdef01234567"]}},"example":{"ids":["0123456789abcdef01234567"]}}}},"responses":{"200":{"description":"Task details"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"postApiV1MinimaxH3VideoBatchDetail","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/minimaxH3Video/batchDetail\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{\n  \"ids\": [\n    \"0123456789abcdef01234567\"\n  ]\n}'"}]}},"/api/v1/minimaxH3Video/{_id}":{"get":{"summary":"Get MiniMax H3 Video task detail","description":"Return the authenticated user's MiniMax H3 video task identified by `_id`, including its current status and video output fields.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supply `_id` in the URL path.\n### Behavior\n- Retrieves the current server-side representation of the requested resource or task.\n- For asynchronous tasks, inspect the documented status and result fields before consuming generated media.\n- Repeat the request only as needed for polling and stop after the task reaches a terminal state.\n### Response\n- On `200`, consume the fields defined by that response schema below.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/minimaxH3Video/allRecords` — Get MiniMax H3 Video task list.\n- `DELETE /api/v1/minimaxH3Video/{_id}` — Delete MiniMax H3 Video task.\n- `POST /api/v1/minimaxH3Video/start` — Start MiniMax H3 video generation.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["MiniMax H3 Video Generation"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Task detail"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"_id","in":"path","required":true,"schema":{"type":"string","example":"507f1f77bcf86cd799439011"},"description":"_id parameter"}],"operationId":"getApiV1MinimaxH3VideoId","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/minimaxH3Video/{_id}\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]},"delete":{"summary":"Delete MiniMax H3 Video task","description":"Soft-delete the authenticated user's MiniMax H3 video task identified by `_id`.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supply `_id` in the URL path.\n### Behavior\n- Deletes or marks the selected resource as deleted according to the endpoint's documented lifecycle rules.\n- Use the resource identifier from a list, creation, or detail response; deleting one resource does not affect unrelated records.\n- Do not assume an in-progress task can be cancelled unless the endpoint explicitly documents that behavior.\n### Response\n- A `200` response confirms that the deletion request was applied to the selected record.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/minimaxH3Video/allRecords` — Get MiniMax H3 Video task list.\n- `GET /api/v1/minimaxH3Video/{_id}` — Get MiniMax H3 Video task detail.\n- `POST /api/v1/minimaxH3Video/start` — Start MiniMax H3 video generation.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["MiniMax H3 Video Generation"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Deleted"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"_id","in":"path","required":true,"schema":{"type":"string","example":"507f1f77bcf86cd799439011"},"description":"_id parameter"}],"operationId":"deleteApiV1MinimaxH3VideoId","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X DELETE \"https://cheap.dev/api/v1/minimaxH3Video/{_id}\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/soraVideo/start":{"post":{"summary":"Start Sora 2 Pro video generation (powered by Kling 3.0)","description":"Generate videos using Kling 3.0 official API. Supports text-to-video and image-to-video.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body. Required fields: `prompt`.\n- API-token callers may include `webhook_url` and `webhook_token` for best-effort terminal-state notifications; ordinary JWT/cookie calls ignore these fields.\n### Behavior\n- This is an asynchronous operation: a successful submission creates a task and returns before processing finishes.\n- Persist the returned task identifier and use the corresponding detail or list operation to observe progress.\n- Treat the detail endpoint as the source of truth even when webhook delivery is enabled.\n### Response\n- A `200` response confirms task acceptance; it does not by itself mean media generation has completed.\n- Retain the returned identifier and wait for a documented terminal status before using output URLs.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/soraVideo/allRecords` — List Sora 2 Pro records.\n- `GET /api/v1/soraVideo/{_id}` — Get Sora 2 Pro record detail.\n- `DELETE /api/v1/soraVideo/{_id}` — Delete Sora 2 Pro record.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Sora 2 Pro Video"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"type":"object","properties":{"name":{"type":"string","description":"Task name (optional)"},"model_type":{"type":"string","enum":["text-to-video","image-to-video"],"description":"Generation mode","default":"image-to-video"},"prompt":{"type":"string","description":"Text prompt for video generation"},"image_urls":{"type":"array","items":{"type":"string"},"description":"Required when model_type=image-to-video"},"aspect_ratio":{"type":"string","enum":["portrait","landscape"],"default":"landscape"},"duration_seconds":{"type":"string","enum":["5","10","15"],"default":"5"},"quality":{"type":"string","enum":["standard","high"],"default":"standard"}},"required":["prompt"]},{"$ref":"#/components/schemas/WebhookInput"}]},"example":{}}}},"responses":{"200":{"description":"Task created successfully"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"postApiV1SoraVideoStart","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/soraVideo/start\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/soraVideo/allRecords":{"get":{"summary":"List Sora 2 Pro records","description":"Return the authenticated user's Sora 2 Pro video tasks using the requested pagination controls.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supported query parameters: `pageNum`, `pageSize`. Omitted values use the defaults shown in the parameter schema.\n### Behavior\n- Returns the collection visible in the current request and authorization context.\n- Apply the documented pagination and filter parameters when present; use response metadata to continue paging.\n- Record fields and status values have the same meaning as in the corresponding detail operation.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/soraVideo/{_id}` — Get Sora 2 Pro record detail.\n- `DELETE /api/v1/soraVideo/{_id}` — Delete Sora 2 Pro record.\n- `POST /api/v1/soraVideo/start` — Start Sora 2 Pro video generation (powered by Kling 3.0)\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Sora 2 Pro Video"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"OK"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"pageNum","in":"query","required":false,"schema":{"type":"integer","default":1,"example":1},"description":"pageNum parameter"},{"name":"pageSize","in":"query","required":false,"schema":{"type":"integer","default":10,"example":10},"description":"pageSize parameter"}],"operationId":"getApiV1SoraVideoAllRecords","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/soraVideo/allRecords\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]}},"/api/v1/soraVideo/batchDetail":{"post":{"summary":"Batch get Sora 2 Pro video task details","description":"Query details for multiple Sora 2 Pro video tasks at once by providing an array of task IDs.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body. Required fields: `ids`.\n### Behavior\n- Fetches several task records in one request, reducing the number of individual detail calls.\n- Results remain subject to the same authentication and ownership checks as single-record lookups.\n- Match returned records by their identifiers instead of relying on response ordering.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/soraVideo/allRecords` — List Sora 2 Pro records.\n- `GET /api/v1/soraVideo/{_id}` — Get Sora 2 Pro record detail.\n- `DELETE /api/v1/soraVideo/{_id}` — Delete Sora 2 Pro record.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Sora 2 Pro Video"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"ids":{"type":"array","items":{"type":"string","example":"example"},"description":"Array of task IDs to query","example":["example"]}},"required":["ids"],"example":{"ids":["example"]}},"example":{"ids":["example"]}}}},"responses":{"200":{"description":"Task details"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"postApiV1SoraVideoBatchDetail","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/soraVideo/batchDetail\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{\n  \"ids\": [\n    \"example\"\n  ]\n}'"}]}},"/api/v1/soraVideo/{_id}":{"get":{"summary":"Get Sora 2 Pro record detail","description":"Return the authenticated user's Sora 2 Pro video task identified by `_id`, including its current status and video output fields.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supply `_id` in the URL path.\n### Behavior\n- Retrieves the current server-side representation of the requested resource or task.\n- For asynchronous tasks, inspect the documented status and result fields before consuming generated media.\n- Repeat the request only as needed for polling and stop after the task reaches a terminal state.\n### Response\n- On `200`, consume the fields defined by that response schema below.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/soraVideo/allRecords` — List Sora 2 Pro records.\n- `DELETE /api/v1/soraVideo/{_id}` — Delete Sora 2 Pro record.\n- `POST /api/v1/soraVideo/start` — Start Sora 2 Pro video generation (powered by Kling 3.0)\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Sora 2 Pro Video"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"OK"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"_id","in":"path","required":true,"schema":{"type":"string","example":"507f1f77bcf86cd799439011"},"description":"_id parameter"}],"operationId":"getApiV1SoraVideoId","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/soraVideo/{_id}\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]},"delete":{"summary":"Delete Sora 2 Pro record","description":"Soft-delete the authenticated user's Sora 2 Pro video task identified by `_id`.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supply `_id` in the URL path.\n### Behavior\n- Deletes or marks the selected resource as deleted according to the endpoint's documented lifecycle rules.\n- Use the resource identifier from a list, creation, or detail response; deleting one resource does not affect unrelated records.\n- Do not assume an in-progress task can be cancelled unless the endpoint explicitly documents that behavior.\n### Response\n- A `200` response confirms that the deletion request was applied to the selected record.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/soraVideo/allRecords` — List Sora 2 Pro records.\n- `GET /api/v1/soraVideo/{_id}` — Get Sora 2 Pro record detail.\n- `POST /api/v1/soraVideo/start` — Start Sora 2 Pro video generation (powered by Kling 3.0)\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Sora 2 Pro Video"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"OK"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"_id","in":"path","required":true,"schema":{"type":"string","example":"507f1f77bcf86cd799439011"},"description":"_id parameter"}],"operationId":"deleteApiV1SoraVideoId","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X DELETE \"https://cheap.dev/api/v1/soraVideo/{_id}\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/seedanceVideo/start":{"post":{"summary":"Start Seedance 1.5 Pro video generation","description":"Generate videos using BytePlus ModelArk Seedance 1.5 Pro. Supports 3 modes - text-to-video, image-to-video, first-last-frames.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body. Required fields: `prompt`.\n- API-token callers may include `webhook_url` and `webhook_token` for best-effort terminal-state notifications; ordinary JWT/cookie calls ignore these fields.\n### Behavior\n- This is an asynchronous operation: a successful submission creates a task and returns before processing finishes.\n- Persist the returned task identifier and use the corresponding detail or list operation to observe progress.\n- Treat the detail endpoint as the source of truth even when webhook delivery is enabled.\n### Response\n- A `200` response confirms task acceptance; it does not by itself mean media generation has completed.\n- Retain the returned identifier and wait for a documented terminal status before using output URLs.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Bad Request - Invalid parameters.\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/seedanceVideo/allRecords` — Get all Seedance video records.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Seedance 1.5 Pro"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"type":"object","properties":{"name":{"type":"string","description":"Name of the video generation task","example":"My Seedance Video"},"mode":{"type":"string","enum":["text-to-video","image-to-video"],"description":"Generation mode. For first-last-frames usage, send mode=image-to-video together with image_url + end_image_url; the backend will normalize it.","default":"text-to-video","example":"image-to-video"},"prompt":{"type":"string","description":"Text prompt describing the desired video","example":"A girl holding a fox, the girl opens her eyes..."},"image_url":{"type":"string","description":"Input image URL (required for image-to-video mode; also used as the first frame in first-last-frames usage)","example":"https://example.com/input.jpg"},"end_image_url":{"type":"string","description":"Last frame image URL. When provided together with image_url, mode is automatically treated as first-last-frames.","example":"https://example.com/last.jpg"},"duration":{"type":"string","enum":["5","10"],"description":"Video duration in seconds","default":"5"},"aspect_ratio":{"type":"string","enum":["16:9","9:16","1:1"],"description":"Video aspect ratio","default":"16:9"},"resolution":{"type":"string","enum":["480p","720p"],"description":"Video resolution","default":"720p"},"camera_fixed":{"type":"boolean","description":"Whether the camera is fixed","default":false},"generate_audio":{"type":"boolean","description":"Whether to generate audio","default":false}},"required":["prompt"]},{"$ref":"#/components/schemas/WebhookInput"}]},"example":{}}}},"responses":{"200":{"description":"Video generation task started successfully"},"400":{"description":"Bad Request - Invalid parameters"},"401":{"description":"Unauthorized - Invalid or missing bearer token"}},"operationId":"postApiV1SeedanceVideoStart","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/seedanceVideo/start\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/seedanceVideo/allRecords":{"get":{"summary":"Get all Seedance video records","description":"Retrieve all Seedance video generation records for the authenticated user.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supported query parameters: `pageNum`, `pageSize`. Omitted values use the defaults shown in the parameter schema.\n### Behavior\n- Returns the collection visible in the current request and authorization context.\n- Apply the documented pagination and filter parameters when present; use response metadata to continue paging.\n- Record fields and status values have the same meaning as in the corresponding detail operation.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `POST /api/v1/seedanceVideo/start` — Start Seedance 1.5 Pro video generation.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Seedance 1.5 Pro"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successfully retrieved records"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"pageNum","in":"query","required":false,"schema":{"type":"integer","default":1,"example":1},"description":"Page number"},{"name":"pageSize","in":"query","required":false,"schema":{"type":"integer","default":20,"example":20},"description":"Items per page"}],"operationId":"getApiV1SeedanceVideoAllRecords","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/seedanceVideo/allRecords\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]}},"/api/v1/seedance2Video/start":{"post":{"summary":"Start Seedance 2.x video generation","description":"Generate videos with Seedance 2.0 (standard/mini/fast) or Seedance 2.5 (model_version=2.5). Supports text-to-video, image-to-video, first-last-frames, and reference modes. Image / video / audio inputs must be public URLs (asset:// URIs are not accepted from clients). Seedance 2.5 raises the limits: single-shot output up to 30s (2.0: 15s), up to 30 reference images / 10 reference videos / 10 reference audios (2.0: 9 / 3 / 3), reference video total duration up to 30s, resolution up to 1080p, and audio-only references are allowed (2.0 requires at least one image or video).\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body. Required fields: `prompt`.\n- API-token callers may include `webhook_url` and `webhook_token` for best-effort terminal-state notifications; ordinary JWT/cookie calls ignore these fields.\n### Behavior\n- This is an asynchronous operation: a successful submission creates a task and returns before processing finishes.\n- Persist the returned task identifier and use the corresponding detail or list operation to observe progress.\n- Treat the detail endpoint as the source of truth even when webhook delivery is enabled.\n### Response\n- A `200` response confirms task acceptance; it does not by itself mean media generation has completed.\n- Retain the returned identifier and wait for a documented terminal status before using output URLs.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/seedance2Video/allRecords` — Get all records.\n- `GET /api/v1/seedance2Video/{_id}` — Get task detail.\n- `PUT /api/v1/seedance2Video/{_id}` — Rename task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Seedance 2.x"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"type":"object","properties":{"name":{"type":"string"},"mode":{"type":"string","enum":["text-to-video","image-to-video","first-last-frames","reference"],"default":"text-to-video","description":"image-to-video uses image_url (+ optional last_frame_url); first-last-frames uses first_frame_url + last_frame_url; reference accepts any combination of reference_urls (image) / video_urls / audio_urls. On Seedance 2.0 audio cannot be used alone and must accompany at least one image or video reference; on Seedance 2.5 audio-only references are supported."},"model_version":{"type":"string","enum":["standard","mini","fast","2.5"],"default":"standard","description":"standard / mini / fast select a Seedance 2.0 tier. \"2.5\" selects Seedance 2.5, which currently has a single tier and higher input limits (see duration / reference_urls / video_urls / audio_urls)."},"prompt":{"type":"string"},"image_url":{"type":"string","description":"First frame for image-to-video mode."},"first_frame_url":{"type":"string","description":"Required for first-last-frames mode."},"last_frame_url":{"type":"string","description":"Optional last frame for image-to-video; required for first-last-frames."},"reference_urls":{"type":"array","items":{"type":"string"},"maxItems":30,"description":"Reference images for reference mode. Max 9 on Seedance 2.0, max 30 on Seedance 2.5."},"video_urls":{"type":"array","items":{"type":"string"},"maxItems":10,"description":"Reference videos (mp4/mov). Seedance 2.0: max 3 clips, each 2-15s, total <= 15 × number_of_videos seconds. Seedance 2.5: max 10 clips with a combined cap of 30s. The server always measures the total duration itself via ffprobe (https only, public hosts, 10s per-URL timeout); any URL that cannot be probed is rejected with 400."},"audio_urls":{"type":"array","items":{"type":"string"},"maxItems":10,"description":"Reference audios (mp3/wav). Seedance 2.0: max 3 clips, each 2-15s, total <=15s, and audio cannot be used standalone (at least one image or video reference is required). Seedance 2.5: max 10 clips and audio-only references are allowed."},"input_video_duration":{"type":"number","minimum":2,"maximum":45,"description":"Optional. Total duration in seconds of all reference videos. The server always ffprobes video_urls and bills on max(measured, this value), so passing a smaller number does not lower the price; omit it unless you want to be billed for more than the measured length. Billing uses (billed input + output) × video rate, where billed input is at least ceil(2/3 × duration) seconds. The measured total must be within [2, 15 × number_of_videos] on Seedance 2.0 and within [2, 30] on Seedance 2.5."},"duration":{"type":"integer","minimum":4,"maximum":30,"default":5,"description":"Output length in seconds. Max 15 on Seedance 2.0; max 30 on Seedance 2.5."},"aspect_ratio":{"type":"string","enum":["21:9","16:9","4:3","1:1","3:4","9:16"],"default":"16:9"},"resolution":{"type":"string","enum":["480p","720p","1080p","4k"],"default":"720p","description":"Only the standard tier of Seedance 2.0 supports 4k. Seedance 2.5 supports 480p / 720p / 1080p. The fast / mini tiers of Seedance 2.0 are limited to 480p / 720p."},"generate_audio":{"type":"boolean","default":true,"description":"Defaults to true to match billing (audio is included); pass false explicitly to disable."},"minor_suspected_skip":{"type":"boolean","default":false,"description":"Skip soft minor-suspect block (code 1004); hard CSAM block (code 1003) is always enforced."}},"required":["prompt"]},{"$ref":"#/components/schemas/WebhookInput"}]},"example":{}}}},"responses":{"200":{"description":"Task started successfully"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"postApiV1Seedance2VideoStart","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/seedance2Video/start\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/seedance2Video/allRecords":{"get":{"summary":"Get all records","description":"List the current user's Seedance 2.0 video tasks with pagination.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supported query parameters: `pageNum`, `pageSize`. Omitted values use the defaults shown in the parameter schema.\n### Behavior\n- Returns the collection visible in the current request and authorization context.\n- Apply the documented pagination and filter parameters when present; use response metadata to continue paging.\n- Record fields and status values have the same meaning as in the corresponding detail operation.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/seedance2Video/{_id}` — Get task detail.\n- `PUT /api/v1/seedance2Video/{_id}` — Rename task.\n- `DELETE /api/v1/seedance2Video/{_id}` — Delete task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Seedance 2.x"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Success"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"pageNum","in":"query","required":false,"schema":{"type":"integer","default":1,"example":1},"description":"Page number (1-based)"},{"name":"pageSize","in":"query","required":false,"schema":{"type":"integer","default":20,"example":20},"description":"Page size"}],"operationId":"getApiV1Seedance2VideoAllRecords","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/seedance2Video/allRecords\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]}},"/api/v1/seedance2Video/batchDetail":{"post":{"summary":"Batch get task details","description":"Fetch multiple Seedance 2.0 video task records in a single request (up to 200 ids).\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body. Required fields: `ids`.\n### Behavior\n- Fetches several task records in one request, reducing the number of individual detail calls.\n- Results remain subject to the same authentication and ownership checks as single-record lookups.\n- Match returned records by their identifiers instead of relying on response ordering.\n### Response\n- The `200` response contains the requested collection in the response envelope documented below.\n- An empty collection is a successful result when no matching records are available.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/seedance2Video/allRecords` — Get all records.\n- `GET /api/v1/seedance2Video/{_id}` — Get task detail.\n- `PUT /api/v1/seedance2Video/{_id}` — Rename task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Seedance 2.x"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"ids":{"type":"array","items":{"type":"string","example":"example"},"description":"Task record ids (max 200)","example":["example"]}},"required":["ids"],"example":{"ids":["example"]}},"example":{"ids":["example"]}}}},"responses":{"200":{"description":"Success"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"postApiV1Seedance2VideoBatchDetail","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/seedance2Video/batchDetail\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{\n  \"ids\": [\n    \"example\"\n  ]\n}'"}]}},"/api/v1/seedance2Video/{_id}":{"get":{"summary":"Get task detail","description":"Return the authenticated user's Seedance 2.0 video task identified by `_id`, including its generation settings, current status, and available video output.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supply `_id` in the URL path.\n### Behavior\n- Retrieves the current server-side representation of the requested resource or task.\n- For asynchronous tasks, inspect the documented status and result fields before consuming generated media.\n- Repeat the request only as needed for polling and stop after the task reaches a terminal state.\n### Response\n- On `200`, consume the fields defined by that response schema below.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/seedance2Video/allRecords` — Get all records.\n- `PUT /api/v1/seedance2Video/{_id}` — Rename task.\n- `DELETE /api/v1/seedance2Video/{_id}` — Delete task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Seedance 2.x"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Success"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"_id","in":"path","required":true,"schema":{"type":"string","example":"507f1f77bcf86cd799439011"},"description":"Task record id"}],"operationId":"getApiV1Seedance2VideoId","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X GET \"https://cheap.dev/api/v1/seedance2Video/{_id}\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\""}]},"put":{"summary":"Rename task","description":"Rename the authenticated user's Seedance 2.0 video task identified by `_id`; generation settings, processing status, and output media are unchanged.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supply `_id` in the URL path.\n- Send an `application/json` body. Required fields: `name`.\n### Behavior\n- Updates the identified resource using the fields accepted by the request schema and the operation's access controls.\n- Fields omitted from the request retain their existing values unless the schema states otherwise.\n- Read the returned record or call the detail operation to confirm the persisted state.\n### Response\n- On `200`, consume the fields defined by that response schema below.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/seedance2Video/allRecords` — Get all records.\n- `GET /api/v1/seedance2Video/{_id}` — Get task detail.\n- `DELETE /api/v1/seedance2Video/{_id}` — Delete task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Seedance 2.x"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"New task name","example":"My Task"}},"required":["name"],"example":{"name":"My Task"}},"example":{"name":"My Task"}}}},"responses":{"200":{"description":"Updated"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"_id","in":"path","required":true,"schema":{"type":"string","example":"507f1f77bcf86cd799439011"},"description":"Task record id"}],"operationId":"putApiV1Seedance2VideoId","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X PUT \"https://cheap.dev/api/v1/seedance2Video/{_id}\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{\n  \"name\": \"My Task\"\n}'"}]},"delete":{"summary":"Delete task","description":"Remove the authenticated user's Seedance 2.0 video task identified by `_id` from normal task history without affecting unrelated tasks.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Supply `_id` in the URL path.\n### Behavior\n- Deletes or marks the selected resource as deleted according to the endpoint's documented lifecycle rules.\n- Use the resource identifier from a list, creation, or detail response; deleting one resource does not affect unrelated records.\n- Do not assume an in-progress task can be cancelled unless the endpoint explicitly documents that behavior.\n### Response\n- A `200` response confirms that the deletion request was applied to the selected record.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `401` — Unauthorized - Invalid or missing JWT token.\n### Related Operations\n- `GET /api/v1/seedance2Video/allRecords` — Get all records.\n- `GET /api/v1/seedance2Video/{_id}` — Get task detail.\n- `PUT /api/v1/seedance2Video/{_id}` — Rename task.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Seedance 2.x"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Deleted"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"parameters":[{"name":"_id","in":"path","required":true,"schema":{"type":"string","example":"507f1f77bcf86cd799439011"},"description":"Task record id"}],"operationId":"deleteApiV1Seedance2VideoId","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X DELETE \"https://cheap.dev/api/v1/seedance2Video/{_id}\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/userWan30/start":{"post":{"summary":"Start Wan3.0 all-in-one video generation","description":"Generate a video with `wan3.0-video`.\nReference mode accepts image, video, audio, file, and public web-page media.\nStrict first-frame/first-last-frame media cannot be mixed with reference media.\nFile and link inputs require `enable_thinking=true` and are mutually exclusive.\n`negative_prompt` is not supported.\n### Request\n- Send a valid bearer token. The server evaluates the operation in the authenticated caller's access context.\n- Send an `application/json` body. Required fields: `model`, `input`, `parameters`.\n- API-token callers may include `webhook_url` and `webhook_token` for best-effort terminal-state notifications; ordinary JWT/cookie calls ignore these fields.\n### Behavior\n- This is an asynchronous operation: a successful submission creates a task and returns before processing finishes.\n- Persist the returned task identifier and use the corresponding detail or list operation to observe progress.\n- Treat the detail endpoint as the source of truth even when webhook delivery is enabled.\n### Response\n- A `200` response confirms task acceptance; it does not by itself mean media generation has completed.\n- Retain the returned identifier and wait for a documented terminal status before using output URLs.\n- Do not infer undocumented fields or statuses; clients should tolerate additional response properties.\n### Errors\n- `400` — Invalid mode, media combination, or generation parameter.\n- `401` — Unauthorized - Invalid or missing JWT token.\n- `503` — Provider or Wan3.0 pricing is not configured.\n\nAuthentication: set header Authorization: Bearer <token> (supports user JWT or sk_ API token).","tags":["Wan Image to Video"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"type":"object","properties":{"name":{"type":"string"},"model":{"type":"string","enum":["wan3.0-video"],"default":"wan3.0-video"},"mode":{"type":"string","enum":["text-to-video","first-frame","first-last-frames","reference"],"default":"text-to-video"},"input":{"type":"object","properties":{"prompt":{"type":"string","maxLength":5000},"media":{"type":"array","items":{"type":"object","required":["type","url"],"properties":{"type":{"type":"string","enum":["reference_image","reference_video","reference_audio","first_frame","last_frame","file","link"]},"url":{"type":"string"},"duration":{"type":"number","description":"Input media duration in seconds."}}}}}},"parameters":{"type":"object","properties":{"resolution":{"type":"string","enum":["480P","720P","1080P"],"default":"1080P"},"ratio":{"type":"string","enum":["adaptive","16:9","4:3","1:1","3:4","9:16"],"default":"adaptive"},"duration":{"type":"integer","description":"Output duration from 3 to 30 seconds, or -1 for intelligent duration.","default":5},"audio":{"type":"boolean","default":true},"enable_thinking":{"type":"boolean","default":false},"seed":{"type":"integer","minimum":0,"maximum":2147483647},"watermark":{"type":"boolean","default":false}}}},"required":["model","input","parameters"]},{"$ref":"#/components/schemas/WebhookInput"}]},"example":{}}}},"responses":{"200":{"description":"Task created"},"400":{"description":"Invalid mode, media combination, or generation parameter"},"401":{"description":"Unauthorized - Invalid or missing bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Provider or Wan3.0 pricing is not configured"}},"operationId":"postApiV1UserWan30Start","x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -X POST \"https://cheap.dev/api/v1/userWan30/start\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -d '{}'"}]}},"/api/v1/user/remainingCoins":{"get":{"tags":["Authentication"],"summary":"Get the remaining balance","description":"Returns the API-token owner's remaining USD balance. Legacy unit fields remain for compatibility.","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Remaining USD balance","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"coins":{"type":"number"},"diamonds":{"type":"number"},"balance_usd":{"type":"number","description":"Preferred spendable balance in US dollars."}},"required":["coins","diamonds"]}}}}}},"401":{"description":"Missing or invalid API token"}}}}},"components":{"schemas":{"SuccessResponse":{"type":"object","properties":{"success":{"type":"boolean","description":"Operation success status","example":true},"data":{"type":"object","description":"Response data"},"timestamp":{"type":"string","format":"date-time","description":"Response timestamp","example":"2025-01-14T18:22:13.726Z"}},"required":["success"]},"AvatarListResponse":{"type":"object","properties":{"code":{"type":"integer","description":"Response code. 0 means success.","example":0},"data":{"type":"array","description":"Avatars available to the authenticated API user.","items":{"type":"object","description":"Avatar record"}}},"required":["code","data"]},"UserVoice":{"type":"object","properties":{"_id":{"type":"string","description":"Record id (MongoDB ObjectId)","example":"65a3b8c6f0c2d3e4f5a6b7c8"},"name":{"type":"string","description":"Voice model name","example":"My Custom Voice"},"voice_urls":{"type":"array","description":"Audio sample URLs used for training","items":{"type":"string"}},"gender":{"type":"string","description":"Voice gender","enum":["female","male"],"example":"female"},"model":{"type":"string","description":"Voice model provider","enum":["a2e","cartesia","minimax","elevenlabs"],"example":"a2e"},"lang":{"type":"string","description":"Internal language code used by model","example":"en"},"language":{"type":"string","description":"Original language code from client","example":"en-US"},"current_status":{"type":"string","description":"Training status","enum":["sent","pendding","processing","completed","failed"],"example":"processing"},"speaker_id":{"type":"string","description":"Speaker id returned by vendor","example":"a2e-voice-xxxx"},"coins":{"type":"number","description":"Coins cost for this training (if any)","example":0},"denoise":{"type":"boolean","description":"Whether denoising is enabled","example":true},"enhance_voice_similarity":{"type":"boolean","description":"Whether enhance voice similarity is enabled","example":true},"ttsRate":{"type":"number","description":"TTS rate (coins per 10 seconds)","example":1},"hasRefundCoin":{"type":"boolean","description":"Whether coins have been refunded for failed training","example":false},"user_id":{"type":"string","description":"Owner user id","example":"65a3b8c6f0c2d3e4f5a6b7c1"},"createdAt":{"type":"string","format":"date-time","description":"Created time","example":"2025-01-14T18:22:13.726Z"},"updatedAt":{"type":"string","format":"date-time","description":"Updated time","example":"2025-01-14T18:22:13.726Z"}}},"UserVoiceTrainingRequest":{"type":"object","required":["name","voice_urls"],"properties":{"name":{"type":"string","description":"Name of the voice model","example":"My Custom Voice"},"voice_urls":{"type":"array","minItems":1,"items":{"type":"string"},"description":"Array of audio file URLs for training","example":["https://example.com/audio1.wav","https://example.com/audio2.wav"]},"gender":{"type":"string","enum":["female","male"],"description":"Voice gender","default":"female","example":"female"},"denoise":{"type":"boolean","description":"Whether to apply denoising","example":true},"enhance_voice_similarity":{"type":"boolean","description":"Whether to enhance voice similarity","example":true},"model":{"type":"string","enum":["a2e","cartesia","minimax","elevenlabs"],"description":"Voice model to use","default":"a2e","example":"a2e"},"language":{"type":"string","description":"Language code from client (e.g. en-US, zh-CN). If omitted, server will infer from request headers.","example":"en-US"}}},"UserVoiceUpdateRequest":{"type":"object","required":["name"],"properties":{"name":{"type":"string","description":"New name of the voice record","example":"My Renamed Voice"}}},"SuccessUserVoiceResponse":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"$ref":"#/components/schemas/UserVoice"},"timestamp":{"type":"string","format":"date-time","example":"2025-01-14T18:22:13.726Z"}},"required":["success","data"]},"SuccessUserVoiceListResponse":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"array","items":{"$ref":"#/components/schemas/UserVoice"}},"timestamp":{"type":"string","format":"date-time","example":"2025-01-14T18:22:13.726Z"}},"required":["success","data"]},"R2UploadPresignedUrlResponse":{"type":"object","properties":{"code":{"type":"integer","example":0,"description":"Response code. 0 means success."},"data":{"type":"object","required":["uploadUrl","cdnUrl","key","bucket","expiresIn"],"properties":{"uploadUrl":{"type":"string","description":"Pre-signed URL. Upload the file with HTTP PUT."},"cdnUrl":{"type":"string","description":"Public CDN URL to use after upload succeeds."},"key":{"type":"string","description":"Final R2 object key."},"bucket":{"type":"string"},"expiresIn":{"type":"integer"}}}},"required":["code","data"]},"ErrorResponse":{"type":"object","properties":{"success":{"type":"boolean","description":"Operation success status","example":false},"error":{"type":"string","description":"Error message"},"code":{"type":"string","description":"Error code"},"timestamp":{"type":"string","format":"date-time","description":"Error timestamp","example":"2025-01-14T18:22:13.726Z"}},"required":["success","error"]},"WebhookInput":{"type":"object","properties":{"webhook_url":{"type":"string","description":"HTTPS URL to receive task.completed / task.failed notifications. Best-effort delivery, single attempt, no retries; clients should treat the detail API as the source of truth.","example":"https://your-server.example.com/a2e/webhook","maxLength":2048},"webhook_token":{"type":"string","description":"Optional plaintext token returned in the X-A2e-Webhook-Token header so receivers can verify the request originated from a2e.","example":"a-shared-secret","maxLength":256}}}},"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Use Authorization: Bearer <API_TOKEN>. Generate the token in Account > API Token. Public developer API calls should use API tokens that start with sk_."}}},"tags":[{"name":"Miscellaneous","description":"Supporting utilities including file upload to cloud storage, pre-signed URL generation, URL saving, and other helper endpoints used across API workflows."},{"name":"Credits"},{"name":"Generate Avatar Videos","description":"Submit a script or audio file to generate an avatar presentation video. The digital avatar lip-syncs to your content and speaks on your behalf."},{"name":"TTS and Voice Clone","description":"Convert text to natural-sounding speech using a library of built-in voices, or clone a custom voice from a short audio sample for consistent narration."},{"name":"Create Avatars","description":"Train and manage custom digital avatars from uploaded video recordings. Trained avatars can then be used in avatar video generation workflows."},{"name":"Background Matting","description":"Automatically remove or replace the background in images and videos using AI-based foreground segmentation and matting."},{"name":"Video Twin","description":"Build a personalised video twin - a digital double trained on your own footage - that can speak and present content on your behalf with natural motion."},{"name":"Face Swap","description":"Swap faces between a source and a target image or video with identity-preserving blending. Handles diverse lighting, pose, and expression conditions."},{"name":"AI Dubbing","description":"Automatically translate and re-dub a video into a target language using voice cloning and AI-driven lip-sync adjustment."},{"name":"Caption Removal","description":"Detect and cleanly remove embedded captions, subtitles, or text overlays from video frames using AI inpainting."},{"name":"Upscale","description":"Enhance the resolution of images and videos using AI super-resolution. Sharpens fine detail and reduces compression artifacts without visible upscale noise."},{"name":"Text to Image","description":"Generate images from natural language prompts using the platform's diffusion model pipeline. Describe what you want - style, composition, lighting - and receive high-resolution results."},{"name":"Nano Banana","description":"Image generation powered by Google Gemini's image model. Accepts text-only prompts or text combined with up to four reference images for high-fidelity, semantically-aware output."},{"name":"Photobook","description":"Produce a series of stylised portrait photos with consistent subject identity across different poses, outfits, or backgrounds."},{"name":"GPT Image","description":"Image generation and editing via OpenAI GPT-4o image capabilities. Excels at precise instruction-following, photorealistic rendering, and multi-step image editing tasks."},{"name":"Wan2.6 Image","description":"Generate images with the Wan 2.6 image model using text prompts and configurable output dimensions."},{"name":"Wan2.7 Image","description":"Generate images with the Wan 2.7 image model using text prompts and configurable output dimensions."},{"name":"Qwen Image","description":"Generate and edit images with Qwen Image models using text prompts and optional reference images."},{"name":"Flux 2","description":"High-quality image generation using the Flux 2 Pro model. Delivers strong results for both creative and photorealistic use cases with fast inference."},{"name":"Kling Image","description":"Generate high-fidelity images with Kling using prompt, aspect ratio, resolution, and optional reference-image controls."},{"name":"Image Edit","description":"AI-powered image editing including inpainting, outpainting, and prompt-guided modifications to existing images. Preserve context while making targeted changes."},{"name":"Image to Video","description":"Convert a still image into an AI-animated video. Control motion intensity, duration, and aspect ratio to produce smooth, high-quality video clips from a single reference image."},{"name":"Wan Image to Video","description":"Animate a still image into a video using the Wan 2.5 / 2.6 open-source video diffusion model family. Part of the Wan series known for fluid motion and temporal consistency."},{"name":"Wan 2.6 R2V Flash","description":"Generate a video from reference images with the fast Wan 2.6 reference-to-video workflow."},{"name":"HappyHorse Video","description":"Asynchronous video generation powered by HappyHorse models on Alibaba DashScope. Supports HappyHorse 1.0 and 1.1 for text-to-video, image-to-video, and reference-to-video; video-edit remains on HappyHorse 1.0. HappyHorse 1.1 generation supports 480P, 720P, or 1080P; 1.0 and video-edit support 720P or 1080P."},{"name":"Talking Photo","description":"Animate a portrait photo to lip-sync with a given audio track, generating a realistic talking-head video from a single still image."},{"name":"Talking Video","description":"Re-lip-sync an existing video to a new audio source using AI-driven facial animation and motion warping."},{"name":"Virtual Try-On","description":"Generate a realistic preview of a person wearing a specific garment from a product image - no physical samples required."},{"name":"ThinkSound","description":"Generate semantically-aware ambient sound effects and background audio that match the visual content of a video clip."},{"name":"Motion Transfer","description":"Transfer body motion captured in a source video onto a target subject, preserving the target's appearance and background."},{"name":"Actor Swap","description":"Replace an actor in a video segment with a different person, retaining original motion, camera angle, and scene continuity."},{"name":"Product Avatar","description":"Create dynamic product showcase videos that pair a product image with an AI avatar or custom background scene."},{"name":"Head Swap","description":"Replace the head in an image with a target face while keeping the original body, clothing, lighting, and background intact."},{"name":"Veo Video","description":"Text-to-video generation powered by Google DeepMind's Veo model. Produces high-definition, cinematic video clips from a text prompt or a reference image."},{"name":"Kling Video","description":"Text-to-video and image-to-video generation with Kling. Recognized for smooth motion dynamics, scene consistency, and high visual fidelity."},{"name":"Kling Omni","description":"An extended variant of Kling with additional control parameters for output style, generation quality, and advanced scene handling."},{"name":"Grok Video","description":"Video generation using xAI's Grok model. Suitable for creative and coherent video synthesis from descriptive text prompts."},{"name":"Hailuo Video Generation","description":"Generate videos with Hailuo from text prompts or image references with configurable duration and output settings."},{"name":"MiniMax H3 Video Generation"},{"name":"Sora 2 Pro Video","description":"Generate Sora 2 Pro videos from text prompts or image references with configurable duration, orientation, and quality."},{"name":"Seedance 1.5 Pro","description":"Generate cinematic videos with Seedance 1.5 Pro from a text prompt, a first-frame image, or first and last frames. Supports configurable duration, aspect ratio, resolution, camera behavior, and audio generation."},{"name":"Seedance 2.x"}],"x-tagGroups":[{"name":"Image & Video Generation","tags":["Image to Video","Text to Image","Nano Banana","GPT Image","Flux 2","Qwen Image","Kling Image","Wan Image to Video","HappyHorse Video","Seedance 1.5 Pro","Seedance 2.x","Veo Video","Grok Video","Kling Video","Kling Omni","Sora 2 Pro Video","Image Edit"]},{"name":"Face & Body","tags":["Face Swap","Head Swap","Actor Swap","Talking Photo","Talking Video","Virtual Try-On","Motion Transfer","Product Avatar","Photobook"]},{"name":"Avatar & Video","tags":["Generate Avatar Videos","Create Avatars","Background Matting","Video Twin"]},{"name":"Voice & Audio","tags":["TTS and Voice Clone","AI Dubbing","ThinkSound"]},{"name":"Post Processing","tags":["Caption Removal","Upscale"]},{"name":"Utilities","tags":["Miscellaneous","Credits"]}],"trace_id":"3294d952-6332-4cf6-bb22-22e14f7476e9"}