xPilot API Documentation

v1 REST API Reference

Overview

The xPilot v1 API provides programmatic access to AI-powered video, image, and text generation. All endpoints require a valid API key and use credit-based billing.

Base URL:https://xpilot.jytech.us/api/v1
Auth:Authorization: Bearer xp_...
Rate Limit:30 requests / minute per API key
Format:JSON

Authentication

Create an API key from Settings > API Keys. Include it in the Authorization header of every request:

bashcurl -H "Authorization: Bearer xp_your_api_key_here" \
  https://xpilot.jytech.us/api/v1/models
Keep your API key secret. Do not expose it in client-side code or public repositories.

List Models

GET/api/v1/models

Returns all available models grouped by type (text, video, image) with pricing information.

bashcurl -H "Authorization: Bearer xp_..." \
  https://xpilot.jytech.us/api/v1/models

Response:

json{
  "models": {
    "text": [
      { "id": "openai/gpt-4o", "label": "GPT-4o", "type": "text" }
    ],
    "video": [
      {
        "id": "seedance-2.0/text-to-video",
        "label": "Seedance 2.0",
        "tier": "premium",
        "supports_audio": true,
        "supports_lock_camera": true,
        "durations": [4, 8, 12],
        "cost_cents_per_5s": 300,
        "type": "video",
        "mode": "text-to-video",
        "provider": "seedance"
      }
    ],
    "image": [
      { "id": "bytedance/seedream-4.5", "label": "Seedream 4.5", "type": "image" }
    ]
  }
}

Generate Video

POST/api/v1/video/generate

Submit an async video generation task. Poll the returned poll_url for progress.

ParameterTypeRequiredDescription
modelstringRequiredModel ID (e.g. "seedance-2.0/text-to-video")
promptstringRequiredDescription of the video to generate
durationnumberOptionalDuration in seconds (default 5, Seedance supports 4/8/12)
aspect_ratiostringOptional"16:9", "9:16", "1:1" etc. (default "16:9")
image_urlstringOptionalSource image URL for image-to-video models
generate_audiobooleanOptionalGenerate synchronized audio (Seedance 2.0, Wan 2.6)
lock_camerabooleanOptionalLock camera position (Seedance 2.0 only)

Example:

bashcurl -X POST https://xpilot.jytech.us/api/v1/video/generate \
  -H "Authorization: Bearer xp_..." \
  -H "Content-Type: application/json" \
  -d '{
    "model": "seedance-2.0/text-to-video",
    "prompt": "A cat walking on a beach at sunset",
    "duration": 8,
    "aspect_ratio": "16:9",
    "generate_audio": true,
    "lock_camera": false
  }'

Response:

json{
  "task_id": "abc123",
  "status": "processing",
  "provider": "seedance",
  "poll_url": "/api/v1/video/abc123?provider=seedance",
  "cost_cents": 300,
  "remaining_credits_cents": 4700
}

Poll Video Status

GET/api/v1/video/:taskId

Check the status of a video generation task. Use the poll_url returned from the generate endpoint. Poll every 3-5 seconds until status is "completed" or "failed".

ParameterTypeRequiredDescription
providerstringOptional"wavespeed" or "seedance" (query param, default "wavespeed")
pollUrlstringOptionalWavespeed poll URL (query param, auto-included in poll_url)
bash# Use the poll_url from the generate response
curl -H "Authorization: Bearer xp_..." \
  "https://xpilot.jytech.us/api/v1/video/abc123?provider=seedance"

Response (processing):

json{
  "task_id": "abc123",
  "status": "processing",
  "outputs": [],
  "provider": "seedance"
}

Response (completed):

json{
  "task_id": "abc123",
  "status": "completed",
  "outputs": ["https://cdn.example.com/video.mp4"],
  "provider": "seedance"
}

Generate Image

POST/api/v1/image/generate

Generate an image. Some models return results synchronously; others return a poll_url.

ParameterTypeRequiredDescription
modelstringRequiredModel ID (e.g. "bytedance/seedream-4.5")
promptstringRequiredImage description
aspect_ratiostringOptional"1:1", "16:9", "9:16" etc.
modestringOptional"t2i" (text-to-image), "i2i" (image-to-image), "i2i_text" (edit text in image)
image_urlstringOptionalSource image for i2i/editing modes
image_urlsstring[]OptionalMultiple source images (multi-reference models)
bashcurl -X POST https://xpilot.jytech.us/api/v1/image/generate \
  -H "Authorization: Bearer xp_..." \
  -H "Content-Type: application/json" \
  -d '{
    "model": "bytedance/seedream-4.5",
    "prompt": "A futuristic cityscape at dawn",
    "aspect_ratio": "16:9"
  }'

