Roblox Open Cloud
cloudManage Roblox Open Cloud from Studio: access datastores, publish places, run Luau scripts, upload assets, enforce restrictions, and notify users.
Instructions
Roblox Open Cloud for the place open in Studio. IDs default to the connected session (universe = game.GameId, place = game.PlaceId, creator = the place owner); pass universe_id / place_id / id / creator only to override. Needs an API key: env ROBLOX_OPEN_CLOUD_KEY or /opencloud.json {"key":"…"}, re-read every call and never returned. A 403 names the exact Creator Hub permission to add — or call info what:"key" first: it probes the key and reports allowed | denied | unknown per action. action (ops in parens; arg help is on each field):
datastore (list_stores|list_entries|get|set|delete|increment), ordered (list|get|set|delete|increment): persistent entries; etag makes a set conditional.
memory (map_list|map_get|map_set|map_delete|queue_add|queue_read|queue_discard): MemoryStore sorted maps + queues, fast cross-server state with a ttl.
message: topic + message (≤1 KB) → MessagingService in live servers, not playtests.
info (universe|place|group|user|me|key|memberships|roles|inventory|subscription): reads. key = the capability probe.
publish: uploads a local .rbxl/.rbxlx as the place's new live version. Do this before luau / instance, which read the PUBLISHED place, never the Studio session.
asset_upload: file + asset_type (Model|Decal|Audio|Video|Animation|Mesh|Image) → asset_id + moderation. asset (get|update|versions|rollback|archive|restore): the rest of the lifecycle; update puts a new .fbx behind an existing Model asset_id.
luau: runs a script in a fresh server copy of the published place; returns results + logs.
instance (get|update|children): read/edit instances of the published place ("root" = the DataModel). For the OPEN place use the run tool.
restriction (list|get|ban|unban|logs): ban a user from the experience or one place.
notify: send an experience notification to a user (message_id = a Creator Hub template). Results are JSON ≤ 20 KB; long calls return pending: true + a re-poll handle after timeout_ms.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | info group/user/inventory/subscription: id; restriction: the player’s user id; notify: the user to notify | |
| op | No | datastore: list_stores|list_entries|get|set|delete|increment; ordered: list|get|set|delete|increment; memory: map_list|map_get|map_set|map_delete|queue_add|queue_read|queue_discard; asset: get|update|versions|rollback|archive|restore; restriction: list|get|ban|unban|logs; instance: get|update|children | |
| key | No | datastore/ordered/memory map: entry or item key | |
| deep | No | info key: also probe writes that a delete against a reserved name can settle (nothing real is deleted) | |
| etag | No | datastore set: write only if the entry still has this etag (from get) | |
| file | No | asset_upload / asset update (.fbx Models only) / publish: absolute path of the file | |
| name | No | asset_upload / asset update: display name | |
| task | No | luau: re-poll an earlier task path instead of creating one | |
| what | No | info: universe | place | group | user | me (owner of the open place) | key (what this API key may do) | memberships | roles | inventory | subscription | |
| count | No | memory queue_read: how many items to read (default 1, max 200) | |
| level | No | restriction: "universe" (default, the whole experience) or "place" (one place only) | |
| scope | No | datastore: scope (omit = global); ordered: scope (default global) | |
| store | No | datastore/ordered: data store name; memory: the sorted map or queue name (created by its first write) | |
| topic | No | message: MessagingService topic (≤ 80 chars) | |
| ttl_s | No | memory map_set / queue_add: how long the item lives, in seconds | |
| users | No | datastore set/increment: user ids the value belongs to | |
| value | No | set ops: JSON value (ordered: integer; memory queue_add: the item payload) | |
| action | Yes | ||
| amount | No | increment: integer amount to add (negative allowed) | |
| filter | No | list_entries: id.startsWith("prefix"); ordered list: entry >= 10 && entry <= 30; memory map_list: sortKey > 100 (NOT numericSortKey); restriction logs: user == "users/156"; info memberships/inventory: see the reference | |
| reason | No | restriction ban: the private moderation note (not shown to the player) | |
| script | No | luau: Luau source run server-side in a fresh copy of the published place | |
| creator | No | asset_upload: owner (default: owner of the open place) | |
| message | No | message: string or JSON (≤ 1 KB) | |
| read_id | No | memory queue_discard: the read_id from queue_read — a whole read batch is acknowledged at once | |
| version | No | asset rollback: the version number to restore (from asset versions) | |
| asset_id | No | asset ops: the asset to act on | |
| order_by | No | ordered list: "value desc" (default ascending); memory map_list: only "id" / "id desc" | |
| place_id | No | override: place (default game.PlaceId of the open place) | |
| priority | No | memory queue_add: higher runs closer to the front (equal priorities keep insertion order) | |
| sort_key | No | memory map_set: sort key — a number sorts numerically, a string alphabetically | |
| page_size | No | list ops: page size (memory and restrictions cap at 100, asset versions at 50) | |
| read_mask | No | asset get: comma-separated extra metadata fields to return | |
| asset_type | No | asset_upload: Model | Decal | Audio | Video | Animation | Mesh (also Image) | |
| attributes | No | datastore set/increment: metadata object | |
| class_name | No | instance update: Folder | Script | LocalScript | ModuleScript — the only classes this API can write | |
| duration_s | No | restriction ban: length in seconds; omit entirely for a permanent ban | |
| message_id | No | notify: the notification string id from Creator Hub | |
| page_token | No | list ops: nextPageToken from the previous page | |
| parameters | No | notify: values for the {placeholders} in the notification string (string or integer each) | |
| product_id | No | info subscription: the subscription product id | |
| properties | No | instance update: PascalCase properties, e.g. {"Source":"print(1)"} or {"Enabled":false} | |
| timeout_ms | No | long calls: how long to wait (default 60000, max 300000) | |
| description | No | asset_upload / asset update: description | |
| instance_id | No | instance: the instance to act on; "root" (default) is the DataModel | |
| launch_data | No | notify: launch data carried into the experience when the player taps (≤ 200 bytes) | |
| universe_id | No | override: universe (default game.GameId of the open place) | |
| exclude_alts | No | restriction ban: do not extend the ban to detected alt accounts | |
| operation_id | No | asset_upload: re-poll an earlier upload operation instead of uploading | |
| show_deleted | No | datastore list ops: include deleted | |
| version_type | No | publish: "Published" (default, goes live) or "Saved" (stored as a version without publishing) | |
| all_or_nothing | No | memory queue_read: return nothing (404) unless the full count is available | |
| display_reason | No | restriction ban: the message the banned player sees | |
| invisibility_s | No | memory queue_read: seconds the read items stay hidden from other readers before reappearing | |
| analytics_category | No | notify: analytics category for this notification |