Discovery
Discovery is a feature that allows users to find and join new communities on Discord, open to all guilds that meet the requirements. Discovery happens within the client or the marketing page.
Definitions
A guild is considered discoverable by the API if it has the DISCOVERABLE guild feature.
Additionally, any guilds within a directory channel the user has access to (guilds that have the HAS_DIRECTORY_ENTRY guild feature), like in a student hub, are also considered discoverable relative to the user.
Searching Discovery
Discord utilizes Algolia to power search for discovery. You can search for guilds by name, description, keywords, and more. Reference the Algolia Search documentation for more information on how to search. A proxied version of the Algolia Search API is available, with limited parameter support.
Algolia Credentials
These credentials are for production only.
Discoverable Guild Object
A partial guild object returned from discovery, Get Emoji Guild, Get Sticker Guild, and Get Soundboard Sound Guild.
Discoverable Guild Structure
| Field | Type | Description |
|---|---|---|
| id | snowflake | The ID of the guild |
| name | string | The name of the guild (2-100 characters) |
| icon | ?string | The guild's icon hash |
| description | ?string | The description for the guild (max 300 characters) |
| banner | ?string | The guild's banner hash |
| splash | ?string | The guild's splash hash |
| discovery_splash | ?string | The guild's discovery splash hash |
| features | array[string] | Enabled guild features |
| vanity_url_code | ?string | The guild's vanity invite code |
| preferred_locale | string | The preferred locale of the guild; used in discovery and notices from Discord (default "en-US") |
| premium_subscription_count | integer | The number of premium subscriptions (boosts) the guild currently has |
| approximate_member_count | integer | Approximate number of members in the guild |
| approximate_presence_count | integer | Approximate number of online members in the guild |
| emojis? 1 | array[emoji object] | Custom guild emoji; limited to 30 entries |
| emoji_count? 1 | integer | Total number of custom guild emoji |
| stickers? 1 | array[sticker object] | Custom guild stickers; limited to 30 entries |
| sticker_count? 1 | integer | Total number of custom guild stickers |
| auto_removed | boolean | Whether the guild has automatically been removed from discovery for not hitting required targets |
| primary_category_id | integer | The ID of the primary discovery category set for the guild |
| primary_category? 3 | discovery category | The primary discovery category set for the guild |
| keywords | ?array[string] | The discovery search keywords for the guild (max 30 characters, max 10) |
| is_published | boolean | Whether the guild's landing web page is currently published |
| reasons_to_join? 2 | array[discovery reason object] | The reasons to join the guild shown in the discovery web page (max 4) |
| social_links? 2 | ?array[string] | The guild's social media links shown in the discovery web page (max 256 characters, max 9) |
| about? 2 | ?string | The guild's long description shown in the discovery web page (max 2400 characters) |
| category_ids? 2 | array[snowflake] | The IDs of discovery subcategories set for the guild (max 5) |
| categories? 3 | array[discovery category] | The discovery categories set for the guild (max 5) |
| created_at? 2 | ISO8601 timestamp | When the guild was created |
| nsfw_properties? | ?discovery NSFW properties object | Disallowed terms found in the guild's name, description, and channel names |
1 The presence of these fields is dependent on the endpoint used to retrieve the guild. Get Emoji Guild will return emoji-related fields, and Get Sticker Guild will return sticker-related fields.
2 Only included when fetched from the Get Discovery Slug endpoint.
3 Only included when searching discovery.
Example Discoverable Guild
{"id": "752630786561409076","name": "Elite Creative","description": "The largest Fortnite Creative server across the globe. Join a Creative community offering events, 1v1s. and more!","icon": "278da1c7740e394657c1179f4782aef1","splash": "2b4ae5cdd71038b4880b1b57a6e5dacb","banner": "57e939e67aebaf232d28205603020b55","approximate_presence_count": 21125,"approximate_member_count": 155455,"premium_subscription_count": 17,"preferred_locale": "en-US","auto_removed": false,"discovery_splash": "9d7ec672b89b320ef7a51e5b6ae453b8","primary_category_id": 1,"vanity_url_code": "creative","is_published": true,"keywords": ["Fortnite","Creative","Fortnite Creative","Boxfights","Zonewars","Buildfights","1v1","EU","NA","Creator"],"features": ["ANIMATED_BANNER","ANIMATED_ICON","AUTO_MODERATION","BANNER","COMMUNITY","DISCOVERABLE","ENABLED_DISCOVERABLE_BEFORE","GUILD_ONBOARDING_EVER_ENABLED","GUILD_WEB_PAGE_VANITY_URL","INVITE_SPLASH","NEWS","PREVIEW_ENABLED","RAID_ALERTS_ENABLED","ROLE_ICONS","VANITY_URL","WELCOME_SCREEN_ENABLED"],"emojis": [],"emoji_count": 339}
Discovery Requirements Object
A guild's progress on meeting the requirements of joining discovery.
Discovery Requirements Structure
| Field | Type | Description |
|---|---|---|
| guild_id? | snowflake | The ID of the guild |
| safe_environment? | boolean | Whether the guild has not been flagged by Trust & Safety |
| healthy? | boolean | Whether the guild meets activity requirements |
| health_score_pending? | boolean | Whether the guild's activity metrics have not yet been calculated |
| size? | boolean | Whether the guild meets the minimum member count requirement |
| nsfw_properties? | discovery NSFW properties object | Disallowed terms found in the guild's name, description, and channel names |
| protected? | boolean | Whether the guild has the MFA requirement for moderation actions enabled |
| sufficient 1 | boolean | Whether the guild meets the requirements to be in Discovery |
| sufficient_without_grace_period 1 | boolean | Whether the grace period can allow the guild to remain in Discovery |
| valid_rules_channel? | boolean | Whether the guild has a rules channel set |
| retention_healthy? | boolean | Whether the guild meets the new member retention requirement |
| engagement_healthy? | boolean | Whether the guild meets the weekly visitor and communicator requirements |
| age? | boolean | Whether the guild meets the minimum age requirement |
| minimum_age? | ?integer | The minimum guild age requirement (in days) |
| health_score? | discovery health score object | The guild's activity metrics |
| minimum_size? | ?integer | The minimum guild member count requirement |
| grace_period_end_date? | ISO8601 timestamp | When the guild's grace period ends |
1 Certain guilds, such as those that are verified, are exempt from discovery requirements. These guilds will not have a fully populated discovery requirements object, and are guaranteed to receive only sufficient and sufficient_without_grace_period.
Discovery NSFW Properties Structure
| Field | Type | Description |
|---|---|---|
| channels? | array[snowflake] | The IDs of the channels with names containing disallowed terms |
| channel_banned_keywords? | map[snowflake, array[string]] | The disallowed terms found in the given channel names |
| name? | string | The guild name, if it contains disallowed terms |
| name_banned_keywords? | array[string] | The disallowed terms found in the guild name |
| description? | string | The guild description, if it contains disallowed terms |
| description_banned_keywords? | array[string] | The disallowed terms found in the guild description |
Discovery Health Score Structure
| Field | Type | Description |
|---|---|---|
| avg_nonnew_communicators | ?string | Average weekly number of users who talk in the guild and have been on Discord for 8 weeks+ |
| avg_nonnew_participators | ?string | Average weekly number of users who view the guild and have been on Discord for 8 weeks+ |
| num_intentful_joiners | ?string | Average number of users who join the guild per week |
| perc_ret_w1_intentful | ?float | Percentage of new members who remain in the guild for at least a week |
Example Discovery Requirements
{"guild_id": "1046920999469330512","safe_environment": true,"healthy": true,"health_score_pending": false,"size": true,"nsfw_properties": {"channels": ["1060703057651978261"],"channels_banned_keywords": {"1060703057651978261": ["risque"]},"name": "Alien Network","name_banned_keywords": ["alien"],"description": "Where the 👽s 👽 and sometimes very 👽 things happen 😨.","description_banned_keywords": ["👽"]},"protected": true,"sufficient": false,"sufficient_without_grace_period": true,"valid_rules_channel": true,"retention_healthy": true,"engagement_healthy": true,"age": true,"minimum_age": 56,"health_score": {"avg_nonnew_participators": "1738","avg_nonnew_communicators": "348","num_intentful_joiners": "834","perc_ret_w1_intentful": 0.37651924871356596},"minimum_size": 1000,"grace_period_end_date": "2037-07-01T17:47:49.974000+00:00"}
Discovery Metadata Object
A guild's discovery settings.
Discovery Metadata Structure
| Field | Type | Description |
|---|---|---|
| guild_id | snowflake | The ID of the guild |
| primary_category_id | integer | The ID of the primary discovery category set for the guild |
| keywords | ?array[string] | The discovery search keywords for the guild (max 30 characters, max 10) |
| emoji_discoverability_enabled | boolean | Whether the guild is shown as a source through custom guild expressions |
| partner_actioned_timestamp | ?ISO8601 timestamp | When the guild's partner application was actioned by an employee |
| partner_application_timestamp | ?ISO8601 timestamp | When the guild applied for partnership |
| is_published | boolean | Whether the guild's landing web page is currently published |
| reasons_to_join | array[discovery reason object] | The reasons to join the guild shown in the discovery web page (max 4) |
| social_links | ?array[string] | The guild's social media links shown in the discovery web page (max 256 characters, max 9) |
| about | ?string | The guild's long description shown in the discovery web page (max 2400 characters) |
| category_ids | array[snowflake] | The IDs of discovery subcategories set for the guild (max 5) |
Discovery Reason Structure
| Field | Type | Description |
|---|---|---|
| reason | string | The reason to join the guild |
| emoji_id | ?snowflake | The ID of a guild's custom emoji |
| emoji_name | ?string | The unicode character of the emoji |
Example Discovery Metadata
{"guild_id": "1046920999469330512","primary_category_id": 49,"keywords": ["test"],"emoji_discoverability_enabled": true,"partner_actioned_timestamp": null,"partner_application_timestamp": null,"is_published": false,"reasons_to_join": [{ "reason": "Alien", "emoji_id": null, "emoji_name": "👽" },{ "reason": "Alien", "emoji_id": null, "emoji_name": "👽" },{ "reason": "Alien", "emoji_id": null, "emoji_name": "👽" },{ "reason": "Alien", "emoji_id": null, "emoji_name": "👽" }],"social_links": ["https://twitter.com/alien"],"about": "Alien\nAlien\nAlien\nAlien\nAlien\nAlien","category_ids": [48]}
Discovery Category Object
Discovery Category Structure
| Field | Type | Description |
|---|---|---|
| id | integer | The ID of the category |
| name | string | The name of the category |
| is_primary | boolean | Whether the category can be used as a guild's primary category |
Example Discovery Category
{"id": 1,"name": "Gaming","is_primary": true}
Guild Profile Object
Guild Profile Structure
| Field | Type | Description |
|---|---|---|
| id | snowflake | The ID of the guild |
| name | string | The name of the guild (2-100 characters) |
| icon_hash | ?string | The guild's icon hash |
| member_count | integer | Approximate count of total members in the guild |
| online_count | integer | Approximate count of non-offline members in the guild |
| description | string | The description for the guild (max 300 characters) |
| brand_color_primary | string | The guild's accent color as a hexadecimal color string |
| banner_hash (deprecated) | ?string | The guild's clan banner hash |
| game_application_ids | array[snowflake] | The IDs of the applications representing the games the guild plays (max 20) |
| game_activity | map[snowflake, game activity object] | The activity of the guild in each game |
| tag | ?string | The tag of the guild (2-4 characters) |
| badge | integer | The badge shown on the guild's tag |
| badge_color_primary | string | The primary color of the badge as a hexadecimal color string |
| badge_color_secondary | string | The secondary color of the badge as a hexadecimal color string |
| badge_hash | string | The guild tag badge hash |
| traits | array[guild trait object] | Terms used to describe the guild's interest and personality (max 5) |
| features 1 | array[string] | Enabled guild features |
| visibility | integer | The visibility level of the guild |
| custom_banner_hash | ?string | The guild's discovery splash hash |
| premium_subscription_count | integer | The number of premium subscriptions (boosts) the guild currently has |
| premium_tier | integer | The guild's premium tier (boost level) |
1 This is not a complete list of all the features the guild has, and is limited to community features (MEMBER_VERIFICATION_GATE_ENABLED, COMMUNITY, MEMBER_VERIFICATION_MANUAL_APPROVAL, DISCOVERABLE, PARTNERED, VERIFIED).
Game Activity Structure
| Field | Type | Description |
|---|---|---|
| activity_level | integer | The activity level of the guild in the game |
| activity_score | integer | The activity score of the guild in the game |
Guild Trait Structure
| Field | Type | Description |
|---|---|---|
| emoji_id | ?snowflake | ID of the emoji associated with the trait |
| emoji_name | ?string | Name of the emoji associated with the trait |
| emoji_animated | boolean | Whether the associated emoji is animated |
| label | string | Name of the trait |
| position | integer | Position of the trait in the array for sorting |
Guild Badge Type
| Value | Name |
|---|---|
| 0 | SWORD |
| 1 | WATER_DROP |
| 2 | SKULL |
| 3 | TOADSTOOL |
| 4 | MOON |
| 5 | LIGHTNING |
| 6 | LEAF |
| 7 | HEART |
| 8 | FIRE |
| 9 | COMPASS |
| 10 | CROSSHAIRS |
| 11 | FLOWER |
| 12 | FORCE |
| 13 | GEM |
| 14 | LAVA |
| 15 | PSYCHIC |
| 16 | SMOKE |
| 17 | SNOW |
| 18 | SOUND |
| 19 | SUN |
| 20 | WIND |
| 21 | BUNNY |
| 22 | DOG |
| 23 | FROG |
| 24 | GOAT |
| 25 | CAT |
| 26 | DIAMOND |
| 27 | CROWN |
| 28 | TROPHY |
| 29 | MONEY_BAG |
| 30 | DOLLAR_SIGN |
Guild Visibility
| Value | Name | Description |
|---|---|---|
| 1 | PUBLIC | This guild is considered public and can be viewed by anyone |
| 2 | RESTRICTED | This guild is considered private but cannot be viewed and joining requires an invite |
| 3 | PUBLIC_WITH_RECRUITMENT | The guild is considered public, allowing anyone to view it and submit a join request |
Example Guild Profile
{"id": "1241115476021481582","name": "Fehlerjäger","icon_hash": "b47f6747d7d6548b6f3eaf8c8e8af20c","member_count": 131,"online_count": 53,"description": "Do you enjoy finding those creepy crawlies? 🐛 We seek those with a keen eye and ability for uncovering hidden gems 🔎","brand_color_primary": "#7cf895","banner_hash": "1468ceeb0f9c384826b982b7eddbfa6f","game_application_ids": ["356869127241072640"],"game_activity": {"356869127241072640": {"activity_level": 1,"activity_score": 45}},"tag": "BUG","badge": 6,"badge_color_primary": "#32a070","badge_color_secondary": "#57b59e","badge_hash": "6082c2553b03b47ccaea5203567df3cf","traits": [{"emoji_id": null,"emoji_name": null,"emoji_animated": false,"label": "Bug Hunting","position": 0}],"features": ["MEMBER_VERIFICATION_MANUAL_APPROVAL", "COMMUNITY", "MEMBER_VERIFICATION_GATE_ENABLED"],"visibility": 1,"custom_banner_hash": null,"premium_subscription_count": 13,"premium_tier": 2}
Endpoints
Get Discoverable Guilds
GET/discoverable-guildsReturns a list of discoverable guild objects representing the guilds that are available for the current user to discover.
Query String Params
| Field | Type | Description |
|---|---|---|
| guild_ids? 1 | array[snowflake] | The IDs of the discoverable guilds to return (max 48) |
| application_ids? 1 | array[snowflake] | The IDs of the applications to return matching discoverable guilds for (max 48) |
| categories? 1 | array[integer] | The IDs of the discovery categories to filter results by |
| limit? 2 | integer | The maximum number of guilds to return (max 48, default 30) |
| offset? 2 | integer | Number of guilds to skip before returning guilds |
1 Only one of guild_ids, application_ids, or categories may be specified. If both are specified, only guild_ids or application_ids is respected.
2 Pagination parameters are ignored if guild_ids or application_ids are specified.
Response Body
| Field | Type | Description |
|---|---|---|
| guilds | array[discoverable guild object] | The guilds that match the query |
| total | integer | The total number of guilds that match the query |
| limit | integer | The number of guilds returned in the response |
| offset | integer | The number of guilds skipped before returning guilds |
Search Discoverable Guilds
GET/discoverable-guilds/searchReturns a list of discoverable guild objects that match the query.
Query String Params
| Field | Type | Description |
|---|---|---|
| query | string | The query to match (max 100 characters) |
| limit? | integer | The maximum number of guilds to return (max 48, default 24) |
| offset? | integer | Number of guilds to skip before returning guilds (max 2999) |
| category_id? | integer | The ID of the discovery category to filter results by |
Search Published Guilds
GET/discovery/searchReturns a list of discoverable guild objects that have a landing web page and match the query. This endpoint is a proxy for searching using the Algolia API. See the Algolia Search documentation for more information.
Query String Params
| Field | Type | Description |
|---|---|---|
| query? | string | The query to match |
| limit? | integer | The maximum number of guilds to return (1-48, default 48) |
| offset? | integer | Number of guilds to skip before returning guilds (max 2999) |
Get Discovery Slug
GET/discovery/{guild.id}Returns information about a guild's landing web page or monetization store page.
This endpoint requires the guild to either be discoverable and published or have the CREATOR_STORE_PAGE guild feature.
Response Body
| Field | Type | Description |
|---|---|---|
| slug | string | The guild's discovery slug; can be appended to https://discord.com/servers/ to get the guild's discovery page |
| guild? | discoverable guild object | The guild information, if the guild is discoverable |
| store_page? | monetization store page object | The guild's monetization store page, if enabled |
Monetization Store Page Structure
| Field | Type | Description |
|---|---|---|
| guild | store page guild object | The guild information |
| role_subscription | store page role subscription object | The guild's role subscription information |
Store Page Guild Structure
| Field | Type | Description |
|---|---|---|
| id | snowflake | The ID of the guild |
| name | string | The name of the guild (2-100 characters) |
| icon_hash | ?string | The guild's icon hash |
| approximate_member_count | integer | Approximate number of members in the guild |
| approximate_presence_count | integer | Approximate number of online members in the guild |
| locked_server | boolean | Whether the entire guild is locked behind a role subscription |
| invite | ?partial invite object | A special CREATOR_PAGE invite for the guild |
Store Page Role Subscription Structure
| Field | Type | Description |
|---|---|---|
| settings | role subscription settings object | The guild's role subscription settings |
| group_listings | array[role subscription group listing object] | The guild's role subscription group listings |
| trials | array[role subscription trial object] | The guild's role subscription trials |
| subscriber_count | ?integer | The number of subscribers to the guild's role subscriptions, if public |
| benefit_channels | array[partial channel object] | The channels that are unlocked by role subscriptions |
| benefit_emojis | array[emoji object] | The emoji that are unlocked by role subscriptions |
| purchase_page_invite | ?partial invite object | A special ROLE_SUBSCRIPTIONS invite for the guild |
Get Discovery Categories
GET/discovery/categoriesReturns a list of discovery category objects representing the available discovery categories.
Query String Params
| Field | Type | Description |
|---|---|---|
| locale? | string | The language to return category names in (default "en-US") |
| primary_only? | boolean | Whether to only return categories that can be set as a guild's primary category (default false) |
Validate Discovery Search Term
GET/discovery/valid-termChecks if a discovery search term is allowed.
Query String Params
| Field | Type | Description |
|---|---|---|
| term | string | The search term to validate |
Response Body
| Field | Type | Description |
|---|---|---|
| valid | boolean | Whether the provided term is valid |
Example Response
{ "valid": true }
Get Guild Discovery Requirements
GET/guilds/{guild.id}/discovery-requirementsReturns the discovery requirements object for the guild. Requires the MANAGE_GUILD permission.
Get Guild Discovery Metadata
GET/guilds/{guild.id}/discovery-metadataReturns the discovery metadata object for the guild. Requires the MANAGE_GUILD permission.
Modify Guild Discovery Metadata
PATCH/guilds/{guild.id}/discovery-metadataReplaces the discovery metadata for the guild. Requires the MANAGE_GUILD permission. Returns the updated discovery metadata object on success.
JSON Params
| Field | Type | Description |
|---|---|---|
| primary_category_id? | ?integer | The ID of the primary discovery category set for the guild (default 0) |
| keywords? | ?array[string] | The discovery search keywords for the guild (max 10) |
| emoji_discoverability_enabled? | ?boolean | Whether the guild is shown as a source through custom emoji and stickers (default true) |
| is_published? | ?boolean | Whether the guild's landing web page is currently published (default false) |
| reasons_to_join? | ?array[discovery reason object] | The reasons to join the guild shown in the discovery web page (max 4) |
| social_links? | ?array[string] | The guild's social media links shown in the discovery web page (max 256 characters, max 9) |
| about? | ?string | The guild's long description shown in the discovery web page (max 2400 characters) |
Add Guild Discovery Subcategory
PUT/guilds/{guild.id}/discovery-categories/{category.id}Adds a discovery subcategory to the guild. Requires the MANAGE_GUILD permission. Returns a 204 empty response on success.
Remove Guild Discovery Subcategory
DELETE/guilds/{guild.id}/discovery-categories/{category.id}Removes a discovery subcategory from the guild. Requires the MANAGE_GUILD permission. Returns a 204 empty response on success.
Get Guild Profile
GET/guilds/{guild.id}/profileReturns a guild profile object for the given guild ID. User must be a member of the guild or the guild must be discoverable or have a PUBLIC or PUBLIC_WITH_RECRUITMENT visibility.
Modify Guild Profile
PATCH/guilds/{guild.id}/profileModifies the guild profile for the given guild ID. Requires the MANAGE_GUILD permission. Returns the updated guild profile object on success.
JSON Params
| Field | Type | Description |
|---|---|---|
| name? | string | The name of the guild (2-100 characters) |
| icon? | ?image data | The guild's icon; animated icons are only shown when the guild has the ANIMATED_ICON feature |
| description? | ?string | The description for the guild (max 300 characters) |
| brand_color_primary? | string | The guild's accent color as a hexadecimal color string |
| game_application_ids? | array[snowflake] | The IDs of the applications representing the games the guild plays (max 20) |
| tag? 1 | ?string | The tag of the guild (2-4 characters) |
| badge 1 | integer | The badge shown on the guild's tag |
| badge_color_primary 1 | ?string | The primary color of the badge as a hexadecimal color string |
| badge_color_secondary 1 | ?string | The secondary color of the badge as a hexadecimal color string |
| traits? | array[guild trait object] | Terms used to describe the guild's interest and personality (max 5) |
| visibility? | integer | The visibility level of the guild |
| custom_banner | ?image data | The guild's discovery splash |
1 Requires the GUILD_TAGS guild feature.