API resource

Discord

Each connected Discord channel is its own account: Create a post with platforms: ["discord"] sends to every connected channel (narrow it with account_ids). These calls manage the server the bot is in: channels, roles, members, pins, threads, scheduled events and direct messages. Every id here is a Discord snowflake, passed through unchanged, so it works in mentions like <@&roleId>. Replies to the bot's DMs are not readable.

Connect more Discord channels

POST/v1/connect/discord

Works on: Discord

Connects more channels of a server that already has a connected channel, each as its own account, with no second sign-in. The first channel of a server comes from the browser flow: GET /v1/connect/discord returns the link that installs the Creator OS bot. Each connected channel counts as a connected account.

Body

account_idstringrequired

A connected Discord channel of the same server (its acc_ id). Or pass guild_id instead.

channel_idsstring[]required

Up to 25 channel ids from List Discord guild channels: text, announcement or forum channels the bot can see.

guild_idstring

The server id, instead of account_id.

curl -X POST "https://creatoros-production-5658.up.railway.app/v1/connect/discord" \
  -H "Authorization: Bearer $CREATOROS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "account_id": "acc_Dc7Wm3Kq1Vz6Ny4Lb8Hc2Jr5Pd0Fs7Ga3Ue9Ki1Oq4D",
    "channel_ids": [
      "1234567890123456789"
    ]
  }'
Response 200
{
  "message": "Discord channel connected successfully",
  "account": {
    "accountId": "acc_Dc7Wm3Kq1Vz6Ny4Lb8Hc2Jr5Pd0Fs7Ga3Ue9Ki1Oq4D",
    "platform": "discord",
    "displayName": "Acme HQ - #announcements",
    "channelId": "1234567890123456789",
    "guildId": "1098765432109876543",
    "isActive": true
  }
}

List Discord guild channels

GET/v1/accounts/{accountId}/discord-channels

Works on: Discord

Returns the text, announcement, and forum channels in the connected Discord guild. Use this to discover available channels when switching the connected channel via PATCH /v1/accounts/{accountId}/discord-settings.

Path parameters

accountIdstringrequired

curl "https://creatoros-production-5658.up.railway.app/v1/accounts/acc_Dc7Wm3Kq1Vz6Ny4Lb8Hc2Jr5Pd0Fs7Ga3Ue9Ki1Oq4D/discord-channels" \
  -H "Authorization: Bearer $CREATOROS_API_KEY"
Response 200
{
  "channels": [
    {
      "id": "string",
      "name": "string",
      "type": 0
    }
  ]
}

Get Discord account settings

GET/v1/accounts/{accountId}/discord-settings

Works on: Discord

Returns the current Discord account settings including webhook identity (display name and avatar), connected channel, and guild information.

Path parameters

accountIdstringrequired

curl "https://creatoros-production-5658.up.railway.app/v1/accounts/acc_Dc7Wm3Kq1Vz6Ny4Lb8Hc2Jr5Pd0Fs7Ga3Ue9Ki1Oq4D/discord-settings" \
  -H "Authorization: Bearer $CREATOROS_API_KEY"
Response 200
{
  "account": {
    "id": "string",
    "platform": "discord",
    "username": "string",
    "displayName": "string",
    "profilePicture": "string",
    "channelId": "1234567890123456789",
    "channelName": "string",
    "channelType": "string",
    "guildId": "1098765432109876543",
    "webhookUsername": "string",
    "webhookAvatarUrl": "string"
  }
}

Update Discord settings

PATCH/v1/accounts/{accountId}/discord-settings

Works on: Discord

Update Discord account settings. Supports two operations (can be combined): 1. Webhook identity - Set the default display name and avatar that appear as the message author on every post. These are account-level defaults; individual posts can override them via platformSpecificData.webhookUsername / webhookAvatarUrl. 2. Switch channel - Move the connection to a different channel in the same guild. A new webhook is automatically created in the target channel.

Path parameters

accountIdstringrequired

Body

webhookUsernamestring

Custom display name for the webhook (1-80 chars). Empty string resets to default ("Creator OS"). Cannot contain "clyde" or "discord".

webhookAvatarUrlstring

Custom avatar URL. Empty string resets to default bot avatar.

channelIdstring

