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
- Zaloguj się i otwórz Saldo i klucze API.
- 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ć.
- 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 | ||
|---|---|---|
service | wymagane | Usługa z /services |
tier | wymagane | basic, standard lub premium |
text | wymagane, jeśli nie ma answers, script ani awaitBrief | Zadanie: co zrobić, do 10 000 znaków. Przy script: jak czytać (ton, tempo, wymowa nazw) |
link | opcjonalne | Link 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 |
answers | opcjonalne | Odpowiedzi na briefQuestions usługi: [{"q": "question", "a": "answer"}], maksymalnie 8, każda odpowiedź do 5000 znaków |
script | wymagane, gdy script w /services nie jest null, w pozostałych przypadkach odrzucane | Tekst 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 |
locale | opcjonalne | Język wyniku, en lub ru. Domyślnie język twojego konta |
addons | opcjonalne | Identyfikatory dodatków z /services oferowanych dla tego pakietu, np. [7] |
promoCode | opcjonalne | Kod promocyjny; jeśli nie obowiązuje, zamówienie nie zostanie złożone (zobacz Błędy) |
awaitBrief | opcjonalne | true, 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:
- Złóż zamówienie z
"awaitBrief": truei beztext,link,answersiscript. Jest opłacane od razu, a jego status toawaiting_brief; termin zaczyna biec od wysłania briefu. - Dla każdego pliku wyślij
POST /orders/{id}/filesz{"name": "page-1.png", "size": 482113, "mime": "image/png"}:sizeto dokładny rozmiar w bajtach,mimejest 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" }
}
- Wyślij bajty pliku metodą
PUTnaupload.urlz dokładnie podanymiheadersi bez klucza API, przedupload.expiresAt(godzina):
curl -X PUT "$url" -H "content-type: application/octet-stream" --data-binary @page-1.png
POST /orders/{id}/files/{fileId}/complete. Plik o innym rozmiarze niżsizelub taki, którego bajty nie odpowiadają rodzajowi zaccept, jest odrzucany z422i usuwany: nazwa imimenie mają znaczenia. W przeciwnym razie odpowiedzią jest plik, teraz w staniechecking. Po kilku sekundach, a w przypadku długiego nagrania po kilku minutach, ma stanreadylubrejectedz przyczyną wreason, np.recording_no_soundalbofile_unreadable. Polefileszamówienia pokazuje ich stan.POST /orders/{id}/briefztext,link,answersiscriptjak wPOST /orders. Dołączane są do niego gotowe pliki, które nie zostały jeszcze wysłane, albo te, które wymienisz wfileIds. Dopóki któryś z nich jest nadal w staniechecking, brief jest odrzucany z409 files_not_ready: wyślij go ponownie nieco później. Odpowiedzią (200) jest zamówienie, teraz w staniein_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
- Klucz należy do żądania, z którym został wysłany po raz pierwszy. Ten sam klucz z inną treścią, np. innymi dodatkami lub innym kodem promocyjnym, jest odrzucany z
422 idempotency_key_reusedi nic nie jest pobierane. - Jeśli jednocześnie nadejdzie kilka żądań z tym samym kluczem, składane jest jedno zamówienie, a pozostałe żądania je zwracają. Żądanie, które musiałoby czekać zbyt długo, zwraca
409 idempotency_key_in_progressi nic nie pobiera: powtórz je za chwilę. - Żądanie zakończone błędem, np.
400,402,404lub błędem dodatku albo kodu promocyjnego, nie zużywa klucza: popraw je i wyślij ponownie z tym samym kluczem. - Klucz jest przechowywany przez 24 godziny. Po tym czasie ten sam klucz składa nowe zamówienie.
- Klucze są oddzielne dla każdego konta. Bez nagłówka każde żądanie składa nowe zamówienie.
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:
| Status | Znaczenie |
|---|---|
awaiting_brief | Złożone z awaitBrief: czeka na POST /orders/{id}/brief |
in_progress | Praca jest wykonywana |
quality_check | Praca jest gotowa i sprawdzana przed dostarczeniem |
delivered | Wynik jest gotowy, zobacz results. Zaakceptuj go lub poproś o poprawki do autoAcceptAt |
revision | Wprowadzane są poprawki, o które prosiłeś |
completed | Zaakceptowałeś wynik lub został zaakceptowany automatycznie |
refunded | Pienią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
POST /orders/{id}/acceptakceptuje wynik i kończy zamówienie.POST /orders/{id}/revisionz{"text": "what to change"}prosi o poprawki, dopókirevisionsLeftjest większe od zera. Jeśli usługa przyjmuje pliki,fileIdszawiera listę plików przesłanych do prośby; bez tego pola dołączane są gotowe pliki, które nie zostały jeszcze wysłane.
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" }
| Status | Kod | Znaczenie |
|---|---|---|
| 400 | validation | Brakuje pola lub ma ono nieprawidłową wartość; fields zawiera ich listę |
| 400 | link_required | Ta usługa wymaga link |
| 400 | files_required | Ta usługa wymaga pliku: złóż zamówienie z awaitBrief i prześlij go |
| 400 | script_required | Ta usługa odczytuje tekst na głos: wyślij go w script |
| 400 | script_too_long | script jest dłuższy, niż odczytuje pakiet; maxChars w odpowiedzi to maksymalna długość. Nic nie zostało pobrane |
| 400 | script_not_accepted | Usługa nie odczytuje tekstu na głos (jej script w /services to null): pomiń script. Nic nie zostało pobrane |
| 400 | files_not_accepted, file_too_large | Usługa nie przyjmuje plików lub plik jest większy niż jej maxMb |
| 400 | invalid_idempotency_key | Idempotency-Key jest pusty, dłuższy niż 255 znaków lub zawiera znaki spoza drukowalnego ASCII |
| 401 | invalid_api_key | Brak 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 |
| 402 | insufficient_balance | Za mało środków na saldzie; nic nie zostało pobrane |
| 404 | package_not_found, order_not_found, file_not_found | Nie ma takiej usługi, pakietu, zamówienia lub pliku |
| 409 | order_not_delivered, no_revisions_left | Zamówienie nie jest w stanie, który na to pozwala |
| 409 | brief_not_expected | Zamówienie nie czeka na brief: zostało złożone bez awaitBrief lub jego brief został już wysłany |
| 409 | uploads_closed | Pliki są przyjmowane tylko wtedy, gdy zamówienie czeka na brief lub zostało dostarczone |
| 409 | files_limit | Więcej plików, niż usługa przyjmuje z jednym briefem lub prośbą, albo ponad 5 plików lub 4 GB na zamówienie |
| 409 | upload_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 |
| 409 | files_not_ready, file_rejected | Plik do wysłania jest jeszcze sprawdzany lub został odrzucony |
| 409 | upload_incomplete | Pod link nic jeszcze nie przesłano: dokończ PUT, a następnie ponownie zakończ przesyłanie |
| 409 | file_in_use, file_busy | Plik został dołączony do briefu lub prośby i pozostaje przy zamówieniu albo jest przenoszony w trakcie sprawdzania: spróbuj ponownie za chwilę |
| 409 | addon_unavailable | Dodatek nie jest oferowany dla tej usługi i pakietu |
| 409 | promo_not_found, promo_inactive, promo_used_up, promo_already_used, promo_first_order_only, promo_min_order | Kod 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 |
| 409 | idempotency_key_in_progress | Żądanie z tym Idempotency-Key jest nadal przetwarzane; powtórz je za chwilę |
| 410 | upload_expired, file_removed | Link do przesyłania wygasł, zanim cokolwiek przesłano, lub wycofałeś plik: rozpocznij nowe przesyłanie |
| 415 | file_type_not_accepted | Podane mime nie należy do rodzajów przyjmowanych przez usługę |
| 422 | idempotency_key_reused | Ten Idempotency-Key został już użyty z innym żądaniem |
| 422 | upload_size_mismatch, file_type_not_accepted | Przesłany plik ma inny rozmiar niż size lub jego bajty nie należą do rodzaju przyjmowanego przez usługę; plik został usunięty |
| 422 | file_unreadable, recording_no_sound, check_failed | Koń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 |
| 429 | rate_limited | Ponad 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.