Developer documentation

Install the SDK, create a key, and ship live Roblox infrastructure.

This is the canonical implementation guide for Roblox APIs v1: authentication, Studio setup, endpoint behavior, error handling, storage quotas, and operational conventions.

v1 Live

Base URL

https://robloxapis.com

All production routes require a live API key. Browser account sessions are separate from in-game API authentication.

Quickstart

Run a live API self-test inside Roblox Studio.

  1. 1

    Create an account, verify email, set a password, and enable Google Authenticator from Security.

  2. 2

    Create a live key from Keys. The raw key is shown once, then stored only as a hash on the VPS.

  3. 3

    Add the Lua SDK as a ModuleScript named RobloxAPIs in ServerScriptService.

  4. 4

    Call RunStudioSelfTests from a server script to validate safe write/read flows across the live APIs.

local HttpService = game:GetService("HttpService")
local RobloxAPIs = require(script.RobloxAPIs)

local client = RobloxAPIs.new("rba_sk_live_your_key")

local summary, err = client:RunStudioSelfTests({
  userId = 156,
  renderSign = true
})

if err then
  warn("RobloxAPIs self-test failed to start", err.statusCode)
  return
end

print(HttpService:JSONEncode(summary))

Install SDK

Roblox Lua ModuleScript

The SDK is hosted at /sdk/robloxapis.lua. Paste it into a ModuleScript named RobloxAPIs. Server-side placement is recommended so live keys never enter client scripts.

Placement

ServerScriptService

Use server scripts for authenticated calls. Never expose production keys to LocalScripts.

Network

HttpService

Enable HTTP requests for the experience before using live API routes.

Version

v1 Routes

All current SDK methods target /api/v1/... and return JSON.

Studio self-test

One call validates the current live API surface.

RunStudioSelfTests writes temporary test data, reads it back, and cleans up the records that should not remain active. It currently covers Experience Config, Storage Vault, Cross-Game Ban, Trade Guard, Receipt Ledger, Entitlement Mirror, Inventory Snapshot, Quest Templates, Progression Cloud, Group Sync, Economy Guard, Session Analytics, Feature Flags, Player Segments, Leaderboards, Cooldowns, Webhook Events, Live Messaging, Matchmaking Queue, and Server Directory.

CheckWhat it proves
Experience ConfigA game server can store config, fetch it, and render it as an in-world sign.
Storage VaultJSON objects can be stored, fetched, and deleted under the shared workspace quota.
Cross-Game BanA temporary scoped ban can be created, detected, and revoked.
Trade GuardA fake trade can be scored once, detected as duplicate, and looked up by trade id.
Receipt LedgerA fake receipt ID is granted once and detected as duplicate on the second call.
Entitlement MirrorA scoped VIP-style entitlement is granted, checked, listed, and revoked.
Inventory SnapshotAn item is saved, equipped into a loadout slot, fetched, listed, and deleted.
Quest TemplatesA reusable quest is saved, assigned to a user, progressed to completion, listed, and cleaned up.
Progression CloudQuest progress, XP, and claimed rewards can be updated and read back.
Group SyncA sample policy can be stored for a group policy graph.
Economy GuardAn economy event is scored and archived.
Session AnalyticsSession events are written, summarized, listed for a player, and deleted.
Feature FlagsA temporary experiment is saved, assigned to a player, exposed, listed, and deleted.
Player SegmentsTemporary manual and rule-based cohorts are saved, evaluated for a player, listed, and deleted.
LeaderboardsA temporary board is saved, scores are submitted, top entries and rank are read, and the board is deleted.
CooldownsA temporary daily reward cooldown is saved, first claim succeeds, duplicate claim is blocked, reset is verified, and the rule is deleted.
Webhook EventsA live ops event is accepted into the event stream.
Live MessagingA short-lived message can be published, polled, read, and revoked.
Matchmaking QueueA party ticket can be created, matched, listed, looked up, and cancelled.
Server DirectoryA live server heartbeat can be saved, listed, read, and removed.

Authentication

API keys are separate from website sessions.

In-game requests authenticate with either an Authorization bearer token or an X-API-Key header.

Authorization: Bearer rba_sk_live_your_key
X-API-Key: rba_sk_live_your_key
ControlBehavior
One-time revealRaw keys are shown only at creation time.
HashingKeys are stored as HMAC hashes using the server secret.
2FA gateKey creation requires Google Authenticator enabled.
Shared storageStorage is pooled at the workspace plan level. Keys track request counts and last-used timestamps.