Switch to a different channel in the same guild. Must be a text (0), announcement (5), or forum (15) channel.

curl -X PATCH "https://creatoros-production-5658.up.railway.app/v1/accounts/acc_Dc7Wm3Kq1Vz6Ny4Lb8Hc2Jr5Pd0Fs7Ga3Ue9Ki1Oq4D/discord-settings" \
  -H "Authorization: Bearer $CREATOROS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "webhookUsername": "string"
  }'
Response 200
{
  "message": "Discord settings updated",
  "account": {
    "id": "string",
    "platform": "discord",
    "username": "string",
    "displayName": "string",
    "profilePicture": "string",
    "channelId": "1234567890123456789",
    "channelName": "string",
    "channelType": "string",
    "guildId": "1098765432109876543",
    "webhookUsername": "string",
    "webhookAvatarUrl": "string"
  }
}

Crosspost Discord message

POST/v1/discord/channels/{channelId}/messages/{messageId}/crosspost

Works on: Discord

Publishes a message from an announcement channel so it propagates to every server following that channel. The source channel must be an announcement channel. Calling this on a regular text channel returns a 400 before Discord is contacted, because Discord's own error for this case is opaque.

Path parameters

channelIdstringrequired

Discord announcement channel snowflake ID

messageIdstringrequired

Discord message snowflake ID

Query parameters

accountIdstringrequired

account id of the Discord account bound to this channel's guild

curl -X POST "https://creatoros-production-5658.up.railway.app/v1/discord/channels/1234567890123456789/messages/4455667788990011223/crosspost?accountId=acc_Dc7Wm3Kq1Vz6Ny4Lb8Hc2Jr5Pd0Fs7Ga3Ue9Ki1Oq4D" \
  -H "Authorization: Bearer $CREATOROS_API_KEY"
Response 200
{
  "data": {}
}

Delete a Discord channel message

DELETE/v1/discord/channels/{channelId}/messages/{messageId}

Works on: Discord

Deletes a message from a channel, for moderation and cleanup. This cannot be undone. Deleting a message the bot did not send requires the bot to hold the Manage Messages permission, which the Creator OS bot requests at install time. Deleting the bot's own message needs no extra permission. Ownership is verified by resolving the channel's guild and confirming the caller owns a Discord account bound to it.

Path parameters

channelIdstringrequired

Discord channel snowflake ID

messageIdstringrequired

Discord message snowflake ID

Query parameters

accountIdstringrequired

account id of the Discord account bound to this channel's guild

curl -X DELETE "https://creatoros-production-5658.up.railway.app/v1/discord/channels/1234567890123456789/messages/4455667788990011223?accountId=acc_Dc7Wm3Kq1Vz6Ny4Lb8Hc2Jr5Pd0Fs7Ga3Ue9Ki1Oq4D" \
  -H "Authorization: Bearer $CREATOROS_API_KEY"
Response 200
{
  "success": true
}

Unpin a Discord message

DELETE/v1/discord/channels/{channelId}/pins/{messageId}

Works on: Discord

Unpin a message. Same MANAGE_MESSAGES permission requirement as pin. Idempotent: unpinning a non-pinned message is a 204 no-op.

Path parameters

channelIdstringrequired

messageIdstringrequired

Query parameters

accountIdstringrequired

curl -X DELETE "https://creatoros-production-5658.up.railway.app/v1/discord/channels/1234567890123456789/pins/4455667788990011223?accountId=acc_Dc7Wm3Kq1Vz6Ny4Lb8Hc2Jr5Pd0Fs7Ga3Ue9Ki1Oq4D" \
  -H "Authorization: Bearer $CREATOROS_API_KEY"
Response 200
{
  "success": true,
  "operation": "message_unpinned",
  "channelId": "1234567890123456789",
  "messageId": "4455667788990011223"
}

Pin a Discord message

PUT/v1/discord/channels/{channelId}/pins/{messageId}

Works on: Discord

Pin a specific message in a channel. Path shape mirrors Discord's own API (PUT /channels/{cid}/pins/{mid}). Idempotent: re-pinning an already-pinned message is a 204 no-op. Constraints: - Bot needs MANAGE_MESSAGES in the channel. - 50-pin cap per channel: hitting it returns 400 (Discord-side). Caller should unpin one first.

