API
Pesan layanan dari situs web, toko, atau skrip Anda sendiri: tampilkan daftar layanan dan harga, buat pesanan beserta tugasnya, pantau pesanan, dan ambil hasilnya. Layanannya sama dengan yang ada di situs, jadi pesanan yang dibuat melalui API juga muncul di akun Anda.
Memulai
- Masuk dan buka Saldo dan kunci API.
- Buat kunci. Kunci hanya ditampilkan sekali: salin dan rahasiakan, seperti kata sandi. Anda dapat mencabut kunci kapan saja.
- Isi saldo. Pesanan yang dibuat melalui API dibayar dari saldo ini, dalam dolar AS.
Kirim kunci di setiap permintaan:
Authorization: Bearer dlx_your_key
Alamat API: https://dleex.com/api/v1. Permintaan dan respons berformat JSON. Harga dan jumlah dinyatakan dalam bilangan bulat sen dolar AS: 1500 berarti $15.00.
Layanan
GET /services menampilkan daftar layanan yang dapat dipesan.
curl https://dleex.com/api/v1/services -H "Authorization: Bearer dlx_your_key"
[
{
"service": "seo-article",
"category": "seo",
"title": { "en": "SEO article", "ru": "SEO-статья" },
"linkRequired": false,
"files": null,
"script": null,
"briefQuestions": [
{ "q": { "en": "What is the article about?", "ru": "О чём статья?" }, "hint": { "en": "The topic, or a link to the page.", "ru": "..." } },
{ "q": { "en": "Who will read it?", "ru": "..." } }
],
"packages": [
{ "tier": "basic", "title": { "en": "...", "ru": "..." }, "priceUsdCents": 1500, "days": 2, "revisions": 1 },
{ "tier": "standard", "...": "..." },
{ "tier": "premium", "...": "..." }
],
"addons": [
{
"id": 7,
"title": { "en": "Express delivery", "ru": "Срочное выполнение" },
"description": null,
"priceUsdCents": 1000,
"extraDays": -1,
"tiers": ["standard", "premium"]
}
]
}
]
days adalah lama pengerjaan; revisions adalah berapa kali Anda dapat meminta revisi. addons adalah tambahan yang dapat Anda pesan bersama paket yang tercantum di tiers: harganya ditambahkan ke harga paket, dan extraDays ke tenggatnya (negatif: lebih cepat, tetapi tidak pernah kurang dari 1 hari). briefQuestions adalah pertanyaan layanan tentang tugas Anda, sebagian disertai hint; jawab pertanyaan tersebut di answers saat membuat pesanan. Daftarnya kosong jika layanan tidak mengajukan pertanyaan. linkRequired bernilai true untuk layanan yang dikerjakan berdasarkan isi sebuah tautan, seperti profil atau postingan, atau rekaman yang akan diberi subtitle: pesanan layanan ini memerlukan link.
files bernilai null untuk layanan yang tidak menerima file bersama brief. Jika tidak, field ini menyebutkan file yang diterima, misalnya {"accept": ["image"], "maxFiles": 3, "maxMb": 5, "required": true, "insteadOfLink": false}: jenisnya (image, audio, video), jumlah file per brief atau permintaan revisi, ukuran maksimum setiap file dalam MB, apakah brief memerlukan minimal satu file, dan apakah file dapat menggantikan link (dalam hal ini linkRequired tetap true untuk pesanan yang dikirim tanpa file). Lihat File.
script bernilai null untuk layanan yang tidak membacakan teks. Layanan sulih suara mencantumkan teks terpanjang yang dibacakan setiap paket, dalam karakter, misalnya {"maxChars": {"basic": 1000, "standard": 3000, "premium": 9000}}: pesanannya memerlukan script, yaitu teks yang dibacakan kata demi kata. Rekaman dibacakan dengan suara sintetis: di mana pun Anda memublikasikannya, beri tahu pendengar Anda bahwa suaranya sintetis (lihat Ketentuan).
Saldo
GET /balance
{ "balanceUsdCents": 10000, "currency": "USD" }
Membuat pesanan
POST /orders. Harga (paket dan tambahan, dikurangi diskon jika ada) diambil dari saldo dan pengerjaan langsung dimulai.
| Field | ||
|---|---|---|
service | wajib | Layanan dari /services |
tier | wajib | basic, standard atau premium |
text | wajib jika tanpa answers, script atau awaitBrief | Tugasnya: apa yang harus dikerjakan, hingga 10.000 karakter. Bersama script: cara membacanya (nada, tempo, cara mengucapkan nama) |
link | opsional | Tautan ke halaman, profil, atau postingan, atau ke rekaman: tautan langsung ke file, atau tautan Dropbox atau Yandex Disk. Wajib jika linkRequired bernilai true |
answers | opsional | Jawaban atas briefQuestions layanan: [{"q": "question", "a": "answer"}], maksimal 8, setiap jawaban hingga 5.000 karakter |
script | wajib jika script di /services bukan null, ditolak untuk layanan lain | Teks yang dibacakan kata demi kata, hingga maxChars paket (maksimal 20.000 karakter, satu baris baru dihitung satu karakter). Beri baris kosong di antara paragraf |
locale | opsional | Bahasa hasil, en atau ru. Secara default bahasa akun Anda |
addons | opsional | Id tambahan dari /services yang ditawarkan untuk tier ini, misalnya [7] |
promoCode | opsional | Kode promo; jika tidak berlaku, pesanan tidak dibuat (lihat Kesalahan) |
awaitBrief | opsional | true untuk mengirim brief nanti, setelah mengunggah file: pesanan dibayar dan menunggu dengan status awaiting_brief. Dalam hal ini, jangan sertakan text, link, answers dan script. Lihat File |
curl https://dleex.com/api/v1/orders -H "Authorization: Bearer dlx_your_key" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: <your-order-id>" \
-d '{"service":"seo-article","tier":"basic","text":"An article about trail running shoes, 5 keywords: ..."}'
Idempotency-Key bersifat opsional dan memungkinkan Anda mengulang permintaan dengan aman; setiap pesanan baru memerlukan kunci baru. Lihat Idempotensi di bawah.
Berikan text atau minimal satu jawaban, atau keduanya; untuk sulih suara, script sudah cukup. Tulis setiap pertanyaan di q persis seperti di briefQuestions, dalam bahasa pesanan, dan lewati pertanyaan yang tidak Anda jawab:
{
"service": "seo-article",
"tier": "basic",
"answers": [
{ "q": "What is the article about?", "a": "Choosing trail running shoes" },
{ "q": "Who will read it?", "a": "Runners moving from road to trail" }
]
}
Responsnya adalah pesanan (status 201):
{
"id": 1042,
"status": "in_progress",
"service": "seo-article",
"tier": "basic",
"priceUsdCents": 1500,
"addons": [],
"discountUsdCents": 0,
"promoCode": null,
"locale": "en",
"text": "An article about trail running shoes...",
"link": null,
"answers": [],
"script": null,
"fileIds": [],
"files": [],
"revisionsLeft": 1,
"createdAt": "2026-10-16T11:00:00.000Z",
"dueAt": "2026-10-18T11:00:00.000Z",
"deliveredAt": null,
"autoAcceptAt": null,
"completedAt": null,
"results": []
}
File
Beberapa layanan dikerjakan dari file klien, seperti gambar halaman yang akan diketik ulang atau rekaman yang akan diberi subtitle: nilai files layanan tersebut di /services bukan null. File diunggah ke pesanan yang sedang menunggu brief:
- Buat pesanan dengan
"awaitBrief": truedan tanpatext,link,answersdanscript. Pesanan langsung dibayar dan statusnyaawaiting_brief; tenggat mulai berjalan saat brief dikirim. - Untuk setiap file, kirim
POST /orders/{id}/filesdengan{"name": "page-1.png", "size": 482113, "mime": "image/png"}:sizeadalah ukuran persis dalam byte,mimeopsional. Responsnya (201) berisi file dan tempat untuk mengunggahnya:
{
"file": { "id": 77, "name": "page-1.png", "mime": "application/octet-stream", "size": 482113, "status": "pending", "used": false, "uploadExpiresAt": "2026-10-16T12:00:00.000Z", "createdAt": "2026-10-16T11:00:00.000Z" },
"upload": { "url": "https://...", "headers": { "content-type": "application/octet-stream" }, "expiresAt": "2026-10-16T12:00:00.000Z" }
}
- Kirim byte file dengan
PUTkeupload.urlmenggunakanheaderspersis seperti yang diberikan dan tanpa kunci API, sebelumupload.expiresAt(satu jam):
curl -X PUT "$url" -H "content-type: application/octet-stream" --data-binary @page-1.png
POST /orders/{id}/files/{fileId}/complete. File yang ukurannya berbeda darisize, atau yang byte-nya bukan jenis yang tercantum diaccept, ditolak dengan422dan dihapus: nama danmimetidak diperhitungkan. Jika tidak, responsnya adalah file, kini berstatuschecking. Setelah beberapa detik, atau beberapa menit untuk rekaman panjang, statusnya menjadiready, ataurejecteddengan alasan direason, misalnyarecording_no_soundataufile_unreadable.filespada pesanan menunjukkan status setiap file.POST /orders/{id}/briefdengantext,link,answersdanscriptseperti padaPOST /orders. File siap yang belum dikirim ikut terkirim bersamanya, atau cantumkan file yang akan dikirim difileIds. Selama salah satunya masihchecking, brief ditolak dengan409 files_not_ready: kirim lagi beberapa saat kemudian. Responsnya (200) adalah pesanan, kini berstatusin_progress.
DELETE /orders/{id}/files/{fileId} menarik kembali file yang belum dikirim. Satu pesanan menerima maksimal 5 file dengan total 4 GB; file yang unggahannya sudah dimulai tetap dihitung sampai diselesaikan atau ditarik kembali, dan selama satu hari sejak unggahannya dimulai, file yang ditarik kembali atau ditolak dihitung dalam batas 12 GB bersama file pesanan: jika batas itu terlampaui, unggahan ditolak dengan 409 upload_quota dan retryAt, yaitu waktu unggahan diterima lagi. Pesanan yang hasilnya sudah diserahkan juga menerima file untuk permintaan revisi: unggah dengan cara yang sama, lalu kirim fileIds bersama permintaan tersebut.
Tanpa awaitBrief, pesanan layanan yang file-nya required ditolak dengan 400 files_required, dan pesanan layanan yang file-nya dapat menggantikan tautan, jika dikirim tanpa tautan, ditolak dengan 400 link_required.
Di dalam pesanan, files mencantumkan file Anda beserta status masing-masing, dan fileIds mencantumkan file yang dikirim bersama brief. File yang siap memiliki url yang berlaku hingga expiresAt, seperti file hasil. File disimpan selama 30 hari setelah pesanan ditutup.
Idempotensi
Permintaan bisa mengalami timeout padahal pesanan sudah dibuat. Agar dapat mengulang POST /orders tanpa membayar dua kali, kirim header Idempotency-Key bersamanya: string berisi 1 hingga 255 karakter ASCII yang dapat dicetak, yang Anda pilih satu kali per pesanan, seperti UUID atau nomor pesanan Anda sendiri. Kirim kunci yang sama dan body yang sama saat mengulang permintaan.
curl -i https://dleex.com/api/v1/orders -H "Authorization: Bearer dlx_your_key" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: shop-order-981" \
-d '{"service":"seo-article","tier":"basic","text":"An article about trail running shoes, 5 keywords: ..."}'
Jika pesanan sudah pernah dibuat dengan kunci ini, responsnya adalah pesanan tersebut dalam kondisi terkininya, dengan status 201 dan satu header tambahan. Tidak ada biaya yang ditagih lagi:
HTTP/1.1 201 Created
Idempotent-Replayed: true
- Kunci terikat pada permintaan yang pertama kali dikirim bersamanya. Kunci yang sama dengan body berbeda, misalnya tambahan lain atau kode promo lain, ditolak dengan
422 idempotency_key_reused, dan tidak ada biaya yang ditagih. - Jika beberapa permintaan dengan satu kunci tiba bersamaan, satu pesanan dibuat dan permintaan lainnya mendapat pesanan tersebut sebagai respons. Permintaan yang harus menunggu terlalu lama merespons dengan
409 idempotency_key_in_progressdan tidak menagih apa pun: ulangi beberapa saat kemudian. - Permintaan yang gagal, misalnya dengan
400,402,404atau kesalahan tambahan atau kode promo, tidak menghabiskan kuncinya: perbaiki lalu kirim lagi dengan kunci yang sama. - Kunci disimpan selama 24 jam. Setelah itu, kunci yang sama akan membuat pesanan baru.
- Kunci terpisah untuk setiap akun. Tanpa header ini, setiap permintaan membuat pesanan baru.
Penerimaan hasil, brief, dan permintaan revisi tidak memerlukan kunci. Penerimaan hasil aman untuk diulang: setelah pesanan selesai, pengulangan merespons dengan 409 order_not_delivered. Begitu juga brief: setelah berhasil dikirim, pengulangan merespons dengan 409 brief_not_expected dan pesanan berstatus in_progress. Permintaan revisi berbeda: selama pekerjaan sedang dikerjakan ulang, pengulangan merespons dengan 409 order_not_delivered, tetapi setelah hasil revisi diserahkan, pengulangan akan meminta revisi berikutnya. Sebelum mengulang permintaan revisi, periksa pesanan dengan GET /orders/{id} (status dan revisionsLeft).
Memantau pesanan
GET /orders/{id} mengembalikan satu pesanan, GET /orders mengembalikan pesanan Anda, dimulai dari yang terbaru. Daftar ini menerima status, limit (1 hingga 100, default 20) dan before (id pesanan, untuk mendapatkan pesanan yang lebih lama).
Status pesanan:
| Status | Arti |
|---|---|
awaiting_brief | Dibuat dengan awaitBrief: menunggu POST /orders/{id}/brief |
in_progress | Pekerjaan sedang dikerjakan |
quality_check | Pekerjaan sudah selesai dan sedang diperiksa sebelum diserahkan |
delivered | Hasil sudah siap, lihat results. Terima hasilnya atau minta revisi sebelum autoAcceptAt |
revision | Revisi yang Anda minta sedang dikerjakan |
completed | Anda telah menerima hasilnya, atau hasil diterima secara otomatis |
refunded | Dana telah dikembalikan ke saldo Anda |
Periksa setiap beberapa menit; tidak perlu lebih sering. Saat pesanan berstatus delivered, results berisi hasil kerja: kind bernilai text (Markdown), report (laporan penyerahan hasil untuk pesanan media sosial) atau files (file untuk diunduh, dengan catatan opsional di body). Setiap hasil memiliki daftar files, yang kosong untuk teks dan laporan: setiap file memiliki name, mime, size dalam byte, dan url yang berlaku hingga expiresAt, sekitar satu jam. Baca ulang pesanan untuk mendapatkan tautan baru. Tautan dapat dialihkan ke penyimpanan file, jadi ikuti pengalihan, misalnya curl -L -o result.png "$url", dan jangan kirim kunci API bersamanya: tautan itu sendiri sudah cukup untuk membuka file.
Penerimaan hasil dan revisi
POST /orders/{id}/acceptmenerima hasil dan menyelesaikan pesanan.POST /orders/{id}/revisiondengan{"text": "what to change"}meminta revisi, selamarevisionsLeftlebih dari nol. Jika layanan menerima file,fileIdsmencantumkan file yang diunggah untuk permintaan tersebut; jika tidak disertakan, file siap yang belum dikirim akan ikut terkirim.
Jika Anda tidak menerima hasil atau meminta revisi atas pesanan yang sudah diserahkan, pesanan diterima secara otomatis 3 hari setelah penyerahan hasil, pada waktu yang tercantum di autoAcceptAt (null pada status lain). Penyerahan hasil baru setelah revisi memulai lagi hitungan 3 hari. Anda juga dapat menerima hasil kerja di situs. Jika Anda menulis di chat pesanan di situs setelah penyerahan hasil, pesanan tidak diterima secara otomatis dan autoAcceptAt bernilai null hingga Anda menerimanya atau kami mengerjakan ulang pekerjaan atau mengembalikan dananya. Setelah membalas pesan Anda, kami juga dapat memulai lagi hitungan 3 hari: autoAcceptAt kemudian menunjukkan waktu yang baru.
Kesalahan
Kesalahan dikirim dengan status HTTP dan kode:
{ "code": "insufficient_balance" }
| Status | Kode | Arti |
|---|---|---|
| 400 | validation | Ada field yang kosong atau salah; fields mencantumkannya |
| 400 | link_required | Layanan ini memerlukan link |
| 400 | files_required | Layanan ini memerlukan file: buat pesanan dengan awaitBrief lalu unggah file |
| 400 | script_required | Layanan ini membacakan teks: kirim teksnya di script |
| 400 | script_too_long | script lebih panjang dari yang dibacakan paket; maxChars dalam respons adalah batas maksimumnya. Tidak ada biaya yang ditagih |
| 400 | script_not_accepted | Layanan ini tidak membacakan teks (nilai script di /services adalah null): jangan sertakan script. Tidak ada biaya yang ditagih |
| 400 | files_not_accepted, file_too_large | Layanan tidak menerima file, atau file lebih besar dari maxMb layanan |
| 400 | invalid_idempotency_key | Idempotency-Key kosong, lebih dari 255 karakter, atau bukan ASCII yang dapat dicetak |
| 401 | invalid_api_key | Tidak ada kunci, kunci salah, atau kunci sudah dicabut. Kunci juga dicabut saat email akun yang belum dikonfirmasi dikonfirmasi melalui masuk dengan Google atau dengan menetapkan kata sandi baru |
| 402 | insufficient_balance | Saldo tidak mencukupi; tidak ada biaya yang ditagih |
| 404 | package_not_found, order_not_found, file_not_found | Layanan, paket, pesanan, atau file tidak ditemukan |
| 409 | order_not_delivered, no_revisions_left | Status pesanan tidak memungkinkan tindakan ini |
| 409 | brief_not_expected | Pesanan tidak sedang menunggu brief: pesanan dibuat tanpa awaitBrief, atau brief sudah dikirim |
| 409 | uploads_closed | File hanya diterima selama pesanan menunggu brief atau hasilnya sudah diserahkan |
| 409 | files_limit | Jumlah file melebihi batas layanan untuk satu brief atau permintaan, atau melebihi 5 file atau 4 GB untuk pesanan |
| 409 | upload_quota | Dengan file ini, file pesanan (termasuk yang sudah dikirim dan unggahan yang belum selesai) ditambah file yang mulai diunggah dalam satu hari terakhir lalu ditarik kembali atau ditolak melebihi 12 GB: coba lagi setelah retryAt |
| 409 | files_not_ready, file_rejected | File yang akan dikirim masih diperiksa, atau ditolak |
| 409 | upload_incomplete | Belum ada yang diunggah ke tautan: selesaikan PUT, lalu selesaikan unggahan lagi |
| 409 | file_in_use, file_busy | File sudah dikirim bersama brief atau permintaan dan tetap terikat pada pesanan, atau sedang dipindahkan oleh proses pemeriksaannya: coba lagi sesaat kemudian |
| 409 | addon_unavailable | Tambahan tidak ditawarkan untuk layanan dan tier ini |
| 409 | promo_not_found, promo_inactive, promo_used_up, promo_already_used, promo_first_order_only, promo_min_order | Kode promo tidak ada, sedang tidak aktif, sudah habis, sudah pernah Anda gunakan, hanya berlaku untuk pesanan pertama, atau memerlukan nilai pesanan yang lebih besar. Tidak ada biaya yang ditagih |
| 409 | idempotency_key_in_progress | Permintaan dengan Idempotency-Key ini masih diproses; ulangi beberapa saat kemudian |
| 410 | upload_expired, file_removed | Tautan unggahan kedaluwarsa sebelum ada yang diunggah, atau Anda telah menarik kembali file tersebut: mulai unggahan baru |
| 415 | file_type_not_accepted | mime yang diberikan bukan jenis yang diterima layanan |
| 422 | idempotency_key_reused | Idempotency-Key ini sudah digunakan untuk permintaan yang berbeda |
| 422 | upload_size_mismatch, file_type_not_accepted | Ukuran file yang diunggah tidak sama dengan size, atau byte-nya bukan jenis yang diterima layanan; file telah dihapus |
| 422 | file_unreadable, recording_no_sound, check_failed | Menyelesaikan file yang ditolak oleh pemeriksaan: file tidak dapat dibuka, rekaman tidak bersuara, atau file tidak dapat diperiksa. Unggah ulang file tersebut atau file lain |
| 429 | rate_limited | Lebih dari 120 permintaan per menit dengan satu kunci; tunggu selama jumlah detik di Retry-After |
Pengembalian dana
Jika kami mengembalikan dana suatu pesanan, uangnya kembali ke saldo dan status pesanan menjadi refunded.