Now liveThe Skillselion MCP - thousands of ranked skills, loaded into your agent mid-task. No install.Get it →
cloudai-x avatar

World Labs Api

  • 9 installs
  • 3 repo stars
  • Updated January 22, 2026
  • cloudai-x/world-labs-skills

Integrates the World Labs Marble API for 3D world generation, covering authentication, endpoints, models, credits, and media uploads.

About

Documents the Marble v1 API for generating 3D worlds, including the WLT-Api-Key header, base URL, the plus and mini models, and per-input-type credit costs. A developer uses it when calling the World Labs Marble API to generate worlds programmatically.

  • Auth via WLT-Api-Key header against api.worldlabs.ai/marble/v1
  • Model and credit tables for panorama, text, image, and multi-image inputs

World Labs Api by the numbers

  • 9 all-time installs (skills.sh)
  • Ranked #1,065 of 1,335 Generative Media skills by installs in the Skillselion catalog
  • Data as of Jul 29, 2026 (Skillselion catalog sync)
npx skills add https://github.com/cloudai-x/world-labs-skills --skill world-labs-api

Add your badge

Show developers this skill is listed on Skillselion. Paste this into your README.

Listed on Skillselion
Installs9
repo stars3
Last updatedJanuary 22, 2026
Repositorycloudai-x/world-labs-skills

What it does

Integrates the World Labs Marble API for 3D world generation, covering authentication, endpoints, models, credits, and media uploads.

Files

SKILL.mdMarkdownGitHub ↗

World Labs Marble API Integration

Authentication

All API requests require the WLT-Api-Key header:

curl -X POST "https://api.worldlabs.ai/marble/v1/worlds:generate" \
  -H "WLT-Api-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json"

Get your API key from: <https://platform.worldlabs.ai>

Note: API credits purchased at platform.worldlabs.ai are separate from Marble app (marble.worldlabs.ai) credits.

Base URL

https://api.worldlabs.ai/marble/v1

Models

ModelIDBest For
Marble 0.1-plusMarble 0.1-plusHigh-quality production (~5 min)
Marble 0.1-miniMarble 0.1-miniQuick drafts/iteration (~30-45 sec)

Credits by Input Type

Input TypeMarble 0.1-plusMarble 0.1-mini
Panorama image1,500150
Text1,580230
Image (non-pano)1,580230
Multi-image1,600250
Video1,600250

Pricing: $1 = 1,250 credits (minimum purchase: $5 / 6,250 credits)

Core Endpoints

Generate World

POST /marble/v1/worlds:generate

Request Body (Text Prompt):

{
  "display_name": "My World",
  "model": "Marble 0.1-plus",
  "world_prompt": {
    "type": "text",
    "text_prompt": "A cozy cabin in snowy mountains at sunset",
    "disable_recaption": false
  },
  "seed": 42,
  "tags": ["landscape", "winter"],
  "permission": {
    "public": false
  }
}

Response:

{
  "done": false,
  "operation_id": "op_abc123",
  "created_at": "2024-01-01T12:00:00Z",
  "updated_at": "2024-01-01T12:00:00Z",
  "metadata": {}
}

Poll Operation Status

GET /marble/v1/operations/{operation_id}

Response (in progress):

{
  "done": false,
  "operation_id": "op_abc123",
  "metadata": {
    "world_id": "world_xyz789"
  }
}

Response (complete):

{
  "done": true,
  "operation_id": "op_abc123",
  "response": {
    "world_id": "world_xyz789",
    "display_name": "My World",
    "world_marble_url": "https://marble.worldlabs.ai/world/...",
    "assets": {
      "thumbnail_url": "...",
      "imagery": { "pano_url": "..." },
      "mesh": { "collider_mesh_url": "..." },
      "splats": { "spz_urls": {} }
    }
  }
}

Get World

GET /marble/v1/worlds/{world_id}

Returns full world object with assets.

List Worlds

POST /marble/v1/worlds:list
{
  "page_size": 20,
  "status": "SUCCEEDED",
  "model": "Marble 0.1-plus",
  "sort_by": "created_at"
}

Media Asset Upload Workflow

Step 1: Prepare Upload

POST /marble/v1/media-assets:prepare_upload
{
  "file_name": "landscape.jpg",
  "kind": "image",
  "extension": "jpg"
}

