Generate hand-drawn whiteboard explainer videos from a text prompt or an uploaded document. This is the generation API for Simpled.ai.
Interactive API reference (Swagger) Developer hub| Public product API | This API | |
|---|---|---|
| Base URL | simpled.ai/api/v1 | api.simpled.ai/v1.7 |
| Returns | Capabilities, pricing, solutions, guides | Rendered videos |
| Authentication | None | X-API-Key header |
| OpenAPI | simpled.ai/api/v1/openapi.json | api.simpled.ai/openapi.json |
If you only need to know what the product supports or what it costs, use the public API — it needs no credentials and is free to call.
Rendering a video runs several models and a video render, so the API is asynchronous.
project_id immediately.status is completed or failed.Each minute of finished video costs one credit.
Send your key in the X-API-Key header. Keys are stored only as a SHA-256 hash and are shown once, at creation. Request one at manav@simpled.ai.
Limits on this API are per-key and agreed when a key is issued; no anonymous quota is published and no rate-limit headers are emitted here. The public product API at simpled.ai/api/v1 does publish machine-readable rate-limit headers if that is what you need.
Please do not run automated scans against this host — every generation request spends real compute and creates a job a human is billed for.
Versions are path segments and /v1.7 is current. Every response carries a
Link header with rel="deprecation" pointing at the
written policy, so the
retirement rules are discoverable before anything is retired.
import os
import time
import requests
API_URL = "https://api.simpled.ai"
HEADERS = {"X-API-Key": os.environ["SIMPLED_API_KEY"]}
# 1. Start a new video project
response = requests.post(
f"{API_URL}/v1.7/projects",
headers=HEADERS,
json={
"topic": "Explain the mechanics of a black hole",
"duration_seconds": 60,
"video_format": "horizontal",
},
)
response.raise_for_status()
project_id = response.json()["project_id"]
print(f"Project started: {project_id}")
# 2. Poll until finished
while True:
status = requests.get(f"{API_URL}/projects/{project_id}", headers=HEADERS).json()
print(f"{status['status']} ({status['progress_pct']}%) - {status['current_step']}")
if status["status"] == "completed":
video = requests.get(f"{API_URL}/projects/{project_id}/video", headers=HEADERS)
open("out.mp4", "wb").write(video.content)
print("Saved out.mp4")
break
if status["status"] == "failed":
raise SystemExit(f"Failed: {status['error']}")
time.sleep(15)
npx simpled-cli render "Explain how compound interest works" --duration 60 --output out.mp4