Create characters from the catalog, preview them and download rigged, animated files straight from your code, your game pipeline or your AI assistant. Same rules as the studio: quota and license follow your account plan.
Get started in 3 steps
Sign in to the studio, open the account menu and create an API key. It is shown only once: keep it in a vault or an environment variable. Create a key in the studio →
Roll a random character (or build the recipe with catalog ids):
Send the key in the Authorization: Bearer avs_… header on every call. The API ignores the website cookie and has no CORS: keep the key on your server, never in page JavaScript. Each account can have up to 5 active keys with scopes, and revoking one cuts access immediately.
Scope
Allows
catalog:read
catalogs (character and model kinds) and recipe validation
avatars:write
random characters, image previews and AI design (spends credits)
exports:write
create files (uses quota), status, download and history
Limits and quota
The quota belongs to the account: downloads from the studio, the API and MCP add up in the same counter. RateLimit-Limit, RateLimit-Remaining and RateLimit-Reset headers show the per-minute limit; when exceeded you get 429 with Retry-After.
AI credits (new 3, with photo 4, adjust 2, repeated 1)
purchased packs only
30 per month + packs
Files, idempotency and license
Queue:POST /exports answers 202 with the id. Ask GET /exports/{id}?wait=20: the response waits up to 25 s, so you poll less.
Idempotency: send Idempotency-Key on POST /exports. Repeating with the same key and body within 24 h returns the same file without using quota again.
Download: files stay on the server for 15 minutes. Download with your key or via the signed download.url (no key needed; ideal to hand over to whoever asked).
License: every file carries a number AS-XXXXX-XXXXX (in the GLB, the PNG and LICENCA.txt inside zips). Anyone can check it at GET /licenses/{id} without seeing the owner.
Recipes: send config (parts and colors) or code (the short code from the studio link). Wrong ids fall back to defaults; /avatars/validate explains what changed.
Compressed GLB:"compress": true (GLB only) returns Draco-compressed geometry, usually 70 to 80% smaller and identical on screen. The loader needs a Draco decoder (Blender, three.js with DRACOLoader, Babylon and Unity glTFast have one). The same model compressed or not counts as one download.
Animals, humans and other models
Besides the chibi/voxel character, the API builds the studio's other kinds, each with its own recipe { kind, name, ...fields, palette }: creature (Soft, Low poly and Voxel animals; dog and cat with breeds and traits), tree (nature), critter (Cartoon plush animals, also with breeds and traits), human (realistic human with a wardrobe), toon (Cartoon), building, prop, vfx and world. All of them work on the free plan too, with the same quota, license and queue as the studio.
Read the kind's catalog: species, breeds with their traits and colors, the traits each species accepts, color zones and what each one paints, and the clips.
Breed and traits: the breed brings ears, muzzle, tail and coat (plus legs and body on Soft animals); each trait in traits changes only that detail on top of the breed (floppy-eared doberman = breed: "doberman", traits: { ears: "floppy" }). A trait the species does not accept comes back as a wrong_species warning.
Colors: each Cartoon animal species paints only its own zones (species[].zones; leather is the marking color: dalmatian spots, doberman tan). A color on a zone the model does not use comes back as unused_zone.
Animations:clips takes the model's ids (/models/validate returns the list); clips made in the studio animator go in myClips (rig creature for animals, human for human and Cartoon).
Plans: every kind works on the free plan too (preview, validation, AI with credits and downloads, which count against the monthly quota with a personal license). Pro removes the download limit and adds a commercial license, 256 px / 8-direction sprites and character batches (pro_only on the free plan). GET /me lists in kinds what your account can use.
Errors
Every error has the same shape: { "error": { "code", "message", "docs" } }. Branch on code (it is stable); the message is for humans.
HTTP
code
message
401
missing_key
Send your API key in the header: Authorization: Bearer avs_...
401
invalid_key
API key not found or revoked.
403
not_verified
Confirm the account e-mail before using the API.
403
scope
This API key does not have the scope this endpoint needs.
429
rate_limited
Too many requests. Retry after the seconds in the Retry-After header.
400
invalid_json
The request body is not valid JSON.
413
too_large
The request body is too large.
400
config_required
Send the avatar as `config` (object) or `code` (recipe code).
400
invalid_code
The recipe code could not be decoded.
400
invalid_style
Unknown style. See `styles` in GET /api/v1/catalog.
400
invalid_family
Unknown family. See `families` in GET /api/v1/catalog (chibi, voxel).
400
invalid_count
`count` must be an integer in the allowed range.
400
invalid_seed
`seed` must be an integer from 0 to 4294967295.
400
invalid_size
`size` must be one of the allowed values.
400
format
`format` must be glb, obj, sprites or png.
400
fps
`fps` must be one of 12, 24, 30, 36 or 60.
400
clips
GLB and sprites need at least one valid clip id in `clips`.
400
sprites
`dirs` must be 1, 4 or 8 and `size` 64, 128 or 256.
402
pro_only
This option is available on the Pro plan (sprites over 128 px or 4 directions, character batches).
400
too_big
Too many sprite frames. Use fewer clips, directions, a lower fps or a smaller size.
400
batch
`batch.count` must be 1 to 50 and batches are GLB only.
429
busy
An export is already running for this account. Wait for it to finish.
402
quota
Monthly download quota reached (free plan). The Pro plan has unlimited downloads.
402
random_limit
Daily random limit reached on the free plan.
503
queue_full
The export queue is full. Try again in a minute.
404
not_found
Not found (or it belongs to another account, or it already expired).
403
expired_link
This download link is invalid or expired. Ask GET /api/v1/exports/{id} for a new one.
400
idempotency_key
`Idempotency-Key` must have 1 to 255 visible ASCII characters.
422
idempotency_mismatch
This Idempotency-Key was already used with a different request body.
409
idempotency_in_progress
A request with this Idempotency-Key is still being processed.
402
credits
Not enough AI credits. Buy a credit pack in the studio.
503
ai_off
AI generation is not available right now.
429
ai_busy
An AI generation is already running for this account.
429
ai_daily
Daily AI generation limit reached for this account.
503
ai_paused
AI generation is paused for today. Try again tomorrow.
400
ai_prompt
`prompt` must have 3 to 1000 characters (or send an image).
400
ai_image
`image` must be a data URL of a JPEG, PNG or WebP image.
413
ai_image_size
The image is too large (max ~1.2 MB). Resize it and try again.
200
ai_refused
The AI declined this request. Describe the character differently.
200
ai_incomplete
The AI could not finish this character. Try a simpler description.
200
ai_bad_output
The AI answer was invalid. Your credits were returned; try again.
200
ai_failed
The AI service failed. Your credits were returned; try again.
400
ai_kind
`target` must be avatar, creature, human, toon or critter, and match the recipe or version being adjusted.
400
invalid_kind
Unknown model kind. See `kinds` (creature, critter, human, toon, tree, building, prop, vfx, world).
400
recipe_required
Send the model as `recipe` (object with its fields) or `code` (base64url JSON of the recipe).
400
item
`item` must be a part present in this recipe and the format glb or obj (characters, realistic human and Cartoon only).
400
compress
`compress` must be true or false (GLB only).
500
generic
Something went wrong on our side. Try again.
MCP: connect Claude and other assistants
The MCP server at /mcp lets an AI assistant build characters with you: it reads the catalog, shows an image preview and, once you approve, exports and hands you the link. Same key, quota and license as the API.
Character catalog: part ids by category (with styles and rules), styles, color zones, palettes, style presets, animation clips and export options. With kind (creature, critter, human, toon, tree, building, prop, vfx, world): that model kind's ids and options (species, breeds with traits and colors, traits each species accepts, wardrobe, zones and what they paint, clips, Pro flag). Call this first.
validate_avatar
Normalizes a recipe and explains problems (unknown ids, wrong category, invalid colors), defaults and hidden categories. Free.
random_avatar
1 to 5 random recipes, optionally of one style. A seed makes it reproducible. Counts toward the daily random limit on the free plan.
preview_avatar
Renders a PNG portrait (128 or 256 px) of the recipe so you and the user can see it. Does not use the download quota (hourly limit).
export_avatar
Creates the downloadable file: glb (rigged + animations), obj (zip), sprites (zip of sheets) or png (1024 px portrait); with item, just that one part (glb or obj). Uses 1 download from the monthly quota. Waits up to ~25 s and returns a download link valid for 15 minutes plus the license. Ask the user before calling.
validate_model
Normalizes a model recipe ({kind, recipe} or {kind, code}) with that kind's rules and explains what changed: unknown_field, unknown_option, wrong_species (breed or trait of another species), wrong_gender, adjusted (number clamped), invalid_color, unused_zone (that model does not paint this zone), fixed_zone. Returns the normalized recipe, its code and the animation clips it has. Free.
preview_model
Renders a PNG portrait (128 or 256 px) of a model recipe (animal, Cartoon animal, human, Cartoon, tree...). Does not use the download quota (hourly limit shared with preview_avatar).
export_model
Creates the downloadable file of a model recipe: glb (rigged + animations; a world without clips is a static map), obj (zip), sprites (zip of sheets) or png (1024 px portrait). Uses 1 download from the monthly quota (same quota and license as the studio, on any kind). Waits up to ~25 s and returns a download link valid for 15 minutes plus the license. Ask the user before calling.
ai_generate
SPENDS THE USER'S AI CREDITS: 3 for a new design, 2 to adjust (mode refine), 1 when the same request was made before; charged up front and refunded if it fails. Call it only when the user asks for an AI design and agrees to spend credits (composing from get_catalog yourself is free). The studio AI designs a recipe from the description: target avatar (chibi/voxel character, default), creature (animal: species, breed and traits so the asked characteristics show), human (realistic), toon (Cartoon) or critter (Cartoon plush animal); every target works on any plan and only needs AI credits. Refine: mode refine + version (asset.version of a previous result) or the current recipe/config. Waits up to ~25 s; if still running it returns { status: running, id }: call ai_generation. The result has config (avatar) or recipe ({kind, ...}) ready for preview_* and export_*, plus warnings and the credits spent.
ai_generation
Result of an ai_generate by id (kept 15 minutes); waits up to `wait` seconds (max 25). Does not spend credits.
get_export
Status of an export by id; waits up to `wait` seconds (max 25). When done, returns a fresh 15-minute download link.
account_status
Plan, license kind, downloads used and left this month, random rolls left today and limits.
MCP console (try it here)
Reference
Account, plan and quota
GET/me
Account, plan and quota
Returns the plan, downloads used this month, random rolls left today, limits and the key in use.
200 OK
401 Missing or invalid API key.
403 The key lacks the scope, or the account e-mail is not confirmed.
429 Rate limited (see Retry-After and RateLimit-* headers).
Parts, styles, clips and colors
GET/catalogcatalog:read
Parts, options and clips catalog
Everything a recipe can use: the character's part ids per category, styles, color zones, palettes, clips, presets and export options. With `kind` (creature, critter, human, toon, tree, building, prop, vfx, world), that model kind's catalog: species, breeds with traits and default colors, the traits each species accepts, wardrobe, color zones and what each one paints, control ranges, clips and export options. Metadata only; names in the requested language.
lang
query
pt | en | es
kind
query
avatar | creature | tree | human | building | prop | vfx | world | toon | critter
avatar = chibi/voxel character (the response below); a model kind returns ModelCatalog.
category
query
head | hair | eyes | mouth | beard | helmet | body | legs | boots | gloves | back | handR | handL
Character only: parts of this category.
family
query
chibi | voxel
Character only: parts of this family (chibi or voxel).
kind=prop only: just the types of this group (the full prop catalog is large).
200 OK (Catalog, or ModelCatalog with kind)
400 Unknown kind (invalid_kind).
401 Missing or invalid API key.
403 The key lacks the scope, or the account e-mail is not confirmed.
429 Rate limited (see Retry-After and RateLimit-* headers).
Validate, randomize and preview
POST/avatars/validatecatalog:read
Validate a recipe
Normalizes the recipe (ids and colors checked), returns the short code and explains what was replaced, what was defaulted and what ends up hidden (e.g. a helmet hides hair). Free.
403 The key lacks the scope, or the account e-mail is not confirmed.
429 Rate limited (see Retry-After and RateLimit-* headers).
POST/avatars/randomavatars:write
Random characters
Generates 1 to 10 recipes consistent with a style (or any style). With `seed` the result is reproducible. On the free plan it counts toward the daily random limit.
{
"style": "mago",
"count": 2,
"seed": 42
}
200 OK
400 Invalid style, count or seed.
401 Missing or invalid API key.
402 Daily random limit reached (free plan).
403 The key lacks the scope, or the account e-mail is not confirmed.
429 Rate limited (see Retry-After and RateLimit-* headers).
POST/avatars/previewavatars:write
Image preview
Server-rendered PNG portrait, 128 or 256 px. Does not use a download; limited per hour (free 30, Pro 300, shared with /models/preview).
403 The key lacks the scope, or the account e-mail is not confirmed.
429 Rate limited (see Retry-After and RateLimit-* headers).
503 Render queue full.
Animals, humans and other models
POST/models/validatecatalog:read
Validate a model recipe
Normalizes a model recipe ({kind, recipe} or {kind, code}) with that kind's rules, the same as the studio and the export, and explains what changed: a field the kind does not have (unknown_field), an id outside the list (unknown_option), a breed or trait of another species (wrong_species), a piece of the other gender (wrong_gender), a number clamped to its range (adjusted), an invalid color (invalid_color), a zone the model does not paint (unused_zone) or keeps fixed (fixed_zone), dropped items (dropped). Returns the normalized recipe, its code (base64url JSON) and the clips the model has. Free.
400 No recipe (recipe_required), invalid code (invalid_code) or unknown kind (invalid_kind).
401 Missing or invalid API key.
403 The key lacks the scope, or the account e-mail is not confirmed.
429 Rate limited (see Retry-After and RateLimit-* headers).
POST/models/previewavatars:write
Model image preview
Server-rendered PNG portrait, 128 or 256 px, of a model (animal, Cartoon animal, human, Cartoon, tree...), rendered like the PNG download, without a license. Does not use a download; same hourly limit as the character preview.
403 The key lacks the scope, or the account e-mail is not confirmed.
429 Rate limited (see Retry-After and RateLimit-* headers).
503 Render queue full.
Files (use the download quota)
POST/exportsexports:write
Create a file (GLB, OBJ, sprites, PNG)
Validates, takes 1 download from the quota (batch: N) and queues the file. Answers 202 with the id; follow it with GET /exports/{id}. Character: `config` or `code`. Model: `kind` + `recipe` (or `kind` + `code`), with the model's animations in `clips` (POST /models/validate lists them) and, optionally, animator clips in `myClips`. `compress: true` (GLB only) returns a Draco-compressed GLB, much smaller; the same model compressed or not counts as one download. Send an Idempotency-Key header to retry safely.
Idempotency-Key
header
string
Same key + same body within 24 h returns the same export without using quota again.
402 Free monthly quota reached (quota) or a Pro-only option: sprites over 128 px / 4 directions, batch (pro_only).
403 The key lacks the scope, or the account e-mail is not confirmed.
409 Idempotency-Key still in progress.
422 Idempotency-Key reused with another body.
429 Rate limited (see Retry-After and RateLimit-* headers).
503 Export queue full (quota returned).
GET/exports/{id}exports:write
Export status
Status, progress, license and, when ready, a signed download link (15 min). With `wait` (up to 25 s) the response waits for completion.
id *
path
string
wait
query
integer
200 OK
401 Missing or invalid API key.
403 The key lacks the scope, or the account e-mail is not confirmed.
404 Unknown, expired or not yours.
429 Rate limited (see Retry-After and RateLimit-* headers).
GET/exports/{id}/fileexports:write
Download the file
The finished file (kept for 15 min). With the key in the header, or without a key using the signed link `token`.
id *
path
string
token
query
string
From `download.url` (no API key needed).
200 File (model/gltf-binary, application/zip or image/png)
403 Invalid or expired signed link.
404 Unknown, expired or not yours.
GET/downloadsexports:write
Download history
The account's downloads (studio, API and MCP) with license number and kind, newest first. Paginate with `before`.
limit
query
integer
before
query
integer
Return downloads with id lower than this (use `next`).
200 OK
401 Missing or invalid API key.
403 The key lacks the scope, or the account e-mail is not confirmed.
429 Rate limited (see Retry-After and RateLimit-* headers).
AI character design (uses AI credits)
GET/creditsavatars:write
AI credit balance
Balance (purchased + this month's Pro credits), cost of each generation kind and whether AI is available.
200 OK
401 Missing or invalid API key.
403 The key lacks the scope, or the account e-mail is not confirmed.
429 Rate limited (see Retry-After and RateLimit-* headers).
POST/ai/generateavatars:write
Design a character with AI
The AI (Claude) picks catalog parts and colors from a description, a reference photo (data URL JPEG/PNG/WebP, up to ~1.2 MB) or adjusts a recipe (mode: refine, with `version` or the current recipe). `target` (or `kind`) picks what to make: avatar (chibi/voxel, default; catalog parts plus custom pieces), creature (Soft/Low poly/Voxel animals; for a dog or a cat the AI picks breed and traits so the asked characteristics show, like "doberman with pointy ears"), human (realistic human), toon (Cartoon) or critter (Cartoon plush Animals: species, breed and traits for dogs and cats, size and the colors of that species' zones); for the last four the AI uses only that kind's catalog and the result comes in `recipe` ({kind, ...}, the same recipe POST /exports and /models/preview take), with warnings about what was replaced (closest_species when the animal is not in the list and became the closest one, unused_zone, wrong_species, unknown_option). Costs 3 credits for text, 4 with a photo, 2 to adjust and 1 when the same request was already made; charged up front and refunded on failure. Works on any plan: it only needs credits. Waits up to 20 s; if not done, answers 202 with the id for GET /ai/generations/{id}. Real people and brands become generic traits.
Character (avatar)
{
"prompt": "a tall rapper with braids, dark sunglasses and a blue jacket",
"lang": "en"
}
Cartoon doberman (critter)
{
"target": "critter",
"prompt": "a doberman with pointy ears",
"lang": "en"
}
Low poly dalmatian (creature)
{
"target": "creature",
"prompt": "a low poly dalmatian puppy with spots and a red collar",
"lang": "en"
}