API

Bestel diensten vanaf je eigen website, webwinkel of script: vraag diensten en prijzen op, plaats bestellingen met de opdracht, volg ze en haal de resultaten op. Het is dezelfde dienst als op de site, dus bestellingen die je via de API plaatst, verschijnen ook in je account.

Aan de slag

  1. Log in en open Saldo en API-sleutels.
  2. Maak een sleutel aan. Die wordt één keer getoond: kopieer hem en houd hem geheim, net als een wachtwoord. Je kunt een sleutel op elk moment intrekken.
  3. Waardeer je saldo op. Bestellingen via de API worden daarmee betaald, in Amerikaanse dollars.

Stuur de sleutel mee met elk verzoek:

Authorization: Bearer dlx_your_key

Adres van de API: https://dleex.com/api/v1. Verzoeken en antwoorden zijn JSON. Prijzen en bedragen zijn hele Amerikaanse centen: 1500 betekent $ 15,00.

Diensten

GET /services geeft een lijst van wat je kunt bestellen.

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 is hoe lang het werk duurt; revisions is hoe vaak je om wijzigingen kunt vragen. addons zijn extra opties die je kunt bestellen bij de pakketten in tiers: de prijs komt bij die van het pakket en extraDays bij de levertijd (negatief: sneller, nooit minder dan 1 dag). briefQuestions zijn de vragen die de dienst over de opdracht stelt, sommige met een hint; beantwoord ze in answers wanneer je een bestelling plaatst. De lijst is leeg als een dienst niets vraagt. linkRequired is true voor een dienst die werkt met wat een link opent, zoals een profiel of bericht, of een opname om te ondertitelen: een bestelling daarvan vereist link.

files is null voor een dienst die geen bestanden bij de briefing accepteert. Anders staat er welke bestanden de dienst accepteert, bijvoorbeeld {"accept": ["image"], "maxFiles": 3, "maxMb": 5, "required": true, "insteadOfLink": false}: de soorten (image, audio, video, document: PDF, DOCX, XLSX), hoeveel bestanden bij één briefing of revisieverzoek, hoe groot elk bestand mag zijn in MB, of de briefing er minstens één nodig heeft, en of een bestand de plaats van link kan innemen (linkRequired is dan nog steeds true voor bestellingen zonder bestanden). Zie Bestanden.

script is null voor een dienst die geen tekst voorleest. Een voice-overdienst geeft de langste tekst die elk pakket voorleest, in tekens, bijvoorbeeld {"maxChars": {"basic": 1000, "standard": 3000, "premium": 9000}}: bestellingen daarvan vereisen script, de tekst die woord voor woord wordt voorgelezen. De opname wordt ingesproken met een synthetische stem: vermeld overal waar je hem publiceert aan je luisteraars dat de stem synthetisch is (zie de Voorwaarden).

Saldo

GET /balance

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

Een bestelling plaatsen

POST /orders. De prijs (het pakket en de extra opties, minus een eventuele korting) wordt van het saldo afgeschreven en het werk begint meteen.

Veld
serviceverplichtDienst uit /services
tierverplichtbasic, standard of premium
textverplicht zonder answers, script of awaitBriefDe opdracht: wat er moet gebeuren, tot 10.000 tekens. Met script: hoe de tekst moet worden voorgelezen (toon, tempo, uitspraak van namen)
linkoptioneelEen link naar de pagina, het profiel of het bericht, of naar een opname: een directe link naar het bestand, of een Dropbox- of Yandex Disk-link. Verplicht waar linkRequired true is
answersoptioneelAntwoorden op de briefQuestions van de dienst: [{"q": "question", "a": "answer"}], maximaal 8, elk antwoord tot 5.000 tekens
scriptverplicht waar script in /services niet null is, elders geweigerdDe voor te lezen tekst, woord voor woord, tot de maxChars van het pakket (maximaal 20.000 tekens, een regeleinde telt als één). Laat een lege regel tussen alinea's
localeoptioneelTaal van het resultaat, en of ru. Standaard de taal van je account
addonsoptioneelId's van extra opties uit /services die voor dit pakket worden aangeboden, bijvoorbeeld [7]
promoCodeoptioneelEen kortingscode; als die niet geldt, wordt de bestelling niet geplaatst (zie Fouten)
awaitBriefoptioneeltrue om de briefing later te sturen, na het uploaden van bestanden: de bestelling wordt betaald en wacht als awaiting_brief. Laat dan text, link, answers en script weg. Zie Bestanden
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 is optioneel en laat je het verzoek veilig herhalen; elke nieuwe bestelling heeft een nieuwe sleutel nodig. Zie Idempotentie hieronder.