Path parameters

channelIdstringrequired

messageIdstringrequired

Query parameters

accountIdstringrequired

curl -X PUT "https://creatoros-production-5658.up.railway.app/v1/discord/channels/1234567890123456789/pins/4455667788990011223?accountId=acc_Dc7Wm3Kq1Vz6Ny4Lb8Hc2Jr5Pd0Fs7Ga3Ue9Ki1Oq4D" \
  -H "Authorization: Bearer $CREATOROS_API_KEY"
Response 200
{
  "success": true,
  "operation": "message_pinned",
  "channelId": "1234567890123456789",
  "messageId": "4455667788990011223"
}

List pinned messages

GET/v1/discord/channels/{channelId}/pins

Works on: Discord

Returns the channel's pinned messages, sorted most-recently-pinned first. Discord caps a channel at 50 pinned messages and returns the full list unpaginated. Bot needs READ_MESSAGE_HISTORY in the channel (granted by default BOT_PERMISSIONS).

Path parameters

channelIdstringrequired

Discord channel snowflake.

Query parameters

accountIdstringrequired

account id of any Discord account in the same guild.

curl "https://creatoros-production-5658.up.railway.app/v1/discord/channels/1234567890123456789/pins?accountId=acc_Dc7Wm3Kq1Vz6Ny4Lb8Hc2Jr5Pd0Fs7Ga3Ue9Ki1Oq4D" \
  -H "Authorization: Bearer $CREATOROS_API_KEY"
Response 200
{
  "data": [
    {
      "id": "string",
      "channel_id": "string",
      "content": "string",
      "timestamp": "2026-10-10T00:00:00.000Z",
      "author": {},
      "attachments": [
        {}
      ],
      "embeds": [
        {}
      ]
    }
  ]
}

Create a Discord public thread

POST/v1/discord/channels/{channelId}/threads

Works on: Discord

Creates a public thread in a channel. Pass messageId to start the thread from an existing message, or omit it to create a standalone thread. Threads created here are always public. Requires the bot to hold Create Public Threads, which the Creator OS bot requests at install time.

Path parameters

channelIdstringrequired

Discord channel snowflake ID

Query parameters

accountIdstringrequired

account id of the Discord account bound to this channel's guild

Body

namestringrequired

Thread name

messageIdstring

Optional message snowflake to start the thread from. Omit for a standalone thread.

autoArchiveDurationinteger

Minutes of inactivity before the thread auto-archives. Discord accepts only these four values.

curl -X POST "https://creatoros-production-5658.up.railway.app/v1/discord/channels/1234567890123456789/threads?accountId=acc_Dc7Wm3Kq1Vz6Ny4Lb8Hc2Jr5Pd0Fs7Ga3Ue9Ki1Oq4D" \
  -H "Authorization: Bearer $CREATOROS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "string"
  }'
Response 200
{
  "data": {
    "id": "string",
    "name": "string"
  }
}

Send a Discord Direct Message

POST/v1/discord/dms

Works on: Discord

Send a 1:1 Direct Message from the bot to a Discord user (by snowflake ID). Supports the same payload shape as channel posts: content, embeds, media attachments, and TTS. Constraints (Discord platform limits): - The bot can only DM users it shares at least one guild with. - If the recipient has DMs disabled for non-friends, Discord returns 403 (surfaces as a 502 platform error). - content capped at 2,000 chars. - At least one of content, embeds, or attachments is required. - The recipient must be identified by Discord snowflake ID (not username).

Body

accountIdstringrequired

account id of the connected Discord account the bot speaks as. Caller must own the account (directly or via team membership).

userIdstringrequired

Discord snowflake ID of the recipient (15-21 digits).

contentstring

Message text, up to 2,000 characters.

embedsobject[]

Up to 10 Discord embeds. Same shape as channel-post embeds (title, description, color, fields, etc.). See DiscordPlatformData.embeds for the embed object schema.

attachmentsobject[]

Up to 10 media attachments. Each is { type: image|video|gif|document, url, filename?, mimeType?, size? }.

ttsboolean

Send as text-to-speech message.

curl -X POST "https://creatoros-production-5658.up.railway.app/v1/discord/dms" \
  -H "Authorization: Bearer $CREATOROS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "accountId": "65a1b2c3d4e5f60718293a4b",
    "userId": "1234567890123456789"
  }'
