API

Bestellen Sie Leistungen direkt von Ihrer Website, aus Ihrem Shop oder per Skript: Leistungen und Preise abrufen, Bestellungen mit der Aufgabe aufgeben, ihren Stand verfolgen und die Ergebnisse abholen. Es ist dieselbe Leistung wie auf der Website, daher erscheinen über die API aufgegebene Bestellungen auch in Ihrem Konto.

Erste Schritte

  1. Melden Sie sich an und öffnen Sie Guthaben und API-Schlüssel.
  2. Erstellen Sie einen Schlüssel. Er wird nur einmal angezeigt: Kopieren Sie ihn und halten Sie ihn geheim wie ein Passwort. Sie können einen Schlüssel jederzeit widerrufen.
  3. Laden Sie Ihr Guthaben auf. Über die API aufgegebene Bestellungen werden davon bezahlt, in US-Dollar.

Senden Sie den Schlüssel mit jeder Anfrage:

Authorization: Bearer dlx_your_key

Adresse der API: https://dleex.com/api/v1. Anfragen und Antworten sind JSON. Preise und Beträge sind ganze US-Cent: 1500 bedeutet 15,00 $.

Leistungen

GET /services listet auf, was bestellt werden kann.

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 gibt an, wie lange die Arbeit dauert; revisions, wie oft Sie Änderungen anfordern können. addons sind Extras, die Sie zu den Paketen in tiers bestellen können: Ihr Preis wird zum Paketpreis addiert und extraDays zur Lieferzeit (negativ: schneller, aber nie unter 1 Tag). briefQuestions sind die Fragen der Leistung zur Aufgabe, manche mit einem hint; beantworten Sie sie beim Bestellen in answers. Die Liste ist leer, wenn eine Leistung keine Fragen stellt. linkRequired ist true bei einer Leistung, die anhand dessen erbracht wird, was ein Link öffnet, etwa ein Profil oder Beitrag oder eine zu untertitelnde Aufnahme: Eine Bestellung dafür braucht link.

files ist null bei einer Leistung, die mit dem Briefing keine Dateien annimmt. Andernfalls steht dort, welche sie annimmt, z. B. {"accept": ["image"], "maxFiles": 3, "maxMb": 5, "required": true, "insteadOfLink": false}: die Arten (image, audio, video), wie viele Dateien mit einem Briefing oder Überarbeitungswunsch, wie groß jede Datei in MB sein darf, ob das Briefing mindestens eine braucht und ob eine Datei link ersetzen kann (linkRequired ist dann für Bestellungen ohne Dateien trotzdem true). Siehe Dateien.

script ist null bei einer Leistung, die keinen Text vorliest. Eine Sprecherleistung enthält den längsten Text, den jedes Paket vorliest, in Zeichen, z. B. {"maxChars": {"basic": 1000, "standard": 3000, "premium": 9000}}: Ihre Bestellungen brauchen script, den Text, der wortwörtlich vorgelesen wird. Die Aufnahme wird mit einer synthetischen Stimme gesprochen: Wo immer Sie sie veröffentlichen, weisen Sie Ihre Hörer darauf hin, dass die Stimme synthetisch ist (siehe AGB).

Guthaben

GET /balance

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

Bestellung aufgeben

POST /orders. Der Preis (Paket und Extras, abzüglich eines Rabatts) wird vom Guthaben abgebucht, und die Arbeit beginnt sofort.

Feld
servicePflichtLeistung aus /services
tierPflichtbasic, standard oder premium
textPflicht ohne answers, script oder awaitBriefDie Aufgabe: was zu tun ist, bis zu 10.000 Zeichen. Mit script: wie vorgelesen werden soll (Ton, Tempo, Aussprache von Namen)
linkoptionalEin Link zur Seite, zum Profil oder Beitrag oder zu einer Aufnahme: ein direkter Link zur Datei oder ein Dropbox- oder Yandex-Disk-Link. Pflicht, wo linkRequired true ist
answersoptionalAntworten auf die briefQuestions der Leistung: [{"q": "question", "a": "answer"}], bis zu 8, jede Antwort bis zu 5.000 Zeichen
scriptPflicht, wo script in /services nicht null ist, sonst abgelehntDer vorzulesende Text, wortwörtlich, bis zum maxChars des Pakets (höchstens 20.000 Zeichen, ein Zeilenumbruch zählt als eins). Lassen Sie zwischen Absätzen eine Leerzeile
localeoptionalSprache des Ergebnisses, en oder ru. Standardmäßig die Sprache Ihres Kontos
addonsoptionalIDs der Extras aus /services, die für dieses Paket angeboten werden, z. B. [7]
promoCodeoptionalEin Gutscheincode; gilt er nicht, wird die Bestellung nicht aufgegeben (siehe Fehler)
awaitBriefoptionaltrue, um das Briefing später zu senden, nach dem Hochladen der Dateien: Die Bestellung wird bezahlt und wartet als awaiting_brief. Lassen Sie dann text, link, answers und script weg. Siehe Dateien
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 ist optional und ermöglicht es, die Anfrage gefahrlos zu wiederholen; jede neue Bestellung braucht einen neuen Schlüssel. Siehe Idempotenz unten.

