Offsets
Windows · macOS · Android · home
Offsets are memory layout constants for one exact Roblox build. They are keyed by the build's identity, not its dotted version, because two builds can share a dotted version and offsets from the wrong one are worse than no offsets at all.
Where they come from
| Platform | Source |
|---|---|
| Windows | Mirrored from theo's offsets, then stored here. |
| macOS | Not supported yet. Versions and files are still tracked. |
| Android | Dumped and published by rbxoffsets. |
Windows dumps are copied rather than hotlinked, for three reasons in order of how much they matter: they stay reachable for versions upstream has aged out; an outage there does not take these pages down with it; and a stable URL under one domain is the thing an integration can actually depend on. Upstream is credited on every page and in every response.
The four formats
The same data written four ways. Which one is right depends entirely on your toolchain, so all four are published and none is recommended.
| Format | What it is |
|---|---|
hpp | A C++ header of inline constexpr uintptr_t inside namespace Offsets. |
cs | The same constants as a C# class. |
json | The structured form the others are generated from. Also carries the dump's own metadata: total count, when it was produced, which dumper made it. |
txt | A flat table, for grepping. |
Fetching them
# what versions have offsets
curl -s https://www.rbxoffsets.com/api/v1/windows/offsets
# one version's metadata and file list
curl -s https://www.rbxoffsets.com/api/v1/windows/offsets/version-ddf602d9cfe44005
curl -s https://www.rbxoffsets.com/api/v1/windows/offsets/latest
# the file itself (a redirect - use -L)
curl -sL -o offsets.hpp https://www.rbxoffsets.com/api/v1/windows/offsets/latest/hpp
latest resolves to the newest version with a dump, so a client never has to
hard-code a build hash. The response to a version query looks like this:
{
"platform": "windows",
"version": "version-ddf602d9cfe44005",
"displayVersion": "0.734.0.7340917",
"count": 388,
"dumpedAt": "2026-08-11T22:59:00.000Z",
"storedAt": "2026-08-12T16:11:04.000Z",
"source": "imtheo",
"credit": { "label": "theo's offsets", "url": "https://offsets.imtheo.lol" },
"isProduction": true,
"isLatest": true,
"files": [
{
"format": "hpp",
"fileName": "offsets.hpp",
"sizeBytes": 25555,
"sha256": "…",
"path": "/api/v1/windows/offsets/version-ddf602d9cfe44005/hpp",
"url": "https://www.rbxoffsets.com/api/v1/windows/offsets/version-ddf602d9cfe44005/hpp"
}
]
}
Matching offsets to a running client
The reliable sequence, and the reason version is the identity:
- Read the client's own version. On Windows that is the
clientVersionUploadfromclientsettingscdn.roblox.com/v2/client-version/WindowsPlayer, or theClientVersionstring embedded at the top of any dump. - Ask this API for that exact string.
- If it answers
404 offsets_not_found, the dump has not been published yet. Do not fall back tolatest. Offsets from a neighbouring build are not approximately right; they point at the wrong memory.
version=$(curl -s https://clientsettingscdn.roblox.com/v2/client-version/WindowsPlayer \
| jq -r .clientVersionUpload)
curl -fsSL -o offsets.hpp "https://www.rbxoffsets.com/api/v1/windows/offsets/$version/hpp" \
|| echo "no dump for $version yet"
macOS
Not supported. A request answers 501 offsets_unsupported, which is
deliberately not a 404: the route is correct and the version may well exist, but
the capability does not. Branch on the slug rather than on the status alone. macOS versions,
release times and client downloads all work normally.
Publishing a dump
Operator-only, and always requires a token — with no HTTP_TOKEN configured the
route refuses every request rather than defaulting to open.
curl -X POST \
-H "Authorization: Bearer $HTTP_TOKEN" \
-F offsets.json=@offsets.json \
-F offsets.hpp=@offsets.hpp \
-F offsets.cs=@offsets.cs \
-F offsets.txt=@offsets.txt \
https://www.rbxoffsets.com/internal/offsets/android/2.734.917
A single file works too, as long as the format is named — .hpp and
.txt are both text/plain on the wire and guessing between them would
put the wrong content type on the object permanently:
curl -X POST -H "Authorization: Bearer $HTTP_TOKEN" \
--data-binary @offsets.hpp \
"https://www.rbxoffsets.com/internal/offsets/android/2.734.917?format=hpp"
latest is not accepted here. A dump belongs to exactly one
build, and publishing to a moving target is how offsets end up filed under the wrong
version.
There is a second way in that needs no token and no request to this server: write the files
straight to {platform}/{version}/offsets/offsets.{json,hpp,cs,txt} in the bucket with your own credentials. Each poll cycle lists the bucket and
indexes anything it finds, so a CI job can publish even while this service is being
redeployed. Files indexed that way carry no sha256 — we never saw the bytes — and say so by
leaving it null.
Platforms with offsets on this deployment: Windows, Android.