{"openapi":"3.0.0","paths":{"/v1/worlds":{"post":{"operationId":"V1Worlds_createJob","parameters":[{"name":"Idempotency-Key","in":"header","description":"Unique key to ensure request idempotency (max 24 hours)","required":false,"schema":{"type":"string"}}],"requestBody":{"required":true,"description":"World generation request","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"file_id"},"file_id":{"type":"string","minLength":1},"is_pano":{"type":"boolean"}},"required":["type","file_id"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"url"},"image_url":{"type":"string","format":"uri","pattern":"^https:\\/\\/.*"},"is_pano":{"type":"boolean"}},"required":["type","image_url"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"base64"},"image_base64":{"type":"string","minLength":1},"is_pano":{"type":"boolean"}},"required":["type","image_base64"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"text"},"prompt":{"type":"string","minLength":1,"maxLength":2000}},"required":["type","prompt"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"panorama_id"},"panorama_id":{"type":"string","minLength":1}},"required":["type","panorama_id"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"multi_pano"},"panos":{"minItems":2,"maxItems":90,"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"file_id"},"file_id":{"type":"string","minLength":1}},"required":["type","file_id"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"url"},"image_url":{"type":"string","format":"uri","pattern":"^https:\\/\\/.*"}},"required":["type","image_url"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"base64"},"image_base64":{"type":"string","minLength":1}},"required":["type","image_base64"],"additionalProperties":false}]}},"video":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"file_id"},"file_id":{"type":"string","minLength":1}},"required":["type","file_id"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"url"},"video_url":{"type":"string"}},"required":["type","video_url"],"additionalProperties":false}]},"panos_zip":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"file_id"},"file_id":{"type":"string","minLength":1}},"required":["type","file_id"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"url"},"zip_url":{"type":"string","format":"uri","pattern":"^https:\\/\\/.*"}},"required":["type","zip_url"],"additionalProperties":false}]},"cameras":{"oneOf":[{"type":"object","properties":{"format":{"type":"string","const":"camera_trajectory"},"matrices":{"minItems":2,"maxItems":90,"type":"array","items":{"minItems":4,"maxItems":4,"type":"array","items":{"minItems":4,"maxItems":4,"type":"array","items":{"type":"number"}}}}},"required":["format","matrices"],"additionalProperties":false},{"type":"object","properties":{"format":{"type":"string","const":"floorplan"},"poses":{"minItems":2,"maxItems":90,"type":"array","items":{"type":"array","prefixItems":[{"type":"number"},{"type":"number"},{"type":"number"},{"type":"number"}]}}},"required":["format","poses"],"additionalProperties":false}]}},"required":["type"],"additionalProperties":false}]},"model":{"type":"string"},"title":{"type":"string","maxLength":200},"output_format":{"type":"string","enum":["spz","sog"]},"validation":{"type":"object","properties":{"skip":{"type":"boolean"},"error_on_fail":{"type":"boolean"}},"additionalProperties":false},"visibility":{"type":"object","properties":{"is_public":{"type":"boolean"},"is_listed":{"type":"boolean"}},"additionalProperties":false},"webhook":{"type":"object","properties":{"url":{"type":"string","format":"uri","pattern":"^https:\\/\\/.*"}},"required":["url"],"additionalProperties":false}},"required":["input"],"additionalProperties":false},"examples":{"url":{"summary":"URL input (all fields with defaults)","value":{"input":{"type":"url","image_url":"https://example.com/photo.jpg"},"model":"default","title":"My world","output_format":"spz","validation":{"skip":true,"error_on_fail":false},"visibility":{"is_public":false,"is_listed":false}}},"sog_output":{"summary":"Request SOG output (adds ~25s)","value":{"input":{"type":"url","image_url":"https://example.com/photo.jpg"},"title":"My SOG world","output_format":"sog"}},"file_id":{"summary":"File ID input (after POST /v1/files)","value":{"input":{"type":"file_id","file_id":"file_abc123"},"model":"default","title":"My world","validation":{"skip":true,"error_on_fail":false},"visibility":{"is_public":false,"is_listed":false}}},"panorama_file_id":{"summary":"360 panorama file input (after POST /v1/files)","value":{"input":{"type":"file_id","file_id":"file_pano123","is_pano":true},"model":"default","title":"My panorama world","visibility":{"is_public":false,"is_listed":false}}},"panorama_url":{"summary":"360 panorama URL input","value":{"input":{"type":"url","image_url":"https://example.com/panorama.jpg","is_pano":true},"model":"default","title":"My panorama world","visibility":{"is_public":false,"is_listed":false}}},"panorama_id":{"summary":"Edited panorama input (after POST /v1/panoramas/edit)","value":{"input":{"type":"panorama_id","panorama_id":"pano_abc123"},"model":"default","title":"My edited world","visibility":{"is_public":false,"is_listed":false}}},"base64":{"summary":"Base64 inline input (≤25MB)","value":{"input":{"type":"base64","image_base64":"data:image/png;base64,iVBORw0KGgo..."},"model":"default","title":"My world","validation":{"skip":true,"error_on_fail":false},"visibility":{"is_public":false,"is_listed":false}}},"text":{"summary":"Text prompt → full world","value":{"input":{"type":"text","prompt":"a cozy sunlit reading nook with bookshelves and a window seat"},"model":"default","title":"Reading nook","validation":{"skip":true,"error_on_fail":false},"visibility":{"is_public":false,"is_listed":false}}}}}}},"responses":{"202":{"description":"Job accepted and queued for processing"},"400":{"description":"Invalid request"},"401":{"description":"Unauthorized"},"402":{"description":"Insufficient credits"},"409":{"description":"Idempotency key conflict"},"429":{"description":"Rate limit exceeded"}},"security":[{"api-key":[]}],"summary":"Create a new world generation job","tags":["worlds"],"servers":[{"url":"https://api.spaitial.ai","description":"Production"}]}},"/v1/worlds/requests":{"get":{"description":"Returns only worlds generated through the API with this key. Worlds created in the Spaitial web app (dashboard) are not included, even for the same account. Generate through the API if you need the pipeline to list the result. `status` is optional; omitting it returns the same unfiltered page as before.","operationId":"V1Worlds_listJobs","parameters":[{"name":"status","required":false,"in":"query","description":"When set, only jobs with this status are returned. Omit to list all.","schema":{"enum":["PENDING","PROCESSING","COMPLETED","FAILED","CANCELLED"],"type":"string"}},{"name":"offset","required":false,"in":"query","description":"Number of jobs to skip before returning results.","schema":{"type":"integer","minimum":0,"default":0}},{"name":"limit","required":false,"in":"query","description":"Maximum number of jobs to return.","schema":{"type":"integer","minimum":1,"maximum":100,"default":20}}],"responses":{"200":{"description":"Paginated job list"},"400":{"description":"Invalid query parameters"},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"}},"security":[{"api-key":[]}],"summary":"List jobs created by this API key","tags":["worlds"],"servers":[{"url":"https://api.spaitial.ai","description":"Production"}]}},"/v1/worlds/requests/{requestId}/status":{"get":{"description":"Progress is 0..1 when the pipeline has meaningful stage movement, otherwise null (never treat null as 0%). Long reconstruction jobs return the current model alias estimated_duration_seconds so clients can show ETA + elapsed instead of a percent.","operationId":"V1Worlds_getJobStatus","parameters":[{"name":"requestId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Job status"},"404":{"description":"Job not found"}},"security":[{"api-key":[]}],"summary":"Get job status","tags":["worlds"],"servers":[{"url":"https://api.spaitial.ai","description":"Production"}]}},"/v1/worlds/requests/{requestId}":{"get":{"operationId":"V1Worlds_getJobResult","parameters":[{"name":"requestId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Full job result with world details"},"404":{"description":"Job not found"}},"security":[{"api-key":[]}],"summary":"Get full job result","tags":["worlds"],"servers":[{"url":"https://api.spaitial.ai","description":"Production"}]},"patch":{"operationId":"V1Worlds_updateWorld","parameters":[{"name":"requestId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"description":"World update request","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"title":{"type":"string","maxLength":200},"visibility":{"type":"object","properties":{"is_public":{"type":"boolean"},"is_listed":{"type":"boolean"}},"additionalProperties":false}},"additionalProperties":false},"examples":{"visibility":{"summary":"Update visibility","value":{"visibility":{"is_public":true,"is_listed":true}}},"title":{"summary":"Update title","value":{"title":"My updated world"}},"both":{"summary":"Update both","value":{"title":"My public world","visibility":{"is_public":true,"is_listed":false}}}}}}},"responses":{"200":{"description":"Updated world details"},"400":{"description":"Invalid request"},"404":{"description":"Request not found"},"409":{"description":"World is not ready yet"}},"security":[{"api-key":[]}],"summary":"Update world visibility or title","tags":["worlds"],"servers":[{"url":"https://api.spaitial.ai","description":"Production"}]}},"/v1/worlds/requests/{requestId}/cancel":{"post":{"operationId":"V1Worlds_cancelJob","parameters":[{"name":"requestId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Cancel request processed"},"404":{"description":"Job not found"}},"security":[{"api-key":[]}],"summary":"Cancel a job","tags":["worlds"],"servers":[{"url":"https://api.spaitial.ai","description":"Production"}]}},"/v1/worlds/requests/{requestId}/exports/{type}":{"post":{"description":"Export artifacts from worlds. Supports just collision meshes for now. Mesh exports can take several minutes, so ensure to check the status before requesting the download URL.","operationId":"V1Worlds_createExport","parameters":[{"name":"requestId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Export is ready"},"202":{"description":"Export generation started"},"404":{"description":"Request not found"},"409":{"description":"World is not ready yet"}},"security":[{"api-key":[]}],"summary":"Start or retrieve an export for a completed job","tags":["worlds"],"servers":[{"url":"https://api.spaitial.ai","description":"Production"}]},"get":{"description":"Returns export status. When ready, the response includes a backend proxy download_url. Add ?download=1 to this same endpoint to redirect to a short-lived signed file URL.","operationId":"V1Worlds_getExport","parameters":[{"name":"requestId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Export status and download link"},"302":{"description":"Redirect to a short-lived signed file URL when ?download=1 is provided"},"404":{"description":"Request not found"},"409":{"description":"World is not ready yet"}},"security":[{"api-key":[]}],"summary":"Get export status","tags":["worlds"],"servers":[{"url":"https://api.spaitial.ai","description":"Production"}]}},"/v1/worlds/requests/{requestId}/exports":{"get":{"operationId":"V1Worlds_listExports","parameters":[{"name":"requestId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"List of export artifacts"},"404":{"description":"Request not found"},"409":{"description":"World is not ready yet"}},"security":[{"api-key":[]}],"summary":"List exports for a completed job","tags":["worlds"],"servers":[{"url":"https://api.spaitial.ai","description":"Production"}]}},"/v1/worlds/requests/{requestId}/splat":{"get":{"description":"Redirects (302) to a short-lived signed download URL. The URL is valid for ~5 minutes; re-hit this endpoint when it expires.","operationId":"V1Worlds_getSplatDownload","parameters":[{"name":"requestId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"302":{"description":"Redirect to a short-lived signed download URL"},"404":{"description":"Request not found"},"409":{"description":"Splat is not ready yet"}},"security":[{"api-key":[]}],"summary":"Download the splat artifact for a completed job","tags":["worlds"],"servers":[{"url":"https://api.spaitial.ai","description":"Production"}]}},"/v1/worlds/requests/{requestId}/panorama":{"get":{"description":"Redirects (302) to a short-lived signed download URL. The URL is valid for ~5 minutes; re-hit this endpoint when it expires.","operationId":"V1Worlds_getPanoramaDownload","parameters":[{"name":"requestId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"302":{"description":"Redirect to a short-lived signed download URL"},"404":{"description":"Request not found"},"409":{"description":"Panorama is not ready yet"}},"security":[{"api-key":[]}],"summary":"Download the panorama artifact for a completed job","tags":["worlds"],"servers":[{"url":"https://api.spaitial.ai","description":"Production"}]}},"/v1/files":{"get":{"operationId":"V1Files_listFiles","parameters":[{"name":"offset","required":false,"in":"query","description":"Number of files to skip before returning results.","schema":{"type":"integer","minimum":0,"default":0}},{"name":"limit","required":false,"in":"query","description":"Maximum number of files to return.","schema":{"type":"integer","minimum":1,"maximum":100,"default":20}}],"responses":{"200":{"description":"Paginated file list","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"files":{"type":"array","items":{"type":"object","properties":{"file_id":{"type":"string"},"content_type":{"type":"string"},"file_size":{"type":"number","exclusiveMinimum":0},"expires_at":{"type":"string"},"created_at":{"type":"string"},"consumed_at":{"anyOf":[{"type":"string"},{"type":"null"}]},"status":{"type":"string","enum":["available","consumed","expired"]}},"required":["file_id","content_type","file_size","expires_at","created_at","consumed_at","status"],"additionalProperties":false}},"limit":{"type":"integer","minimum":1,"maximum":100},"offset":{"type":"integer","minimum":0,"maximum":9007199254740991},"has_more":{"type":"boolean"}},"required":["files","limit","offset","has_more"],"additionalProperties":false}}}},"400":{"description":"Invalid query parameters","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"},"details":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"},"details":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"},"details":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"},"details":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}},"security":[{"api-key":[]}],"summary":"List files uploaded by this API key","tags":["files"],"servers":[{"url":"https://api.spaitial.ai","description":"Production"}]},"post":{"operationId":"V1Files_uploadFile","parameters":[],"requestBody":{"required":true,"description":"Image file to upload","content":{"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary","description":"Image file (JPEG, PNG, WebP, GIF, max 100MB)"}},"required":["file"]}}}},"responses":{"201":{"description":"File uploaded successfully"},"400":{"description":"Invalid file"},"401":{"description":"Unauthorized"},"403":{"description":"Moderation rejected"},"413":{"description":"File too large"},"429":{"description":"Rate limit exceeded"}},"security":[{"api-key":[]}],"summary":"Upload a file for later use in world generation","tags":["files"],"servers":[{"url":"https://api.spaitial.ai","description":"Production"}]}},"/v1/models":{"get":{"description":"Each model includes estimated_duration_seconds derived from its current per-stage time estimates.","operationId":"V1Models_listModels","parameters":[],"responses":{"200":{"description":"List of available models for world generation"},"401":{"description":"Unauthorized"}},"security":[{"api-key":[]}],"summary":"List available models","tags":["models"],"servers":[{"url":"https://api.spaitial.ai","description":"Production"}]}},"/v1/panoramas/edit":{"post":{"description":"Fetches the panorama behind the source (a request_id / world_id you created, or a panorama_id from a previous edit), applies the prompt + optional reference images, and returns the new panorama. Iterate by passing the returned panorama_id back in as the source; create a world from the final panorama via POST /v1/worlds with input { type: \"panorama_id\" }.","operationId":"V1Panoramas_editPanorama","parameters":[{"name":"Idempotency-Key","in":"header","description":"Unique key to ensure request idempotency (max 24 hours)","required":false,"schema":{"type":"string"}}],"requestBody":{"required":true,"description":"Panorama edit request","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"source":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"request_id"},"request_id":{"type":"string","minLength":1}},"required":["type","request_id"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"world_id"},"world_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["type","world_id"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"panorama_id"},"panorama_id":{"type":"string","minLength":1}},"required":["type","panorama_id"],"additionalProperties":false}]},"prompt":{"type":"string","minLength":1,"maxLength":2000},"images":{"maxItems":3,"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"file_id"},"file_id":{"type":"string","minLength":1}},"required":["type","file_id"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"url"},"image_url":{"type":"string","format":"uri","pattern":"^https:\\/\\/.*"}},"required":["type","image_url"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"base64"},"image_base64":{"type":"string","minLength":1}},"required":["type","image_base64"],"additionalProperties":false}]}}},"required":["source","prompt"],"additionalProperties":false},"examples":{"from_request":{"summary":"Edit the panorama of a world you created","value":{"source":{"type":"request_id","request_id":"req_abc123"},"prompt":"make it night time with warm street lights"}},"iterate":{"summary":"Iterate on a previous edit","value":{"source":{"type":"panorama_id","panorama_id":"pano_def456"},"prompt":"add neon signs on the storefronts"}},"with_images":{"summary":"Edit with reference images","value":{"source":{"type":"world_id","world_id":"world-uuid"},"prompt":"match the style of the reference","images":[{"type":"url","image_url":"https://example.com/ref.jpg"}]}}}}}},"responses":{"200":{"description":"Edited panorama"},"400":{"description":"Invalid request"},"401":{"description":"Unauthorized"},"402":{"description":"Insufficient credits"},"403":{"description":"Moderation rejected"},"404":{"description":"Source not found"},"409":{"description":"Source world is not ready yet"},"410":{"description":"Source panorama has expired"},"429":{"description":"Rate limit exceeded"}},"security":[{"api-key":[]}],"summary":"Edit a panorama and return the updated panorama","tags":["panoramas"],"servers":[{"url":"https://api.spaitial.ai","description":"Production"}]}},"/v1/panoramas":{"get":{"operationId":"V1Panoramas_listPanoramas","parameters":[],"responses":{"200":{"description":"Paginated panorama list"}},"security":[{"api-key":[]}],"summary":"List panoramas created by this API key","tags":["panoramas"],"servers":[{"url":"https://api.spaitial.ai","description":"Production"}]}},"/v1/panoramas/{panoramaId}":{"get":{"operationId":"V1Panoramas_getPanorama","parameters":[{"name":"panoramaId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Panorama details"},"404":{"description":"Panorama not found"},"410":{"description":"Panorama has expired"}},"security":[{"api-key":[]}],"summary":"Get a panorama","tags":["panoramas"],"servers":[{"url":"https://api.spaitial.ai","description":"Production"}]}},"/v1/panoramas/{panoramaId}/download":{"get":{"description":"Redirects (302) to a short-lived signed download URL (~5 minutes). Re-hit this endpoint when it expires.","operationId":"V1Panoramas_downloadPanorama","parameters":[{"name":"panoramaId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"302":{"description":"Redirect to signed download URL"},"404":{"description":"Panorama not found"},"410":{"description":"Panorama has expired"}},"security":[{"api-key":[]}],"summary":"Download a panorama image","tags":["panoramas"],"servers":[{"url":"https://api.spaitial.ai","description":"Production"}]}},"/v1/captures":{"post":{"description":"Create a capture resource with an expected frame count. Safe retries with the same Idempotency-Key return the original capture_id.","operationId":"V1Captures_createCapture","parameters":[{"name":"Idempotency-Key","in":"header","description":"Stable client-generated key for this local capture","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"description":"Capture creation request","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"frame_count":{"type":"integer","minimum":1,"maximum":3000}},"required":["frame_count"],"additionalProperties":false},"examples":{"default":{"summary":"Create capture with 642 frames","value":{"frame_count":642}}}}}},"responses":{"201":{"description":"Capture created successfully"},"400":{"description":"Invalid request"},"401":{"description":"Unauthorized"}},"security":[{"api-key":[]}],"summary":"Create a new capture","tags":["captures"],"servers":[{"url":"https://api.spaitial.ai","description":"Production"}]}},"/v1/captures/process-quote":{"get":{"description":"Resolve the perspective-capture model and return its live ETA, credit cost, and API-spendable balance. Uses the same model path as POST /process.","operationId":"V1Captures_getProcessQuote","parameters":[{"name":"model","required":false,"in":"query","description":"Optional perspective-capture model alias","schema":{}}],"responses":{"200":{"description":"Live capture processing quote"},"403":{"description":"No accessible capture model"}},"security":[{"api-key":[]}],"summary":"Quote capture processing","tags":["captures"],"servers":[{"url":"https://api.spaitial.ai","description":"Production"}]}},"/v1/captures/{captureId}/upload-urls":{"post":{"description":"Request signed PUT URLs for uploading capture bundle files. Maximum 100 paths per request.","operationId":"V1Captures_getUploadUrls","parameters":[{"name":"captureId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"description":"Paths to generate upload URLs for","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"paths":{"minItems":1,"maxItems":100,"type":"array","items":{"type":"string","minLength":1}}},"required":["paths"],"additionalProperties":false},"examples":{"images":{"summary":"Image batch","value":{"paths":["images/Image_000001.jpg","images/Image_000002.jpg","images/Image_000003.jpg"]}},"metadata":{"summary":"Metadata files","value":{"paths":["cameras/camera_trajectory.json","cameras/camera_intrinsics.json","cameras/orientation.json"]}}}}}},"responses":{"200":{"description":"Signed upload URLs generated"},"400":{"description":"Invalid paths"},"404":{"description":"Capture not found"},"409":{"description":"Capture not in uploadable state"}},"security":[{"api-key":[]}],"summary":"Get signed upload URLs for capture files","tags":["captures"],"servers":[{"url":"https://api.spaitial.ai","description":"Production"}]}},"/v1/captures/{captureId}/complete":{"post":{"description":"Validate the uploaded bundle and mark the capture as uploaded. Idempotent: succeeds if already uploaded and valid.","operationId":"V1Captures_completeUpload","parameters":[{"name":"captureId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Capture validated and completed"},"400":{"description":"Validation failed"},"404":{"description":"Capture not found"},"409":{"description":"Capture not in completable state"}},"security":[{"api-key":[]}],"summary":"Complete capture upload","tags":["captures"],"servers":[{"url":"https://api.spaitial.ai","description":"Production"}]}},"/v1/captures/{captureId}/process":{"post":{"description":"Submit a validated capture for world generation. Reserves credits and returns a job reference. Requires Idempotency-Key header.","operationId":"V1Captures_processCapture","parameters":[{"name":"captureId","required":true,"in":"path","schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","description":"Unique key to ensure request idempotency (required)","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"description":"Optional processing parameters","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"model":{"type":"string"},"title":{"type":"string","maxLength":200}},"additionalProperties":false},"examples":{"empty":{"summary":"Process with defaults","value":{}},"withTitle":{"summary":"Process with custom title","value":{"title":"My Captured Space"}}}}}},"responses":{"202":{"description":"Processing started"},"400":{"description":"Invalid request"},"402":{"description":"Insufficient credits"},"404":{"description":"Capture not found"},"409":{"description":"Capture not ready or idempotency conflict"}},"security":[{"api-key":[]}],"summary":"Process capture into a world","tags":["captures"],"servers":[{"url":"https://api.spaitial.ai","description":"Production"}]}},"/v1/captures/{captureId}":{"get":{"description":"Returns the capture resource state. Use GET /v1/worlds/requests/:request_id/status for job progress after processing.","operationId":"V1Captures_getCapture","parameters":[{"name":"captureId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Capture details"},"404":{"description":"Capture not found"}},"security":[{"api-key":[]}],"summary":"Get capture status","tags":["captures"],"servers":[{"url":"https://api.spaitial.ai","description":"Production"}]}}},"info":{"title":"SpAItial Developer API","description":"Programmatic API for generating 3D worlds. See the [Getting Started guide](https://docs.spaitial.ai/api/getting-started) for authentication and usage examples.","version":"1.0.0","contact":{}},"tags":[{"name":"worlds","description":"World generation endpoints"},{"name":"files","description":"File upload endpoints"},{"name":"models","description":"Model discovery endpoints"}],"servers":[{"url":"https://api.spaitial.ai","description":"Production"}],"components":{"securitySchemes":{"api-key":{"scheme":"bearer","bearerFormat":"API Key","type":"http","description":"API key issued by the developers site. Example: spt_live_abc123..."}},"schemas":{}}}