Skip to main content
The unified async task API provides a standardized submit → poll → retrieve workflow, abstracting away provider-specific differences.

Overview

AI tasks such as video generation, image generation, and music generation can take anywhere from tens of seconds to several minutes. To ensure a good user experience and system stability, these tasks are handled through an async task API:
  1. Submit a task — Send a generation request and immediately receive a task ID
  2. Poll for status — Use the task ID to check progress, or receive a callback notification
  3. Retrieve results — Once complete, get the generated resource URLs from the response

Supported Models

ProviderExample ModelsType
Klingkling-v2, kling-v1-6Video / Image
Lumaluma-ray-2, luma-photonVideo
Runwayrunway-gen4Video
RunwayMLrunwayml-gen3a-turboVideo
Veo (Google)veo-3Video
Minimaxminimax-video-01Video
Viduvidu-2.0Video
Jimengjimeng-v2Video / Image
Doubao (VolcEngine)doubao-seedance-1-0-proVideo
Flux (BFL)flux-pro, flux-kontext-proImage
Replicatereplicate/*Image / Video
Xai (Grok)grok-2-imageVideo
Ali (Alibaba)wanx-v2Image / Video
The above are examples. Check the Models page for currently available models. The input parameters vary by model — click on any model in the list to view its detailed documentation.

Submit a Task

POST /v1/task/submit

Request Parameters

FieldTypeRequiredDescription
modelstringYesModel name
inputobjectYesModel-specific generation parameters
callback_urlstringNoWebhook URL for task status updates

Request Examples

curl -X POST https://api.ephone.ai/v1/task/submit \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "kling-v3/text-to-video",
    "input": {
      "prompt": "A golden retriever running under cherry blossom trees, slow motion, cinematic",
      "duration": "5",
      "aspect_ratio": "16:9"
    },
    "callback_url": "https://your-server.com/webhook/task"
  }'

Response Example

{
  "id": "task_abc123",
  "status": "queued",
  "created_at": 1711234567
}

Query a Task

GET /v1/task/{task_id}

Request Examples

curl https://api.ephone.ai/v1/task/task_abc123 \
  -H "Authorization: Bearer $API_KEY"

Response Examples

Task in progress:
{
  "id": "task_abc123",
  "status": "in_progress",
  "created_at": 1711234567
}
Task completed:
{
  "id": "task_abc123",
  "status": "completed",
  "created_at": 1711234567,
  "completed_at": 1711234620,
  "outputs": [
    "https://cdn.example.com/video/result.mp4"
  ]
}
Task failed:
{
  "id": "task_abc123",
  "status": "failed",
  "created_at": 1711234567,
  "completed_at": 1711234590,
  "error": "Content policy violation detected"
}

Task Statuses

StatusDescription
queuedTask submitted, waiting to be processed
in_progressTask is currently being generated
completedTask finished — results available in outputs
failedTask failed — reason available in error

Callback Notifications

When you include a callback_url in your submit request, the system will send a POST request to that URL whenever the task status changes. The callback body uses the same format as the query response:
{
  "id": "task_abc123",
  "status": "completed",
  "created_at": 1711234567,
  "completed_at": 1711234620,
  "outputs": [
    "https://cdn.example.com/video/result.mp4"
  ]
}
  1. The callback URL must be publicly accessible over HTTPS
  2. Callback requests have a 10-second timeout
  3. Callback URLs cannot point to localhost, 127.0.0.1, or the platform’s own domain
  4. Even with callbacks enabled, implement polling as a fallback to avoid missing notifications due to network issues

Complete Polling Example

import time
import requests

API_KEY = "YOUR_API_KEY"
BASE_URL = "https://api.ephone.ai/v1"

# 1. Submit task
submit_resp = requests.post(
    f"{BASE_URL}/task/submit",
    headers={
        "Authorization": f"Bearer {API_KEY}",
        "Content-Type": "application/json",
    },
    json={
        "model": "kling-v3/text-to-video",
        "input": {
            "prompt": "A golden retriever running under cherry blossom trees",
            "duration": "5",
            "aspect_ratio": "16:9",
        },
    },
)

task = submit_resp.json()
task_id = task["id"]
print(f"Task submitted: {task_id}")

# 2. Poll until complete
while True:
    resp = requests.get(
        f"{BASE_URL}/task/{task_id}",
        headers={"Authorization": f"Bearer {API_KEY}"},
    )
    result = resp.json()
    status = result["status"]
    print(f"Status: {status}")

    if status == "completed":
        print("Results:", result["outputs"])
        break
    elif status == "failed":
        print("Failed:", result.get("error", "Unknown error"))
        break

    time.sleep(5)

Response Fields

FieldTypeDescription
idstringUnique task identifier
statusstringTask status: queued / in_progress / completed / failed
created_atintegerTask creation time (Unix timestamp in seconds)
completed_atintegerTask completion time (Unix timestamp in seconds), only present when completed or failed
outputsstring[]List of result URLs (video/image/audio), only present when completed
errorstringError message, only present when failed

Notes

  1. Authentication uses standard Authorization: Bearer <API_KEY> headers
  2. The input parameters vary by model — click on the model in the Models page to view its documentation
  3. Recommended polling interval is 3–10 seconds to avoid excessive requests
  4. Resource URLs in task results may have expiration limits — download and save promptly

Video Models

Provider-specific video generation API documentation

Image Models

Image generation API documentation