Authorization: Bearer <API_KEY>. Use the API base URL for your Moonlake account.
Each reconstruction creates a scene project. Its project_id identifies the polling, catalog, lift, version, and cancellation endpoints. Do not supply a project ID when creating a reconstruction. See Reconstruct a scene for scope, budget recommendations, and examples.
Endpoints
Paths below are relative to/api/v1.
Reconstruction request
POST /scenes accepts JSON or multipart form data. Both require input and config. Multipart requests encode these two fields as JSON strings and attach files under the names referenced by input.references. Unknown fields are rejected.
The reconstruction budget covers scene appearance and geometry. Physics, articulation, and optional item lifts are separate purchases. A credit budget does not guarantee a completion time.
Media inputs
Accepted image formats are PNG, JPEG, WEBP, GIF, BMP, TIFF, and AVIF. Each image is limited to 50 MiB. The total HTTP request is limited to 256 MiB, including JSON or multipart overhead. Submit files that can be opened and decoded, with the intended image orientation.
References
Imagereferences support these forms:
Attachment names must be unique and cannot be
input or config. Unreferenced file fields are rejected. Video references support one attached file only. Hosted video uses input.inputs instead.
Hosted files with hashes
Eachinput.inputs entry contains:
The media count must match
input_type. Keep URLs accessible until the request finishes. A hash mismatch prevents processing the supplied file.
Idempotency and billing
Idempotency-Key is required for reconstruction and lift generation. It accepts 1–128 characters. Repeating the same request with the same account-scoped key returns the existing operation without a second reservation. Reusing the key with different content returns 409.
Scene creation reserves budget_credits on acceptance. Lift generation reserves its itemized accepted price separately. Failed work is refunded once the failure is confirmed; cancellation does not refund credits. Pending work retains its credit reservation until its outcome is resolved.
Project resource
The create, status, generate-lift, and cancel endpoints return the same project resource.Status interpretation
Successful scene publication currently uses
partially_completed, including after a lift batch. It does not mean that a mandatory physics stage is running. Per-item statuses are pending, processing, completed, failed, or cancelled.
Cancellation is asynchronous. After requesting cancellation, poll the project until its status is terminal. Wait until an item no longer appears in active_items before requesting another lift for it.
Item catalog and completion tiers
GET /scenes/{project_id}/items returns an array of items eligible for independent lifting. It is available after the scene is ready for lifts.
Use completion tiers to identify items that need further review:
Tiers describe reconstruction completeness, not physics readiness or independent certification. Review items against your requirements before use. A false
task_important value does not exclude the item from the scene.
Lift request and quote
POST /scenes/{project_id}/lift accepts JSON with:
Item IDs use lowercase path segments with letters, digits, underscores, and hyphens; each segment starts with a letter. Display names are not item IDs. Lift requests do not accept a quality selector.
Quote mode returns
project_id, source_version_id, model_version: "standard", items, total_credits, and message. Each quoted item contains item_id, complexity (simple, moderate, or complex), and credits. Quoting does not start generation or reserve credits.
Generate mode evaluates the price again and returns the project resource after acceptance. It requires Idempotency-Key. Quotes do not reserve a price or an item. You can request different items concurrently. Requesting an active item returns 409 with the conflicting item_ids.
Selections may appear in different scene versions. Poll each item’s status and retrieve the version containing its completed lift. Earlier published versions remain unchanged.
Versions and downloads
GET /scenes/{project_id}/versions accepts limit from 1 to 100, default 20, and optional before with a version ID. The response contains versions and a nullable next_cursor.
Each version has version_id, kind (initial or lift), current, completed_at, and item_ids. A version-detail response and the project’s result both contain artifacts. Each artifact has format, name, and download_url.
The scene ZIP includes the scene and item exports. Lift bundles can duplicate item files already present elsewhere in the ZIP. Downloads contain scenes and items only. Download URLs expire; retrieving the project or version again obtains fresh links.
Error responses
Errors use an HTTP status and adetail value. Depending on the error, detail is a string, structured object, or validation list. Failures after acceptance are reported through project status.
If an error response includes
detail.project_id, poll that project before retrying. A new idempotency key could create duplicate work. A failed later lift does not erase previously published scene versions.