Characters, through code.

Generate with bake3d-1.3-enhanced, poll a durable job, then take the rig and its motion into your own application. For AI assistants, use the MCP server.

Authentication

Create a key in Account → API keys on a Pro or Studio account. Send it in the Authorization header. Keys use the owning account’s credits and permissions; keep them on your server or in your editor’s local environment.

sh
Authorization: Bearer bk_live_YOUR_KEY

Reads and exports are free. Generation costs 25 credits, plus 10 for rigging. New described motion costs 5. Failed jobs refund their charge. Rate limits apply to all public API and MCP calls; the default is 60 requests per minute per key.

Generate

POST /api/v1/generate

Provide exactly one of prompt, imageUrl, imageUrls, an owned imageAssetId, or imageAssetIds. Prompts are 3–1,024 characters. Image URLs must serve PNG, JPEG or WebP images no larger than 12 MiB. A URL must be reachable by the service; a local filesystem path is not a URL.

sh
curl https://bake3d.ai/api/v1/generate \
  -H "Authorization: Bearer $BAKE3D_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"prompt":"A ceramic fox standing on four legs","options":{"rig":true,"quality":"standard"}}'

Multiple views. imageUrls and imageAssetIds take one to four images of the same subject, together no larger than 32 MiB; entries must be distinct. The first image is the primary reference: it drives the source review, the character analysis and the thumbnail. The remaining angles (back, side, top) are passed to the geometry engine when it reads several views. The primary engine does; the fallback engine used when it is unavailable reads one image and silently keeps only the primary view. The finished job reports which happened in output.views as { provided, used, provider }, where provider is primary or fallback, and adds a warning to output.warnings when used is smaller than provided. Keep the same subject, pose and scale in every view; a different pose in a second image confuses the reconstruction rather than helping it.

Multi-view request
curl https://bake3d.ai/api/v1/generate \
  -H "Authorization: Bearer $BAKE3D_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"imageUrls":["https://example.com/rover-front.png","https://example.com/rover-side.png","https://example.com/rover-back.png"],"options":{"rig":true}}'
# Finished job → "output": { "views": { "provided": 3, "used": 3, "provider": "primary" }, … }

Options: quality is draft, standard or high; rig enables the skeleton and skinning; analyze enables character analysis. Successful rigging also attempts a four-second introductory animation from the actual rig, without another credit charge. Set initialAnimation: false to skip it. Mesh-only jobs do not create motion.

Returns 202 with { project, job }. Save project.id and job.id. This abbreviated example shows the shape; timestamps are Unix milliseconds and progress is 0–100.

Abbreviated response
{
  "project": {
    "id": "project-id",
    "title": "A ceramic fox standing on four legs",
    "status": "generating",
    "model": "bake3d-1.3-enhanced",
    "hasRig": false,
    "assets": [],
    "animations": []
  },
  "job": {
    "id": "job-id",
    "projectId": "project-id",
    "type": "pipeline",
    "status": "queued",
    "progress": 0,
    "stage": null,
    "creditsCharged": 35,
    "error": null,
    "output": null,
    "createdAt": 1788800000000,
    "finishedAt": null
  }
}

Job status

GET /api/v1/jobs/:id

Poll every 3–5 seconds. Status is queued, running, succeeded, failed or canceled. Stop on a terminal status. Retry transient network errors with backoff; do not submit another generation just because a poll failed.

sh
curl https://bake3d.ai/api/v1/jobs/JOB_ID \
  -H "Authorization: Bearer $BAKE3D_API_KEY"

The response is the job object directly, with progress, stage, error, creditsCharged and output. A successful job’s projectId identifies the character to retrieve.

Find projects

GET /api/v1/projects

Search your full library with q (title or category, up to 120 characters). Set filter to all, active, ready or needs-work, and sort to updated, created or name. Searches treat punctuation literally; ASCII letters are case-insensitive.

Returns projects, matched, account-wide counts, and nextCursor. The default page size is 24; limit accepts 1–100. Pass nextCursor as cursor with the same query, filter and sort for the next page. A null cursor means the last page. Updated projects may move between pages; start again without a cursor for a fresh view.

sh
curl "https://bake3d.ai/api/v1/projects?q=vehicle&filter=ready&sort=name&limit=24" -H "Authorization: Bearer $BAKE3D_API_KEY"