Response 200
{
  "messageId": "4455667788990011223",
  "channelId": "1234567890123456789",
  "url": "string",
  "timestamp": "2026-10-10T00:00:00.000Z",
  "recipient": {
    "userId": "2233445566778899001",
    "platform": "discord"
  },
  "account": {
    "id": "string",
    "username": "string",
    "displayName": "string"
  }
}

Delete a Discord scheduled event

DELETE/v1/discord/guilds/{guildId}/events/{eventId}

Works on: Discord

Hard-delete an event. Use PATCH with status: 'cancelled' instead if you want the event preserved in the guild's history.

Path parameters

guildIdstringrequired

eventIdstringrequired

Query parameters

accountIdstringrequired

curl -X DELETE "https://creatoros-production-5658.up.railway.app/v1/discord/guilds/1098765432109876543/events/5566778899001122334?accountId=acc_Dc7Wm3Kq1Vz6Ny4Lb8Hc2Jr5Pd0Fs7Ga3Ue9Ki1Oq4D" \
  -H "Authorization: Bearer $CREATOROS_API_KEY"
Response 200
{
  "success": true,
  "deleted": "string"
}

Get a Discord scheduled event

GET/v1/discord/guilds/{guildId}/events/{eventId}

Works on: Discord

Path parameters

guildIdstringrequired

eventIdstringrequired

Query parameters

accountIdstringrequired

curl "https://creatoros-production-5658.up.railway.app/v1/discord/guilds/1098765432109876543/events/5566778899001122334?accountId=acc_Dc7Wm3Kq1Vz6Ny4Lb8Hc2Jr5Pd0Fs7Ga3Ue9Ki1Oq4D" \
  -H "Authorization: Bearer $CREATOROS_API_KEY"
Response 200
{
  "data": {
    "id": "string",
    "guild_id": "string",
    "channel_id": "string",
    "creator_id": "string",
    "name": "string",
    "description": "string",
    "scheduled_start_time": "2026-10-10T00:00:00.000Z",
    "scheduled_end_time": "2026-10-10T00:00:00.000Z",
    "privacy_level": 2,
    "status": 1,
    "entity_type": 1,
    "entity_id": "string",
    "entity_metadata": {
      "location": "string"
    },
    "user_count": 0,
    "image": "string"
  }
}

Update a Discord scheduled event

PATCH/v1/discord/guilds/{guildId}/events/{eventId}

Works on: Discord

Patch any subset of fields. Passing status: 'cancelled' is how you cancel an event. Discord doesn't have a dedicated cancel endpoint, it's a status transition. Most status transitions Discord enforces (you can't go SCHEDULED → COMPLETED directly). The common consumer case is SCHEDULED → CANCELED.

Path parameters

guildIdstringrequired

eventIdstringrequired

Body

accountIdstringrequired

namestring

descriptionstring

startsAtstring

endsAtstring

locationstring

For external events.

statusstring

Status transition. Most common: 'cancelled' to cancel an event.

imageDataUristring

curl -X PATCH "https://creatoros-production-5658.up.railway.app/v1/discord/guilds/1098765432109876543/events/5566778899001122334" \
  -H "Authorization: Bearer $CREATOROS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "accountId": "acc_Dc7Wm3Kq1Vz6Ny4Lb8Hc2Jr5Pd0Fs7Ga3Ue9Ki1Oq4D"
  }'
Response 200
{
  "data": {
    "id": "string",
    "guild_id": "string",
    "channel_id": "string",
    "creator_id": "string",
    "name": "string",
    "description": "string",
    "scheduled_start_time": "2026-10-10T00:00:00.000Z",
    "scheduled_end_time": "2026-10-10T00:00:00.000Z",
    "privacy_level": 2,
    "status": 1,
    "entity_type": 1,
    "entity_id": "string",
    "entity_metadata": {
      "location": "string"
    },
    "user_count": 0,
    "image": "string"
  }
}

List Discord scheduled events

GET/v1/discord/guilds/{guildId}/events

Works on: Discord

Return all scheduled events in the guild. Events are distinct from messages: they appear in the server's Events panel and Discord auto-notifies interested members ahead of start time. Pass withUserCount=true to include user_count (number of members who RSVP'd) on each event. Useful for surfacing engagement.

