Endpoint reference

Every v1 endpoint grouped by capability. Each endpoint lists the HTTP method, path, required scope, plan, and example response. The full OpenAPI document is served by the API at /openapi.json.

Link lookup

GET/api/v1/guilds/:guildId/discord-to-roblox/:userIdFREE

Resolve a Discord user’s linked Roblox account in this guild.

Returns the Discord↔Roblox link for members DreamSync has tracked in this guild. Free tier.

Scope: link:read
Example response
{
  "robloxId": 92658764,
  "cachedUsername": "evaera",
  "discordId": "113691352327389188",
  "guildId": "425800792679645204"
}
GET/api/v1/guilds/:guildId/roblox-to-discord/:robloxIdFREE

Resolve a Roblox user’s linked Discord account in this guild.

Inverse of discord-to-roblox. Same visibility rules.

Scope: link:read
Example response
{
  "robloxId": 92658764,
  "cachedUsername": "evaera",
  "discordId": "113691352327389188",
  "guildId": "425800792679645204"
}

Update

POST/api/v1/guilds/:guildId/update/:userIdFREE

Run the shared update engine on a member.

Evaluates bindings, applies roles and nickname changes, returns a structured result.

Scope: update:write
Example response
{
  "ok": true,
  "linked": true,
  "verified": true,
  "robloxId": 92658764,
  "rolesAdded": [
    "123"
  ],
  "rolesRemoved": [
    "789"
  ],
  "nickname": {
    "from": "oldname",
    "to": "evaera"
  },
  "bindingsEvaluated": 12,
  "bindingsMatched": 4,
  "requestId": "req_abc123"
}

Bans

GET/api/v1/guilds/:guildId/bansPRO

List Roblox bans in this guild.

Paginated via cursor. Pro tier.

Scope: bans:read
Example response
{
  "items": [
    {
      "guildId": "425800792679645204",
      "robloxId": 92658764,
      "cachedUsername": "evaera",
      "reason": "Cheating",
      "enforceDiscord": true,
      "createdAt": "2026-04-19T12:00:00Z",
      "liftedAt": null
    }
  ],
  "nextCursor": null
}
GET/api/v1/guilds/:guildId/bans/:robloxIdPRO

Fetch a single Roblox ban.

Pro tier.

Scope: bans:read
Example response
{
  "guildId": "425800792679645204",
  "robloxId": 92658764,
  "cachedUsername": "evaera",
  "reason": "Cheating",
  "enforceDiscord": true,
  "createdAt": "2026-04-19T12:00:00Z",
  "liftedAt": null
}
POST/api/v1/guilds/:guildId/bans/:robloxIdPRO

Ban a Roblox account from this guild.

Respects banConfig.enforceDiscord. Pro tier.

Scope: bans:write
Example request
{
  "reason": "Exploiting"
}
Example response
{
  "guildId": "425800792679645204",
  "robloxId": 92658764,
  "reason": "Exploiting",
  "enforceDiscord": true,
  "discordUserBanned": true,
  "createdAt": "2026-04-19T12:00:00Z",
  "liftedAt": null
}
DELETE/api/v1/guilds/:guildId/bans/:robloxIdPRO

Lift a Roblox ban.

Pro tier.

Scope: bans:write
Example response
{
  "guildId": "425800792679645204",
  "robloxId": 92658764,
  "lifted": true,
  "discordUserUnbanned": true
}

Roles

GET/api/v1/guilds/:guildId/discord-has-role/:userId/:roleIdDEVELOPER

Check whether a Discord user has a role.

Developer tier.

Scope: roles:check
Example response
{
  "guildId": "425800792679645204",
  "discordId": "113691352327389188",
  "roleId": "987654321098765432",
  "hasRole": true
}
GET/api/v1/guilds/:guildId/roblox-has-role/:robloxId/:roleIdDEVELOPER

Check whether a Roblox user’s linked Discord account has a role.

Developer tier.

Scope: roles:check
Example response
{
  "guildId": "425800792679645204",
  "robloxId": 92658764,
  "discordId": "113691352327389188",
  "roleId": "987654321098765432",
  "hasRole": true
}

API keys

DELETE/api/v1/api-keyFREE

Self-revoke the API key used for the request.

After revocation, further requests with the same key fail with HTTP 401.

Scope: link:read
Example response
{
  "revoked": true,
  "id": "clxxx",
  "prefix": "abcd1234"
}