Skip to main content

Python SDK for agent-media — generate AI UGC videos with talking heads, B-roll, and subtitles programmatically.

Project description

agent-media

Python SDK for agent-media — UGC video generation for developers.

Generate AI videos with realistic talking heads, B-roll, voiceover, animated subtitles, and music. One function call, finished video.

PyPI version Python license

Install

pip install agent-media

Quick Start

from agent_media import AgentMedia

client = AgentMedia(api_key="ma_YOUR_KEY")

# Generate a video — blocks until complete, returns the URL
video = client.create_video(
    script="Have you tried building UGC content at scale? This API makes it trivial.",
    actor_slug="sofia",
    tone="energetic",
    style="hormozi",
    target_duration=10,
)
print(video["video_url"])
# → https://...mp4

Async

from agent_media.client import AsyncAgentMedia

async with AsyncAgentMedia(api_key="ma_YOUR_KEY") as client:
    video = await client.create_video(
        script="Your script here...",
        actor_slug="sofia",
        tone="confident",
    )
    print(video["video_url"])

API Reference

AgentMedia(api_key, base_url?, timeout?)

Parameter Type Required Default
api_key str Yes
base_url str No Production API
timeout float No 60.0

client.create_video(**params)

Generate a video and wait for completion. Returns { job_id, video_url, credits_deducted, duration }.

video = client.create_video(
    script="Your script (50-3000 chars)",
    actor_slug="sofia",           # use list_actors() to browse
    tone="energetic",             # energetic | calm | confident | dramatic
    music="chill",                # chill | energetic | corporate | dramatic | upbeat
    style="hormozi",              # 17 subtitle styles
    target_duration=10,           # 5 | 10 | 15 seconds
    aspect_ratio="9:16",          # 9:16 | 16:9 | 1:1
    allow_broll=True,             # include AI-generated B-roll
    template="product-review",    # optional template
    webhook_url="https://...",    # optional async callback
    timeout_seconds=600,          # max wait time (default 10 min)
)

client.submit_video(**params)

Submit without waiting. Returns { job_id, status, credits_deducted }.

client.submit_subtitle(**params)

Add subtitles to an existing video.

job = client.submit_subtitle(
    video_url="https://example.com/video.mp4",
    style="bold",
)

client.submit_product_review(**params)

Generate a product review video from a URL.

job = client.submit_product_review(
    product_url="https://example.com/product",
    angle="enthusiastic",
    actor_slug="sofia",
)

client.list_actors(limit?, offset?)

Browse available AI actors.

result = client.list_actors(limit=20)
for actor in result["actors"]:
    print(f"{actor['slug']}{actor['name']} ({actor['gender']}, {actor['nationality']})")

client.get_video_status(job_id)

Check job progress.

status = client.get_video_status("job_abc123")
if status["status"] == "completed":
    print(status["video_url"])

Error Handling

from agent_media import AgentMedia, AgentMediaError

try:
    video = client.create_video(script="...")
except AgentMediaError as e:
    print(f"{e.code}: {e} (HTTP {e.status})")

Webhooks

Skip polling — pass webhook_url and agent-media will POST to it when the job completes or fails.

job = client.submit_video(
    script="...",
    actor_slug="sofia",
    webhook_url="https://example.com/webhooks/agent-media?secret=MY_TOKEN",
)

Payload on success:

{
  "job_id": "550e8400-e29b-41d4-a716-446655440000",
  "status": "completed",
  "video_url": "https://pub-xxx.r2.dev/videos/550e8400.mp4"
}

Payload on failure:

{
  "job_id": "550e8400-e29b-41d4-a716-446655440000",
  "status": "failed",
  "error_message": "Script exceeded maximum duration for selected actor."
}

Rules:

  • Must be https:// (plain HTTP is rejected)
  • Publicly reachable
  • Max 2048 characters
  • Retries on non-2xx: 3 attempts with exponential backoff (1 s, 4 s, 16 s)
  • Query strings are preserved — append ?secret=MY_TOKEN to verify authenticity

Batch Generation

from concurrent.futures import ThreadPoolExecutor

scripts = ["Script 1...", "Script 2...", "Script 3..."]

with ThreadPoolExecutor(max_workers=3) as pool:
    videos = list(pool.map(
        lambda s: client.create_video(script=s, actor_slug="sofia"),
        scripts,
    ))

for v in videos:
    print(v["video_url"])

Related Packages

Package Registry Description
@agentmedia/sdk npm TypeScript SDK
@agentmedia/mcp-server npm MCP server for Claude Code, Cursor, Windsurf
agent-media-cli npm CLI tool
@agentmedia/schema npm Shared schema, types, Zod validation

Links

License

Apache-2.0

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

agent_media-0.2.0.tar.gz (5.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

agent_media-0.2.0-py3-none-any.whl (6.1 kB view details)

Uploaded Python 3

File details

Details for the file agent_media-0.2.0.tar.gz.

File metadata

  • Download URL: agent_media-0.2.0.tar.gz
  • Upload date:
  • Size: 5.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.14 {"installer":{"name":"uv","version":"0.9.14","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for agent_media-0.2.0.tar.gz
Algorithm Hash digest
SHA256 11ef3ddc3e6d213acba72540a091e4c610dd68c28b390c92a647baec19b95406
MD5 5282e85101ab93bdf1ef08feac3305c1
BLAKE2b-256 e28b39b08ecc90d4711413404491b9248b551e694604750704e21f4ade73871c

See more details on using hashes here.

File details

Details for the file agent_media-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: agent_media-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 6.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.14 {"installer":{"name":"uv","version":"0.9.14","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for agent_media-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 2b0394890f478ae6a5bebfd82d6b0818b86c03f5baa467a989e15367c9b05d8e
MD5 4afed5a0ae6a8ea81e5be58e72905efd
BLAKE2b-256 d69a0765474805f6f112d44c956139f921c7b9904e0779c307e4fd404d842988

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page