API

Zamawiaj usługi z własnej strony, sklepu lub skryptu: pobieraj listę usług i cen, składaj zamówienia z opisem zadania, śledź je i pobieraj wyniki. To ta sama usługa co na stronie, więc zamówienia złożone przez API pojawiają się też na twoim koncie.

Pierwsze kroki

  1. Zaloguj się i otwórz Saldo i klucze API.
  2. Utwórz klucz. Jest wyświetlany tylko raz: skopiuj go i trzymaj w tajemnicy jak hasło. Klucz możesz w każdej chwili unieważnić.
  3. Doładuj saldo. Zamówienia złożone przez API są z niego opłacane, w dolarach amerykańskich.

Dołączaj klucz do każdego żądania:

Authorization: Bearer dlx_your_key

Adres API: https://dleex.com/api/v1. Żądania i odpowiedzi są w formacie JSON. Ceny i kwoty podawane są w pełnych centach amerykańskich: 1500 oznacza 15,00 USD.

Usługi

GET /services zwraca listę tego, co można zamówić.

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 to czas realizacji; revisions to liczba próśb o poprawki, z których możesz skorzystać. addons to dodatki, które możesz zamówić do pakietów wymienionych w tiers: ich cena dolicza się do ceny pakietu, a extraDays do jego terminu (wartość ujemna oznacza szybciej, ale nigdy poniżej 1 dnia). briefQuestions to pytania, które usługa zadaje o zadanie, niektóre z podpowiedzią w hint; odpowiedz na nie w answers przy składaniu zamówienia. Lista jest pusta, gdy usługa o nic nie pyta. linkRequired ma wartość true w przypadku usługi wykonywanej na podstawie tego, co otwiera link, np. profilu, posta lub nagrania do napisów: zamówienie takiej usługi wymaga link.

files ma wartość null w przypadku usługi, która nie przyjmuje plików z briefem. W przeciwnym razie określa, jakie pliki przyjmuje, np. {"accept": ["image"], "maxFiles": 3, "maxMb": 5, "required": true, "insteadOfLink": false}: rodzaje (image, audio, video), ile plików można dołączyć do jednego briefu lub prośby o poprawki, jak duży może być każdy plik w MB, czy brief wymaga co najmniej jednego pliku oraz czy plik może zastąpić link (linkRequired ma wtedy nadal wartość true dla zamówień wysłanych bez plików). Zobacz Pliki.

script ma wartość null w przypadku usługi, która nie odczytuje tekstu na głos. Usługa lektorska podaje najdłuższy tekst, jaki odczytuje każdy pakiet, w znakach, np. {"maxChars": {"basic": 1000, "standard": 3000, "premium": 9000}}: jej zamówienia wymagają script, czyli tekstu do odczytania słowo w słowo. Nagranie jest odczytywane syntetycznym głosem: gdziekolwiek je opublikujesz, poinformuj słuchaczy, że głos jest syntetyczny (zobacz Regulamin).

Saldo

GET /balance

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

Składanie zamówienia

POST /orders. Cena (pakiet i dodatki, pomniejszone o ewentualny rabat) jest pobierana z salda, a praca rusza od razu.

Pole
servicewymaganeUsługa z /services
tierwymaganebasic, standard lub premium
textwymagane, jeśli nie ma answers, script ani awaitBriefZadanie: co zrobić, do 10 000 znaków. Przy script: jak czytać (ton, tempo, wymowa nazw)
linkopcjonalneLink do strony, profilu lub posta albo do nagrania: bezpośredni link do pliku lub link do Dropboxa albo Yandex Disk. Wymagane, gdy linkRequired ma wartość true
answersopcjonalneOdpowiedzi na briefQuestions usługi: [{"q": "question", "a": "answer"}], maksymalnie 8, każda odpowiedź do 5000 znaków
scriptwymagane, gdy script w /services nie jest null, w pozostałych przypadkach odrzucaneTekst do odczytania na głos, słowo w słowo, do maxChars pakietu (maksymalnie 20 000 znaków, podział wiersza liczy się jako jeden). Oddzielaj akapity pustym wierszem
localeopcjonalneJęzyk wyniku, en lub ru. Domyślnie język twojego konta
addonsopcjonalneIdentyfikatory dodatków z /services oferowanych dla tego pakietu, np. [7]
promoCodeopcjonalneKod promocyjny; jeśli nie obowiązuje, zamówienie nie zostanie złożone (zobacz Błędy)
awaitBriefopcjonalnetrue, aby wysłać brief później, po przesłaniu plików: zamówienie jest opłacane i czeka w stanie awaiting_brief. Pomiń wtedy text, link, answers i script. Zobacz Pliki
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 jest opcjonalny i pozwala bezpiecznie powtórzyć żądanie; każde nowe zamówienie wymaga nowego klucza. Zobacz Idempotentność poniżej.