Geben Sie entweder text oder mindestens eine Antwort an, oder beides; für eine Sprecherleistung genügt script. Schreiben Sie jede Frage in q so, wie sie in briefQuestions steht, in der Sprache der Bestellung, und lassen Sie die weg, auf die Sie keine Antwort haben:

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

Die Antwort ist die Bestellung (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": []
}

Dateien

Manche Leistungen arbeiten mit Dateien des Kunden, etwa Fotos von abzutippenden Seiten oder einer zu untertitelnden Aufnahme: Ihr files in /services ist nicht null. Dateien werden zu einer Bestellung hochgeladen, die auf ihr Briefing wartet:

  1. Geben Sie die Bestellung mit "awaitBrief": true und ohne text, link, answers und script auf. Sie wird sofort bezahlt, ihr Status ist awaiting_brief; die Lieferzeit beginnt mit dem Briefing.
  2. Senden Sie für jede Datei POST /orders/{id}/files mit {"name": "page-1.png", "size": 482113, "mime": "image/png"}: size ist die genaue Größe in Byte, mime ist optional. Die Antwort (201) ist die Datei und das Ziel für den Upload:
{
  "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. Senden Sie die Bytes der Datei per PUT an upload.url, mit genau den angegebenen headers und ohne API-Schlüssel, vor upload.expiresAt (eine Stunde):
curl -X PUT "$url" -H "content-type: application/octet-stream" --data-binary @page-1.png
  1. POST /orders/{id}/files/{fileId}/complete. Eine Datei, deren Größe von size abweicht oder deren Bytes keiner Art aus accept entsprechen, wird mit 422 abgelehnt und gelöscht: Name und mime zählen dabei nicht. Andernfalls ist die Antwort die Datei, jetzt checking. Nach einigen Sekunden, bei einer langen Aufnahme nach einigen Minuten, ist sie ready oder rejected mit dem Grund in reason, z. B. recording_no_sound oder file_unreadable. Das files der Bestellung zeigt ihren Stand.
  2. POST /orders/{id}/brief mit text, link, answers und script wie bei POST /orders. Die fertigen, noch nicht gesendeten Dateien gehen mit, oder Sie listen die zu sendenden in fileIds auf. Solange eine davon noch checking ist, wird das Briefing mit 409 files_not_ready abgelehnt: Senden Sie es etwas später erneut. Die Antwort (200) ist die Bestellung, jetzt in_progress.

DELETE /orders/{id}/files/{fileId} zieht eine noch nicht gesendete Datei zurück. Eine Bestellung nimmt höchstens 5 Dateien und insgesamt 4 GB an; eine Datei, deren Upload begonnen wurde, zählt mit, bis er abgeschlossen oder die Datei zurückgezogen ist, und einen Tag lang ab Beginn ihres Uploads zählen zurückgezogene oder abgelehnte Dateien zusammen mit den Dateien der Bestellung zu einem Limit von 12 GB: Darüber hinaus wird ein Upload mit 409 upload_quota und retryAt abgelehnt, dem Zeitpunkt, ab dem wieder Uploads angenommen werden. Eine gelieferte Bestellung nimmt auch Dateien für einen Überarbeitungswunsch an: Laden Sie sie auf dieselbe Weise hoch und senden Sie dann fileIds mit dem Wunsch.

Ohne awaitBrief wird eine Bestellung einer Leistung, deren Dateien required sind, mit 400 files_required abgelehnt, und eine, bei der eine Datei den Link ersetzen kann, ohne Link gesendet, mit 400 link_required.

In der Bestellung listet files Ihre Dateien mit ihrem status auf und fileIds diejenigen, die mit dem Briefing gesendet wurden. Eine fertige Datei hat eine url, die bis expiresAt gültig ist, wie bei Ergebnisdateien. Dateien werden 30 Tage nach Abschluss der Bestellung aufbewahrt.

Idempotenz

Eine Anfrage kann in ein Timeout laufen, nachdem die Bestellung bereits aufgegeben wurde. Um POST /orders zu wiederholen, ohne doppelt zu bezahlen, senden Sie einen Idempotency-Key-Header mit: eine Zeichenfolge aus 1 bis 255 druckbaren ASCII-Zeichen, die Sie einmal pro Bestellung festlegen, etwa eine UUID oder Ihre eigene Bestellnummer. Senden Sie beim Wiederholen denselben Schlüssel und denselben Body.

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

Wurde mit diesem Schlüssel bereits eine Bestellung aufgegeben, ist die Antwort diese Bestellung in ihrem aktuellen Stand, mit Status 201 und einem zusätzlichen Header. Es wird nichts erneut abgebucht:

HTTP/1.1 201 Created
Idempotent-Replayed: true

Abnahme, Briefings und Überarbeitungswünsche nehmen keinen Schlüssel. Die Abnahme kann gefahrlos wiederholt werden: Ist die Bestellung abgeschlossen, antwortet eine Wiederholung mit 409 order_not_delivered. Ebenso ein Briefing: Ist es angekommen, antwortet eine Wiederholung mit 409 brief_not_expected, und die Bestellung ist in_progress. Bei einem Überarbeitungswunsch ist es anders: Während die Arbeit überarbeitet wird, antwortet eine Wiederholung mit 409 order_not_delivered, doch sobald die Überarbeitung geliefert ist, fordert eine Wiederholung eine weitere Überarbeitung an. Prüfen Sie die Bestellung vor dem Wiederholen eines Überarbeitungswunsches mit GET /orders/{id} (status und revisionsLeft).

Bestellungen verfolgen

GET /orders/{id} gibt eine Bestellung zurück, GET /orders Ihre Bestellungen, die neuesten zuerst. Die Liste akzeptiert status, limit (1 bis 100, standardmäßig 20) und before (eine Bestell-ID, um ältere Bestellungen abzurufen).

Bestellstatus:

StatusBedeutung
awaiting_briefMit awaitBrief aufgegeben: wartet auf POST /orders/{id}/brief
in_progressDie Arbeit wird ausgeführt
quality_checkDie Arbeit ist erledigt und wird vor der Lieferung geprüft
deliveredDas Ergebnis ist fertig, siehe results. Nehmen Sie es bis autoAcceptAt ab oder fordern Sie Änderungen an
revisionDie angeforderten Änderungen werden umgesetzt
completedSie haben das Ergebnis abgenommen, oder es wurde automatisch abgenommen
refundedDas Geld ist auf Ihr Guthaben zurückgeflossen

Fragen Sie alle paar Minuten ab; häufiger ist nicht nötig. Ist die Bestellung delivered, enthält results die Arbeit: kind ist text (Markdown), report (ein Lieferbericht für Social-Media-Bestellungen) oder files (Dateien zum Herunterladen, mit einer optionalen Notiz in body). Jedes Ergebnis hat eine files-Liste, die bei Texten und Berichten leer ist: Jede Datei hat name, mime, size in Byte und eine url, die bis expiresAt gültig ist, etwa eine Stunde. Rufen Sie die Bestellung erneut ab, um frische Links zu erhalten. Der Link kann auf den Dateispeicher weiterleiten, folgen Sie also Weiterleitungen, z. B. curl -L -o result.png "$url", und senden Sie dabei keinen API-Schlüssel mit: Der Link allein öffnet die Datei.

Abnahme und Überarbeitungen

Wenn Sie eine gelieferte Bestellung weder abnehmen noch eine Überarbeitung anfordern, wird sie 3 Tage nach der Lieferung automatisch abgenommen, zum Zeitpunkt in autoAcceptAt (null in anderen Status). Eine neue Lieferung nach einer Überarbeitung startet die 3 Tage neu. Sie können die Arbeit auch auf der Website abnehmen. Schreiben Sie nach der Lieferung im Bestellchat auf der Website, wird die Bestellung nicht automatisch abgenommen, und autoAcceptAt ist null, bis Sie sie abnehmen oder wir die Arbeit überarbeiten oder erstatten. Nachdem wir Ihre Nachricht beantwortet haben, können wir die 3 Tage auch neu starten: autoAcceptAt zeigt dann den neuen Zeitpunkt.

Fehler

Fehler kommen mit einem HTTP-Status und einem Code:

{ "code": "insufficient_balance" }
StatusCodeBedeutung
400validationEin Feld fehlt oder ist ungültig; fields listet sie auf
400link_requiredDiese Leistung braucht link
400files_requiredDiese Leistung braucht eine Datei: Geben Sie die Bestellung mit awaitBrief auf und laden Sie sie hoch
400script_requiredDiese Leistung liest einen Text vor: Senden Sie ihn in script
400script_too_longscript ist länger, als das Paket vorliest; maxChars in der Antwort ist das Maximum. Es wurde nichts abgebucht
400script_not_acceptedDie Leistung liest keinen Text vor (ihr script in /services ist null): Lassen Sie script weg. Es wurde nichts abgebucht
400files_not_accepted, file_too_largeDie Leistung nimmt keine Dateien an, oder die Datei ist größer als ihr maxMb
400invalid_idempotency_keyIdempotency-Key ist leer, länger als 255 Zeichen oder kein druckbares ASCII
401invalid_api_keyKein Schlüssel, ein falscher oder ein widerrufener Schlüssel. Schlüssel werden auch widerrufen, wenn die unbestätigte E-Mail-Adresse des Kontos durch Anmelden mit Google oder durch Festlegen eines neuen Passworts bestätigt wird
402insufficient_balanceNicht genug Guthaben; es wurde nichts abgebucht
404package_not_found, order_not_found, file_not_foundLeistung, Paket, Bestellung oder Datei nicht vorhanden
409order_not_delivered, no_revisions_leftDie Bestellung ist dafür nicht im passenden Status
409brief_not_expectedDie Bestellung wartet nicht auf ihr Briefing: Sie wurde ohne awaitBrief aufgegeben, oder ihr Briefing wurde bereits gesendet
409uploads_closedDateien werden nur angenommen, solange die Bestellung auf ihr Briefing wartet oder geliefert ist
409files_limitMehr Dateien, als die Leistung mit einem Briefing oder Wunsch annimmt, oder mehr als 5 Dateien bzw. 4 GB für die Bestellung
409upload_quotaMit dieser Datei liegen die Dateien der Bestellung (gesendete und unfertige Uploads eingeschlossen) zusammen mit den am letzten Tag begonnenen und seitdem zurückgezogenen oder abgelehnten über 12 GB: Versuchen Sie es nach retryAt erneut
409files_not_ready, file_rejectedEine zu sendende Datei wird noch geprüft oder wurde abgelehnt
409upload_incompleteÜber den Link wurde noch nichts hochgeladen: Schließen Sie den PUT ab und schließen Sie dann den Upload erneut ab
409file_in_use, file_busyDie Datei wurde mit dem Briefing oder einem Wunsch gesendet und bleibt bei der Bestellung, oder sie wird gerade von ihrer Prüfung verschoben: Versuchen Sie es gleich noch einmal
409addon_unavailableEin Extra wird für diese Leistung und dieses Paket nicht angeboten
409promo_not_found, promo_inactive, promo_used_up, promo_already_used, promo_first_order_only, promo_min_orderDer Gutscheincode existiert nicht, ist derzeit nicht aktiv, ist aufgebraucht, wurde von Ihnen bereits verwendet, gilt nur für eine erste Bestellung oder erfordert einen höheren Bestellwert. Es wurde nichts abgebucht
409idempotency_key_in_progressEine Anfrage mit diesem Idempotency-Key wird noch verarbeitet; wiederholen Sie sie kurz darauf
410upload_expired, file_removedDer Upload-Link ist abgelaufen, bevor etwas hochgeladen wurde, oder Sie haben die Datei zurückgezogen: Starten Sie einen neuen Upload
415file_type_not_acceptedDer angegebene mime gehört zu keiner Art, die die Leistung annimmt
422idempotency_key_reusedDieser Idempotency-Key wurde bereits mit einer anderen Anfrage verwendet
422upload_size_mismatch, file_type_not_acceptedDie hochgeladene Datei hat nicht die Größe size, oder ihre Bytes gehören zu keiner Art, die die Leistung annimmt; sie wurde gelöscht
422file_unreadable, recording_no_sound, check_failedAbschluss einer Datei, die bei der Prüfung abgelehnt wurde: Sie lässt sich nicht öffnen, die Aufnahme hat keinen Ton, oder sie konnte nicht geprüft werden. Laden Sie die Datei erneut oder eine andere hoch
429rate_limitedMehr als 120 Anfragen pro Minute mit einem Schlüssel; warten Sie die Sekunden aus Retry-After ab

Rückerstattungen

Wenn wir eine Bestellung erstatten, geht das Geld zurück auf das Guthaben, und die Bestellung wird refunded.