Reference: Staff
Your staff team: roles, hours, leave, quotas, notes, strikes and performance.
Good to know
Authorization: Bearer tfy_…. Replace YOUR_SERVER_ID with your Discord server id. Errors are explained in Requests, errors and limits.GET /staff
GET /guilds/{guildId}/staff
Who the staff are.
| Key permission | staff.read (See staff) |
No request body.
Example
curl -X GET "https://api.technified.xyz/v1/guilds/YOUR_SERVER_ID/staff" \
-H "Authorization: Bearer $TECHNIFIED_KEY"GET /staff/activity
GET /guilds/{guildId}/staff/activity
Hours worked, by member and period.
| Key permission | staff.read (See staff) |
Query parameters
Added to the address after a ?, like ?limit=10&order=asc.
| Field | Type | Required | What it is |
|---|---|---|---|
days | integer | No | How many days back to count, 1 to 365.1 to 365 · default 30 |
discordUserId | string | No | Only this staff member (Discord user id).digits only |
limit | integer | No | How many people to answer with at most, 1 to 100.1 to 100 · default 25 |
includeInactive | "true" | "false" | No | false to leave out staff with no hours in the period.default "true" |
No request body.
Example
curl -X GET "https://api.technified.xyz/v1/guilds/YOUR_SERVER_ID/staff/activity" \
-H "Authorization: Bearer $TECHNIFIED_KEY"GET /staff/activity/leaderboard
GET /guilds/{guildId}/staff/activity/leaderboard
The same, ranked.
| Key permission | staff.read (See staff) |
Query parameters
Added to the address after a ?, like ?limit=10&order=asc.
| Field | Type | Required | What it is |
|---|---|---|---|
days | integer | No | How many days back to count, 1 to 365.1 to 365 · default 30 |
discordUserId | string | No | Only this staff member (Discord user id).digits only |
limit | integer | No | How many people to answer with at most, 1 to 100.1 to 100 · default 25 |
includeInactive | "true" | "false" | No | false to leave out staff with no hours in the period.default "true" |
No request body.
Example
curl -X GET "https://api.technified.xyz/v1/guilds/YOUR_SERVER_ID/staff/activity/leaderboard" \
-H "Authorization: Bearer $TECHNIFIED_KEY"POST /staff/activity/sessions/manual
POST /guilds/{guildId}/staff/activity/sessions/manual
Time worked away from a game, entered by hand and attributed to whoever entered it.
| Key permission | staff.write (Write notes and strikes) |
Request body
JSON, sent with Content-Type: application/json.
| Field | Type | Required | What it is |
|---|---|---|---|
discordUserId | string | Yes | The staff member who worked (Discord user id).digits only |
startedAt | string | Yes | When the work started (ISO 8601).ISO 8601 date and time |
endedAt | string | Yes | When it ended (ISO 8601).ISO 8601 date and time |
universeId | string | No | The game it counts for, if any (Roblox universe id).1 to 32 characters · digits only |
Example
curl -X POST "https://api.technified.xyz/v1/guilds/YOUR_SERVER_ID/staff/activity/sessions/manual" \
-H "Authorization: Bearer $TECHNIFIED_KEY" \
-H "Content-Type: application/json" \
-d '{"discordUserId":"123456789012345678","startedAt":"2026-11-01T18:00:00.000Z","endedAt":"2026-11-01T18:00:00.000Z"}'POST /staff/leave/{leaveId}/decide
POST /guilds/{guildId}/staff/leave/{leaveId}/decide
Approves or declines.
| Key permission | staff.manage (Manage staff roles, leave and quotas) |
In the address
| Field | Type | Required | What it is |
|---|---|---|---|
leaveId | string | Yes | A leave request’s id (lve_…). |
Request body
JSON, sent with Content-Type: application/json.
| Field | Type | Required | What it is |
|---|---|---|---|
decision | "approved" | "declined" | Yes | approved or declined. |
note | string or null | No | A word to the staff member, sent with the answer.at most 1000 characters · default null |
Example
curl -X POST "https://api.technified.xyz/v1/guilds/YOUR_SERVER_ID/staff/leave/LEAVEID/decide" \
-H "Authorization: Bearer $TECHNIFIED_KEY" \
-H "Content-Type: application/json" \
-d '{"decision":"approved"}'GET /staff/members/{discordUserId}
GET /guilds/{guildId}/staff/members/{discordUserId}
One staff member: their roles, records, hours and quota.
| Key permission | staff.read (See staff) |
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/staff/members/DISCORDUSERID" \
-H "Authorization: Bearer $TECHNIFIED_KEY"GET /staff/members/{discordUserId}/summary
GET /guilds/{guildId}/staff/members/{discordUserId}/summary
Only whether somebody is staff, and their roles and rank. member is null for somebody who is not. Reads one member, for a badge.
| Key permission | staff.read (See staff) |
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/staff/members/DISCORDUSERID/summary" \
-H "Authorization: Bearer $TECHNIFIED_KEY"{
"member": {
"discordUserId": "17929789298638349990004",
"userId": "usr_01M5TXYJQQ1CB83Q7KH3V40MR7",
"nickname": null,
"isAdministrator": false,
"rank": 200,
"roles": [
{
"id": "str_01M5TXYJQJSKT8MH128K65JPTZ",
"name": "Moderator",
"rank": 200
}
]
}
}GET /staff/performance
GET /guilds/{guildId}/staff/performance
The score, with the counts beside it.
| Key permission | staff.read (See staff) |
Query parameters
Added to the address after a ?, like ?limit=10&order=asc.
| Field | Type | Required | What it is |
|---|---|---|---|
days | integer | No | 1 to 365 · default 30 |
discordUserId | string | No | digits only |
limit | integer | No | 1 to 100 · default 25 |
includeInactive | "true" | "false" | No | default "true" |
No request body.
Example
curl -X GET "https://api.technified.xyz/v1/guilds/YOUR_SERVER_ID/staff/performance" \
-H "Authorization: Bearer $TECHNIFIED_KEY"GET /staff/performance/weights
GET /guilds/{guildId}/staff/performance/weights
| Key permission | staff.read (See staff) |
No request body.
Example
curl -X GET "https://api.technified.xyz/v1/guilds/YOUR_SERVER_ID/staff/performance/weights" \
-H "Authorization: Bearer $TECHNIFIED_KEY"PUT /staff/performance/weights
PUT /guilds/{guildId}/staff/performance/weights
| Key permission | staff.manage (Manage staff roles, leave and quotas) |
Request body
JSON, sent with Content-Type: application/json.
| Field | Type | Required | What it is |
|---|---|---|---|
perTicket | number | Yes | -100 to 100 |
perModerationAction | number | Yes | -100 to 100 |
perHourActive | number | Yes | -100 to 100 |
perApplicationReviewed | number | Yes | -100 to 100 |
perStrike | number | Yes | -100 to 100 |
Example
curl -X PUT "https://api.technified.xyz/v1/guilds/YOUR_SERVER_ID/staff/performance/weights" \
-H "Authorization: Bearer $TECHNIFIED_KEY" \
-H "Content-Type: application/json" \
-d '{"perTicket":-100,"perModerationAction":-100,"perHourActive":-100,"perApplicationReviewed":-100,"perStrike":-100}'GET /staff/quotas
GET /guilds/{guildId}/staff/quotas
| Key permission | staff.read (See staff) |
No request body.
Example
curl -X GET "https://api.technified.xyz/v1/guilds/YOUR_SERVER_ID/staff/quotas" \
-H "Authorization: Bearer $TECHNIFIED_KEY"POST /staff/quotas
POST /guilds/{guildId}/staff/quotas
| Key permission | staff.manage (Manage staff roles, leave and quotas) |
Request body
JSON, sent with Content-Type: application/json.
| Field | Type | Required | What it is |
|---|---|---|---|
name | string | Yes | 1 to 60 characters |
requiredHours | number | Yes | 0.016666666666666666 to 1000 |
periodDays | integer | Yes | 1 to 90 |
staffRoleIds | array of string | No | at most 25 items · default [] |
universeIds | array of string or null | No | at most 25 items · default null |
onMissed | "strike" | "notify" | "review" | No | default "notify" |
strikeSeverity | "low" | "medium" | "high" | No | default "low" |
enabled | boolean | No | default true |
Example
curl -X POST "https://api.technified.xyz/v1/guilds/YOUR_SERVER_ID/staff/quotas" \
-H "Authorization: Bearer $TECHNIFIED_KEY" \
-H "Content-Type: application/json" \
-d '{"name":"…","requiredHours":0.016666666666666666,"periodDays":1}'PATCH /staff/quotas/{quotaId}
PATCH /guilds/{guildId}/staff/quotas/{quotaId}
| Key permission | staff.manage (Manage staff roles, leave and quotas) |
In the address
| Field | Type | Required | What it is |
|---|---|---|---|
quotaId | string | Yes | A quota’s id (qta_…). |
Request body
JSON, sent with Content-Type: application/json.
| Field | Type | Required | What it is |
|---|---|---|---|
name | string | No | 1 to 60 characters |
requiredHours | number | No | 0.016666666666666666 to 1000 |
periodDays | integer | No | 1 to 90 |
staffRoleIds | array of string | No | at most 25 items · default [] |
universeIds | array of string or null | No | at most 25 items · default null |
onMissed | "strike" | "notify" | "review" | No | default "notify" |
strikeSeverity | "low" | "medium" | "high" | No | default "low" |
enabled | boolean | No | default true |
Example
curl -X PATCH "https://api.technified.xyz/v1/guilds/YOUR_SERVER_ID/staff/quotas/QUOTAID" \
-H "Authorization: Bearer $TECHNIFIED_KEY" \
-H "Content-Type: application/json" \
-d '{}'DELETE /staff/quotas/{quotaId}
DELETE /guilds/{guildId}/staff/quotas/{quotaId}
| Key permission | staff.manage (Manage staff roles, leave and quotas) |
In the address
| Field | Type | Required | What it is |
|---|---|---|---|
quotaId | string | Yes | A quota’s id (qta_…). |
No request body.
Example
curl -X DELETE "https://api.technified.xyz/v1/guilds/YOUR_SERVER_ID/staff/quotas/QUOTAID" \
-H "Authorization: Bearer $TECHNIFIED_KEY"GET /staff/quotas/progress
GET /guilds/{guildId}/staff/quotas/progress
How the caller is doing against their own quota.
| Key permission | Any key of this server. |
Query parameters
Added to the address after a ?, like ?limit=10&order=asc.
| Field | Type | Required | What it is |
|---|---|---|---|
discordUserId | string | No | at most 32 characters |
No request body.
Example
curl -X GET "https://api.technified.xyz/v1/guilds/YOUR_SERVER_ID/staff/quotas/progress" \
-H "Authorization: Bearer $TECHNIFIED_KEY"GET /staff/quotas/results
GET /guilds/{guildId}/staff/quotas/results
Finished periods and who met them.
| Key permission | staff.read (See staff) |
Query parameters
Added to the address after a ?, like ?limit=10&order=asc.
| Field | Type | Required | What it is |
|---|---|---|---|
reviewState | "pending" | "approved" | "dismissed" | No | |
discordUserId | string | No | digits only |
met | "true" | "false" | No | |
cursor | string | No | at most 40 characters |
limit | integer | No | 1 to 100 · default 50 |
No request body.
Example
curl -X GET "https://api.technified.xyz/v1/guilds/YOUR_SERVER_ID/staff/quotas/results" \
-H "Authorization: Bearer $TECHNIFIED_KEY"POST /staff/quotas/results/{resultId}/review
POST /guilds/{guildId}/staff/quotas/results/{resultId}/review
Excuses or confirms a missed period.
| Key permission | staff.manage (Manage staff roles, leave and quotas) |
In the address
| Field | Type | Required | What it is |
|---|---|---|---|
resultId | string | Yes | A quota result’s id (qtr_…). |
Request body
JSON, sent with Content-Type: application/json.
| Field | Type | Required | What it is |
|---|---|---|---|
decision | "approve" | "dismiss" | Yes |
Example
curl -X POST "https://api.technified.xyz/v1/guilds/YOUR_SERVER_ID/staff/quotas/results/RESULTID/review" \
-H "Authorization: Bearer $TECHNIFIED_KEY" \
-H "Content-Type: application/json" \
-d '{"decision":"approve"}'GET /staff/records
GET /guilds/{guildId}/staff/records
| Key permission | staff.read (See staff) |
Query parameters
Added to the address after a ?, like ?limit=10&order=asc.
| Field | Type | Required | What it is |
|---|---|---|---|
limit | integer | No | How many to answer with at most, 1 to 100.1 to 100 · default 25 |
cursor | string | No | The nextCursor of the page before, to get the next page. Absent: the first page.at most 64 characters |
order | "asc" | "desc" | No | desc for newest first, asc for oldest first.default "desc" |
kind | "strike" | "note" | No | strike or note. |
state | "active" | "expired" | "revoked" | No | Only records in this state. |
discordUserId | string | No | Only records about this staff member.digits only |
No request body.
Example
curl -X GET "https://api.technified.xyz/v1/guilds/YOUR_SERVER_ID/staff/records" \
-H "Authorization: Bearer $TECHNIFIED_KEY"POST /staff/records
POST /guilds/{guildId}/staff/records
| Key permission | staff.write (Write notes and strikes) |
Request body
JSON, sent with Content-Type: application/json.
kind decides whether it is a strike or a note.
kind: "strike" · A strike: a formal warning for staff.
| Field | Type | Required | What it is |
|---|---|---|---|
kind | "strike" | Yes | |
subjectDiscordUserId | string | Yes | The staff member it is about (Discord user id).digits only |
reason | string | Yes | What happened. The staff member sees it.1 to 2000 characters |
evidence | string or null | No | Links or words backing it up.at most 4000 characters · default null |
severity | "low" | "medium" | "high" | No | low, medium or high.default "low" |
expiresInDays | integer or null | No | Days until it stops counting, or null to count until it is withdrawn.1 to 3650 · default null |
actor | object | No | The person who used your tool, credited in the record. |
actor.label | string | No | Their name, shown in the record.1 to 100 characters |
actor.robloxUserId | string | No | Their Roblox user id.1 to 32 characters · digits only |
actor.discordUserId | string | No | Their Discord user id.digits only |
kind: "note" · A note: something to remember about a staff member.
| Field | Type | Required | What it is |
|---|---|---|---|
kind | "note" | Yes | |
subjectDiscordUserId | string | Yes | The staff member it is about (Discord user id).digits only |
reason | string | Yes | What happened. The staff member sees it.1 to 2000 characters |
evidence | string or null | No | Links or words backing it up.at most 4000 characters · default null |
important | boolean | No | Marks it so it stands out.default false |
actor | object | No | The person who used your tool, credited in the record. |
actor.label | string | No | Their name, shown in the record.1 to 100 characters |
actor.robloxUserId | string | No | Their Roblox user id.1 to 32 characters · digits only |
actor.discordUserId | string | No | Their Discord user id.digits only |
Example
curl -X POST "https://api.technified.xyz/v1/guilds/YOUR_SERVER_ID/staff/records" \
-H "Authorization: Bearer $TECHNIFIED_KEY" \
-H "Content-Type: application/json" \
-d '{"kind":"strike","subjectDiscordUserId":"123456789012345678","reason":"…"}'PATCH /staff/records/{recordId}
PATCH /guilds/{guildId}/staff/records/{recordId}
Amends one.
| Key permission | staff.write (Write notes and strikes) |
In the address
| Field | Type | Required | What it is |
|---|---|---|---|
recordId | string | Yes | A note’s or strike’s id (rec_…). |
Request body
JSON, sent with Content-Type: application/json.
| Field | Type | Required | What it is |
|---|---|---|---|
reason | string | No | 1 to 2000 characters |
evidence | string or null | No | at most 4000 characters |
severity | "low" | "medium" | "high" | No | |
important | boolean | No |
Example
curl -X PATCH "https://api.technified.xyz/v1/guilds/YOUR_SERVER_ID/staff/records/RECORDID" \
-H "Authorization: Bearer $TECHNIFIED_KEY" \
-H "Content-Type: application/json" \
-d '{}'POST /staff/records/{recordId}/revoke
POST /guilds/{guildId}/staff/records/{recordId}/revoke
Withdraws one. The record stays and says it was withdrawn.
| Key permission | staff.write (Write notes and strikes) |
In the address
| Field | Type | Required | What it is |
|---|---|---|---|
recordId | string | Yes | A note’s or strike’s id (rec_…). |
Request body
JSON, sent with Content-Type: application/json.
| Field | Type | Required | What it is |
|---|---|---|---|
reason | string | Yes | Why it is withdrawn.1 to 1000 characters |
Example
curl -X POST "https://api.technified.xyz/v1/guilds/YOUR_SERVER_ID/staff/records/RECORDID/revoke" \
-H "Authorization: Bearer $TECHNIFIED_KEY" \
-H "Content-Type: application/json" \
-d '{"reason":"…"}'POST /staff/refresh
POST /guilds/{guildId}/staff/refresh
Reads the member list again now, rather than when it is next due.
| Key permission | staff.read (See staff) |
No request body.
Example
curl -X POST "https://api.technified.xyz/v1/guilds/YOUR_SERVER_ID/staff/refresh" \
-H "Authorization: Bearer $TECHNIFIED_KEY"GET /staff/roles
GET /guilds/{guildId}/staff/roles
The staff roles and what each may do. A role with scope: "organization" applies on every server of the organization.
| Key permission | staff.read (See staff) |
No request body.
Example
curl -X GET "https://api.technified.xyz/v1/guilds/YOUR_SERVER_ID/staff/roles" \
-H "Authorization: Bearer $TECHNIFIED_KEY"{
"items": [
{
"id": "str_01M5TXYJQJSKT8MH128K65JPTZ",
"name": "Moderator",
"rank": 200,
"permissions": [
"moderation.read",
"moderation.write",
"tickets.read",
"tickets.write"
],
"matchType": "discord_role",
"discordRoleId": "17929789298638349990003",
"robloxGroupId": null,
"robloxMinRank": null,
"robloxMaxRank": null,
"robloxRoleId": null,
"robloxRoleName": null,
"scope": "guild"
}
]
}Still stuck? Get help from the Technified team.