Physically testable API

Experience Config API

This API stores a live configuration payload and reads it back from Roblox Studio. The SDK helper can render that payload onto a sign so the test is visible in the game world.

client:SetExperienceConfig("studio-sign", {
  title = "Roblox APIs Live Test",
  message = "Fetched live from robloxapis.com",
  accent = "#20E3B2",
  variant = "success"
})

local rendered, err = client:ApplyExperienceConfigSign("studio-sign", {
  position = Vector3.new(0, 6, 0)
})

Trade safety

Trade Guard API

Trade Guard verifies a player-to-player trade before the game finalizes it. It stores the trade id once, detects duplicate submissions, scores suspicious value imbalance or rapid trade velocity, and returns a decision the server can enforce.

local RobloxAPIs = require(script.RobloxAPIs)

local client = RobloxAPIs.new("rba_sk_live_your_key")

local result, err = client:VerifyTrade({
  tradeId = tradeId,
  fromUserId = sender.UserId,
  toUserId = receiver.UserId,
  offeredItems = {
    { itemId = "crystal_sword", quantity = 1, value = 1200 }
  },
  requestedItems = {
    { itemId = "gold_pack", quantity = 1, value = 900 }
  }
})

if err or result.decision == "block" or result.decision == "review" then
  return false
end

Monetization safety

Receipt Ledger API

Receipt Ledger stores developer product receipts once. The first verification returns duplicate: false; later calls with the same purchase id return duplicate: true so grants stay idempotent.

local MarketplaceService = game:GetService("MarketplaceService")
local RobloxAPIs = require(script.RobloxAPIs)

local client = RobloxAPIs.new("rba_sk_live_your_key")

MarketplaceService.ProcessReceipt = function(receiptInfo)
  local result, err = client:VerifyReceipt(receiptInfo, {
    grant = "vip_pack",
    metadata = { source = "ProcessReceipt" }
  })

  if err then
    return Enum.ProductPurchaseDecision.NotProcessedYet
  end

  if not result.duplicate then
    -- Grant the product here.
  end

  return Enum.ProductPurchaseDecision.PurchaseGranted
end

Shared player inventory

Inventory Snapshot API

Inventory Snapshot mirrors item ownership, quantities, attributes, metadata, and equipped loadout slots under the shared workspace quota. Use it when multiple places need the same player inventory view without duplicating item state in every experience.

local RobloxAPIs = require(script.RobloxAPIs)

local client = RobloxAPIs.new("rba_sk_live_your_key")

client:SetInventoryItem(player.UserId, "crystal-sword", {
  type = "weapon",
  quantity = 1,
  attributes = {
    rarity = "rare",
    power = 120
  }
})

client:UpdateInventoryItem(player.UserId, "crystal-sword", {
  equipped = true,
  loadoutSlot = "primary"
})

local inventory, err = client:ListInventory(player.UserId, {
  itemType = "weapon",
  equipped = true
})

In-game telemetry

Session Analytics API

Session Analytics stores player and server events with session ids, event types, numeric values, and custom properties. Use it for round completion, onboarding funnels, retention signals, map performance, and other server-authored events that should be queryable outside Roblox DataStores.

local RobloxAPIs = require(script.RobloxAPIs)

local client = RobloxAPIs.new("rba_sk_live_your_key")

client:TrackAnalyticsEvents({
  {
    eventId = "join_" .. player.UserId .. "_" .. game.JobId,
    userId = player.UserId,
    sessionId = game.JobId,
    eventType = "session_started",
    value = 1,
    properties = {
      map = workspace:GetAttribute("MapName")
    }
  },
  {
    eventId = "round_" .. player.UserId .. "_" .. os.time(),
    userId = player.UserId,
    sessionId = game.JobId,
    eventType = "round_completed",
    value = 120,
    properties = {
      result = "win"
    }
  }
})

local summary, err = client:GetAnalyticsSummary({
  sessionId = game.JobId,
  sinceMinutes = 60
})

Experiments and live ops

Feature Flags API

Feature Flags stores rollout definitions and returns deterministic player assignments. Use it for A/B tests, seasonal toggles, economy tuning, UI variants, beta access, and emergency kill switches without publishing a new Roblox build.

local RobloxAPIs = require(script.RobloxAPIs)

local client = RobloxAPIs.new("rba_sk_live_your_key")

