{"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/fooocus/image-prompt":{"post":{"operationId":"runFooocusImagePrompt","tags":["Run"],"summary":"Run Fooocus Image Prompt","description":"Fooocus variant driven by up to four image prompts, with inpaint and upscale options as well Price: $0.085 / 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/FooocusImagePromptInput"}}}},"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/FooocusImagePromptOutput"},{"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/FooocusImagePromptOutput"},{"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/fooocus/image-prompt":{"post":{"operationId":"quoteFooocusImagePrompt","tags":["Run"],"summary":"Quote Fooocus Image Prompt","description":"Price: $0.085 / image.","security":[{},{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FooocusImagePromptInput"}}}},"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"}}},"FooocusImagePromptInput":{"properties":{"aspect_ratio":{"default":"1024x1024","description":"Output image dimensions, selected from presets or specified as custom width and height. Both custom dimensions must be divisible by 8.","title":"Aspect Ratio","type":"string"},"enable_safety_checker":{"default":true,"description":"Safety checker toggle; setting it to false disables checking.","title":"Enable Safety Checker","type":"boolean"},"guidance_scale":{"default":4,"description":"Prompt-adherence strength for image selection, expressed as CFG (Classifier Free Guidance).","maximum":30,"minimum":1,"title":"Guidance Scale","type":"number"},"image_prompt_1":{"properties":{"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url"},"stop_at":{"default":0.5,"maximum":1,"minimum":0,"title":"Stop At","type":"number"},"type":{"default":"ImagePrompt","enum":["ImagePrompt","PyraCanny","CPDS","FaceSwap"],"title":"Type","type":"string"},"weight":{"default":1,"maximum":2,"minimum":0,"title":"Weight","type":"number"}},"title":"ImagePrompt","type":"object","x-doitong-order":["type","image_url","stop_at","weight"]},"image_prompt_2":{"properties":{"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url"},"stop_at":{"default":0.5,"maximum":1,"minimum":0,"title":"Stop At","type":"number"},"type":{"default":"ImagePrompt","enum":["ImagePrompt","PyraCanny","CPDS","FaceSwap"],"title":"Type","type":"string"},"weight":{"default":1,"maximum":2,"minimum":0,"title":"Weight","type":"number"}},"title":"ImagePrompt","type":"object","x-doitong-order":["type","image_url","stop_at","weight"]},"image_prompt_3":{"properties":{"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url"},"stop_at":{"default":0.5,"maximum":1,"minimum":0,"title":"Stop At","type":"number"},"type":{"default":"ImagePrompt","enum":["ImagePrompt","PyraCanny","CPDS","FaceSwap"],"title":"Type","type":"string"},"weight":{"default":1,"maximum":2,"minimum":0,"title":"Weight","type":"number"}},"title":"ImagePrompt","type":"object","x-doitong-order":["type","image_url","stop_at","weight"]},"image_prompt_4":{"properties":{"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url"},"stop_at":{"default":0.5,"maximum":1,"minimum":0,"title":"Stop At","type":"number"},"type":{"default":"ImagePrompt","enum":["ImagePrompt","PyraCanny","CPDS","FaceSwap"],"title":"Type","type":"string"},"weight":{"default":1,"maximum":2,"minimum":0,"title":"Weight","type":"number"}},"title":"ImagePrompt","type":"object","x-doitong-order":["type","image_url","stop_at","weight"]},"inpaint_additional_prompt":{"default":"","description":"Description of the desired inpainting content.","title":"Inpaint Additional Prompt","type":"string"},"inpaint_image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Reference image used during inpainting.","title":"Inpaint Image URL"},"inpaint_mode":{"default":"Inpaint or Outpaint (default)","description":"Mode applied during inpainting.","enum":["Inpaint or Outpaint (default)","Improve Detail (face, hand, eyes, etc.)","Modify Content (add objects, change background, etc.)"],"title":"Inpaint Mode","type":"string"},"loras":{"default":[{"path":"https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0/resolve/main/sd_xl_offset_example-lora_1.0.safetensors","scale":0.1}],"description":"LoRA selection merged for final image generation, limited to 5 LoRAs.","items":{"properties":{"path":{"description":"Location of the LoRA weights, specified as a URL or path.","examples":["https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0/resolve/main/sd_xl_offset_example-lora_1.0.safetensors"],"title":"Path","type":"string"},"scale":{"default":0.1,"description":"Multiplier applied to the LoRA weight before it is merged into the base model.","maximum":1,"minimum":0,"title":"Scale","type":"number"}},"required":["path"],"title":"LoraWeight","type":"object","x-doitong-order":["path","scale"]},"title":"Loras","type":"array"},"mask_image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Mask image applied during image generation.","title":"Mask Image URL"},"mixing_image_prompt_and_inpaint":{"default":false,"description":"Combines Image Prompt with Inpaint.","title":"Mixing Image Prompt and Inpaint","type":"boolean"},"mixing_image_prompt_and_vary_upscale":{"default":false,"description":"Combines Image Prompt with Vary/Upscale.","title":"Mixing Image Prompt and Vary/Upscale","type":"boolean"},"negative_prompt":{"default":"","description":"Negative prompt specifying image details to exclude, including colors, objects, scenery, or finer features. Examples include a moustache, blur, or low resolution.","examples":["(worst quality, low quality, normal quality, lowres, low details, oversaturated, undersaturated, overexposed, underexposed, grayscale, bw, bad photo, bad photography, bad art:1.4), (watermark, signature, text font, username, error, logo, words, letters, digits, autograph, trademark, name:1.2), (blur, blurry, grainy), morbid, ugly, asymmetrical, mutated malformed, mutilated, poorly lit, bad shadow, draft, cropped, out of frame, cut off, censored, jpeg artifacts, out of focus, glitch, duplicate, (airbrushed, cartoon, anime, semi-realistic, cgi, render, blender, digital art, manga, amateur:1.3), (3D ,3D Game, 3D Game Scene, 3D Character:1.1), (bad hands, bad anatomy, bad body, bad face, bad teeth, bad arms, bad legs, deformities:1.3)"],"title":"Negative Prompt","type":"string"},"num_images":{"default":1,"description":"Image count to generate per request.","maximum":4,"minimum":1,"title":"Num Images","type":"integer","x-doitong-alias":"num_outputs"},"outpaint_selections":{"default":[],"description":"Directions in which outpainting extends the image.","items":{"enum":["Left","Right","Top","Bottom"],"type":"string"},"title":"Outpaint Direction","type":"array","uniqueItems":true},"output_format":{"default":"jpeg","description":"File format for the resulting image.","enum":["png","jpeg","webp"],"title":"Output Format","type":"string"},"performance":{"default":"Extreme Speed","description":"Performance choice: Speed or Quality.","enum":["Speed","Quality","Extreme Speed","Lightning"],"title":"Performance","type":"string"},"prompt":{"default":"","description":"Describe the image you want generated, using as much detail as possible to get the best results.","examples":["pikachu"],"title":"Prompt","type":"string"},"refiner_model":{"default":"None","description":"Refiner selection: SDXL or SD 1.5.","enum":["None","realisticVisionV60B1_v51VAE.safetensors"],"title":"Refiner Model","type":"string"},"refiner_switch":{"default":0.8,"description":"Refiner switch value: use 0.4 with realistic SD1.5 models, 0.667 with anime SD1.5 models, and 0.8 with XL-refiners. Switching between two SDXL models permits any value.","maximum":1,"minimum":0,"multipleOf":0.0001,"title":"Refiner Switch At","type":"number"},"seed":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Seed for reproducing images in Stable Diffusion. An image can be reproduced exactly on every run by keeping the model version, prompt, and seed unchanged.","examples":[176400],"title":"Seed"},"sharpness":{"default":2,"description":"Sharpness setting for the output image. Increasing it makes both the image and its textures sharper.","maximum":30,"minimum":0,"title":"Sharpness","type":"number"},"styles":{"default":["Fooocus Enhance","Fooocus Sharp","Fooocus V2"],"description":"Style applied during generation.","items":{"enum":["Fooocus V2","Fooocus Enhance","Fooocus Sharp","Fooocus Semi Realistic","Fooocus Masterpiece","Fooocus Photograph","Fooocus Negative","Fooocus Cinematic","SAI 3D Model","SAI Analog Film","SAI Anime","SAI Cinematic","SAI Comic Book","SAI Craft Clay","SAI Digital Art","SAI Enhance","SAI Fantasy Art","SAI Isometric","SAI Line Art","SAI Lowpoly","SAI Neonpunk","SAI Origami","SAI Photographic","SAI Pixel Art","SAI Texture","MRE Cinematic Dynamic","MRE Spontaneous Picture","MRE Artistic Vision","MRE Dark Dream","MRE Gloomy Art","MRE Bad Dream","MRE Underground","MRE Surreal Painting","MRE Dynamic Illustration","MRE Undead Art","MRE Elemental Art","MRE Space Art","MRE Ancient Illustration","MRE Brave Art","MRE Heroic Fantasy","MRE Dark Cyberpunk","MRE Lyrical Geometry","MRE Sumi E Symbolic","MRE Sumi E Detailed","MRE Manga","MRE Anime","MRE Comic","Ads Advertising","Ads Automotive","Ads Corporate","Ads Fashion Editorial","Ads Food Photography","Ads Gourmet Food Photography","Ads Luxury","Ads Real Estate","Ads Retail","Artstyle Abstract","Artstyle Abstract Expressionism","Artstyle Art Deco","Artstyle Art Nouveau","Artstyle Constructivist","Artstyle Cubist","Artstyle Expressionist","Artstyle Graffiti","Artstyle Hyperrealism","Artstyle Impressionist","Artstyle Pointillism","Artstyle Pop Art","Artstyle Psychedelic","Artstyle Renaissance","Artstyle Steampunk","Artstyle Surrealist","Artstyle Typography","Artstyle Watercolor","Futuristic Biomechanical","Futuristic Biomechanical Cyberpunk","Futuristic Cybernetic","Futuristic Cybernetic Robot","Futuristic Cyberpunk Cityscape","Futuristic Futuristic","Futuristic Retro Cyberpunk","Futuristic Retro Futurism","Futuristic Sci Fi","Futuristic Vaporwave","Game Bubble Bobble","Game Cyberpunk Game","Game Fighting Game","Game Gta","Game Mario","Game Minecraft","Game Pokemon","Game Retro Arcade","Game Retro Game","Game Rpg Fantasy Game","Game Strategy Game","Game Streetfighter","Game Zelda","Misc Architectural","Misc Disco","Misc Dreamscape","Misc Dystopian","Misc Fairy Tale","Misc Gothic","Misc Grunge","Misc Horror","Misc Kawaii","Misc Lovecraftian","Misc Macabre","Misc Manga","Misc Metropolis","Misc Minimalist","Misc Monochrome","Misc Nautical","Misc Space","Misc Stained Glass","Misc Techwear Fashion","Misc Tribal","Misc Zentangle","Papercraft Collage","Papercraft Flat Papercut","Papercraft Kirigami","Papercraft Paper Mache","Papercraft Paper Quilling","Papercraft Papercut Collage","Papercraft Papercut Shadow Box","Papercraft Stacked Papercut","Papercraft Thick Layered Papercut","Photo Alien","Photo Film Noir","Photo Glamour","Photo Hdr","Photo Iphone Photographic","Photo Long Exposure","Photo Neon Noir","Photo Silhouette","Photo Tilt Shift","Cinematic Diva","Abstract Expressionism","Academia","Action Figure","Adorable 3D Character","Adorable Kawaii","Art Deco","Art Nouveau","Astral Aura","Avant Garde","Baroque","Bauhaus Style Poster","Blueprint Schematic Drawing","Caricature","Cel Shaded Art","Character Design Sheet","Classicism Art","Color Field Painting","Colored Pencil Art","Conceptual Art","Constructivism","Cubism","Dadaism","Dark Fantasy","Dark Moody Atmosphere","Dmt Art Style","Doodle Art","Double Exposure","Dripping Paint Splatter Art","Expressionism","Faded Polaroid Photo","Fauvism","Flat 2d Art","Fortnite Art Style","Futurism","Glitchcore","Glo Fi","Googie Art Style","Graffiti Art","Harlem Renaissance Art","High Fashion","Idyllic","Impressionism","Infographic Drawing","Ink Dripping Drawing","Japanese Ink Drawing","Knolling Photography","Light Cheery Atmosphere","Logo Design","Luxurious Elegance","Macro Photography","Mandola Art","Marker Drawing","Medievalism","Minimalism","Neo Baroque","Neo Byzantine","Neo Futurism","Neo Impressionism","Neo Rococo","Neoclassicism","Op Art","Ornate And Intricate","Pencil Sketch Drawing","Pop Art 2","Rococo","Silhouette Art","Simple Vector Art","Sketchup","Steampunk 2","Surrealism","Suprematism","Terragen","Tranquil Relaxing Atmosphere","Sticker Designs","Vibrant Rim Light","Volumetric Lighting","Watercolor 2","Whimsical And Playful","Mk Chromolithography","Mk Cross Processing Print","Mk Dufaycolor Photograph","Mk Herbarium","Mk Punk Collage","Mk Mosaic","Mk Van Gogh","Mk Coloring Book","Mk Singer Sargent","Mk Pollock","Mk Basquiat","Mk Andy Warhol","Mk Halftone Print","Mk Gond Painting","Mk Albumen Print","Mk Aquatint Print","Mk Anthotype Print","Mk Inuit Carving","Mk Bromoil Print","Mk Calotype Print","Mk Color Sketchnote","Mk Cibulak Porcelain","Mk Alcohol Ink Art","Mk One Line Art","Mk Blacklight Paint","Mk Carnival Glass","Mk Cyanotype Print","Mk Cross Stitching","Mk Encaustic Paint","Mk Embroidery","Mk Gyotaku","Mk Luminogram","Mk Lite Brite Art","Mk Mokume Gane","Pebble Art","Mk Palekh","Mk Suminagashi","Mk Scrimshaw","Mk Shibori","Mk Vitreous Enamel","Mk Ukiyo E","Mk Vintage Airline Poster","Mk Vintage Travel Poster","Mk Bauhaus Style","Mk Afrofuturism","Mk Atompunk","Mk Constructivism","Mk Chicano Art","Mk De Stijl","Mk Dayak Art","Mk Fayum Portrait","Mk Illuminated Manuscript","Mk Kalighat Painting","Mk Madhubani Painting","Mk Pictorialism","Mk Pichwai Painting","Mk Patachitra Painting","Mk Samoan Art Inspired","Mk Tlingit Art","Mk Adnate Style","Mk Ron English Style","Mk Shepard Fairey Style"],"type":"string"},"title":"Styles","type":"array","uniqueItems":true},"uov_image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Source image for upscaling or variation.","title":"UOV Image URL"},"uov_method":{"default":"Disabled","description":"Method applied for upscaling or creating variations.","enum":["Disabled","Vary (Subtle)","Vary (Strong)","Upscale (1.5x)","Upscale (2x)","Upscale (Fast 2x)"],"title":"UOV Method","type":"string"}},"required":["image_prompt_1"],"title":"FooocusImagePromptInput","type":"object","x-doitong-order":["prompt","negative_prompt","styles","performance","guidance_scale","sharpness","aspect_ratio","num_images","loras","refiner_model","refiner_switch","output_format","seed","image_prompt_1","image_prompt_2","image_prompt_3","image_prompt_4","inpaint_image_url","mask_image_url","inpaint_mode","inpaint_additional_prompt","outpaint_selections","mixing_image_prompt_and_inpaint","uov_image_url","uov_method","mixing_image_prompt_and_vary_upscale","enable_safety_checker"]},"FooocusImagePromptOutput":{"properties":{"has_nsfw_concepts":{"description":"Indicates whether NSFW concepts appear in the generated images.","items":{"type":"boolean"},"title":"Has Nsfw Concepts","type":"array"},"images":{"description":"File information for the generated 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"},"timings":{"additionalProperties":{"type":"number"},"description":"Elapsed time for generation.","title":"Timings","type":"object"}},"required":["images","timings","has_nsfw_concepts"],"title":"FooocusOutput","type":"object","x-doitong-order":["images","timings","has_nsfw_concepts"]}}}}