Reference: Role sync and groups
Role sync rules, and your Roblox group: members, ranks, join requests, and Roblox ranks from Discord roles.
Good to know
Authorization: Bearer tfy_…. Replace YOUR_SERVER_ID with your Discord server id. Errors are explained in Requests, errors and limits.GET /bindings
GET /guilds/{guildId}/bindings
| Key permission | bindings.read (See role rules) |
No request body.
Example
curl -X GET "https://api.technified.xyz/v1/guilds/YOUR_SERVER_ID/bindings" \
-H "Authorization: Bearer $TECHNIFIED_KEY"{
"items": [
{
"id": "bnd_01M5TXYKJ4EJ5XZ9K4D2RMZWRC",
"name": "Officers",
"discordRoleId": "17929789298638349990006",
"priority": 0,
"condition": {
"type": "group",
"groupId": "7",
"minRank": 100,
"maxRank": 199
},
"createdAt": "2026-10-26T01:42:11.268Z"
}
]
}POST /bindings
POST /guilds/{guildId}/bindings
| Key permission | bindings.write (Change role rules) |
Request body
JSON, sent with Content-Type: application/json.
| Field | Type | Required | What it is |
|---|---|---|---|
name | string or null | No | A name your team recognises the rule by, or null.at most 60 characters · default null |
discordRoleId | string | Yes | The Discord role the rule gives (role id).digits only |
priority | integer | No | Order rules are shown and explained in, 0 to 1000.0 to 1000 · default 0 |
condition | object, one of the shapes below | Yes | When the role is given. type decides which other fields it takes. |
condition takes one of these shapes:
type: "group" · In a Roblox group, optionally within a rank range or with one role.
| Field | Type | Required | What it is |
|---|---|---|---|
type | "group" | Yes | |
groupId | string | Yes | The Roblox group id.1 to 32 characters · digits only |
minRank | integer | No | Lowest rank that counts, 0 to 255. Absent: any rank.0 to 255 |
maxRank | integer | No | Highest rank that counts, 0 to 255. Absent: any rank.0 to 255 |
roleId | string | No | One group role instead of a rank range: whoever holds it, whatever else they hold.1 to 32 characters · digits only |
roleName | string | No | That role’s name, kept for display only.at most 100 characters |
type: "gamepass" · Owns a game pass.
| Field | Type | Required | What it is |
|---|---|---|---|
type | "gamepass" | Yes | |
gamePassId | string | Yes | The game pass id.1 to 32 characters · digits only |
type: "asset" · Owns an item.
| Field | Type | Required | What it is |
|---|---|---|---|
type | "asset" | Yes | |
assetId | string | Yes | The item (asset) id.1 to 32 characters · digits only |
type: "badge" · Has a badge.
| Field | Type | Required | What it is |
|---|---|---|---|
type | "badge" | Yes | |
badgeId | string | Yes | The badge id.1 to 32 characters · digits only |
type: "account_age" · Account is old enough.
| Field | Type | Required | What it is |
|---|---|---|---|
type | "account_age" | Yes | |
platform | "roblox" | "discord" | Yes | Which account is measured. |
minDays | integer | Yes | How many days old it must be.1 to 10000 |
Example
curl -X POST "https://api.technified.xyz/v1/guilds/YOUR_SERVER_ID/bindings" \
-H "Authorization: Bearer $TECHNIFIED_KEY" \
-H "Content-Type: application/json" \
-d '{"name":"Officers","discordRoleId":"17929789298638349990006","condition":{"type":"group","groupId":"7","minRank":100,"maxRank":199}}'{
"id": "bnd_01M5TXYKJ4EJ5XZ9K4D2RMZWRC",
"name": "Officers",
"discordRoleId": "17929789298638349990006",
"priority": 0,
"condition": {
"type": "group",
"groupId": "7",
"minRank": 100,
"maxRank": 199
},
"createdAt": "2026-10-26T01:42:11.268Z"
}PATCH /bindings/{bindingId}
PATCH /guilds/{guildId}/bindings/{bindingId}
| Key permission | bindings.write (Change role rules) |
In the address
| Field | Type | Required | What it is |
|---|---|---|---|
bindingId | string | Yes | A role sync rule’s id (bnd_…). |
Request body
JSON, sent with Content-Type: application/json.
| Field | Type | Required | What it is |
|---|---|---|---|
name | string or null | No | A name your team recognises the rule by, or null.at most 60 characters |
priority | integer | No | Order rules are shown and explained in, 0 to 1000.0 to 1000 |
condition | object, one of the shapes below | No | When the role is given. type decides which other fields it takes. |
condition takes one of these shapes:
type: "group" · In a Roblox group, optionally within a rank range or with one role.
| Field | Type | Required | What it is |
|---|---|---|---|
type | "group" | Yes | |
groupId | string | Yes | The Roblox group id.1 to 32 characters · digits only |
minRank | integer | No | Lowest rank that counts, 0 to 255. Absent: any rank.0 to 255 |
maxRank | integer | No | Highest rank that counts, 0 to 255. Absent: any rank.0 to 255 |
roleId | string | No | One group role instead of a rank range: whoever holds it, whatever else they hold.1 to 32 characters · digits only |
roleName | string | No | That role’s name, kept for display only.at most 100 characters |
type: "gamepass" · Owns a game pass.
| Field | Type | Required | What it is |
|---|---|---|---|
type | "gamepass" | Yes | |
gamePassId | string | Yes | The game pass id.1 to 32 characters · digits only |
type: "asset" · Owns an item.
| Field | Type | Required | What it is |
|---|---|---|---|
type | "asset" | Yes | |
assetId | string | Yes | The item (asset) id.1 to 32 characters · digits only |
type: "badge" · Has a badge.
| Field | Type | Required | What it is |
|---|---|---|---|
type | "badge" | Yes | |
badgeId | string | Yes | The badge id.1 to 32 characters · digits only |
type: "account_age" · Account is old enough.
| Field | Type | Required | What it is |
|---|---|---|---|
type | "account_age" | Yes | |
platform | "roblox" | "discord" | Yes | Which account is measured. |
minDays | integer | Yes | How many days old it must be.1 to 10000 |
Example
curl -X PATCH "https://api.technified.xyz/v1/guilds/YOUR_SERVER_ID/bindings/BINDINGID" \
-H "Authorization: Bearer $TECHNIFIED_KEY" \
-H "Content-Type: application/json" \
-d '{}'DELETE /bindings/{bindingId}
DELETE /guilds/{guildId}/bindings/{bindingId}
| Key permission | bindings.write (Change role rules) |
In the address
| Field | Type | Required | What it is |
|---|---|---|---|
bindingId | string | Yes | A role sync rule’s id (bnd_…). |
No request body.
Example
curl -X DELETE "https://api.technified.xyz/v1/guilds/YOUR_SERVER_ID/bindings/BINDINGID" \
-H "Authorization: Bearer $TECHNIFIED_KEY"GET /bindings/preview/{discordUserId}
GET /guilds/{guildId}/bindings/preview/{discordUserId}
What would happen to one member. Changes nothing. Show this before any bulk action.
| Key permission | bindings.read (See role rules) |
In the address
| Field | Type | Required | What it is |
|---|---|---|---|
discordUserId | string | Yes | A Discord user id (digits). |
No request body.
Example
curl -X GET "https://api.technified.xyz/v1/guilds/YOUR_SERVER_ID/bindings/preview/DISCORDUSERID" \
-H "Authorization: Bearer $TECHNIFIED_KEY"GET /bindings/roblox-group/{groupId}
GET /guilds/{guildId}/bindings/roblox-group/{groupId}
A Roblox group's name and ranks, for building a rule.
| Key permission | bindings.write (Change role rules) |
In the address
| Field | Type | Required | What it is |
|---|---|---|---|
groupId | string | Yes | The Roblox group id (the number in the group’s address on roblox.com). |
No request body.
Example
curl -X GET "https://api.technified.xyz/v1/guilds/YOUR_SERVER_ID/bindings/roblox-group/GROUPID" \
-H "Authorization: Bearer $TECHNIFIED_KEY"POST /bindings/sync/{discordUserId}
POST /guilds/{guildId}/bindings/sync/{discordUserId}
Applies to one member now.
| Key permission | bindings.write (Change role rules) |
In the address
| Field | Type | Required | What it is |
|---|---|---|---|
discordUserId | string | Yes | A Discord user id (digits). |
No request body.
Example
curl -X POST "https://api.technified.xyz/v1/guilds/YOUR_SERVER_ID/bindings/sync/DISCORDUSERID" \
-H "Authorization: Bearer $TECHNIFIED_KEY"GET /group-binds
GET /guilds/{guildId}/group-binds
| Key permission | groups.read (See Roblox groups) |
No request body.
Example
curl -X GET "https://api.technified.xyz/v1/guilds/YOUR_SERVER_ID/group-binds" \
-H "Authorization: Bearer $TECHNIFIED_KEY"POST /group-binds
POST /guilds/{guildId}/group-binds
| Key permission | groups.write (Change Roblox group ranks) |
Request body
JSON, sent with Content-Type: application/json.
| Field | Type | Required | What it is |
|---|---|---|---|
discordRoleId | string | Yes | digits only |
robloxGroupId | string | Yes | 1 to 32 characters · digits only |
robloxRoleId | string | Yes | 1 to 32 characters · digits only |
mode | "rank" | "extra" | No | default "rank" |
minAccountAgeDays | integer or null | No | 1 to 3650 · default null |
Example
curl -X POST "https://api.technified.xyz/v1/guilds/YOUR_SERVER_ID/group-binds" \
-H "Authorization: Bearer $TECHNIFIED_KEY" \
-H "Content-Type: application/json" \
-d '{"discordRoleId":"123456789012345678","robloxGroupId":"123456789012345678","robloxRoleId":"123456789012345678"}'DELETE /group-binds/{bindId}
DELETE /guilds/{guildId}/group-binds/{bindId}
Removes one.
| Key permission | groups.write (Change Roblox group ranks) |
In the address
| Field | Type | Required | What it is |
|---|---|---|---|
bindId | string | Yes | A Roblox rank rule’s id (gbd_…). |
No request body.
Example
curl -X DELETE "https://api.technified.xyz/v1/guilds/YOUR_SERVER_ID/group-binds/BINDID" \
-H "Authorization: Bearer $TECHNIFIED_KEY"GET /groups/{groupId}
GET /guilds/{guildId}/groups/{groupId}
The group as its Roblox page shows it: icon, description, owner, shout, size, whether joining needs a request.
| Key permission | groups.read (See Roblox groups) |
In the address
| Field | Type | Required | What it is |
|---|---|---|---|
groupId | string | Yes | The Roblox group id (the number in the group’s address on roblox.com). |
No request body.
Example
curl -X GET "https://api.technified.xyz/v1/guilds/YOUR_SERVER_ID/groups/GROUPID" \
-H "Authorization: Bearer $TECHNIFIED_KEY"GET /groups/{groupId}/history
GET /guilds/{guildId}/groups/{groupId}/history
Rank changes and join decisions made through Technified, newest first.
| Key permission | groups.read (See Roblox groups) |
In the address
| Field | Type | Required | What it is |
|---|---|---|---|
groupId | string | Yes | The Roblox group id (the number in the group’s address on roblox.com). |
Query parameters
Added to the address after a ?, like ?limit=10&order=asc.
| Field | Type | Required | What it is |
|---|---|---|---|
cursor | string | No | The nextCursor of the page before, to get the next page. Absent: the first page.at most 64 characters |
limit | integer | No | How many to answer with at most, 1 to 100.1 to 100 · default 25 |
No request body.
Example
curl -X GET "https://api.technified.xyz/v1/guilds/YOUR_SERVER_ID/groups/GROUPID/history" \
-H "Authorization: Bearer $TECHNIFIED_KEY"GET /groups/{groupId}/join-requests
GET /guilds/{guildId}/groups/{groupId}/join-requests
| Key permission | groups.read (See Roblox groups) |
In the address
| Field | Type | Required | What it is |
|---|---|---|---|
groupId | string | Yes | The Roblox group id (the number in the group’s address on roblox.com). |
Query parameters
Added to the address after a ?, like ?limit=10&order=asc.
| Field | Type | Required | What it is |
|---|---|---|---|
cursor | string | No | The nextCursor of the page before.at most 1024 characters |
No request body.
Example
curl -X GET "https://api.technified.xyz/v1/guilds/YOUR_SERVER_ID/groups/GROUPID/join-requests" \
-H "Authorization: Bearer $TECHNIFIED_KEY"POST /groups/{groupId}/join-requests
POST /guilds/{guildId}/groups/{groupId}/join-requests
| Key permission | groups.write (Change Roblox group ranks) |
In the address
| Field | Type | Required | What it is |
|---|---|---|---|
groupId | string | Yes | The Roblox group id (the number in the group’s address on roblox.com). |
Request body
JSON, sent with Content-Type: application/json.
| Field | Type | Required | What it is |
|---|---|---|---|
robloxUserId | string | Yes | The person who asked to join (Roblox user id).1 to 32 characters · digits only |
decision | "accept" | "decline" | Yes | accept or decline. |
Example
curl -X POST "https://api.technified.xyz/v1/guilds/YOUR_SERVER_ID/groups/GROUPID/join-requests" \
-H "Authorization: Bearer $TECHNIFIED_KEY" \
-H "Content-Type: application/json" \
-d '{"robloxUserId":"123456789012345678","decision":"accept"}'POST /groups/{groupId}/join-requests/batch
POST /guilds/{guildId}/groups/{groupId}/join-requests/batch
Accepts or declines up to 25 at once; one that fails does not stop the rest.
| Key permission | groups.write (Change Roblox group ranks) |
In the address
| Field | Type | Required | What it is |
|---|---|---|---|
groupId | string | Yes | The Roblox group id (the number in the group’s address on roblox.com). |
Request body
JSON, sent with Content-Type: application/json.
| Field | Type | Required | What it is |
|---|---|---|---|
robloxUserIds | array of string | Yes | The people who asked to join (Roblox user ids), 1 to 25.1 to 25 items |
decision | "accept" | "decline" | Yes | accept or decline. |
Example
curl -X POST "https://api.technified.xyz/v1/guilds/YOUR_SERVER_ID/groups/GROUPID/join-requests/batch" \
-H "Authorization: Bearer $TECHNIFIED_KEY" \
-H "Content-Type: application/json" \
-d '{"robloxUserIds":["123456789012345678"],"decision":"accept"}'GET /groups/{groupId}/members
GET /guilds/{guildId}/groups/{groupId}/members
Who is in the group, paged.
| Key permission | groups.read (See Roblox groups) |
In the address
| Field | Type | Required | What it is |
|---|---|---|---|
groupId | string | Yes | The Roblox group id (the number in the group’s address on roblox.com). |
Query parameters
Added to the address after a ?, like ?limit=10&order=asc.
| Field | Type | Required | What it is |
|---|---|---|---|
cursor | string | No | The nextCursor of the page before.at most 1024 characters |
roleId | string | No | Only members holding this group role (role id). Needs the server’s Roblox API key. |
No request body.
Example
curl -X GET "https://api.technified.xyz/v1/guilds/YOUR_SERVER_ID/groups/GROUPID/members" \
-H "Authorization: Bearer $TECHNIFIED_KEY"POST /groups/{groupId}/members
POST /guilds/{guildId}/groups/{groupId}/members
Sets somebody's rank.
| Key permission | groups.write (Change Roblox group ranks) |
In the address
| Field | Type | Required | What it is |
|---|---|---|---|
groupId | string | Yes | The Roblox group id (the number in the group’s address on roblox.com). |
Request body
JSON, sent with Content-Type: application/json.
| Field | Type | Required | What it is |
|---|---|---|---|
robloxUserId | string | Yes | The member whose rank changes (Roblox user id).1 to 32 characters · digits only |
robloxRoleId | string | Yes | The group role to give them (its id, from the ranks endpoint). It must be below your own rank in the group.1 to 32 characters · digits only |
Example
curl -X POST "https://api.technified.xyz/v1/guilds/YOUR_SERVER_ID/groups/GROUPID/members" \
-H "Authorization: Bearer $TECHNIFIED_KEY" \
-H "Content-Type: application/json" \
-d '{"robloxUserId":"123456789012345678","robloxRoleId":"123456789012345678"}'GET /groups/{groupId}/members/search
GET /guilds/{guildId}/groups/{groupId}/members/search
| Key permission | groups.read (See Roblox groups) |
In the address
| Field | Type | Required | What it is |
|---|---|---|---|
groupId | string | Yes | The Roblox group id (the number in the group’s address on roblox.com). |
Query parameters
Added to the address after a ?, like ?limit=10&order=asc.
| Field | Type | Required | What it is |
|---|---|---|---|
q | string | Yes | A whole Roblox username or id, or part of the name of a member verified here. |
No request body.
Example
curl -X GET "https://api.technified.xyz/v1/guilds/YOUR_SERVER_ID/groups/GROUPID/members/search?q=Q" \
-H "Authorization: Bearer $TECHNIFIED_KEY"GET /groups/{groupId}/ranks
GET /guilds/{guildId}/groups/{groupId}/ranks
The ranks a group offers, with how many members hold each.
| Key permission | groups.read (See Roblox groups) |
In the address
| Field | Type | Required | What it is |
|---|---|---|---|
groupId | string | Yes | The Roblox group id (the number in the group’s address on roblox.com). |
No request body.
Example
curl -X GET "https://api.technified.xyz/v1/guilds/YOUR_SERVER_ID/groups/GROUPID/ranks" \
-H "Authorization: Bearer $TECHNIFIED_KEY"GET /groups/credential
GET /guilds/{guildId}/groups/credential
Which Roblox account the server acts as, and whether it still works. Never the credential itself.
| Key permission | groups.read (See Roblox groups) |
No request body.
Example
curl -X GET "https://api.technified.xyz/v1/guilds/YOUR_SERVER_ID/groups/credential" \
-H "Authorization: Bearer $TECHNIFIED_KEY"POST /groups/credential/test
POST /guilds/{guildId}/groups/credential/test
Checks it still works. Show this before anybody blames the product.
| Key permission | groups.write (Change Roblox group ranks) |
No request body.
Example
curl -X POST "https://api.technified.xyz/v1/guilds/YOUR_SERVER_ID/groups/credential/test" \
-H "Authorization: Bearer $TECHNIFIED_KEY"Still stuck? Get help from the Technified team.