API

Kendi web sitenizden, mağazanızdan veya betiğinizden hizmet siparişi verin: hizmetleri ve fiyatları listeleyin, görev tanımıyla sipariş verin, siparişleri takip edin ve sonuçları alın. Sitedeki hizmetin aynısıdır; bu nedenle API üzerinden verilen siparişler hesabınızda da görünür.

Başlarken

  1. Giriş yapın ve Bakiye ve API anahtarları sayfasını açın.
  2. Bir anahtar oluşturun. Anahtar yalnızca bir kez gösterilir: kopyalayın ve bir şifre gibi gizli tutun. Bir anahtarı dilediğiniz zaman iptal edebilirsiniz.
  3. Bakiye yükleyin. API üzerinden verilen siparişler, ABD doları cinsinden bakiyeden ödenir.

Anahtarı her istekle birlikte gönderin:

Authorization: Bearer dlx_your_key

API adresi: https://dleex.com/api/v1. İstekler ve yanıtlar JSON biçimindedir. Fiyatlar ve tutarlar tam sayı ABD senti cinsindendir: 1500, 15,00 $ anlamına gelir.

Hizmetler

GET /services, sipariş edilebilecekleri listeler.

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, işin ne kadar sürdüğünü; revisions, kaç kez değişiklik isteyebileceğinizi gösterir. addons, tiers içindeki paketlerle birlikte sipariş edebileceğiniz ek hizmetlerdir: fiyatı paketin fiyatına, extraDays ise paketin teslim süresine eklenir (negatifse daha hızlıdır, ancak hiçbir zaman 1 günün altına inmez). briefQuestions, hizmetin görev hakkında sorduğu sorulardır, bazılarında bir hint bulunur; sipariş verirken bunları answers içinde yanıtlayın. Hizmet hiçbir şey sormuyorsa liste boştur. Bir bağlantının açtığı içerik (örneğin bir profil veya gönderi ya da altyazı eklenecek bir kayıt) üzerinden yapılan bir hizmette linkRequired değeri true olur: bu hizmetin siparişi için link gerekir.

Brifle birlikte dosya almayan bir hizmette files değeri null olur. Aksi halde hangi dosyaları aldığını belirtir, örneğin {"accept": ["image"], "maxFiles": 3, "maxMb": 5, "required": true, "insteadOfLink": false}: dosya türleri (image, audio, video, document: PDF, DOCX, XLSX), bir brif veya revizyon talebiyle kaç dosya gönderilebileceği, her dosyanın MB cinsinden en fazla ne kadar büyük olabileceği, brif için en az bir dosyanın gerekip gerekmediği ve bir dosyanın link yerine geçip geçemeyeceği (bu durumda dosyasız gönderilen siparişler için linkRequired yine true olur). Bkz. Dosyalar.

Metin seslendirmeyen bir hizmette script değeri null olur. Seslendirme hizmetinde her paketin okuduğu en uzun metin karakter cinsinden belirtilir, örneğin {"maxChars": {"basic": 1000, "standard": 3000, "premium": 9000}}: bu hizmetin siparişleri için script, yani kelimesi kelimesine okunacak metin gerekir. Kayıt sentezlenmiş bir sesle okunur: kaydı nerede yayımlarsanız yayımlayın, dinleyicilerinize sesin sentezlenmiş olduğunu bildirin (bkz. Hizmet Şartları).

Bakiye

GET /balance

{ "balanceUsdCents": 10000, "currency": "USD" }

Sipariş verme

POST /orders. Bedel (paket ve ek hizmetler, varsa indirim düşülerek) bakiyeden alınır ve iş hemen başlar.

