00Hrs
:
00Min
:
00Sec
Claim 20% OFF, Use:Apply now

API Documentation

MeltFlex REST API for AI interior design

Upload a room photo, describe the desired style or provide furniture references, and receive a photorealistic result. Each generate call costs 10 credits (auto-refunded on failure).

Furniture placement is the flagship. Send reference product photos and the API stages them into the room with correct scale, perspective and shadows. The same /v1/generate endpoint also powers a full suite of design tools (interior restyling, exteriors and gardens, surface and fixture swaps, photo-to-render), and dedicated endpoints add video walkthroughs, floorplan-to-3D, furniture-to-3D models and walkable 3D worlds. See AI Tools for a recipe per tool.

API access requires an active subscription (any paid plan). After you subscribe, you can generate your API key in account settings.

Input room
Empty room
Reference furniture
Sofa
Modular Sofa
Bed
Upholstered Bed
Table
Dining Table
Chair
Oak Chair
API result
Furnished room result

Take the result and restyle it with a single prompt:

"Design this room as Italian contemporary"
Italian contemporary restyle
"Design this room as Japanese"
Japanese restyle

Tutorial

Before you start

You need an active subscription (any paid plan) to use the API. Once subscribed, go to your account settings and click API Key under Profile:

Settings - click API Key

Then click Generate API Key. The key is shown only once, copy it immediately.

Generate API Key
  • Auth: Send Authorization: Bearer mf_sk_... in every request header.
  • Content-Type: application/json
  • Credits: Each generation costs 10 credits, deducted before processing. Failed generations are refunded automatically.
  • Timeout: Requests have a 2-minute timeout. Large images may take 30–90 seconds to process.

Basic usage: Restyle a room

The simplest call takes a room image and a text prompt. The API returns a base64-encoded PNG of the transformed room.

export MELTFLEX_API_KEY="mf_sk_..."

curl -X POST "https://www.meltflexai.com/api/v1/generate" \
  -H "Authorization: Bearer $MELTFLEX_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "imageUrl": "https://your-cdn.com/empty-room.jpg",
    "prompt": "Transform this empty room during sunset with warm golden light"
  }'

The response contains a data:image/png;base64,... string. Decode it and save to a file, display in your UI, or upload to your CDN.

Furniture placement

To place specific furniture in a room, send reference images alongside the main room photo. The AI will match each item's appearance (colors, materials, textures) and position them naturally.

  • referenceImageUrls array of public URLs pointing to furniture/decor photos (up to 10)
  • referenceProducts optional metadata for each image: name for accurate placement
import requests

API_KEY = "mf_sk_..."
URL = "https://www.meltflexai.com/api/v1/generate"

response = requests.post(URL, json={
    "imageUrl": "https://your-cdn.com/empty-room.jpg",
    "prompt": "Place these furniture items naturally in this room during sunset",
    "referenceImageUrls": [
        "https://your-cdn.com/modular-sofa.jpg",
        "https://your-cdn.com/upholstered-bed.jpg",
        "https://your-cdn.com/dining-table.jpg",
        "https://your-cdn.com/oak-chair.jpg"
    ]
}, headers={
    "Authorization": f"Bearer {API_KEY}",
    "Content-Type": "application/json"
})

data = response.json()
if data.get("success"):
    print(f"Room furnished with 4 items during sunset")

For best results, use clean product photos on white/neutral backgrounds.

Production tips

  • Use image URLs over base64 when possible. It avoids hitting the 15 MB body limit and is faster.
  • Retry on 429: Implement exponential backoff (e.g. 1s, 2s, 4s, up to 30s).
  • Timeouts: Set a client-side timeout of ~2 minutes. If the request times out, credits are refunded server-side.
  • Image quality: Input images of at least 1024px on the longest side produce the best results.
  • Prompt specificity: Be specific. "Scandinavian style with warm oak flooring and linen curtains" works better than "make it nice".
  • Security: Never expose your API key in client-side code. Make API calls from your backend.

AI Tools

Overview

