{"openapi":"3.1.0","info":{"title":"Frenkel.ai Studio API","version":"1.0.0","summary":"Images, video, voice, dubbing and logos from text, billed in prepaid credits.","description":"Every call is made on behalf of the account that owns the API key. Create a key under Account → Developers. Generations are asynchronous: POST /api/generations returns a job, poll GET /api/jobs/{id} until it completes, then download the outputs. GET /api/catalog?locale=en lists every option (looks, video styles, voices, cue tags, languages) with live availability and credit prices; GET /api/pricing quotes a specific choice before you commit credits. Failed generations are refunded automatically. An MCP server exposing the same capabilities to AI agents lives at /mcp (Streamable HTTP, same Bearer key).","contact":{"name":"Frenkel.ai","email":"hello@frenkel.ai","url":"https://app.frenkel.ai"}},"servers":[{"url":"https://app.frenkel.ai"}],"security":[{"apiKey":[]}],"components":{"securitySchemes":{"apiKey":{"type":"http","scheme":"bearer","bearerFormat":"frk_…","description":"Authorization: Bearer <API key>"}},"schemas":{"Asset":{"type":"object","description":"A file in the library (image, video or audio). `url` and `thumbUrl` are relative to the site; send the same Authorization header when downloading.","properties":{"id":{"type":"string"},"name":{"type":"string"},"kind":{"type":"string","description":"upload | reference | brand | product | output …"},"mediaType":{"type":"string","enum":["image","video","audio"]},"durationMs":{"type":["integer","null"]},"projectId":{"type":["string","null"]},"width":{"type":["integer","null"]},"height":{"type":["integer","null"]},"sizeBytes":{"type":["integer","null"]},"mimeType":{"type":["string","null"]},"favorite":{"type":"boolean"},"prompt":{"type":["string","null"]},"task":{"type":["string","null"]},"jobId":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"},"url":{"type":"string"},"thumbUrl":{"type":"string"}}},"Job":{"type":"object","description":"A generation. Poll until status is completed, failed or cancelled; outputs are assets.","properties":{"id":{"type":"string"},"task":{"type":"string"},"status":{"type":"string","enum":["queued","preparing","generating","processing","completed","failed","cancelled"]},"progress":{"type":"integer","minimum":0,"maximum":100},"message":{"type":"string","description":"Status text (a message key such as status.generating)."},"error":{"type":["string","null"]},"prompt":{"type":"string"},"translatedPrompt":{"type":["string","null"],"description":"English prompt actually used when the original was auto-translated."},"quality":{"type":"string"},"count":{"type":"integer"},"seed":{"type":["integer","null"]},"creditsCost":{"type":"integer"},"projectId":{"type":["string","null"]},"inputAssetIds":{"type":"array","items":{"type":"string"}},"aspectRatio":{"type":["string","null"]},"engine":{"type":"string"},"modelKey":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"completedAt":{"type":["string","null"],"format":"date-time"},"outputs":{"type":"array","items":{"$ref":"#/components/schemas/Asset"}}}},"Error":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}},"required":["error"]},"GenerationRequest":{"type":"object","properties":{"task":{"type":"string","enum":["text_to_image","image_edit","inpaint","outpaint","background_replace","background_remove","upscale","character_reference","product_photo","variation","image_to_video","text_to_video","reference_to_video","text_to_speech","text_to_music","video_voiceover","voice_clone","video_lipsync","video_dub","video_analyze","video_render","video_restyle","video_edit","video_motion","talking_photo","video_upscale","logo","vectorize","mockup","recolor"]},"prompt":{"default":"","type":"string","maxLength":6000},"negativePrompt":{"type":"string","maxLength":1000},"quality":{"default":"standard","type":"string","enum":["standard","photorealistic","creative","illustration","grok","nanobanana","gptimage","seedream","seedream5"]},"count":{"default":1,"type":"integer","minimum":1,"maximum":4},"aspectRatio":{"type":"string","enum":["1:1","4:5","3:4","2:3","16:9","9:16","3:2","4:3"]},"seed":{"type":"integer","minimum":0,"maximum":2147483647},"inputAssetIds":{"default":[],"maxItems":30,"type":"array","items":{"type":"string"}},"referenceVideoAssetIds":{"default":[],"maxItems":10,"type":"array","items":{"type":"string"}},"referenceAudioAssetIds":{"default":[],"maxItems":10,"type":"array","items":{"type":"string"}},"referenceTask":{"type":"string","enum":["reference","edit","extend"]},"draft":{"type":"boolean"},"fromDraftJobId":{"type":"string","maxLength":40},"maskAssetId":{"type":"string"},"characterId":{"type":"string"},"projectId":{"type":"string"},"creativity":{"type":"number","minimum":0,"maximum":1},"referenceStrength":{"type":"number","minimum":0,"maximum":1},"productScene":{"type":"string","enum":["luxury_studio","white_ecommerce","lifestyle","advertising","outdoor"]},"upscaleFactor":{"type":"number","minimum":1,"maximum":4},"enhanceMode":{"type":"string","enum":["sharp","detailed","creative"]},"enhanceFaces":{"type":"boolean"},"videoSeconds":{"default":5,"type":"integer","minimum":1,"maximum":30},"videoStyle":{"default":"standard","type":"string","enum":["standard","cinematic","minimax","seedance","seedance25","seedancemini","grok","ltx","h3max","vidu","kling3"]},"logoOptions":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":40},"tagline":{"type":"string","maxLength":60},"industry":{"type":"string","maxLength":120},"type":{"default":"combination","type":"string","enum":["wordmark","monogram","combination","icon"]},"styles":{"default":["modern"],"maxItems":3,"type":"array","items":{"type":"string","enum":["minimal","modern","luxury","bold","playful","tech","vintage","organic","geometric","handmade"]}},"palette":{"default":"mono","type":"string","enum":["mono","navy","gold","warm","earth","pastel","vibrant","ocean","custom"]},"customColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"background":{"default":"white","type":"string","enum":["white","dark"]}},"required":["name"]},"mockupScene":{"type":"string","enum":["business_card","storefront","tshirt","tote","cup","phone","laptop","billboard","box","letterhead"]},"sourcePrompt":{"type":"string","maxLength":6000},"cloudTier":{"type":"string","maxLength":40},"voice":{"type":"object","properties":{"voice":{"default":"Sarah","type":"string","maxLength":80},"speakers":{"maxItems":4,"type":"array","items":{"type":"object","properties":{"key":{"type":"string","pattern":"^[1-4]$"},"voice":{"type":"string","maxLength":80},"face":{"type":"object","properties":{"x":{"type":"number","minimum":0,"maximum":1},"y":{"type":"number","minimum":0,"maximum":1}},"required":["x","y"]}},"required":["key","voice"]}},"stability":{"default":0.5,"type":"number","minimum":0,"maximum":1},"speed":{"default":1,"type":"number","minimum":0.7,"maximum":1.2},"language":{"type":"string","maxLength":5},"mix":{"default":"mix","type":"string","enum":["mix","replace"]},"originalVolume":{"default":0.25,"type":"number","minimum":0,"maximum":1},"fit":{"default":"extend","type":"string","enum":["extend","slow","trim"]},"lipsync":{"default":false,"type":"boolean"},"lipsyncEngine":{"default":"cloud","type":"string","enum":["cloud","local"]}}},"audioAssetId":{"type":"string"},"voiceCloneId":{"type":"string"},"dub":{"type":"object","properties":{"targetLang":{"type":"string","enum":["he","en","ar","ru","fr","es","de","it","pt","nl","pl","tr","uk","el","ro","cs","sv","hi","zh","ja","ko","id"]},"sourceLang":{"type":"string","maxLength":5}},"required":["targetLang"]},"music":{"type":"object","properties":{"lyrics":{"default":"","type":"string","maxLength":3000},"instrumental":{"default":false,"type":"boolean"},"seconds":{"default":60,"type":"integer","minimum":10,"maximum":300},"premium":{"default":false,"type":"boolean"}}},"videoProjectId":{"type":"string"},"render":{"type":"object","properties":{"width":{"default":1920,"type":"integer","minimum":240,"maximum":3840},"height":{"default":1080,"type":"integer","minimum":240,"maximum":3840},"preview":{"default":false,"type":"boolean"},"label":{"type":"string","maxLength":40}}},"editClipId":{"type":"string","maxLength":40},"editMode":{"type":"string","enum":["version","append"]},"editStrength":{"type":"number","minimum":0.3,"maximum":1},"editKind":{"type":"string","enum":["remove_object","replace_background","instruction"]},"editEngine":{"type":"string","maxLength":40},"motionOrientation":{"type":"string","enum":["image","video"]},"outpaint":{"type":"object","properties":{"top":{"default":0,"type":"integer","minimum":0,"maximum":1024},"right":{"default":0,"type":"integer","minimum":0,"maximum":1024},"bottom":{"default":0,"type":"integer","minimum":0,"maximum":1024},"left":{"default":0,"type":"integer","minimum":0,"maximum":1024}}}},"required":["task"]},"ImportAssetRequest":{"type":"object","properties":{"url":{"type":"string","maxLength":4000,"format":"uri"},"base64":{"type":"string","maxLength":40000000},"mimeType":{"type":"string","maxLength":80},"name":{"type":"string","maxLength":120},"kind":{"default":"upload","type":"string","enum":["upload","reference","brand","product"]},"projectId":{"type":["string","null"]}}}}},"paths":{"/api/me":{"get":{"summary":"The account behind the key","description":"Name, email, role, credit balance and saved preferences.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"email":{"type":"string"},"name":{"type":"string"},"role":{"type":"string"},"credits":{"type":"integer"}}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}},"required":["error"]}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}},"required":["error"]}}}}}}},"/api/me/ledger":{"get":{"summary":"Credit ledger","description":"The last 60 credit movements (grants, purchases, charges, refunds).","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object"}}}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}},"required":["error"]}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}},"required":["error"]}}}}}}},"/api/catalog":{"get":{"summary":"Everything the studio offers","description":"Tasks, looks (qualities), video styles with their tiers and credits, aspect ratios, product scenes, voices, voice cue tags, dubbing languages, logo options and limits. Labels are message keys unless `locale` is given.","parameters":[{"name":"locale","in":"query","description":"Return labels as text in this language (en, he) instead of message keys.","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}},"required":["error"]}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}},"required":["error"]}}}}}}},"/api/pricing":{"get":{"summary":"Quote a generation in credits","description":"Runs the real router in preview mode: exact credits, engine, model and the quality tiers available for that choice.","parameters":[{"name":"task","in":"query","description":"Task key (text_to_image, image_edit, text_to_video, text_to_speech, video_dub, logo …).","required":true,"schema":{"type":"string"}},{"name":"quality","in":"query","description":"Look for image tasks: standard, photorealistic, creative, illustration, grok, nanobanana, gptimage, seedream.","required":false,"schema":{"type":"string"}},{"name":"style","in":"query","description":"Video style: standard, cinematic, minimax, seedance, seedance25, seedancemini, grok, ltx.","required":false,"schema":{"type":"string"}},{"name":"tier","in":"query","description":"Cloud quality tier key (480p, 720p, 1080p, low, medium, high, 1k, 2k …).","required":false,"schema":{"type":"string"}},{"name":"seconds","in":"query","description":"Clip length for video tasks.","required":false,"schema":{"type":"integer"}},{"name":"count","in":"query","description":"How many results (1–4).","required":false,"schema":{"type":"integer"}},{"name":"chars","in":"query","description":"Script length for text_to_speech.","required":false,"schema":{"type":"string"}},{"name":"dubLang","in":"query","description":"Target language for video_dub.","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"credits":{"type":"integer"},"engine":{"type":"string"},"costUsd":{"type":["number","null"]},"tier":{"type":["string","null"]},"tiers":{"type":"array","items":{"type":"object"}},"seconds":{"type":"integer"},"durations":{"type":"array","items":{"type":"integer"}}}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}},"required":["error"]}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}},"required":["error"]}}}}}}},"/api/generations":{"post":{"summary":"Start a generation","description":"Validates, moderates, routes, charges credits and queues the job. Non-English prompts are translated and enhanced automatically (the original stays on the job). Returns the job immediately; poll /api/jobs/{id}.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerationRequest"}}}},"responses":{"201":{"description":"Queued","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Job"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}},"required":["error"]}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}},"required":["error"]}}}},"402":{"description":"Not enough credits","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}},"required":["error"]}}}}}}},"/api/jobs":{"get":{"summary":"Recent jobs","parameters":[{"name":"limit","in":"query","description":"Max items (default 30).","required":false,"schema":{"type":"integer"}},{"name":"active","in":"query","description":"1 = only jobs still running.","required":false,"schema":{"type":"string"}},{"name":"projectId","in":"query","description":"Only jobs of this project.","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/Job"}}}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}},"required":["error"]}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}},"required":["error"]}}}}}}},"/api/jobs/{id}":{"get":{"summary":"One job with its outputs","parameters":[{"name":"id","in":"path","required":true,"description":"Job id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Job"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}},"required":["error"]}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}},"required":["error"]}}}},"404":{"description":"Not found"}}},"delete":{"summary":"Cancel a running job","description":"Credits are refunded for work that did not run.","parameters":[{"name":"id","in":"path","required":true,"description":"Job id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Job"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}},"required":["error"]}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}},"required":["error"]}}}}}}},"/api/jobs/{id}/details":{"get":{"summary":"Generation details","description":"Timeline of what happened, the translated prompt, engine, model and provider cost.","parameters":[{"name":"id","in":"path","required":true,"description":"Job id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}},"required":["error"]}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}},"required":["error"]}}}}}}},"/api/search":{"get":{"summary":"Semantic search in the library","description":"The account's creations closest in meaning to a query, in any language: prompts, names and (with a multimodal model) what the picture shows. Each hit carries the asset, a relevance score and the matching words.","parameters":[{"name":"q","in":"query","description":"What to look for.","required":false,"schema":{"type":"string"}},{"name":"limit","in":"query","description":"Max results (default 24).","required":false,"schema":{"type":"integer"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"enabled":{"type":"boolean"},"reranked":{"type":"boolean"},"items":{"type":"array","items":{"type":"object","properties":{"asset":{"$ref":"#/components/schemas/Asset"},"score":{"type":"number"},"snippet":{"type":"string"}}}}}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}},"required":["error"]}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}},"required":["error"]}}}}}}},"/api/assets":{"get":{"summary":"Library","parameters":[{"name":"q","in":"query","description":"Search in names and prompts.","required":false,"schema":{"type":"string"}},{"name":"kind","in":"query","description":"upload | reference | brand | product | output","required":false,"schema":{"type":"string"}},{"name":"mediaType","in":"query","description":"image | video | audio","required":false,"schema":{"type":"string"}},{"name":"task","in":"query","description":"Only outputs of this task.","required":false,"schema":{"type":"string"}},{"name":"favorite","in":"query","description":"1 = favourites only.","required":false,"schema":{"type":"string"}},{"name":"projectId","in":"query","description":"Project id, or `none` for unfiled.","required":false,"schema":{"type":"string"}},{"name":"cursor","in":"query","description":"Pagination cursor from the previous page.","required":false,"schema":{"type":"string"}},{"name":"limit","in":"query","description":"Page size (default 40).","required":false,"schema":{"type":"integer"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/Asset"}},"nextCursor":{"type":["string","null"]}}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}},"required":["error"]}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}},"required":["error"]}}}}}}},"/api/assets/{id}":{"get":{"summary":"One asset","parameters":[{"name":"id","in":"path","required":true,"description":"Asset id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Asset"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}},"required":["error"]}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}},"required":["error"]}}}}}},"patch":{"summary":"Rename, favourite or move an asset","parameters":[{"name":"id","in":"path","required":true,"description":"Asset id","schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"favorite":{"type":"boolean"},"projectId":{"type":["string","null"]}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Asset"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}},"required":["error"]}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}},"required":["error"]}}}}}},"delete":{"summary":"Delete an asset","parameters":[{"name":"id","in":"path","required":true,"description":"Asset id","schema":{"type":"string"}}],"responses":{"204":{"description":"Deleted"},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}},"required":["error"]}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}},"required":["error"]}}}}}}},"/api/assets/import":{"post":{"summary":"Add a file from a URL or base64","description":"For clients that cannot post multipart forms. Images up to 25 MB, video up to 600 MB (normalised to mp4), audio kept as mp3. The asset id can then be used as inputAssetIds / audioAssetId.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportAssetRequest"}}}},"responses":{"201":{"description":"Stored","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Asset"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}},"required":["error"]}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}},"required":["error"]}}}}}}},"/api/uploads":{"post":{"summary":"Upload a file (multipart)","description":"Form fields: `file` (image, video or audio), optional `kind` (upload | reference | brand | product) and `projectId`.","requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary"},"kind":{"type":"string"},"projectId":{"type":"string"}},"required":["file"]}}}},"responses":{"201":{"description":"Stored","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Asset"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}},"required":["error"]}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}},"required":["error"]}}}}}}},"/api/files/{key}":{"get":{"summary":"Download a stored file","description":"The `url` / `thumbUrl` of an asset points here. Supports Range requests. Needs the same Authorization header.","parameters":[{"name":"key","in":"path","required":true,"description":"Storage key from the asset url","schema":{"type":"string"}}],"responses":{"200":{"description":"The bytes"},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}},"required":["error"]}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}},"required":["error"]}}}}}}},"/api/projects":{"get":{"summary":"Projects","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object"}}}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}},"required":["error"]}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}},"required":["error"]}}}}}},"post":{"summary":"Create a project","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"description":{"type":"string"}},"required":["name"]}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}},"required":["error"]}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}},"required":["error"]}}}}}}},"/api/characters":{"get":{"summary":"Saved characters","description":"People kept consistent across images, from reference photos. `scope=public` lists the studio's shared character library (usable by everyone), `scope=all` both.","parameters":[{"name":"projectId","in":"query","description":"Only this project's characters.","required":false,"schema":{"type":"string"}},{"name":"scope","in":"query","description":"mine (default) | public | all","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object"}}}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}},"required":["error"]}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}},"required":["error"]}}}}}},"post":{"summary":"Create a character","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"description":{"type":"string"},"projectId":{"type":["string","null"]},"referenceAssetIds":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["name","referenceAssetIds"]}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}},"required":["error"]}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}},"required":["error"]}}}}}}},"/api/voices":{"get":{"summary":"Cloned voices","description":"The account's cloned voices (stock voices are listed in /api/catalog). Use `clone:<id>` as the voice.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object"}}}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}},"required":["error"]}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}},"required":["error"]}}}}}},"post":{"summary":"Register a voice clone","description":"Then start a `voice_clone` generation with voiceCloneId and audioAssetId (10 s – 5 min of clean speech).","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"sampleAssetId":{"type":"string"}},"required":["name","sampleAssetId"]}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}},"required":["error"]}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}},"required":["error"]}}}}}}},"/api/me/api-keys":{"get":{"summary":"List API keys (masked)","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}},"required":["error"]}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}},"required":["error"]}}}}}},"post":{"summary":"Create an API key","description":"The plain key is returned once.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"}},"required":["name"]}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}},"required":["error"]}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}},"required":["error"]}}}}}}},"/api/me/api-keys/{id}":{"delete":{"summary":"Revoke an API key","parameters":[{"name":"id","in":"path","required":true,"description":"Key id","schema":{"type":"string"}}],"responses":{"204":{"description":"Revoked"},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}},"required":["error"]}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}},"required":["error"]}}}}}}}}}