Alan
servicezorunlu/services içindeki hizmet
tierzorunlubasic, standard veya premium
textanswers, script veya awaitBrief yoksa zorunluGörev: ne yapılacağı, en fazla 10.000 karakter. script ile birlikte: nasıl okunacağı (ton, tempo, adların nasıl söyleneceği)
linkisteğe bağlıSayfanın, profilin veya gönderinin ya da bir kaydın bağlantısı: dosyanın doğrudan bağlantısı veya bir Dropbox ya da Yandex Disk bağlantısı. linkRequired değeri true olan hizmetlerde zorunludur
answersisteğe bağlıHizmetin briefQuestions sorularına yanıtlar: [{"q": "question", "a": "answer"}], en fazla 8 adet, her yanıt en fazla 5.000 karakter
script/services içindeki script değeri null değilse zorunlu, diğer durumlarda reddedilirKelimesi kelimesine seslendirilecek metin; paketin maxChars değerine kadar (en fazla 20.000 karakter, satır sonu bir karakter sayılır). Paragraflar arasında boş satır bırakın
localeisteğe bağlıSonucun dili, en veya ru. Varsayılan olarak hesabınızın dili
addonsisteğe bağlı/services içinde bu paket için sunulan ek hizmetlerin kimlikleri, örneğin [7]
promoCodeisteğe bağlıBir promosyon kodu; geçerli değilse sipariş verilmez (bkz. Hatalar)
awaitBriefisteğe bağlıBrifi daha sonra, dosyaları yükledikten sonra göndermek için true: sipariş ödenir ve awaiting_brief durumunda bekler. Bu durumda text, link, answers ve script göndermeyin. Bkz. Dosyalar
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 isteğe bağlıdır ve isteği güvenle tekrarlamanızı sağlar; her yeni sipariş için yeni bir anahtar gerekir. Aşağıdaki Idempotency bölümüne bakın.

text veya en az bir yanıt ya da her ikisini birden gönderin; seslendirme için script yeterlidir. Her soruyu q içine briefQuestions içinde yazıldığı gibi, sipariş dilinde yazın ve yanıtınız olmayan soruları göndermeyin:

{
  "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" }
  ]
}

Yanıt, siparişin kendisidir (durum 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": []
}

Dosyalar