Project

GET /api/v1/projects/:id

Returns the project directly. assets is an array of asset records. downloads maps asset IDs to signed URLs valid for two hours. Use riggedAssetId to choose the rig, or meshAssetId for geometry. Retrieve the project again to refresh expired links.

labels describes joint roles and chains. animations contains saved motion programs. initialAnimationId identifies the included motion for the current rig, or is null when none is available. Re-rigging does not make a previous rig’s initial motion the new default.

Included animation

POST /api/v1/projects/:id/initial-animation

Create or recover the current rig’s introductory motion without an additional credit charge. Send an empty JSON object. Returns 202 with a job to poll, or an existing animationId with job: null. Repeated requests reuse active work or the saved result.

Recovery permits three jobs per rig per UTC day and six starts per account in a rolling 24-hour period. Each job makes at most two authoring attempts. A rig, usable labels and available AI animation are required. If initial motion cannot finish, the rig remains saved and the generation output includes a warning. Review it before retrying.

Animate

POST /api/v1/projects/:id/animate

json
{
  "prompt": "Look around curiously, then settle",
  "durationSeconds": 3,
  "loop": true
}

Requires a rigged, labelled project. prompt is 1–500 characters and durationSeconds is 0.5–20. Returns 201 with animation and diagnostics; save animation.id. This request waits for motion authoring and does not run a visual critique. Inspect any unresolved roles before exporting.

Export

POST /api/v1/projects/:id/export

sh
curl https://bake3d.ai/api/v1/projects/PROJECT_ID/export \
  -H "Authorization: Bearer $BAKE3D_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"animationId":"ANIMATION_ID","fps":30,"rootMotion":false,"format":"glb"}'

Choose animationId for a saved motion or presetId for a built-in preset. With neither field, the included initial animation is exported when available; otherwise the original rig is returned (as a rest-pose FBX when format is "fbx"). Set restPose: true for a copy without animation clips. Do not combine that flag with an animation or preset ID. Requested motion is placed first in the GLB while older clips remain available.

presetId: "adaptive-walk" fits a walking cycle to the actual leg chains. It requires a standing rest pose and at least two valid, separate leg chains with usable segments. The preset measures stride and footfall phases from the rig; it does not add missing joints. Unsupported structures return HTTP 422 with a repair reason. Every preset is exported at the amplitude the rig’s deformation fit chose for it (the studio shows the same factor); a preset that damages the rig’s skin even at 30% amplitude is refused with the reason. See how to review the resulting motion.

fps supports 24, 30 or 60. Set rootMotion: false to bake in place. format is "glb" (default) or "fbx". The result includes asset, downloadUrl, expiresIn: 7200, format and creditsCharged: 0. Repeated identical exports reuse the stored file.

FBX exports are binary FBX 7.4 written by Bake3D’s own exporter: Y up, centimetres (glTF metres × 100), the skeleton as limb nodes, skin weights limited to the four strongest influences per vertex, one Phong material per glTF material carrying the base-colour factor with the base-colour texture embedded, and one baked clip per file as linear keys at the export frame rate. Morph targets, normal/metallic/roughness maps and multiple clips per file are not written. Verified by importing into Blender 4.4 and comparing posed vertices against the GLB export; Unity and Unreal import FBX natively but Bake3D has not run those imports. Details in docs/FBX-EXPORT-VALIDATION.md.

Server animation export supports self-contained GLBs up to 24 MiB, one shared skeleton of up to 256 joints, and clips up to 30 seconds; FBX additionally needs the skinned surface to fit a 32 MiB array budget (about 200k vertices) and textures up to 16 MiB. Use the studio exporter for larger GLB files. GLB preserves the skeleton, skin weights, textures and baked keyframes. Editor-specific import setup is described in the integration guide.

Errors

REST errors use { "error": "message" }, sometimes with validation details.

StatusNext step
400Check request fields and JSON.
401Provide a valid API key.
402Add credits before starting a new job.
403Check account access or request origin.
404Use an ID owned by this account.
409Wait for the active job or rig the character first.
413Reduce the file size or use the studio exporter.
422Choose motion that fits the rig or correct its skeleton.
429Back off and reduce polling frequency.
503The requested feature is temporarily unavailable.