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
- Log in en open Saldo en API-sleutels.
- 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.
- 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 | ||
|---|---|---|
service | verplicht | Dienst uit /services |
tier | verplicht | basic, standard of premium |
text | verplicht zonder answers, script of awaitBrief | De opdracht: wat er moet gebeuren, tot 10.000 tekens. Met script: hoe de tekst moet worden voorgelezen (toon, tempo, uitspraak van namen) |
link | optioneel | Een 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 |
answers | optioneel | Antwoorden op de briefQuestions van de dienst: [{"q": "question", "a": "answer"}], maximaal 8, elk antwoord tot 5.000 tekens |
script | verplicht waar script in /services niet null is, elders geweigerd | De 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 |
locale | optioneel | Taal van het resultaat, en of ru. Standaard de taal van je account |
addons | optioneel | Id's van extra opties uit /services die voor dit pakket worden aangeboden, bijvoorbeeld [7] |
promoCode | optioneel | Een kortingscode; als die niet geldt, wordt de bestelling niet geplaatst (zie Fouten) |
awaitBrief | optioneel | true 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:
- Plaats de bestelling met
"awaitBrief": trueen zondertext,link,answersenscript. Ze wordt meteen betaald en haar status isawaiting_brief; de levertijd begint met de briefing. - Stuur voor elk bestand
POST /orders/{id}/filesmet{"name": "page-1.png", "size": 482113, "mime": "image/png"}:sizeis de exacte grootte in bytes,mimeis 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" }
}
- Stuur de bytes van het bestand met
PUTnaarupload.url, met precies de opgegevenheadersen zonder API-sleutel, vóórupload.expiresAt(een uur):
curl -X PUT "$url" -H "content-type: application/octet-stream" --data-binary @page-1.png
POST /orders/{id}/files/{fileId}/complete. Een bestand met een andere grootte dansize, of waarvan de bytes niet van een soort inacceptzijn, wordt geweigerd met422en verwijderd: de naam enmimetellen niet mee. Anders is het antwoord het bestand, nuchecking. Na een paar seconden, of minuten bij een lange opname, is hetready, ofrejectedmet de reden inreason, bijvoorbeeldrecording_no_soundoffile_unreadable. Defilesvan de bestelling tonen hoe het ermee staat.POST /orders/{id}/briefmettext,link,answersenscriptzoals bijPOST /orders. De gereedstaande bestanden die nog niet zijn verstuurd, gaan mee, of geef infileIdsaan welke je wilt meesturen. Zolang een ervan nogcheckingis, wordt de briefing geweigerd met409 files_not_ready: stuur hem iets later opnieuw. Het antwoord (200) is de bestelling, nuin_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
- De sleutel hoort bij het verzoek waarmee hij voor het eerst is verstuurd. Dezelfde sleutel met een andere body, zoals andere extra opties of een andere kortingscode, wordt geweigerd met
422 idempotency_key_reused, en er wordt niets afgeschreven. - Als er meerdere verzoeken met één sleutel tegelijk binnenkomen, wordt er één bestelling geplaatst en antwoorden de andere daarmee. Een verzoek dat te lang moet wachten, antwoordt met
409 idempotency_key_in_progressen schrijft niets af: herhaal het even later. - Een verzoek dat is mislukt, bijvoorbeeld met
400,402,404of een fout bij een extra optie of kortingscode, verbruikt zijn sleutel niet: corrigeer het en stuur het opnieuw met dezelfde sleutel. - Een sleutel wordt 24 uur bewaard. Daarna plaatst dezelfde sleutel een nieuwe bestelling.
- Sleutels zijn per account gescheiden. Zonder de header plaatst elk verzoek een nieuwe bestelling.
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:
| Status | Betekenis |
|---|---|
awaiting_brief | Geplaatst met awaitBrief: wacht op POST /orders/{id}/brief |
in_progress | Er wordt aan het werk gewerkt |
quality_check | Het werk is klaar en wordt vóór levering gecontroleerd |
delivered | Het resultaat is klaar, zie results. Keur het goed of vraag om wijzigingen vóór autoAcceptAt |
revision | De wijzigingen die je hebt gevraagd, worden doorgevoerd |
completed | Je hebt het resultaat goedgekeurd, of het is automatisch goedgekeurd |
refunded | Het 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
POST /orders/{id}/acceptkeurt het resultaat goed en voltooit de bestelling.POST /orders/{id}/revisionmet{"text": "what to change"}vraagt om wijzigingen, zolangrevisionsLeftgroter is dan nul. Als de dienst bestanden accepteert, geeftfileIdsde bestanden aan die voor het verzoek zijn geüpload; zonder dit veld gaan de gereedstaande, nog niet verstuurde bestanden mee.
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" }
| Status | Code | Betekenis |
|---|---|---|
| 400 | validation | Een veld ontbreekt of is onjuist; fields geeft ze weer |
| 400 | link_required | Deze dienst vereist link |
| 400 | files_required | Deze dienst vereist een bestand: plaats de bestelling met awaitBrief en upload het |
| 400 | script_required | Deze dienst leest een tekst voor: stuur die in script |
| 400 | script_too_long | script is langer dan het pakket voorleest; maxChars in het antwoord is het maximum. Er is niets afgeschreven |
| 400 | script_not_accepted | De dienst leest geen tekst voor (zijn script in /services is null): laat script weg. Er is niets afgeschreven |
| 400 | files_not_accepted, file_too_large | De dienst accepteert geen bestanden, of het bestand is groter dan zijn maxMb |
| 400 | invalid_idempotency_key | Idempotency-Key is leeg, langer dan 255 tekens of geen afdrukbare ASCII |
| 401 | invalid_api_key | Geen 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 |
| 402 | insufficient_balance | Onvoldoende saldo; er is niets afgeschreven |
| 404 | package_not_found, order_not_found, file_not_found | Deze dienst, dit pakket, deze bestelling of dit bestand bestaat niet |
| 409 | order_not_delivered, no_revisions_left | De bestelling heeft niet de status die hiervoor nodig is |
| 409 | brief_not_expected | De bestelling wacht niet op haar briefing: ze is geplaatst zonder awaitBrief, of de briefing is al verstuurd |
| 409 | uploads_closed | Bestanden worden alleen aangenomen zolang de bestelling op haar briefing wacht of is geleverd |
| 409 | files_limit | Meer bestanden dan de dienst bij één briefing of verzoek accepteert, of meer dan 5 bestanden of 4 GB voor de bestelling |
| 409 | upload_quota | Met 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 |
| 409 | files_not_ready, file_rejected | Een te versturen bestand wordt nog gecontroleerd, of is afgewezen |
| 409 | upload_incomplete | Er is nog niets naar de link geüpload: voltooi de PUT en rond daarna de upload opnieuw af |
| 409 | file_in_use, file_busy | Het bestand is meegegaan met de briefing of een verzoek en blijft bij de bestelling, of wordt door de controle verplaatst: probeer het zo opnieuw |
| 409 | addon_unavailable | Een extra optie wordt niet aangeboden voor deze dienst en dit pakket |
| 409 | promo_not_found, promo_inactive, promo_used_up, promo_already_used, promo_first_order_only, promo_min_order | De 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 |
| 409 | idempotency_key_in_progress | Een verzoek met deze Idempotency-Key wordt nog verwerkt; herhaal het even later |
| 410 | upload_expired, file_removed | De uploadlink is verlopen voordat er iets is geüpload, of je hebt het bestand teruggetrokken: start een nieuwe upload |
| 415 | file_type_not_accepted | Het opgegeven mime is niet van een soort die de dienst accepteert |
| 422 | idempotency_key_reused | Deze Idempotency-Key is al gebruikt met een ander verzoek |
| 422 | upload_size_mismatch, file_type_not_accepted | Het geüploade bestand heeft niet de grootte van size, of de bytes zijn niet van een soort die de dienst accepteert; het is verwijderd |
| 422 | file_unreadable, recording_no_sound, check_failed, document_no_text, document_protected | Een 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). |
| 429 | rate_limited | Meer 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.