Soup.video

Use this endpoint to run a published workflow you authored. Credits are charged to the API key owner. Poll the same status endpoint as single-model Cook jobs.

Studio remains admin-gated. The Workflows API does not require admin.

Create Workflow Run

Request

POST /api/v1/workflows/:slug/runs

curl -X POST https://soup.video/api/v1/workflows/passport-id-photo/runs \
  -H "Authorization: Bearer sk_soup_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "inputs": {
      "photo": "https://example.com/face.jpg",
      "country_preset": "US"
    }
  }'

slug is the workflow slug from Workflow Studio. inputs is the same payload the workflow form would submit.

Response

{
  "job_id": "8f8b3c3d-1a2b-4c5d-6e7f-8a9b0c1d2e3f",
  "status": "processing",
  "check_url": "https://soup.video/api/v1/generations/8f8b3c3d-1a2b-4c5d-6e7f-8a9b0c1d2e3f"
}

Poll check_url with the same API key. See Status.

Access

  • Authenticate with a Soup API key (sk_soup_…).
  • You can only run workflows you published. Other slugs return 404.
  • Draft / unpublished workflows return 403 until you publish.
  • Runs are stored as private assets.

Python Example

import time
import requests

API_KEY = "sk_soup_your_key_here"
headers = {"Authorization": f"Bearer {API_KEY}"}

create = requests.post(
    "https://soup.video/api/v1/workflows/passport-id-photo/runs",
    headers=headers,
    json={"inputs": {"photo": "https://example.com/face.jpg"}},
)
create.raise_for_status()
job = create.json()

while True:
    status = requests.get(job["check_url"], headers=headers).json()
    if status["status"] != "processing":
        print(status)
        break
    time.sleep(8)