Reference: Moderation

Bans, mutes, kicks and warnings on Discord and Roblox: checking, issuing, lifting, and the templates and rules behind them.

Good to know

Every request needs your key: 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 permissionmoderation.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 permissionmoderation.write (Issue and lift punishments)

Request body

JSON, sent with Content-Type: application/json.

FieldTypeRequiredWhat it is
rulesarray of objectsYesOne rule per type. The list replaces the rules there were.at most 5 items
rules[].type"ban" | "mute" | "warning" | "kick" | "serverban"Yesban, mute, warning, kick, or serverban (one live Roblox server only, given by a game).
rules[].afterDaysintegerYesDays after which a punishment of this type stops counting.1 to 3650
rules[].enabledbooleanNodefault 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 permissionmoderation.evidence (See evidence)

In the address

FieldTypeRequiredWhat it is
evidenceIdstringYesAn 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 permissionmoderation.read (See punishments)

Query parameters

Added to the address after a ?, like ?limit=10&order=asc.

FieldTypeRequiredWhat it is
platform"discord" | "roblox"Nodiscord for a Discord account, roblox for a Roblox account.
discordUserIdstringNoThe Discord user id. Give this, the Roblox user id, or both.1 to 32 characters · digits only
robloxUserIdstringNoThe 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"
Answer · 200
{
  "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 permissionmoderation.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 permissionsettings.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 permissionmoderation.read (See punishments)

Query parameters

Added to the address after a ?, like ?limit=10&order=asc.

FieldTypeRequiredWhat it is
limitintegerNoHow many to answer with at most, 1 to 100.1 to 100 · default 25
cursorstringNoThe nextCursor of the page before, to get the next page. Absent: the first page.at most 64 characters
order"asc" | "desc"Nodesc for newest first, asc for oldest first.default "desc"
platform"discord" | "roblox"Nodiscord for a Discord account, roblox for a Roblox account.
type"ban" | "mute" | "warning" | "kick" | "serverban"Noban, mute, warning, kick, or serverban (one live Roblox server only, given by a game).
state"active" | "expired" | "revoked" | "replaced"NoOnly punishments in this state, for example active.
targetIdstringNoOnly punishments against this account id.1 to 32 characters · digits only
qstringNoA name or an account id, as somebody would type it into a search box.1 to 64 characters
issuerIdstringNoOnly punishments given by this person or key (a Technified id).at most 40 characters
fromstringNoOnly those given at or after this time (ISO 8601).ISO 8601 date and time
tostringNoOnly 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"
Answer · 200
{
  "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 permissionmoderation.write (Issue and lift punishments)
Retry safelySend an Idempotency-Key header; a retry with the same one is not done twice.

Request body

JSON, sent with Content-Type: application/json.

FieldTypeRequiredWhat it is
platform"discord" | "roblox"Yesdiscord for a Discord account, roblox for a Roblox account.
type"ban" | "mute" | "warning" | "kick" | "serverban"Yesban, mute, warning, kick, or serverban (one live Roblox server only, given by a game).
targetIdstringYesThe account, as digits in a string: a Discord user id for discord, a Roblox user id for roblox.1 to 32 characters · digits only
targetLabelstringNoTheir name as you know it, shown when the account cannot be looked up.at most 100 characters
reasonstringYesWhy. The person is told this, so write it for them.1 to 1000 characters
durationSecondsinteger or nullNoHow 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
evidenceNotestring or nullNoA note only staff see, for example a link to a clip.at most 4000 characters · default null
reach"guild" | "organization"Noguild for this server only, organization for every server of its organization. Absent: the server default.
robloxScope"global" | "universe"NoRoblox only. global: every game of this server. universe: only the game named in universeId. Absent: the server default.
universeIdstring or nullNoThe Roblox universe id of the one game, when robloxScope is universe.at most 32 characters · default null
source"dashboard" | "discord" | "game" | "api" | "filter"NoWhere it came from, for the record. Leave it out: your program is api.default "api"
templateIdstringNoThe template it was given from, for the record only.at most 40 characters
originServerIdstring or nullNoOnly for the game module: the live server it was given in.at most 40 characters · default null
actorobjectNoThe 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.labelstringYesTheir name, shown in the record.1 to 100 characters
actor.robloxUserIdstringNoTheir Roblox user id, if you know it.1 to 32 characters · digits only
actor.discordUserIdstringNoTheir 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"}}'
Answer · 201
{
  "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 permissionmoderation.read (See punishments)

In the address

FieldTypeRequiredWhat it is
punishmentIdstringYesA 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"
Answer · 200
{
  "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 permissionmoderation.write (Issue and lift punishments)

In the address

FieldTypeRequiredWhat it is
punishmentIdstringYesA 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 permissionmoderation.evidence (See evidence)

In the address

FieldTypeRequiredWhat it is
punishmentIdstringYesA 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 permissionmoderation.write (Issue and lift punishments)

In the address

FieldTypeRequiredWhat it is
punishmentIdstringYesA 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 permissionmoderation.write (Issue and lift punishments)

In the address

FieldTypeRequiredWhat it is
punishmentIdstringYesA punishment’s id (pun_…), from the list or from issuing it.

Request body

JSON, sent with Content-Type: application/json.

FieldTypeRequiredWhat it is
reasonstringYesWhy it is lifted. Kept with the punishment.1 to 1000 characters
actorobjectNoThe 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.labelstringYesTheir name, shown in the record.1 to 100 characters
actor.robloxUserIdstringNoTheir Roblox user id, if you know it.1 to 32 characters · digits only
actor.discordUserIdstringNoTheir Discord user id, if you know it.1 to 32 characters · digits only
originServerIdstring or nullNoOnly 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"}'
Answer · 200
{
  "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 permissionmoderation.write (Issue and lift punishments)
Retry safelySend an Idempotency-Key header; a retry with the same one is not done twice.

Request body

JSON, sent with Content-Type: application/json.

FieldTypeRequiredWhat it is
targetsarray of objectsYesThe accounts, 1 to 25. Send a longer list in several requests.1 to 25 items
targets[].targetIdstringYesThe 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[].targetLabelstringNoTheir name as you know it.at most 100 characters
platform"discord" | "roblox"Yesdiscord for a Discord account, roblox for a Roblox account.
type"ban" | "mute" | "warning" | "kick"Yesban, mute, warning or kick.
reasonstringYesWhy. The person is told this, so write it for them.1 to 1000 characters
durationSecondsinteger or nullNoHow 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"Noguild for this server only, organization for every server of its organization. Absent: the server default.
robloxScope"global" | "universe"NoRoblox only. global: every game of this server. universe: only the game named in universeId. Absent: the server default.
universeIdstring or nullNoThe Roblox universe id of the one game, when robloxScope is universe.at most 32 characters · default null
source"dashboard" | "discord" | "game" | "api" | "filter"NoWhere 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}'
Answer · 207
{
  "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 permissionmoderation.read (See punishments)

Query parameters

Added to the address after a ?, like ?limit=10&order=asc.

FieldTypeRequiredWhat it is
daysintegerNo1 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 permissionmoderation.read (See punishments)

Query parameters

Added to the address after a ?, like ?limit=10&order=asc.

FieldTypeRequiredWhat it is
platform"discord" | "roblox"Yesdiscord for a Discord account, roblox for a Roblox account.
targetIdstringYesThe account, as digits in a string: a Discord user id for discord, a Roblox user id for roblox.1 to 32 characters · digits only
universeIdstringNoThe 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"
Answer · 200
{
  "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 permissionmoderation.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"
Answer · 200
{
  "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 permissionmoderation.write (Issue and lift punishments)

Request body

JSON, sent with Content-Type: application/json.

FieldTypeRequiredWhat it is
namestringYesWhat staff pick it by, for example “Exploiting”.1 to 60 characters
platform"discord" | "roblox"Yesdiscord for a Discord account, roblox for a Roblox account.
type"ban" | "mute" | "warning" | "kick"Yesban, mute, warning or kick.
durationSecondsinteger or nullNoHow 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
reasonstringYesWhy. The person is told this, so write it for them.1 to 1000 characters
defaultReach"guild" | "organization"Noguild 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"}'
Answer · 201
{
  "id": "tpl_01M5TXYKDE8N772FQJM8P9CASF",
  "name": "Exploiting"
}

PATCH /moderation/templates/{templateId}

PATCH /guilds/{guildId}/moderation/templates/{templateId}

Key permissionmoderation.write (Issue and lift punishments)

In the address

FieldTypeRequiredWhat it is
templateIdstringYesA template’s id (tpl_…).

Request body

JSON, sent with Content-Type: application/json.

FieldTypeRequiredWhat it is
namestringYesWhat staff pick it by, for example “Exploiting”.1 to 60 characters
platform"discord" | "roblox"Yesdiscord for a Discord account, roblox for a Roblox account.
type"ban" | "mute" | "warning" | "kick"Yesban, mute, warning or kick.
durationSecondsinteger or nullNoHow 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
reasonstringYesWhy. The person is told this, so write it for them.1 to 1000 characters
defaultReach"guild" | "organization"Noguild 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 permissionmoderation.write (Issue and lift punishments)

In the address

FieldTypeRequiredWhat it is
templateIdstringYesA 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.