Roblox DataStore limits and error codes: a scripter reference
Posted: Fri Oct 16, 2026 9:14 pm
If your DataStore calls fail or feel slow, the error is often a limit you can read straight from Roblox's documentation. This post collects the numbers that matter most for scripters. Everything below comes from the official page linked at the end.
Size limits per entry
Throttling and queues
When an experience goes over its limits, requests go into one of four queues: Set, Ordered set, Get and Ordered get. Each queue holds 30 requests. Once a queue is full, new requests fail with an error code in the 301 to 306 range and are dropped completely. If you see those codes, your script is sending more requests than the queue can hold, so batching or spacing out calls is the fix, not retrying harder.
Per-key throughput
Roblox checks usage over the last 60 seconds for each key. Reads are limited to 25 MB per minute and writes to 4 MB per minute per key. Every request is rounded up to the next kilobyte, so two writes of 800 bytes and 1.2 KB count as 3 KB.
Experience-wide request budget
For standard data stores, the shared per-minute limits are 300 + concurrentUsers x 40 for reads, 300 + concurrentUsers x 20 for writes, and 300 + concurrentUsers x 2 for list calls. UpdateAsync() draws from both the read and the write budget with a single call. Game servers and Open Cloud share the same budget, so a tool running outside the game can throttle the live game.
Per-server defaults
Each server also has its own limits, which you can change with SetRateLimitForRequestType(). Use GetRequestBudgetForRequestType() to see how much budget a server has left before you send a batch of requests.
Storage
The documented formula is 500 MB + 1 MB x lifetime user count, measured on the compressed size of the latest version of each key. The docs say not to pre-compress your data, because the service already compresses it.
Two habits that save time
Wrap every data store call in pcall(), because the docs say failures can come from poor connectivity as well as limits. And remember that a failed write does not always mean the write did not happen. Roblox says the real state may be unknown until you verify it with a follow-up read without cache.
Have you hit one of the 301 to 306 codes in a live game? Post what your save loop looked like and we can look at it together.
Source
[1] Data store error codes and limits (Roblox Creator Hub)
Size limits per entry
- Data store name: 50 characters
- Key name: 50 characters
- Scope: 50 characters
- Data (key value): 4,194,304 characters per key
- Metadata: key names up to 50 characters, values up to 250 characters, and the total size of all metadata cannot exceed 300 characters
Throttling and queues
When an experience goes over its limits, requests go into one of four queues: Set, Ordered set, Get and Ordered get. Each queue holds 30 requests. Once a queue is full, new requests fail with an error code in the 301 to 306 range and are dropped completely. If you see those codes, your script is sending more requests than the queue can hold, so batching or spacing out calls is the fix, not retrying harder.
Per-key throughput
Roblox checks usage over the last 60 seconds for each key. Reads are limited to 25 MB per minute and writes to 4 MB per minute per key. Every request is rounded up to the next kilobyte, so two writes of 800 bytes and 1.2 KB count as 3 KB.
Experience-wide request budget
For standard data stores, the shared per-minute limits are 300 + concurrentUsers x 40 for reads, 300 + concurrentUsers x 20 for writes, and 300 + concurrentUsers x 2 for list calls. UpdateAsync() draws from both the read and the write budget with a single call. Game servers and Open Cloud share the same budget, so a tool running outside the game can throttle the live game.
Per-server defaults
Each server also has its own limits, which you can change with SetRateLimitForRequestType(). Use GetRequestBudgetForRequestType() to see how much budget a server has left before you send a batch of requests.
Storage
The documented formula is 500 MB + 1 MB x lifetime user count, measured on the compressed size of the latest version of each key. The docs say not to pre-compress your data, because the service already compresses it.
Two habits that save time
Wrap every data store call in pcall(), because the docs say failures can come from poor connectivity as well as limits. And remember that a failed write does not always mean the write did not happen. Roblox says the real state may be unknown until you verify it with a follow-up read without cache.
Have you hit one of the 301 to 306 codes in a live game? Post what your save loop looked like and we can look at it together.
Source
[1] Data store error codes and limits (Roblox Creator Hub)