Skip to main content
Set VIGGLE_API_KEY before using these examples. Replace all sample IDs with the complete IDs returned by your account.

Credits — GET /v1/credits

Create Character — POST /v1/characters

Add -F "type=vsplat" to also extract a 3D vsplat (all keeps the render too):
cURL

List, get, delete, and export Characters

For list, use GET /v1/characters; for deletion, change the request method to DELETE. See Characters for every request and response field.

Create Motion (from Video) — POST /v1/motions

Add -F "type=glb" to also extract a 3D animation.

Create Motion (from Text) — POST /v1/motions

The endpoint is the same, but text-to-motion uses application/json instead of multipart form data.

Import Motion — POST /v1/motions/import

List, get, delete, and export Motions

Create, list, get, and download a Render

Listing and status checks go through GET /v1/videos / GET /v1/videos/{video_id} — see List Videos and Get Video. The equivalent GET /v1/renders and GET /v1/renders/{render_id} are retired (405). There is no cancel endpoint. See Renders for parameter combinations and response fields.

Create a Render from a prepared draft

When either source is kind: "upload", PUT the bytes to each uploads[].url from the prepare response before calling POST /v1/renders. See Prepare Render for the full flow.

Watch a Render over Server-Sent Events

See Watch Render for the event vocabulary and reconnect semantics.

Generate a Video — POST /v1/videos

Text-to-video, first-frame-to-video, and first+last-frame-to-video all share this endpoint — which mode runs depends on which frame fields you send.
All three modes answer 200 with the same {id, status, progress, created_at} acceptance shape. See Generate Video (from Text), Generate Video (from First Frame and/or Text), and Generate Video (from First-Last Frames and/or Text) for the full field reference and common validation errors.

Endpoint-by-endpoint request examples

The following compact examples show the exact HTTP method, path, and request shape for every endpoint. In the Go snippets, client is an http.Client; in JavaScript, apiKey is your API key; in Python, headers is {"Authorization": "Bearer ..."}.

GET /v1/characters

GET /v1/characters/{character_id}

DELETE /v1/characters/{character_id}

GET /v1/characters/{character_id}/export

GET /v1/motions

GET /v1/motions/{motion_id}

DELETE /v1/motions/{motion_id}

GET /v1/motions/{motion_id}/export

GET /v1/videos

Replaces the retired GET /v1/renders (now 405 Method Not Allowed). Lists Renders and H3 text-to-video generations merged into one feed.

GET /v1/videos/{video_id}

Replaces the retired GET /v1/renders/{render_id} (now 405 Method Not Allowed). Accepts a render_ or vid_ prefixed ID.

GET /v1/renders/{render_id}/events

GET /v1/renders/{render_id}/download