Path parameters

guildIdstringrequired

Query parameters

accountIdstringrequired

withUserCountboolean

Include user_count on each event.

curl "https://creatoros-production-5658.up.railway.app/v1/discord/guilds/1098765432109876543/events?accountId=acc_Dc7Wm3Kq1Vz6Ny4Lb8Hc2Jr5Pd0Fs7Ga3Ue9Ki1Oq4D" \
  -H "Authorization: Bearer $CREATOROS_API_KEY"
Response 200
{
  "data": [
    {
      "id": "string",
      "guild_id": "string",
      "channel_id": "string",
      "creator_id": "string",
      "name": "string",
      "description": "string",
      "scheduled_start_time": "2026-10-10T00:00:00.000Z",
      "scheduled_end_time": "2026-10-10T00:00:00.000Z",
      "privacy_level": 2,
      "status": 1,
      "entity_type": 1,
      "entity_id": "string",
      "entity_metadata": {
        "location": "string"
      },
      "user_count": 0,
      "image": "string"
    }
  ]
}

Create a Discord scheduled event

POST/v1/discord/guilds/{guildId}/events

Works on: Discord

Create a guild scheduled event. Three event types, selected via the discriminator on entity.type: - external: off-platform (Zoom, in-person, livestream). Requires both location and endsAt. Most common type for scheduler integrations. - voice: hosted in a Discord voice channel. Requires channelId. - stage: hosted in a Discord stage channel. Requires channelId. Bot needs MANAGE_EVENTS in the guild. Existing installs (pre-events PR) need a re-invite OR a server admin manually granting the permission. See route header for details.

Path parameters

guildIdstringrequired

Body

accountIdstringrequired

namestringrequired

descriptionstring

startsAtstringrequired

ISO 8601 start time. Must be in the future.

entityobjectrequired

imageDataUristring

Optional cover image as a base64 data URI.

curl -X POST "https://creatoros-production-5658.up.railway.app/v1/discord/guilds/1098765432109876543/events" \
  -H "Authorization: Bearer $CREATOROS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "accountId": "acc_Dc7Wm3Kq1Vz6Ny4Lb8Hc2Jr5Pd0Fs7Ga3Ue9Ki1Oq4D",
    "name": "string",
    "startsAt": "2026-10-10T00:00:00.000Z",
    "entity": {
      "type": "external",
      "location": "string",
      "endsAt": "2026-10-10T00:00:00.000Z"
    }
  }'
Response 200
{
  "data": {
    "id": "string",
    "guild_id": "string",
    "channel_id": "string",
    "creator_id": "string",
    "name": "string",
    "description": "string",
    "scheduled_start_time": "2026-10-10T00:00:00.000Z",
    "scheduled_end_time": "2026-10-10T00:00:00.000Z",
    "privacy_level": 2,
    "status": 1,
    "entity_type": 1,
    "entity_id": "string",
    "entity_metadata": {
      "location": "string"
    },
    "user_count": 0,
    "image": "string"
  }
}

Remove a role from a guild member

DELETE/v1/discord/guilds/{guildId}/members/{userId}/roles/{roleId}

Works on: Discord

Remove one role from one member. Idempotent: removing a role the member doesn't have returns 204 no-op. Same permission + hierarchy constraints as the PUT counterpart.

Path parameters

guildIdstringrequired

userIdstringrequired

roleIdstringrequired

Query parameters

accountIdstringrequired

curl -X DELETE "https://creatoros-production-5658.up.railway.app/v1/discord/guilds/1098765432109876543/members/2233445566778899001/roles/3344556677889900112?accountId=acc_Dc7Wm3Kq1Vz6Ny4Lb8Hc2Jr5Pd0Fs7Ga3Ue9Ki1Oq4D" \
  -H "Authorization: Bearer $CREATOROS_API_KEY"
Response 200
{
  "success": true,
  "operation": "role_removed",
  "guildId": "1098765432109876543",
  "userId": "2233445566778899001",
  "roleId": "3344556677889900112"
}

Assign a role to a guild member

PUT/v1/discord/guilds/{guildId}/members/{userId}/roles/{roleId}

Works on: Discord