client:SetFeatureFlag("double-xp", {
  enabled = true,
  defaultVariant = "control",
  rolloutPercent = 50,
  variants = {
    { key = "control", weight = 50, payload = { multiplier = 1 } },
    { key = "treatment", weight = 50, payload = { multiplier = 2 } }
  }
})

local result, err = client:GetFeatureAssignment("double-xp", player.UserId)
if not err then
  local assignment = result.assignment
  player:SetAttribute("XpMultiplier", assignment.payload.multiplier or 1)

  client:TrackFeatureExposure("double-xp", {
    exposureId = "double-xp-" .. player.UserId .. "-" .. game.JobId,
    userId = player.UserId,
    variant = assignment.variant,
    sessionId = game.JobId
  })
end

Cohorts and targeting

Player Segments API

Player Segments lets a game evaluate reusable cohorts in one request. Use it for VIP access, beta groups, event targeting, returning-player bonuses, risk buckets, high-level matchmaking pools, or targeted Feature Flags rollouts.

  • Player Segments API allows manual memberships for hand-picked users.
  • Player Segments API allows rule-based cohorts using traits like level, region, spend, accountAgeDays, or nested paths like stats.wins.
  • Player Segments API allows one in-game call to evaluate several segments and return the matched segment keys.
  • Player Segments API allows temporary membership with expiration timestamps for events, private tests, or limited access.
local RobloxAPIs = require(script.RobloxAPIs)

local client = RobloxAPIs.new("rba_sk_live_your_key")

client:SetSegment("level-10-plus", {
  name = "Level 10+",
  enabled = true,
  rules = {
    mode = "all",
    conditions = {
      { trait = "level", op = "gte", value = 10 },
      { trait = "region", op = "in", value = { "na", "eu" } }
    }
  }
})

local result, err = client:EvaluateSegments(player.UserId, {
  segments = { "vip", "level-10-plus" },
  traits = {
    level = player:GetAttribute("Level") or 1,
    region = player:GetAttribute("Region") or "na"
  }
})

if not err and table.find(result.matches, "level-10-plus") then
  player:SetAttribute("EligibleForHardMode", true)
end

Competition and ranking

Leaderboards API

Leaderboards stores board definitions and player scores so Roblox servers can submit results, show top lists, and fetch a player's current rank without building ranking infrastructure from scratch.

  • Leaderboards API allows seasonal, event, global, ranked-mode, or custom board definitions.
  • Leaderboards API allows best-score, latest-score, or additive score behavior.
  • Leaderboards API allows top-list reads for lobby UI, reward screens, and event boards.
  • Leaderboards API allows player rank lookups immediately after a score update.
local RobloxAPIs = require(script.RobloxAPIs)

local client = RobloxAPIs.new("rba_sk_live_your_key")

client:SetLeaderboard("season-wins", {
  name = "Season Wins",
  sortOrder = "desc",
  scoreMode = "best",
  scoreType = "wins",
  resetInterval = "seasonal"
})

local result, err = client:SubmitLeaderboardScore("season-wins", player.UserId, wins, {
  displayName = player.Name,
  metadata = {
    mode = "ranked",
    season = "s1"
  }
})

if not err then
  print("Rank", result.entry.rank)
end

local top = client:GetLeaderboardTop("season-wins", { limit = 10 })

Timers and rewards

Cooldowns API

Cooldowns stores reusable timer rules and per-player claim state so Roblox servers can safely enforce daily rewards, spin wheels, ability timers, shop claims, and mission resets across every place in a universe network.

  • Cooldowns API allows reusable rules with duration, scope, metadata, and enabled state.
  • Cooldowns API allows one claim call to either grant the reward or return the remaining lockout time.
  • Cooldowns API allows player cooldown status reads for UI countdowns and lobby reminders.
  • Cooldowns API allows cooldown resets for moderation, support grants, testing, and seasonal migrations.
local RobloxAPIs = require(script.RobloxAPIs)

local client = RobloxAPIs.new("rba_sk_live_your_key")

client:SetCooldown("daily-reward", {
  name = "Daily Reward",
  durationSeconds = 86400,
  scope = "daily-reward"
})

local result, err = client:ClaimCooldown("daily-reward", player.UserId, {
  metadata = {
    reward = "coins_250",
    serverJobId = game.JobId
  }
})

if err then
  warn("Cooldown claim failed", err.statusCode)
elseif result.claimed then
  -- Grant the daily reward here.
