{"openapi":"3.1.0","info":{"title":"Web Blockbench — Platphorm Model API","version":"1.0.0","description":"REST API for saving, listing, and exporting machine-readable 3D box models. Part of the platphorm network (blockbench.platphormnews.com)."},"servers":[{"url":"https://blockbench.platphormnews.com","description":"Vercel UI and model API"},{"url":"https://blockbench.innovativefuturesolutions.com","description":"Cloudflare realtime and asset API"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-PlatPhorm-API-Key","description":"Shared PLATPHORM_API_KEY; mutations and protected model access require this header or Authorization: Bearer."}},"schemas":{"Element":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"from":{"type":"array","items":{"type":"number"},"minItems":3,"maxItems":3},"to":{"type":"array","items":{"type":"number"},"minItems":3,"maxItems":3},"origin":{"type":"array","items":{"type":"number"},"minItems":3,"maxItems":3},"rotation":{"type":"array","items":{"type":"number"},"minItems":3,"maxItems":3},"color":{"type":"string","example":"#5ac8fa"},"visible":{"type":"boolean"}}}}},"paths":{"/api/health":{"get":{"summary":"Service health","security":[],"responses":{"200":{"description":"OK"}}}},"/api/v1/health":{"get":{"summary":"Versioned service health","security":[],"responses":{"200":{"description":"OK"}}}},"/api/v1/models":{"get":{"summary":"List models","parameters":[{"name":"limit","in":"query","schema":{"type":"integer","default":25}},{"name":"offset","in":"query","schema":{"type":"integer","default":0}}],"responses":{"200":{"description":"A page of models"}}},"post":{"summary":"Create/save a model","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name"],"properties":{"name":{"type":"string"},"elements":{"type":"array","items":{"$ref":"#/components/schemas/Element"}},"metadata":{"type":"object"}}}}}},"responses":{"201":{"description":"Created"}}}},"/api/v1/models/{id}":{"get":{"summary":"Get a model (by id or slug)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"format","in":"query","schema":{"type":"string","enum":["json","bbmodel","obj"],"default":"json"}}],"responses":{"200":{"description":"The model, or an export file"},"404":{"description":"Not found"}}},"put":{"summary":"Update a model","responses":{"200":{"description":"Updated"}}},"delete":{"summary":"Delete a model","responses":{"200":{"description":"Deleted"}}}},"/api/v1/sessions/{sessionId}":{"get":{"summary":"Open a realtime session","description":"Upgrade to a WebSocket for ordered session events. The session is tenant-scoped and requires PLATPHORM_API_KEY.","parameters":[{"name":"sessionId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"101":{"description":"WebSocket upgrade"},"401":{"description":"Unauthorized"}}},"post":{"summary":"Publish a realtime session event","parameters":[{"name":"sessionId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["type","payload"],"properties":{"type":{"type":"string"},"payload":{}}}}}},"responses":{"200":{"description":"Event sequence assigned"},"401":{"description":"Unauthorized"}}}},"/api/v1/uploads":{"post":{"summary":"Start a resumable R2 multipart upload","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["filename","contentType"],"properties":{"filename":{"type":"string"},"contentType":{"type":"string"}}}}}},"responses":{"201":{"description":"Upload session created"},"401":{"description":"Unauthorized"}}}},"/api/v1/uploads/{uploadId}":{"put":{"summary":"Upload one 10 MB multipart part","parameters":[{"name":"uploadId","in":"path","required":true,"schema":{"type":"string"}},{"name":"key","in":"query","required":true,"schema":{"type":"string"}},{"name":"part","in":"query","required":true,"schema":{"type":"integer","minimum":1,"maximum":10000}}],"requestBody":{"required":true,"content":{"application/octet-stream":{"schema":{"type":"string","format":"binary"}}}},"responses":{"200":{"description":"Part uploaded"},"401":{"description":"Unauthorized"},"413":{"description":"Part too large"}}},"post":{"summary":"Complete a multipart upload","parameters":[{"name":"uploadId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["parts"],"properties":{"parts":{"type":"array","items":{"type":"object","required":["partNumber","etag"],"properties":{"partNumber":{"type":"integer"},"etag":{"type":"string"}}}}}}}}},"responses":{"200":{"description":"Upload completed"},"401":{"description":"Unauthorized"}}},"delete":{"summary":"Abort a multipart upload","parameters":[{"name":"uploadId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Upload aborted"},"401":{"description":"Unauthorized"}}}},"/api/mcp":{"post":{"summary":"MCP (JSON-RPC 2.0) endpoint","description":"Model Context Protocol server exposing list_models, get_model, save_model, delete_model tools.","responses":{"200":{"description":"JSON-RPC result"}}}}}}