Assign one role to one member. Idempotent on Discord's side: re-running on a member who already has the role is a 204 no-op. Path shape mirrors Discord's own API (PUT /guilds/{guild}/members/{user}/roles/{role}) for zero-translation mental mapping. Bot needs MANAGE_ROLES permission in the guild AND its highest role must be above the target role (Discord hierarchy rule). The @everyone role (where roleId == guildId) cannot be assigned.

Path parameters

guildIdstringrequired

userIdstringrequired

Discord user snowflake to assign the role to.

roleIdstringrequired

Query parameters

accountIdstringrequired

curl -X PUT "https://creatoros-production-5658.up.railway.app/v1/discord/guilds/1098765432109876543/members/2233445566778899001/roles/3344556677889900112?accountId=acc_Dc7Wm3Kq1Vz6Ny4Lb8Hc2Jr5Pd0Fs7Ga3Ue9Ki1Oq4D" \
  -H "Authorization: Bearer $CREATOROS_API_KEY"
Response 200
{
  "success": true,
  "operation": "role_assigned",
  "guildId": "1098765432109876543",
  "userId": "2233445566778899001",
  "roleId": "3344556677889900112"
}

Get a Discord guild member

GET/v1/discord/guilds/{guildId}/members/{userId}

Works on: Discord

Fetch a single guild member by Discord user id. Cheaper than paginating the full member listing when you already know who you are looking for.

Path parameters

guildIdstringrequired

userIdstringrequired

Discord user snowflake.

Query parameters

accountIdstringrequired

curl "https://creatoros-production-5658.up.railway.app/v1/discord/guilds/1098765432109876543/members/2233445566778899001?accountId=acc_Dc7Wm3Kq1Vz6Ny4Lb8Hc2Jr5Pd0Fs7Ga3Ue9Ki1Oq4D" \
  -H "Authorization: Bearer $CREATOROS_API_KEY"
Response 200
{
  "data": {
    "user": {
      "id": "string",
      "username": "string",
      "discriminator": "string",
      "avatar": "string",
      "global_name": "string"
    },
    "nick": "string",
    "roles": [
      "string"
    ],
    "joined_at": "2026-10-10T00:00:00.000Z",
    "premium_since": "2026-10-10T00:00:00.000Z"
  }
}

List Discord guild members

GET/v1/discord/guilds/{guildId}/members

Works on: Discord

Cursor-paginated list of guild members. Returns Discord's raw member objects so callers can build community-ops automation (e.g. "add role to all members joined in the last 7 days") on the actual platform shape. Pagination: pass after = the last user.id from the previous page. Omit on the first call. Response includes a nextCursor and hasMore flag so callers don't need to know Discord's pagination shape.

Path parameters

guildIdstringrequired

Query parameters

accountIdstringrequired

limitinteger

Page size (1-1000).

afterstring

Snowflake of the last member from the previous page.

curl "https://creatoros-production-5658.up.railway.app/v1/discord/guilds/1098765432109876543/members?accountId=acc_Dc7Wm3Kq1Vz6Ny4Lb8Hc2Jr5Pd0Fs7Ga3Ue9Ki1Oq4D" \
  -H "Authorization: Bearer $CREATOROS_API_KEY"
Response 200
{
  "data": [
    {
      "user": {
        "id": "string",
        "username": "string",
        "discriminator": "string",
        "avatar": "string",
        "global_name": "string"
      },
      "nick": "string",
      "roles": [
        "string"
      ],
      "joined_at": "2026-10-10T00:00:00.000Z",
      "premium_since": "2026-10-10T00:00:00.000Z"
    }
  ],
  "pagination": {
    "nextCursor": "string",
    "hasMore": true
  }
}

Delete a Discord guild role

DELETE/v1/discord/guilds/{guildId}/roles/{roleId}

Works on: Discord

Permanently deletes a role from the guild and removes it from every member. This cannot be undone. Requires the bot to hold Manage Roles, and the target role must sit below the bot's highest role.

Path parameters

guildIdstringrequired

Discord guild snowflake ID

roleIdstringrequired

Discord role snowflake ID

Query parameters

accountIdstringrequired

account id of the Discord account bound to this guild

