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 30 credits flat by default, or 25 credits flat with enhance=false — enhance only affects the vsplat extraction and replaces the 25-credit price rather than adding to it. type=all is billed for both: 31 credits, or 26 credits with enhance=false. See Pricing and retention.

Request parameters

Send multipart/form-data. Provide exactly one of image, image_url, or ref_url. Prefer image_url in new integrations. The following fields apply only when type is vsplat or all.
joint_set rigs. full keeps all 441 joints, including the complete facial rig, so the Character can play back facial-expression animation. expression keeps a 119-joint body-plus-facial-expression rig. body keeps the 86-joint body-only rig, dropping every facial joint — the Character can’t animate its face at all. 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). This parameter belongs only to Character extraction; Motion creation has no joint_set field.Motion export is a separate choice: metahuman_url carries the 441-joint rig and metahuman_body_url the 86-joint body rig. The API does not currently return a dedicated 119-joint Motion export for expression. mixamo_url is a generic 50-joint rig intended for retargeting onto another character mesh. See Export 3D Motion.
This is the complete public request contract. Workflow storage paths, output URIs, named multiview inputs, body-shape prediction, 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
The vsplat extraction runs the higher-fidelity enhance pass by default (30 credits flat). To use the cheaper standard extraction instead, add -F "enhance=false" alongside type=vsplat or type=all (25 credits flat):
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):
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, image_url, or the backward-compatible ref_url alias. 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.

ref_url
string<uri>
deprecated

Backward-compatible alias for image_url. Do not send both fields.

name
string
default:""

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

model
enum<string>

Optional 2D preprocessing model used by type=render or all. It does not select the 3D extraction model. Omit to use the service default.

Available options:
V3,
v3,
V3_Preview,
V4,
v4,
V4_Preview,
V4_BaseSG
type
enum<string>
default:render

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

Available options:
render,
vsplat,
all
variant
enum<string>
default:optimized

VSPLAT encoding variant. quality applies only to optimized.

Available options:
optimized,
original
enhance
boolean
default:true

Whether to run the higher-fidelity vsplat extraction pass. Enabled by default, at a flat 30 credits; set to false for the cheaper standard extraction at 25 credits. Only takes effect when type is vsplat or all — it has no effect and is not billed when type=render.

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). This field configures Character extraction only; Motion extraction does not accept 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
quality
number
default:0.7

Target fraction of Gaussian splats retained after pruning. Applies only to type=vsplat or all.

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

Master switch for importance-ranked Gaussian pruning. prune_preset and prune_budget are used only when this is true.

prune_preset
enum<string>
default:balanced

Gaussian-splat pruning strategy; used only when filter_low_quality=true.

Available options:
geometric,
draft,
balanced,
quality,
compact,
compact_hq
prune_budget
number

Optional maximum Gaussian count budget for extract-time pruning. Applies only to type=vsplat or all.

Required range: x > 0
use_sparse_W
boolean
default:false

Store skinning weights as a sparse matrix in the extracted asset.

scale_parts
string

JSON object of body-part or bone scale factors, for example {"legs":1.1}. Requires joint_set=full.

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.