else
  player:SetAttribute("RewardSecondsLeft", result.cooldown.remainingSeconds)
end

In-game progression

Progression Cloud API

Progression Cloud stores player level, XP, streaks, quests, and claimed rewards by season. Use PATCH for small in-game updates like quest progress or streak changes.

local RobloxAPIs = require(script.RobloxAPIs)

local client = RobloxAPIs.new("rba_sk_live_your_key")

client:SetProgression(player.UserId, {
  season = "s1",
  level = 1,
  xp = 0,
  quests = {
    daily_win = { progress = 0, goal = 2 }
  }
})

local updated, err = client:UpdateProgression(player.UserId, {
  season = "s1",
  quest = "daily_win",
  progress = 1,
  goal = 2,
  incrementXp = true,
  xp = 150
})

Policy graph

Group Sync API

Group Sync stores moderation and role policy for Roblox groups connected to a studio workflow. It is useful for shared moderator roles, linked universe lists, and deciding whether Cross-Game Ban enforcement should apply to a group network.

client:SetGroupPolicy(123456, {
  enforceCrossGameBans = true,
  trustedRoles = { "Admin", "Moderator" },
  linkedUniverses = { tostring(game.GameId) },
  notes = "Production policy"
})

Cross-server operations

Live Messaging API

Live Messaging stores short-lived announcements, event toggles, shutdown warnings, or admin broadcasts that game servers can poll by topic. Messages can be scoped by universe or server job, and revoked when an operation changes.

local RobloxAPIs = require(script.RobloxAPIs)

local client = RobloxAPIs.new("rba_sk_live_your_key")

client:PublishLiveMessage("event.double_xp", {
  enabled = true,
  minutes = 30
}, {
  priority = "high",
  ttlSeconds = 1800
})

local inbox, err = client:PollLiveMessages({
  topic = "event.double_xp",
  limit = 10
})

if not err then
  for _, message in ipairs(inbox.messages) do
    print(message.topic, message.payload.enabled)
  end
end

Queue handoff

Matchmaking Queue API

Matchmaking Queue creates short-lived party tickets with mode, region, skill, and party metadata. The API returns either a queued state or a matched handoff object that your server can use to coordinate the next teleport or server reservation step.

local RobloxAPIs = require(script.RobloxAPIs)

local client = RobloxAPIs.new("rba_sk_live_your_key")

local ticket, err = client:CreateMatchmakingTicket(player.UserId, {
  partyId = "party-123",
  party = {
    { userId = player.UserId, role = "leader", ready = true }
  },
  mode = "ranked_2v2",
  region = "auto",
  skill = 1200,
  autoMatch = true
})

if not err and ticket.ticket.status == "matched" then
  print(ticket.ticket.matchId, ticket.ticket.reservedServerCode)
end

API reference

Current v1 routes

