Skip to main content
POST
Create a reusable character asset
Creates a reusable Character asset. The request is asynchronous; poll the Character until status is ready before using its ID in a Render. type selects what gets produced from the source image: render (default) creates only the render-ready 2D Character, vsplat creates only the 3D Gaussian splat, and all produces both and is billed for both. Once the vsplat extraction is ready, fetch its download URL from Export 3D Character (for 3D/game engines).
Pricing (1 credit = $0.01): type=render costs 1 credit flat. type=vsplat costs 25 credits flat, or 30 credits flat with enhance=true — enhance only affects the vsplat extraction and replaces the 25-credit price rather than adding to it. type=all is billed for both: 26 credits, or 31 credits with enhance=true. See Pricing and retention.

Request parameters

Send multipart/form-data. Provide exactly one of image or image_url. The following fields apply only when type is vsplat or all.
joint_set rigs. full keeps all 441 joints. expression keeps the 119-joint body-plus-facial-expression rig. body keeps the 86-joint body-only rig, dropping every facial joint. Reducing the joint set only changes the joint list and the columns of the skinning matrix W — the splat count itself is untouched, so a body character still has a full-detail face, it just can’t animate it. If you omit joint_set, the V1 API resolves it to body (the extraction service’s own internal default is full, but V1 always fills in body first). A Motion used to drive this Character must be extracted on the same joint_set.
This is the complete public request contract. Workflow storage paths, output URIs, multiview and skinning configuration, and thumbnail rendering details are selected or generated by the service.

Response parameters

Returns 200 OK with a Character object.

Examples

To also extract a 3D vsplat, add -F "type=vsplat" (or all to keep the render too):
cURL
To apply the AI enhancement pass, add -F "enhance=true" alongside type=vsplat or type=allenhance has no effect on its own, since it only applies to the vsplat extraction (30 credits flat instead of 25):
cURL
The default joint_set is body. To keep facial-expression joints (or the full 441-joint rig), add -F "joint_set=expression" (or full) — remember to extract any driving Motion on the same joint_set:
cURL

Next step

Use Get Character to poll the returned ID until it is ready, then Export 3D Character (for 3D/game engines) to download the vsplat if requested.

Authorizations

Authorization
string
header
required

Server-side SDK clients use a project API key. Remote MCP clients use an OAuth access token. Never expose a project API key in browser code.

Headers

X-Request-Id
string

Optional caller-supplied correlation ID, up to 128 characters. The service returns the effective value in the response header for tracing and support.

Required string length: 1 - 128
X-Viggle-Source
string

Optional source-channel label, up to 128 characters, used to attribute traffic to an SDK, integration, product surface, or internal workflow.

Required string length: 1 - 128

Body

multipart/form-data

Supply the source image as exactly one of image or image_url. type selects what gets produced from it — see createCharacter. The fields below type apply only when it is vsplat or all. This is the complete public contract; workflow paths, output URIs, multiview details, thumbnail cameras and pose, render source, and rest mode are service-managed.

image
file

Character source image uploaded directly. Supply exactly one of image or image_url; supported formats are validated by the service.

image_url
string<uri>

Publicly reachable URL of the character source image. Supply this instead of image, and keep it accessible while the request is processed.

name
string
default:""

Optional display name for the Character. An omitted value defaults to an empty string.

type
enum<string>
default:render

Outputs to produce: render for the reusable 2D Character (1 credit), vsplat for only the 3D extraction (25 credits, 30 with enhance), or all for both (billed for both — 26 or 31 credits).

Available options:
render,
vsplat,
all
enhance
boolean
default:false

Whether to run an additional AI enhancement pass over the vsplat extraction. Only takes effect when type is vsplat or all — it has no effect and is not billed when type=render. Raises the vsplat cost from 25 to 30 credits flat, replacing the base vsplat price rather than adding to it.

joint_set
enum<string>
default:body

Rig the vsplat is skinned to. full keeps all 441 joints; expression keeps the 119-joint body-plus-facial-expression rig; body keeps the 86-joint body-only rig, dropping every facial joint. Reducing the joint set changes only joints and the columns of the skinning matrix W — the splat count itself is untouched, so a body character still has a full-detail face, it just can't animate it. Applies only when type is vsplat or all, and does not affect price. Omit to get body, the V1 default (the extraction service's own internal default is full, but the V1 facade always resolves an omitted value to body before the request reaches it). A Motion used to drive this Character must be extracted on the same joint_set.

Available options:
expression,
body,
full
model_precision
number

Optional model-level precision parameter for vsplat extraction, greater than 0 and at most 1. Applies only to type=vsplat or all.

Required range: 0 < x <= 1
filter_low_quality
boolean
default:false

Master switch for pruning low-importance Gaussian splats out of the extraction before encoding. Defaults to false (no pruning). When true, splats below the extraction service's quality threshold are removed. Applies only to type=vsplat or all.

render_thumbnail
boolean
default:false

Whether to generate the standard Character thumbnail. The service chooses the render source and pose internally.

task_id
string

Client-supplied idempotency key for type=vsplat. For type=all, the service keys the companion extraction with the Character ID. Use a unique, stable non-empty value when retrying the same creation request; reusing it for separate work causes a conflict.

Minimum string length: 1

Response

Character queued.

A character or motion asset. Both resources share one wire shape.

progress is null in list responses. error is always null, including on a failed asset: read status to detect failure.

type reflects what was requested at creation. For characters it is render, vsplat, or all; for motions it is render, glb, or all. Assets created before type existed report render. vsplat and glb carry that extraction's own status — never download URLs, which come from GET /v1/characters/{character_id}/export or GET /v1/motions/{motion_id}/export instead — and are null unless type requested that extraction. On an all asset, the top-level status only reaches ready once both the 2D render and the 3D extraction have; if either fails, the top-level status is failed while the sub-object's own status still shows which one it was.

id
string
required

Public asset identifier. Character IDs normally begin with char_; Motion IDs normally begin with mot_.

Minimum string length: 1
status
enum<string>
required

Overall lifecycle of the asset. Use an asset for rendering or export only after the required capability becomes ready.

Available options:
queued,
processing,
ready,
failed,
cancelled
name
string
required

Display name supplied at creation or derived during import; it may be empty when a workflow does not accept a name.

progress
integer | null
required

Best-effort processing percentage from 0 through 100 on detail responses; null in list responses or when unavailable.

Required range: 0 <= x <= 100
capabilities
string[]
required

What the asset can be used for. video_render appears once the asset is ready.

created_at
string | null
required

ISO 8601 timestamp with a UTC offset, for example 2026-07-31T09:15:22+00:00.

completed_at
string | null
required

ISO 8601 timestamp with a UTC offset when all requested processing reached a terminal state; null while work is active.

error
object | null
required

Reserved top-level failure detail. It is currently always null; detect failure from status and inspect extraction sub-objects when applicable.

type
enum<string>
default:render
required

Work requested when the asset was created. render produces the 2D render-ready asset, vsplat/glb requests 3D output, and all requests both supported outputs.

Available options:
render,
vsplat,
glb,
all
vsplat
object | null
required

Character vsplat extraction status. Null for motions, and for characters whose type is render. The request parameters (model_precision, etc.) submitted at creation are not echoed back here — this is status only.

glb
object | null
required

Motion 3D animation extraction/generation status. Null for characters, and for motions whose type is render.