Permintaan
Permintaan adalah satu panggilan ke satu model. Permintaan memiliki id (req_…), status, biaya dalam kredit API (1000 = 1 USD), dan, jika berhasil, file yang dihasilkan. Objek yang sama dikembalikan oleh setiap endpoint di bawah ini, untuk setiap model.
Menemukan model
Katalog semua 1.496 model tersedia sebagai JSON publik (tidak memerlukan kunci):
curl "https://api.doitong.com/v1/models?category=text-to-video&lab=Google&limit=20"
| Parameter kueri | Arti |
|---|---|
q |
Kata-kata yang semuanya harus muncul dalam nama, id, pembuat, atau tag, misalnya kling 3. |
category |
Satu id kategori, misalnya text-to-video atau upscale. GET https://api.doitong.com/v1/categories mencantumkan semua 21 kategori beserta jumlahnya. |
lab |
Pembuat model, berdasarkan nama atau id, misalnya Google atau black-forest-labs. |
family |
Id family dari baris sebelumnya: setiap varian dari satu model (pro, fast, image-to-video, …). |
mode |
exact (harga dihitung dari input), measured (dari panjang atau ukuran file input), estimate (perkiraan harga per eksekusi), atau metered (ditagih berdasarkan penggunaan aktual, hingga maksimum per eksekusi). |
limit, cursor |
Ukuran halaman (1 hingga 100, bawaan 50) dan next_cursor dari halaman sebelumnya. |
Setiap baris memiliki id, name, lab, category, family, summary, tags, output_kind, docs_url, dan objek price (lihat Harga). GET https://api.doitong.com/v1/models/{model_id} menambahkan JSON Schema input dan output lengkap, nama parameter kanonis, aturan harga, dan contoh input. category atau mode yang tidak dikenal menghasilkan 400 invalid_parameter.
Menjalankan model
curl -X POST "https://api.doitong.com/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": "..."}'
- Body adalah input model, berupa objek JSON. Setiap halaman model mencantumkan parameternya.
- Input diperiksa sebelum biaya apa pun dibebankan. Input yang tidak valid menghasilkan
422 invalid_inputdenganparamyang bermasalah, dan tidak dikenai biaya. ?wait=N(hingga 20 detik) menahan panggilan hingga permintaan selesai atau waktunya habis.?webhook_url=https://…mengirimkan POST bertanda tangan ke URL tersebut saat permintaan selesai (lihat Webhook).?storage=permanentatau?storage=temporarymemilih berapa lama file output disimpan; jika tidak digunakan, pengaturan akun akan diterapkan (lihat Lokasi file).
Responsnya adalah 202 Accepted saat permintaan masih diproses, dan 200 OK jika selesai dalam waktu tunggu (atau jika merupakan pemutaran ulang, lihat di bawah). Header Location dan Doitong-Request-Id membawa URL dan id permintaan.
Status
-
queuedDiterima dan ditagihkan, menunggu worker -
runningModel sedang menghasilkan output -
Status akhir:
succeededQuote ditagihkan; outputs[] berisi URL di penyimpanan kamifailedDana dikembalikan otomatis; error menjelaskan penyebabnyacanceledDihentikan sebelum ada hasil; dana dikembalikan
| Status | Arti | Final |
|---|---|---|
queued |
Diterima dan ditagih, menunggu worker. queue_position mungkin menampilkan posisinya dalam antrean. |
tidak |
running |
Model sedang menghasilkan output. | tidak |
succeeded |
Selesai. outputs mencantumkan file. |
ya |
failed |
Model atau batas menghentikannya. error menjelaskan alasannya. Kredit API dikembalikan. |
ya |
canceled |
Dibatalkan sebelum menghasilkan hasil. Kredit API dikembalikan. | ya |
Permintaan yang berjalan lebih lama dari batas waktunya gagal dengan kode timeout dan dana dikembalikan: 15 menit untuk gambar, 60 menit untuk video, 30 menit untuk audio, dan semua jenis lainnya.
Objek permintaan
{
"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.com/v1/requests/req_8k2m4q7x1z9c3v5b6n0p2r4t",
"cancel": "https://api.doitong.com/v1/requests/req_8k2m4q7x1z9c3v5b6n0p2r4t/cancel"
}
}
outputssama untuk setiap model: satu entri per file yang dihasilkan dengantype(image,video,audio,fileatau3d),urlpada penyimpanan kami,content_type, dan jika diketahui,file_size,width,height,duration.outputadalah objek hasil milik model (field-nya tercantum di setiap halaman model) dengan URL yang sama.storagemenjelaskan cara file disimpan:mode(permanentatautemporary),bytesyang disimpan,expires_at(saat file sementara dihapus,nulluntuk file permanen), danexpired(truesetelah file dihapus).cost.creditsadalah harga panggilan dalam kredit API (cost.usddalam USD),cost.chargedadalah jumlah yang didebit dari saldo API, dancost.refundedadalah jumlah yang dikembalikan. Untuk modelmetered,cost.creditsadalah maksimum yang ditahan di awal (cost.held); setelah eksekusi berhasil,cost.settledmenunjukkan jumlah penggunaan, dan sisa maksimum berada dicost.refunded(lihat Ditagih berdasarkan penggunaan).- Jika permintaan gagal,
errorberbentuk{ "type": …, "code": …, "message": … }.
Membaca permintaan
curl "https://api.doitong.com/v1/requests/req_8k2m4q7x1z9c3v5b6n0p2r4t?wait=20" \
-H "Authorization: Bearer $DOITONG_API_KEY"
?wait=N(hingga 20 detik) melakukan long-poll: panggilan dikembalikan segera setelah permintaan final, atau setelah N detik dengan status saat ini. Melakukan loop dengan cara ini adalah cara paling sederhana untuk menunggu hasil.?logs=1menambahkan baris log kemajuan model (50 terakhir) sebagailogs.
Anda hanya dapat membaca permintaan dari akun Anda sendiri; id lain apa pun menghasilkan 404 request_not_found.
Mencantumkan permintaan
curl "https://api.doitong.com/v1/requests?limit=20&status=succeeded&model=flux/schnell" \
-H "Authorization: Bearer $DOITONG_API_KEY"
Yang terbaru ditampilkan terlebih dahulu. limit bernilai 1 hingga 100 (bawaan 20), sedangkan status dan model berfungsi sebagai filter. Responsnya adalah { "object": "list", "data": [ … ], "has_more": true, "next_cursor": "req_…" }; teruskan cursor=<next_cursor> untuk halaman berikutnya.
Membatalkan permintaan
curl -X POST "https://api.doitong.com/v1/requests/req_8k2m4q7x1z9c3v5b6n0p2r4t/cancel" \
-H "Authorization: Bearer $DOITONG_API_KEY"
- Dibatalkan sebelum model dimulai: status menjadi
canceled, kredit API dikembalikan, dan Anda menerima200. - Sudah dalam proses pembuatan: pembatalan diteruskan dan Anda menerima
202dengan"cancel_requested": true. Jika model tetap selesai, permintaan berhasil seperti biasa dan ditagih. - Sudah final:
409 not_cancelable(permintaan yang sudahcanceledcukup mengembalikan200).
Menghapus file permintaan
curl -X DELETE "https://api.doitong.com/v1/requests/req_8k2m4q7x1z9c3v5b6n0p2r4t/files" \
-H "Authorization: Bearer $DOITONG_API_KEY"
Segera menghapus salinan file output permintaan kami dan menghentikan biaya penyimpanannya. Responsnya adalah objek permintaan dengan storage.expired: true; URL-nya tetap berada dalam catatan, tetapi tidak lagi berfungsi. Pemanggilan ulang tidak mengubah apa pun (200). Permintaan yang masih queued atau running belum memiliki file: 409 request_active. Memerlukan models:run.
Idempotensi: mencoba ulang tanpa membayar dua kali
Jaringan dapat gagal. Untuk mencoba ulang eksekusi dengan aman, kirim header Idempotency-Key (string apa pun hingga 255 karakter, unik per operasi, misalnya id pesanan Anda sendiri):
- Kunci dan body yang sama seperti sebelumnya: Anda menerima kembali permintaan asli (
200, headerIdempotent-Replayed: true), dan tidak ada biaya tambahan. - Kunci dan body yang sama setelah eksekusi gagal sebelum mencapai model (
upstream_erroratauinternal_errorsaat pengiriman,insufficient_credits,budget_exceeded,too_many_inflight): tidak ada yang dihasilkan dan tidak ada biaya, sehingga percobaan ulang menjalankan model lagi alih-alih mengembalikan kegagalan. - Kunci yang sama dengan body berbeda:
409 idempotency_mismatch. - Kunci dibatasi pada kunci API yang mengirimkannya.
Lokasi file
Setiap file output disalin ke penyimpanan kami sebelum permintaan ditandai succeeded, sehingga URL dalam outputs berada di host kami sendiri dan dapat ditautkan langsung. Anda dapat memilih berapa lama file tersebut disimpan:
| Mode | Durasi | Harga |
|---|---|---|
permanent (bawaan) |
Hingga Anda menghapusnya | 100 kredit API ($0,10) per GB per bulan, ditagih setiap hari dari saldo API |
temporary |
7 hari, lalu dihapus | Gratis |
- Pengaturan akun menentukan perilaku untuk permintaan baru: tombol "Simpan file selamanya" di dasbor, atau
PATCH https://api.doitong.com/v1/account/storagedengan{"mode": "temporary"}.GET https://api.doitong.com/v1/accountmenampilkannya di bawahstorage, bersama byte yang Anda simpan dan perkiraan bulanan. ?storage=permanent|temporarypada eksekusi (argumenstoragedari tool MCPrun) menggantikan pengaturan untuk eksekusi tersebut.- Mengubah pengaturan tidak pernah memengaruhi file yang sudah Anda miliki; hapus file tersebut dengan
DELETE /requests/{id}/files. - Jika saldo API tidak dapat membayar penyimpanan, tidak ada biaya yang dikenakan dan Anda menerima email: isi ulang dalam 30 hari, atau file yang disimpan menjadi sementara dan dihapus 7 hari kemudian.
Dalam kasus yang jarang terjadi ketika penyalinan kami gagal, entri memiliki "stored": false dan URL-nya adalah URL asli yang berumur pendek: segera unduh.