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

  1. Entre e abra Saldo e chaves de API.
  2. 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.
  3. 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
serviceobrigatórioServiço de /services
tierobrigatóriobasic, standard ou premium
textobrigatório sem answers, script ou awaitBriefA tarefa: o que fazer, até 10.000 caracteres. Com script: como ler (tom, ritmo, pronúncia de nomes)
linkopcionalUm 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
answersopcionalRespostas às briefQuestions do serviço: [{"q": "question", "a": "answer"}], até 8, cada resposta com até 5.000 caracteres
scriptobrigatório quando script em /services não é null, recusado nos demais casosO 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
localeopcionalIdioma do resultado, en ou ru. Por padrão, o idioma da sua conta
addonsopcionalIds dos extras de /services oferecidos para este pacote, por exemplo [7]
promoCodeopcionalUm cupom; se ele não for aplicável, o pedido não é feito (veja Erros)
awaitBriefopcionaltrue 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:

  1. Faça o pedido com "awaitBrief": true e sem text, link, answers e script. Ele é pago na hora e seu status é awaiting_brief; o prazo começa a contar com o briefing.
  2. Para cada arquivo, POST /orders/{id}/files com {"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" }
}
  1. Faça PUT dos bytes do arquivo para upload.url exatamente com os headers informados e sem chave de API, antes de upload.expiresAt (uma hora):
curl -X PUT "$url" -H "content-type: application/octet-stream" --data-binary @page-1.png
  1. POST /orders/{id}/files/{fileId}/complete. Um arquivo de tamanho diferente de size, ou cujos bytes não sejam de um tipo listado em accept, é recusado com 422 e excluído: o nome e o mime não contam. Caso contrário, a resposta é o arquivo, agora checking. Depois de alguns segundos, ou minutos no caso de uma gravação longa, ele fica ready, ou rejected com o motivo em reason, por exemplo recording_no_sound ou file_unreadable. O files do pedido mostra a situação de cada um.
  2. POST /orders/{id}/brief com text, link, answers e script, como em POST /orders. Os arquivos prontos ainda não enviados vão junto, ou liste em fileIds os que devem ser enviados. Enquanto algum deles ainda estiver checking, o briefing é recusado com 409 files_not_ready: envie-o de novo um pouco depois. A resposta (200) é o pedido, agora in_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

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:

StatusSignificado
awaiting_briefFeito com awaitBrief: aguardando POST /orders/{id}/brief
in_progressO trabalho está em andamento
quality_checkO trabalho está pronto e passa por verificação antes da entrega
deliveredO resultado está pronto, veja results. Aprove-o ou peça ajustes até autoAcceptAt
revisionOs ajustes que você pediu estão sendo feitos
completedVocê aprovou o resultado, ou ele foi aprovado automaticamente
refundedO 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

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" }
StatusCódigoSignificado
400validationUm campo está ausente ou incorreto; fields lista quais
400link_requiredEste serviço exige link
400files_requiredEste serviço exige um arquivo: faça o pedido com awaitBrief e faça o upload dele
400script_requiredEste serviço lê um texto em voz alta: envie-o em script
400script_too_longscript é mais longo do que o pacote lê; maxChars na resposta é o máximo aceito. Nada foi cobrado
400script_not_acceptedO serviço não lê texto em voz alta (seu script em /services é null): omita script. Nada foi cobrado
400files_not_accepted, file_too_largeO serviço não aceita arquivos, ou o arquivo é maior que o seu maxMb
400invalid_idempotency_keyIdempotency-Key está vazio, tem mais de 255 caracteres ou não é ASCII imprimível
401invalid_api_keySem 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
402insufficient_balanceSaldo insuficiente; nada foi cobrado
404package_not_found, order_not_found, file_not_foundServiço, pacote, pedido ou arquivo inexistente
409order_not_delivered, no_revisions_leftO pedido não está em um status que permita isso
409brief_not_expectedO pedido não está aguardando o briefing: foi feito sem awaitBrief, ou o briefing já foi enviado
409uploads_closedArquivos só são aceitos enquanto o pedido aguarda o briefing ou está entregue
409files_limitMais arquivos do que o serviço aceita por briefing ou pedido de ajustes, ou mais de 5 arquivos ou 4 GB no pedido
409upload_quotaCom 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
409files_not_ready, file_rejectedUm arquivo a enviar ainda está em verificação, ou foi rejeitado
409upload_incompleteNada foi enviado para o link ainda: conclua o PUT e depois conclua o upload novamente
409file_in_use, file_busyO 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
409addon_unavailableUm extra não é oferecido para este serviço e pacote
409promo_not_found, promo_inactive, promo_used_up, promo_already_used, promo_first_order_only, promo_min_orderO 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
409idempotency_key_in_progressUma requisição com este Idempotency-Key ainda está sendo processada; repita-a instantes depois
410upload_expired, file_removedO link de upload expirou antes de qualquer envio, ou você retirou o arquivo: inicie um novo upload
415file_type_not_acceptedO mime informado não é de um tipo que o serviço aceita
422idempotency_key_reusedEste Idempotency-Key já foi usado com uma requisição diferente
422upload_size_mismatch, file_type_not_acceptedO 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
422file_unreadable, recording_no_sound, check_failedConclusã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
429rate_limitedMais 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.