Highlight reel from raw footage

Upload a folder of raw clips and let Tellers pick the best moments and assemble them into a polished highlight reel — no manual editing required.

With the CLI

The fastest path: two commands.

# 1. Upload your raw footage folder
tellers upload ./raw-footage --in-app-path interviews

# 2. Ask Tellers to compile the best moments
tellers "From the footage in interviews/, create a 90-second highlight reel. \
Pick the most energetic and visually interesting moments. \
Generate a music track and sync the cuts to the beats."

With the API

For programmatic pipelines — upload all clips, collect the asset IDs, then send a single generation prompt referencing them.

import os, uuid, time, json, urllib.parse
import requests, sseclient

API_KEY = "sk_..."
BASE    = "https://api.tellers.ai"
headers = {"x-api-key": API_KEY}

# 1. Upload each clip
clips_dir = "./raw-footage"
asset_ids = []

for filename in os.listdir(clips_dir):
    if not filename.endswith((".mp4", ".mov")):
        continue
    filepath  = os.path.join(clips_dir, filename)
    file_size = os.path.getsize(filepath)

    resp = requests.post(f"{BASE}/users/assets/upload_urls", headers=headers, json=[{
        "upload_id":      str(uuid.uuid4()),
        "content_length": file_size,
        "file_type":      "video",
        "source_file": {
            "sourceName": "local", "sourceUrl": None, "sourceIconUrl": None,
            "authors": [], "creationDatetime": None,
            "additionDatetime": int(time.time()),
            "inAppPath": ["raw-footage"], "title": filename,
            "description": None, "keywords": [],
        },
    }])
    resp.raise_for_status()
    upload = resp.json()[0]
    asset_ids.append(upload["asset_id"])

    with open(filepath, "rb") as f:
        requests.put(upload["presigned_put_url"], data=f).raise_for_status()
    print(f"Uploaded {filename}{upload['asset_id']}")

# 2. Generate the highlight reel
ids_list = ", ".join(asset_ids)
prompt   = (
    f"Using asset IDs [{ids_list}]: create a 90-second highlight reel. "
    "Pick the most energetic and visually interesting moments. "
    "Generate a music track and sync the cuts to the beats."
)
url      = f"{BASE}/create?prompt={urllib.parse.quote(prompt)}"
response = requests.get(url, headers=headers, stream=True)
response.raise_for_status()

for event in sseclient.SSEClient(response).events():
    if event.event == "tellers.json_result":
        data = json.loads(event.data)
        print(data)
        if data.get("status") == "done":
            break

Install dependencies: pip install requests sseclient-py. See Upload a file for more detail on the upload step.