POST /api/v1/assets to create an asset. input describes the asset; optional config controls the generation.
Write an effective prompt
The prompt is the specification for the asset. Name the exact object, then state what the generation has to get right: real-world dimensions, which parts stay separate, how the asset will be used, and what may be simplified. Anything you leave out is decided for you. Pair the prompt with reference images. Clear multi-view images of the same object or objects in the same state pin down geometry that prose cannot, while supplemental images capture any nontrivial articulation states.Recommended prompt template
Choose generation effort
config.effort balances response time, generation quality, and credits. It defaults to high, so omit it for the balanced choice.
Higher effort generally takes longer and can use more credits. For exact current prices, see the pricing matrix.
Choose a model version
config.model_version selects the generation backend. It defaults to standard.
A
lite generation is billed a flat rate rather than the pricing matrix below, and config.effort still applies within it.
Current pricing matrix
Each asset generation has one credit amount. It is determined by the selected effort and the complexity of the request.curl
config.effort on the generation.
Quote credits before creating an asset
POST /api/v1/assets quotes by default: without "mode": "generate" it returns 200 with the price and creates nothing. POST /api/v1/assets/quote takes the same body and returns the same quote. Neither charges credits. The quote classifies the request as simple, moderate, or complex and returns its price in credits.
curl
POST /api/v1/assets with "mode": "generate" (multipart callers: a mode=generate form field). That returns 201 with the generation in pending status. An unrecognized mode is rejected with 422, and /assets/quote rejects mode: generate since it only ever quotes.
credits_charged on the 201 records the credits the generation was billed. Quoting is limited to 20 requests per minute per account across both routes.
Quote before you submit if the price matters: once a generation is running, the only outcome that refunds it is a failed one. A generation you cancel yourself stays charged — see Concurrency and credits.
Supported input types
A generation takes a prompt plus 1–24 reference images — no video, and no 3D formats such as meshes or point clouds as references.Starting from a video? Extract a handful of frames that cover the angles and articulation states you need — a coding agent can do this — and submit those frames as image references.
Provide reference images
Every image must depict the same asset; use multiple views of that asset rather than images of different assets. Use PNG, JPG, or WebP for best results. GIF, BMP, TIFF, and AVIF are also accepted. Choose the source that fits where your image currently lives:
The service fetches URL references when the generation runs. A URL must be publicly reachable and resolve to an image; a bad URL is accepted at submission but the generation later fails with a
REFERENCE_FETCH_FAILED or IMAGE_UNSUPPORTED_TYPE status reason.
Attach a local image
Forattached, send multipart/form-data: place the JSON input in the input form field and attach the bytes in a field with the name from the reference. The original filename is stored with the generation, so prompts may refer to it. Filenames must be unique within the generation, cannot contain path separators, and cannot be instructions.md.
Retry a create request safely
Send anIdempotency-Key header when a network failure might make you retry a create request. Reusing the same key with the same body returns the original generation instead of creating another one.
curl
Resume a failed generation
If a generation fails, you can choose to resume it and pick up from where it stopped. Resuming creates a new generation and leaves the failed generation unchanged.curl
409 if the generation cannot be resumed or already has an active resume.