MeltFlex exposes a small number of endpoints that cover a large number of jobs. Most of the tools below are the same POST /v1/generate call, where you change the prompt and optionally attach reference images. Four jobs have dedicated endpoints: POST /v1/video, POST /v1/floorplan-to-3d, POST /v1/furniture-3d and POST /v1/world.

The one rule that makes these prompts work: by default the model preserves the room's structure (walls, windows, flooring and fixtures). So for surface and fixture swaps (floors, walls, doors, windows, stairs) you must say explicitly what to change and what to keep. Every recipe below already does this.

ToolEndpointReference imagesCredits
AI Interior Design/v1/generateOptional10
AI Layout Boost/v1/generateOptional10
AI Exterior Design/v1/generateOptional10
AI Garden Design/v1/generateOptional10
AI Walls Texture/v1/generateOptional10
AI Floor Restyle/v1/generateOptional10
AI Stairs Design/v1/generateOptional10
AI Doors Design/v1/generateOptional10
AI Windows Design/v1/generateOptional10
AI Kitchen Design/v1/generateOptional10
AI Bathroom Design/v1/generateOptional10
AI Photo to Render/v1/generateNo10
AI Video Walkthrough/v1/videoN/A100 to 150
AI Floorplan to 3D/v1/floorplan-to-3dN/A10 (render) / 100 (3D model)
AI 3D Furniture Generator/v1/furniture-3dN/A75
AI 3D Interior Design (3D world)/v1/worldN/A30 (draft) / 200 (hd)

Interior & layout

Restyle a whole room, or re-plan the furniture that is already in it. Attach reference product photos to stage specific pieces. This is the same furniture-placement flow from the tutorial.

AI Interior Design demonstration
AI Interior Design

Restyle any room into a new interior style, fully furnished and photorealistic.

PromptRedesign this room in Scandinavian style with warm oak floors, linen textiles and soft natural light. Keep the room's architecture (walls, windows and layout) unchanged.
Reference images: Optional. Attach product photos to stage specific furniture.
AI Layout Boost demonstration
AI Layout Boost

Rearrange the furniture already in a room into a better, more functional layout.

PromptRearrange the existing furniture in this room into a more open, functional layout with clear walking paths and better flow. Keep the same furniture pieces, walls, windows and flooring.
Reference images: Optional. Attach items to swap pieces in while re-planning.

Exterior & garden

The endpoint works on any photo, not just interiors. Feed a facade or an outdoor plot and describe the transformation.

AI Exterior Design demonstration
AI Exterior Design

Reimagine a facade (cladding, front door, entry) while keeping the building intact.

PromptRedesign the exterior of this house in modern farmhouse style: update the facade cladding, front door and entry lighting. Keep the building's structure, roofline and proportions unchanged.
Reference images: Optional. Attach a material or cladding reference.
AI Garden Design demonstration
AI Garden Design

Landscape an outdoor space with planting, paths and seating.

PromptDesign this outdoor space as a low-maintenance Mediterranean garden with gravel paths, olive trees, drought-tolerant planting and a seating area. Keep the plot boundaries and the house unchanged.
Reference images: Optional. Attach reference plants or hardscape materials.

Surfaces & fixtures

Change one element at a time (flooring, walls, stairs, doors or windows) while everything else stays put. Ideal for “see it before you buy” previews. Each recipe names exactly what to change and what to keep.

AI Walls Texture demonstration
AI Walls Texture

Swap the wall finish only: paint, plaster, micro-cement, panelling or wallpaper.

PromptChange the wall finish to warm greige micro-cement. Only change the walls and keep the flooring, ceiling, furniture and fixtures exactly as they are.
Reference images: Optional. Attach a material swatch to match exactly.
AI Floor Restyle demonstration
AI Floor Restyle

Replace the flooring to preview a material before you buy it.

PromptReplace the flooring with wide-plank European oak in a natural matte finish. Only change the floor and keep the walls, furniture and lighting unchanged.
Reference images: Optional. Attach a flooring sample photo.
AI Stairs Design demonstration
AI Stairs Design

