BTRoblox, or Better Roblox, is an extension that aims to enhance Roblox website's look and functionality by adding a plethora of new features and modifying the layout of some existing pages.
Domain | Description |
---|---|
accountinformation.roblox.com | All endpoints for accessing/modifying account information |
accountsettings.roblox.com | All endpoints for account/user settings. |
adconfiguration.roblox.com | Roblox Ad Configuration related endpoints. |
ads.roblox.com | Ads configuration endpoints. |
assetdelivery.roblox.com | Serves asset content. |
auth.roblox.com | All endpoints that tamper with authentication sessions. |
avatar.roblox.com | Endpoints relating to the customization of player avatars. |
badges.roblox.com | Endpoints for badges and badge awards management. |
billing.roblox.com | Real money transactions and interaction. |
catalog.roblox.com | Catalog items browsing and searching. Content and user based catalog items recommendations. |
chat.roblox.com | All chat and party related endpoints. |
chatmoderation.roblox.com | |
clientsettings.roblox.com | Used by various Roblox clients to retrieve configuration information. |
clientsettingscdn.roblox.com | Used by various Roblox clients to retrieve configuration information. |
contacts.roblox.com | Contacts and userTag management. |
contentstore.roblox.com | ApiSite to front the TemporaryStore for files before uploading to S3 |
develop.roblox.com | Game development configuration endpoints. |
economy.roblox.com | Endpoints related to transactions and currency. |
economycreatorstats.roblox.com | Roblox.EconomyCreatorStats.Api endpoints. |
engagementpayouts.roblox.com | For engagement-based payout information |
followings.roblox.com | Establishes follow relationship between subscriber entities (users, groups, etc) and source entities (games, groups, assets, etc.) |
friends.roblox.com | Friends and followers management. |
gameinternationalization.roblox.com | Manages internationalization of games such as translating in game content. |
gamejoin.roblox.com | All endpoints around launching a game. |
gamepersistence.roblox.com | Endpoints for the in-game datastore system for storing data for games. |
games.roblox.com | All endpoints for game discovery, and details. |
groups.roblox.com | Groups management. |
groupsmoderation.roblox.com | Group Moderation |
inventory.roblox.com | All endpoints for viewing (but not granting) ownership of items. |
itemconfiguration.roblox.com | Configure Items (bundles and avatar assets). |
locale.roblox.com | User locale management. |
localizationtables.roblox.com | Handles managing of localization tables. |
metrics.roblox.com | Record metrics across Roblox. |
notifications.roblox.com | All notification stream endpoints. |
premiumfeatures.roblox.com | This API is for premium features and anything pertaining to account add ons |
presence.roblox.com | All endpoints for managing presence. |
privatemessages.roblox.com | All messages page endpoints. |
publish.roblox.com | All endpoints handling file uploads. |
thumbnails.roblox.com | Endpoints for requesting thumbnails. |
thumbnailsresizer.roblox.com | Validate and resize thumbnails to requested dimensions |
trades.roblox.com | Endpoints for trading collectible items. |
translationroles.roblox.com | Manages translation roles of developers in game localization. |
twostepverification.roblox.com | Platform interface for the two step verification system. |
users.roblox.com | For direct Roblox user information. |
voice.roblox.com | APIs for Voice calls. |
placeId
(or just id
), gameInstanceId
, accessCode
, linkCode
, launchData
, reservedServerAccessCode
, joinAttemptId
, joinAttemptOrigin
, callId
and browserTrackerId
. (credit to bloxstrap for this information){"assetId":11829118051,"assetType":10,"expectedPrice":0,"searchId":null}
{"purchased":true,"productId":1346487601,"price":0,"reason":"Success"}
POST https://apis.roblox.com/asset-permissions-api/v1/assets/check-permissions
content-type: application/json
{
"requests": [
{
"subject": {
"subjectType": "User" | "Group",
"subjectId": "{userId}" | "{groupId}"
},
"action": "Edit",
"assetId": {assetId}
}
]
}
200 OK
content-type: application/json
{
"results": [
{ "value": { "status": "NoPermission" | "HasPermission" } }
]
}
GET https://apis.roblox.com/platform-chat-api/v1/get-conversation-metadata
POST https://apis.roblox.com/platform-chat-api/v1/update-typing-status
{"conversation_id":"{conversationId}"}
{"status":"success"}
POST https://apis.roblox.com/platform-chat-api/v1/send-messages
{"conversation_id":"{conversationId}","messages":[{"content":"this is a test message"}]}
{"messages":[{"id":"12345678-1234-1234-1234-123456789abc","content":"this is a test message","sender_user_id":4719353,"created_at":"2024-06-27T21:32:22.7534644Z","status":"success","type":"unknown_type"}]}
POST https://apis.roblox.com/platform-chat-api/v1/create-conversations
{"conversations":[{"type":"group","name":"","participant_user_ids":[1234,2345]}],"include_user_data":true}
{"conversations":[{"source":"chat","id":"123456789","type":"group","name":null,"created_by":4719353,"participant_user_ids":[4719353,1234,2345],"user_data":*snip*,"messages":[],"unread_message_count":0,"updated_at":"2024-06-27T21:39:27.7080493Z","created_at":"0001-01-01T00:00:00Z","status":"success"}]}
POST https://apis.roblox.com/platform-chat-api/v1/get-conversations
{"ids":[123456789],"include_messages":true,"include_participants":true,"include_user_data":true}
{"conversations":[{"source":"chat","id":"123456789","type":"group","name":null,"created_by":4719353,"participant_user_ids":[4719353,1234,2345],"user_data":*snip*,"messages":[],"unread_message_count":0,"updated_at":"2024-06-27T21:39:27.7080493Z","created_at":"2024-06-27T21:39:27.7080493Z"}]}
Roblox-Place-Id: 1076067099
200 OK
{"datastores":[{"name":"Test","createdTime":"2024-08-22T16:49:57.8516146Z","updatedTime":"2024-08-22T16:49:57.8516146Z"}],"lastReturnedKey":""}
Roblox-Place-Id: 1076067099
// If key exists
200 OK
content-type: application/octet-stream
content-md5: VQNh2cu4sdBAMRrdwrY35w==
etag: "08DCC2CA74D3E243.0000000007.08DCC2CBF140D0DC.01"
roblox-object-version-id: 08DCC2CA74D3E243.0000000007.08DCC2CBF140D0DC.01
roblox-object-created-time: 2024-08-22T16:49:57.8993219Z
roblox-object-version-created-time: 2024-08-22T17:00:36.1474268Z
roblox-object-attributes: {"key1":"value1","key2":"value2"}
roblox-object-userids: [1,2,3]
"ho"
// If key doesn't exist
404 Not Found
content-type: application/json
{"errors":[{"code":11,"message":"The requested key does not exist.","retryable":false}]}
Roblox-Place-Id: 1076067099
// If version exists
200 OK
content-type: application/octet-stream
content-md5: VQNh2cu4sdBAMRrdwrY35w==
etag: "08DCC2CA74D3E243.0000000007.08DCC2CBF140D0DC.01"
roblox-object-version-id: 08DCC2CA74D3E243.0000000007.08DCC2CBF140D0DC.01
roblox-object-created-time: 2024-08-22T16:49:57.8993219Z
roblox-object-version-created-time: 2024-08-22T17:00:36.1474268Z
roblox-object-attributes: {"key1":"value1","key2":"value2"}
roblox-object-userids: [1,2,3]
"ho"
// If version doesn't exist but key does
204 No Content
content-type: application/octet-stream
content-md5: VQNh2cu4sdBAMRrdwrY35w==
etag: "08DCC2CA74D3E243.0000000007.08DCC2CBF140D0DC.01"
roblox-object-version-id: 08DCC2CA74D3E243.0000000007.08DCC2CBF140D0DC.01
roblox-object-created-time: 2024-08-22T16:49:57.8993219Z
roblox-object-version-created-time: 2024-08-22T17:00:36.1474268Z
roblox-object-attributes: {"key1":"value1","key2":"value2"}
roblox-object-userids: [1,2,3]
<no data>
// If key doesn't exist
404 Not Found
content-type: application/json
{"errors":[{"code":11,"message":"The requested key does not exist.","retryable":false}]}
Content-Type: application/octet-stream
Content-MD5: VQNh2cu4sdBAMRrdwrY35w==
Roblox-Place-Id: 1076067099
Roblox-Object-Userids: [1,2,3]
Roblox-Object-Attributes: {"key1":"value1","key2":"value2"}
"ho"
200 OK
content-type: application/json
{"version":"08DCC2CA74D3E243.0000000007.08DCC2CBF140D0DC.01","deleted":false,"contentLength":4,"createdTime":"2024-08-22T17:00:36.1474268Z","objectCreatedTime":"2024-08-22T16:49:57.8993219Z"}
Implemented using GetAsync and SetAsync with If-Match header
// First it gets current data
GET https://gamepersistence.roblox.com/v2/persistence/446315170/datastores/objects/object?datastore=Test&objectKey=global%2Fhi
Roblox-Place-Id: 1076067099
200 OK
content-type: application/octet-stream
content-md5: VQNh2cu4sdBAMRrdwrY35w==
etag: "08DCC2CA74D3E243.0000000007.08DCC2CBF140D0DC.01"
roblox-object-version-id: 08DCC2CA74D3E243.0000000007.08DCC2CBF140D0DC.01
roblox-object-created-time: 2024-08-22T16:49:57.8993219Z
roblox-object-version-created-time: 2024-08-22T17:00:36.1474268Z
roblox-object-attributes: {"key1":"value1","key2":"value2"}
roblox-object-userids: [1,2,3]
"ho"
// Then it tries to set it to new value (note If-Match header which matches etag returned by GetAsync)
POST https://gamepersistence.roblox.com/v2/persistence/446315170/datastores/objects/object?datastore=Test&objectKey=global%2Fhi
Content-Type: application/octet-stream
If-Match: "08DCC2CA74D3E243.0000000007.08DCC2CBF140D0DC.01"
Content-MD5: uax0tCReVutN8x1hJ+LNDQ==
Roblox-Place-Id: 1076067099
Roblox-Object-Userids: [1,2,3]
Roblox-Object-Attributes: {"key1":"value1","key2":"value2"}
"hy"
// If it succeeds
200 OK
content-type: application/json
{"version":"08DCC2CE8B549D47.0000000003.08DCC2CEED7D4991.01","deleted":false,"contentLength":4,"createdTime":"2024-08-22T17:21:58.3230353Z","objectCreatedTime":"2024-08-22T17:19:13.6397639Z"}
// If it fails (data does not match If-Match), return new data and repeat setasync
412 Precondition Failed
content-type: application/octet-stream
content-md5: uax0tCReVutN8x1hJ+LNDQ==
etag: "08DCC2CA74D3E243.0000000007.08DCC2CBF140D0DC.01"
roblox-object-version-id: 08DCC2CA74D3E243.0000000007.08DCC2CBF140D0DC.01
roblox-object-created-time: 2024-08-22T16:49:57.8993219Z
roblox-object-version-created-time: 2024-08-22T17:00:36.1474268Z
roblox-object-attributes: {"key1":"value1","key2":"value2"}
roblox-object-userids: [1,2,3]
"hy"
Content-Type: application/octet-stream
Roblox-Place-Id: 1076067099
<no body>
// If key exists
200 OK
content-type: application/octet-stream
content-md5: VQNh2cu4sdBAMRrdwrY35w==
etag: "08DCC2CA74D3E243.0000000007.08DCC2CBF140D0DC.01"
roblox-object-version-id: 08DCC2CA74D3E243.0000000007.08DCC2CBF140D0DC.01
roblox-object-created-time: 2024-08-22T16:49:57.8993219Z
roblox-object-version-created-time: 2024-08-22T17:00:36.1474268Z
roblox-object-attributes: {"key1":"value1","key2":"value2"}
roblox-object-userids: [1,2,3]
"ho"
// If key doesn't exist
404 Not Found
content-type: application/json
{"errors":[{"code":11,"message":"The requested key does not exist.","retryable":false}]}
Content-Type: application/octet-stream
Roblox-Place-Id: 1076067099
<no body>
// If version exists
200 OK
content-type: application/octet-stream
content-md5: VQNh2cu4sdBAMRrdwrY35w==
etag: "08DCC2CA74D3E243.0000000007.08DCC2CBF140D0DC.01"
roblox-object-version-id: 08DCC2CA74D3E243.0000000007.08DCC2CBF140D0DC.01
roblox-object-created-time: 2024-08-22T16:49:57.8993219Z
roblox-object-version-created-time: 2024-08-22T17:00:36.1474268Z
roblox-object-attributes: {"key1":"value1","key2":"value2"}
roblox-object-userids: [1,2,3]
"ho"
// If version doesn't exist
404 Not Found
content-type: application/json
{"errors":[{"code":12,"message":"The requested object version does not exist.","retryable":false}]}
Content-Type: application/octet-stream
Roblox-Place-Id: 1076067099
Roblox-Object-Userids: [1,2,3]
Roblox-Object-Attributes: {"key1":"value1","key2":"value2"}
<no body>
// If it succeeds
200 OK
content-type: application/octet-stream
content-md5: xMpCOKC5I4INzFCab3WEmw==
etag: "08DCC2D1D7C3A452.0000000001.08DCC2D1D7C3A452.01"
roblox-object-version-id: 08DCC2D1D7C3A452.0000000001.08DCC2D1D7C3A452.01
roblox-object-created-time: 2024-08-22T17:42:50.3644242Z
roblox-object-version-created-time: 2024-08-22T17:42:50.3644242Z
roblox-object-attributes: {"key1":"value1","key2":"value2"}
roblox-object-userids: [1,2,3]
1
// If existing data is not numeric
400 Bad Request
content-type: application/json
{"errors":[{"code":24,"message":"Key value is not numeric.","retryable":false}]}
Roblox-Place-Id: 1076067099
200 OK
content-type: application/json
{"keys":["global/hi"],"lastReturnedKey":"nzrxiER/+KVBNMl9B7mbqnzqkKsBZcr9liT+cwLGGf01Iw=="}
Roblox-Place-Id: 1076067099
200 OK
content-type: application/json
{"versions":[{"version":"08DCC2CA74D3E243.0000000005.08DCC2CB5C770715.01","deleted":false,"contentLength":4,"createdTime":"2024-08-22T16:56:26.5221909Z","objectCreatedTime":"2024-08-22T16:49:57.8993219Z"}],"lastReturnedKey":"X3qpRUgyRrQhbDShI97MRuacpM6vR7jTjyNqyBDMiMdleUpwYm14cGJtVldaWEp6YVc5dUlqcG1ZV3h6WlN3aWJHRnpkRlpsY25OcGIyNGlPaUl3T0VSRFF6SkRRVGMwUkRORk1qUXpMakF3TURBd01EQXdNRFV1TURoRVEwTXlRMEkxUXpjM01EY3hOUzR3TVNJc0lrTjFjbk52Y2xabGNuTnBiMjRpT2pGOQ=="}
// If key doesn't exist 404 Not Found content-type: application/json
{"errors":[{"code":11,"message":"The requested key does not exist.","retryable":false}]}
GET https://gamepersistence.roblox.com/v1/persistence/sorted?key=Test&scope=global&target=hi
Roblox-Place-Id: 1076067099
200 OK
content-type: application/octet-stream
roblox-usn: 123
123
POST https://gamepersistence.roblox.com/v1/persistence/sorted?key=Test&scope=global&target=hi
Content-Type: application/octet-stream
Roblox-Place-Id: 1076067099
123
200 OK
content-type: application/json
{"usn":"123"}
POST https://gamepersistence.roblox.com/v1/persistence/sorted/remove?key=Test&scope=global&target=hi
Content-Type: application/octet-stream
Roblox-Place-Id: 1076067099
<no data>
200 OK
content-type: application/octet-stream
roblox-usn: 123
123
Content-Type: application/octet-stream
Roblox-Place-Id: 1076067099
<no data>
200 OK
content-type: application/json
{"value":"124","usn":"124"}
Roblox-Place-Id: 1076067099
200 OK
content-type: application/json
{"entries":[{"target":"hi","value":123,"usn":"123"}],"lastEvaluatedKey":"AQEBAgRLZXky"}