MethodRoutePurpose
PUT/api/v1/experience/configs/{configKey}Store live config for Studio or game servers.
GET/api/v1/experience/configs/{configKey}Fetch stored config payload.
POST/api/v1/cross-ban/checkCheck moderation state for a Roblox user.
POST/api/v1/cross-ban/bansCreate or update an active ban record.
GET/api/v1/cross-ban/bansList active ban records for the workspace.
DELETE/api/v1/cross-ban/bans/{banId}Revoke one active ban record.
GET/api/v1/intel/users/{userId}Read risk and policy metadata for a player.
PUT/api/v1/vault/objects/{objectKey}Store arbitrary JSON against the API key owner.
GET/api/v1/vault/objects/{objectKey}Read a stored JSON object.
DELETE/api/v1/vault/objects/{objectKey}Delete a stored JSON object.
POST/api/v1/economy/signalsArchive an economy event and risk score.
POST/api/v1/analytics/eventsStore one or many player/session telemetry events.
GET/api/v1/analytics/summaryRead event counts, unique users, sessions, and grouped event-type metrics.
GET/api/v1/analytics/users/{userId}/eventsList recent analytics events for one Roblox user.
DELETE/api/v1/analytics/events/{eventId}Delete one stored analytics event, mainly for cleanup or bad emits.
GET/api/v1/flagsList feature flags, optionally filtered to enabled or disabled definitions.
GET/api/v1/flags/{flagKey}Read one feature flag definition and rollout configuration.
PUT/api/v1/flags/{flagKey}Create or replace a deterministic feature flag with variants and rollout percent.
DELETE/api/v1/flags/{flagKey}Delete one feature flag and its exposure records.
GET/api/v1/flags/{flagKey}/assignments/{userId}Get the deterministic variant assignment for one Roblox user.
POST/api/v1/flags/{flagKey}/exposuresRecord that a user saw or used an assigned variant.
GET/api/v1/segmentsList player segment definitions, optionally filtered by enabled state.
POST/api/v1/segments/evaluateEvaluate one player against selected manual and rule-based cohorts.
GET/api/v1/segments/{segmentKey}Read one player segment definition and active sample members.
PUT/api/v1/segments/{segmentKey}Create or replace a player segment with rules and metadata.
DELETE/api/v1/segments/{segmentKey}Delete one player segment and its member records.
PUT/api/v1/segments/{segmentKey}/users/{userId}Add or replace a manual member for one segment.
DELETE/api/v1/segments/{segmentKey}/users/{userId}Remove a manual member from one segment.
GET/api/v1/leaderboardsList leaderboard definitions and entry counts.
GET/api/v1/leaderboards/{boardKey}Read one leaderboard definition.
PUT/api/v1/leaderboards/{boardKey}Create or replace a leaderboard definition.
DELETE/api/v1/leaderboards/{boardKey}Delete one leaderboard and all of its score entries.
GET/api/v1/leaderboards/{boardKey}/topRead ranked top entries for a board.
GET/api/v1/leaderboards/{boardKey}/rank/{userId}Read one player's current rank and score.
PUT/api/v1/leaderboards/{boardKey}/scores/{userId}Submit or update one player's score.
DELETE/api/v1/leaderboards/{boardKey}/scores/{userId}Delete one player's score entry.
GET/api/v1/cooldownsList cooldown rules and active state counts.
GET/api/v1/cooldowns/{cooldownKey}Read one cooldown rule definition.
PUT/api/v1/cooldowns/{cooldownKey}Create or replace a cooldown rule.
DELETE/api/v1/cooldowns/{cooldownKey}Delete one cooldown rule and its player states.
GET/api/v1/cooldowns/users/{userId}List active cooldown states for one Roblox user.
GET/api/v1/cooldowns/{cooldownKey}/users/{userId}Read whether one player can claim a cooldown.
POST/api/v1/cooldowns/{cooldownKey}/users/{userId}/claimClaim a cooldown if available or return the remaining seconds.
DELETE/api/v1/cooldowns/{cooldownKey}/users/{userId}Reset one player's cooldown state.
POST/api/v1/trades/verifyVerify and score a player-to-player trade before finalization.
GET/api/v1/trades/{tradeId}Read a stored trade decision and item snapshot.
POST/api/v1/receipts/verifyVerify and store a developer product receipt once.
GET/api/v1/receipts/{receiptId}Read a stored receipt ledger entry.
POST/api/v1/entitlements/grantGrant or update a mirrored pass, VIP flag, subscription, bundle, or cosmetic.
POST/api/v1/entitlements/checkCheck one or many entitlements for a player with optional scope matching.
GET/api/v1/entitlements/users/{userId}List mirrored entitlements for one Roblox user.
PUT/api/v1/entitlements/users/{userId}/{entitlementId}Upsert a specific scoped entitlement for one user.
DELETE/api/v1/entitlements/users/{userId}/{entitlementId}Revoke a specific scoped entitlement for one user.
GET/api/v1/inventory/users/{userId}List active player inventory items by type, equipped state, slot, or status.
GET/api/v1/inventory/users/{userId}/items/{itemId}Read one mirrored inventory item.
PUT/api/v1/inventory/users/{userId}/items/{itemId}Create or replace an item snapshot with quantity, attributes, metadata, and loadout state.
PATCH/api/v1/inventory/users/{userId}/items/{itemId}Update item quantity, equipped state, loadout slot, attributes, or metadata.
DELETE/api/v1/inventory/users/{userId}/items/{itemId}Remove one item from the active inventory snapshot.
GET/api/v1/quests/templatesList reusable quest templates by season, cadence, tag, or active status.
GET/api/v1/quests/templates/{templateKey}Read one reusable quest template.
PUT/api/v1/quests/templates/{templateKey}Create or update a daily, weekly, seasonal, event, or custom quest template.
DELETE/api/v1/quests/templates/{templateKey}Deactivate one quest template.
POST/api/v1/quests/assignmentsAssign a template to a player with starter progress.
GET/api/v1/quests/assignments/users/{userId}List a player's quest assignments.
GET/api/v1/quests/assignments/{assignmentId}Read one quest assignment.
PATCH/api/v1/quests/assignments/{assignmentId}Update objective progress, status, metadata, or claimed rewards.
DELETE/api/v1/quests/assignments/{assignmentId}Delete one quest assignment.
GET/api/v1/progression/users/{userId}Fetch stored seasonal player progression.
PUT/api/v1/progression/users/{userId}Replace a player's seasonal progression profile.
PATCH/api/v1/progression/users/{userId}Apply quest, XP, streak, reward, or flag updates.
DELETE/api/v1/progression/users/{userId}Delete one seasonal progression profile.
POST/api/v1/webhooks/eventsStore live ops events for downstream delivery.
POST/api/v1/live-messages/publishPublish a short-lived message for game servers.
GET/api/v1/live-messages/pollPoll active messages by topic, universe, server, or timestamp.
GET/api/v1/live-messages/{messageId}Read one stored live message.
DELETE/api/v1/live-messages/{messageId}Revoke one active live message.
POST/api/v1/matchmaking/ticketsCreate a short-lived party ticket and optional match handoff.
GET/api/v1/matchmaking/ticketsList matchmaking tickets by status, mode, or player.
GET/api/v1/matchmaking/tickets/{ticketId}Read one matchmaking ticket.
DELETE/api/v1/matchmaking/tickets/{ticketId}Cancel one matchmaking ticket.
POST/api/v1/servers/heartbeatRegister or refresh a live game server directory entry.
GET/api/v1/serversList active servers by mode, region, universe, place, or status.
GET/api/v1/servers/{serverId}Read one live server directory entry.
DELETE/api/v1/servers/{serverId}Remove one server from the live directory.
GET/api/v1/groups/{groupId}/policyRead stored group policy and role sync configuration.
PATCH/api/v1/groups/{groupId}/policyPatch group policy and role sync configuration.
PUT/api/v1/groups/{groupId}/policyReplace group policy and role sync configuration.
POST/api/v1/roblox/open-cloud/introspectVerify a Roblox Open Cloud API key with Roblox.

