Quests
Quests are a way for Discord to promote games and other content to users. Users can receive rewards for completing quests, such as redeemable codes, in-game items, or collectibles.
Quest Object
A sponsored quest.
Quest Structure
| Field | Type | Description |
|---|---|---|
| id | snowflake | The ID of the quest |
| config | quest config object | The configuration and metadata for the quest |
| user_status | ?quest user status object | The user's quest progress, if it has been accepted |
| targeted_content (deprecated) 1 | ?array[integer] | The content areas where the quest can be shown |
| preview | boolean | Whether the quest is unreleased and in preview for Discord employees |
| traffic_metadata_sealed? | string | Sealed traffic metadata for the delivered quest |
1 Some quest content areas may be dismissed using the Dismiss Quest Content endpoint.
Partial Quest Structure
| Field | Type | Description |
|---|---|---|
| id | snowflake | The ID of the quest |
| replacement_id? | ?snowflake | The ID of the analogous replacement for an unavailable quest |
Quest Config Object
The quest definition.
Quest Config Structure
The config structure has multiple distinct versions with different field sets. Only actively used versions are kept documented. As of now, only the latest version is available.
| Field | Type | Description |
|---|---|---|
| id | snowflake | The ID of the quest |
| config_version | integer | Quest configuration version |
| starts_at | ISO8601 timestamp | When the quest period starts |
| expires_at | ISO8601 timestamp | When the quest period ends |
| features | array[integer] | The quest features enabled for the quest |
| application | quest application object | The application metadata for the quest |
| assets | quest assets object | Object that holds the quest's assets |
| colors | quest gradient object | The accent colors for the quest |
| messages | quest messages object | Human-readable metadata for the quest |
| task_config_v2 | quest task config object | The task configuration for the quest |
| rewards_config | quest rewards config object | Specifies rewards for the quest (e.g. collectibles) |
| cosponsor_metadata? | quest cosponsor metadata object | The configuration for the quest co-sponsor |
| share_policy | string | The share policy for the quest |
| cta_config | quest CTA config object | The quest call-to-action configuration |
Quest Application Structure
| Field | Type | Description |
|---|---|---|
| id | snowflake | The ID of the application |
| name | string | The name of the application |
| link (deprecated) 1 | string | The link to the game's page |
1 See the cta_config field instead.
Quest Assets Structure
An object holding CDN asset names.
| Field | Type | Description |
|---|---|---|
| hero | string | The quest's hero image |
| hero_video | ?string | A video representation of the hero image |
| quest_bar_hero | string | The hero image used in the quest popup that appears when launching the game before accepting the quest |
| quest_bar_hero_blurhash? | ?string | The blurhash for the quest bar hero image |
| quest_bar_hero_video | ?string | A video representation of the quest bar hero image |
| game_tile | string | The game's icon |
| game_tile_light? | string | The game's icon for light backgrounds |
| game_tile_dark? | string | The game's icon for dark backgrounds |
| logotype | string | The game's logo |
| logotype_light? | string | The game's logo for light backgrounds |
| logotype_dark? | string | The game's logo for dark backgrounds |
Quest Gradient Structure
A 2-point gradient with a primary and secondary color.
| Field | Type | Description |
|---|---|---|
| primary | string | The hex-encoded primary color of the gradient |
| secondary | string | The hex-encoded secondary color of the gradient |
Quest Messages Structure
| Field | Type | Description |
|---|---|---|
| quest_name | string | The name of the quest |
| game_title | string | The title of the game the quest is for |
| game_publisher | string | The publisher of the game the quest is for |
Quest Task Config Structure
| Field | Type | Description |
|---|---|---|
| join_operator 1 | string | The eligibility operator used to join multiple tasks (and or or) |
| tasks | map[string, quest task object] | Tasks required to complete the quest, keyed by their type |
1 For a task set to be considered complete, the user must complete either all tasks (when join_operator is and) or at least one task (when join_operator is or).
Quest Task Structure
| Field | Type | Description |
|---|---|---|
| type | string | The type of task event |
| target 1 | integer | The required value |
| applications? | array[quest task application object] | The application targets that satisfy this task |
| external_ids? | array[string] | IDs of the target game on console platforms |
| assets? | quest video assets object | Video task assets |
| messages? | quest task messages object | Human-readable task metadata |
| event_name? | string | The achievement event name |
| account_link_instructions? | string | Instructions for linking an account |
1 While this is an opaque value, for duration-based tasks, this will be a duration in seconds.
Quest Task Application Structure
| Field | Type | Description |
|---|---|---|
| id | snowflake | The ID of the application |
Quest Task Messages Structure
| Field | Type | Description |
|---|---|---|
| video_title? | string | The title of a video |
| task_title? | string | The task title |
| task_description? | string | The task description |
Quest Task Type
| Value | Description |
|---|---|
| STREAM_ON_DESKTOP | The user must play and stream the game on desktop to at least one other user for a certain duration (see Update Activity Session) |
| PLAY_ON_DESKTOP | The user must play the game on desktop for a certain duration (see Update Activity Session) |
| PLAY_ON_XBOX | The user must play the game on Xbox for a certain duration |
| PLAY_ON_PLAYSTATION | The user must play the game on PlayStation for a certain duration |
| WATCH_VIDEO | The user must watch a video for a certain duration |
| WATCH_VIDEO_ON_MOBILE | The user must watch a video on mobile for a certain duration |
| PLAY_ACTIVITY | The user must play the embedded activity for a certain duration |
| ACHIEVEMENT_IN_GAME 1 | The user must complete an achievement in the game |
| ACHIEVEMENT_IN_ACTIVITY 1 | The user must complete an achievement in the embedded activity |
1 Completion of this task is tracked by the application itself.
Quest Rewards Config Structure
| Field | Type | Description |
|---|---|---|
| assignment_method | integer | How the rewards are assigned |
| rewards | array[quest reward object] | The possible rewards for the quest, ordered by tier (if applicable) |
| rewards_expire_at | ?ISO8601 timestamp | When the reward claiming period ends |
| platforms | array[integer] | The platforms the rewards can be redeemed on |
Quest Reward Structure
| Field | Type | Description |
|---|---|---|
| type | integer | The reward's type |
| sku_id | snowflake | The ID of the SKU awarded |
| asset? | ?string | The reward's media asset |
| asset_video? | ?string | The reward's video asset |
| messages | quest reward messages object | Human-readable metadata for the reward |
| approximate_count? 1 | ?integer | An approximate count of how many users can claim the reward |
| redemption_link? | ?string | The link to redeem the reward |
| expires_at? | ?ISO8601 timestamp | When the reward expires |
| expires_at_premium? | ?ISO8601 timestamp | When the reward expires for premium users |
| expiration_mode? | integer | The expiration mode |
| orb_quantity? | integer | The amount of Discord Orbs awarded |
| premium_orb_quantity? | integer | The amount of Discord Orbs awarded to premium users |
| quantity? | integer | The days of fractional premium awarded |
1 If the amount of users who claimed the awards exceeds this count, then all future claimers will be assigned the next reward tier in the list.
Quest Reward Messages Structure
| Field | Type | Description |
|---|---|---|
| name | string | The reward's name |
| name_with_article | string | The article variant of the name (e.g. a Cybernetic Headgear Decoration) |
| redemption_instructions_by_platform? | map[integer, string] | Instructions for redeeming the reward per-platform |
Quest Reward Assignment Method
The method used to assign the reward to a user.
| Value | Name | Description |
|---|---|---|
| 1 | ALL | All rewards are assigned to the user upon completion |
| 2 | TIERED | The rewards are assigned in tiers |
Quest Reward Type
The type of reward that the user will receive.
| Value | Name | Description |
|---|---|---|
| 1 | REWARD_CODE | The reward is a redeemable code |
| 2 | IN_GAME | The reward is automatically given to the user in the promoted game |
| 3 | COLLECTIBLE | The reward is a Discord collectible (e.g. an avatar decoration) |
| 4 | VIRTUAL_CURRENCY | The reward is a virtual currency (Discord Orbs) |
| 5 | FRACTIONAL_PREMIUM | The reward is a limited free premium (Nitro) trial for a fraction of a billing period |
Quest Reward Expiration Mode
Controls the expiration behavior of COLLECTIBLE rewards.
| Value | Name | Description |
|---|---|---|
| 1 | NORMAL | The reward expires after a set period of time |
| 2 | PREMIUM_EXTENSION | The reward lasts longer for premium (Nitro) users |
| 3 | PREMIUM_PERMANENT | The reward is permanent for premium (Nitro) users, even after their subscription has ended |
Quest Video Assets Structure
| Field | Type | Description |
|---|---|---|
| video | quest video asset object | The primary video asset |
| video_low_res? | quest video asset object | The low-resolution video asset |
| video_hls? | quest video asset object | The HLS video asset |
Quest Video Asset Structure
| Field | Type | Description |
|---|---|---|
| url | string | The video asset URL |
| width? | integer | The video width |
| height? | integer | The video height |
| thumbnail? | string | The thumbnail asset URL |
| caption? | string | The caption asset URL |
| transcript? | string | The transcript asset URL |
Quest Cosponsor Metadata Structure
| Field | Type | Description |
|---|---|---|
| name | string | The name of the co-sponsor |
| logotype | string | The co-sponsor's logo asset |
| logotype_light? | string | The co-sponsor's logo asset for light backgrounds |
| logotype_dark? | string | The co-sponsor's logo asset for dark backgrounds |
| redemption_instructions | string | The co-sponsor's redemption instructions |
Quest CTA Config Structure
| Field | Type | Description |
|---|---|---|
| link | string | The CTA link |
| button_label | string | The CTA button label |
| subtitle? | string | The CTA subtitle |
| android? | Android quest CTA config object | Android-specific CTA config |
| ios? | iOS quest CTA config object | iOS-specific CTA config |
Android Quest CTA Config Structure
| Field | Type | Description |
|---|---|---|
| android_app_id | string | The Android application package name |
iOS Quest CTA Config Structure
| Field | Type | Description |
|---|---|---|
| ios_app_id | string | The iOS application ID |
Quest Share Policy
| Value | Description |
|---|---|
| shareable_everywhere | The quest can be shared everywhere |
| not_shareable | The quest cannot be shared |
Quest Config Version
The version of the quest configuration.
| Value | Status |
|---|---|
| 2 | Active |
| 1 | Discontinued |
Quest Content Type
Areas where the quest can be shown in the Discord client.
| Value | Name | Description | Dismissable |
|---|---|---|---|
| 0 | GIFT_INVENTORY_SETTINGS_BADGE | This quest is shown as a badge in User Settings | Yes |
| 1 | QUEST_BAR | This quest is shown as a bar above the user popout | Yes |
| 2 | QUEST_INVENTORY_CARD | This quest is shown as a card in the user's gift inventory | No |
| 3 | QUESTS_EMBED | This quest is shown as an embed in chat | No |
| 4 | ACTIVITY_PANEL | This quest is shown in the Active Now page | Yes |
| 5 | QUEST_LIVE_STREAM | This quest is shown while watching a stream | Yes |
| 6 | MEMBERS_LIST | This quest is shown in the member list | No |
| 7 | QUEST_BADGE | This quest is shown on the quest profile badge upsell | No |
| 8 | GIFT_INVENTORY_FOR_YOU | This quest is featured in the user's gift inventory for you section | No |
| 9 | GIFT_INVENTORY_OTHER | This quest is featured in the user's gift inventory | No |
| 10 | QUEST_BAR_V2 | This quest is shown in the new quest bar design | Yes |
| 11 | QUEST_HOME_DESKTOP | This quest is shown on the desktop Quest discovery page | No |
| 12 | QUEST_HOME_MOBILE | This quest is shown on the mobile Quest discovery page | No |
| 13 | QUEST_BAR_MOBILE | This quest is shown in the mobile Quest bar design | Yes |
| 14 | THIRD_PARTY_APP | This quest is shown in a third-party app | No |
| 15 | QUEST_BOTTOM_SHEET | This quest is shown in the bottom sheet | No |
| 16 | QUEST_EMBED_MOBILE | This quest is shown in the mobile Quest embed | No |
| 17 | QUEST_HOME_MOVE_CALLOUT | This quest is shown in the move callout on the Quest discovery page | No |
| 18 | DISCOVERY_SIDEBAR | This quest is shown in the discovery sidebar | No |
| 19 | QUEST_SHARE_LINK | This quest is eligible to be shared as a link | No |
| 20 | CONNECTIONS_MODAL | This quest is shown in the user connections modal | No |
| 21 | DISCOVERY_COMPASS | This quest is shown on the discovery button | No |
| 22 | TROPHY_CASE_CARD | This quest is shown as a card in the user's trophy case | No |
| 23 | VIDEO_MODAL | This quest has a video modal | No |
| 24 | VIDEO_MODAL_END_CARD | This quest has an end card in the video modal | No |
| 25 | REWARD_MODAL | This quest is shown in the reward modal | No |
| 26 | EXCLUDED_QUEST_EMBED | This quest is excluded from the Quest embed | No |
| 27 | VIDEO_MODAL_MOBILE | This quest is shown in the mobile video modal | No |
| 28 | ORBS_ANNOUNCEMENT_MODAL | This quest is shown in the Orbs announcement modal | No |
| 29 | ORBS_BALANCE_MENU | This quest is shown in the Orbs balance menu | No |
| 30 | QUEST_ENROLLMENT_BLOCKED_BOTTOM_SHEET | This quest is shown in the enrollment blocked bottom sheet | No |
| 31 | ORBS_SHOP_HERO_CTA | This quest is shown in the Orbs shop hero CTA | No |
| 32 | QUEST_ENROLLMENT_BLOCKED_MODAL | This quest is shown in the enrollment blocked modal | No |
| 33 | INTERNAL_PREVIEW_TOOL | This quest is shown in the internal preview tool | No |
| 34 | ORBS_REHEAT_COACHMARK_CTA | This quest is shown in the Orbs reheat coachmark CTA | No |
| 35 | INVALID_QUEST_EMBED | This quest is shown for invalid quest embeds | No |
| 36 | NOT_SHAREABLE_QUEST_EMBED | This quest is shown for quest embeds that cannot be shared | No |
| 37 | QUEST_HOME_MOVE_CALLOUT_DISCOVER | This quest is shown in the Quest Home move callout discover CTA | No |
| 38 | SPONSORED_QUEST_SHEET | This quest is shown in the sponsored quest sheet | No |
| 39 | MOBILE_ORBS_ONBOARDING_DC | This quest is shown in mobile Orbs onboarding dismissible content | No |
| 40 | RUNNING_ACTIVITY | This quest is shown from a running activity | No |
| 41 | VIDEO_MODAL_PRIMARY_CTA | This quest is shown in the video modal primary CTA | No |
| 42 | QUEST_HOME_TAKEOVER | This quest is shown in the Quest Home takeover | No |
| 43 | USER_PROFILE_ACTIVITY | This quest is shown in user profile activity | No |
| 44 | MEMBERS_LIST_CARD | This quest is shown in a member list card | No |
| 45 | APP_LAUNCHER | This quest is shown in the app launcher | No |
| 46 | ACTIVITY_SUGGESTION | This quest is shown as an activity suggestion | No |
| 47 | QUEST_HOME_ENTRYPOINT | This quest is shown in the Quest Home entrypoint | No |
| 48 | QUEST_HOME_ENTRYPOINT_THEMED | This quest is shown in the themed Quest Home entrypoint | No |
| 49 | QUEST_ACTIVITY_UNENROLLED_MODAL | This quest is shown in the quest activity unenrolled modal | No |
| 50 | QUEST_HOME_HERO | This quest is shown in the Quest Home hero | No |
| 51 | QUEST_ACTIVITY_HEADER | This quest is shown in the quest activity header | No |
| 52 | USER_PROFILE_HEADER | This quest is shown in the user profile header | No |
| 53 | USER_SETTINGS | This quest is shown in user settings | No |
| 54 | NITRO_HOME_PERK_CARD | This quest is shown on a Nitro Home perk card | No |
| 55 | QUEST_HOME_MOBILE_CAROUSEL | This quest is shown in the mobile Quest Home carousel | No |
| 56 | QUEST_HOME_HERO_SHELF | This quest is shown in the Quest Home hero shelf | No |
| 57 | VIDEO_MODAL_ICON_END_CARD | This quest has an icon end card in the video modal | No |
| 58 | ACHIEVEMENT_IN_GAME_MODAL | This quest is shown in the in-game achievement modal | No |
| 59 | QUEST_HOME_FEATURED_SECTION | This quest is shown in the Quest Home featured section | No |
| 60 | QUEST_HOME_IN_PROGRESS_SECTION | This quest is shown in the Quest Home in-progress section | No |
| 61 | QUEST_HOME_ENDING_SOON_SECTION | This quest is shown in the Quest Home ending soon section | No |
| 62 | QUEST_HOME_ORB_SECTION | This quest is shown in the Quest Home Orbs section | No |
| 63 | QUEST_HOME_DISCOVERED_SECTION | This quest is shown in the Quest Home discovered section | No |
| 64 | QUEST_HOME_SEARCH_RESULT | This quest is shown in Quest Home search results | No |
| 65 | PLAY_QUEST_MODAL | This quest is shown in the play quest modal | No |
| 66 | VIDEO_MODAL_MOBILE_FOOTER | This quest is shown in the mobile video modal footer | No |
| 67 | QUEST_HOME_ENTRYPOINT_MOBILE | This quest is shown in the mobile Quest Home entrypoint | No |
| 68 | BOUNTIES_END_INTERSTITIAL | This quest is shown in the bounties end interstitial | No |
| 69 | QUEST_HOME_EXPIRED_SECTION | This quest is shown in the Quest Home expired section | No |
| 70 | QUEST_HOME_PREVIEW_SECTION | This quest is shown in the Quest Home preview section | No |
| 71 | SOCIAL_LAYER_STOREFRONT | This quest is shown in the social layer storefront | No |
| 72 | QUEST_HOME_SPECIAL_QUESTS_SECTION | This quest is shown in the Quest Home special quests section | No |
Quest Platform Type
Specifies the platforms that the quest reward can be redeemed on.
| Value | Name | Description |
|---|---|---|
| 0 | CROSS_PLATFORM | This reward can be redeemed on all platforms |
| 1 | XBOX | This reward can be redeemed on Xbox |
| 2 | PLAYSTATION | This reward can be redeemed on PlayStation |
| 3 | SWITCH | This reward can be redeemed on Nintendo Switch |
| 4 | PC | This reward can be redeemed on PC |
Quest Feature
A behavioral variant for a quest.
| Value | Name | Description |
|---|---|---|
| 1 | POST_ENROLLMENT_CTA | The quest has a post-enrollment call-to-action |
| 3 | QUEST_BAR_V2 | The quest uses the new quest bar design |
| 5 | EXCLUDE_RUSSIA | The quest is not shown in Russia |
| 6 | IN_HOUSE_CONSOLE_QUEST | The console quest is first-party |
| 7 | MOBILE_CONSOLE_QUEST | The console quest is available on mobile |
| 8 | START_QUEST_CTA | The quest has a start call-to-action |
| 9 | REWARD_HIGHLIGHTING | The quest has reward highlighting |
| 10 | FRACTIONS_QUEST | The quest offers fractional rewards |
| 11 | ADDITIONAL_REDEMPTION_INSTRUCTIONS | The quest has additional redemption instructions |
| 12 | PACING_V2 | The quest uses the new pacing system |
| 13 | DISMISSAL_SURVEY | The quest presents a survey upon dismissal |
| 14 | MOBILE_QUEST_DOCK | The quest is shown in the mobile quest dock |
| 15 | QUESTS_CDN | The quest uses the CDN for assets |
| 16 | PACING_CONTROLLER | The quest uses the pacing controller |
| 17 | QUEST_HOME_FORCE_STATIC_IMAGE | The quest displays a static image on the Quest Home |
| 18 | VIDEO_QUEST_FORCE_HLS_VIDEO | The video quest forces HLS video playback |
| 19 | VIDEO_QUEST_FORCE_END_CARD_CTA_SWAP | The video quest swaps the end card CTA |
| 20 | EXPERIMENTAL_TARGETING_TRAITS | The quest uses experimental targeting traits |
| 21 | DO_NOT_DISPLAY | The quest should not be displayed |
| 22 | EXTERNAL_DIALOG | The quest uses an external dialog |
| 23 | MOBILE_ONLY_QUEST_PUSH_TO_MOBILE | The quest is mobile-only and pushes users to mobile |
| 24 | MANUAL_HEARTBEAT_INITIALIZATION | The quest uses manual heartbeat initialization |
| 25 | CLOUD_GAMING_ACTIVITY | The quest uses cloud gaming activity behavior |
| 26 | NON_GAMING_PLAY_QUEST | The quest is a non-gaming play quest |
| 27 | ACTIVITY_QUEST_AUTO_ENROLLMENT | The activity quest can auto-enroll users |
| 28 | PACKAGE_ACTION_ADVENTURE | The quest is in the action/adventure package |
| 29 | PACKAGE_RPG_MMO | The quest is in the RPG/MMO package |
| 30 | PACKAGE_RACING_SPORTS | The quest is in the racing/sports package |
| 31 | PACKAGE_SANDBOX_CREATIVE | The quest is in the sandbox/creative package |
| 32 | PACKAGE_FAMILY_FRIENDLY | The quest is in the family-friendly package |
| 33 | PACKAGE_HOLIDAY_SEASON | The quest is in the holiday season package |
| 34 | PACKAGE_NEW_YEARS | The quest is in the New Years package |
| 35 | FULL_EPISODE_VIDEO_QUEST | The quest is a full episode video quest |
| 36 | MOBILE_ACTIVITY_QUEST | The quest is a mobile activity quest |
| 37 | QUEST_BAR_UNFURL | The quest supports quest bar unfurl behavior |
| 38 | NO_PREMIUM_ORBS_PERK | The quest does not use the premium Orbs perk |
| 39 | NITRO_CONTROL_CTA | The quest has a Nitro control CTA |
| 40 | NITRO_2_POINT_0_CTA | The quest has a Nitro 2.0 CTA |
| 41 | ORBS_MULTIPLIER_QUEST | The quest is an Orbs multiplier quest |
| 42 | XBOX_GAME_PASS_QUEST | The quest is an Xbox Game Pass quest |
Example Quest
{ "id": "8206816794116096000", "config": { "id": "8206816794116096000", "config_version": 2, "starts_at": "2025-02-21T18:00:00+00:00", "expires_at": "2025-02-28T01:00:00+00:00", "features": [3, 9, 12, 14, 15, 16], "application": { "link": "https://alien.studios/cyberalien", "id": "891436233903964161", "name": "Cyberalien 2077" }, "assets": { "hero": "hero.jpg", "hero_video": "hero.mp4", "quest_bar_hero": "questbar.jpg", "quest_bar_hero_video": "questbar.mp4", "game_tile": "gametile.jpg", "logotype": "wordmark.png" }, "colors": { "primary": "#E944D4", "secondary": "#5318A7" }, "messages": { "quest_name": "Kill the Aliens", "game_title": "Cyberalien 2077", "game_publisher": "Alien Studios" }, "task_config_v2": { "join_operator": "or", "tasks": { "PLAY_ON_DESKTOP": { "type": "PLAY_ON_DESKTOP", "target": 900, "applications": [{ "id": "891436233903964161" }] }, "PLAY_ON_XBOX": { "type": "PLAY_ON_XBOX", "target": 900, "external_ids": ["267696969"], "applications": [{ "id": "891436233903964161" }] }, "PLAY_ON_PLAYSTATION": { "type": "PLAY_ON_PLAYSTATION", "target": 900, "external_ids": ["CUSA42069_00"], "applications": [{ "id": "891436233903964161" }] } } }, "rewards_config": { "assignment_method": 1, "rewards": [ { "type": 1, "sku_id": "1342624440894361624", "asset": "CYBERNETIC_HEADGEAR_HELL_YEAHHH.png", "asset_video": null, "messages": { "name": "Cybernetic Headgear", "name_with_article": "a Cybernetic Headgear", "redemption_instructions_by_platform": { "0": "Reward Instructions:\nGo to https://alien.studios/redeem\nEnter your code\nClaim your reward!" } }, "approximate_count": null, "redemption_link": "https://alien.studios/redeem" } ], "rewards_expire_at": "2025-03-28T00:00:00+00:00", "platforms": [0] }, "share_policy": "shareable_everywhere", "cta_config": { "link": "https://alien.studios/cyberalien", "button_label": "Play Now" } }, "user_status": null, "targeted_content": [], "preview": false}Claimed Quest Object
A claimed quest.
Claimed Quest Structure
| Field | Type | Description |
|---|---|---|
| id | snowflake | The ID of the quest |
| config | claimed quest config object | The configuration and metadata for the quest |
| user_status | quest user status object | The user's quest progress |
Claimed Quest Config Structure
| Field | Type | Description |
|---|---|---|
| id | snowflake | The ID of the quest |
| starts_at | ISO8601 timestamp | When the quest period starts |
| expires_at | ISO8601 timestamp | When the quest period ends |
| features | array[integer] | The quest features enabled for the quest |
| colors | quest gradient object | The accent colors for the quest |
| assets | quest assets object | Object that holds the quest's assets |
| messages | quest messages object | Human-readable metadata for the quest |
| rewards | array[claimed quest reward object] | The claimed rewards for the quest |
Claimed Quest Reward Structure
| Field | Type | Description |
|---|---|---|
| type | integer | The reward's type |
| sku_id | snowflake | The ID of the SKU awarded |
| name | string | The reward's name |
| name_with_article | string | The article variant of the name (e.g. a Cybernetic Headgear Decoration) |
| asset | string | The reward's media asset |
| asset_video | ?string | The reward's video asset |
| orb_quantity | ?integer | The amount of Discord Orbs awarded |
| collectible_product? | collectible object | The collectible product awarded |
Example Claimed Quest
{ "id": "8206816794116096000", "config": { "id": "8206816794116096000", "starts_at": "2025-02-21T18:00:00+00:00", "expires_at": "2025-02-28T01:00:00+00:00", "features": [3, 9, 12, 14, 15, 16], "colors": { "primary": "#E944D4", "secondary": "#5318A7" }, "assets": { "hero": "hero.jpg", "hero_video": "hero.mp4", "quest_bar_hero": "questbar.jpg", "quest_bar_hero_video": "questbar.mp4", "game_tile": "gametile.jpg", "logotype": "wordmark.png" }, "messages": { "quest_name": "Kill the Aliens", "game_title": "Cyberalien 2077", "game_publisher": "Alien Studios" }, "rewards": [ { "sku_id": "1342624440894361624", "type": 1, "name": "Cybernetic Headgear", "name_with_article": "a Cybernetic Headgear", "asset": "CYBERNETIC_HEADGEAR_HELL_YEAHHH.png", "asset_video": null, "orb_quantity": null } ] }, "user_status": null}Quest User Status Object
The user's quest progression.
Quest User Status Structure
| Field | Type | Description |
|---|---|---|
| user_id | snowflake | The ID of the user |
| quest_id? | snowflake | The ID of the quest |
| enrolled_at | ?ISO8601 timestamp | When the user accepted the quest |
| completed_at | ?ISO8601 timestamp | When the user completed the quest |
| claimed_at | ?ISO8601 timestamp | When the user claimed the quest's reward |
| claimed_tier? | ?integer | Which reward tier the user has claimed, if the quest's assignment_method is TIERED |
| orb_quantity_claimed? | ?integer | The amount of Discord Orbs claimed |
| last_stream_heartbeat_at? 1 | ?ISO8601 timestamp | When the last heartbeat was received |
| stream_progress_seconds? 1 | integer | Duration (in seconds) the user has streamed the game for since the quest was accepted |
| dismissed_quest_content? | integer | The content areas the user has dismissed for the quest |
| progress | map[string, quest task progress object] | The user's progress for each task in the quest, keyed by their type |
1 These fields are only used for quest config version 1, where the event is always STREAM_ON_DESKTOP.
Quest Task Progress Structure
| Field | Type | Description |
|---|---|---|
| event_name | string | The type of task event |
| value 1 | integer | The current task value |
| updated_at | ISO8601 timestamp | When the task was last updated |
| completed_at | ?ISO8601 timestamp | When the task was completed |
| heartbeat? 2 | ?quest task heartbeat object | The task's heartbeat data |
1 While this is an opaque value, for duration-based tasks, this will be a duration in seconds. To complete the task, this value must match the target value.
2 Heartbeats are only present for events STREAM_ON_DESKTOP, PLAY_ON_DESKTOP, and PLAY_ACTIVITY.
Quest Task Heartbeat Structure
| Field | Type | Description |
|---|---|---|
| last_beat_at | ISO8601 timestamp | When the last heartbeat was received |
| expires_at | ?ISO8601 timestamp | When the task progress expires |
Dismissible Quest Content Flags
Dismissed quest content areas.
| Value | Name | Description |
|---|---|---|
| 1 << 0 | GIFT_INVENTORY_SETTINGS_BADGE | User has dismissed the quest from User Settings |
| 1 << 1 | QUEST_BAR 1 | User has dismissed the quest from the Quest Bar |
| 1 << 2 | ACTIVITY_PANEL | User has dismissed the quest from the Active Now page |
| 1 << 3 | QUEST_LIVE_STREAM | User has dismissed the quest from the stream overlay |
1 This flag dismisses any QUEST_BAR content area, including QUEST_BAR, QUEST_BAR_V2, and QUEST_BAR_MOBILE.
Example Quest User Status
{ "user_id": "222069018507345921", "quest_id": "8206816794116096000", "enrolled_at": "2077-01-01T11:59:59+00:00", "completed_at": "2077-01-01T11:59:59+00:00", "claimed_at": "2077-01-01T11:59:59+00:00", "claimed_tier": null, "last_stream_heartbeat_at": null, "stream_progress_seconds": 0, "dismissed_quest_content": 0, "progress": { "PLAY_ON_DESKTOP": { "value": 900, "event_name": "PLAY_ON_DESKTOP", "updated_at": "2025-03-11T18:19:54.189229+00:00", "completed_at": "2025-03-11T18:19:54.189231+00:00", "heartbeat": { "last_beat_at": "2077-01-01T11:59:59+00:00", "expires_at": null } } }}Quest Reward Code Object
An object that holds the quest's reward code.
Quest Reward Code Structure
| Field | Type | Description |
|---|---|---|
| quest_id | snowflake | The ID of the quest |
| code | string | The redeem code |
| platform | integer | The platform this redeem code applies to |
| user_id | snowflake | The ID of the user who this code belongs to |
| claimed_at | ISO8601 timestamp | When the user claimed the quest's reward |
| tier | ?integer | Which reward tier the code belongs to, if the quest's assignment_method is set to TIERED |
Example Quest Reward Code
{ "quest_id": "8206816794116096000", "code": "111-1111111", "platform": 0, "user_id": "222069018507345921", "claimed_at": "2077-01-01T18:41:29.706194+00:00", "tier": null}Endpoints
List Current User Quests
GET/quests/@meReturns information on the current quests for the current user.
Response Body
| Field | Type | Description |
|---|---|---|
| quests | array[quest object] | The current quests for the user |
| excluded_quests | array[partial quest object] | The quests that the user cannot participate in |
| quest_enrollment_blocked_until | ?ISO8601 timestamp | When the user can enroll in quests again |
List Claimed Quests
GET/quests/@me/claimedReturns information on the claimed quests for the current user.
Response Body
| Field | Type | Description |
|---|---|---|
| quests | array[claimed quest object] | The claimed quests for the user |
Get Quest Config
GET/quests/{quest.id}Returns a quest config object for the specified quest. Quest must be currently active.
Get Quest Preview
GET/quests/{quest.id}/previewReturns a quest object for the specified preview quest.
Get Quest Placement
GET/quests/decisionReturns the sponsored quest that should be shown to the user in a specific placement.
Query String Params
| Field | Type | Description |
|---|---|---|
| placement | integer | The quest placement area to get the quest for |
| client_heartbeat_session_id? 1 | string | A client-generated UUID representing the current persisted analytics heartbeat |
| client_ad_session_id? 2 | string | A client-generated UUID representing the current ad attribution session |
| visible_guild_ids? | array[snowflake] | Visible guild IDs used as ad context (max 50) |
1 This value is also sent in the client properties.
2 This value is used to correlate ad decision requests, ad heartbeat events, and follow-up actions. Clients should reuse an ad session until it has been idle for 30 minutes or active for 12 hours.
Quest Placement Area
| Value | Name | Description |
|---|---|---|
| 1 | DESKTOP_ACCOUNT_PANEL_AREA | Account panel on desktop |
| 2 | MOBILE_HOME_DOCK_AREA | Home dock on mobile |
| 3 | QUEST_HOME_BANNER_DESKTOP | Quest Home banner on desktop |
| 4 | QUEST_HOME_MOBILE_CAROUSEL | Quest Home carousel on mobile |
| 5 | VIDEO_MODAL_MOBILE | Video modal on mobile |
Response Body
| Field | Type | Description |
|---|---|---|
| request_id | string | The advertisement decision ID |
| quest | ?quest object | The quest to show to the user |
| creative | ?quest ad creative object | The advertisement creative to show to the user |
| ad_identifiers | ?quest ad identifiers object | The advertisement identifiers for the delivered quest |
| ad_context | ?quest ad context object | The advertisement context for the delivered quest |
| response_ttl_seconds? | integer | How long the response should be cached, in seconds |
| metadata_sealed? | ?string | Sealed metadata for the advertisement |
| traffic_metadata_sealed? | ?string | Sealed traffic metadata for the advertisement |
Quest Ad Identifiers Structure
| Field | Type | Description |
|---|---|---|
| campaign_id? | snowflake | The ID of the advertisement campaign |
| ad_set_id? | snowflake | The ID of the advertisement set |
| ad_id? | snowflake | The ID of the advertisement |
| creative_id? | snowflake | The ID of the advertisement creative |
| creative_type? | integer | The type of advertisement creative |
| is_targeted? | boolean | Whether the advertisement is targeted |
| ad_content_id? | snowflake | The ID of the advertisement content |
Quest Ad Context Structure
| Field | Type | Description |
|---|---|---|
| is_campaign_ias_enabled | boolean | Whether the campaign has Integral Ad Science enabled |
Quest Ad Decision Structure
| Field | Type | Description |
|---|---|---|
| creative | ?quest ad creative object | The advertisement creative to show to the user |
| ad_identifiers? | quest ad identifiers object | The advertisement identifiers for the delivered quest |
| ad_context? | quest ad context object | The advertisement context for the delivered quest |
| response_ttl_seconds? | integer | How long the response should be cached, in seconds |
| metadata_sealed? | ?string | Sealed metadata for the advertisement |
| traffic_metadata_sealed? | ?string | Sealed traffic metadata for the advertisement |
Quest Ad Creative Structure
| Field | Type | Description |
|---|---|---|
| creative_type | integer | The type of advertisement creative |
| creative_content | object | The creative content; shape depends on creative_type |
| starts_at | ISO8601 timestamp | When the creative starts being available |
| ends_at | ISO8601 timestamp | When the creative stops being available |
Ad Creative Type
| Value | Name | Description |
|---|---|---|
| 1 | QUEST | The creative content is a quest config object |
| 2 | QUEST_HOME_HERO | The creative content is a quest home hero creative object |
| 3 | BOUNTY | The creative content is a quest bounty creative object |
Quest Home Hero Creative Structure
| Field | Type | Description |
|---|---|---|
| id | snowflake | The ID of the quest home hero creative |
| label_title | string | The hero title |
| label_subtitle? | string | The hero subtitle |
| hero_image | string | The hero image asset |
| hero_video? | string | The hero video asset |
| sponsor_image? | string | The sponsor image asset |
| cta | quest creative CTA object | The hero CTA |
| quest_ids? | array[snowflake] | The quests represented by the hero |
| quest_home_entrypoint? | quest home entrypoint object | Quest Home entrypoint metadata |
| shelf_image? | string | The shelf image asset |
| shelf_video? | string | The shelf video asset |
Quest Bounty Creative Structure
| Field | Type | Description |
|---|---|---|
| id | snowflake | The ID of the bounty creative |
| advertiser_name | string | The advertiser name |
| product_name? | string | The advertised product name |
| product_icon? | string | The advertised product icon asset |
| video_preview? | string | The preview video asset |
| image_preview? | string | The preview image asset |
| video_hls | string | The HLS video asset |
| cta | quest creative CTA object | The bounty CTA |
| reward_timer_seconds? | integer | The number of seconds before a reward can be claimed |
Quest Creative CTA Structure
| Field | Type | Description |
|---|---|---|
| url | string | The CTA URL |
| button_label | string | The CTA button label |
| android? | Android quest CTA config object | Android-specific CTA config |
| ios? | iOS quest CTA config object | iOS-specific CTA config |
Quest Home Entrypoint Structure
| Field | Type | Description |
|---|---|---|
| linear_gradient? | quest home entrypoint gradient object | The linear gradient |
| radial_gradient? | quest home entrypoint gradient object | The radial gradient |
| gradient_preset? | integer | The gradient preset |
| image? | string | The entrypoint image asset |
| tooltip_image? | string | The tooltip image asset |
| tooltip_title? | string | The tooltip title |
| tooltip_subtitle? | string | The tooltip subtitle |
Quest Home Entrypoint Gradient Structure
| Field | Type | Description |
|---|---|---|
| start | string | The gradient start color |
| end | string | The gradient end color |
Get Earned Quest Placement
GET/quests/earned-decisionReturns the earned quests that should be shown to the user in a specific content area.
Query String Params
| Field | Type | Description |
|---|---|---|
| quest_ids | array[string] | Quest IDs to evaluate (1-20) |
| content | integer | The content location to get earned quests for |
| client_heartbeat_session_id? 1 | string | A client-generated UUID representing the current persisted analytics heartbeat |
1 This value is also sent in the client properties.
Response Body
| Field | Type | Description |
|---|---|---|
| quests | map[snowflake, ?quest object] | The earned quests, keyed by quest ID |
| response_ttl_seconds? | integer | How long the response should be cached, in seconds |
| request_id? | ?string | The advertisement decision request ID |
Get Quest Decisions
GET/quests/get-decisionsReturns one or more quest advertisement decisions for a placement.
Query String Params
| Field | Type | Description |
|---|---|---|
| placement | integer | The quest placement area to get decisions for |
| num_decisions_requested | integer | The number of decisions to request (1-15) |
| client_heartbeat_session_id? 1 | string | A client-generated UUID representing the current persisted analytics heartbeat |
| client_ad_session_id? 2 | string | A client-generated UUID representing the current ad attribution session |
1 This value is also sent in the client properties.
2 This value is used to correlate ad decision requests, ad heartbeat events, and follow-up actions. Clients should reuse an ad session until it has been idle for 30 minutes or active for 12 hours.
Response Body
| Field | Type | Description |
|---|---|---|
| request_id | string | The advertisement decision request ID |
| decisions | array[quest ad decision object] | The advertisement decisions |
Get Quest Creative Preview
GET/quests/previewReturns quest advertisement decisions for specific advertisement creatives.
Query String Params
| Field | Type | Description |
|---|---|---|
| ad_creative_ids | array[snowflake] | The advertisement creative IDs |
Response Body
| Field | Type | Description |
|---|---|---|
| request_id | string | The advertisement decision request ID |
| decisions | array[quest ad decision object] | The advertisement decisions |
Accept Quest
POST/quests/{quest.id}/enrollAccepts a quest and returns a quest user status object. Fires a Quests User Status Update Gateway event.
JSON Params
| Field | Type | Description |
|---|---|---|
| location | integer | The content location where the action was initiated |
| metadata_sealed? | ?string | Sealed metadata for the advertisement decision |
| traffic_metadata_sealed? | ?string | Sealed traffic metadata for the advertisement decision |
Claim Quest Reward
POST/quests/{quest.id}/claim-rewardClaims the quest's rewards, setting the completed_at and claimed_at fields of the quest user status to the current timestamp.
Fires a Quests User Status Update Gateway event.
JSON Params
| Field | Type | Description |
|---|---|---|
| location | integer | The content location where the action was initiated |
| platform | integer | The platform to claim the reward for |
| metadata_sealed? | ?string | Sealed metadata for the advertisement decision |
| traffic_metadata_sealed? | ?string | Sealed traffic metadata for the advertisement decision |
Response Body
| Field | Type | Description |
|---|---|---|
| claimed_at | ?ISO8601 timestamp | When the rewards were claimed |
| entitlement_expiration_metadata | map[snowflake, entitlement expiration metadata object] | The expiration metadata for each entitlement |
| entitlements | array[entitlement object] | The entitlements the user received |
| errors | array[JSON error object] | The errors that occured while claiming the reward |
Entitlement Expiration Metadata Structure
| Field | Type | Description |
|---|---|---|
| extended | boolean | Whether the entitlement expiration has been extended due to a premium subscription |
| extendable | boolean | Whether the entitlement expiration can be extended due to a premium subscription |
Example Response
{ "claimed_at": "2024-04-17T23:30:41.000321+00:00", "entitlement_expiration_metadata": { "1230299425620885624": { "extended": false, "extendable": true } }, "entitlements": [ { "id": "1230299425620885624", "sku_id": "1226939756617793606", "application_id": "1242265603276800000", "user_id": "222069018507345921", "deleted": false, "starts_at": null, "ends_at": null, "type": 10, "tenant_metadata": {}, "gift_code_flags": 0, "promotion_id": null } ], "errors": []}Claim Quest Creative Reward
POST/quests/creatives/{ad_creative.id}/claim-rewardClaims the reward for a quest advertisement creative. Returns a 204 empty response on success.
JSON Params
| Field | Type | Description |
|---|---|---|
| decision_metadata_sealed? | ?string | Sealed metadata for the advertisement decision |
| traffic_metadata_sealed? | ?string | Sealed traffic metadata for the advertisement decision |
| client_heartbeat_session_id? 1 | string | A client-generated UUID representing the current persisted analytics heartbeat |
| client_ad_session_id? 2 | string | A client-generated UUID representing the current ad attribution session |
1 This value is also sent in the client properties.
2 This value is used to correlate ad decision requests, ad heartbeat events, and follow-up actions. Clients should reuse an ad session until it has been idle for 30 minutes or active for 12 hours.
Get Quest Reward Code
GET/quests/{quest.id}/reward-codeRetrieves the current user's claimed reward code. Returns a quest reward code object on success.
Send Quest Heartbeat
POST/quests/{quest.id}/heartbeatTells the server to update the value and heartbeat fields of the current task. Used for keeping track of how long the stream has been running for, and for checking if the user has met the task duration requirement.
Returns a quest user status object on success. Fires a Quests User Status Update Gateway event.
JSON Params
| Field | Type | Description |
|---|---|---|
| stream_key? 1 | string | The encoded key of the stream (e.g guild:169256939211980800:1050497861969793164:222069018507345921) |
| application_id? | snowflake | The ID of the application being played |
| terminal? | boolean | Whether this is the last heartbeat in the sequence (default false) |
| executable_path? | ?string | The executable path for the detected game |
| executable_fingerprint? | ?string | The executable fingerprint for the detected game |
1 Only required for stream quests.
Send Quest Video Progress
POST/quests/{quest.id}/video-progressTells the server to update the value field of the current video task. Used for keeping track of how long the video has been watched for, and for checking if the user has met the task duration requirement.
Returns a quest user status object on success. Fires a Quests User Status Update Gateway event.
JSON Params
| Field | Type | Description |
|---|---|---|
| timestamp | integer | How far into the video the user is (in seconds) |
Start Console Quest
POST/quests/{quest.id}/console/startStarts completing a quest on console. Fires a Quests User Status Update Gateway event.
Query String Params
| Field | Type | Description |
|---|---|---|
| preview? | boolean | Whether the quest is in preview mode (default false) |
Response Body
| Field | Type | Description |
|---|---|---|
| started | boolean | Whether the quest was successfully started |
| quest_user_status | ?quest user status object | The user's quest progress |
| error_hints | ?array[string] | The errors that occurred while starting the quest |
| error_hints_v2 | ?array[quest error hint object] | The errors that occurred while starting the quest |
Quest Error Hint Structure
| Field | Type | Description |
|---|---|---|
| type | string | The type of error |
| message | string | The error message |
| connected_account_id | snowflake | The ID of the connection the console account is linked to |
| connected_account_type | string | The type of connection the console account is linked to |
Example Response
{ "started": false, "quest_user_status": null, "error_hints": ["Xbox account DiscordGamer seems to be offline."], "error_hints_v2": [ { "type": "no_game_offline", "message": "Xbox account DiscordGamer seems to be offline.", "connected_account_id": "3076467402341699", "connected_account_type": "xbox" } ]}Stop Console Quest
POST/quests/{quest.id}/console/stopStops completing a quest on console. Returns a 204 empty response on success. Fires a Quests User Status Update Gateway event.
Complete Quest
POST/quests/{quest.id}/preview/completeForcefully completes the quest for the current user. Returns a quest user status object. Fires a Quests User Status Update Gateway event.
Reset Quest
DELETE/quests/{quest.id}/preview/statusResets the quest's status for the current user. Returns a quest user status object. Fires a Quests User Status Update Gateway event.
Reset Recent Quest Completions
DELETE/quests/reset-recent-quest-completionsClears recent quest completion tracking for the current user. Returns a 204 empty response on success.
Dismiss Quest Content
POST/quests/{quest.id}/dismissible-content/{quest_content_type}/dismissDismisses the specified quest content area for the current user. Not all content areas can be dismissed. Returns a quest user status object. Fires a Quests User Status Update Gateway event.
Reset Quest Dismissibility
DELETE/quests/{quest.id}/preview/dismissibilityResets the dismissibility of the quest's content areas for the current user (sets the dismissed_quest_content field to 0).
Returns a quest user status object. Fires a Quests User Status Update Gateway event.