Limits and performance
Read this page as Markdown · All docs for AI agents
Your world must fit every applicable budget. Decimal MB means 1,000,000 bytes.
| Limit | Maximum |
|---|---|
| Placed entities | 1,000,000 |
| Estimated runtime memory | 500 MB |
| Total world download | 100 MB |
| JSON save request, including the world manifest | 64 MB |
| Creator uploaded asset library | 100 MB |
| Files in your model and panorama library | 512 |
| Prop upload attempts | 60 per rolling hour |
| Panorama upload attempts | 12 per rolling hour |
| Draft save attempts | 300 per hour, up to 512 MB of submitted documents |
| MCP JSON request | 20 MB; use the HTTP draft route for larger documents |
| Individual GLB, before and after conversion | 4 MB |
| Placed triangles, including repeated instances | 20,000,000 |
| Decoded texture pixels per world | 32,000,000 |
| Prop render batches | 2,000 |
| Players in one world | 50 |
| Worlds per creator | 3 |
| Upserts / removals in one MCP edit | 1,000 each |
Read the budget after saving
Draft saves return a budget object. Track entities, bytes and memoryBytes as your AI builds. bytes counts the manifest, a standard-asset allowance and each distinct uploaded GLB once. memoryBytes estimates runtime cost from entities, instance data, collision data, decoded geometry and textures. Your device's actual memory use varies.
Repeated placements reuse an asset's download, geometry and textures. Each placement still adds entity data, instance memory and rendered triangles. A world can reach its memory or download budget before its entity limit.
Prop batches group copies of the same asset within an 8 × 7 × 8 spatial cell. Each mesh/material part adds a batch. Check budget.propBatches after saving; spread-out, multi-material models can reach this limit before the triangle budget.
Upload attempts include failed conversions. Browser, HTTP and MCP uploads share your creator allowance. Send original bytes without HTTP Content-Encoding. Finish sending each request within 30 seconds. When the API returns 429, respect retryAt or Retry-After; do not retry in a loop. A 503 means processing or storage capacity is temporarily unavailable. Asset downloads also share per-client and server byte/concurrency budgets. Keep immutable asset URLs cached and use their ETag for conditional requests.
See the World HTTP API for save responses and world format for document fields. Current values are also available as limits.json.
Build for phones as well as desktop
- Reuse GLBs for repeated furniture, trees and architectural pieces.
- Use a few broad meshes for floors and walls, and keep material counts small.
- Combine related textures into compact atlases.
- Keep walkways clear and avoid layers of overlapping geometry.
- Preview your world on your target devices as you build.
Props render in spatial groups with shared geometry and materials. Their collision follows oriented bounding boxes; split an arch into separate solid pieces when players need to walk through it.
Loading and empty worlds
Players download your published document and assets with a progress screen before joining. Cached assets can speed up return visits. Switching worlds releases the previous 3D scene's rendering resources.
Empty worlds remain saved and discoverable. Their full scenes and transient room state are unloaded when nobody is playing. Your AI can still download and edit a saved draft. Accepted bets finish settling even if their players leave.
Terrain and panoramas
Generated terrain is 128–512 units wide with a fixed 192 × 192 grid. A panorama accepts up to 12 MB input and 8 MB canonical WebP output, up to 8192 × 4096 dimensions within a 16,777,216-pixel cap. Models and converted images share the 100 MB library quota. Referenced backgrounds count toward world download, texture and memory limits; generated terrain counts toward geometry and memory. See terrain and backgrounds for the complete contract.