World Labs Marble API
The Marble API from World Labs — 8 operation(s) for marble.
The Marble API from World Labs — 8 operation(s) for marble.
openapi: 3.1.0
info:
description: Public-facing API for the Marble platform
summary: Marble Public API v1
title: Public API v1 credits Marble API
version: 1.0.0
servers:
- description: World API
url: https://api.worldlabs.ai
security:
- ApiKeyAuth: []
tags:
- name: Marble
paths:
/marble/v1/media-assets/{media_asset_id}:
get:
description: "Get a media asset by ID.\n\nRetrieves metadata for a previously created media asset.\n\nArgs:\n media_asset_id: The media asset identifier.\n\nReturns:\n MediaAsset object with media_asset_id, file_name, extension, kind,\n metadata, created_at, and updated_at.\n\nRaises:\n HTTPException: 404 if not found"
operationId: get_media_asset_marble_v1_media_assets__media_asset_id__get
parameters:
- in: path
name: media_asset_id
required: true
schema:
title: Media Asset Id
type: string
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/MediaAsset'
description: Successful Response
'422':
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
description: Validation Error
summary: Get Media Asset
tags:
- Marble
/marble/v1/media-assets:prepare_upload:
post:
description: "Prepare a media asset upload for use in world generation.\n\nThis API endpoint creates a media asset record and returns a signed upload URL.\nUse this workflow to upload images or videos that you want to reference in world\ngeneration requests.\n\n## Workflow\n\n1. **Prepare Upload** (this endpoint): Get a `media_asset_id` and `upload_url`\n2. **Upload File**: Use the signed URL to upload your file\n3. **Generate World**: Reference the `media_asset_id` in `/worlds:generate` with\n source type \"media_asset\"\n\n## Request Parameters\n\n- `file_name`: Your file's name (e.g., \"landscape.jpg\")\n- `extension`: File extension without dot (e.g., \"jpg\", \"png\", \"mp4\")\n- `kind`: Either \"image\" or \"video\"\n- `metadata`: Optional custom metadata object\n\n## Response\n\nReturns a `MediaAssetPrepareUploadResponse` containing:\n\n- `media_asset`: Object with `media_asset_id` (use this in world generation)\n- `upload_info`: Object with `upload_url`, `required_headers`, and `curl_example`\n\n## Uploading Your File\n\nUse the returned `upload_url` and `required_headers` to upload your file:\n\n```bash\ncurl --request PUT \\\n --url <upload_url> \\\n --header \"Content-Type: <content-type>\" \\\n --header \"<header-name>: <header-value>\" \\\n --upload-file /path/to/your/file\n```\n\nReplace:\n- `<upload_url>`: The `upload_url` from the response\n- `<content-type>`: MIME type (e.g., `image/png`, `image/jpeg`, `video/mp4`)\n- `<header-name>: <header-value>`: Each header from `required_headers`\n- `/path/to/your/file`: Path to your local file\n\n## Example Usage in World Generation\n\nAfter uploading, use the `media_asset_id` in a world generation request:\n\n```json\n{\n \"world_prompt\": {\n \"type\": \"image\",\n \"image_prompt\": {\n \"source\": \"media_asset\",\n \"media_asset_id\": \"<your-media-asset-id>\"\n }\n }\n}\n```"
operationId: prepare_media_asset_upload_marble_v1_media_assets_prepare_upload_post
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/MediaAssetPrepareUploadRequest'
required: true
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/MediaAssetPrepareUploadResponse'
description: Successful Response
'422':
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
description: Validation Error
summary: Prepare a media asset upload
tags:
- Marble
/marble/v1/operations/{operation_id}:
get:
description: "Get an operation by ID.\n\nPoll this endpoint to check the status of a long-running operation.\nWhen done=true, the response field contains the generated world.\n\nArgs:\n operation_id: The operation identifier from /worlds:generate.\n\nReturns:\n GetOperationResponse[World] with:\n - operation_id: Operation identifier\n - created_at: Creation timestamp\n - updated_at: Last update timestamp\n - expires_at: Expiration timestamp\n - done: true when complete, false while in progress\n - error: Error details if failed, null otherwise\n - metadata: Progress information and world_id\n - response: Generated World if done=true, null otherwise\n - cost: Settled credit cost breakdown; populated only when the\n operation completed successfully (done=true with no error)\n and a public price is known for its operation type. Failed\n or in-progress operations return null.\n\nRaises:\n HTTPException: 401 if unauthorized\n HTTPException: 404 if operation not found\n HTTPException: 500 if request fails"
operationId: get_operation_marble_v1_operations__operation_id__get
parameters:
- in: path
name: operation_id
required: true
schema:
title: Operation Id
type: string
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/GetOperationResponse_Union_World__PanoDepthToRgbResult__ExportWorldResult__'
description: Successful Response
'422':
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
description: Validation Error
summary: Get Operation
tags:
- Marble
/marble/v1/pano:depth_to_rgb:
post:
description: "Generate an RGB panorama from a depth panorama.\n\nProvide a depth panorama and a text prompt\ndescribing the desired appearance. The depth map\nsupplies the scene geometry; the model synthesizes\ntextures that match that geometry and returns a\npanoramic RGB image.\n\nAccepted depth inputs:\n\n* **EXR**: float depth values. Omit\n ``z_min`` and ``z_max``.\n* **PNG**: depth values normalized to [0, 1].\n Provide both ``z_min`` and ``z_max`` so the\n service can decode the PNG correctly.\n\nFor a complete PNG-based workflow, see the\n[web-chisel-depth-png example](https://github.com/worldlabsai/worldlabs-api-examples/tree/main/web-chisel-depth-png).\n\nReturns a long-running ``Operation``. Poll\n``GET /operations/{operation_id}`` until\n``done`` is ``true``, then read the generated\npanorama URL from ``response.pano_url``.\n\nRaises:\n HTTPException: 400 if invalid request\n HTTPException: 402 if insufficient credits\n HTTPException: 500 if generation could not start"
operationId: pano_depth_to_rgb_marble_v1_pano_depth_to_rgb_post
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/PanoDepthToRgbRequest'
required: true
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/Operation_PanoDepthToRgbResult_'
description: Successful Response
'402':
content:
application/json:
example:
detail: Insufficient API credits to start this request. Add credits or enable auto-refill at https://platform.worldlabs.ai/billing.
description: The account has insufficient API credits for this request.
'422':
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
description: Validation Error
summary: Pano Depth To Rgb
tags:
- Marble
/marble/v1/worlds/{world_id}:
delete:
description: "Delete a world by ID.\n\nPermanently deletes a world and its associated assets.\nOnly the world owner can delete a world.\n\nArgs:\n world_id: The unique identifier of the world to delete.\n\nReturns:\n DeleteWorldResponse confirming the deletion.\n\nRaises:\n HTTPException: 403 if user is not the world owner\n HTTPException: 404 if world not found\n HTTPException: 500 if deletion fails"
operationId: delete_world_marble_v1_worlds__world_id__delete
parameters:
- in: path
name: world_id
required: true
schema:
title: World Id
type: string
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/DeleteWorldResponse'
description: Successful Response
'422':
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
description: Validation Error
summary: Delete World
tags:
- Marble
get:
description: "Get a world by ID.\n\nRetrieves a world's details including generated assets if available.\nOnly the world owner or users with access to public worlds can retrieve them.\n\nArgs:\n world_id: The unique identifier of the world.\n\nReturns:\n World object with world_id, display_name, tags, assets, created_at,\n updated_at, permission, model, world_prompt, and world_marble_url.\n\nRaises:\n HTTPException: 404 if world not found or access denied"
operationId: get_world_marble_v1_worlds__world_id__get
parameters:
- in: path
name: world_id
required: true
schema:
title: World Id
type: string
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/World'
description: Successful Response
'422':
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
description: Validation Error
summary: Get World
tags:
- Marble
/marble/v1/worlds/{world_id}:export:
post:
description: 'Export a generated world asset.
PLY splat exports are converted synchronously, cached in GCS, and returned
as completed operations. HQ mesh exports reuse the existing async mesh
export service and return an in-progress operation.'
operationId: export_world_marble_v1_worlds__world_id__export_post
parameters:
- in: path
name: world_id
required: true
schema:
title: World Id
type: string
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/ExportWorldRequest'
required: true
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/ExportWorldResponse'
description: Successful Response
'402':
content:
application/json:
example:
detail: Insufficient API credits to start this request. Add credits or enable auto-refill at https://platform.worldlabs.ai/billing.
description: The account has insufficient API credits for this request.
'422':
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
description: Validation Error
summary: Export World
tags:
- Marble
/marble/v1/worlds:generate:
post:
description: "Start world generation.\n\nCreates a new world generation job and returns a long-running operation.\nPoll the /operations/{operation_id} endpoint to check generation status\nand retrieve the generated world when complete.\n\nArgs:\n request: The world generation request containing world_prompt, display_name,\n tags, model, seed, and permission settings.\n\nReturns:\n GenerateWorldResponse with operation_id and timestamps. Use the operation_id\n to poll for completion.\n\nRaises:\n HTTPException: 400 if invalid request or content violates policies\n HTTPException: 402 if insufficient credits\n HTTPException: 500 if generation could not be started"
operationId: generate_world_marble_v1_worlds_generate_post
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/WorldsGenerateRequest'
required: true
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/GenerateWorldResponse'
description: Successful Response
'402':
content:
application/json:
example:
detail: Insufficient API credits to start this request. Add credits or enable auto-refill at https://platform.worldlabs.ai/billing.
description: The account has insufficient API credits for this request.
'422':
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
description: Validation Error
summary: Generate World
tags:
- Marble
/marble/v1/worlds:list:
post:
description: "List worlds with optional filters.\n\nReturns worlds created through the API with optional filtering and pagination.\n\nArgs:\n request: List request with optional filters:\n - page_size: Number of results per page (default: 10)\n - page_token: Pagination token from previous response\n - status: Filter by status (e.g., \"COMPLETED\")\n - model: Filter by model name (e.g., \"marble-1.0-plus\")\n - tags: Filter by tags (matches worlds with any tag)\n - is_public: Filter by visibility (true=public, false=private, null=all)\n - created_after: Filter by creation time (after timestamp)\n - created_before: Filter by creation time (before timestamp)\n - sort_by: Sort order (\"created_at\" or \"updated_at\")\n\nReturns:\n ListWorldsResponse with worlds list and next_page_token for pagination.\n\nRaises:\n HTTPException: 400 if invalid parameters\n HTTPException: 500 if request fails"
operationId: list_worlds_marble_v1_worlds_list_post
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/ListWorldsRequest'
required: true
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/ListWorldsResponse'
description: Successful Response
'422':
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
description: Validation Error
summary: List Worlds
tags:
- Marble
components:
schemas:
VideoPrompt-Output:
description: For world models supporting video (+ text) input.
properties:
text_prompt:
anyOf:
- type: string
- type: 'null'
title: Text Prompt
type:
const: video
default: video
title: Type
type: string
video_prompt:
$ref: '#/components/schemas/Content'
required:
- video_prompt
title: VideoPrompt
type: object
WorldAssets:
description: Downloadable outputs of world generation.
properties:
caption:
anyOf:
- type: string
- type: 'null'
description: AI-generated description of the world
title: Caption
imagery:
anyOf:
- $ref: '#/components/schemas/ImageryAssets'
- type: 'null'
description: Imagery assets
mesh:
anyOf:
- $ref: '#/components/schemas/MeshAssets'
- type: 'null'
description: Mesh assets
splats:
anyOf:
- $ref: '#/components/schemas/SplatAssets'
- type: 'null'
description: Gaussian splat assets
thumbnail_url:
anyOf:
- type: string
- type: 'null'
description: Thumbnail URL for the world
title: Thumbnail Url
title: WorldAssets
type: object
ExportWorldResult:
description: Downloadable exported world asset.
properties:
asset_type:
description: Exported asset family
enum:
- splats
- mesh
title: Asset Type
type: string
format:
description: Exported file format
enum:
- ply
- glb
title: Format
type: string
mesh_variant:
anyOf:
- enum:
- textured
- vertex_colored
type: string
- type: 'null'
description: Mesh variant returned for this export, if applicable
title: Mesh Variant
resolution:
anyOf:
- type: string
- type: 'null'
description: Splat resolution used for this export, if applicable
title: Resolution
url:
description: Download URL for the exported asset
title: Url
type: string
required:
- asset_type
- format
- url
title: ExportWorldResult
type: object
ListWorldsResponse:
description: Response containing a list of API-generated worlds.
properties:
next_page_token:
anyOf:
- type: string
- type: 'null'
description: Token for fetching the next page of results
title: Next Page Token
worlds:
description: List of worlds
items:
$ref: '#/components/schemas/World'
title: Worlds
type: array
required:
- worlds
title: ListWorldsResponse
type: object
Prompt:
description: 'For world models generating a world from a single image (+ text).
Images can be generated using the :image-generation method.
If no text prompt is provided, it will be generated via recaption.'
properties:
image_prompt:
$ref: '#/components/schemas/Content'
is_pano:
default: false
title: Is Pano
type: boolean
text_prompt:
anyOf:
- type: string
- type: 'null'
title: Text Prompt
type:
const: image
default: image
title: Type
type: string
required:
- image_prompt
title: Prompt
type: object
MediaAsset:
description: 'A user-uploaded media asset stored in managed storage.
MediaAssets can be images, videos, or binary blobs that are used
as input to world generation.'
properties:
created_at:
description: Creation timestamp
format: date-time
title: Created At
type: string
extension:
anyOf:
- type: string
- type: 'null'
description: File extension without dot
examples:
- mp4
- png
- jpg
title: Extension
file_name:
description: File name
title: File Name
type: string
kind:
$ref: '#/components/schemas/MediaAssetKind'
description: High-level media type
examples:
- image
- video
media_asset_id:
description: Server-generated media asset identifier
title: Media Asset Id
type: string
metadata:
anyOf:
- additionalProperties: true
type: object
- type: 'null'
description: Optional application-specific metadata
title: Metadata
updated_at:
anyOf:
- format: date-time
type: string
- type: 'null'
description: Last update timestamp
title: Updated At
required:
- media_asset_id
- file_name
- kind
- created_at
title: MediaAsset
type: object
ExportWorldResponse:
description: Response from world export endpoint.
properties:
cost:
anyOf:
- $ref: '#/components/schemas/OperationCost'
- type: 'null'
description: Settled credit cost for the operation. Populated only on successful completion.
created_at:
anyOf:
- format: date-time
type: string
- type: 'null'
description: Creation timestamp
title: Created At
done:
description: True if the operation is completed
title: Done
type: boolean
error:
anyOf:
- $ref: '#/components/schemas/OperationError'
- type: 'null'
description: Error information if the operation failed
expires_at:
anyOf:
- format: date-time
type: string
- type: 'null'
description: Expiration timestamp
title: Expires At
metadata:
anyOf:
- additionalProperties: true
type: object
- type: 'null'
description: Service-specific metadata, such as progress percentage
title: Metadata
operation_id:
description: Operation identifier
title: Operation Id
type: string
response:
anyOf:
- $ref: '#/components/schemas/ExportWorldResult'
- type: 'null'
description: Result payload when done=true and no error. Structure depends on operation type.
updated_at:
anyOf:
- format: date-time
type: string
- type: 'null'
description: Last update timestamp
title: Updated At
required:
- operation_id
- done
title: ExportWorldResponse
type: object
SplatAssets:
description: Gaussian splat asset URLs.
properties:
semantics_metadata:
anyOf:
- $ref: '#/components/schemas/WorldSemanticsMetadata'
- type: 'null'
description: Semantic metadata for the world
spz_urls:
anyOf:
- additionalProperties:
type: string
type: object
- type: 'null'
description: URLs for SPZ format Gaussian splat files
title: Spz Urls
title: SplatAssets
type: object
WorldTextPrompt-Output:
description: Input prompt class for text-conditioned world generation.
properties:
text_prompt:
anyOf:
- type: string
- type: 'null'
title: Text Prompt
type:
const: text
default: text
title: Type
type: string
title: WorldTextPrompt
type: object
PanoDepthToRgbRequest:
description: "Request to generate an RGB panorama from a depth panorama.\n\nProvide a depth panorama and a text prompt describing\nthe desired appearance. The depth map supplies the\nscene geometry; the model synthesizes textures that\nloosely adhere to that geometry and returns a panoramic RGB image.\n\nAccepted depth inputs:\n\n* **EXR**: float depth values. Omit ``z_min``\n and ``z_max``.\n* **PNG**: depth values normalized to [0, 1].\n Provide both ``z_min`` and ``z_max`` so the service\n can decode the PNG correctly.\n\nFor a complete PNG-based workflow, see the\n`web-chisel-depth-png example <https://github.com/worldlabsai/worldlabs-api-examples/tree/main/web-chisel-depth-png>`.\n\nThis endpoint returns a long-running ``Operation``.\nPoll ``GET /operations/{operation_id}`` until\n``done`` is ``true``, then read the generated\npanorama URL from ``response.pano_url``."
examples:
- depth_pano_image:
source: uri
uri: https://example.com/depth.exr
text_prompt: The scene is a warm, rustic cabin interior with a realistic style and a cozy winter atmosphere. Wooden walls and exposed beams frame the room, while a stone fireplace casts soft amber light across simple furnishings and natural textures. The 360 scene is faultless.
- depth_pano_image:
source: uri
uri: https://example.com/greenhouse-depth.exr
text_prompt: A peaceful greenhouse workshop filled with plants and glassware, with soft sunlight, weathered wood, and ivy creeping along the walls.
- depth_pano_image:
source: uri
uri: https://example.com/depth.png
text_prompt: The scene is a warm Mediterranean kitchen rendered in a realistic style with a bright, welcoming coastal atmosphere. The overall tone is relaxed and sunlit, combining natural materials with crisp handcrafted details. Blue ceramic tiles wrap the backsplash and continue across key architectural surfaces, giving the room a cool accent against creamy plaster walls. Wooden cabinetry lines the perimeter in a balanced arrangement, with paneled doors, open shelving, and brass hardware contributing to the room's refined but lived-in character. A broad countertop of pale stone runs between the cabinets, creating a continuous work surface that anchors the cooking area. A central table with a solid wood top occupies the middle of the room, surrounded by simple chairs and small ceramic vessels that reinforce the artisanal style. Arched openings connect the kitchen to adjacent areas, while French doors admit generous daylight and suggest an outdoor terrace nearby. Terracotta accents, woven textures, and neatly arranged cookware add visual richness without cluttering the space. The cabinetry, tiled surfaces, and stone counters form a coherent ring around the room, while the table remains the central focal element within the composition. The 360 scene is faultless.
z_max: 100
z_min: 0.1
properties:
depth_pano_image:
description: Depth panorama image (EXR or PNG). Provide via URI, media_asset, or base64 (max 100 MB).
discriminator:
mapping:
data_base64: '#/components/schemas/DataBase64Reference'
media_asset: '#/components/schemas/MediaAssetReference'
uri: '#/components/schemas/UriReference'
propertyName: source
oneOf:
- $ref: '#/components/schemas/MediaAssetReference'
- $ref: '#/components/schemas/UriReference'
- $ref: '#/components/schemas/DataBase64Reference'
title: Depth Pano Image
seed:
anyOf:
- maximum: 4294967295
minimum: 0
type: integer
- type: 'null'
description: Random seed for reproducible generation.
title: Seed
text_prompt:
description: Text description of the desired appearance.
title: Text Prompt
type: string
z_max:
anyOf:
- exclusiveMinimum: 0
type: number
- type: 'null'
description: Maximum depth. Required for PNG depth maps (normalized to [0, 1]). Must be provided together with z_min and must be greater than z_min. Omit for EXR depth maps.
title: Z Max
z_min:
anyOf:
- exclusiveMinimum: 0
type: number
- type: 'null'
description: Minimum depth. Required for PNG depth maps (normalized to [0, 1]). Must be provided together with z_max. Omit for EXR depth maps.
title: Z Min
required:
- depth_pano_image
- text_prompt
title: PanoDepthToRgbRequest
type: object
PanoDetectionMode:
enum:
- auto
- true
- false
MeshAssets:
description: Mesh asset URLs.
properties:
collider_mesh_url:
anyOf:
- type: string
- type: 'null'
description: Collider mesh URL
title: Collider Mesh Url
full_res_mesh_url:
anyOf:
- type: string
- type: 'null'
description: Full-resolution vertex-colored mesh URL
title: Full Res Mesh Url
hq_mesh_url:
anyOf:
- type: string
- type: 'null'
description: High-quality textured mesh URL
title: Hq Mesh Url
title: MeshAssets
type: object
GenerateWorldResponse:
description: Response from world generation endpoint.
properties:
cost:
anyOf:
- $ref: '#/components/schemas/OperationCost'
- type: 'null'
description: Settled credit cost for the operation. Populated only on successful completion.
created_at:
anyOf:
- format: date-time
type: string
- type: 'null'
description: Creation timestamp
title: Created At
done:
description: True if the operation is completed
title: Done
type: boolean
error:
anyOf:
- $ref: '#/components/schemas/OperationError'
- type: 'null'
description: Error information if the operation failed
expires_at:
anyOf:
- format: date-time
type: string
- type: 'null'
description: Expiration timestamp
title: Expires At
metadata:
anyOf:
- additionalProperties: true
type: object
- type: 'null'
description: Service-specific metadata, such as progress percentage
title: Metadata
operation_id:
description: Operation identifier
title: Operation Id
type: string
response:
anyOf:
- {}
- type: 'null'
description: Result payload when done=true and no error. Structure depends on operation type.
title: Response
updated_at:
anyOf:
- format: date-time
type: string
- type: 'null'
description: Last update timestamp
title: Updated At
required:
- operation_id
- done
title: GenerateWorldResponse
type: object
WorldTextPrompt-Input:
description: 'Text-to-world generation.
Generates a world from a text description. text_prompt is REQUIRED.'
properties:
disable_recaption:
anyOf:
- type: boolean
- type: 'null'
description: If True, use text_prompt as-is without recaptioning
title: Disable Recaption
text_prompt:
anyOf:
- type: string
- type: 'null'
description: Optional text guidance (auto-generated if not provided)
title: Text Prompt
type:
const: text
default: text
title: Type
type: string
title: WorldTextPrompt
type: object
MultiImagePrompt-Output:
description: For world models supporting multi-image (+ text) input.
properties:
multi_image_prompt:
items:
$ref: '#/components/schemas/SphericallyLocatedContent-Output'
title: Multi Image Prompt
type: array
reconstruct_images:
default: false
title: Reconstruct Images
type: boolean
text_prompt:
anyOf:
- type: string
- type: 'null'
title: Text Prompt
type:
const: multi-image
default: multi-image
title: Type
type: string
required:
- multi_image_prompt
title: MultiImagePrompt
type: object
Permission:
description: Access control permissions for a resource.
properties:
allow_id_access:
default: false
title: Allow Id Access
type: boolean
allowed_readers:
items:
type: string
title: Allowed Readers
type: array
allowed_writers:
items:
type: string
title: Allowed Writers
type: array
public:
default: false
title: Public
type: boolean
titl
# --- truncated at 32 KB (63 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/world-labs/refs/heads/main/openapi/world-labs-marble-api-openapi.yml