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

  1. Masuk dan buka Saldo dan kunci API.
  2. Buat kunci. Kunci hanya ditampilkan sekali: salin dan rahasiakan, seperti kata sandi. Anda dapat mencabut kunci kapan saja.
  3. 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
servicewajibLayanan dari /services
tierwajibbasic, standard atau premium
textwajib jika tanpa answers, script atau awaitBriefTugasnya: apa yang harus dikerjakan, hingga 10.000 karakter. Bersama script: cara membacanya (nada, tempo, cara mengucapkan nama)
linkopsionalTautan ke halaman, profil, atau postingan, atau ke rekaman: tautan langsung ke file, atau tautan Dropbox atau Yandex Disk. Wajib jika linkRequired bernilai true
answersopsionalJawaban atas briefQuestions layanan: [{"q": "question", "a": "answer"}], maksimal 8, setiap jawaban hingga 5.000 karakter
scriptwajib jika script di /services bukan null, ditolak untuk layanan lainTeks yang dibacakan kata demi kata, hingga maxChars paket (maksimal 20.000 karakter, satu baris baru dihitung satu karakter). Beri baris kosong di antara paragraf
localeopsionalBahasa hasil, en atau ru. Secara default bahasa akun Anda
addonsopsionalId tambahan dari /services yang ditawarkan untuk tier ini, misalnya [7]
promoCodeopsionalKode promo; jika tidak berlaku, pesanan tidak dibuat (lihat Kesalahan)
awaitBriefopsionaltrue 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:

  1. Buat pesanan dengan "awaitBrief": true dan tanpa text, link, answers dan script. Pesanan langsung dibayar dan statusnya awaiting_brief; tenggat mulai berjalan saat brief dikirim.
  2. Untuk setiap file, kirim POST /orders/{id}/files dengan {"name": "page-1.png", "size": 482113, "mime": "image/png"}: size adalah ukuran persis dalam byte, mime opsional. 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" }
}
  1. Kirim byte file dengan PUT ke upload.url menggunakan headers persis seperti yang diberikan dan tanpa kunci API, sebelum upload.expiresAt (satu jam):
curl -X PUT "$url" -H "content-type: application/octet-stream" --data-binary @page-1.png
  1. POST /orders/{id}/files/{fileId}/complete. File yang ukurannya berbeda dari size, atau yang byte-nya bukan jenis yang tercantum di accept, ditolak dengan 422 dan dihapus: nama dan mime tidak diperhitungkan. Jika tidak, responsnya adalah file, kini berstatus checking. Setelah beberapa detik, atau beberapa menit untuk rekaman panjang, statusnya menjadi ready, atau rejected dengan alasan di reason, misalnya recording_no_sound atau file_unreadable. files pada pesanan menunjukkan status setiap file.
  2. POST /orders/{id}/brief dengan text, link, answers dan script seperti pada POST /orders. File siap yang belum dikirim ikut terkirim bersamanya, atau cantumkan file yang akan dikirim di fileIds. Selama salah satunya masih checking, brief ditolak dengan 409 files_not_ready: kirim lagi beberapa saat kemudian. Responsnya (200) adalah pesanan, kini berstatus in_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

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:

StatusArti
awaiting_briefDibuat dengan awaitBrief: menunggu POST /orders/{id}/brief
in_progressPekerjaan sedang dikerjakan
quality_checkPekerjaan sudah selesai dan sedang diperiksa sebelum diserahkan
deliveredHasil sudah siap, lihat results. Terima hasilnya atau minta revisi sebelum autoAcceptAt
revisionRevisi yang Anda minta sedang dikerjakan
completedAnda telah menerima hasilnya, atau hasil diterima secara otomatis
refundedDana 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

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" }
StatusKodeArti
400validationAda field yang kosong atau salah; fields mencantumkannya
400link_requiredLayanan ini memerlukan link
400files_requiredLayanan ini memerlukan file: buat pesanan dengan awaitBrief lalu unggah file
400script_requiredLayanan ini membacakan teks: kirim teksnya di script
400script_too_longscript lebih panjang dari yang dibacakan paket; maxChars dalam respons adalah batas maksimumnya. Tidak ada biaya yang ditagih
400script_not_acceptedLayanan ini tidak membacakan teks (nilai script di /services adalah null): jangan sertakan script. Tidak ada biaya yang ditagih
400files_not_accepted, file_too_largeLayanan tidak menerima file, atau file lebih besar dari maxMb layanan
400invalid_idempotency_keyIdempotency-Key kosong, lebih dari 255 karakter, atau bukan ASCII yang dapat dicetak
401invalid_api_keyTidak 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
402insufficient_balanceSaldo tidak mencukupi; tidak ada biaya yang ditagih
404package_not_found, order_not_found, file_not_foundLayanan, paket, pesanan, atau file tidak ditemukan
409order_not_delivered, no_revisions_leftStatus pesanan tidak memungkinkan tindakan ini
409brief_not_expectedPesanan tidak sedang menunggu brief: pesanan dibuat tanpa awaitBrief, atau brief sudah dikirim
409uploads_closedFile hanya diterima selama pesanan menunggu brief atau hasilnya sudah diserahkan
409files_limitJumlah file melebihi batas layanan untuk satu brief atau permintaan, atau melebihi 5 file atau 4 GB untuk pesanan
409upload_quotaDengan 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
409files_not_ready, file_rejectedFile yang akan dikirim masih diperiksa, atau ditolak
409upload_incompleteBelum ada yang diunggah ke tautan: selesaikan PUT, lalu selesaikan unggahan lagi
409file_in_use, file_busyFile sudah dikirim bersama brief atau permintaan dan tetap terikat pada pesanan, atau sedang dipindahkan oleh proses pemeriksaannya: coba lagi sesaat kemudian
409addon_unavailableTambahan tidak ditawarkan untuk layanan dan tier ini
409promo_not_found, promo_inactive, promo_used_up, promo_already_used, promo_first_order_only, promo_min_orderKode 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
409idempotency_key_in_progressPermintaan dengan Idempotency-Key ini masih diproses; ulangi beberapa saat kemudian
410upload_expired, file_removedTautan unggahan kedaluwarsa sebelum ada yang diunggah, atau Anda telah menarik kembali file tersebut: mulai unggahan baru
415file_type_not_acceptedmime yang diberikan bukan jenis yang diterima layanan
422idempotency_key_reusedIdempotency-Key ini sudah digunakan untuk permintaan yang berbeda
422upload_size_mismatch, file_type_not_acceptedUkuran file yang diunggah tidak sama dengan size, atau byte-nya bukan jenis yang diterima layanan; file telah dihapus
422file_unreadable, recording_no_sound, check_failedMenyelesaikan file yang ditolak oleh pemeriksaan: file tidak dapat dibuka, rekaman tidak bersuara, atau file tidak dapat diperiksa. Unggah ulang file tersebut atau file lain
429rate_limitedLebih 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.