Podaj text albo co najmniej jedną odpowiedź, albo jedno i drugie; w przypadku usługi lektorskiej wystarczy script. Wpisz każde pytanie w q tak, jak brzmi w briefQuestions, w języku zamówienia, i pomiń te, na które nie masz odpowiedzi:

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

Odpowiedzią jest zamówienie (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": []
}

Pliki

Niektóre usługi pracują na plikach klienta, np. zdjęciach stron do przepisania lub nagraniu do napisów: ich files w /services nie jest null. Pliki przesyła się do zamówienia, które czeka na brief:

  1. Złóż zamówienie z "awaitBrief": true i bez text, link, answers i script. Jest opłacane od razu, a jego status to awaiting_brief; termin zaczyna biec od wysłania briefu.
  2. Dla każdego pliku wyślij POST /orders/{id}/files z {"name": "page-1.png", "size": 482113, "mime": "image/png"}: size to dokładny rozmiar w bajtach, mime jest opcjonalne. Odpowiedzią (201) jest plik i miejsce, do którego należy go przesłać:
{
  "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. Wyślij bajty pliku metodą PUT na upload.url z dokładnie podanymi headers i bez klucza API, przed upload.expiresAt (godzina):
curl -X PUT "$url" -H "content-type: application/octet-stream" --data-binary @page-1.png
  1. POST /orders/{id}/files/{fileId}/complete. Plik o innym rozmiarze niż size lub taki, którego bajty nie odpowiadają rodzajowi z accept, jest odrzucany z 422 i usuwany: nazwa i mime nie mają znaczenia. W przeciwnym razie odpowiedzią jest plik, teraz w stanie checking. Po kilku sekundach, a w przypadku długiego nagrania po kilku minutach, ma stan ready lub rejected z przyczyną w reason, np. recording_no_sound albo file_unreadable. Pole files zamówienia pokazuje ich stan.
  2. POST /orders/{id}/brief z text, link, answers i script jak w POST /orders. Dołączane są do niego gotowe pliki, które nie zostały jeszcze wysłane, albo te, które wymienisz w fileIds. Dopóki któryś z nich jest nadal w stanie checking, brief jest odrzucany z 409 files_not_ready: wyślij go ponownie nieco później. Odpowiedzią (200) jest zamówienie, teraz w stanie in_progress.

DELETE /orders/{id}/files/{fileId} wycofuje plik, który nie został jeszcze wysłany. Zamówienie przyjmuje maksymalnie 5 plików i łącznie 4 GB; plik, którego przesyłanie się rozpoczęło, wlicza się do limitu, dopóki nie zostanie ukończony lub wycofany, a przez dobę od rozpoczęcia przesyłania pliki wycofane lub odrzucone wliczają się razem z plikami zamówienia do limitu 12 GB: po jego przekroczeniu przesyłanie jest odrzucane z 409 upload_quota i retryAt, czyli czasem, od którego jest znowu przyjmowane. Dostarczone zamówienie przyjmuje też pliki do prośby o poprawki: prześlij je w ten sam sposób, a potem wyślij fileIds razem z prośbą.

Bez awaitBrief zamówienie usługi, której pliki są required, jest odrzucane z 400 files_required, a zamówienie usługi, w której plik może zastąpić link, wysłane bez linku, z 400 link_required.

W zamówieniu files zawiera listę twoich plików z ich status, a fileIds te, które zostały dołączone do briefu. Gotowy plik ma url działający do expiresAt, podobnie jak pliki wyników. Pliki są przechowywane przez 30 dni od zamknięcia zamówienia.

Idempotentność

Żądanie może przekroczyć limit czasu już po złożeniu zamówienia. Aby powtórzyć POST /orders bez podwójnej płatności, wyślij z nim nagłówek Idempotency-Key: ciąg od 1 do 255 drukowalnych znaków ASCII, który wybierasz raz dla każdego zamówienia, np. UUID lub własny numer zamówienia. Powtarzając żądanie, wyślij ten sam klucz i tę samą treść.

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

Jeśli zamówienie z tym kluczem zostało już złożone, odpowiedzią jest to zamówienie w obecnym stanie, ze statusem 201 i jednym dodatkowym nagłówkiem. Nic nie jest pobierane ponownie:

HTTP/1.1 201 Created
Idempotent-Replayed: true

Akceptacja, briefy i prośby o poprawki nie przyjmują klucza. Akceptację można bezpiecznie powtórzyć: gdy zamówienie jest już zakończone, powtórzenie zwraca 409 order_not_delivered. Podobnie brief: gdy został przyjęty, powtórzenie zwraca 409 brief_not_expected, a zamówienie jest w stanie in_progress. Z prośbą o poprawki jest inaczej: gdy praca jest poprawiana, powtórzenie zwraca 409 order_not_delivered, ale gdy poprawiona praca zostanie dostarczona, powtórzenie prosi o kolejne poprawki. Przed powtórzeniem prośby o poprawki sprawdź zamówienie przez GET /orders/{id} (status i revisionsLeft).

Śledzenie zamówień

GET /orders/{id} zwraca jedno zamówienie, GET /orders twoje zamówienia, od najnowszych. Lista przyjmuje status, limit (od 1 do 100, domyślnie 20) i before (identyfikator zamówienia, aby pobrać starsze zamówienia).

Status zamówienia:

StatusZnaczenie
awaiting_briefZłożone z awaitBrief: czeka na POST /orders/{id}/brief
in_progressPraca jest wykonywana
quality_checkPraca jest gotowa i sprawdzana przed dostarczeniem
deliveredWynik jest gotowy, zobacz results. Zaakceptuj go lub poproś o poprawki do autoAcceptAt
revisionWprowadzane są poprawki, o które prosiłeś
completedZaakceptowałeś wynik lub został zaakceptowany automatycznie
refundedPieniądze wróciły na twoje saldo

Sprawdzaj co kilka minut; nie ma potrzeby pytać częściej. Gdy zamówienie ma stan delivered, results zawiera pracę: kind to text (Markdown), report (raport z wykonania w przypadku zamówień dotyczących mediów społecznościowych) lub files (pliki do pobrania, z opcjonalną notatką w body). Każdy wynik ma listę files, pustą dla tekstów i raportów: każdy plik ma name, mime, size w bajtach oraz url działający do expiresAt, czyli około godziny. Aby uzyskać świeże linki, pobierz zamówienie ponownie. Link może przekierowywać do magazynu plików, więc obsługuj przekierowania, np. curl -L -o result.png "$url", i nie wysyłaj z nim klucza API: sam link otwiera plik.

Akceptacja i poprawki

Jeśli nie zaakceptujesz dostarczonego zamówienia ani nie poprosisz o poprawki, zostanie ono zaakceptowane automatycznie 3 dni po dostarczeniu, w czasie podanym w autoAcceptAt (null w innych stanach). Nowe dostarczenie po poprawkach rozpoczyna odliczanie 3 dni od nowa. Pracę możesz też zaakceptować na stronie. Jeśli po dostarczeniu napiszesz na czacie zamówienia na stronie, zamówienie nie zostanie zaakceptowane automatycznie, a autoAcceptAt ma wartość null, dopóki go nie zaakceptujesz albo dopóki nie poprawimy pracy lub nie zwrócimy pieniędzy. Po odpowiedzi na twoją wiadomość możemy też rozpocząć odliczanie 3 dni od nowa: autoAcceptAt pokazuje wtedy nowy czas.

Błędy

Błędy są zwracane ze statusem HTTP i kodem:

{ "code": "insufficient_balance" }
StatusKodZnaczenie
400validationBrakuje pola lub ma ono nieprawidłową wartość; fields zawiera ich listę
400link_requiredTa usługa wymaga link
400files_requiredTa usługa wymaga pliku: złóż zamówienie z awaitBrief i prześlij go
400script_requiredTa usługa odczytuje tekst na głos: wyślij go w script
400script_too_longscript jest dłuższy, niż odczytuje pakiet; maxChars w odpowiedzi to maksymalna długość. Nic nie zostało pobrane
400script_not_acceptedUsługa nie odczytuje tekstu na głos (jej script w /services to null): pomiń script. Nic nie zostało pobrane
400files_not_accepted, file_too_largeUsługa nie przyjmuje plików lub plik jest większy niż jej maxMb
400invalid_idempotency_keyIdempotency-Key jest pusty, dłuższy niż 255 znaków lub zawiera znaki spoza drukowalnego ASCII
401invalid_api_keyBrak klucza, nieprawidłowy klucz lub klucz unieważniony. Klucze są też unieważniane, gdy niepotwierdzony e-mail konta zostanie potwierdzony przez zalogowanie się kontem Google lub ustawienie nowego hasła
402insufficient_balanceZa mało środków na saldzie; nic nie zostało pobrane
404package_not_found, order_not_found, file_not_foundNie ma takiej usługi, pakietu, zamówienia lub pliku
409order_not_delivered, no_revisions_leftZamówienie nie jest w stanie, który na to pozwala
409brief_not_expectedZamówienie nie czeka na brief: zostało złożone bez awaitBrief lub jego brief został już wysłany
409uploads_closedPliki są przyjmowane tylko wtedy, gdy zamówienie czeka na brief lub zostało dostarczone
409files_limitWięcej plików, niż usługa przyjmuje z jednym briefem lub prośbą, albo ponad 5 plików lub 4 GB na zamówienie
409upload_quotaŁącznie z tym plikiem pliki zamówienia (w tym wysłane i nieukończone przesyłania) oraz pliki rozpoczęte w ciągu ostatniej doby, a potem wycofane lub odrzucone, przekraczają 12 GB: spróbuj ponownie po retryAt
409files_not_ready, file_rejectedPlik do wysłania jest jeszcze sprawdzany lub został odrzucony
409upload_incompletePod link nic jeszcze nie przesłano: dokończ PUT, a następnie ponownie zakończ przesyłanie
409file_in_use, file_busyPlik został dołączony do briefu lub prośby i pozostaje przy zamówieniu albo jest przenoszony w trakcie sprawdzania: spróbuj ponownie za chwilę
409addon_unavailableDodatek nie jest oferowany dla tej usługi i pakietu
409promo_not_found, promo_inactive, promo_used_up, promo_already_used, promo_first_order_only, promo_min_orderKod promocyjny nie istnieje, jest obecnie nieaktywny, wyczerpał się, został już przez ciebie użyty, dotyczy tylko pierwszego zamówienia lub wymaga większego zamówienia. Nic nie zostało pobrane
409idempotency_key_in_progressŻądanie z tym Idempotency-Key jest nadal przetwarzane; powtórz je za chwilę
410upload_expired, file_removedLink do przesyłania wygasł, zanim cokolwiek przesłano, lub wycofałeś plik: rozpocznij nowe przesyłanie
415file_type_not_acceptedPodane mime nie należy do rodzajów przyjmowanych przez usługę
422idempotency_key_reusedTen Idempotency-Key został już użyty z innym żądaniem
422upload_size_mismatch, file_type_not_acceptedPrzesłany plik ma inny rozmiar niż size lub jego bajty nie należą do rodzaju przyjmowanego przez usługę; plik został usunięty
422file_unreadable, recording_no_sound, check_failedKończenie przesyłania pliku odrzuconego podczas sprawdzania: nie otwiera się, nagranie nie ma dźwięku lub nie dało się go sprawdzić. Prześlij plik ponownie albo inny plik
429rate_limitedPonad 120 żądań na minutę z jednym kluczem; odczekaj liczbę sekund podaną w Retry-After

Zwroty

Jeśli zwrócimy pieniądze za zamówienie, trafiają one z powrotem na saldo, a zamówienie przechodzi w stan refunded.