Response (sync):

json{
  "task_id": "img_456",
  "status": "completed",
  "outputs": ["https://cdn.example.com/image.png"],
  "cost_cents": 5,
  "remaining_credits_cents": 4695
}

Generate Text

POST/api/v1/text/generate

Generate text using a large language model. Returns result synchronously.

ParameterTypeRequiredDescription
modelstringOptionalModel ID (default "openai/gpt-4o")
promptstringRequiredThe prompt / question
systemstringOptionalSystem prompt to set behavior
max_tokensnumberOptionalMax output tokens (default 1000)
temperaturenumberOptionalSampling temperature 0-2 (default 0.7)
bashcurl -X POST https://xpilot.jytech.us/api/v1/text/generate \
  -H "Authorization: Bearer xp_..." \
  -H "Content-Type: application/json" \
  -d '{
    "model": "openai/gpt-4o",
    "prompt": "Write a tweet about AI video generation",
    "max_tokens": 280
  }'

Response:

json{
  "content": "AI video generation just hit a new level...",
  "model": "openai/gpt-4o",
  "usage": {
    "prompt_tokens": 15,
    "completion_tokens": 42,
    "total_tokens": 57
  },
  "cost_cents": 1,
  "remaining_credits_cents": 4694
}

Error Handling

All errors return a JSON object with an error field:

json{
  "error": {
    "message": "Invalid or missing API key",
    "code": "UNAUTHORIZED"
  }
}
HTTPCodeDescription
400INVALID_PARAMSMissing or invalid request parameters
400INVALID_MODELModel ID not found
401UNAUTHORIZEDMissing, invalid, or revoked API key
402INSUFFICIENT_CREDITSNot enough credits for this operation
429RATE_LIMITEDRate limit exceeded (30 req/min). Check Retry-After header.
500GENERATION_FAILEDGeneration failed upstream

Full Example: Generate & Download Video

bash#!/bin/bash
API_KEY="xp_your_key_here"
HOST="https://xpilot.jytech.us"

# 1. Submit video generation
RESULT=$(curl -s -X POST "$HOST/api/v1/video/generate" \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "seedance-2.0/text-to-video",
    "prompt": "A golden retriever running through a meadow",
    "duration": 8,
    "generate_audio": true
  }')

POLL_PATH=$(echo $RESULT | jq -r '.poll_url')
echo "Task submitted. Poll path: $POLL_PATH"

# 2. Poll until complete
while true; do
  STATUS=$(curl -s -H "Authorization: Bearer $API_KEY" "$HOST$POLL_PATH")
  STATE=$(echo $STATUS | jq -r '.status')
  echo "Status: $STATE"

  if [ "$STATE" = "completed" ]; then
    VIDEO_URL=$(echo $STATUS | jq -r '.outputs[0]')
    echo "Video ready: $VIDEO_URL"
    curl -o output.mp4 "$VIDEO_URL"
    break
  elif [ "$STATE" = "failed" ]; then
    echo "Error: $(echo $STATUS | jq -r '.error')"
    break
  fi

  sleep 5
done

Python Example

pythonimport requests, time

API_KEY = "xp_your_key_here"
HOST = "https://xpilot.jytech.us"
HEADERS = {"Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json"}

# Submit
resp = requests.post(f"{HOST}/api/v1/video/generate", headers=HEADERS, json={
    "model": "seedance-2.0/text-to-video",
    "prompt": "A cat walking on a beach at sunset",
    "duration": 8,
    "generate_audio": True,
})
data = resp.json()
poll_path = data["poll_url"]
print(f"Cost: {data['cost_cents']} cents | Credits left: {data['remaining_credits_cents']}")

# Poll
while True:
    status = requests.get(f"{HOST}{poll_path}", headers=HEADERS).json()
    print(f"Status: {status['status']}")
    if status["status"] == "completed":
        print(f"Video URL: {status['outputs'][0]}")
        break
    elif status["status"] == "failed":
        print(f"Error: {status.get('error')}")
        break
    time.sleep(5)
Create API KeyView All Models