Response:

{
  "media_asset": {
    "media_asset_id": "550e8400-e29b-41d4-a716-446655440000",
    "file_name": "landscape.jpg",
    "kind": "image",
    "extension": "jpg"
  },
  "upload_info": {
    "upload_url": "https://storage.googleapis.com/...",
    "upload_method": "PUT",
    "required_headers": {
      "x-goog-content-length-range": "0,1048576000"
    }
  }
}

Step 2: Upload File

curl -X PUT "UPLOAD_URL" \
  -H "Content-Type: image/jpeg" \
  -H "x-goog-content-length-range: 0,1048576000" \
  --data-binary @landscape.jpg

Step 3: Use in Generation

Single Image:

{
  "model": "Marble 0.1-plus",
  "world_prompt": {
    "type": "image",
    "image_prompt": {
      "source": "media_asset",
      "media_asset_id": "550e8400-e29b-41d4-a716-446655440000"
    },
    "text_prompt": "Enhance with dramatic lighting"
  }
}

Panorama Image (use `is_pano` flag):

{
  "model": "Marble 0.1-plus",
  "world_prompt": {
    "type": "image",
    "image_prompt": {
      "source": "media_asset",
      "media_asset_id": "550e8400-e29b-41d4-a716-446655440000",
      "is_pano": true
    }
  }
}

Multi-Image with Azimuth:

{
  "model": "Marble 0.1-plus",
  "world_prompt": {
    "type": "multi-image",
    "multi_image_prompt": [
      {
        "azimuth": 0,
        "content": {
          "source": "media_asset",
          "media_asset_id": "front_image_id"
        }
      },
      {
        "azimuth": 180,
        "content": {
          "source": "media_asset",
          "media_asset_id": "back_image_id"
        }
      }
    ],
    "text_prompt": "A cozy living room"
  }
}

Video:

{
  "model": "Marble 0.1-plus",
  "world_prompt": {
    "type": "video",
    "video_prompt": {
      "source": "media_asset",
      "media_asset_id": "video_asset_id"
    },
    "text_prompt": "A scenic mountain landscape"
  }
}

File Requirements

TypeFormatsMax SizeNotes
Imagepng, jpg, jpeg, webp20 MB1024px on long side recommended
Panoramapng, jpg, jpeg, webp20 MB2:1 aspect, 2560px wide recommended
Videomp4, mov, webm100 MBMax 30 seconds

Python Example

import requests
import time

API_KEY = "your_api_key"
BASE_URL = "https://api.worldlabs.ai/marble/v1"

def generate_world(prompt: str, model: str = "Marble 0.1-plus") -> dict:
    """Generate a world and return the world data."""
    headers = {"WLT-Api-Key": API_KEY, "Content-Type": "application/json"}

    # Start generation
    response = requests.post(
        f"{BASE_URL}/worlds:generate",
        headers=headers,
        json={
            "model": model,
            "world_prompt": {
                "type": "text",
                "text_prompt": prompt
            }
        }
    )
    response.raise_for_status()
    operation_id = response.json()["operation_id"]

    # Poll until complete
    while True:
        status_response = requests.get(
            f"{BASE_URL}/operations/{operation_id}",
            headers={"WLT-Api-Key": API_KEY}
        )
        status_response.raise_for_status()
        result = status_response.json()

        if result.get("done"):
            if "error" in result and result["error"]:
                raise Exception(f"Generation failed: {result['error']}")
            return result["response"]

        time.sleep(5)

# Usage
world = generate_world("A mystical forest with glowing mushrooms")
print(f"World created: {world['world_id']}")
print(f"View at: {world['world_marble_url']}")

Error Handling

Status CodeMeaning
400Invalid request parameters
401Invalid or missing API key
402Insufficient credits
429Rate limit exceeded
500Server error

Rate Limits

  • ~6 world generation requests per minute (rolling window)
  • 429 error returned when exceeded; retry after limit resets

Related Skills

  • world-labs-text-prompt - Text prompting best practices
  • world-labs-image-prompt - Single image input
  • world-labs-multi-image - Multi-image direction control
  • world-labs-pano-video - Panorama and video input
  • world-labs-export - Export formats and integrations

Related skills

This week in AI coding

Five minutes, every Monday - the tools, releases and tactics for developers.

unsubscribe anytime.