Geef text of minstens één antwoord, of beide; voor een voice-over is script voldoende. Schrijf elke vraag in q zoals die in briefQuestions staat, in de taal van de bestelling, en laat de vragen weg waarop je geen antwoord hebt:

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

Het antwoord is de bestelling (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": []
}

Bestanden

Sommige diensten werken met bestanden van de klant, zoals foto's van pagina's om over te typen of een opname om te ondertitelen: hun files in /services is niet null. Bestanden worden geüpload naar een bestelling die op haar briefing wacht:

  1. Plaats de bestelling met "awaitBrief": true en zonder text, link, answers en script. Ze wordt meteen betaald en haar status is awaiting_brief; de levertijd begint met de briefing.
  2. Stuur voor elk bestand POST /orders/{id}/files met {"name": "page-1.png", "size": 482113, "mime": "image/png"}: size is de exacte grootte in bytes, mime is optioneel. Het antwoord (201) is het bestand en de plek waar je het uploadt:
{
  "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. Stuur de bytes van het bestand met PUT naar upload.url, met precies de opgegeven headers en zonder API-sleutel, vóór upload.expiresAt (een uur):
curl -X PUT "$url" -H "content-type: application/octet-stream" --data-binary @page-1.png
  1. POST /orders/{id}/files/{fileId}/complete. Een bestand met een andere grootte dan size, of waarvan de bytes niet van een soort in accept zijn, wordt geweigerd met 422 en verwijderd: de naam en mime tellen niet mee. Anders is het antwoord het bestand, nu checking. Na een paar seconden, of minuten bij een lange opname, is het ready, of rejected met de reden in reason, bijvoorbeeld recording_no_sound of file_unreadable. De files van de bestelling tonen hoe het ermee staat.
  2. POST /orders/{id}/brief met text, link, answers en script zoals bij POST /orders. De gereedstaande bestanden die nog niet zijn verstuurd, gaan mee, of geef in fileIds aan welke je wilt meesturen. Zolang een ervan nog checking is, wordt de briefing geweigerd met 409 files_not_ready: stuur hem iets later opnieuw. Het antwoord (200) is de bestelling, nu in_progress.

DELETE /orders/{id}/files/{fileId} trekt een nog niet verstuurd bestand terug. Een bestelling accepteert maximaal 5 bestanden en in totaal 4 GB; een bestand waarvan de upload is gestart, telt mee totdat het is voltooid of teruggetrokken, en gedurende een dag vanaf de start van hun upload tellen teruggetrokken of geweigerde bestanden samen met de bestanden van de bestelling mee voor 12 GB: daarboven wordt een upload geweigerd met 409 upload_quota en retryAt, het moment waarop weer uploads worden aangenomen. Een geleverde bestelling accepteert ook bestanden voor een revisieverzoek: upload ze op dezelfde manier en stuur dan fileIds mee met het verzoek.

Zonder awaitBrief wordt een bestelling van een dienst waarvan de bestanden required zijn geweigerd met 400 files_required, en een bestelling waarbij een bestand de plaats van de link kan innemen en die zonder link wordt verstuurd, met 400 link_required.

In de bestelling geeft files je bestanden weer met hun status, en fileIds de bestanden die met de briefing zijn meegegaan. Een gereed bestand heeft een url die werkt tot expiresAt, net als resultaatbestanden. Bestanden worden 30 dagen na het afsluiten van de bestelling bewaard.

Idempotentie

Een verzoek kan een time-out krijgen nadat de bestelling al is geplaatst. Om POST /orders te herhalen zonder twee keer te betalen, stuur je er een Idempotency-Key-header mee: een tekenreeks van 1 tot 255 afdrukbare ASCII-tekens die je eenmaal per bestelling kiest, zoals een UUID of je eigen bestelnummer. Stuur dezelfde sleutel en dezelfde body mee wanneer je het verzoek herhaalt.

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

Als er met deze sleutel al een bestelling is geplaatst, is het antwoord die bestelling zoals ze nu is, met status 201 en één extra header. Er wordt niets opnieuw afgeschreven:

HTTP/1.1 201 Created
Idempotent-Replayed: true

Goedkeuren, briefings en revisieverzoeken gebruiken geen sleutel. Goedkeuren kun je veilig herhalen: zodra de bestelling is voltooid, antwoordt een herhaling met 409 order_not_delivered. Hetzelfde geldt voor een briefing: zodra die is verwerkt, antwoordt een herhaling met 409 brief_not_expected en is de bestelling in_progress. Een revisieverzoek is anders: zolang het werk opnieuw wordt gedaan, antwoordt een herhaling met 409 order_not_delivered, maar zodra de nieuwe versie is geleverd, vraagt een herhaling om nog een revisie. Controleer de bestelling vóór het herhalen van een revisieverzoek met GET /orders/{id} (status en revisionsLeft).

Bestellingen volgen

GET /orders/{id} geeft één bestelling terug, GET /orders je bestellingen, nieuwste eerst. De lijst accepteert status, limit (1 tot 100, standaard 20) en before (een bestel-id, om oudere bestellingen op te halen).

Status van de bestelling:

StatusBetekenis
awaiting_briefGeplaatst met awaitBrief: wacht op POST /orders/{id}/brief
in_progressEr wordt aan het werk gewerkt
quality_checkHet werk is klaar en wordt vóór levering gecontroleerd
deliveredHet resultaat is klaar, zie results. Keur het goed of vraag om wijzigingen vóór autoAcceptAt
revisionDe wijzigingen die je hebt gevraagd, worden doorgevoerd
completedJe hebt het resultaat goedgekeurd, of het is automatisch goedgekeurd
refundedHet geld is teruggestort op je saldo

Controleer om de paar minuten; vaker vragen is niet nodig. Wanneer de bestelling delivered is, bevat results het werk: kind is text (Markdown), report (een leveringsrapport voor socialemediabestellingen) of files (bestanden om te downloaden, met een optionele notitie in body). Elk resultaat heeft een lijst files, leeg bij tekst en rapporten: elk bestand heeft name, mime, size in bytes en een url die werkt tot expiresAt, ongeveer een uur. Lees de bestelling opnieuw voor verse links. De link kan doorverwijzen naar de bestandsopslag, dus volg redirects, bijvoorbeeld curl -L -o result.png "$url", en stuur er geen API-sleutel mee: de link alleen opent het bestand al.

Goedkeuren en revisies

Als je een geleverde bestelling niet goedkeurt en ook geen revisie vraagt, wordt ze 3 dagen na levering automatisch goedgekeurd, op het tijdstip in autoAcceptAt (null in andere statussen). Een nieuwe levering na een revisie laat de 3 dagen opnieuw ingaan. Je kunt het werk ook op de site goedkeuren. Als je na de levering in de bestelchat op de site schrijft, wordt de bestelling niet automatisch goedgekeurd en is autoAcceptAt null totdat je haar goedkeurt of wij het werk opnieuw doen of terugbetalen. Na het beantwoorden van je bericht kunnen we de 3 dagen ook opnieuw laten ingaan: autoAcceptAt toont dan het nieuwe tijdstip.

Fouten

Fouten komen met een HTTP-status en een code:

{ "code": "insufficient_balance" }
StatusCodeBetekenis
400validationEen veld ontbreekt of is onjuist; fields geeft ze weer
400link_requiredDeze dienst vereist link
400files_requiredDeze dienst vereist een bestand: plaats de bestelling met awaitBrief en upload het
400script_requiredDeze dienst leest een tekst voor: stuur die in script
400script_too_longscript is langer dan het pakket voorleest; maxChars in het antwoord is het maximum. Er is niets afgeschreven
400script_not_acceptedDe dienst leest geen tekst voor (zijn script in /services is null): laat script weg. Er is niets afgeschreven
400files_not_accepted, file_too_largeDe dienst accepteert geen bestanden, of het bestand is groter dan zijn maxMb
400invalid_idempotency_keyIdempotency-Key is leeg, langer dan 255 tekens of geen afdrukbare ASCII
401invalid_api_keyGeen sleutel, een onjuiste sleutel of een ingetrokken sleutel. Sleutels worden ook ingetrokken wanneer het onbevestigde e-mailadres van het account wordt bevestigd door in te loggen met Google of door een nieuw wachtwoord in te stellen
402insufficient_balanceOnvoldoende saldo; er is niets afgeschreven
404package_not_found, order_not_found, file_not_foundDeze dienst, dit pakket, deze bestelling of dit bestand bestaat niet
409order_not_delivered, no_revisions_leftDe bestelling heeft niet de status die hiervoor nodig is
409brief_not_expectedDe bestelling wacht niet op haar briefing: ze is geplaatst zonder awaitBrief, of de briefing is al verstuurd
409uploads_closedBestanden worden alleen aangenomen zolang de bestelling op haar briefing wacht of is geleverd
409files_limitMeer bestanden dan de dienst bij één briefing of verzoek accepteert, of meer dan 5 bestanden of 4 GB voor de bestelling
409upload_quotaMet dit bestand erbij komen de bestanden van de bestelling (inclusief verstuurde bestanden en onvoltooide uploads) en de bestanden die in het afgelopen etmaal zijn gestart en daarna zijn teruggetrokken of geweigerd boven 12 GB: probeer het opnieuw na retryAt
409files_not_ready, file_rejectedEen te versturen bestand wordt nog gecontroleerd, of is afgewezen
409upload_incompleteEr is nog niets naar de link geüpload: voltooi de PUT en rond daarna de upload opnieuw af
409file_in_use, file_busyHet bestand is meegegaan met de briefing of een verzoek en blijft bij de bestelling, of wordt door de controle verplaatst: probeer het zo opnieuw
409addon_unavailableEen extra optie wordt niet aangeboden voor deze dienst en dit pakket
409promo_not_found, promo_inactive, promo_used_up, promo_already_used, promo_first_order_only, promo_min_orderDe kortingscode bestaat niet, is nu niet actief, is opgebruikt, is al door jou gebruikt, geldt alleen voor een eerste bestelling, of vereist een grotere bestelling. Er is niets afgeschreven
409idempotency_key_in_progressEen verzoek met deze Idempotency-Key wordt nog verwerkt; herhaal het even later
410upload_expired, file_removedDe uploadlink is verlopen voordat er iets is geüpload, of je hebt het bestand teruggetrokken: start een nieuwe upload
415file_type_not_acceptedHet opgegeven mime is niet van een soort die de dienst accepteert
422idempotency_key_reusedDeze Idempotency-Key is al gebruikt met een ander verzoek
422upload_size_mismatch, file_type_not_acceptedHet geüploade bestand heeft niet de grootte van size, of de bytes zijn niet van een soort die de dienst accepteert; het is verwijderd
422file_unreadable, recording_no_sound, check_failed, document_no_text, document_protectedEen bestand voltooien dat door de controle is afgewezen: het opent niet, de opname heeft geen geluid, of het kon niet worden gecontroleerd. Upload het bestand opnieuw of een ander bestand. Het document bevat geen leesbare tekst, bijvoorbeeld een scan (document_no_text), of is met een wachtwoord beveiligd (document_protected).
429rate_limitedMeer dan 120 verzoeken per minuut met één sleutel; wacht het aantal seconden in Retry-After

Terugbetalingen

Als we een bestelling terugbetalen, gaat het geld terug naar het saldo en wordt de bestelling refunded.