curl -X DELETE "https://creatoros-production-5658.up.railway.app/v1/discord/guilds/1098765432109876543/roles/3344556677889900112?accountId=acc_Dc7Wm3Kq1Vz6Ny4Lb8Hc2Jr5Pd0Fs7Ga3Ue9Ki1Oq4D" \
  -H "Authorization: Bearer $CREATOROS_API_KEY"
Response 200
{
  "success": true
}

Edit a Discord guild role

PATCH/v1/discord/guilds/{guildId}/roles/{roleId}

Works on: Discord

Updates a role's name, color, hoist, mentionable flag, or permission bitfield. At least one field must be supplied. Omitted fields are left unchanged. Requires the bot to hold Manage Roles, and the target role must sit below the bot's highest role. See the create-role operation for the re-invite requirement.

Path parameters

guildIdstringrequired

Discord guild snowflake ID

roleIdstringrequired

Discord role snowflake ID

Query parameters

accountIdstringrequired

account id of the Discord account bound to this guild

Body

namestring

colorinteger

hoistboolean

mentionableboolean

permissionsstring

Permissions bitfield as a stringified integer

curl -X PATCH "https://creatoros-production-5658.up.railway.app/v1/discord/guilds/1098765432109876543/roles/3344556677889900112?accountId=acc_Dc7Wm3Kq1Vz6Ny4Lb8Hc2Jr5Pd0Fs7Ga3Ue9Ki1Oq4D" \
  -H "Authorization: Bearer $CREATOROS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "string"
  }'
Response 200
{
  "data": {
    "id": "string",
    "name": "string",
    "color": 0,
    "position": 0,
    "permissions": "string",
    "managed": true,
    "mentionable": true,
    "hoist": true
  }
}

List Discord guild roles

GET/v1/discord/guilds/{guildId}/roles

Works on: Discord

Returns all roles in a Discord guild. Useful for building role-mention pickers, role-permission UIs, or finding the role ID before calling the role-assign endpoint. Roles are returned unordered. Sort client-side by position if you need Discord's UI ordering. Caller must pass accountId of a Discord account bound to this guild (route verifies team access + guild match).

Path parameters

guildIdstringrequired

Discord guild snowflake ID

Query parameters

accountIdstringrequired

account id of the Discord account bound to this guild

curl "https://creatoros-production-5658.up.railway.app/v1/discord/guilds/1098765432109876543/roles?accountId=acc_Dc7Wm3Kq1Vz6Ny4Lb8Hc2Jr5Pd0Fs7Ga3Ue9Ki1Oq4D" \
  -H "Authorization: Bearer $CREATOROS_API_KEY"
Response 200
{
  "data": [
    {
      "id": "string",
      "name": "string",
      "color": 0,
      "position": 0,
      "permissions": "string",
      "managed": true,
      "mentionable": true,
      "hoist": true
    }
  ]
}

Create a Discord guild role

POST/v1/discord/guilds/{guildId}/roles

Works on: Discord

Creates a new role in the guild. Requires the bot to hold the Manage Roles permission. Guilds that added the Creator OS bot before role management shipped must re-invite it, because Discord applies the permission set at invite time. Discord's role hierarchy applies: the bot cannot create a role positioned at or above its own highest role, and cannot grant permissions it does not itself hold. Either attempt returns a 403 carrying Discord's own error.

Path parameters

guildIdstringrequired

Discord guild snowflake ID

Query parameters

accountIdstringrequired

account id of the Discord account bound to this guild

Body

namestringrequired

colorinteger

Decimal color (0 = no color). 0xFF0000 red is 16711680.

hoistboolean

Display members with this role separately in the member list

mentionableboolean

Allow anyone to @mention this role

permissionsstring

Permissions bitfield as a stringified integer

curl -X POST "https://creatoros-production-5658.up.railway.app/v1/discord/guilds/1098765432109876543/roles?accountId=acc_Dc7Wm3Kq1Vz6Ny4Lb8Hc2Jr5Pd0Fs7Ga3Ue9Ki1Oq4D" \
  -H "Authorization: Bearer $CREATOROS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "string"
  }'
Response 200
{
  "data": {
    "id": "string",
    "name": "string",
    "color": 0,
    "position": 0,
    "permissions": "string",
    "managed": true,
    "mentionable": true,
    "hoist": true
  }
}