Saltar al contenido principal

Parámetros de ruta

id
string
requerido
Identificador canónico de la tarea asíncrona. Cuando id y task_id estén presentes a la vez, considéralos la misma tarea.
Si una respuesta de creación devuelve poll_url, llama exactamente a esa URL. Cuando apunte a /v1/tasks/{id}, trátala como el endpoint fijo canónico de estado.

Respuesta

id
string
Identificador canónico de la tarea asíncrona.
task_id
string
Alias del identificador de tarea asíncrona.
poll_url
string
URL de polling prioritaria devuelta por la respuesta de creación.
status
string
Estado de la tarea: pending, processing, completed, failed.
progress
number
Porcentaje de progreso (0-100).
video_url
string
URL del video generado (cuando se completa).
video
object
Objeto de video único con url, duration, width y height cuando está disponible.
videos
array
Arreglo de videos cuando el upstream devuelve más de una salida.
error
string
Mensaje de error (si falla).
created
integer
Marca de tiempo de creación.
updated
integer
Marca de tiempo de la última actualización.
model
string
Modelo usado por la tarea.
curl "https://api.lemondata.cc/v1/tasks/video_abc123" \
  -H "Authorization: Bearer sk-your-api-key"
{
  "id": "video_abc123",
  "task_id": "video_abc123",
  "poll_url": "/v1/tasks/video_abc123",
  "status": "pending",
  "progress": 0,
  "model": "sora-2",
  "created": 1706000000,
  "updated": 1706000000
}

Mejores prácticas de polling

  • Realizar polling cada 5-10 segundos
  • Implementar exponential backoff para tareas largas
  • Establecer un tiempo de espera máximo (ej. 10 minutos)
  • Gestionar el estado failed de forma adecuada
import time

def wait_for_video(task_id, max_wait=600, interval=5):
    """Wait for video with timeout."""
    start = time.time()

    while time.time() - start < max_wait:
        response = requests.get(
            f"https://api.lemondata.cc/v1/tasks/{task_id}",
            headers={"Authorization": "Bearer sk-your-api-key"}
        )
        data = response.json()

        if data["status"] == "completed":
            return data["video_url"]
        elif data["status"] == "failed":
            raise Exception(data.get("error", "Video generation failed"))

        time.sleep(interval)

    raise TimeoutError("Video generation timed out")