Restyle a staircase, treads, risers and railing, in place.

PromptRedesign this staircase with open oak treads and a slim black steel railing. Only change the staircase and keep the surrounding walls, floor and its position unchanged.
Reference images: Optional. Attach a railing or tread reference.
AI Doors Design demonstration
AI Doors Design

Preview new interior doors without touching the rest of the room.

PromptReplace the interior doors with black-framed steel-and-glass doors. Only change the doors and keep the walls, flooring and everything else unchanged.
Reference images: Optional. Attach a door style reference.
AI Windows Design demonstration
AI Windows Design

Change window frames and glazing while keeping the wall openings.

PromptChange the windows to slim black aluminium frames with clear glazing. Only change the windows and keep the wall openings, layout and interior unchanged.
Reference images: Optional. Attach a frame or glazing reference.

Kitchen & bathroom

Whole-room redesigns that respect the existing footprint and plumbing, so the result stays buildable, not just pretty.

AI Kitchen Design demonstration
AI Kitchen Design

Redesign a whole kitchen: cabinetry, island, worktops and finishes.

PromptRedesign this kitchen in handleless matte-white Scandinavian style with oak open shelving and a quartz island. Keep the room's footprint, windows and plumbing positions unchanged.
Reference images: Optional. Attach appliance or cabinet references.
AI Bathroom Design demonstration
AI Bathroom Design

Reimagine a bathroom: tiling, vanity, shower and fixtures.

PromptRedesign this bathroom in warm spa-minimalism with micro-cement walls, a walk-in rain shower and an oak vanity. Keep the room's layout and plumbing positions unchanged.
Reference images: Optional. Attach fixture or tile references.

Photo to render

Turn a grey 3D draft, a SketchUp screenshot or a rough photo into a photorealistic render, with no V-Ray and no hours of setup. Keep the geometry and camera, then add real light and materials.

AI Photo to Render demonstration
AI Photo to Render

Draft or screenshot in, photorealistic photograph out, at the same geometry and camera angle.

PromptTurn this 3D draft / SketchUp screenshot into a photorealistic interior photograph. Keep the exact geometry, layout, materials and camera angle. Add realistic lighting, accurate shadows and true-to-life material detail.
Reference images: No. The source image already defines the scene.

Video walkthrough

Animate a still into a short cinematic walkthrough with Veo 3.1. Feed a MeltFlex render (or any interior photo) and get back an MP4 URL. Costs 100 credits for a 4-second clip, 150 for 8 seconds. Full parameters are in the API Reference.

import requests

API_KEY = "mf_sk_..."
URL = "https://www.meltflexai.com/api/v1/video"

# Feed in a MeltFlex render (or any interior still) → cinematic walkthrough.
response = requests.post(URL, json={
    "imageUrl": "https://your-cdn.com/living-room-render.jpg",
    "durationSeconds": 4,          # 4 (100 credits) or 8 (150 credits)
    "aspectRatio": "16:9",         # "16:9" or "9:16"
    # "prompt": "Slow dolly forward, then pan left to the window"  # optional
}, headers={
    "Authorization": f"Bearer {API_KEY}",
    "Content-Type": "application/json",
}, timeout=300)

data = response.json()
if data.get("success"):
    print(f"Video ready: {data['videoUrl']} ({data['processingTime']}s)")
else:
    print(f"Error: {data.get('error')}")

Video generation is asynchronous on Google's side and typically takes 30 to 120 seconds. Keep a client-side timeout of about 5 minutes; if it fails, credits are refunded automatically.

Floorplan to 3D

One endpoint, two outputs. output: "render" turns a flat 2D floorplan into a rendered 3D picture in any of the six styles the Floorplan to 3D tool offers (photorealistic, 3D model, architectural drawing, hand-drawn sketch, wireframe, clay), with the same view, furniture, interior-style and labels options. Costs 10 credits.

A 2D floorplan on the left and the photorealistic 3D render the API returned for it on the right

