Sway team docs

Gaming data integration analysis. Internal working document.

This password is a deterrent, not protection. This page is publicly reachable and its full text reached your browser before this prompt appeared.

Roblox summary report

Everything measured to date, on one page. Both API routes have been run against live Sway-owned accounts — these findings are observed HTTP results, not estimates.

Measured Research opened 27 Jul 2026 · API probe 18 Aug · badge + cookie re-probe 3 Sep · report 16 Sep 2026

2–3
of 14 dashboard regions reachable through the sanctioned API — account identity, badge-derived experiences, followed experiences (pending OAuth)
8 / 8
cookie-route regions returned live 200s — friends, DMs, presence, spend, moderation, followers, username history, ban state
0
routes to in-experience chat or playtime. Chat has no surface anywhere; playtime exists only on-device
The one decision that gates everything

The cookie route is technically complete and the research verdict is do not build it: it needs the child's full session token, bypasses 2FA, breaches the Terms of Use and the 2026-04-15 human-only cookie rule, and presence — the most powerful field on the page — is expressly prohibited by the 2026-06-02 rich-presence clause. DECISION-1 is to record that it is dropped, or to record an explicit override with a name and date. Both prototypes exist, so this can now be decided on evidence rather than argument.

What each route returns — measured

Every row was tested. 200 means live data came back; 404 means the route does not exist; 403 means it exists and refused.

Data pointOpen Cloud APICookieDeviceNotes
Username, display name200200id is a string and the only stable key; name and displayName are mutable
Account creation date200200createTime, RFC 3339
Locale200
Bio200200Omitted when empty — not scope-gated
Premium status200Omitted when false. The first read of this was wrong
ID-verified flagUnresolvedNot observed on any of five accounts; omitted-because-false vs scope-gated needs OAuth to settle
Inventory contents200 own onlyOther users → 403. onlyCollectibles unlocks the call and returns nothing
Badges earned200Inventory rows with badgeDetails; a second shape the first capture never saw
Experiences playedPartial via badges200 current onlyBadge → awardingUniverse → name + award time. Cookie presence gives the experience she is in now
Followed experiences403Needs legacy-universe.following:read — unproven pending an OAuth app
Friends list40420067 friends with id, username, display name. The "new unknown contact" signal is cookie-only
Followers404200Count
Direct messages200Full bodies, sender, subject, timestamp, read state. Legacy web inbox only
Presence / current experience404200 ProhibitedResolves exact universeId. Named and forbidden by the 2026-06-02 clause
Robux balance200Transaction ledger not probed
Moderation / isBanned200Not on the Open Cloud user object
Username history200Empty on the test account
Playtime / screen time404NoneAndroid iOSAndroid exact; iOS a threshold staircase; console and PC invisible
Sessions (start / end)404NoneAndroidVia queryEvents()
In-experience chatNoneNo surface exists anywhere, including Roblox's own parent dashboard
Age bracket / under-13 flagNoneage scope not permitted to third parties; createTime is the only weak proxy
Privacy / parental-control settingsNonereachable83 endpoints, all cookie-only. Offer as a guided checklist instead

Route A — Open Cloud API Sanctioned

Tested with an Open Cloud API key owned by test account DaFerG81 (11525168069, created 17 Aug 2026). No OAuth app has been registered — that is still CRED-1, and OAuth is the only model that expresses guardian consent.

What comes back

GET /cloud/v2/users/{id} returns id, name, displayName, createTime, locale, and — only when non-default — about, premium, socialNetworkProfiles. An API key can read any user's basic profile without that user's consent, verified against unrelated accounts. Whether it is appropriate to read a child's profile without involving them is a product and legal question that belongs with S4, not something to settle by what the API happens to allow.

GET /cloud/v2/users/{id}/inventory-items returns the key owner's inventory: 75 items on a one-day-old account, all written within 0.81 seconds of signup — default body parts, animations and starter clothing. Inventory is a poor activity signal and addTime must not drive an activity chart.

The badge finding — experiences played, partially, on the sanctioned route

By 3 September the inventory held 78 items, and the three new rows carried badgeDetails instead of assetDetails. A badge resolves to the experience that awarded it via awardingUniverse, and GET /cloud/v2/universes/{id} returns the display name — so the whole chain stays on Open Cloud. Verified live: two badges resolved to Dress To Impress (24 Aug 14:56) and Club Roblox RP (24 Aug 15:02).

This is the only sanctioned route to an experience name plus a timestamp. The research had called it impossible.

So it is not oversold
  • Only experiences that award badges, only when one is actually earned. Many popular experiences award none.
  • No duration, no session, no ordering beyond award time.
  • Silence proves nothing. A child can play for hours and earn nothing.

A dashboard can honestly say "she earned a badge in Dress To Impress on Sunday afternoon". It cannot say how long she played, and must not imply the list is complete. Evidence of play, not a measure of it.

What is absent

/playtime, /friends, /sessions and /presence under /cloud/v2/users/{id}/ all return 404 with an empty error body — absent, not gated. There is no scope to apply for, no review to pass, no partnership to negotiate.