Errors

Every failure returns JSON.

{
  "ok": false,
  "error": "invalid_api_key"
}
StatusErrorMeaning
400invalid_jsonThe request body could not be parsed.
400receipt_id_requiredReceipt verification is missing a purchase or receipt id.
400trade_id_requiredTrade verification is missing a stable trade id.
400valid_trade_users_requiredTrade verification is missing valid sender or receiver user ids.
400valid_product_id_requiredReceipt verification is missing a numeric developer product id.
400valid_user_id_requiredThe route or body is missing a valid Roblox user id.
400valid_flag_and_user_requiredA Feature Flags assignment or exposure is missing a valid flag key or Roblox user id.
400valid_segment_and_user_requiredA Player Segments member route is missing a valid segment key or Roblox user id.
400valid_board_and_user_requiredA Leaderboards score or rank route is missing a valid board key or Roblox user id.
400valid_score_requiredA Leaderboards score write is missing a numeric score.
400cooldown_key_requiredA Cooldowns rule route is missing a valid cooldown key.
400valid_cooldown_and_user_requiredA Cooldowns status, claim, or reset route is missing a valid cooldown key or Roblox user id.
401invalid_api_keyThe key is missing, revoked, or unknown.
403cooldown_disabledThe Cooldowns rule exists but is disabled for new claims.
404flag_not_foundThe requested Feature Flags definition has not been created yet.
404segment_not_foundThe requested Player Segment definition has not been created yet.
404leaderboard_not_foundThe requested Leaderboard definition has not been created yet.
413storage_quota_exceededThe write would exceed the workspace storage quota.
429api_rate_limitedThe plan's per-minute limit was exceeded.
500api_internal_errorThe request failed unexpectedly.

Security

Operational security rules for Roblox games.

Keys

Server only

Never place live keys in LocalScripts, public assets, or client-delivered modules.

Rotation

Rotate on leak

Revoke exposed keys from the dashboard and create a replacement key.

Audit

Review usage

Request logs, storage usage, and audit events make suspicious traffic visible.

Release process

Versioned routes, documented changes, and visible status.

Breaking API changes should ship under a new version path. Non-breaking SDK helpers can be added to the hosted Lua and JS SDKs. Product-facing changes are tracked in the changelog and service availability is summarized on the status page.