درخواستها
یک درخواست، یک فراخوانی از یک مدل است. این درخواست یک شناسه (req_…)، یک وضعیت، هزینه آن برحسب اعتبار API (1000 = 1 USD) و در صورت موفقیت، فایلهای تولیدشده را دارد. همین شیء از همه نقطههای پایانی زیر و برای هر مدل برگردانده میشود.
یافتن یک مدل
کاتالوگ همه ۱٬۴۹۶ مدل بهصورت JSON عمومی است (به کلید نیاز ندارد):
curl "https://api.doitong.ru/v1/models?category=text-to-video&lab=Google&limit=20"
| پارامتر پرسوجو | معنا |
|---|---|
q |
واژههایی که باید همگی در نام، شناسه، سازنده یا برچسبها ظاهر شوند؛ مثلاً kling 3. |
category |
یک شناسه دسته؛ مثلاً text-to-video یا upscale. GET https://api.doitong.ru/v1/categories همه ۲۱ دسته را همراه تعدادشان فهرست میکند. |
lab |
سازنده مدل، بر اساس نام یا شناسه؛ مثلاً Google یا black-forest-labs. |
family |
یک شناسه family از ردیف قبلی: هر گونه از یک مدل (pro، fast، image-to-video، …). |
mode |
exact (قیمت از ورودی محاسبه میشود)، measured (بر اساس طول یا اندازه فایلهای ورودی)، estimate (قیمت تخمینی برای هر اجرا) یا metered (بر اساس مصرف واقعی، تا سقف هر اجرا). |
limit, cursor |
اندازه صفحه (1 تا 100، پیشفرض 50) و next_cursor صفحه قبلی. |
هر ردیف شامل id، name، lab، category، family، summary، tags، output_kind، docs_url و یک شیء price است (به قیمتگذاری مراجعه کنید). GET https://api.doitong.ru/v1/models/{model_id} طرحواره کامل JSON ورودی و خروجی، نامهای استاندارد پارامترها، قوانین قیمتگذاری و نمونه ورودی را اضافه میکند. category یا mode ناشناخته، 400 invalid_parameter است.
اجرای یک مدل
curl -X POST "https://api.doitong.ru/v1/run/{model_id}?wait=20" \
-H "Authorization: Bearer $DOITONG_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: order-1842-cover" \
-d '{"prompt": "..."}'
- بدنه، ورودی مدل و یک شیء JSON است. پارامترهای هر مدل در صفحه آن فهرست شدهاند.
- ورودی پیش از هرگونه دریافت هزینه بررسی میشود. ورودی نامعتبر
422 invalid_inputرا همراهparamمشکلدار برمیگرداند و هزینهای ندارد. ?wait=N(تا 20 ثانیه) فراخوانی را تا پایان درخواست یا اتمام زمان منتظر نگه میدارد.?webhook_url=https://…پس از پایان درخواست، یکPOSTامضاشده به آن نشانی میفرستد (به وبهوکها مراجعه کنید).?storage=permanentیا?storage=temporaryمدت نگهداری فایلهای خروجی را انتخاب میکند؛ در صورت نبود آن، تنظیم حساب اعمال میشود (به محل نگهداری فایلها مراجعه کنید).
پاسخ تا زمانی که درخواست در حال اجراست 202 Accepted و وقتی در محدوده زمان انتظار تمام شود 200 OK است (یا وقتی بازپخش باشد؛ پایینتر را ببینید). هدرهای Location و Doitong-Request-Id نشانی و شناسه درخواست را حمل میکنند.
وضعیتها
-
queuedپذیرفته و هزینه آن دریافت شده؛ در انتظار کارگر -
runningمدل در حال تولید است -
وضعیتهای نهایی:
succeededهزینه اعلامشده دریافت شد؛ outputs[] شامل URLهای فضای ذخیرهسازی ماستfailedبهصورت خودکار بازپرداخت شد؛ خطا دلیل را نشان میدهدcanceledپیش از نتیجه متوقف شد؛ بازپرداخت شد
| وضعیت | معنا | نهایی |
|---|---|---|
queued |
پذیرفته و هزینه دریافت شده و منتظر پردازشگر است. queue_position ممکن است جایگاه در صف را نشان دهد. |
خیر |
running |
مدل در حال تولید است. | خیر |
succeeded |
تمام شد. outputs فایلها را فهرست میکند. |
بله |
failed |
مدل یا یک محدودیت آن را متوقف کرده است. error دلیل را میگوید. اعتبار API بازپرداخت میشود. |
بله |
canceled |
پیش از تولید نتیجه لغو شد. اعتبار API بازپرداخت میشود. | بله |
درخواستی که بیشتر از محدودیت زمانی اجرا شود، با کد timeout ناموفق میشود و هزینهاش بازپرداخت میشود: برای تصویر 15 دقیقه، برای ویدیو 60 دقیقه، برای صوت و همه موارد دیگر 30 دقیقه.
شیء درخواست
{
"id": "req_8k2m4q7x1z9c3v5b6n0p2r4t",
"object": "request",
"model": "flux/schnell",
"status": "succeeded",
"created_at": "2026-10-20T12:00:00Z",
"started_at": "2026-10-20T12:00:01Z",
"completed_at": "2026-10-20T12:00:02Z",
"queue_position": null,
"cost": { "credits": 3, "usd": "0.003", "charged": 3, "refunded": 0 },
"input": { "prompt": "..." },
"output": { "images": [ { "url": "https://content.doitong.com/dev-api/…/0-output.jpeg", "width": 1024, "height": 768 } ] },
"outputs": [
{ "type": "image", "url": "https://content.doitong.com/dev-api/…/0-output.jpeg", "content_type": "image/jpeg",
"width": 1024, "height": 768, "file_size": 183920, "stored": true }
],
"error": null,
"metrics": { "inference_seconds": 1.2 },
"storage": { "mode": "permanent", "bytes": 183920, "expires_at": null, "expired": false },
"urls": {
"self": "https://api.doitong.ru/v1/requests/req_8k2m4q7x1z9c3v5b6n0p2r4t",
"cancel": "https://api.doitong.ru/v1/requests/req_8k2m4q7x1z9c3v5b6n0p2r4t/cancel"
}
}
outputsبرای همه مدلها یکسان است: برای هر فایل تولیدشده یک ورودی باtype(image،video،audio،fileیا3d)، یکurlدر فضای ذخیرهسازی ما،content_typeو در صورت معلوم بودنfile_size،width،heightوduration.outputشیء نتیجه مخصوص مدل است (فیلدهای آن در صفحه هر مدل فهرست شدهاند) و همان URLها را دارد.storageنحوه نگهداری فایلها را مشخص میکند:mode(permanentیاtemporary)،bytesذخیرهشده،expires_at(زمان حذف فایل موقت، و برای فایل دائمیnull) وexpired(پس از حذف فایلهاtrue).cost.creditsقیمت فراخوانی برحسب اعتبار API است (cost.usdبرحسب USD)،cost.chargedمبلغ کسرشده از موجودی API وcost.refundedمبلغ بازگشتی است. برای مدلmetered،cost.creditsحداکثر مبلغ نگهداشتهشده در آغاز است (cost.held)؛ پس از موفقیت اجرا،cost.settledمصرف واقعی و باقیمانده حداکثر درcost.refundedقرار میگیرد (به دریافت هزینه بر اساس مصرف مراجعه کنید).- هنگام ناموفقشدن درخواست،
errorبرابر{ "type": …, "code": …, "message": … }است.
خواندن یک درخواست
curl "https://api.doitong.ru/v1/requests/req_8k2m4q7x1z9c3v5b6n0p2r4t?wait=20" \
-H "Authorization: Bearer $DOITONG_API_KEY"
?wait=N(تا 20 ثانیه) بهصورت long-poll عمل میکند: فراخوانی بهمحض نهاییشدن درخواست یا پس از N ثانیه با وضعیت فعلی برمیگردد. حلقهزدن روی آن سادهترین روش انتظار برای نتیجه است.?logs=1خطوط گزارش پیشرفت مدل (50 خط آخر) را بهعنوانlogsاضافه میکند.
فقط میتوانید درخواستهای حساب خودتان را بخوانید؛ هر شناسه دیگر 404 request_not_found است.
فهرست درخواستها
curl "https://api.doitong.ru/v1/requests?limit=20&status=succeeded&model=flux/schnell" \
-H "Authorization: Bearer $DOITONG_API_KEY"
جدیدترین مورد ابتدا میآید. limit بین 1 تا 100 است (پیشفرض 20) و status و model فیلتر میکنند. پاسخ { "object": "list", "data": [ … ], "has_more": true, "next_cursor": "req_…" } است؛ برای صفحه بعد cursor=<next_cursor> را ارسال کنید.
لغو یک درخواست
curl -X POST "https://api.doitong.ru/v1/requests/req_8k2m4q7x1z9c3v5b6n0p2r4t/cancel" \
-H "Authorization: Bearer $DOITONG_API_KEY"
- لغوشده پیش از شروع مدل: وضعیت به
canceledتبدیل میشود، اعتبار API بازپرداخت میشود و200دریافت میکنید. - در حال تولید: درخواست لغو ارسال میشود و
202همراه"cancel_requested": trueدریافت میکنید. اگر مدل بااینحال تمام شود، درخواست عادی موفق و هزینهدار خواهد بود. - از پیش نهاییشده:
409 not_cancelable(درخواستی که از قبلcanceledاست، فقط200برمیگرداند).
حذف فایلهای یک درخواست
curl -X DELETE "https://api.doitong.ru/v1/requests/req_8k2m4q7x1z9c3v5b6n0p2r4t/files" \
-H "Authorization: Bearer $DOITONG_API_KEY"
نسخههای ما از فایلهای خروجی درخواست را اکنون حذف میکند و هزینه فضای ذخیرهسازی آنها را متوقف میسازد. پاسخ، شیء درخواست با storage.expired: true است؛ URLها در سابقه باقی میمانند اما دیگر کار نمیکنند. اجرای دوباره تغییری ایجاد نمیکند (200). درخواست queued یا running هنوز فایلی ندارد: 409 request_active. به models:run نیاز دارد.
همسانی: تلاش مجدد بدون پرداخت دوباره
شبکهها دچار خطا میشوند. برای تلاش مجدد امن، هدر Idempotency-Key را ارسال کنید (هر رشته تا 255 نویسه، یکتا برای هر عملیات؛ مثلاً شناسه سفارش خودتان):
- همان کلید و همان بدنه قبلی: درخواست اصلی را دریافت میکنید (
200، هدرIdempotent-Replayed: true) و دوباره هزینهای دریافت نمیشود. - همان کلید و بدنه پس از اجرایی که پیش از رسیدن به مدل ناموفق شده است (
upstream_errorیاinternal_errorهنگام ارسال،insufficient_credits،budget_exceeded،too_many_inflight): چیزی تولید نشده و هزینهای دریافت نشده است؛ بنابراین تلاش مجدد مدل را دوباره اجرا میکند، نه اینکه خطا را برگرداند. - همان کلید با بدنه متفاوت:
409 idempotency_mismatch. - کلیدها به کلید API ارسالکننده محدود هستند.
محل نگهداری فایلها
هر فایل خروجی پیش از علامتگذاری درخواست بهعنوان succeeded در فضای ذخیرهسازی ما کپی میشود؛ بنابراین URLهای outputs روی میزبانهای خودمان هستند و میتوانید مستقیماً به آنها پیوند دهید. مدت نگهداری به انتخاب شماست:
| حالت | مدت | قیمت |
|---|---|---|
permanent (پیشفرض) |
تا زمان حذف | ۱۰۰ اعتبار API ($۰٫۱۰) برای هر GB در ماه، با کسر روزانه از موجودی API |
temporary |
۷ روز، سپس حذف | رایگان |
- تنظیم حساب برای درخواستهای جدید تعیینکننده است: کلید «فایلها برای همیشه نگه داشته شوند» در داشبورد، یا
PATCH https://api.doitong.ru/v1/account/storageبا{"mode": "temporary"}.GET https://api.doitong.ru/v1/accountآن را زیرstorage، همراه بایتهای نگهداریشده و برآورد ماهانه نشان میدهد. ?storage=permanent|temporaryهنگام اجرا (پارامترstorageابزارrunدر MCP) آن را برای همان اجرا لغو میکند.- تغییر تنظیم هرگز فایلهای موجود را تغییر نمیدهد؛ آنها را با
DELETE /requests/{id}/filesحذف کنید. - وقتی موجودی API نتواند هزینه فضای ذخیرهسازی را پرداخت کند، هزینهای دریافت نمیشود و ایمیلی دریافت میکنید: ظرف ۳۰ روز موجودی را افزایش دهید؛ در غیر این صورت فایلهای نگهداریشده موقت میشوند و ۷ روز بعد حذف خواهند شد.
در موارد نادرِ ناموفقبودن کپی ما، ورودی دارای "stored": false است و URL همان URL اصلی و کوتاهمدت است: آن را بهسرعت بارگیری کنید.