API
Peça serviços a partir do seu próprio site, loja ou script: liste serviços e preços, faça pedidos com a tarefa, acompanhe-os e baixe os resultados. É o mesmo serviço do site, então os pedidos feitos pela API também aparecem na sua conta.
Primeiros passos
- Entre e abra Saldo e chaves de API.
- Crie uma chave. Ela é exibida uma única vez: copie-a e guarde-a em segredo, como uma senha. Você pode revogar uma chave a qualquer momento.
- Adicione saldo. Os pedidos feitos pela API são pagos com ele, em dólares americanos.
Envie a chave em todas as requisições:
Authorization: Bearer dlx_your_key
Endereço da API: https://dleex.com/api/v1. Requisições e respostas são em JSON. Preços e valores são expressos em centavos de dólar americano inteiros: 1500 significa US$ 15,00.
Serviços
GET /services lista o que pode ser pedido.
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 é o tempo que o trabalho leva; revisions é quantas vezes você pode pedir ajustes. addons são extras que podem ser pedidos com os pacotes listados em tiers: o preço é somado ao do pacote, e extraDays, ao seu prazo (negativo: mais rápido, nunca abaixo de 1 dia). briefQuestions são as perguntas que o serviço faz sobre a tarefa, algumas com uma hint; responda a elas em answers ao fazer o pedido. A lista fica vazia quando o serviço não pergunta nada. linkRequired é true para um serviço feito a partir do que um link abre, como um perfil ou post, ou uma gravação a legendar: o pedido desse serviço exige link.
files é null para um serviço que não recebe arquivos com o briefing. Caso contrário, indica quais ele recebe, por exemplo {"accept": ["image"], "maxFiles": 3, "maxMb": 5, "required": true, "insteadOfLink": false}: os tipos (image, audio, video), quantos arquivos por briefing ou pedido de ajustes, o tamanho máximo de cada arquivo em MB, se o briefing precisa de pelo menos um e se um arquivo pode substituir o link (nesse caso, linkRequired continua true para pedidos enviados sem arquivos). Veja Arquivos.
script é null para um serviço que não lê texto em voz alta. Um serviço de locução informa o texto mais longo que cada pacote lê, em caracteres, por exemplo {"maxChars": {"basic": 1000, "standard": 3000, "premium": 9000}}: seus pedidos exigem script, o texto a ser lido palavra por palavra. A gravação é lida com voz sintetizada: onde quer que você a publique, informe aos seus ouvintes que a voz é sintetizada (veja os Termos).
Saldo
GET /balance
{ "balanceUsdCents": 10000, "currency": "USD" }
Como fazer um pedido
POST /orders. O preço (o pacote e os extras, menos qualquer desconto) é debitado do saldo e o trabalho começa na hora.
| Campo | ||
|---|---|---|
service | obrigatório | Serviço de /services |
tier | obrigatório | basic, standard ou premium |
text | obrigatório sem answers, script ou awaitBrief | A tarefa: o que fazer, até 10.000 caracteres. Com script: como ler (tom, ritmo, pronúncia de nomes) |
link | opcional | Um link para a página, perfil ou post, ou para uma gravação: um link direto para o arquivo, ou um link do Dropbox ou do Yandex Disk. Obrigatório quando linkRequired é true |
answers | opcional | Respostas às briefQuestions do serviço: [{"q": "question", "a": "answer"}], até 8, cada resposta com até 5.000 caracteres |
script | obrigatório quando script em /services não é null, recusado nos demais casos | O texto a ser lido em voz alta, palavra por palavra, até o maxChars do pacote (no máximo 20.000 caracteres, cada quebra de linha conta como um). Deixe uma linha em branco entre os parágrafos |
locale | opcional | Idioma do resultado, en ou ru. Por padrão, o idioma da sua conta |
addons | opcional | Ids dos extras de /services oferecidos para este pacote, por exemplo [7] |
promoCode | opcional | Um cupom; se ele não for aplicável, o pedido não é feito (veja Erros) |
awaitBrief | opcional | true para enviar o briefing depois, após o upload dos arquivos: o pedido é pago e fica aguardando como awaiting_brief. Nesse caso, omita text, link, answers e script. Veja Arquivos |
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 é opcional e permite repetir a requisição com segurança; cada novo pedido precisa de uma nova chave. Veja Idempotência abaixo.
Informe text ou pelo menos uma resposta, ou ambos; para uma locução, basta script. Escreva cada pergunta em q exatamente como está em briefQuestions, no idioma do pedido, e omita aquelas que você não tem como responder:
{
"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" }
]
}
A resposta é o pedido (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": []
}
Arquivos
Alguns serviços trabalham a partir dos arquivos do cliente, como fotos de páginas a digitar ou uma gravação a legendar: o files deles em /services não é null. Os arquivos são enviados para um pedido que aguarda o briefing:
- Faça o pedido com
"awaitBrief": truee semtext,link,answersescript. Ele é pago na hora e seu status éawaiting_brief; o prazo começa a contar com o briefing. - Para cada arquivo,
POST /orders/{id}/filescom{"name": "page-1.png", "size": 482113, "mime": "image/png"}:sizeé o tamanho exato em bytes,mimeé opcional. A resposta (201) é o arquivo e o endereço para o 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" }
}
- Faça
PUTdos bytes do arquivo paraupload.urlexatamente com osheadersinformados e sem chave de API, antes deupload.expiresAt(uma hora):
curl -X PUT "$url" -H "content-type: application/octet-stream" --data-binary @page-1.png
POST /orders/{id}/files/{fileId}/complete. Um arquivo de tamanho diferente desize, ou cujos bytes não sejam de um tipo listado emaccept, é recusado com422e excluído: o nome e omimenão contam. Caso contrário, a resposta é o arquivo, agorachecking. Depois de alguns segundos, ou minutos no caso de uma gravação longa, ele ficaready, ourejectedcom o motivo emreason, por exemplorecording_no_soundoufile_unreadable. Ofilesdo pedido mostra a situação de cada um.POST /orders/{id}/briefcomtext,link,answersescript, como emPOST /orders. Os arquivos prontos ainda não enviados vão junto, ou liste emfileIdsos que devem ser enviados. Enquanto algum deles ainda estiverchecking, o briefing é recusado com409 files_not_ready: envie-o de novo um pouco depois. A resposta (200) é o pedido, agorain_progress.
DELETE /orders/{id}/files/{fileId} retira um arquivo ainda não enviado. Um pedido aceita no máximo 5 arquivos e 4 GB no total; um arquivo cujo upload foi iniciado conta até ser concluído ou retirado, e, durante um dia a partir do início do upload, os arquivos retirados ou recusados contam para um limite de 12 GB junto com os arquivos do pedido: acima disso, o upload é recusado com 409 upload_quota e retryAt, o horário em que volta a ser aceito. Um pedido entregue também aceita arquivos para um pedido de ajustes: faça o upload da mesma forma e depois envie fileIds com o pedido de ajustes.
Sem awaitBrief, o pedido de um serviço cujos arquivos são required é recusado com 400 files_required, e o de um serviço em que um arquivo pode substituir o link, enviado sem link, com 400 link_required.
No pedido, files lista seus arquivos com o respectivo status, e fileIds, os que foram com o briefing. Um arquivo pronto tem uma url que funciona até expiresAt, como os arquivos de resultado. Os arquivos são guardados por 30 dias após o encerramento do pedido.
Idempotência
Uma requisição pode expirar depois que o pedido já foi feito. Para repetir POST /orders sem pagar duas vezes, envie com ela o cabeçalho Idempotency-Key: uma string de 1 a 255 caracteres ASCII imprimíveis que você escolhe uma vez por pedido, como um UUID ou o número do pedido no seu sistema. Envie a mesma chave e o mesmo corpo ao repetir a requisição.
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: ..."}'
Se já houver um pedido feito com essa chave, a resposta é esse pedido no estado atual, com status 201 e um cabeçalho a mais. Nada é cobrado novamente:
HTTP/1.1 201 Created
Idempotent-Replayed: true
- A chave pertence à requisição com a qual foi enviada pela primeira vez. A mesma chave com um corpo diferente, como outros extras ou outro cupom, é recusada com
422 idempotency_key_reused, e nada é cobrado. - Se várias requisições com a mesma chave chegarem ao mesmo tempo, um único pedido é feito e as demais respondem com ele. Uma requisição que precise esperar demais responde
409 idempotency_key_in_progresse não cobra nada: repita-a instantes depois. - Uma requisição que falhou, por exemplo com
400,402,404ou um erro de extra ou de cupom, não consome a chave: corrija-a e envie de novo com a mesma chave. - A chave é guardada por 24 horas. Depois disso, a mesma chave faz um novo pedido.
- As chaves são separadas por conta. Sem o cabeçalho, cada requisição faz um novo pedido.
Aprovações, briefings e pedidos de ajustes não usam chave. Aprovar pode ser repetido com segurança: depois que o pedido é concluído, uma repetição responde 409 order_not_delivered. O mesmo vale para o briefing: depois que ele foi aceito, uma repetição responde 409 brief_not_expected e o pedido está in_progress. Com o pedido de ajustes é diferente: enquanto o trabalho está sendo refeito, uma repetição responde 409 order_not_delivered, mas, depois que a nova versão é entregue, uma repetição pede outro ajuste. Antes de repetir um pedido de ajustes, verifique o pedido com GET /orders/{id} (status e revisionsLeft).
Acompanhamento de pedidos
GET /orders/{id} retorna um pedido, GET /orders retorna seus pedidos, do mais recente para o mais antigo. A lista aceita status, limit (de 1 a 100, 20 por padrão) e before (um id de pedido, para obter pedidos mais antigos).
Status do pedido:
| Status | Significado |
|---|---|
awaiting_brief | Feito com awaitBrief: aguardando POST /orders/{id}/brief |
in_progress | O trabalho está em andamento |
quality_check | O trabalho está pronto e passa por verificação antes da entrega |
delivered | O resultado está pronto, veja results. Aprove-o ou peça ajustes até autoAcceptAt |
revision | Os ajustes que você pediu estão sendo feitos |
completed | Você aprovou o resultado, ou ele foi aprovado automaticamente |
refunded | O dinheiro voltou para o seu saldo |
Consulte a cada poucos minutos; não é preciso consultar com mais frequência. Quando o pedido está delivered, results contém o trabalho: kind é text (Markdown), report (um relatório de entrega para pedidos de redes sociais) ou files (arquivos para baixar, com uma observação opcional em body). Cada resultado tem uma lista files, vazia para textos e relatórios: cada arquivo tem name, mime, size em bytes e uma url que funciona até expiresAt, cerca de uma hora. Leia o pedido de novo para obter links novos. O link pode redirecionar para o armazenamento de arquivos, então siga os redirecionamentos, por exemplo curl -L -o result.png "$url", e não envie a chave de API junto: o link sozinho abre o arquivo.
Aprovação e ajustes
POST /orders/{id}/acceptaprova o resultado e conclui o pedido.POST /orders/{id}/revisioncom{"text": "what to change"}pede ajustes, enquantorevisionsLeftfor maior que zero. Quando o serviço aceita arquivos,fileIdslista os arquivos enviados para o pedido de ajustes; sem ele, os arquivos prontos ainda não enviados vão junto.
Se você não aprovar nem pedir ajustes em um pedido entregue, ele é aprovado automaticamente 3 dias após a entrega, no horário indicado em autoAcceptAt (null nos demais status). Uma nova entrega após um ajuste reinicia os 3 dias. Você também pode aprovar o trabalho no site. Se você escrever no chat do pedido no site após a entrega, o pedido não é aprovado automaticamente e autoAcceptAt fica null até você aprová-lo ou até refazermos o trabalho ou o reembolsarmos. Depois de responder à sua mensagem, também podemos reiniciar os 3 dias: autoAcceptAt passa então a mostrar o novo horário.
Erros
Os erros vêm com um status HTTP e um código:
{ "code": "insufficient_balance" }
| Status | Código | Significado |
|---|---|---|
| 400 | validation | Um campo está ausente ou incorreto; fields lista quais |
| 400 | link_required | Este serviço exige link |
| 400 | files_required | Este serviço exige um arquivo: faça o pedido com awaitBrief e faça o upload dele |
| 400 | script_required | Este serviço lê um texto em voz alta: envie-o em script |
| 400 | script_too_long | script é mais longo do que o pacote lê; maxChars na resposta é o máximo aceito. Nada foi cobrado |
| 400 | script_not_accepted | O serviço não lê texto em voz alta (seu script em /services é null): omita script. Nada foi cobrado |
| 400 | files_not_accepted, file_too_large | O serviço não aceita arquivos, ou o arquivo é maior que o seu maxMb |
| 400 | invalid_idempotency_key | Idempotency-Key está vazio, tem mais de 255 caracteres ou não é ASCII imprimível |
| 401 | invalid_api_key | Sem chave, chave incorreta ou chave revogada. As chaves também são revogadas quando o e-mail não confirmado da conta é confirmado ao entrar com o Google ou ao definir uma nova senha |
| 402 | insufficient_balance | Saldo insuficiente; nada foi cobrado |
| 404 | package_not_found, order_not_found, file_not_found | Serviço, pacote, pedido ou arquivo inexistente |
| 409 | order_not_delivered, no_revisions_left | O pedido não está em um status que permita isso |
| 409 | brief_not_expected | O pedido não está aguardando o briefing: foi feito sem awaitBrief, ou o briefing já foi enviado |
| 409 | uploads_closed | Arquivos só são aceitos enquanto o pedido aguarda o briefing ou está entregue |
| 409 | files_limit | Mais arquivos do que o serviço aceita por briefing ou pedido de ajustes, ou mais de 5 arquivos ou 4 GB no pedido |
| 409 | upload_quota | Com este, os arquivos do pedido (incluindo os enviados e os uploads não concluídos) e os iniciados no último dia e depois retirados ou recusados passam de 12 GB: tente de novo após retryAt |
| 409 | files_not_ready, file_rejected | Um arquivo a enviar ainda está em verificação, ou foi rejeitado |
| 409 | upload_incomplete | Nada foi enviado para o link ainda: conclua o PUT e depois conclua o upload novamente |
| 409 | file_in_use, file_busy | O arquivo foi com o briefing ou com um pedido de ajustes e permanece no pedido, ou está sendo movido pela verificação: tente de novo em instantes |
| 409 | addon_unavailable | Um extra não é oferecido para este serviço e pacote |
| 409 | promo_not_found, promo_inactive, promo_used_up, promo_already_used, promo_first_order_only, promo_min_order | O cupom não existe, não está ativo no momento, esgotou, já foi usado por você, vale só para o primeiro pedido ou exige um pedido de valor maior. Nada foi cobrado |
| 409 | idempotency_key_in_progress | Uma requisição com este Idempotency-Key ainda está sendo processada; repita-a instantes depois |
| 410 | upload_expired, file_removed | O link de upload expirou antes de qualquer envio, ou você retirou o arquivo: inicie um novo upload |
| 415 | file_type_not_accepted | O mime informado não é de um tipo que o serviço aceita |
| 422 | idempotency_key_reused | Este Idempotency-Key já foi usado com uma requisição diferente |
| 422 | upload_size_mismatch, file_type_not_accepted | O arquivo enviado não tem o tamanho indicado em size, ou seus bytes não são de um tipo que o serviço aceita; ele foi excluído |
| 422 | file_unreadable, recording_no_sound, check_failed | Conclusão de um arquivo que a verificação rejeitou: ele não abre, a gravação não tem som ou não foi possível verificá-lo. Envie o arquivo de novo ou outro |
| 429 | rate_limited | Mais de 120 requisições por minuto com uma mesma chave; aguarde os segundos indicados em Retry-After |
Reembolsos
Se reembolsarmos um pedido, o dinheiro volta para o saldo e o pedido passa a refunded.