For whoever builds it

  • Protobuf-style JSON: fields at their default value are omitted. Never branch on key presence; normalise every optional field on ingest.
  • Two incompatible error envelopes from the same host — {errors:[{code,message}]} and {code,message} — and message may be empty.
  • Inventory rows come in two mutually exclusive shapes; assuming assetDetails throws on badge rows.
  • OAuth access tokens live 15 minutes against a 12-hour analysis cycle, so every run refreshes first. Refresh tokens are 90-day, single-use and rotating — persist the new one before using the access token.
  • Rate limits are per-authorisation (10/min user, 20/min inventory). Not a constraint — there is nothing worth polling.
  • Unreviewed OAuth apps are capped at 10 test users; 2026 reports of opaque automated rejections. Treat "passes review" as a risk.
  • Only four consumer scopes exist. There is no safety or parental app category; Sway would file as "User Tools".

Route B — Cookie (.ROBLOSECURITY) Do not build

Tested on 3 Sep 2026 with the session cookie of test account thmainaccount2 against the internal *.roblox.com web endpoints. Shapes were captured; no field values, friend names or message bodies were retained.

RegionEndpointReturned
Friendsfriends.roblox.com/v1/users/{id}/friendsArray of 67 — userId, username, display name
Followers…/followers/countCount
Direct messagesprivatemessages.roblox.com/v1/messages4 messages — sender, recipient, subject, body, timestamp, read state
Presencepresence.roblox.com/v1/presence/usersuserPresenceType, lastLocation, universeId, rootPlaceId, gameId
Robux balanceeconomy.roblox.com{ robux }
Account & moderationusers.roblox.com/v1/users/{id}isBanned, created, description
Username history200, empty for this account
Ban stateas aboveisBanned

Even with the cookie, two things stay dark: in-experience chat and playtime / session duration. The cookie fills the social and economic gaps; it does not fill those two.

Why the verdict is "do not build"
  1. It needs the child's full session token — which Roblox's own cookie value prefixes with a do-not-share account-theft warning — and it bypasses 2FA.
  2. It breaches the Terms clause "Only access an API by the means described in the documentation of that API" and the 2026-04-15 human-only cookie rule. Every one of these endpoints is documented as "Auth: Cookie — not recommended, do not use in production." None accept OAuth.
  3. Presence is named and prohibited by the 2026-06-02 rich-presence clause. It returns, and surfacing it is forbidden.
  4. Storing children's session tokens is a breach liability and an App Store / Play review exposure.

The cookie prototype exists to show feasibility, not to endorse it. Once DECISION-1 is recorded it should be retired from this site so it is not mistaken for a plan (DECISION-2).

Route C — Device / OS usage Not yet probed

The only source of actual playtime, and entirely independent of Roblox. Needs a handset and, on iOS, an Apple entitlement.

Android Exact

UsageStatsManager keyed on com.roblox.client, sessions via queryEvents(). Play permits it as the explicit stalkerware exception, conditional on IsMonitoringTool, a persistent notification while running, and listing disclosure.

iOS Staircase

DeviceActivityReport is sandboxed from the network. Only threshold event names cross, so time is encoded in them. Needs family-controls, which gates dev clients — request on day one. EU-only iOS 26.4 exports exact data.

Console & PC Invisible

Not covered by any mobile approach. Roblox does not disclose DAU by platform. We will undercount and cannot measure by how much — the dashboard must say so.

apps/mobile is on managed Expo 53; this route requires prebuild/bare (DECISION-3).

Route D — Guardian-mediated checklist Shippable now

Surface Roblox's own parental dashboard as a guided in-app checklist: link a parent account, maturity ceiling, spend limit and threshold notifications, review connections, chat settings. Zero API risk, zero automation, honest — and the only thing on this page that could ship this month.

What the prototype can honestly show

RegionSanctioned routeCookie route
Account & settingsLive partial — no ID-verified, no privacy settingsLive
Experiences playedPartial badge-derived, no durationCurrent experience only
When she playedNoNo
Device screen timePending handset
Friends404Live
Direct messagesNoLive, full bodies
Robux spentNoBalance live; ledger not probed
Privacy & chatNoReachable
Followers, username history, moderation, ban stateNoLive
With the cookie route off, the product is

An account-identity panel, a badge-derived "evidence of play" list, a device screen-time panel with its coverage gap stated, and a guided checklist to Roblox's own controls. Real, but much narrower than the page as originally drawn.

Open decisions and blockers

IDItemStatus
DECISION-1Cookie route: confirm dropped, or record an explicit override with a name and dateNow decidable both prototypes are live
DECISION-2If dropped, retire the cookie prototype from this siteOpen
DECISION-3Move apps/mobile off managed Expo for the device routeOpen
CRED-1Open Cloud OAuth app — only an API key was supplied; OAuth is the only model that expresses guardian consentOutstanding
CRED-3Apple Developer access to request family-controlsOpen
CRED-4Android device or emulator for usage-access testingOpen
S1Can an under-13 account complete OAuth consent at all? If not, Route A serves teenagers onlyUnverified half-day spike, do before code
S4Written ruling from Roblox on "Creators may not build or release tools that expose one user's individual data to another user", via the Trusted Flagger programmeNot requested longest lead time — open now
Credential hygiene — outstanding

Both test credentials passed through chat and must be treated as compromised. The Open Cloud API key ("Swayly") — rotate at the Roblox credentials dashboard; still live as of 3 Sep. The thmainaccount2 cookie — sign the account out to invalidate it. Do not infer key validity from the embedded JWT's one-hour expiry; the key authenticated well beyond it.