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

PlatformSource
WindowsMirrored from theo's offsets, then stored here.
macOSNot supported yet. Versions and files are still tracked.
AndroidDumped 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.

FormatWhat it is
hppA C++ header of inline constexpr uintptr_t inside namespace Offsets.
csThe same constants as a C# class.
jsonThe structured form the others are generated from. Also carries the dump's own metadata: total count, when it was produced, which dumper made it.
txtA 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:

  1. Read the client's own version. On Windows that is the clientVersionUpload from clientsettingscdn.roblox.com/v2/client-version/WindowsPlayer, or the ClientVersion string embedded at the top of any dump.
  2. Ask this API for that exact string.
  3. If it answers 404 offsets_not_found, the dump has not been published yet. Do not fall back to latest. 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.