PYPRESENCE(1)
๐ pypresence(1) โ the pypresence manual page, but make it make sense
okay so. this is the manual page for pypresence, section 1 of the manual. it's the whole documentation situation. buckle up bestie, we're going in ๐ซถ
โจ NAME โจ
pypresence โ pypresence Documentation. that's it. that's the name. iconic of it honestly ๐
๐ INSTALLATION ๐
install pypresence with pip. literally one command, you got this:
if you want the last full release (the stable one, the one that slays), use:
pip install pypresence
or if you're feeling brave and want the in-development release (main character energy, slightly unhinged), use:
pip install https://github.com/qwertyquerty/pypresence/archive/master.zip
๐ฆ LINKS ๐ฆ
- Discord Support Server โ
https://discord.gg/JF3kg77 - Qwerty's Patreon (Some doll hairs would be nice) โ
https://www.patreon.com/qwertyquerty - pypresence GitHub Repository โ
https://github.com/qwertyquerty/pypresence
๐ธ INFORMATION ๐ธ
๐ About ๐
Pypresence is a wrapper for Discord RPC. you can use it for Rich Presence for your games, as well as other discord integrations. it's giving "your game but now everyone on your friends list can see what you're doing." periodt โจ
โญ Quickstart โญ
This page exists for if you have literally no clue what you're doing, or you just need a quick start. (For rich presence)
no literally. this is the "i opened the docs and my eyes glazed over" section. we got you ๐ซถ
The first thing youll want to do is create a Discord RPC app. Here are the steps:
- Navigate to
https://discord.com/developers/ - Click "Create an Application."
- Setup the application how you want, give it the name you want, and give it a good image.
- Right under the name of your application, locate your Client ID. You will need this later.
- Lastly, save your application.
Next, you need to install pypresence. You will need python 3.9+ installed. Here are the steps:
- Open command prompt
- Type
pip install pypresenceand hit enter - It should say something near the end that says something like "Successfully installed pypresence".
Now you will need to create the program to set your rich presence. First we need to import what we need, like so:
from pypresence import Presence # The simple rich presence client in pypresence
import time
Next we need to initialize our Rich Presence client. You'll need that Client ID from earlier:
client_id = "ID HERE" # Put your Client ID in here
RPC = Presence(client_id) # Initialize the Presence client
Now we need to connect our Client to Discord, so it can send presence updates:
RPC.connect() # Start the handshake loop
Now we need to actually set our rich presence. We can use the update() function for this. There are many options we can use, but for this we will use these:
RPC.update(
state="Here it is!",
details="A working presence, from python!",
name="Rich Presence Example",
) # Updates our presence
Now we need our program to run forever, so we use a while loop.
while True: # The presence will stay on as long as the program is running
time.sleep(15) # Can only update rich presence every 15 seconds
Now when you run your program, it should look something like this! [image: Finished Presence] [image] โ yeah. that's the good stuff. look at you go ๐ญ๐
๐ Using Activity Types and Status Display Types ๐
You can customize how your presence appears by using ActivityType and StatusDisplayType enums. Here's an example:
from pypresence import Presence
from pypresence.types import ActivityType, StatusDisplayType
import time
client_id = "ID HERE"
RPC = Presence(client_id)
RPC.connect()
# Show as "Listening to" instead of "Playing"
RPC.update(
activity_type=ActivityType.LISTENING,
details="My Favorite Song",
state="By My Favorite Artist"
)
# Or use StatusDisplayType to control what appears in the user's status
RPC.update(
status_display_type=StatusDisplayType.STATE,
state="Building something awesome",
details="Using pypresence"
)
while True:
time.sleep(15)
Available activity types: PLAYING (default), LISTENING, WATCHING, COMPETING
Available status display types: NAME (default - shows app name), STATE, DETAILS
๐ง Making Your Presence Interactive with URLs ๐ง
You can make text and images clickable by using URL parameters. When users click on these elements, Discord will open the specified URL:
from pypresence import Presence
import time
client_id = "ID HERE"
RPC = Presence(client_id)
RPC.connect()
# Make state and details clickable
RPC.update(
state="Playing an Awesome Game",
state_url="https://example.com/game",
details="In the Main Menu",
details_url="https://example.com/game/menu"
)
# Make images clickable
RPC.update(
large_image="game_logo",
large_text="My Game",
large_url="https://example.com/game",
small_image="status_online",
small_text="Online",
small_url="https://example.com/status"
)
while True:
time.sleep(15)
Available URL parameters: state_url, details_url, large_url, small_url
๐ Examples ๐
Here is a list of examples using pypresence:
๐ Basic Rich Presence
import time
from pypresence import Presence
client_id = "717091213148160041" # Fake ID, put your real one here
RPC = Presence(client_id) # Initialize the client class
RPC.connect() # Start the handshake loop
print(
RPC.update(
state="Here it is!",
details="A working presence, from python!",
name="Rich Presence Example",
)
) # Set the presence
while True: # The presence will stay on as long as the program is running
time.sleep(15) # Can only update rich presence every 15 seconds
๐ฅ Rich Presence to show CPU usage
import time
import psutil
from pypresence import Presence
client_id = "64567352374564" # Fake ID, put your real one here
RPC = Presence(client_id, pipe=0) # Initialize the client class
RPC.connect() # Start the handshake loop
while True: # The presence will stay on as long as the program is running
cpu_per = round(psutil.cpu_percent(), 1) # Get CPU Usage
mem = psutil.virtual_memory()
mem_per = round(psutil.virtual_memory().percent, 1)
print(
RPC.update(
details="RAM: " + str(mem_per) + "%", state="CPU: " + str(cpu_per) + "%"
)
) # Set the presence
time.sleep(15) # Can only update rich presence every 15 seconds
๐ธ Rich Presence to loop through quotes
import random
import time
from pypresence import Presence
client_id = "64567352374564" # Put your Client ID here, this is a fake ID
RPC = Presence(client_id) # Initialize the Presence class
RPC.connect() # Start the handshake loop
quotes = [
"If you can dream it, you can achieve it.",
"Either write something worth reading or do something worth writing.",
"You become what you believe.",
"Fall seven times and stand up eight.",
"The best revenge is massive success.",
"Eighty percent of success is showing up.",
"Life is what happens to you while youโre busy making other plans.",
"Strive not to be a success, but rather to be of value.",
"The best time to plant a tree was 20 years ago. The second best time is now.",
"Everything youโve ever wanted is on the other side of fear.",
] # The quotes to choose from
while True: # The presence will stay on as long as the program is running
RPC.update(
details="Famous Quote:", state=random.choice(quotes)
) # Set the presence, picking a random quote
time.sleep(60) # Wait a wee bit
Furthermore, the following is a list of repositories which use pypresence
๐ DOCUMENTATION ๐
๐ Presence()
class Presence(client_id, pipe=0, loop=None, handler=None)
Creates the Presence client ready for usage. your whole presence journey starts here bestie โจ
Parameters
client_id(str) โ OAuth2 App ID (found here:https://discord.com/developers/applications/me)pipe(int) โ Pipe that should be used to connect to the Discord client. Defaults to0, can be0-9loop(asyncio.BaseEventLoop) โ Your own event loop (if you have one) that PyPresence should use. One will be created if not supplied. Information athttps://docs.python.org/3/library/asyncio-eventloop.htmlhandler(function) โ The exception handler pypresence should send asynchronous errors to. This can be a coroutine or standard function as long as it takes two arguments (exception,future). Exception will be the exception to handle and future will be an instance ofasyncio.Future
๐ฆ connect()
Initializes the connection - must be done in order to make any updates to Rich Presence. no connection, no presence. them's the rules ๐
Return type pypresence.Response
๐ clear(pid=os.getpid())
Clears the presence. poof. gone. ๐
Parameters pid (int) โ the process id of your game
Return type pypresence.Response
๐ close()
Closes the connection.
Return type pypresence.Response
โญ update(**options)
Sets the user's presence on Discord. this is the main character function fr fr ๐
Parameters
pid(int) โ the process id of your gameactivity_type(ActivityType) โ the type of activity (PLAYING,LISTENING,WATCHING, orCOMPETING). See ActivityType Enum for more details. Defaults toPLAYINGif not specified.status_display_type(StatusDisplayType) โ which field to display in the status (NAME,STATE, orDETAILS). See StatusDisplayType Enum for more details. Defaults toNAMEif not specified.state(str) โ the user's current statusstate_url(str) โ URL to make the state text clickable (opens when state is clicked)details(str) โ what the player is currently doingdetails_url(str) โ URL to make the details text clickable (opens when details is clicked)name(str) โ this one's unhinged in the best way: it directly sets what Discord shows in places like the user list ๐start(int) โ epoch time for when the game started (in milliseconds โฑ๏ธ)end(int) โ epoch time for when the game ends (also milliseconds, bestie)large_image(str) โ the name of the uploaded image for the large profile artwork ๐ผ๏ธlarge_text(str) โ the tooltip that shows on the large imagelarge_url(str) โ a URL that makes the large image clickable (it opens when someone clicks the large image ๐)small_image(str) โ name of the uploaded image for the small profile artwork โจsmall_text(str) โ tooltip for the small imagesmall_url(str) โ a URL to make the small image clickable (opens when the small image gets clicked)party_id(str) โ id of the player's party, lobby, or group ๐party_size(list) โ current size of the player's party, lobby, or group, plus the max, in this format:[1,4]join(str) โ unique hashed string for chat invitations and ask to joinspectate(str) โ unique hashed string for the spectate button ๐match(str) โ unique hashed string for spectate and joinbuttons(list) โ list of dicts for buttons on your profile, formatted like[{"label": "My Website", "url": "https://qtqt.cf"}, ...]โ you can list up to two buttons ๐ซถinstance(bool) โ marks the match as a game session with a specific beginning and end
Return type: pypresence.Response
๐ฎ ActivityType Enum
The ActivityType enum is literally the vibe check for what kind of activity is being shown. Import it from pypresence.types, no cap.
Available values:
ActivityType.PLAYING(0) โ shows "Playing {game name}" (this is the default ๐)ActivityType.LISTENING(2) โ shows "Listening to {name}" ๐งActivityType.WATCHING(3) โ shows "Watching {name}" ๐ฟActivityType.COMPETING(5) โ shows "Competing in {name}" ๐
Example usage:
from pypresence import Presence
from pypresence.types import ActivityType
RPC = Presence(client_id)
RPC.connect()
RPC.update(
activity_type=ActivityType.LISTENING,
details="My Favorite Song",
state="By My Favorite Artist"
)
Note: Discord only supports activity types0,2,3, and5. Types1(STREAMING) and4(CUSTOM) are not available via Rich Presence. So don't come for them, they're just not invited ๐ญ
๐ชฉ StatusDisplayType Enum
The StatusDisplayType enum controls which field from your presence gets displayed in the user's status. Imported from pypresence.types, same as the last one.
Available values:
StatusDisplayType.NAME(0) โ displays the application name (the default โจ)StatusDisplayType.STATE(1) โ displays thestatefieldStatusDisplayType.DETAILS(2) โ displays thedetailsfield
Example usage:
from pypresence import Presence
from pypresence.types import StatusDisplayType
RPC = Presence(client_id)
RPC.connect()
RPC.update(
status_display_type=StatusDisplayType.STATE,
state="Custom Status Message",
details="What I'm doing"
)
This lets you control what shows up in the user's Discord status bar while keeping all the info in the full Rich Presence display. Main character energy for your status line ๐
๐ Clickable URLs
The URL parameters (state_url, details_url, large_url, small_url) make text and images in your Rich Presence clickable. When a user clicks the associated element, Discord opens the URL you specified. It's giving interactive โจ
Available URL parameters:
state_urlโ makes the state text clickabledetails_urlโ makes the details text clickablelarge_urlโ makes the large image clickablesmall_urlโ makes the small image clickable
Example: clickable state and details:
from pypresence import Presence
RPC = Presence(client_id)
RPC.connect()
RPC.update(
state="Playing an Awesome Game",
state_url="https://example.com/game",
details="In the Main Menu",
details_url="https://example.com/game/menu"
)
Example: clickable images:
RPC.update(
large_image="game_logo",
large_text="My Game",
large_url="https://example.com/game",
small_image="status_icon",
small_text="Online",
small_url="https://example.com/status"
)
Example: combining URLs with buttons:
RPC.update(
state="Building Something Cool",
state_url="https://github.com/username",
details="pypresence with URL support",
details_url="https://github.com/qwertyquerty/pypresence",
large_image="project_logo",
large_url="https://project-website.com",
buttons=[
{"label": "View Project", "url": "https://github.com/username/project"},
{"label": "Documentation", "url": "https://docs.project.com"}
]
)
Notes, bestie, read these:
- URLs work independently โ you can set a URL even without the corresponding text/image field ๐
- URLs must be valid HTTP/HTTPS URLs
- Clicking the element opens the URL in the user's default browser ๐
- This feature enhances interactivity beyond the traditional button limit (max 2 buttons) ๐ฅ
๐ Client()
class Client(client_id, pipe=0, loop=None, handler=None)
Creates the RPC client, ready for usage. Iconic constructor behaviour, honestly.
Parameters
client_id(str) โ OAuth2 App ID (found athttps://discord.com/developers/applications/me)pipe(int) โ the pipe that should be used to connect to the Discord client. Defaults to0, can be0-9loop(asyncio.BaseEventLoop) โ your own event loop (if you have one) that PyPresence should use. One will be created if you don't supply one. Info athttps://docs.python.org/3/library/asyncio-eventloop.htmlhandler(function) โ the exception handler pypresence should send asynchronous errors to. This can be a coroutine or a standard function, as long as it takes two arguments (exception,future).exceptionwill be the exception to handle, andfuturewill be an instance ofasyncio.Future
start()
Initializes the connection โ you must do this in order to run RPC commands. Non-negotiable ๐ซก
Return type: pypresence.Response
close()
Closes the connection. Bye bestie ๐
authorize(client_id, scopes, rpc_token=None, username=None)
Used to authenticate a new client with your app. By default this pops up a modal in-app that asks the user to authorize access to your app.
Parameters
client_id(str) โ OAuth2 application idscopes(list) โ a list of OAuth scopes as stringsrpc_token(str) โ one-time use RPC tokenusername(str) โ username to create a guest account with if the user does not have Discord
Return type: pypresence.Response
All the different scopes can be found here: https://discord.com/developers/docs/topics/oauth2
authenticate(token)
Used to authenticate an existing client with your app.
Parameters
token(int) โ OAuth2 access token
Return type: pypresence.Response
get_guilds()
Used to get a list of guilds the client is in.
Return type: pypresence.Response
get_channels()
Used to get a guild's channels the client is in.
Return type: pypresence.Response
channel_id()
Used to get a channel the client is in.
Parameters
channel_id(str) โ id of the channel to get
Return type: pypresence.Response
set_user_voice_settings(user_id, **options)
Used to get a channel the client is in. (Yes, that's what it says โ we're keeping it exactly as written, don't @ me ๐ญ)
Parameters
user_id(str) โ user idpan_left(float) โ left pan of the userpan_right(float) โ right pan of the uservolume(int) โ the volume of user (defaults to100, min0, max200) ๐mute(bool) โ the mute state of the user
Return type: pypresence.Response
select_voice_channel(channel_id)
Used to join and leave voice channels, group dms, or dms.
Parameters
channel_id(str) โ channel id to join (orNoneto leave)
Return type: pypresence.Response
get_selected_voice_channel()
Used to get the client's current voice channel.
Return type: pypresence.Response
select_text_channel(channel_id)
Used to join and leave text channels, group dms, or dms.
Parameters
channel_id(str) โ channel id to join (orNoneto leave)
Return type: pypresence.Response
set_activity(**options)
Used to set the activity shown on Discord profiles and the status of users. Takes the following as parameters.
Parameters
pid(int) โ the process id of your gameactivity_type(ActivityType) โ the type of activity (PLAYING,LISTENING,WATCHING, orCOMPETING). See ActivityType Enum <#activity-types> for more details. Defaults toPLAYINGif not specified.status_display_type(StatusDisplayType) โ which field to display in the status (NAME,STATE, orDETAILS). See StatusDisplayType Enum <#status-display-types> for more details. Defaults toNAMEif not specified.state(str) โ the user's current statusstate_url(str) โ the URL that makes your state text clickable, so it actually opens something when someone taps it ๐ฑ๏ธdetails(str) โ what the player is doing right this seconddetails_url(str) โ the URL that makes the details text clickable ๐name(str) โ lets you directly set what Discord shows in places like the user liststart(int) โ epoch time for when the game started (in milliseconds!)end(int) โ epoch time for when the game ends (also milliseconds, don't forget ๐ญ)large_image(str) โ name of the uploaded image for the big profile artworklarge_text(str) โ tooltip for that large imagelarge_url(str) โ URL to make the large image clickablesmall_image(str) โ name of the uploaded image for the little corner artwork ๐small_text(str) โ the "tootltip" for the small image (that spelling is straight from the source, bestie, I don't make the rules ๐)small_url(str) โ URL to make the small image clickableparty_id(str) โ id of the player's party, lobby, or groupparty_size(list) โ current size of the player's party, lobby, or group plus the max, formatted like[1,4]join(str) โ unique hashed string for chat invitations and Ask to Joinspectate(str) โ unique hashed string for the spectate buttonmatch(str) โ unique hashed string for spectate and joinbuttons(list) โ list of dicts for the buttons on your profile, formatted like[{"label": "My Website", "url": "https://qtqt.cf"}, ...]โ you can list up to two buttons โจinstance(bool) โ marks the match as a game session with a specific beginning and an end
Return type: pypresence.Response
๐
clear_activity(pid=os.getpid())
Clears the activity. Poof, gone, the presence is so over.
Parameters:
pid(int) โ the process id of your game
Return type: pypresence.Response
๐ฆ subscribe(event, args={})
This is how you subscribe to events, iykyk.
Parameters:
event(str) โ the event name you're subscribing toargs(dict) โ any args that go along with the event
Return type: pypresence.Response
๐ธ unsubscribe(event, args={})
The opposite energy: unsubscribe from events.
Parameters:
event(str) โ the event name you're unsubscribing fromargs(dict) โ any args that go along with the event
Return type: pypresence.Response
๐ง get_voice_settings()
Grabs the user's voice settings. Nosy but make it useful.
Return type: pypresence.Response
๐๏ธ set_voice_settings(**options)
Sets the user's voice settings. So many knobs, so little time.
Parameters:
_input(dict) โ input settingsoutput(dict) โ output settingsmode(dict) โ voice mode settingsautomatic_gain_control(bool) โ state of automatic gain controlecho_cancellation(bool) โ state of echo cancellationnoise_suppression(bool) โ state of noise suppressionqos(bool) โ state of voice quality of servicesilence_warning(bool) โ state of the silence warning noticedeaf(bool) โ state of self-deafenmute(bool) โ state of self-mute
Return type: pypresence.Response
โจ๏ธ capture_shortcut(action)
Used to capture a keyboard shortcut that the user enters. Very main character.
Parameters:
action(string) โ the capture action, either'START'or'STOP'
Return type: pypresence.Response
๐ซถ send_activity_join_invite(user_id)
Used to accept an Ask to Join request. Say yes, bestie.
Parameters:
user_id(str) โ user id
Return type: pypresence.Response
๐ close_activity_request(user_id)
Used to reject an Ask to Join request. Gotta respect the no.
Parameters:
user_id(str) โ user id
Return type: pypresence.Response
๐ฅ register_event(event, func, args={})
Hooks an event to a function โ that function gets called whenever Discord sends that event. It will auto subscribe to the event for you, no cap.
Parameters:
event(str) โ the event to hookfunc(function) โ the function to pair with the eventargs(dict) โ optional args used in subscription
Return type: pypresence.Response
๐ unregister_event(event, args={})
Unhooks an event from a function. It'll auto unsubscribe from that event too, so you don't have to lift a finger.
Parameters:
event(str) โ the event to unhookargs(dict) โ optional args used in unsubscription
Return type: pypresence.Response
๐ AUTHOR ๐
qwertyquerty, LewdNeko โ the icons who built this whole thing ๐
๐ COPYRIGHT ๐
2025, qwertyquerty
And that's the whole page, bestie โ version 4.6, dated Jul 11, 2026, filed under PYPRESENCE(1). Now go make your Discord presence absolutely iconic โจ๐
๐ฆ
๐ฆ where this page comes from
- arch rolling: python-pypresence 4.6.2-1 ยท MIT
- ๐ girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms