DocsAPI Reference

API Reference

Generate personalized videos programmatically. Use the same API that powers our visual builder.

New to the API? Start with the Quickstart Guide for a step-by-step tutorial.

Authentication

All API requests require an API key. Include it in the X-API-Key header or as a Bearer token.

Request headers
X-API-Key: sf_live_a1b2c3d4e5f6...

# Or using Authorization header:
Authorization: Bearer sf_live_a1b2c3d4e5f6...

Create API keys in your Dashboard Settings. API keys require Studio tier or above.

Scopes

API keys are scoped to limit access to specific resources. Choose the minimal set of scopes needed for your integration.

ScopeDescription
videos:createCreate single render jobs
videos:create:batchCreate batch render jobs (CSV)
videos:readPoll render status, get video URLs
videos:deleteDelete rendered videos
templates:readList templates, view data schemas
templates:writeCreate, update, fork, and delete templates
projects:readList and view saved projects
projects:writeCreate, update, delete projects
billing:readView credit balance and usage history
webhooks:manageCreate and update webhook endpoints
keys:manageCreate and revoke API keys

Most integrations need videos:create and videos:read. If you need batch rendering, also include videos:create:batch.

Base URL

https://app.sigfigsstudio.com/api

Rate Limits

Rate limits are applied per API key. Exceeding limits returns 429 Too Many Requests.

EndpointLimit
POST /render30/min
POST /render/batch5/min
GET /render/:id120/min
GET/POST /keys30/min

Response headers include X-RateLimit-Limit, X-RateLimit-Remaining, and Retry-After.

Endpoints

Render a Video

POST
/api/render

Create a render job. Returns a job ID for status polling.

API Key or Sessionscope: render

Request Body

templateId
stringrequired
Template to render. One of: emeritus, laureate, rewind, pulse, handshake
data
objectrequired
Template data. Fields vary by template — see Template Data below.
brand
object
Brand customization: accentColor (hex), logoUrl, logoPosition.
audio
object
Audio settings: includeVoiceover (bool), voiceId (string), musicTrack.
scenes
array
Scene overrides. Toggle scenes on/off, reorder, set custom durations.
output
object
Output settings: resolution ("720p" | "1080p" | "4k"), fps (30 | 60).

Example

curl
curl -X POST https://app.sigfigsstudio.com/api/render \
  -H "Content-Type: application/json" \
  -H "X-API-Key: sf_live_YOUR_KEY_HERE" \
  -d '{
    "templateId": "emeritus",
    "data": {
      "authorId": "A5001825849"
    },
    "brand": {
      "accentColor": "#14b8a6"
    },
    "audio": {
      "includeVoiceover": true,
      "voiceId": "en-GB-RyanNeural"
    }
  }'
Response (201)
{
  "success": true,
  "jobId": "78008b5b-4207-4b2e-a1c5-9b923f519d4c",
  "status": "pending",
  "templateId": "emeritus",
  "displayName": "Dr. Jane Smith",
  "creditsRemaining": 97,
  "message": "Render job created. Poll GET /api/render/[jobId] for status."
}

Check Render Status

GET
/api/render/:id

Poll for render job status. Returns video URL when complete.

API Key or Sessionscope: read
Response (complete)
{
  "success": true,
  "job": {
    "id": "78008b5b-...",
    "status": "complete",
    "outputUrl": "https://skkroo2x4wm2v7c8.public.blob.vercel-storage.com/emeritus/78008b5b.mp4",
    "authorName": "Dr. Jane Smith",
    "createdAt": "2026-03-19T19:18:53.849Z",
    "completedAt": "2026-03-19T19:19:20.614Z"
  }
}

Status values: pendingprocessingcomplete | failed. Typical render time: 30-120 seconds.

Batch Render

POST
/api/render/batch

Create multiple render jobs from a CSV-style rows array. Max 100 per batch.

API Key or Sessionscope: batch
Request body
{
  "templateId": "emeritus",
  "headers": ["name", "openalex_id", "institution"],
  "rows": [
    ["Dr. Jane Smith", "A5001825849", "MIT"],
    ["Prof. John Doe", "A5002345678", "Stanford"],
    ["Dr. Sarah Lee", "A5003456789", "Oxford"]
  ]
}
Response
{
  "success": true,
  "batchId": "batch-abc123",
  "jobIds": ["job-1", "job-2", "job-3"],
  "totalJobs": 3,
  "status": "pending"
}

API Key Management

GET
/api/keys

List your API keys (key values are never shown after creation).

Session only
POST
/api/keys

Create a new API key. Returns the key value once.

Session only
DELETE
/api/keys/:id

Revoke an API key immediately.

Session only
Create key (using preset)
curl -X POST https://app.sigfigsstudio.com/api/keys \
  -H "Content-Type: application/json" \
  -H "Cookie: [your session cookie]" \
  -d '{ "name": "Production", "scopes": "render-batch" }'
Create key (using specific scopes)
curl -X POST https://app.sigfigsstudio.com/api/keys \
  -H "Content-Type: application/json" \
  -H "Cookie: [your session cookie]" \
  -d '{ "name": "Production", "scopes": "videos:create,videos:create:batch,videos:read" }'
Response
{
  "success": true,
  "key": "sf_live_a1b2c3d4e5f6789...",
  "apiKey": {
    "id": "clx...",
    "name": "Production",
    "keyPrefix": "sf_live_a1b2c3d4",
    "scopes": "videos:create,videos:create:batch,videos:read"
  },
  "message": "Save this API key — it won't be shown again."
}

Available presets: render-only, render-batch, full-access, read-only, admin.

Templates

Create custom templates from scratch, fork existing ones, or browse the library.

GET
/api/templates

List your templates + built-in templates.

API Key or Sessionscope: templates:read
POST
/api/templates

Create a new template from scratch or fork an existing one.

API Key or Sessionscope: templates:write
GET
/api/templates/:id

Get a single template with full scene config.

API Key or Sessionscope: templates:read
PATCH
/api/templates/:id

Update scenes, data slots, defaults, or visibility.

API Key or Sessionscope: templates:write
DELETE
/api/templates/:id

Delete a custom template.

API Key or Sessionscope: templates:write

Create from Scratch

curl
curl -X POST https://app.sigfigsstudio.com/api/templates \
  -H "Content-Type: application/json" \
  -H "X-API-Key: sf_live_YOUR_KEY" \
  -d '{
    "name": "Quarterly Review",
    "scenes": [
      { "primitiveId": "title-intro", "voScript": "Welcome to Q[quarter] [year]." },
      { "primitiveId": "stat-counters", "voScript": "[revenue] in revenue. [growth]% growth." },
      { "primitiveId": "bar-race" },
      { "primitiveId": "comparison-bars" },
      { "primitiveId": "outro" }
    ],
    "dataSlots": [
      { "key": "revenue", "type": "number", "required": true },
      { "key": "growth", "type": "number" },
      { "key": "quarter", "type": "text", "required": true }
    ],
    "defaults": { "voiceId": "en-GB-RyanNeural", "accentColor": "#6366F1" }
  }'

Fork an Existing Template

curl
curl -X POST https://app.sigfigsstudio.com/api/templates \
  -H "Content-Type: application/json" \
  -H "X-API-Key: sf_live_YOUR_KEY" \
  -d '{
    "name": "My Custom Emeritus",
    "forkFrom": "emeritus",
    "scenes": [
      { "primitiveId": "title-intro", "voScript": "Celebrating [name]." },
      { "primitiveId": "radar" },
      { "primitiveId": "bar-race" },
      { "primitiveId": "world-map" },
      { "primitiveId": "outro" }
    ]
  }'
Response (201)
{
  "success": true,
  "template": {
    "id": "clx1abc2def3...",
    "name": "My Custom Emeritus",
    "scenes": [...],
    "baseTemplateId": "emeritus",
    "visibility": "private"
  },
  "message": "Template forked from emeritus."
}

Primitives

GET
/api/primitives

Browse all available animated primitives. Filter by category. No auth required.

Public

Primitives are the building blocks — animated charts, counters, maps, badges, and more. Use them when creating custom templates.

curl
curl https://app.sigfigsstudio.com/api/primitives

# Filter by category
curl https://app.sigfigsstudio.com/api/primitives?category=Data%20Viz
Response
{
  "success": true,
  "primitives": [
    {
      "id": "bar-race",
      "label": "Bar Chart Race",
      "category": "Data Viz",
      "description": "Animated ranking race over time",
      "animationOptions": ["animate-on-init"],
      "defaultDuration": 6,
      "dataInputs": ["items[]", "values[]"]
    },
    ...
  ],
  "categories": ["Text", "Data Viz", "Gamification", "Comparison", ...],
  "total": 72
}

Template Data

Each template expects different data fields. Some templates fetch data from external sources automatically.

Emeritus

Academic research career celebration

authorId
stringrequired
OpenAlex author ID (e.g., "A5001825849"). Data is fetched automatically from OpenAlex API.
person_name
string
Override the author's display name.
institutionOverride
string
Override the primary institution.

Laureate

Author literary career spotlight

hardcover_id
string
Hardcover author ID. Data fetched automatically.
person_name
stringrequired
Author's name.
books
array
Array of book objects with title, year, rating, genre.

Stride (Wrapped)

Year-in-review / Spotify Wrapped style

person_name
stringrequired
User's name.
totalWorkouts
numberrequired
Total workout count.
totalMinutes
number
Total minutes exercised.
percentile
number
Percentile rank (0-100).
radarData
array
Category scores for radar chart.

Monthly Recap

Business monthly/quarterly review

person_name
stringrequired
Recipient name.
period
stringrequired
Period label (e.g., "March 2026").
keyStats
arrayrequired
Key metrics array.
categories
array
Category breakdown for charts.

Client Welcome

Client onboarding video

company_name
stringrequired
Client company name.
person_name
string
Key contact name.
industry
string
Client industry.
milestones
array
Company timeline milestones.
companyStats
array
Key company statistics.

Available Voices

Voice IDDescriptionTier
en-GB-RyanNeuralMale, British, professionalFree
en-US-GuyNeuralMale, American, neutralFree
en-US-JennyNeuralFemale, American, friendlyFree
en-GB-SoniaNeuralFemale, British, confidentFree
elevenlabs-customBring your own ElevenLabs voiceStudio+

Error Codes

CodeMeaning
400Invalid request — check the error details
401Missing or invalid API key
402Insufficient credits
403Feature requires higher tier or insufficient API key scope
429Rate limit exceeded — check Retry-After header
502External data source failed (e.g., OpenAlex down)

SDKs & Libraries

The API is a standard REST API — use any HTTP client. Here are quick examples:

Python
import requests

API_KEY = "sf_live_YOUR_KEY"
BASE = "https://app.sigfigsstudio.com/api"

# Render a video
job = requests.post(f"{BASE}/render", json={
    "templateId": "emeritus",
    "data": {"authorId": "A5001825849"},
}, headers={"X-API-Key": API_KEY}).json()

print(f"Job created: {job['jobId']}")

# Poll for completion
import time
while True:
    status = requests.get(
        f"{BASE}/render/{job['jobId']}",
        headers={"X-API-Key": API_KEY}
    ).json()
    if status["job"]["status"] == "complete":
        print(f"Video: {status['job']['outputUrl']}")
        break
    time.sleep(5)
Node.js
const API_KEY = "sf_live_YOUR_KEY";
const BASE = "https://app.sigfigsstudio.com/api";

// Render a video
const { jobId } = await fetch(`${BASE}/render`, {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "X-API-Key": API_KEY,
  },
  body: JSON.stringify({
    templateId: "client-welcome",
    data: {
      company_name: "Meridian Health",
      person_name: "Sarah Chen",
      industry: "Healthcare",
    },
  }),
}).then(r => r.json());

// Poll for completion
const poll = setInterval(async () => {
  const { job } = await fetch(
    `${BASE}/render/${jobId}`,
    { headers: { "X-API-Key": API_KEY } }
  ).then(r => r.json());

  if (job.status === "complete") {
    clearInterval(poll);
    console.log("Video:", job.outputUrl);
  }
}, 5000);

Ready to integrate?

Create an API key in your dashboard and start generating videos in minutes.