{"openapi":"3.1.0","jsonSchemaDialect":"https://json-schema.org/draft/2020-12/schema","info":{"title":"Doitong Models API","version":"2026-10-20","summary":"Image, video, audio and other AI models behind one REST interface, priced like the upstream in USD.","description":"One POST /run/{model} for every model (add ?wait= to get the result in the same call), one GET /requests/{id} for status, exact prices from POST /quote/{model}, output files on our storage (kept forever, paid per GB-month, or 7 days for free: the account setting or ?storage=) and signed webhooks. Model ids contain slashes; they are written as is in the path. Prices are API credits paid from the account's API balance: 1000 API credits = 1 USD, every price object carries the USD amount (add ?currency=rub for roubles). Typed per-model paths: this document carries the featured models by default; add ?category=<id>, ?model=<id> or ?models=all for others (the generic /run/{model_id} accepts every model of GET /models).","contact":{"name":"Doitong","url":"https://doitong.com/developers"}},"servers":[{"url":"https://api.doitong.ru/v1","description":"Doitong API"}],"security":[{"bearerAuth":[]}],"tags":[{"name":"Models","description":"The model catalog."},{"name":"Run","description":"Quote and run models."},{"name":"Requests","description":"Status, results and cancellation of runs."},{"name":"Files","description":"Upload input files."},{"name":"Account","description":"API balance (API credits), key limits and file storage."},{"name":"MCP","description":"Model Context Protocol endpoint for AI agents."}],"paths":{"/models":{"get":{"operationId":"listModels","tags":["Models"],"summary":"List models","security":[],"parameters":[{"name":"q","in":"query","required":false,"description":"Words that must all appear in the id, name, maker or tags.","schema":{"type":"string"}},{"name":"category","in":"query","required":false,"description":"Category id.","schema":{"type":"string","enum":["text-to-image","image-to-image","text-to-video","image-to-video","reference-to-video","video-to-video","lipsync","upscale","background-removal","text-to-speech","speech-to-text","text-to-music","audio","video-to-audio","image-to-3d","text-to-3d","3d","training","llm","vision","other"]}},{"name":"lab","in":"query","required":false,"description":"Model maker, by name or slug (any case).","schema":{"type":"string"}},{"name":"family","in":"query","required":false,"description":"Variants group id (the family field of a model).","schema":{"type":"string"}},{"name":"mode","in":"query","required":false,"description":"Price mode.","schema":{"type":"string","enum":["exact","measured","estimate","metered"]}},{"$ref":"#/components/parameters/Limit"},{"name":"cursor","in":"query","required":false,"description":"next_cursor of the previous page.","schema":{"type":"string"}},{"$ref":"#/components/parameters/Currency"}],"responses":{"200":{"description":"A page of models.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModelList"}}}},"400":{"$ref":"#/components/responses/Error"}}}},"/models/{model_id}":{"get":{"operationId":"getModel","tags":["Models"],"summary":"Get a model","security":[],"parameters":[{"$ref":"#/components/parameters/ModelId"},{"$ref":"#/components/parameters/Currency"}],"responses":{"200":{"description":"The model.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModelDetail"}}}},"404":{"$ref":"#/components/responses/Error"}}}},"/categories":{"get":{"operationId":"listCategories","tags":["Models"],"summary":"List categories","security":[],"responses":{"200":{"description":"Categories that have models.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategoryList"}}}}}}},"/quote/{model_id}":{"post":{"operationId":"quoteModel","tags":["Run"],"summary":"Quote a run of any model","description":"Same body as run; returns the exact API credits and USD. A key is optional; with one the answer also says whether the API balance and the key can pay.","security":[{},{"bearerAuth":[]}],"parameters":[{"$ref":"#/components/parameters/ModelId"},{"$ref":"#/components/parameters/Currency"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModelInput"}}}},"responses":{"200":{"description":"The exact price.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Quote"}}}},"404":{"$ref":"#/components/responses/Error"},"422":{"$ref":"#/components/responses/Error"}}}},"/run/{model_id}":{"post":{"operationId":"runModel","tags":["Run"],"summary":"Run any model","parameters":[{"$ref":"#/components/parameters/ModelId"},{"$ref":"#/components/parameters/Wait"},{"name":"webhook_url","in":"query","required":false,"description":"https URL that receives a signed POST when the request finishes.","schema":{"type":"string","format":"uri"}},{"name":"storage","in":"query","required":false,"description":"Where the output files go: permanent (kept until deleted, paid per GB-month) or temporary (free, deleted after 7 days). Default: the account setting (GET /account → storage.mode).","schema":{"$ref":"#/components/schemas/StorageMode"}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Same key + same body returns the same request instead of a second charge.","schema":{"type":"string","maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModelInput"}}}},"responses":{"200":{"description":"Finished within wait, or an idempotent replay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Request"}}}},"202":{"description":"Accepted; poll GET /requests/{id}.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Request"}}}},"402":{"$ref":"#/components/responses/Error"},"409":{"$ref":"#/components/responses/Error"},"422":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"},"502":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"}}}},"/requests":{"get":{"operationId":"listRequests","tags":["Requests"],"summary":"List this account's requests","parameters":[{"$ref":"#/components/parameters/Limit"},{"name":"status","in":"query","required":false,"description":"Only this status.","schema":{"$ref":"#/components/schemas/RequestStatus"}},{"name":"model","in":"query","required":false,"description":"Only this model id.","schema":{"type":"string"}},{"name":"cursor","in":"query","required":false,"description":"next_cursor of the previous page.","schema":{"type":"string"}}],"responses":{"200":{"description":"Newest first.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RequestList"}}}},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"}}}},"/requests/{request_id}":{"get":{"operationId":"getRequest","tags":["Requests"],"summary":"Get a request","parameters":[{"$ref":"#/components/parameters/RequestId"},{"$ref":"#/components/parameters/Wait"},{"name":"logs","in":"query","required":false,"description":"Set to 1 to include the latest log lines.","schema":{"type":"string","enum":["0","1"]}}],"responses":{"200":{"description":"The request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Request"}}}},"404":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"}}}},"/requests/{request_id}/cancel":{"post":{"operationId":"cancelRequest","tags":["Requests"],"summary":"Cancel a request","parameters":[{"$ref":"#/components/parameters/RequestId"}],"responses":{"200":{"description":"Canceled (refunded), or already canceled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CancelResult"}}}},"202":{"description":"The model is already working; cancellation was requested.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CancelResult"}}}},"404":{"$ref":"#/components/responses/Error"},"409":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"}}}},"/requests/{request_id}/files":{"delete":{"operationId":"deleteRequestFiles","tags":["Requests"],"summary":"Delete a request's output files","description":"Deletes our copies of the output files now and stops their storage charge. The request keeps its URLs with storage.expired = true. Idempotent; a request still running is a 409.","parameters":[{"$ref":"#/components/parameters/RequestId"}],"responses":{"200":{"description":"The request, files deleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Request"}}}},"404":{"$ref":"#/components/responses/Error"},"409":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"}}}},"/files":{"post":{"operationId":"createUpload","tags":["Files"],"summary":"Create an upload URL","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadRequest"}}}},"responses":{"201":{"description":"Upload with PUT, then pass file_url as a model input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Upload"}}}},"422":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"}}}},"/account":{"get":{"operationId":"getAccount","tags":["Account"],"summary":"API balance and key limits","parameters":[{"$ref":"#/components/parameters/Currency"}],"responses":{"200":{"description":"The account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Account"}}}},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"}}}},"/account/storage":{"patch":{"operationId":"updateStorageSettings","tags":["Account"],"summary":"Set the default file storage","description":"permanent (default): output files are kept until you delete them, 100 API credits per GB per month from the API balance. temporary: free, deleted after 7 days. Applies to new requests; ?storage= on a run overrides it.","parameters":[{"$ref":"#/components/parameters/Currency"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StorageSettingsUpdate"}}}},"responses":{"200":{"description":"The storage settings.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StorageSettings"}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"}}}},"/mcp":{"post":{"operationId":"mcp","tags":["MCP"],"summary":"MCP endpoint (JSON-RPC 2.0, Streamable HTTP)","description":"Tools: search_models, get_model, quote, run, get_request, cancel_request, list_requests, create_upload, get_account.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonRpcRequest"}}}},"responses":{"200":{"description":"JSON-RPC response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonRpcResponse"}}}},"202":{"description":"Notification accepted (no body)."},"401":{"description":"No API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonRpcResponse"}}}}}}},"/run/bria/fibo-2/generate":{"post":{"operationId":"runBriaFibo2Generate","tags":["Run"],"summary":"Run Fibo 2.0 Generate","description":"Text-to-image model that expands prompts into structured VGL, with style presets and a reference image mode Price: $0.04 / image.","parameters":[{"$ref":"#/components/parameters/Wait"},{"name":"webhook_url","in":"query","required":false,"description":"https URL that receives a signed POST when the request finishes.","schema":{"type":"string","format":"uri"}},{"name":"storage","in":"query","required":false,"description":"Where the output files go: permanent (kept until deleted, paid per GB-month) or temporary (free, deleted after 7 days). Default: the account setting (GET /account → storage.mode).","schema":{"$ref":"#/components/schemas/StorageMode"}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Same key + same body returns the same request instead of a second charge.","schema":{"type":"string","maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BriaFibo2GenerateInput"}}}},"responses":{"200":{"description":"Finished within wait, or an idempotent replay.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Request"},{"type":"object","properties":{"output":{"anyOf":[{"$ref":"#/components/schemas/BriaFibo2GenerateOutput"},{"type":"null"}]}}}]}}}},"202":{"description":"Accepted; poll GET /requests/{id}.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Request"},{"type":"object","properties":{"output":{"anyOf":[{"$ref":"#/components/schemas/BriaFibo2GenerateOutput"},{"type":"null"}]}}}]}}}},"402":{"$ref":"#/components/responses/Error"},"409":{"$ref":"#/components/responses/Error"},"422":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"},"502":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"}}}},"/quote/bria/fibo-2/generate":{"post":{"operationId":"quoteBriaFibo2Generate","tags":["Run"],"summary":"Quote Fibo 2.0 Generate","description":"Price: $0.04 / image.","security":[{},{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BriaFibo2GenerateInput"}}}},"responses":{"200":{"description":"The exact price.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Quote"}}}},"404":{"$ref":"#/components/responses/Error"},"422":{"$ref":"#/components/responses/Error"}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"API key (doitong_…) as \"Authorization: Bearer <key>\". \"X-API-Key: <key>\" also works."}},"parameters":{"ModelId":{"name":"model_id","in":"path","required":true,"description":"Model id; may contain slashes (e.g. flux/schnell), written as is.","schema":{"type":"string"}},"RequestId":{"name":"request_id","in":"path","required":true,"schema":{"type":"string","pattern":"^req_[a-z0-9]+$"}},"Limit":{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100}},"Currency":{"name":"currency","in":"query","required":false,"description":"rub adds rouble amounts (rate × 1.3) next to USD; usd leaves them out. Default: rub on api.doitong.ru and doitong.ru, usd elsewhere.","schema":{"type":"string","enum":["usd","rub"]}},"Wait":{"name":"wait","in":"query","required":false,"description":"Hold the call up to this many seconds (max 20) and return the finished request if it completes in time.","schema":{"type":"number","minimum":0,"maximum":20}}},"responses":{"Error":{"description":"Error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"schemas":{"ModelInput":{"type":"object","additionalProperties":true,"description":"The model's parameters. See GET /models/{model_id} for its input_schema."},"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["type","code","message"],"properties":{"type":{"type":"string","enum":["invalid_request","authentication_error","permission_error","not_found","insufficient_credits","budget_exceeded","conflict","rate_limited","upstream_error","service_unavailable","internal_error"]},"code":{"type":"string"},"message":{"type":"string"},"param":{"type":["string","null"]},"details":{"type":"array","items":{"type":"object","properties":{"param":{"type":"string"},"message":{"type":"string"}}}},"request_id":{"type":["string","null"]},"doc_url":{"type":"string","format":"uri"}}}}},"Price":{"type":"object","description":"Unit price. 1000 API credits = 1 USD (the upstream price).","properties":{"credits":{"type":["number","null"],"description":"API credits per unit (exact prices may have decimals)."},"usd":{"type":["string","null"],"description":"USD per unit, e.g. \"0.112\"."},"rub":{"type":"string","description":"RUB per unit, only with currency=rub or on the RU hosts."},"unit":{"type":"string"},"from_credits":{"type":["integer","null"],"description":"Cheapest plausible single run, in API credits. For a metered model (charged by usage): the typical run, never above hold_credits; a run can settle lower."},"from_usd":{"type":["string","null"]},"from_rub":{"type":"string"},"display":{"type":["string","null"],"description":"e.g. \"$0.112 / second\"."},"credits_display":{"type":["string","null"],"description":"e.g. \"112 API credits / second\"."},"rub_display":{"type":"string","description":"e.g. \"≈ 14.56 ₽ / секунду\" (RU only)."},"mode":{"type":["string","null"],"enum":["exact","measured","estimate","metered",null],"description":"exact: the price is computed from the input; measured: from the length / size of the input files, read before the run; estimate: a flat price per run. All are what a run charges (POST /quote returns the exact amount). metered: charged by actual usage (tokens, seconds of generated speech, processing time) at this unit price — a run holds hold_credits at most and the rest is refunded after it."},"hold_credits":{"type":"integer","description":"metered only: the most a run with the default input can cost (POST /quote gives it for your input)."},"hold_usd":{"type":"string"},"typical_credits":{"type":"integer","description":"metered only: a typical run."},"typical_usd":{"type":"string"},"per":{"type":"string","description":"measured only: what the unit is counted on, e.g. input_video, input_audio, output_video, output_image."},"label":{"type":"string","description":"measured: e.g. \"Price per second of your input video\"; metered: \"Charged by usage\"."}}},"Model":{"type":"object","required":["id","name","category"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"lab":{"type":"string"},"category":{"type":"string"},"summary":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"output_kind":{"type":"string"},"thumbnail_url":{"type":["string","null"]},"price":{"$ref":"#/components/schemas/Price"},"docs_url":{"type":"string","format":"uri"},"family":{"type":["string","null"],"description":"Variants group (GET /models?family=)."}}},"ModelDetail":{"allOf":[{"$ref":"#/components/schemas/Model"},{"type":"object","properties":{"description":{"type":"string"},"family":{"type":["string","null"]},"input_schema":{"type":"object"},"output_schema":{"type":"object"},"required_params":{"type":"array","items":{"type":"string"}},"aliases":{"type":"object","additionalProperties":{"type":"string"}},"pricing":{"type":"object"},"example_input":{"type":"object"},"family_ids":{"type":"array","items":{"type":"string"}},"markdown_url":{"type":"string","format":"uri"}}}]},"ModelList":{"type":"object","required":["object","data"],"properties":{"object":{"const":"list"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Model"}},"has_more":{"type":"boolean"},"next_cursor":{"type":["string","null"]}}},"Category":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"count":{"type":"integer"}}},"CategoryList":{"type":"object","required":["object","data"],"properties":{"object":{"const":"list"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Category"}}}},"Quote":{"type":"object","required":["object","model","credits"],"properties":{"object":{"const":"quote"},"model":{"type":"string"},"credits":{"type":"integer","description":"API credits this run charges (1000 = 1 USD)."},"usd":{"type":"string","description":"The same amount in USD, e.g. \"0.56\"."},"rub":{"type":"string","description":"In roubles (rate × 1.3), only with currency=rub or on the RU hosts."},"unit":{"type":"string"},"quantity":{"type":"number"},"unit_credits":{"type":"number"},"mode":{"enum":["exact","measured","estimate","metered"],"description":"exact: priced from the input. measured: priced from the length / size of the input files, which were measured for this quote (see measurements; a run with the same files within an hour charges this). estimate: a flat price per run from the typical cost of this model. All are exactly what the run charges. metered: credits is the HOLD — the most this run can cost, debited when it starts; after the run it is settled to the actual usage and the rest is refunded automatically (see hold, typical, and the request's cost.settled)."},"hold":{"type":"object","description":"metered only: { credits, usd (, rub) } — the most the run can cost."},"typical":{"type":["object","null"],"description":"metered only: { credits, usd (, rub) } of a typical run."},"settlement":{"const":"usage","description":"metered only: the run is charged its actual usage."},"label":{"type":"string","description":"\"Price per run\", \"Estimated price per run\" or, measured, e.g. \"Price per second of your input video\"."},"measurements":{"type":"object","description":"measured only: per input param what was measured ({ seconds, width, height, fps, frames, kind })."},"display":{"type":["string","null"]},"breakdown":{"type":["string","null"]},"input":{"type":"object","description":"The normalized input that was priced."},"warnings":{"type":"array","items":{"type":"string"}},"balance_credits":{"type":"integer","description":"API balance in API credits. Only with an API key."},"balance_usd":{"type":"string","description":"Only with an API key."},"affordable":{"type":"boolean","description":"Only with an API key."},"key_budget_remaining":{"type":["integer","null"],"description":"Only with an API key; API credits; null when the key has no cap."},"top_up_url":{"type":"string","format":"uri","description":"Present when the API balance is too low."}}},"RequestStatus":{"type":"string","enum":["queued","running","succeeded","failed","canceled"]},"Output":{"type":"object","required":["type","url"],"properties":{"type":{"type":"string","enum":["image","video","audio","file","3d"]},"url":{"type":"string","format":"uri"},"content_type":{"type":["string","null"]},"file_size":{"type":["integer","null"]},"width":{"type":["integer","null"]},"height":{"type":["integer","null"]},"duration":{"type":["number","null"]},"stored":{"type":"boolean"},"expired":{"type":"boolean","description":"Present (true) once our copy was deleted; the URL no longer works."}}},"StorageMode":{"type":"string","enum":["permanent","temporary"]},"StorageSettingsUpdate":{"type":"object","required":["mode"],"additionalProperties":false,"properties":{"mode":{"$ref":"#/components/schemas/StorageMode"}}},"RequestStorage":{"type":"object","description":"Where the output files are kept (DESIGN.md §17).","properties":{"mode":{"$ref":"#/components/schemas/StorageMode"},"bytes":{"type":"integer","description":"Bytes of our copies of the output files."},"expires_at":{"type":["string","null"],"format":"date-time","description":"When the files are deleted (temporary); null when kept until you delete them."},"expired":{"type":"boolean","description":"true once the files were deleted."}}},"StorageSettings":{"type":"object","properties":{"object":{"type":"string","description":"\"storage_settings\" from PATCH /account/storage."},"mode":{"$ref":"#/components/schemas/StorageMode"},"price_credits_per_gb_month":{"type":"integer","description":"API credits per GB (1024^3 bytes) per month of permanent storage."},"price_usd_per_gb_month":{"type":"string"},"price_rub_per_gb_month":{"type":"string","description":"Only with currency=rub or on the RU hosts."},"temporary_retention_days":{"type":"integer"},"used_bytes":{"type":"integer","description":"Bytes kept permanently (billed)."},"used_gb":{"type":"string"},"expiring_bytes":{"type":"integer","description":"Bytes waiting to be deleted."},"monthly_estimate_credits":{"type":"integer"},"monthly_estimate_usd":{"type":"string"},"grace_started_at":{"type":["string","null"],"format":"date-time","description":"The API balance stopped covering storage at this time."},"grace_until":{"type":["string","null"],"format":"date-time","description":"Top up before this time, or the permanent files become temporary."}}},"Request":{"type":"object","required":["id","object","model","status"],"properties":{"id":{"type":"string"},"object":{"const":"request"},"model":{"type":"string"},"status":{"$ref":"#/components/schemas/RequestStatus"},"created_at":{"type":"string","format":"date-time"},"started_at":{"type":["string","null"],"format":"date-time"},"completed_at":{"type":["string","null"],"format":"date-time"},"queue_position":{"type":["integer","null"]},"cost":{"type":"object","description":"API credits (1000 = 1 USD).","properties":{"credits":{"type":"integer","description":"The quoted price (metered: the hold)."},"usd":{"type":"string","description":"The quoted price in USD."},"charged":{"type":"integer","description":"Debited from the API balance."},"refunded":{"type":"integer","description":"Given back (failure, cancel, or the unused part of a metered hold)."},"mode":{"const":"metered","description":"Only on metered requests."},"held":{"type":"integer","description":"metered only: the hold debited at the start."},"typical":{"type":"integer","description":"metered only: a typical run, API credits."},"settled":{"type":["object","null"],"description":"metered only, once the request succeeded: status settled (credits = what the usage cost = charged − refunded), pending, or no_usage (the model reported no usage: the hold stands).","properties":{"status":{"enum":["settled","pending","no_usage"]},"credits":{"type":"integer"},"usd":{"type":"string"},"quantity":{"type":"number","description":"Usage units billed."},"unit":{"type":"string","description":"e.g. 1000_tokens, audio_second, compute_second."},"unit_usd":{"type":"string"},"source":{"enum":["billed_usage","processing_time"]},"approximate":{"type":"boolean","description":"true when measured from the processing time."}}}}},"input":{"type":"object"},"output":{"type":["object","null"]},"outputs":{"type":"array","items":{"$ref":"#/components/schemas/Output"}},"error":{"anyOf":[{"type":"object","properties":{"type":{"type":"string"},"code":{"type":"string"},"message":{"type":"string"}}},{"type":"null"}]},"metrics":{"type":["object","null"]},"storage":{"$ref":"#/components/schemas/RequestStorage"},"logs":{"type":"array","items":{"type":"object"}},"urls":{"type":"object","properties":{"self":{"type":"string","format":"uri"},"cancel":{"type":"string","format":"uri"}}}}},"RequestList":{"type":"object","required":["object","data"],"properties":{"object":{"const":"list"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Request"}},"has_more":{"type":"boolean"},"next_cursor":{"type":["string","null"]}}},"CancelResult":{"allOf":[{"$ref":"#/components/schemas/Request"},{"type":"object","properties":{"cancel_requested":{"type":"boolean"}}}]},"UploadRequest":{"type":"object","required":["filename"],"properties":{"filename":{"type":"string","description":"The extension decides the type (jpg, png, webp, mp4, mov, webm)."},"content_type":{"type":"string"},"size":{"type":"integer","minimum":1,"description":"Bytes."}}},"Upload":{"type":"object","properties":{"object":{"const":"upload"},"upload_url":{"type":"string","format":"uri"},"file_url":{"type":"string","format":"uri"},"method":{"const":"PUT"},"headers":{"type":"object","additionalProperties":{"type":"string"}},"content_type":{"type":"string"},"expires_in":{"type":"integer"},"max_bytes":{"type":"integer"}}},"Account":{"type":"object","properties":{"object":{"const":"account"},"credits":{"type":"integer","description":"API balance in API credits (1000 = 1 USD). Separate from the Doitong app credits."},"balance":{"type":"object","properties":{"credits":{"type":"integer"},"usd":{"type":"string"},"rub":{"type":"string","description":"Only with currency=rub or on the RU hosts."}}},"top_up_url":{"type":"string","format":"uri"},"key":{"type":"object","properties":{"name":{"type":"string"},"prefix":{"type":"string"},"scopes":{"type":"array","items":{"type":"string"}},"budget_remaining":{"type":["integer","null"],"description":"API credits; null: no cap on the key, the API balance is the limit."},"rate_limit":{"type":"integer"},"rate_limit_remaining":{"type":"integer"}}},"webhook_signing_secret":{"type":"string","description":"HMAC-SHA256 secret of the Doitong-Signature header."},"storage":{"$ref":"#/components/schemas/StorageSettings"}}},"JsonRpcRequest":{"type":"object","required":["jsonrpc","method"],"properties":{"jsonrpc":{"const":"2.0"},"id":{"type":["string","integer","null"]},"method":{"type":"string"},"params":{"type":"object"}}},"JsonRpcResponse":{"type":"object","required":["jsonrpc"],"properties":{"jsonrpc":{"const":"2.0"},"id":{"type":["string","integer","null"]},"result":{"type":"object"},"error":{"type":"object"}}},"BriaFibo2GenerateInput":{"properties":{"aspect_ratio":{"default":"1:1","description":"Image proportions at approximately one megapixel. Available ratios: 1:1, 1:2, 1:3, 1:4, 1:5, 2:1, 2:3, 3:1, 3:2, 3:4, 4:1, 4:3, 4:5, 5:1, 5:4, 9:16, 9:21, 10:16, 16:9, 16:10, 21:9.","enum":["1:1","1:2","1:3","1:4","1:5","2:1","2:3","3:1","3:2","3:4","4:1","4:3","4:5","5:1","5:4","9:16","9:21","10:16","16:9","16:10","21:9"],"title":"Aspect Ratio","type":"string"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Reference image for inspire mode; cannot be combined with `vgl`. When `prompt` is supplied, VGL takes visual cues from the reference to create a new depiction of the prompted scene rather than reproduce the reference. Without `prompt`, VGL describes the reference itself, producing a close variation.","title":"Image Url","x-doitong-alias":"image"},"prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Generation request that specifies changes to 'vgl' when that document is supplied. Without it, the free-form description is expanded into a VGL document, which the response includes.","title":"Prompt"},"seed":{"default":5555,"description":"Seed controlling randomness for reproducible results, ranging from 0 through 2147483647.","maximum":2147483647,"minimum":0,"title":"Seed","type":"integer"},"style":{"anyOf":[{"enum":["Kodak Film","Hard Flash","Hazy Dreamy","Rough Realism"],"type":"string"},{"type":"null"}],"description":"Generated-image style available only with 'prompt'. Combining a style with 'image_url', 'vgl', or 'negative_prompt' is not supported.","title":"Style"},"vgl":{"anyOf":[{"properties":{"aesthetics":{"anyOf":[{"properties":{"color_scheme":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Color palette for the generated image.","title":"Color Scheme"},"composition":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Composition for the generated image.","title":"Composition"},"mood_atmosphere":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Mood and atmosphere for the generated image.","title":"Mood Atmosphere"}},"title":"Aesthetics","type":"object","x-doitong-order":["composition","color_scheme","mood_atmosphere"]},{"type":"null"}],"description":"Aesthetic qualities for the generated image."},"artistic_style":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Artistic style for the generated image.","title":"Artistic Style"},"background_setting":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Background setting for the generated image.","title":"Background Setting"},"context":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Context for the generated image.","title":"Context"},"lighting":{"anyOf":[{"properties":{"conditions":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Lighting conditions for the generated image.","title":"Conditions"},"direction":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Lighting direction for the generated image.","title":"Direction"},"shadows":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Shadows to depict in the generated image.","title":"Shadows"}},"title":"Lighting","type":"object","x-doitong-order":["conditions","direction","shadows"]},{"type":"null"}],"description":"Lighting for the generated image."},"objects":{"anyOf":[{"items":{"properties":{"action":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Action performed by the depicted object.","title":"Action"},"appearance_details":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Details describing the object's appearance.","title":"Appearance Details"},"clothing":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Clothing worn by the depicted object.","title":"Clothing"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Description of the intended output object.","title":"Description"},"expression":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Expression shown by the depicted object.","title":"Expression"},"gender":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Gender of the depicted object.","title":"Gender"},"location":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Object position within the image.","title":"Location"},"number_of_objects":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Count of objects within the image.","title":"Number Of Objects"},"orientation":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Orientation of the depicted object.","title":"Orientation"},"pose":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pose of the depicted object.","title":"Pose"},"relationship":{"description":"Object's relationship to the image's other objects.","title":"Relationship","type":"string"},"relative_size":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Object size relative to the image.","title":"Relative Size"},"shape_and_color":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Object's shape and color.","title":"Shape And Color"},"skin_tone_and_texture":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Skin texture and tone of the depicted object.","title":"Skin Tone And Texture"},"texture":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Object's texture.","title":"Texture"}},"required":["relationship"],"title":"PromptObject","type":"object","x-doitong-order":["description","location","relationship","relative_size","shape_and_color","texture","appearance_details","number_of_objects","pose","expression","clothing","action","gender","skin_tone_and_texture","orientation"]},"type":"array"},{"type":"null"}],"default":[],"description":"Specify the generated image's contents as a list, recording each object's attributes and its relationships with the other depicted objects.","title":"Objects"},"photographic_characteristics":{"anyOf":[{"properties":{"camera_angle":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Camera angle for the generated image.","title":"Camera Angle"},"depth_of_field":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Depth of field for the generated image.","title":"Depth Of Field"},"focus":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Focus for the generated image.","title":"Focus"},"lens_focal_length":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Lens setting for the generated image, expressed as a focal length.","title":"Lens Focal Length"}},"title":"PhotographicCharacteristics","type":"object","x-doitong-order":["depth_of_field","focus","camera_angle","lens_focal_length"]},{"type":"null"}],"description":"Photographic properties for the generated image."},"short_description":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Brief description of the intended output image.","title":"Short Description"},"style_medium":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Stylistic medium for the generated image.","title":"Style Medium"},"text_render":{"anyOf":[{"items":{"properties":{"appearance_details":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Additional noteworthy details about the text's appearance.","title":"Appearance Details"},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Color used for the text.","title":"Color"},"font":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Font style for the text.","title":"Font"},"location":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Text placement within the image.","title":"Location"},"size":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Text size within the image.","title":"Size"},"text":{"description":"Text for rendering, also presented visually to fibo-2 as an image to help reproduce the supplied wording exactly.","title":"Text","type":"string"}},"required":["text"],"title":"TextRender","type":"object","x-doitong-order":["text","location","size","color","font","appearance_details"]},"type":"array"},{"type":"null"}],"default":[],"description":"List of text entries to include in the image.","title":"Text Render"}},"title":"Vgl","type":"object","x-doitong-order":["short_description","objects","background_setting","lighting","aesthetics","photographic_characteristics","style_medium","text_render","context","artistic_style"]},{"type":"null"}],"description":"VGL (Visual Generation Language) document containing a structured JSON scene description; documents returned by earlier requests are accepted. Without `prompt`, it is rendered unchanged; with `prompt`, VGL refines the document according to the prompt before rendering. Cannot be combined with `image_url` or `style`.","examples":[{"aesthetics":{"color_scheme":"high contrast palette featuring saturated cobalt blues, warm golden-orange sunset tones, and neutral greys and whites","composition":"low angle shot, medium-tight framing cropped mid-thigh at the bottom, dynamic off-center placement following the rule of thirds","mood_atmosphere":"Y2K action-editorial energy, dynamic, confident, edgy, and cinematic"},"artistic_style":"realistic","background_setting":"Flat scrubby desert featuring sparse dry bushes, subtle footprints in the sand, and low dark silhouetted mountains along the horizon. The sky is a deep cobalt-blue with streaks of grey-violet clouds and a glowing orange and gold sunset band stretching along the left horizon.","context":"This is a concept for an early-2000s retro-futuristic fashion editorial photograph intended for a high-end style magazine spread.","lighting":{"conditions":"strong off-camera flash combined with ambient dusk twilight","direction":"front-lit from the front-left by the flash, contrasting with the backlit ambient sky","shadows":"a long, sharp shadow cast by the subject across the sand to the right"},"objects":[{"action":"twisting and looking back over her shoulder while swinging right arm","appearance_details":"glossy highlights on skin, windswept hair flying across her face, right arm swinging out behind with fingers spread","clothing":"fitted white ribbed tank top, loose light-grey cargo pants with large side pockets sitting low on hips, heavy silver chain necklace, wraparound mirrored silver sport sunglasses","description":"A young woman with shoulder-length dark brown hair, twisting mid-motion with her body turning away while looking back over her shoulder at the camera with slightly parted lips. She wears wraparound mirrored silver sport sunglasses, a heavy silver chain necklace, a fitted white ribbed tank top, and loose light-grey cargo pants with large side pockets.","expression":"confident, intense gaze with lips slightly parted","gender":"female","location":"center-right","orientation":"tilted dynamically, facing slightly left while head turns back","pose":"twisting mid-motion, turning body away while looking back over shoulder","relationship":"main subject of the photograph, commanding the frame","relative_size":"large within frame","shape_and_color":"dynamic human silhouette in white and grey with metallic accents","skin_tone_and_texture":"warm skin tone with glossy highlights from the flash","texture":"mixed textures of soft skin, ribbed cotton, heavy metallic links, and smooth synthetic sunglasses"},{"action":"billowing and suspended in the air","appearance_details":"individual sand grains sparkling under the hard flash light","description":"A burst of kicked-up sand billowing around her legs and to the lower left, with individual grains sharply frozen in mid-air by the flash.","location":"bottom-left foreground and surrounding legs","number_of_objects":1,"orientation":"scattered horizontally and vertically","relationship":"interacts with the model's movement, emphasizing action","relative_size":"medium","shape_and_color":"cloud-like amorphous cluster of sandy beige and golden-brown particles","texture":"grainy, particulate, and sharp"}],"photographic_characteristics":{"camera_angle":"low angle","depth_of_field":"moderately shallow, keeping the subject in sharp focus while the distant background mountains have a soft falloff","focus":"crisp, ultra-sharp focus on the ribbed fabric texture, chain links, sunglasses, and suspended sand grains","lens_focal_length":"wide-angle lens"},"short_description":"An early-2000s fashion editorial photograph capturing a young woman dynamically twisting in a desert at dusk. Lit by a strong off-camera flash against a deep cobalt-blue and orange sunset sky, she wears Y2K-inspired streetwear including mirrored silver sunglasses, a white ribbed tank top, and loose cargo pants, surrounded by kicked-up sand.","style_medium":"photograph"}],"title":"Vgl"}},"title":"GenerateInputModel","type":"object","x-doitong-order":["prompt","style","image_url","vgl","seed","aspect_ratio"]},"BriaFibo2GenerateOutput":{"properties":{"image":{"description":"Image produced by the model.","properties":{"content_type":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"MIME type identifying the file's content.","examples":["image/png"],"title":"Content Type"},"file_name":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"File name, generated automatically when omitted.","examples":["z9RV14K95DvU.png"],"title":"File Name"},"file_size":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"File size measured in bytes.","examples":[4404019],"title":"File Size"},"height":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"The height of the image in pixels.","examples":[1024],"title":"Height"},"url":{"description":"Download URL for the file.","title":"Url","type":"string"},"width":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"The width of the image in pixels.","examples":[1024],"title":"Width"}},"required":["url"],"title":"Image","type":"object","x-doitong-order":["url","content_type","file_name","file_size","width","height"]},"images":{"default":[],"description":"Image list matching the format returned by other FIBO apps; its sole entry is the same image.","items":{"description":"Represents an image file.","properties":{"content_type":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"MIME type identifying the file's content.","examples":["image/png"],"title":"Content Type"},"file_name":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"File name, generated automatically when omitted.","examples":["z9RV14K95DvU.png"],"title":"File Name"},"file_size":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"File size measured in bytes.","examples":[4404019],"title":"File Size"},"height":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"The height of the image in pixels.","examples":[1024],"title":"Height"},"url":{"description":"Download URL for the file.","title":"Url","type":"string"},"width":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"The width of the image in pixels.","examples":[1024],"title":"Width"}},"required":["url"],"title":"Image","type":"object","x-doitong-order":["url","content_type","file_name","file_size","width","height"]},"title":"Images","type":"array"},"vgl":{"additionalProperties":true,"description":"VGL used to produce the image.","examples":[{"aesthetics":{"color_scheme":"high contrast palette featuring saturated cobalt blues, warm golden-orange sunset tones, and neutral greys and whites","composition":"low angle shot, medium-tight framing cropped mid-thigh at the bottom, dynamic off-center placement following the rule of thirds","mood_atmosphere":"Y2K action-editorial energy, dynamic, confident, edgy, and cinematic"},"artistic_style":"realistic","background_setting":"Flat scrubby desert featuring sparse dry bushes, subtle footprints in the sand, and low dark silhouetted mountains along the horizon. The sky is a deep cobalt-blue with streaks of grey-violet clouds and a glowing orange and gold sunset band stretching along the left horizon.","context":"This is a concept for an early-2000s retro-futuristic fashion editorial photograph intended for a high-end style magazine spread.","lighting":{"conditions":"strong off-camera flash combined with ambient dusk twilight","direction":"front-lit from the front-left by the flash, contrasting with the backlit ambient sky","shadows":"a long, sharp shadow cast by the subject across the sand to the right"},"objects":[{"action":"twisting and looking back over her shoulder while swinging right arm","appearance_details":"glossy highlights on skin, windswept hair flying across her face, right arm swinging out behind with fingers spread","clothing":"fitted white ribbed tank top, loose light-grey cargo pants with large side pockets sitting low on hips, heavy silver chain necklace, wraparound mirrored silver sport sunglasses","description":"A young woman with shoulder-length dark brown hair, twisting mid-motion with her body turning away while looking back over her shoulder at the camera with slightly parted lips. She wears wraparound mirrored silver sport sunglasses, a heavy silver chain necklace, a fitted white ribbed tank top, and loose light-grey cargo pants with large side pockets.","expression":"confident, intense gaze with lips slightly parted","gender":"female","location":"center-right","orientation":"tilted dynamically, facing slightly left while head turns back","pose":"twisting mid-motion, turning body away while looking back over shoulder","relationship":"main subject of the photograph, commanding the frame","relative_size":"large within frame","shape_and_color":"dynamic human silhouette in white and grey with metallic accents","skin_tone_and_texture":"warm skin tone with glossy highlights from the flash","texture":"mixed textures of soft skin, ribbed cotton, heavy metallic links, and smooth synthetic sunglasses"},{"action":"billowing and suspended in the air","appearance_details":"individual sand grains sparkling under the hard flash light","description":"A burst of kicked-up sand billowing around her legs and to the lower left, with individual grains sharply frozen in mid-air by the flash.","location":"bottom-left foreground and surrounding legs","number_of_objects":1,"orientation":"scattered horizontally and vertically","relationship":"interacts with the model's movement, emphasizing action","relative_size":"medium","shape_and_color":"cloud-like amorphous cluster of sandy beige and golden-brown particles","texture":"grainy, particulate, and sharp"}],"photographic_characteristics":{"camera_angle":"low angle","depth_of_field":"moderately shallow, keeping the subject in sharp focus while the distant background mountains have a soft falloff","focus":"crisp, ultra-sharp focus on the ribbed fabric texture, chain links, sunglasses, and suspended sand grains","lens_focal_length":"wide-angle lens"},"short_description":"An early-2000s fashion editorial photograph capturing a young woman dynamically twisting in a desert at dusk. Lit by a strong off-camera flash against a deep cobalt-blue and orange sunset sky, she wears Y2K-inspired streetwear including mirrored silver sunglasses, a white ribbed tank top, and loose cargo pants, surrounded by kicked-up sand.","style_medium":"photograph"}],"title":"Vgl","type":"object"}},"required":["image","vgl"],"title":"GenerateOutputModel","type":"object","x-doitong-order":["image","images","vgl"]}}}}