The RoVPPS API is a HTTPS/REST API that lets you read guild data, manage Roblox group ranks, and control user XP programmatically — without needing the Discord bot.
All versioned routes are available under /v1. Use the full path https://api.rovpps.xyz/v1/{endpoint}.
There are two authentication mechanisms depending on which route you are calling.
All /v1/ routes require a Guild API Key obtained from the API Keys tab of your server's Dashboard. Pass the key as a raw value in the Authorization header:
Request Header
Authorization: your-guild-api-key-here
The key is automatically scoped to your guild — it can only access data for the guild it was created under. Attempting to call a route for a different guildId with a mismatched key returns 403 Forbidden.
The POST /getplayerinfo route uses a separate server-level key (env.API_KEY) and is reserved for internal bot use. It is not available to third-party callers.
All endpoints are subject to 500 requests per minute per IP. Exceeding this limit returns 429 Too Many Requests.
Every endpoint returns a JSON object. Successful responses always include "success": true. Errors include a message field with a human-readable description.
{
"success": true,
...data
}{
"success": false,
"message": "Reason here"
}/v1/{guildId}/getdataReturns the complete configuration and bind data for a guild. The open_cloud_key is never returned — only a boolean hasOpenCloudKey is exposed.
Response fields
| Field | Type | Description |
|---|---|---|
guildId | string | The guild's Discord ID |
config | object | Full guild config (primary group, roles, settings, etc.) |
rankbinds | object | Nested map of group ID → rank ID → bind data |
groupbinds | object | Group-level bind definitions |
xpbinds | array | XP threshold → rank bind definitions |
custombinds | array | Custom expression bind definitions |
denylist | object | roblox_user and roblox_group deny arrays |
hasOpenCloudKey | boolean | Whether an Open Cloud key is configured |
{
"success": true,
"guildId": "123456789012345678",
"config": {
"PrimaryGroup": 12345678,
"VerifiedRole": ["111111111111111111"],
"UnverifiedRole": [],
"ManagementRole": "222222222222222222"
},
"rankbinds": { ... },
"groupbinds": { ... },
"xpbinds": [ ... ],
"custombinds": [ ... ],
"denylist": { "roblox_user": [], "roblox_group": [] },
"hasOpenCloudKey": true
}Prerequisite: An Open Cloud API key and a primary group must be configured for the guild. Both can be set from the server Dashboard.
/v1/{guildId}/setrankSets one or more Roblox users to a specific rank in the guild's primary group. Processes each user independently — partial failures are collected and returned in failedUsers without aborting the rest.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
userIdArray | number[] | ✓ | Array of Roblox user IDs to update |
rank | number | ✓ | Target rank value (1–255) in the primary group |
{
"userIdArray": [123456789, 987654321],
"rank": 5
}{
"success": true,
"results": [
{
"userId": 123456789,
"success": true,
"oldRank": "Rookie",
"newRank": "Officer"
}
],
"failedUsers": []
}/v1/{guildId}/promoteAdvances a user by exactly one rank in the primary group. Returns an error if the user is already at the highest rank.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
userId | number | ✓ | Roblox user ID to promote |
{
"userId": 123456789
}{
"success": true,
"userId": 123456789,
"oldRank": "Rookie",
"newRank": "Officer"
}/v1/{guildId}/demoteMoves a user back by exactly one rank in the primary group. Returns an error if the user is already at the lowest rank.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
userId | number | ✓ | Roblox user ID to demote |
{
"success": true,
"userId": 123456789,
"oldRank": "Officer",
"newRank": "Rookie"
}XP is stored per-guild, keyed by Roblox user ID. It is separate from rank — modifying XP does not automatically trigger a rank change. Use the bot's /xp add command or the XP binds system for automatic promotion.
/v1/{guildId}/xp/{robloxId}Returns the current XP total for a Roblox user in a specific guild. Returns 0 if the user has no recorded XP.
Response fields
| Field | Type | Description |
|---|---|---|
guildId | string | The guild's Discord ID |
robloxId | string | The queried Roblox user ID |
xp | number | Current XP value (always ≥ 0) |
{
"success": true,
"guildId": "123456789012345678",
"robloxId": "987654321",
"xp": 1450
}/v1/{guildId}/xp/addAdds XP to a user. Pass a negative amount to subtract. The result is clamped so XP can never go below 0.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
robloxId | string | number | ✓ | Roblox user ID |
amount | number | ✓ | XP delta — positive to add, negative to subtract |
{
"robloxId": "987654321",
"amount": 250
}{
"success": true,
"guildId": "123456789012345678",
"robloxId": "987654321",
"xp": 1700
}/v1/{guildId}/xp/setOverwrites a user's XP to an exact value, ignoring the current total. Must be ≥ 0.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
robloxId | string | number | ✓ | Roblox user ID |
xp | number | ✓ | New XP value — must be 0 or greater |
{
"robloxId": "987654321",
"xp": 5000
}{
"success": true,
"guildId": "123456789012345678",
"robloxId": "987654321",
"xp": 5000
}/v1/{guildId}/xp/bulkAwards (or subtracts) XP for multiple users in a single request. Useful for distributing event rewards. Each entry is processed independently — one failure does not abort the others.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
entries | object[] | ✓ | Array of { robloxId, amount } objects |
entries[].robloxId | string | number | ✓ | Roblox user ID |
entries[].amount | number | ✓ | XP delta (positive or negative) |
{
"entries": [
{ "robloxId": "111111111", "amount": 100 },
{ "robloxId": "222222222", "amount": 250 },
{ "robloxId": "333333333", "amount": -50 }
]
}{
"success": true,
"results": [
{ "robloxId": "111111111", "success": true, "xp": 600 },
{ "robloxId": "222222222", "success": true, "xp": 950 },
{ "robloxId": "333333333", "success": true, "xp": 200 }
],
"failedCount": 0
}| HTTP Status | Meaning |
|---|---|
400 | Bad request — missing or invalid body fields |
401 | Missing Authorization header |
403 | Invalid API key, or key does not belong to the requested guild |
404 | Guild not found in the database |
429 | Rate limit exceeded |
500 | Internal server error |
Open Cloud errors: If ranking operations return a 401 from Roblox, your Open Cloud API key may have been rotated. Regenerate it from the Roblox Creator Dashboard and update it in your server settings.