output: "model" (the default) returns a downloadable GLB 3D mesh instead. The plan is first rendered as a 3D cutaway view (walls, doors and windows detected), then reconstructed into geometry, textured or bare. Costs 100 credits.

A 2D floorplan on the left and the GLB 3D model the API returned for it on the right
import requests

API_KEY = "mf_sk_..."
URL = "https://www.meltflexai.com/api/v1/floorplan-to-3d"

headers = {"Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json"}

# 1) A rendered 3D picture of the plan (10 credits, ~20 s)
render = requests.post(URL, json={
    "output": "render",
    "imageUrl": "https://your-cdn.com/2d-floorplan.png",
    "style": "photorealistic",   # 3d-model | drawing | sketch | wireframe | clay
    "view": "isometric",         # topdown
    "furniture": "furnished",    # empty | styled
    "interiorStyle": "scandinavian",
    "labels": "names",           # full | none
}, headers=headers, timeout=120).json()
print("Render:", render.get("imageUrl"))

# 2) A downloadable GLB 3D model of the plan (100 credits, ~3 min)
model = requests.post(URL, json={
    "output": "model",
    "imageUrl": "https://your-cdn.com/2d-floorplan.png",
    "textured": True,  # False → bare geometry, no texture pass
}, headers=headers, timeout=300).json()
if model.get("success"):
    print("3D model (GLB):", model["modelUrl"])
else:
    print("Error:", model.get("error"))

Both images are real responses: the same plan went in, the render and the model came back. A render takes about 20 seconds; a GLB conversion takes about 3 minutes and the request stays open until the model is ready, so set your HTTP timeout to at least 300 seconds. For best results use a clean, high-contrast floorplan with clear walls. The GLB can be dropped straight into three.js, Blender, Unity or any glTF viewer.

Furniture to 3D model

One photo of a furniture piece in, a textured, downloadable GLB 3D model out. This is the AI 3D Furniture Generator as an endpoint: the same photo-to-mesh engine and the same 75 credits. Build a 3D catalogue from product photography, drop pieces into a game engine or an AR scene, or hand a client a model they can spin. Full parameters are in the API Reference.

Input photo
Blue armchair: the photo sent to the API
API result: the GLB, live (drag to orbit)
Real responses. Each photo went through POST /v1/furniture-3d and the model on the right is the GLB that came back, untouched.
import time, requests

API_KEY = "mf_sk_..."
URL = "https://www.meltflexai.com/api/v1/furniture-3d"
headers = {"Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json"}

# One furniture photo in → a textured GLB 3D model out (75 credits, ~2–3 min)
r = requests.post(URL, json={
    "imageUrl": "https://your-cdn.com/armchair-photo.jpg",
    "textured": True,   # False → bare geometry, no texture pass
}, headers=headers, timeout=300)
data = r.json()

# Still building when the server's wait ran out (HTTP 202)? Poll the taskId.
while data.get("status") in ("PENDING", "IN_PROGRESS"):
    time.sleep(8)
    data = requests.get(URL, params={"taskId": data["taskId"]}, headers=headers, timeout=60).json()

if data.get("success"):
    print("3D model (GLB):", data["modelUrl"])
    print("Thumbnail:", data.get("thumbnailUrl"))
    print("USDZ (signed, ~72 h):", data["formats"].get("usdz"))
else:
    print("Error:", data.get("error"))

Best input: one piece, seen from a front three-quarter angle, on a plain or white background, nothing cropped off. A mesh takes about 2 to 3 minutes. The request stays open until the model is ready; if the build outlives the wait you get HTTP 202 with a taskId to poll. Failed builds are refunded automatically. Set textured: false when you only need the geometry.

Photo to 3D world

A single interior photo or render in, an explorable 3D world out: a Gaussian-splat scene you can look around and walk through from the camera's own viewpoint. This is the AI 3D Interior Design tool as an endpoint. Two tiers: draft (30 credits, about a minute) and hd (200 credits, about five minutes, sharper up close). Chain it after /v1/generate: redesign the room first, then let the client step into the result.

