API

Haga pedidos de servicios desde su propio sitio web, tienda o script: consulte los servicios y sus precios, haga pedidos con la tarea, sígalos y obtenga los resultados. Es el mismo servicio que en el sitio, así que los pedidos hechos a través de la API también aparecen en su cuenta.

Primeros pasos

  1. Inicie sesión y abra Saldo y claves de API.
  2. Cree una clave. Se muestra una sola vez: cópiela y manténgala en secreto, como una contraseña. Puede revocar una clave en cualquier momento.
  3. Recargue el saldo. Los pedidos hechos a través de la API se pagan con él, en dólares estadounidenses.

Envíe la clave en cada solicitud:

Authorization: Bearer dlx_your_key

Dirección de la API: https://dleex.com/api/v1. Las solicitudes y las respuestas son JSON. Los precios y los importes se expresan en centavos de dólar estadounidense enteros: 1500 significa 15,00 $.

Servicios

GET /services devuelve lo que se puede pedir.

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 es lo que tarda el trabajo; revisions es cuántas veces puede solicitar cambios. addons son extras que puede pedir con los paquetes indicados en tiers: su precio se suma al del paquete, y extraDays, a su plazo (negativo: más rápido, nunca menos de 1 día). briefQuestions son las preguntas que el servicio hace sobre la tarea, algunas con una hint; respóndalas en answers al hacer un pedido. La lista está vacía cuando un servicio no pregunta nada. linkRequired es true para un servicio que se realiza a partir de lo que abre un enlace, como un perfil o una publicación, o una grabación que subtitular: un pedido de ese servicio necesita link.

files es null para un servicio que no admite archivos con el brief. Si no, indica cuáles admite, p. ej. {"accept": ["image"], "maxFiles": 3, "maxMb": 5, "required": true, "insteadOfLink": false}: los tipos (image, audio, video), cuántos archivos por brief o por solicitud de cambios, el tamaño máximo de cada archivo en MB, si el brief necesita al menos uno y si un archivo puede sustituir a link (en ese caso linkRequired sigue siendo true para los pedidos enviados sin archivos). Consulte Archivos.

script es null para un servicio que no lee ningún texto en voz alta. Un servicio de locución indica el texto más largo que lee cada paquete, en caracteres, p. ej. {"maxChars": {"basic": 1000, "standard": 3000, "premium": 9000}}: sus pedidos necesitan script, el texto que se leerá palabra por palabra. La grabación se lee con una voz sintetizada: dondequiera que la publique, indique a sus oyentes que la voz es sintetizada (consulte los Términos).

Saldo

GET /balance

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

Hacer un pedido

POST /orders. El precio (el paquete y los extras, menos cualquier descuento) se descuenta del saldo y el trabajo comienza de inmediato.

Campo
serviceobligatorioServicio de /services
tierobligatoriobasic, standard o premium
textobligatorio sin answers, script ni awaitBriefLa tarea: qué hacer, hasta 10 000 caracteres. Con script: cómo leerlo (tono, ritmo, cómo pronunciar los nombres)
linkopcionalUn enlace a la página, el perfil o la publicación, o a una grabación: un enlace directo al archivo, o un enlace de Dropbox o Yandex Disk. Obligatorio cuando linkRequired es true
answersopcionalRespuestas a las briefQuestions del servicio: [{"q": "question", "a": "answer"}], hasta 8, cada respuesta de hasta 5000 caracteres
scriptobligatorio cuando script en /services no es null, rechazado en los demás casosEl texto que se leerá en voz alta, palabra por palabra, hasta el maxChars del paquete (como máximo 20 000 caracteres; un salto de línea cuenta como uno). Deje una línea en blanco entre párrafos
localeopcionalIdioma del resultado, en o ru. Por defecto, el idioma de su cuenta
addonsopcionalIds de los extras de /services ofrecidos para este nivel, p. ej. [7]
promoCodeopcionalUn código promocional; si no se aplica, el pedido no se realiza (consulte Errores)
awaitBriefopcionaltrue para enviar el brief más tarde, después de subir los archivos: el pedido se paga y queda en espera como awaiting_brief. En ese caso, omita text, link, answers y script. Consulte Archivos
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 es opcional y le permite repetir la solicitud de forma segura; cada pedido nuevo necesita una clave nueva. Consulte Idempotencia más abajo.

Indique text o al menos una respuesta, o ambos; para una locución basta con script. Escriba cada pregunta en q tal como aparece en briefQuestions, en el idioma del pedido, y omita aquellas a las que no tenga respuesta:

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

La respuesta es el pedido (estado 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": []
}

Archivos