Bazı hizmetler, müşterinin dosyaları üzerinden çalışır; örneğin metne dökülecek sayfa görselleri veya altyazı eklenecek bir kayıt: bu hizmetlerin /services içindeki files değeri null değildir. Dosyalar, brifini bekleyen bir siparişe yüklenir:

  1. Siparişi "awaitBrief": true ile ve text, link, answers ve script olmadan verin. Sipariş hemen ödenir ve durumu awaiting_brief olur; teslim süresi brif ile başlar.
  2. Her dosya için {"name": "page-1.png", "size": 482113, "mime": "image/png"} ile POST /orders/{id}/files gönderin: size bayt cinsinden tam boyuttur, mime isteğe bağlıdır. Yanıt (201), dosyayı ve dosyanın nereye yükleneceğini içerir:
{
  "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. Dosyanın baytlarını, upload.expiresAt zamanından önce (bir saat), tam olarak verilen headers ile ve API anahtarı olmadan upload.url adresine PUT ile gönderin:
curl -X PUT "$url" -H "content-type: application/octet-stream" --data-binary @page-1.png
  1. POST /orders/{id}/files/{fileId}/complete. Boyutu size değerinden farklı olan veya baytları accept içindeki bir türe ait olmayan dosya 422 ile reddedilir ve silinir: ad ve mime dikkate alınmaz. Aksi halde yanıt, artık checking durumundaki dosyadır. Birkaç saniye sonra (uzun bir kayıtta birkaç dakika sonra) dosya ready olur ya da rejected olur ve gerekçe reason içinde yer alır, örneğin recording_no_sound veya file_unreadable. Siparişin files alanı dosyaların durumunu gösterir.
  2. POST /orders/{id}/brief isteğini, POST /orders içindeki gibi text, link, answers ve script ile gönderin. Henüz gönderilmemiş hazır dosyalar brifle birlikte gider; isterseniz gönderilecekleri fileIds içinde listeleyin. Bunlardan biri hâlâ checking durumundayken brif 409 files_not_ready ile reddedilir: biraz sonra yeniden gönderin. Yanıt (200), artık in_progress durumundaki sipariştir.

DELETE /orders/{id}/files/{fileId}, henüz gönderilmemiş bir dosyayı geri alır. Bir sipariş en fazla 5 dosya ve toplam 4 GB alır; yüklemesi başlatılmış bir dosya, tamamlanana veya geri alınana kadar hesaba katılır; geri alınan veya reddedilen dosyalar ise yüklemelerinin başlangıcından itibaren bir gün boyunca, siparişin dosyalarıyla birlikte 12 GB sınırına dahil edilir: bu sınır aşıldığında yükleme 409 upload_quota ve yüklemenin yeniden kabul edileceği zamanı gösteren retryAt ile reddedilir. Teslim edilmiş bir sipariş, revizyon talebi için de dosya alır: dosyaları aynı şekilde yükleyin, ardından talep ile birlikte fileIds gönderin.

awaitBrief olmadan, dosyaları required olan bir hizmetin siparişi 400 files_required ile; dosyanın bağlantı yerine geçebildiği bir hizmetin bağlantısız gönderilen siparişi ise 400 link_required ile reddedilir.

Siparişte files, dosyalarınızı status değerleriyle birlikte listeler; fileIds ise brifle birlikte gidenleri gösterir. Hazır bir dosyanın, sonuç dosyalarında olduğu gibi expiresAt zamanına kadar çalışan bir url adresi vardır. Dosyalar, siparişin kapanmasından itibaren 30 gün saklanır.

Idempotency

Sipariş zaten verildikten sonra bir istek zaman aşımına uğrayabilir. POST /orders isteğini iki kez ödeme yapmadan tekrarlamak için isteğe bir Idempotency-Key başlığı ekleyin: her sipariş için bir kez seçtiğiniz, 1 ile 255 arası yazdırılabilir ASCII karakterden oluşan bir dize; örneğin bir UUID veya kendi sipariş numaranız. İsteği tekrarlarken aynı anahtarı ve aynı gövdeyi gönderin.

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: ..."}'

Bu anahtarla zaten bir sipariş verildiyse yanıt, o siparişin güncel halidir; durum 201'dir ve bir başlık daha eklenir. Yeniden hiçbir tahsilat yapılmaz:

HTTP/1.1 201 Created
Idempotent-Replayed: true

Onaylama, brif ve revizyon talepleri anahtar almaz. Onaylamayı tekrarlamak güvenlidir: sipariş tamamlandıktan sonra tekrar 409 order_not_delivered yanıtını alır. Brif için de aynısı geçerlidir: brif kabul edildikten sonra tekrar 409 brief_not_expected yanıtını alır ve sipariş in_progress durumundadır. Revizyon talebi farklıdır: iş yeniden yapılırken tekrar 409 order_not_delivered yanıtını alır, ancak yeniden yapılan iş teslim edildikten sonra tekrar, yeni bir revizyon talep eder. Bir revizyon talebini tekrarlamadan önce siparişi GET /orders/{id} (status ve revisionsLeft) ile kontrol edin.

Siparişlerin takibi

GET /orders/{id} tek bir siparişi, GET /orders ise siparişlerinizi en yeniden başlayarak döndürür. Liste status, limit (1 ile 100 arası, varsayılan 20) ve before (daha eski siparişleri almak için bir sipariş kimliği) parametrelerini alır.

Sipariş durumu:

DurumAnlamı
awaiting_briefawaitBrief ile verildi: POST /orders/{id}/brief bekleniyor
in_progressİş yapılıyor
quality_checkİş tamamlandı ve teslimattan önce kontrol ediliyor
deliveredSonuç hazır, bkz. results. autoAcceptAt zamanına kadar onaylayın veya değişiklik isteyin
revisionİstediğiniz değişiklikler yapılıyor
completedSonucu onayladınız veya sonuç otomatik olarak onaylandı
refundedPara bakiyenize iade edildi

Birkaç dakikada bir kontrol edin; daha sık sormanıza gerek yoktur. Sipariş delivered olduğunda iş results içindedir: kind değeri text (Markdown), report (sosyal medya siparişleri için teslimat raporu) veya files (indirilecek dosyalar, body içinde isteğe bağlı bir notla) olur. Her sonucun, metinler ve raporlar için boş olan bir files listesi vardır: her dosyanın name, mime, bayt cinsinden size değerleri ve expiresAt zamanına (yaklaşık bir saat) kadar çalışan bir url adresi bulunur. Yeni bağlantılar için siparişi yeniden okuyun. Bağlantı dosya deposuna yönlendirebilir; bu nedenle yönlendirmeleri izleyin, örneğin curl -L -o result.png "$url", ve bağlantıyla birlikte API anahtarı göndermeyin: dosyayı açmak için bağlantı tek başına yeterlidir.

Onaylama ve revizyonlar

Teslim edilen bir siparişi ne onaylar ne de revize ettirirseniz sipariş, teslimattan 3 gün sonra, autoAcceptAt içindeki zamanda (diğer durumlarda null) otomatik olarak onaylanır. Bir revizyondan sonraki yeni teslimat 3 günlük süreyi yeniden başlatır. İşi sitede de onaylayabilirsiniz. Teslimattan sonra sitedeki sipariş sohbetine yazarsanız sipariş otomatik olarak onaylanmaz ve siz onaylayana ya da biz işi yeniden yapana veya bedelini iade edene kadar autoAcceptAt değeri null olur. Mesajınızı yanıtladıktan sonra 3 günlük süreyi yeniden başlatabiliriz: bu durumda autoAcceptAt yeni zamanı gösterir.

Hatalar

Hatalar bir HTTP durumu ve bir kodla birlikte döner:

{ "code": "insufficient_balance" }
DurumKodAnlamı
400validationBir alan eksik veya hatalı; fields bunları listeler
400link_requiredBu hizmet için link gerekir
400files_requiredBu hizmet için dosya gerekir: siparişi awaitBrief ile verin ve dosyayı yükleyin
400script_requiredBu hizmet bir metni seslendirir: metni script içinde gönderin
400script_too_longscript, paketin okuduğundan uzun; yanıttaki maxChars alabileceği en fazla uzunluktur. Hiçbir tahsilat yapılmadı
400script_not_acceptedHizmet metin seslendirmez (/services içindeki script değeri null): script göndermeyin. Hiçbir tahsilat yapılmadı
400files_not_accepted, file_too_largeHizmet dosya almıyor veya dosya, hizmetin maxMb değerinden büyük
400invalid_idempotency_keyIdempotency-Key boş, 255 karakterden uzun veya yazdırılabilir ASCII değil
401invalid_api_keyAnahtar yok, anahtar hatalı veya iptal edilmiş. Hesabın doğrulanmamış e-postası Google ile giriş yapılarak veya yeni şifre belirlenerek doğrulandığında da anahtarlar iptal edilir
402insufficient_balanceBakiyede yeterli para yok; hiçbir tahsilat yapılmadı
404package_not_found, order_not_found, file_not_foundBöyle bir hizmet, paket, sipariş veya dosya yok
409order_not_delivered, no_revisions_leftSipariş bu işlem için uygun durumda değil
409brief_not_expectedSipariş brifini beklemiyor: awaitBrief olmadan verildi veya brifi zaten gönderildi
409uploads_closedDosyalar yalnızca sipariş brifini beklerken veya teslim edilmişken kabul edilir
409files_limitHizmetin bir brif veya taleple aldığından fazla dosya ya da sipariş için 5 dosya veya 4 GB sınırı aşıldı
409upload_quotaBu dosyayla birlikte, siparişin dosyaları (gönderilenler ve tamamlanmamış yüklemeler dahil) ile son bir gün içinde başlatılıp sonra geri alınan veya reddedilen dosyalar 12 GB'ı aşıyor: retryAt zamanından sonra yeniden deneyin
409files_not_ready, file_rejectedGönderilecek bir dosya hâlâ kontrol ediliyor veya reddedildi
409upload_incompleteBağlantıya henüz hiçbir şey yüklenmedi: PUT işlemini bitirin, ardından yüklemeyi yeniden tamamlayın
409file_in_use, file_busyDosya brifle veya bir taleple birlikte gönderildi ve siparişte kalır ya da kontrol sırasında taşınıyor: biraz sonra yeniden deneyin
409addon_unavailableBir ek hizmet bu hizmet ve paket için sunulmuyor
409promo_not_found, promo_inactive, promo_used_up, promo_already_used, promo_first_order_only, promo_min_orderPromosyon kodu mevcut değil, şu anda etkin değil, kullanım hakkı tükendi, sizin tarafınızdan zaten kullanıldı, yalnızca ilk sipariş için geçerli veya daha yüksek tutarlı bir sipariş gerektiriyor. Hiçbir tahsilat yapılmadı
409idempotency_key_in_progressBu Idempotency-Key ile gönderilen bir istek hâlâ işleniyor; kısa bir süre sonra tekrarlayın
410upload_expired, file_removedYükleme bağlantısının süresi hiçbir şey yüklenmeden doldu veya dosyayı geri aldınız: yeni bir yükleme başlatın
415file_type_not_acceptedBelirtilen mime, hizmetin kabul ettiği bir türe ait değil
422idempotency_key_reusedBu Idempotency-Key farklı bir istekle zaten kullanıldı
422upload_size_mismatch, file_type_not_acceptedYüklenen dosyanın boyutu size ile aynı değil veya baytları hizmetin kabul ettiği bir türe ait değil; dosya silindi
422file_unreadable, recording_no_sound, check_failed, document_no_text, document_protectedKontrolün reddettiği bir dosya tamamlanıyor: dosya açılmıyor, kayıtta ses yok veya dosya kontrol edilemedi. Dosyayı yeniden ya da başka bir dosya yükleyin. Belgede okunacak metin yok, örneğin bir tarama (document_no_text), veya belge şifreyle korunuyor (document_protected).
429rate_limitedBir anahtarla dakikada 120 istek sınırı aşıldı; Retry-After içindeki saniye kadar bekleyin

İadeler

Bir siparişin bedelini iade edersek para bakiyeye geri döner ve sipariş refunded olur.