RoVPPS API

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}.


Authentication

There are two authentication mechanisms depending on which route you are calling.

Guild API Keys

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.

Internal Bot Key

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.


Rate Limiting

All endpoints are subject to 500 requests per minute per IP. Exceeding this limit returns 429 Too Many Requests.


Response Format

Every endpoint returns a JSON object. Successful responses always include "success": true. Errors include a message field with a human-readable description.

✓ Success
{
"success": true,
...data
}
✗ Error
{
"success": false,
"message": "Reason here"
}

Routes

Guild Data

Get Guild Data

GET/v1/{guildId}/getdata

Returns the complete configuration and bind data for a guild. The open_cloud_key is never returned — only a boolean hasOpenCloudKey is exposed.

Response fields

FieldTypeDescription
guildIdstringThe guild's Discord ID
configobjectFull guild config (primary group, roles, settings, etc.)
rankbindsobjectNested map of group ID → rank ID → bind data
groupbindsobjectGroup-level bind definitions
xpbindsarrayXP threshold → rank bind definitions
custombindsarrayCustom expression bind definitions
denylistobjectroblox_user and roblox_group deny arrays
hasOpenCloudKeybooleanWhether an Open Cloud key is configured
Example Response
{
"success": true,
"guildId": "123456789012345678",
"config": {
  "PrimaryGroup": 12345678,
  "VerifiedRole": ["111111111111111111"],
  "UnverifiedRole": [],
  "ManagementRole": "222222222222222222"
},
"rankbinds": { ... },
"groupbinds": { ... },
"xpbinds": [ ... ],
"custombinds": [ ... ],
"denylist": { "roblox_user": [], "roblox_group": [] },
"hasOpenCloudKey": true
}

Ranking

Prerequisite: An Open Cloud API key and a primary group must be configured for the guild. Both can be set from the server Dashboard.

Set Rank

POST/v1/{guildId}/setrank

Sets 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

FieldTypeRequiredDescription
userIdArraynumber[]Array of Roblox user IDs to update
ranknumberTarget rank value (1–255) in the primary group
Request
{
"userIdArray": [123456789, 987654321],
"rank": 5
}
Response
{
"success": true,
"results": [
  {
    "userId": 123456789,
    "success": true,
    "oldRank": "Rookie",
    "newRank": "Officer"
  }
],
"failedUsers": []
}

Promote

POST/v1/{guildId}/promote

Advances a user by exactly one rank in the primary group. Returns an error if the user is already at the highest rank.

Request body

FieldTypeRequiredDescription
userIdnumberRoblox user ID to promote
Request
{
"userId": 123456789
}
Response
{
"success": true,
"userId": 123456789,
"oldRank": "Rookie",
"newRank": "Officer"
}

Demote

POST/v1/{guildId}/demote

Moves 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

FieldTypeRequiredDescription
userIdnumberRoblox user ID to demote
Response
{
"success": true,
"userId": 123456789,
"oldRank": "Officer",
"newRank": "Rookie"
}

XP

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.

Get XP

GET/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

FieldTypeDescription
guildIdstringThe guild's Discord ID
robloxIdstringThe queried Roblox user ID
xpnumberCurrent XP value (always ≥ 0)
Example Response
{
"success": true,
"guildId": "123456789012345678",
"robloxId": "987654321",
"xp": 1450
}

Add / Remove XP

POST/v1/{guildId}/xp/add

Adds XP to a user. Pass a negative amount to subtract. The result is clamped so XP can never go below 0.

Request body

FieldTypeRequiredDescription
robloxIdstring | numberRoblox user ID
amountnumberXP delta — positive to add, negative to subtract
Request — Add XP
{
"robloxId": "987654321",
"amount": 250
}
Response
{
"success": true,
"guildId": "123456789012345678",
"robloxId": "987654321",
"xp": 1700
}

Set XP

POST/v1/{guildId}/xp/set

Overwrites a user's XP to an exact value, ignoring the current total. Must be ≥ 0.

Request body

FieldTypeRequiredDescription
robloxIdstring | numberRoblox user ID
xpnumberNew XP value — must be 0 or greater
Request
{
"robloxId": "987654321",
"xp": 5000
}
Response
{
"success": true,
"guildId": "123456789012345678",
"robloxId": "987654321",
"xp": 5000
}

Bulk Add XP

POST/v1/{guildId}/xp/bulk

Awards (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

FieldTypeRequiredDescription
entriesobject[]Array of { robloxId, amount } objects
entries[].robloxIdstring | numberRoblox user ID
entries[].amountnumberXP delta (positive or negative)
Request
{
"entries": [
  { "robloxId": "111111111", "amount": 100 },
  { "robloxId": "222222222", "amount": 250 },
  { "robloxId": "333333333", "amount": -50 }
]
}
Response
{
"success": true,
"results": [
  { "robloxId": "111111111", "success": true, "xp": 600 },
  { "robloxId": "222222222", "success": true, "xp": 950 },
  { "robloxId": "333333333", "success": true, "xp": 200 }
],
"failedCount": 0
}

Error Reference

HTTP StatusMeaning
400Bad request — missing or invalid body fields
401Missing Authorization header
403Invalid API key, or key does not belong to the requested guild
404Guild not found in the database
429Rate limit exceeded
500Internal 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.