Algunos servicios trabajan a partir de archivos del cliente, como imágenes de páginas que transcribir o una grabación que subtitular: su files en /services no es null. Los archivos se suben a un pedido que espera su brief:

  1. Haga el pedido con "awaitBrief": true y sin text, link, answers ni script. Se paga de inmediato y su estado es awaiting_brief; el plazo empieza a contar con el brief.
  2. Para cada archivo, POST /orders/{id}/files con {"name": "page-1.png", "size": 482113, "mime": "image/png"}: size es el tamaño exacto en bytes y mime es opcional. La respuesta (201) es el archivo y el lugar donde subirlo:
{
  "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. Envíe con PUT los bytes del archivo a upload.url con exactamente los headers indicados y sin clave de API, antes de upload.expiresAt (una hora):
curl -X PUT "$url" -H "content-type: application/octet-stream" --data-binary @page-1.png
  1. POST /orders/{id}/files/{fileId}/complete. Un archivo de un tamaño distinto de size, o cuyos bytes no sean de un tipo incluido en accept, se rechaza con 422 y se elimina: el nombre y mime no cuentan. Si no, la respuesta es el archivo, ahora en checking. Al cabo de unos segundos, o de unos minutos si es una grabación larga, pasa a ready, o a rejected con el motivo en reason, p. ej. recording_no_sound o file_unreadable. El files del pedido muestra en qué estado están.
  2. POST /orders/{id}/brief con text, link, answers y script como en POST /orders. Los archivos listos que aún no se han enviado van con él, o bien indique en fileIds los que quiere enviar. Mientras alguno de ellos siga en checking, el brief se rechaza con 409 files_not_ready: vuelva a enviarlo un poco más tarde. La respuesta (200) es el pedido, ahora en in_progress.

DELETE /orders/{id}/files/{fileId} retira un archivo que aún no se ha enviado. Un pedido admite como máximo 5 archivos y 4 GB en total; un archivo cuya subida se ha iniciado cuenta hasta que se completa o se retira, y durante un día desde el inicio de su subida, los archivos retirados o rechazados cuentan para un límite de 12 GB junto con los archivos del pedido: por encima de ese límite, la subida se rechaza con 409 upload_quota y retryAt, el momento en que se vuelve a admitir. Un pedido entregado también admite archivos para una solicitud de cambios: súbalos de la misma manera y luego envíe fileIds con la solicitud.

Sin awaitBrief, un pedido de un servicio cuyos archivos son required se rechaza con 400 files_required, y uno en el que un archivo puede sustituir al enlace, enviado sin enlace, con 400 link_required.

En el pedido, files enumera sus archivos con su status, y fileIds, los que se enviaron con el brief. Un archivo listo tiene una url que funciona hasta expiresAt, igual que los archivos de resultados. Los archivos se conservan durante 30 días después de cerrarse el pedido.

Idempotencia

Una solicitud puede agotar el tiempo de espera después de que el pedido ya se haya realizado. Para repetir POST /orders sin pagar dos veces, envíe con ella un encabezado Idempotency-Key: una cadena de 1 a 255 caracteres ASCII imprimibles que usted elige una vez por pedido, como un UUID o su propio número de pedido. Envíe la misma clave y el mismo cuerpo al repetir la solicitud.

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

Si ya se realizó un pedido con esta clave, la respuesta es ese pedido en su estado actual, con el estado 201 y un encabezado más. No se cobra nada de nuevo:

HTTP/1.1 201 Created
Idempotent-Replayed: true

Aceptar el trabajo, enviar briefs y solicitar cambios no llevan clave. Aceptar se puede repetir sin riesgo: una vez completado el pedido, una repetición responde 409 order_not_delivered. Lo mismo ocurre con un brief: una vez aceptado, una repetición responde 409 brief_not_expected y el pedido está en in_progress. Una solicitud de cambios es distinta: mientras se rehace el trabajo, una repetición responde 409 order_not_delivered, pero una vez entregado el trabajo rehecho, una repetición solicita otros cambios. Antes de repetir una solicitud de cambios, compruebe el pedido con GET /orders/{id} (status y revisionsLeft).

Seguimiento de pedidos

GET /orders/{id} devuelve un pedido, GET /orders, sus pedidos, del más reciente al más antiguo. La lista admite status, limit (de 1 a 100, 20 por defecto) y before (un id de pedido, para obtener pedidos más antiguos).

Estado del pedido:

EstadoSignificado
awaiting_briefRealizado con awaitBrief: en espera de POST /orders/{id}/brief
in_progressEl trabajo está en curso
quality_checkEl trabajo está terminado y se está revisando antes de la entrega
deliveredEl resultado está listo, consulte results. Acéptelo o solicite cambios antes de autoAcceptAt
revisionSe están haciendo los cambios que solicitó
completedUsted aceptó el resultado, o se aceptó automáticamente
refundedEl dinero volvió a su saldo

Consulte cada pocos minutos; no hace falta hacerlo con más frecuencia. Cuando el pedido está en delivered, results contiene el trabajo: kind es text (Markdown), report (un informe de entrega para pedidos de redes sociales) o files (archivos para descargar, con una nota opcional en body). Cada resultado tiene una lista files, vacía para textos e informes: cada archivo tiene name, mime, size en bytes y una url que funciona hasta expiresAt, aproximadamente una hora. Vuelva a leer el pedido para obtener enlaces nuevos. El enlace puede redirigir al almacenamiento de archivos, así que siga las redirecciones, p. ej. curl -L -o result.png "$url", y no envíe la clave de API con él: el enlace por sí solo abre el archivo.

Aceptación y cambios

Si no acepta ni solicita cambios en un pedido entregado, este se acepta automáticamente 3 días después de la entrega, en el momento indicado en autoAcceptAt (null en los demás estados). Una nueva entrega tras unos cambios reinicia los 3 días. También puede aceptar el trabajo en el sitio. Si escribe en el chat del pedido en el sitio después de la entrega, el pedido no se acepta automáticamente y autoAcceptAt es null hasta que usted lo acepte o nosotros rehagamos el trabajo o lo reembolsemos. Después de responder a su mensaje, también podemos reiniciar los 3 días: autoAcceptAt muestra entonces el nuevo momento.

Errores

Los errores llegan con un estado HTTP y un código:

{ "code": "insufficient_balance" }
EstadoCódigoSignificado
400validationFalta un campo o es incorrecto; fields los enumera
400link_requiredEste servicio necesita link
400files_requiredEste servicio necesita un archivo: haga el pedido con awaitBrief y súbalo
400script_requiredEste servicio lee un texto en voz alta: envíelo en script
400script_too_longscript es más largo de lo que lee el paquete; maxChars en la respuesta es el máximo que admite. No se ha cobrado nada
400script_not_acceptedEl servicio no lee ningún texto en voz alta (su script en /services es null): omita script. No se ha cobrado nada
400files_not_accepted, file_too_largeEl servicio no admite archivos, o el archivo supera su maxMb
400invalid_idempotency_keyIdempotency-Key está vacío, supera los 255 caracteres o no es ASCII imprimible
401invalid_api_keyNo hay clave, la clave es incorrecta o está revocada. Las claves también se revocan cuando el correo electrónico sin confirmar de la cuenta se confirma al iniciar sesión con Google o al establecer una contraseña nueva
402insufficient_balanceNo hay suficiente dinero en el saldo; no se ha cobrado nada
404package_not_found, order_not_found, file_not_foundNo existe ese servicio, paquete, pedido o archivo
409order_not_delivered, no_revisions_leftEl pedido no está en un estado que lo permita
409brief_not_expectedEl pedido no espera su brief: se realizó sin awaitBrief, o su brief ya se envió
409uploads_closedSolo se admiten archivos mientras el pedido espera su brief o está entregado
409files_limitMás archivos de los que admite el servicio por brief o solicitud, o más de 5 archivos o 4 GB para el pedido
409upload_quotaCon este, los archivos del pedido (incluidos los enviados y las subidas sin terminar) y los iniciados en el último día y después retirados o rechazados superan los 12 GB: vuelva a intentarlo después de retryAt
409files_not_ready, file_rejectedUn archivo que enviar aún se está revisando, o fue rechazado
409upload_incompleteTodavía no se ha subido nada al enlace: termine el PUT y vuelva a completar la subida
409file_in_use, file_busyEl archivo se envió con el brief o con una solicitud y permanece en el pedido, o su revisión lo está moviendo: vuelva a intentarlo en un momento
409addon_unavailableUn extra no se ofrece para este servicio y nivel
409promo_not_found, promo_inactive, promo_used_up, promo_already_used, promo_first_order_only, promo_min_orderEl código promocional no existe, no está activo ahora, se ha agotado, ya lo ha usado usted, es solo para un primer pedido o requiere un pedido mayor. No se ha cobrado nada
409idempotency_key_in_progressUna solicitud con este Idempotency-Key todavía se está procesando; repítala un momento después
410upload_expired, file_removedEl enlace de subida caducó antes de que se subiera nada, o usted retiró el archivo: inicie una nueva subida
415file_type_not_acceptedEl mime indicado no es de un tipo que admita el servicio
422idempotency_key_reusedEste Idempotency-Key ya se usó con una solicitud diferente
422upload_size_mismatch, file_type_not_acceptedEl archivo subido no tiene el tamaño indicado en size, o sus bytes no son de un tipo que admita el servicio; se ha eliminado
422file_unreadable, recording_no_sound, check_failedAl completar un archivo que la revisión rechazó: no se abre, la grabación no tiene sonido o no se pudo revisar. Vuelva a subir el archivo u otro distinto
429rate_limitedMás de 120 solicitudes por minuto con una misma clave; espere los segundos indicados en Retry-After

Reembolsos

Si reembolsamos un pedido, el dinero vuelve al saldo y el pedido pasa a refunded.