Scandinavian Balcony Living Room: the render sent to the API
A real response. This render went through POST /v1/world; the world streams in over the picture and you are standing where the camera stood. Drag to look around.
import time, requests

API_KEY = "mf_sk_..."
URL = "https://www.meltflexai.com/api/v1/world"
headers = {"Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json"}

# A room photo or render in → an explorable 3D world out.
# "draft" = 30 credits, ~1 min. "hd" = Marble's full model, 200 credits, ~5 min.
data = requests.post(URL, json={
    "imageUrl": "https://your-cdn.com/living-room-render.jpg",
    "model": "draft",
    "name": "Client living room, option B",   # optional label
}, headers=headers, timeout=300).json()

# HTTP 202 means the build outlived the wait: poll the operationId until done.
while data.get("done") is False:
    time.sleep(8)
    data = requests.get(URL, params={"operationId": data["operationId"]}, headers=headers, timeout=60).json()

if data.get("success"):
    print("World id:", data["worldId"])              # store this; the links below expire
    print("Splat (.spz):", data["spzUrl"])           # load in three.js + Spark
    print("Hosted viewer:", data.get("viewerUrl"))
else:
    print("Error:", data.get("error"))

# Later: fresh signed links for a stored world
fresh = requests.get(URL, params={"worldId": data["worldId"]}, headers=headers, timeout=60).json()

The response carries the splat file (spzUrl, plus lighter densities in spzUrls) that three.js and Spark load straight from the browser, and a hosted viewerUrl. The splat links are signed and expire after a few days, so store the worldId and call GET /v1/world?worldId= for fresh links whenever you show the world. A build that outlives the wait returns HTTP 202 with an operationId to poll; failures are refunded automatically.

API Reference

Generate Image

Transform a room photo into a photorealistic interior design image. Optionally attach reference images of furniture to place in the room.

POSThttps://www.meltflexai.com/api/v1/generate

Request Headers

FieldValueDescription
AuthorizationBearer mf_sk_...Your API key from account settings.
Content-Typeapplication/jsonRequest body format.

Request Body

FieldTypeRequiredDescription
promptstringYesDescribes the desired transformation. E.g. "Transform into scandinavian style", "Make it minimalist with warm lighting", "Place the furniture naturally".
imagestringConditional*Base64 data URL of the room image. Format: data:image/jpeg;base64,...
imageUrlstringConditional*Publicly accessible URL of the room image. The server fetches it directly. Preferred over base64.
referenceImagesstring[]NoArray of base64 data URLs for reference images (furniture, decor). Up to 10.
referenceImageUrlsstring[]NoArray of public URLs for reference images. Up to 10. Preferred over base64 for better performance.
referenceProductsobject[]NoMetadata for each reference image. Each object: {"name": "Sofa"}. Helps the AI identify and place items correctly.
resolutionstringNoOutput quality: "512", "1K", or "2K" (sharpest). Defaults to model auto.
designLevelstringNo"lite" (faster & cheaper, −2 credits), "quick" (default), or "pro" (most detailed, HIGH thinking, +5 credits).
maskbooleanNoRegion edit. When true, the input image must have the area to change painted solid red; the prompt is applied only to those red-marked regions and the rest is preserved.
variationsnumberNoBatch of 13 images in one call (default 1). Credits are charged per image; failed variations are refunded.

* Either image or imageUrl must be provided. If both are sent, imageUrl takes priority.

Response Body

A successful request returns HTTP 200 with a JSON body:

{
  "success": true,
  "image": "data:image/png;base64,iVBORw0KGgo...",
  "images": ["data:image/png;base64,iVBORw0KGgo..."],
  "count": 1,
  "creditsUsed": 10
}
FieldTypeDescription
successbooleantrue if the image was generated successfully.
imagestringBase64-encoded PNG data URL of the first generated image (backward compatible).
imagesstring[]All generated images as data URLs (length equals count; 1 unless variations was used).
countnumberNumber of images returned.
creditsUsednumberTotal credits charged for this request (per image × successful variations).

