Reference: Moderation
Bans, mutes, kicks and warnings on Discord and Roblox: checking, issuing, lifting, and the templates and rules behind them.
Good to know
Authorization: Bearer tfy_…. Replace YOUR_SERVER_ID with your Discord server id. Errors are explained in Requests, errors and limits.GET /moderation/decay
GET /guilds/{guildId}/moderation/decay
| Key permission | moderation.read (See punishments) |
No request body.
Example
curl -X GET "https://api.technified.xyz/v1/guilds/YOUR_SERVER_ID/moderation/decay" \
-H "Authorization: Bearer $TECHNIFIED_KEY"PUT /moderation/decay
PUT /guilds/{guildId}/moderation/decay
| Key permission | moderation.write (Issue and lift punishments) |
Request body
JSON, sent with Content-Type: application/json.
| Field | Type | Required | What it is |
|---|---|---|---|
rules | array of objects | Yes | One rule per type. The list replaces the rules there were.at most 5 items |
rules[].type | "ban" | "mute" | "warning" | "kick" | "serverban" | Yes | ban, mute, warning, kick, or serverban (one live Roblox server only, given by a game). |
rules[].afterDays | integer | Yes | Days after which a punishment of this type stops counting.1 to 3650 |
rules[].enabled | boolean | No | default true |
Example
curl -X PUT "https://api.technified.xyz/v1/guilds/YOUR_SERVER_ID/moderation/decay" \
-H "Authorization: Bearer $TECHNIFIED_KEY" \
-H "Content-Type: application/json" \
-d '{"rules":[{"type":"ban","afterDays":1}]}'GET /moderation/evidence/{evidenceId}
GET /guilds/{guildId}/moderation/evidence/{evidenceId}
The file itself.
| Key permission | moderation.evidence (See evidence) |
In the address
| Field | Type | Required | What it is |
|---|---|---|---|
evidenceId | string | Yes | An evidence file’s id (evd_…), from the punishment’s evidence. |
No request body.
Example
curl -X GET "https://api.technified.xyz/v1/guilds/YOUR_SERVER_ID/moderation/evidence/EVIDENCEID" \
-H "Authorization: Bearer $TECHNIFIED_KEY"GET /moderation/history
GET /guilds/{guildId}/moderation/history
One person's whole history, across both platforms.
| Key permission | moderation.read (See punishments) |
Query parameters
Added to the address after a ?, like ?limit=10&order=asc.
| Field | Type | Required | What it is |
|---|---|---|---|
platform | "discord" | "roblox" | No | discord for a Discord account, roblox for a Roblox account. |
discordUserId | string | No | The Discord user id. Give this, the Roblox user id, or both.1 to 32 characters · digits only |
robloxUserId | string | No | The Roblox user id.1 to 32 characters · digits only |
No request body.
Example
curl -X GET "https://api.technified.xyz/v1/guilds/YOUR_SERVER_ID/moderation/history" \
-H "Authorization: Bearer $TECHNIFIED_KEY"{
"items": [
{
"id": "pun_01M5TXYJZ7RX9QF2S9V82H3AK1",
"platform": "roblox",
"type": "ban",
"state": "active",
"reach": "guild",
"guildId": "gld_01M5TXYJPNJZ19BDXJCNTD8WDW",
"target": {
"id": "261",
"label": "shedletsky",
"userId": null
},
"reason": "Exploiting",
"evidenceNote": null,
"durationSeconds": 604800,
"expiresAt": "2026-11-02T01:42:10.652Z",
"decaysAt": null,
"robloxScope": "global",
"universeId": null,
"gameServerId": null,
"source": "api",
"issuer": {
"type": "user",
"id": "usr_01M5TXYJQQ1CB83Q7KH3V40MR7",
"label": "tester4"
},
"delivery": {
"platform": "pending",
"platformError": null,
"gameServersNotified": 0,
"logChannel": "skipped",
"attemptedAt": "2026-10-26T01:42:10.677Z",
"notified": "skipped"
},
"revokedAt": null,
"revokedBy": null,
"revokeReason": null,
"replacedById": null,
"createdAt": "2026-10-26T01:42:10.663Z"
}
],
"sharedAcrossOrganization": false
}GET /moderation/issuers
GET /guilds/{guildId}/moderation/issuers
| Key permission | moderation.read (See punishments) |
No request body.
Example
curl -X GET "https://api.technified.xyz/v1/guilds/YOUR_SERVER_ID/moderation/issuers" \
-H "Authorization: Bearer $TECHNIFIED_KEY"GET /moderation/outside
GET /guilds/{guildId}/moderation/outside
{ auditLog }: whether the bot may view the server's audit log (null when Discord could not be asked). Only then does Discord tell it about bans, kicks and timeouts given without Technified. Those are recorded from the gateway (GUILD_AUDIT_LOG_ENTRY_CREATE) as punishments with source: "outside", issued by whoever did it, reaching this server only, posted to the log channel and written to the audit log, unless settings.moderation.recordOutside is false. Nobody is messaged. Lifting a ban or timeout in Discord lifts the active one Technified holds, except one that reaches the organization. What the bot does itself is passed over.
| Key permission | settings.read (See settings) |
No request body.
Example
curl -X GET "https://api.technified.xyz/v1/guilds/YOUR_SERVER_ID/moderation/outside" \
-H "Authorization: Bearer $TECHNIFIED_KEY"GET /moderation/punishments
GET /guilds/{guildId}/moderation/punishments
The list, filterable by platform, type, state, target, issuer and date. q matches the recorded name, the account id, and anybody whose Discord name or nickname starts with it, so somebody punished by id alone is still found by name.
| Key permission | moderation.read (See punishments) |
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" |
platform | "discord" | "roblox" | No | discord for a Discord account, roblox for a Roblox account. |
type | "ban" | "mute" | "warning" | "kick" | "serverban" | No | ban, mute, warning, kick, or serverban (one live Roblox server only, given by a game). |
state | "active" | "expired" | "revoked" | "replaced" | No | Only punishments in this state, for example active. |
targetId | string | No | Only punishments against this account id.1 to 32 characters · digits only |
q | string | No | A name or an account id, as somebody would type it into a search box.1 to 64 characters |
issuerId | string | No | Only punishments given by this person or key (a Technified id).at most 40 characters |
from | string | No | Only those given at or after this time (ISO 8601).ISO 8601 date and time |
to | string | No | Only those given before this time (ISO 8601).ISO 8601 date and time |
No request body.
Example
curl -X GET "https://api.technified.xyz/v1/guilds/YOUR_SERVER_ID/moderation/punishments" \
-H "Authorization: Bearer $TECHNIFIED_KEY"{
"items": [
{
"id": "pun_01M5TXYJZ7RX9QF2S9V82H3AK1",
"platform": "roblox",
"type": "ban",
"state": "active",
"reach": "guild",
"guildId": "gld_01M5TXYJPNJZ19BDXJCNTD8WDW",
"target": {
"id": "261",
"label": "shedletsky",
"userId": null
},
"reason": "Exploiting",
"evidenceNote": null,
"durationSeconds": 604800,
"expiresAt": "2026-11-02T01:42:10.652Z",
"decaysAt": null,
"robloxScope": "global",
"universeId": null,
"gameServerId": null,
"source": "api",
"issuer": {
"type": "user",
"id": "usr_01M5TXYJQQ1CB83Q7KH3V40MR7",
"label": "tester4"
},
"delivery": {
"platform": "pending",
"platformError": null,
"gameServersNotified": 0,
"logChannel": "skipped",
"attemptedAt": "2026-10-26T01:42:10.677Z",
"notified": "skipped"
},
"revokedAt": null,
"revokedBy": null,
"revokeReason": null,
"replacedById": null,
"createdAt": "2026-10-26T01:42:10.663Z"
}
],
"nextCursor": null
}POST /moderation/punishments
POST /guilds/{guildId}/moderation/punishments
Issues one. type is ban, mute, warning, kick, or serverban: a ban from one live Roblox server, which only a key may give, naming the server as originServerId; it bars nobody elsewhere, ends when that server closes, and is never sent to other servers. Staff may only act against somebody ranked below them, on Roblox too: a Roblox account counts as the Discord member who linked it here. A Discord mute must end, within 28 days (422 otherwise), because Discord mutes no longer and a mute without an end reads to Discord as lifting one. The person is told by direct message first (delivery.notified), with the reason, the end, and whether an appeal form is open. A Discord punishment that reaches the organization is carried out on each of its other servers too (delivery.elsewhere).
| Key permission | moderation.write (Issue and lift punishments) |
| Retry safely | Send an Idempotency-Key header; a retry with the same one is not done twice. |
Request body
JSON, sent with Content-Type: application/json.
| Field | Type | Required | What it is |
|---|---|---|---|
platform | "discord" | "roblox" | Yes | discord for a Discord account, roblox for a Roblox account. |
type | "ban" | "mute" | "warning" | "kick" | "serverban" | Yes | ban, mute, warning, kick, or serverban (one live Roblox server only, given by a game). |
targetId | string | Yes | The account, as digits in a string: a Discord user id for discord, a Roblox user id for roblox.1 to 32 characters · digits only |
targetLabel | string | No | Their name as you know it, shown when the account cannot be looked up.at most 100 characters |
reason | string | Yes | Why. The person is told this, so write it for them.1 to 1000 characters |
durationSeconds | integer or null | No | How long, in seconds: 604800 is 7 days. null or absent is permanent. A kick takes none; a Discord mute needs one of at most 28 days.60 to 315360000 · default null |
evidenceNote | string or null | No | A note only staff see, for example a link to a clip.at most 4000 characters · default null |
reach | "guild" | "organization" | No | guild for this server only, organization for every server of its organization. Absent: the server default. |
robloxScope | "global" | "universe" | No | Roblox only. global: every game of this server. universe: only the game named in universeId. Absent: the server default. |
universeId | string or null | No | The Roblox universe id of the one game, when robloxScope is universe.at most 32 characters · default null |
source | "dashboard" | "discord" | "game" | "api" | "filter" | No | Where it came from, for the record. Leave it out: your program is api.default "api" |
templateId | string | No | The template it was given from, for the record only.at most 40 characters |
originServerId | string or null | No | Only for the game module: the live server it was given in.at most 40 characters · default null |
actor | object | No | The person who used your tool, so the record names them and not only your key. Credited by name when their account is linked on this server. |
actor.label | string | Yes | Their name, shown in the record.1 to 100 characters |
actor.robloxUserId | string | No | Their Roblox user id, if you know it.1 to 32 characters · digits only |
actor.discordUserId | string | No | Their Discord user id, if you know it.1 to 32 characters · digits only |
Example
curl -X POST "https://api.technified.xyz/v1/guilds/YOUR_SERVER_ID/moderation/punishments" \
-H "Authorization: Bearer $TECHNIFIED_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{"platform":"roblox","type":"ban","targetId":"261","targetLabel":"shedletsky","reason":"Exploiting","durationSeconds":604800,"actor":{"label":"Lena","discordUserId":"17929789298638349990004"}}'{
"punishment": {
"id": "pun_01M5TXYJZ7RX9QF2S9V82H3AK1",
"platform": "roblox",
"type": "ban",
"state": "active",
"reach": "guild",
"guildId": "gld_01M5TXYJPNJZ19BDXJCNTD8WDW",
"target": {
"id": "261",
"label": "shedletsky",
"userId": null
},
"reason": "Exploiting",
"evidenceNote": null,
"durationSeconds": 604800,
"expiresAt": "2026-11-02T01:42:10.652Z",
"decaysAt": null,
"robloxScope": "global",
"universeId": null,
"gameServerId": null,
"source": "api",
"issuer": {
"type": "user",
"id": "usr_01M5TXYJQQ1CB83Q7KH3V40MR7",
"label": "tester4"
},
"delivery": {
"platform": "pending",
"platformError": null,
"gameServersNotified": 0,
"logChannel": "skipped",
"attemptedAt": "2026-10-26T01:42:10.677Z",
"notified": "skipped"
},
"revokedAt": null,
"revokedBy": null,
"revokeReason": null,
"replacedById": null,
"createdAt": "2026-10-26T01:42:10.663Z"
},
"replaced": null
}GET /moderation/punishments/{punishmentId}
GET /guilds/{guildId}/moderation/punishments/{punishmentId}
One punishment, including how delivery went, and mayLift: whether the caller may lift it.
| Key permission | moderation.read (See punishments) |
In the address
| Field | Type | Required | What it is |
|---|---|---|---|
punishmentId | string | Yes | A punishment’s id (pun_…), from the list or from issuing it. |
No request body.
Example
curl -X GET "https://api.technified.xyz/v1/guilds/YOUR_SERVER_ID/moderation/punishments/PUNISHMENTID" \
-H "Authorization: Bearer $TECHNIFIED_KEY"{
"id": "pun_01M5TXYJZ7RX9QF2S9V82H3AK1",
"platform": "roblox",
"type": "ban",
"state": "active",
"reach": "guild",
"guildId": "gld_01M5TXYJPNJZ19BDXJCNTD8WDW",
"target": {
"id": "261",
"label": "shedletsky",
"userId": null
},
"reason": "Exploiting",
"evidenceNote": null,
"durationSeconds": 604800,
"expiresAt": "2026-11-02T01:42:10.652Z",
"decaysAt": null,
"robloxScope": "global",
"universeId": null,
"gameServerId": null,
"source": "api",
"issuer": {
"type": "user",
"id": "usr_01M5TXYJQQ1CB83Q7KH3V40MR7",
"label": "tester4"
},
"delivery": {
"platform": "pending",
"platformError": null,
"gameServersNotified": 0,
"logChannel": "skipped",
"attemptedAt": "2026-10-26T01:42:10.677Z",
"notified": "skipped"
},
"revokedAt": null,
"revokedBy": null,
"revokeReason": null,
"replacedById": null,
"createdAt": "2026-10-26T01:42:10.663Z",
"mayLift": true
}POST /moderation/punishments/{punishmentId}/deliver
POST /guilds/{guildId}/moderation/punishments/{punishmentId}/deliver
Tries again to carry out an active punishment Discord refused, or that no live game held yet.
| Key permission | moderation.write (Issue and lift punishments) |
In the address
| Field | Type | Required | What it is |
|---|---|---|---|
punishmentId | string | Yes | A punishment’s id (pun_…), from the list or from issuing it. |
No request body.
Example
curl -X POST "https://api.technified.xyz/v1/guilds/YOUR_SERVER_ID/moderation/punishments/PUNISHMENTID/deliver" \
-H "Authorization: Bearer $TECHNIFIED_KEY"GET /moderation/punishments/{punishmentId}/evidence
GET /guilds/{guildId}/moderation/punishments/{punishmentId}/evidence
What is attached.
| Key permission | moderation.evidence (See evidence) |
In the address
| Field | Type | Required | What it is |
|---|---|---|---|
punishmentId | string | Yes | A punishment’s id (pun_…), from the list or from issuing it. |
No request body.
Example
curl -X GET "https://api.technified.xyz/v1/guilds/YOUR_SERVER_ID/moderation/punishments/PUNISHMENTID/evidence" \
-H "Authorization: Bearer $TECHNIFIED_KEY"POST /moderation/punishments/{punishmentId}/evidence
POST /guilds/{guildId}/moderation/punishments/{punishmentId}/evidence
Attaches a file. Multipart, field named file.
| Key permission | moderation.write (Issue and lift punishments) |
In the address
| Field | Type | Required | What it is |
|---|---|---|---|
punishmentId | string | Yes | A punishment’s id (pun_…), from the list or from issuing it. |
No request body.
Example
curl -X POST "https://api.technified.xyz/v1/guilds/YOUR_SERVER_ID/moderation/punishments/PUNISHMENTID/evidence" \
-H "Authorization: Bearer $TECHNIFIED_KEY"POST /moderation/punishments/{punishmentId}/revoke
POST /guilds/{guildId}/moderation/punishments/{punishmentId}/revoke
Lifts it. A reason is required. A punishment issued by somebody ranked above the caller needs moderation.lift_any (403 outranked_issuer); one they issued, or one from somebody of their rank or below, does not. One that reaches the organization is lifted on every server of it. The record is closed even when Discord refuses to lift a ban or mute; the answer then has liftedOnPlatform: false and platformError, so the caller can say so. A ban already gone from Discord counts as lifted.
| Key permission | moderation.write (Issue and lift punishments) |
In the address
| Field | Type | Required | What it is |
|---|---|---|---|
punishmentId | string | Yes | A punishment’s id (pun_…), from the list or from issuing it. |
Request body
JSON, sent with Content-Type: application/json.
| Field | Type | Required | What it is |
|---|---|---|---|
reason | string | Yes | Why it is lifted. Kept with the punishment.1 to 1000 characters |
actor | object | No | The person who used your tool, so the record names them and not only your key. Credited by name when their account is linked on this server. |
actor.label | string | Yes | Their name, shown in the record.1 to 100 characters |
actor.robloxUserId | string | No | Their Roblox user id, if you know it.1 to 32 characters · digits only |
actor.discordUserId | string | No | Their Discord user id, if you know it.1 to 32 characters · digits only |
originServerId | string or null | No | Only for the game module: the live server that already lifted it.at most 40 characters |
Example
curl -X POST "https://api.technified.xyz/v1/guilds/YOUR_SERVER_ID/moderation/punishments/PUNISHMENTID/revoke" \
-H "Authorization: Bearer $TECHNIFIED_KEY" \
-H "Content-Type: application/json" \
-d '{"reason":"Appeal accepted"}'{
"punishment": {
"id": "pun_01M5TXYJZ7RX9QF2S9V82H3AK1",
"platform": "roblox",
"type": "ban",
"state": "revoked",
"reach": "guild",
"guildId": "gld_01M5TXYJPNJZ19BDXJCNTD8WDW",
"target": {
"id": "261",
"label": "shedletsky",
"userId": null
},
"reason": "Exploiting",
"evidenceNote": null,
"durationSeconds": 604800,
"expiresAt": "2026-11-02T01:42:10.652Z",
"decaysAt": null,
"robloxScope": "global",
"universeId": null,
"gameServerId": null,
"source": "api",
"issuer": {
"type": "user",
"id": "usr_01M5TXYJQQ1CB83Q7KH3V40MR7",
"label": "tester4"
},
"delivery": {
"platform": "pending",
"platformError": null,
"gameServersNotified": 0,
"logChannel": "skipped",
"attemptedAt": "2026-10-26T01:42:10.677Z",
"notified": "skipped"
},
"revokedAt": "2026-10-26T01:42:11.068Z",
"revokedBy": "key_01M5TXYJPZQGNT2KXZG3ZBA672",
"revokeReason": "Appeal accepted",
"replacedById": null,
"createdAt": "2026-10-26T01:42:10.663Z"
},
"liftedOnPlatform": false,
"platformError": null,
"liftedElsewhere": 0,
"gameServersNotified": 0
}POST /moderation/punishments/bulk
POST /guilds/{guildId}/moderation/punishments/bulk
Issues the same punishment against many accounts at once.
| Key permission | moderation.write (Issue and lift punishments) |
| Retry safely | Send an Idempotency-Key header; a retry with the same one is not done twice. |
Request body
JSON, sent with Content-Type: application/json.
| Field | Type | Required | What it is |
|---|---|---|---|
targets | array of objects | Yes | The accounts, 1 to 25. Send a longer list in several requests.1 to 25 items |
targets[].targetId | string | Yes | The account, as digits in a string: a Discord user id for discord, a Roblox user id for roblox.1 to 32 characters · digits only |
targets[].targetLabel | string | No | Their name as you know it.at most 100 characters |
platform | "discord" | "roblox" | Yes | discord for a Discord account, roblox for a Roblox account. |
type | "ban" | "mute" | "warning" | "kick" | Yes | ban, mute, warning or kick. |
reason | string | Yes | Why. The person is told this, so write it for them.1 to 1000 characters |
durationSeconds | integer or null | No | How long, in seconds: 604800 is 7 days. null or absent is permanent. A kick takes none; a Discord mute needs one of at most 28 days.60 to 315360000 · default null |
reach | "guild" | "organization" | No | guild for this server only, organization for every server of its organization. Absent: the server default. |
robloxScope | "global" | "universe" | No | Roblox only. global: every game of this server. universe: only the game named in universeId. Absent: the server default. |
universeId | string or null | No | The Roblox universe id of the one game, when robloxScope is universe.at most 32 characters · default null |
source | "dashboard" | "discord" | "game" | "api" | "filter" | No | Where it came from, for the record. Leave it out: your program is api.default "api" |
Example
curl -X POST "https://api.technified.xyz/v1/guilds/YOUR_SERVER_ID/moderation/punishments/bulk" \
-H "Authorization: Bearer $TECHNIFIED_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{"targets":[{"targetId":"1001","targetLabel":"raider_one"},{"targetId":"1002"}],"platform":"roblox","type":"ban","reason":"Raid","durationSeconds":null}'{
"issued": 2,
"failed": 0,
"results": [
{
"targetId": "1001",
"ok": true,
"id": "pun_01M5TXYK8WFA6YHFX79MHKRMR0"
},
{
"targetId": "1002",
"ok": true,
"id": "pun_01M5TXYKA9R1VB3BQPB670P121"
}
]
}GET /moderation/statistics
GET /guilds/{guildId}/moderation/statistics
Counts over a period, for a chart.
| Key permission | moderation.read (See punishments) |
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 |
No request body.
Example
curl -X GET "https://api.technified.xyz/v1/guilds/YOUR_SERVER_ID/moderation/statistics" \
-H "Authorization: Bearer $TECHNIFIED_KEY"GET /moderation/status
GET /guilds/{guildId}/moderation/status
The question a game asks on join: is this player banned or muted, and why. Answer it fast and never block gameplay on it.
| Key permission | moderation.read (See punishments) |
Query parameters
Added to the address after a ?, like ?limit=10&order=asc.
| Field | Type | Required | What it is |
|---|---|---|---|
platform | "discord" | "roblox" | Yes | discord for a Discord account, roblox for a Roblox account. |
targetId | string | Yes | The account, as digits in a string: a Discord user id for discord, a Roblox user id for roblox.1 to 32 characters · digits only |
universeId | string | No | The game asking, so a ban limited to another game does not count.at most 32 characters |
No request body.
Example
curl -X GET "https://api.technified.xyz/v1/guilds/YOUR_SERVER_ID/moderation/status?platform=discord&targetId=123456789012345678" \
-H "Authorization: Bearer $TECHNIFIED_KEY"{
"platform": "roblox",
"targetId": "261",
"banned": true,
"muted": false,
"ban": {
"id": "pun_01M5TXYJZ7RX9QF2S9V82H3AK1",
"reason": "Exploiting",
"expiresAt": "2026-11-02T01:42:10.652Z",
"reach": "guild",
"issuedAt": "2026-10-26T01:42:10.663Z",
"appealUrl": null
},
"mute": null,
"checkedAt": "2026-10-26T01:42:10.786Z"
}GET /moderation/templates
GET /guilds/{guildId}/moderation/templates
| Key permission | moderation.read (See punishments) |
No request body.
Example
curl -X GET "https://api.technified.xyz/v1/guilds/YOUR_SERVER_ID/moderation/templates" \
-H "Authorization: Bearer $TECHNIFIED_KEY"{
"items": [
{
"id": "tpl_01M5TXYKDE8N772FQJM8P9CASF",
"name": "Exploiting",
"platform": "roblox",
"type": "ban",
"durationSeconds": null,
"reason": "Exploiting",
"defaultReach": "guild",
"scope": "guild"
}
]
}POST /moderation/templates
POST /guilds/{guildId}/moderation/templates
| Key permission | moderation.write (Issue and lift punishments) |
Request body
JSON, sent with Content-Type: application/json.
| Field | Type | Required | What it is |
|---|---|---|---|
name | string | Yes | What staff pick it by, for example “Exploiting”.1 to 60 characters |
platform | "discord" | "roblox" | Yes | discord for a Discord account, roblox for a Roblox account. |
type | "ban" | "mute" | "warning" | "kick" | Yes | ban, mute, warning or kick. |
durationSeconds | integer or null | No | How long, in seconds: 604800 is 7 days. null or absent is permanent. A kick takes none; a Discord mute needs one of at most 28 days.60 to 315360000 · default null |
reason | string | Yes | Why. The person is told this, so write it for them.1 to 1000 characters |
defaultReach | "guild" | "organization" | No | guild or organization: what it applies to unless the moderator changes it.default "guild" |
Example
curl -X POST "https://api.technified.xyz/v1/guilds/YOUR_SERVER_ID/moderation/templates" \
-H "Authorization: Bearer $TECHNIFIED_KEY" \
-H "Content-Type: application/json" \
-d '{"name":"Exploiting","platform":"roblox","type":"ban","durationSeconds":null,"reason":"Exploiting"}'{
"id": "tpl_01M5TXYKDE8N772FQJM8P9CASF",
"name": "Exploiting"
}PATCH /moderation/templates/{templateId}
PATCH /guilds/{guildId}/moderation/templates/{templateId}
| Key permission | moderation.write (Issue and lift punishments) |
In the address
| Field | Type | Required | What it is |
|---|---|---|---|
templateId | string | Yes | A template’s id (tpl_…). |
Request body
JSON, sent with Content-Type: application/json.
| Field | Type | Required | What it is |
|---|---|---|---|
name | string | Yes | What staff pick it by, for example “Exploiting”.1 to 60 characters |
platform | "discord" | "roblox" | Yes | discord for a Discord account, roblox for a Roblox account. |
type | "ban" | "mute" | "warning" | "kick" | Yes | ban, mute, warning or kick. |
durationSeconds | integer or null | No | How long, in seconds: 604800 is 7 days. null or absent is permanent. A kick takes none; a Discord mute needs one of at most 28 days.60 to 315360000 · default null |
reason | string | Yes | Why. The person is told this, so write it for them.1 to 1000 characters |
defaultReach | "guild" | "organization" | No | guild or organization: what it applies to unless the moderator changes it.default "guild" |
Example
curl -X PATCH "https://api.technified.xyz/v1/guilds/YOUR_SERVER_ID/moderation/templates/TEMPLATEID" \
-H "Authorization: Bearer $TECHNIFIED_KEY" \
-H "Content-Type: application/json" \
-d '{"name":"…","platform":"discord","type":"ban","reason":"…"}'DELETE /moderation/templates/{templateId}
DELETE /guilds/{guildId}/moderation/templates/{templateId}
| Key permission | moderation.write (Issue and lift punishments) |
In the address
| Field | Type | Required | What it is |
|---|---|---|---|
templateId | string | Yes | A template’s id (tpl_…). |
No request body.
Example
curl -X DELETE "https://api.technified.xyz/v1/guilds/YOUR_SERVER_ID/moderation/templates/TEMPLATEID" \
-H "Authorization: Bearer $TECHNIFIED_KEY"Still stuck? Get help from the Technified team.