Generate Video

Animate a still image into a short cinematic walkthrough (Veo 3.1). Returns a hosted MP4 URL.

POSThttps://www.meltflexai.com/api/v1/video
FieldTypeRequiredDescription
imageUrlstringConditional*Public URL of the source still. Preferred over base64.
imagestringConditional*Base64 data URL of the source still. Format: data:image/png;base64,...
durationSecondsnumberNo4 (default, 100 credits) or 8 (150 credits).
aspectRatiostringNo"16:9" (default) or "9:16".
promptstringNoDirect the camera or mood. Defaults to a slow cinematic dolly if omitted.

* Either image or imageUrl must be provided.

A successful request returns HTTP 200:

{
  "success": true,
  "videoUrl": "https://.../ai-videos/.../clip.mp4",
  "durationSeconds": 4,
  "aspectRatio": "16:9",
  "processingTime": "48.20",
  "creditsUsed": 100
}

Floorplan to 3D

Convert a 2D floorplan image into a rendered 3D picture (output: "render", 10 credits) or a downloadable GLB 3D model (output: "model", 100 credits).

POSThttps://www.meltflexai.com/api/v1/floorplan-to-3d
FieldTypeRequiredDescription
imageUrlstringConditional*Public URL of the floorplan image (JPEG, PNG or WebP).
imagestringConditional*Base64 data URL of the floorplan. Format: data:image/png;base64,...
outputstringNomodel (default) returns a GLB 3D mesh, 100 credits. render returns a rendered 3D picture of the plan, 10 credits. The fields below apply to one output or the other.
texturedbooleanNomodel only. Default true: the mesh comes with baked textures (walls, floors, window glass). Set false for the bare geometry only, when you will apply your own materials or just need the walls. Untextured runs finish faster and the GLB is smaller. Same credit cost.
stylestringNorender only. The look: photorealistic (default), 3d-model, drawing, sketch, wireframe, clay.
viewstringNorender only. Camera: isometric (default) or topdown.
furniturestringNorender only. furnished (default, matches the plan's symbols), empty, or styled (furnished plus rugs, art, plants, a set table).
interiorStylestringNorender only, photorealistic and 3d-model styles. auto (default), modern, scandinavian, minimalist, japandi, coastal, industrial, luxury, traditional.
labelsstringNorender only. What text survives from the plan: full (default, names + sizes + dimension lines), names, or none.

* Either image or imageUrl must be provided. An unknown option value returns HTTP 400 listing the valid values. A render takes about 20 seconds; a GLB conversion takes about 3 minutes and the request stays open until the model is ready, so allow a 300 s timeout.

A successful render request returns HTTP 200 with a hosted image URL and the options that were applied:

{
  "success": true,
  "output": "render",
  "imageUrl": "https://.../floorplans/render.png",
  "format": "png",
  "style": "photorealistic",
  "view": "isometric",
  "furniture": "furnished",
  "interiorStyle": "scandinavian",
  "labels": "names",
  "creditsUsed": 10
}

A successful model request returns HTTP 200 with a hosted model URL:

{
  "success": true,
  "output": "model",
  "modelUrl": "https://.../floorplans/model.glb",
  "format": "glb",
  "textured": true,
  "creditsUsed": 100
}

If storage is temporarily unavailable, the file is returned inline instead as base64: the GLB under a model field, the render as a data URL under image.

Furniture to 3D

Turn one photo of a furniture piece into a textured GLB 3D model. 75 credits, refunded if the build fails.

POSThttps://www.meltflexai.com/api/v1/furniture-3d
FieldTypeRequiredDescription
imageUrlstringConditional*Public URL of the furniture photo (JPEG, PNG or WebP). One piece, plain background, nothing cropped.
imagestringConditional*Base64 data URL of the photo. Format: data:image/jpeg;base64,...
texturedbooleanNoDefault true: the mesh comes with baked PBR textures. false skips the texture pass for bare geometry: faster, smaller, same credit cost.

* Either image or imageUrl must be provided. A model takes about 2 to 3 minutes and the request stays open until it is ready, so allow a 300 s timeout.

A finished model returns HTTP 200. modelUrl and thumbnailUrl are hosted by MeltFlex and permanent; formats are the engine's own signed links in other formats, valid for about 72 hours:

{
  "success": true,
  "status": "SUCCEEDED",
  "taskId": "0193f1a2-...",
  "modelUrl": "https://.../meshes/api_..._0193f1a2.glb",
  "thumbnailUrl": "https://.../meshes/api_..._0193f1a2.png",
  "format": "glb",
  "formats": {
    "glb": "https://assets.meshy.ai/.../model.glb?Expires=...",
    "usdz": "https://assets.meshy.ai/.../model.usdz?Expires=...",
    "fbx": "https://assets.meshy.ai/.../model.fbx?Expires=...",
    "obj": "https://assets.meshy.ai/.../model.obj?Expires=..."
  },
  "textured": true,
  "creditsUsed": 75
}

If the build is still running when the request's time budget ends, you get HTTP 202 instead. Nothing is lost: the credits stay on the job and you poll it.

{
  "success": false,
  "status": "IN_PROGRESS",
  "taskId": "0193f1a2-...",
  "progress": 64,
  "pollUrl": "https://www.meltflexai.com/api/v1/furniture-3d?taskId=0193f1a2-...",
  "creditsUsed": 75
}
GEThttps://www.meltflexai.com/api/v1/furniture-3d?taskId=...

Poll every 5 to 10 seconds. While building it returns status PENDING or IN_PROGRESS with a progress percentage; on success the same body as above; on FAILED an error and refunded: true. The refund happens exactly once no matter how often you poll.

Loading the result in a page is one line with three.js:

import * as THREE from "three";
import { GLTFLoader } from "three/addons/loaders/GLTFLoader.js";

// data = the JSON from POST /v1/furniture-3d (or /v1/floorplan-to-3d)
new GLTFLoader().load(data.modelUrl, (gltf) => scene.add(gltf.scene));

3D World

Turn one interior photo or render into an explorable Gaussian-splat 3D world. 30 credits for a draft world, 200 for hd, refunded if the build fails.

POSThttps://www.meltflexai.com/api/v1/world
FieldTypeRequiredDescription
imageUrlstringConditional*Public URL of the room photo or render (JPEG, PNG or WebP). A normal photo; a 360° panorama is detected automatically.
imagestringConditional*Base64 data URL of the image. Format: data:image/jpeg;base64,...
modelstringNodraft (default): fast walkable world, 30 credits, about a minute. hd: Marble's full model, sharper and holds up close, 200 credits, about five minutes. Anything else is HTTP 400.
namestringNoA label for the world, up to 64 characters. Shown in the hosted viewer.

* Either image or imageUrl must be provided. Draft worlds usually finish inside the request; hd builds usually do not, so treat HTTP 202 as the normal path for hd and poll.

A finished world returns HTTP 200:

{
  "success": true,
  "done": true,
  "worldId": "8641d179-d7c6-4b39-94b6-101a420e8d80",
  "spzUrl": "https://cdn.marble.worldlabs.ai/.../full_res.spz?...",
  "spzUrls": {
    "full_res": "https://cdn.marble.worldlabs.ai/.../full_res.spz?...",
    "500k": "https://cdn.marble.worldlabs.ai/.../500k.spz?...",
    "100k": "https://cdn.marble.worldlabs.ai/.../100k.spz?..."
  },
  "thumbnailUrl": "https://cdn.marble.worldlabs.ai/.../thumbnail.jpg?...",
  "caption": "A bright Scandinavian living room with a balcony",
  "viewerUrl": "https://marble.worldlabs.ai/world/8641d179-...",
  "format": "spz",
  "operationId": "op_...",
  "model": "draft",
  "creditsUsed": 30
}

spzUrl is the densest splat; spzUrls adds lighter tiers for a progressive open (the 100k file is about 1 MB). All of them are served with open CORS, so a browser loads them directly. They are signed and expire after a few days: persist worldId, not the links.

A build that outlives the request returns HTTP 202:

{
  "success": false,
  "done": false,
  "status": "IN_PROGRESS",
  "operationId": "op_...",
  "model": "hd",
  "pollUrl": "https://www.meltflexai.com/api/v1/world?operationId=op_...",
  "creditsUsed": 200
}
GEThttps://www.meltflexai.com/api/v1/world?operationId=...

Poll every 5 to 10 seconds. done: false while building; the finished body above on success; on failure status: "FAILED" with an error and refunded: true, exactly once.

GEThttps://www.meltflexai.com/api/v1/world?worldId=...

Fresh signed links for a world you built earlier, in the same finished-world shape. Free, no credits. Call it right before you show the world.

Showing the world in a page, with three.js and Spark (the renderer this page uses for the live world above):

import * as THREE from "three";
import { SplatMesh, SparkControls } from "@sparkjsdev/spark";

// data = the JSON from POST /v1/world. The camera sits at the origin: that is
// the photo's own viewpoint, so the world opens exactly where the picture was taken.
const world = new SplatMesh({ url: data.spzUrls?.["500k"] ?? data.spzUrl });
world.quaternion.set(1, 0, 0, 0); // .spz is Y-down
scene.add(world);

const controls = new SparkControls({ canvas: renderer.domElement });
renderer.setAnimationLoop(() => { controls.update(camera); renderer.render(scene, camera); });

Get Credits

Read your account's current credit balance and the per-operation cost table. Useful for pre-flight checks before a batch.

GEThttps://www.meltflexai.com/api/v1/credits
curl "https://www.meltflexai.com/api/v1/credits" \
  -H "Authorization: Bearer $MELTFLEX_API_KEY"

Returns HTTP 200:

{
  "balance": 340,
  "totalEarned": 500,
  "totalSpent": 160,
  "email": "you@studio.com",
  "costs": {
    "floorplan": 10,
    "photo": 10,
    "photo_furniture": 15,
    "video": 100,
    "prompt": 5,
    "removal": 10,
    "world": 30,
    "mesh3d": 50
  }
}

Resources

Limits

LimitValue
Credit cost, image generation10 credits
Credit cost, floorplan to 3D10 credits (render) / 100 credits (GLB model)
Credit cost, video (4s / 8s)100 / 150 credits
Credit cost, furniture to 3D75 credits
Credit cost, 3D world (draft / hd)30 / 200 credits
Max request body size15 MB
Request timeout, generate2 minutes
Request timeout, video / floorplan / furniture-3d / world5 minutes (then HTTP 202 + poll for the 3D jobs)
Max reference images per request10
Max active API keys per account5
Output, generatePNG (base64 data URL)
Output, video / floorplan / furniture-3d / worldHosted URL (MP4 / GLB / GLB / SPZ)

If you receive HTTP 429, implement exponential backoff before retrying. Need higher limits? Check our subscription plans.

Error codes

Error responses include a JSON body with an error field:

{
  "error": "Insufficient credits",
  "message": "You need 10 credits. Check your balance at meltflexai.com/settings",
  "required": 10
}
StatusMeaningDetails
200SuccessImage generated successfully.
400Bad RequestMissing or invalid fields (prompt, image).
401UnauthorizedInvalid, missing, or revoked API key.
402Payment RequiredInsufficient credits. Top up your account.
405Method Not AllowedOnly POST is supported.
429Rate LimitedToo many requests. Wait and retry with exponential backoff.
500Server ErrorGeneration failed. Credits are refunded automatically.
502Conversion FailedFloorplan-to-3D: the conversion service failed after retries. Credits refunded.
503Service UnavailableVideo/floorplan service temporarily down. Retry shortly. Credits refunded.
504TimeoutVideo generation exceeded 5 minutes. Credits refunded. Try again.