NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #3652 most downloaded on PyPI
Python Reddit API Wrapper.
Last release 1 months ago
12 Aug 2026
Release timing varies
gaps range from 2 weeks to 1.6 years
Most releases are documented
notes for 43 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
14 years old
135 releases · first in 2012
:meth: .Reddit.post rewinds seekable file objects before retrying a request after a rate limit response. Previously the retry read from the exhausted
Fixed
.Reddit.post rewinds seekable file objects before retrying a request after aReword property docstrings and clarify in the 8.0.0 change log that arguments deprecated for positional use in v7 are now keyword-only. Maintenance an…
Changed
One column per quarter.
Declare __all__ in praw and praw.models so that, now that PRAW ships a py.typed marker, type checkers recognize documented imports such as from praw i
Fixed
__all__ in praw and praw.models so that, now that PRAW ships apy.typed marker, type checkers recognize documented imports such as from praw import Reddit and from praw.models import Redditor as public re-exports insteadAdd a :ref: migration guide <praw8_migration> covering all breaking changes in PRAW 8.
Added
selftext when submitting link, image,migration guide <praw8_migration> covering all breaking changes in PRAW.Media and its subclasses :class:.EmojiMedia, :class:.PostMedia,.StylesheetAsset, :class:.StylesheetImage, and :class:.WidgetMedia tobytes content along with a name, so media no longer has to be written to disk.Announcement and :class:.AnnouncementHelper, exposed as.Reddit.announcements, for listing, hiding, and marking the currently.Announcement.hide,.Announcement.mark_read, :meth:.AnnouncementHelper.hide,.AnnouncementHelper.mark_read, and :meth:.AnnouncementHelper.mark_all_read..Announcement.sent_datetime and :attr:.Announcement.read_datetime return thesent_at and read_at timestamps as timezone-awaredatetime.datetime objects (read_datetime is None for unread.Redditor.overview to iterate over a Redditor's combined comments andexception_handler keyword argument to :func:.stream_generator (and thus allstream methods) that is invoked with any exception raised while fetching items,~.Comment.created_datetime to objects with a creation time (for example.Comment, :class:.Submission, :class:.Redditor, :class:.Subreddit,.Collection, and :class:.ModNote), returning a timezone-awaredatetime.datetime.~.Collection.updated_datetime to :class:.Collection,~.PollData.voting_end_datetime to :class:.PollData, and~.Comment.edited_datetime to :class:.Comment and :class:.SubmissionNone when the object has not been edited), all returning timezone-awaredatetime.datetime objects.praw.ini in the current working directory sets the oauth_url orreddit_url endpoint, as such a file can redirect credentials to an untrusted host.PRAW_ALLOW_ENDPOINT_OVERRIDEpy.typed marker (:PEP:561) so that downstream projects can type check againstChanged
Bumped prawcore to 3.0.2.
Drop support for Python 3.8, which was end-of-life on 2024-10-07.
Drop support for Python 3.9, which was end-of-life on 2025-10-31.
Change Reddit.user.me to raise :class:.ReadOnlyException when called in
:attr:.read_only mode.
The subreddit attribute of :class:.Redditor is a :class:.UserSubreddit
instance.
The data argument to Objector.objectify must now be passed by keyword.
The mark_read argument to subreddit.modmail (:class:.ModmailConversation)
must now be passed by keyword.
The flair_type argument to :class:.SubredditFlairTemplates must be passed by
keyword.
The selftext and url arguments to :meth:.Subreddit.submit are no longer
mutually exclusive. When url is provided selftext will be used as optional
body text to accompany the link submission. An exception is raised when trying to use
inline_media with selftext for a url submission because Reddit does not
support inline media in body text for link submissions.
Subreddit.submit_video, Subreddit.submit_gallery, and
Subreddit.submit_image now accept an optional Markdown-formatted selftext
parameter.
The reason_id argument to :class:.RemovalReason has been renamed to id.
Media upload methods now accept :class:.Media instances instead of file paths:
image_path argument to :meth:.SubredditEmoji.add has been replaced bymedia, which takes an :class:.EmojiMedia instance.image_path arguments to the :class:.SubredditStylesheet upload_*media, which must be passed positionally..SubredditStylesheet.upload, :meth:.upload_header,.upload_mobile_header, and :meth:.upload_mobile_icon take a.StylesheetImage instance, while :meth:.upload_banner,.upload_banner_additional_image, :meth:.upload_banner_hover_image, and.upload_mobile_banner take a :class:.StylesheetAsset instance.file_path argument to :meth:.SubredditWidgetsModeration.upload_image hasmedia, which takes a :class:.WidgetMedia instance and must bepath argument to :class:.InlineMedia (:class:.InlineGif,.InlineImage, and :class:.InlineVideo) has been replaced by media,.PostMedia instance.An unknown media type now raises :class:.ClientException when uploading media,
instead of falling back to JPEG.
Media uploads to Reddit's S3 buckets now respect the configured timeout and raise
prawcore.RequestException on transport errors, consistent with all other requests,
instead of having no timeout and raising raw requests exceptions.
Subreddit.submit_gallery, Subreddit.submit_image, Subreddit.submit_poll,
and Subreddit.submit_video have been merged into :meth:.Subreddit.submit. The
kind of submission is selected with the gallery, image, poll, url, or
video keyword argument. At least one of those, or selftext, must be provided,
and they are mutually exclusive, while selftext may accompany any of them as
optional Markdown-formatted body text. image takes a :class:.PostMedia instance;
gallery takes a list of :class:.PostMedia instances or dict\ s with a
media key; video takes a :class:.PostMedia instance or a dict with a
media key and optional gif and thumbnail keys; and poll takes a
dict with duration and options keys. selftext is no longer required
for poll submissions.
Require prawcore >=3.2, <4 for its public :class:!Session and authorizer
accessors and the widened :meth:!Session.request annotations, which let PRAW drop a
number of internal cast\ s and type-checker suppressions.
Constrain the websocket-client dependency to <2 to avoid silently adopting a
future, potentially breaking, major release.
Require update_checker >=1.0, <2.0 and call update_check with keyword
arguments. The 1.0 release is dependency-free.
:meth:.Submission.add_fetch_param now raises :class:.ClientException when called
on a submission that has already been fetched, rather than logging a warning, since
the added parameters would have no effect.
The comment_sort and comment_limit attributes of a :class:.Submission must
now be set before the submission is fetched; setting either after the submission has
been fetched raises :class:.ClientException instead of logging a warning.
Require prawcore >=4, <5.
Split praw/models/reddit/subreddit.py into a praw.models.reddit.subreddit
package, with :class:.Subreddit and each of its helper classes (:class:.Modmail,
:class:.SubredditFilters, :class:.SubredditFlair, :class:.SubredditModeration,
:class:.SubredditQuarantine, :class:.SubredditRelationship,
:class:.SubredditStream, :class:.SubredditStylesheet, :class:.SubredditWiki, and
their related classes) moved to dedicated modules. All classes remain importable from
praw.models.reddit.subreddit and praw.models for backwards compatibility. See
the :ref:migration guide <praw8_migration> for the full mapping.
Fixed
.Submission.hide and :meth:.Submission.unhide.TypeError when objectifying a response whose json.errors field is nullapi/hide).Removed
Reddit.random_subreddit, Subreddit.random, andSubreddit.random_rising.APIException class.Comment.award and Submission.award methods.Comment.gild, Redditor.gild, and Submission.gild methods.Redditor.gilded and Subreddit.gilded methods.Redditor.gildings method.Subreddit.mod.inbox, Subreddit.mod.unread, andSubreddit.mod.stream.unread methods.Subreddits.search_by_topic method.Subreddits.gold method..Reddit keyword argument token_manager and all associated tokenReddit.validate_on_submit configuration attribute.WebSocketException.original_exception method.after argument for :meth:.conversations.reset_timestamp from :meth:.limits.SubredditMessage.mute and SubredditMessage.unmute methods.InboxableMixin.unblock_subreddit method.warn_additional_fetch_params configuration option, which is obsolete now that.ClientException.warn_comment_sort configuration option, which is obsolete now that settingcomment_sort or comment_limit after the comments have been fetched raises.ClientException.Added
Add support for Python 3.13.
Add support for Python 3.14.
Add support for optional Markdown-formatted selftext when submitting link, image, gallery, and video posts.
Add a migration guide covering all breaking changes in PRAW 8.
Add .Media and its subclasses .EmojiMedia, .PostMedia, .StylesheetAsset, .StylesheetImage, and .WidgetMedia to consolidate media uploads. Media can be constructed from a file path, or from bytes content along with a name, so media no longer has to be written to disk before uploading.
.Announcement and .AnnouncementHelper, exposed as .Reddit.announcements, for listing, hiding, and marking the currently authenticated user's announcements as read. Provides .Announcement.hide, .Announcement.mark_read, .AnnouncementHelper.hide, .AnnouncementHelper.mark_read, and .AnnouncementHelper.mark_all_read. .Announcement.sent_datetime and .Announcement.read_datetime return the announcement's sent_at and read_at timestamps as timezone-aware datetime.datetime objects (read_datetime is None for unread announcements).
.Redditor.overview to iterate over a Redditor's combined comments and submissions, mirroring the user overview page on Reddit. It returns the same listing as calling a sort method directly on a .Redditor, so redditor.overview.new() and redditor.new() yield the same items; use redditor.comments or redditor.submissions to restrict the listing to a single type.
An exception_handler keyword argument to .stream_generator (and thus all stream methods) that is invoked with any exception raised while fetching items, allowing the stream to resume rather than terminate. Re-raise from the handler to stop the stream.
~.Comment.created_datetime to objects with a creation time (for example .Comment, .Submission, .Redditor, .Subreddit, .Collection, and .ModNote), returning a timezone-aware datetime.datetime.
~.Collection.updated_datetime to .Collection, ~.PollData.voting_end_datetime to .PollData, and ~.Comment.edited_datetime to .Comment and .Submission (None when the object has not been edited), all returning timezone-aware datetime.datetime objects.
Warn when a praw.ini in the current working directory sets the oauth_url or reddit_url endpoint, as such a file can redirect credentials to an untrusted host. The warning can be silenced by setting the PRAW_ALLOW_ENDPOINT_OVERRIDE environment variable.
A py.typed marker (PEP 561) so that downstream projects can type check against PRAW's inline annotations.
Changed
Arguments deprecated for positional use in PRAW 7 are now keyword-only across most methods, fulfilling the deprecation announced in 7.6.0. Notably, the time_filter argument to listing methods such as .Subreddit.top and .Subreddit.controversial — shown positionally in older documentation (for example subreddit.top("all")) — must now be passed by keyword (subreddit.top(time_filter="all")).
Bumped prawcore to 3.0.2.
Drop support for Python 3.8, which was end-of-life on 2024-10-07.
Drop support for Python 3.9, which was end-of-life on 2025-10-31.
Change Reddit.user.me to raise .ReadOnlyException when called in .read_only mode.
The subreddit attribute of .Redditor is a .UserSubreddit instance.
The data argument to Objector.objectify must now be passed by keyword.
The mark_read argument to subreddit.modmail (.ModmailConversation) must now be passed by keyword.
The flair_type argument to .SubredditFlairTemplates must be passed by keyword.
The selftext and url arguments to .Subreddit.submit are no longer mutually exclusive. When url is provided selftext will be used as optional body text to accompany the link submission. An exception is raised when trying to use inline_media with selftext for a url submission because Reddit does not support inline media in body text for link submissions.
Subreddit.submit_video, Subreddit.submit_gallery, and Subreddit.submit_image now accept an optional Markdown-formatted selftext parameter.
The reason_id argument to .RemovalReason has been renamed to id.
Media upload methods now accept .Media instances instead of file paths:
The image_path argument to .SubredditEmoji.add has been replaced by media, which takes an .EmojiMedia instance.
The image_path arguments to the .SubredditStylesheet upload_* methods have been replaced by media, which must be passed positionally. .SubredditStylesheet.upload, .upload_header, .upload_mobile_header, and .upload_mobile_icon take a .StylesheetImage instance, while .upload_banner, .upload_banner_additional_image, .upload_banner_hover_image, and .upload_mobile_banner take a .StylesheetAsset instance.
The file_path argument to .SubredditWidgetsModeration.upload_image has been replaced by media, which takes a .WidgetMedia instance and must be passed positionally.
The path argument to .InlineMedia (.InlineGif, .InlineImage, and .InlineVideo) has been replaced by media, which takes a .PostMedia instance.
An unknown media type now raises .ClientException when uploading media, instead of falling back to JPEG.
Media uploads to Reddit's S3 buckets now respect the configured timeout and raise prawcore.RequestException on transport errors, consistent with all other requests, instead of having no timeout and raising raw requests exceptions.
Subreddit.submit_gallery, Subreddit.submit_image, Subreddit.submit_poll, and Subreddit.submit_video have been merged into .Subreddit.submit. The kind of submission is selected with the gallery, image, poll, url, or video keyword argument. At least one of those, or selftext, must be provided, and they are mutually exclusive, while selftext may accompany any of them as optional Markdown-formatted body text. image takes a .PostMedia instance; gallery takes a list of .PostMedia instances or dicts with a media key; video takes a .PostMedia instance or a dict with a media key and optional gif and thumbnail keys; and poll takes a dict with duration and options keys. selftext is no longer required for poll submissions.
Require prawcore >=3.2, <4 for its public !Session and authorizer accessors and the widened !Session.request annotations, which let PRAW drop a number of internal casts and type-checker suppressions.
Constrain the websocket-client dependency to <2 to avoid silently adopting a future, potentially breaking, major release.
Require update_checker >=1.0, <2.0 and call update_check with keyword arguments. The 1.0 release is dependency-free.
.Submission.add_fetch_param now raises .ClientException when called on a submission that has already been fetched, rather than logging a warning, since the added parameters would have no effect.
The comment_sort and comment_limit attributes of a .Submission must now be set before the submission is fetched; setting either after the submission has been fetched raises .ClientException instead of logging a warning.
Require prawcore >=4, <5.
Split praw/models/reddit/subreddit.py into a praw.models.reddit.subreddit package, with .Subreddit and each of its helper classes (.Modmail, .SubredditFilters, .SubredditFlair, .SubredditModeration, .SubredditQuarantine, .SubredditRelationship, .SubredditStream, .SubredditStylesheet, .SubredditWiki, and their related classes) moved to dedicated modules. All classes remain importable from praw.models.reddit.subreddit and praw.models for backwards compatibility. See the migration guide for the full mapping.
Fixed
Fix API endpoint for .Submission.hide and .Submission.unhide.
Fix TypeError when objectifying a response whose json.errors field is null rather than an empty list (e.g. api/hide).
Removed
Remove Reddit.random_subreddit, Subreddit.random, and Subreddit.random_rising.
Remove APIException class.
Remove Comment.award and Submission.award methods.
Remove Comment.gild, Redditor.gild, and Submission.gild methods.
Remove Redditor.gilded and Subreddit.gilded methods.
Remove Redditor.gildings method.
Remove Subreddit.mod.inbox, Subreddit.mod.unread, and Subreddit.mod.stream.unread methods.
Remove Subreddits.search_by_topic method.
Remove Subreddits.gold method.
Remove .Reddit keyword argument token_manager and all associated token managers.
Remove Reddit.validate_on_submit configuration attribute.
Remove WebSocketException.original_exception method.
Remove the after argument for .conversations.
Remove key reset_timestamp from .limits.
Remove SubredditMessage.mute and SubredditMessage.unmute methods.
Remove InboxableMixin.unblock_subreddit method.
The warn_additional_fetch_params configuration option, which is obsolete now that adding fetch parameters to an already-fetched submission raises .ClientException.
The warn_comment_sort configuration option, which is obsolete now that setting comment_sort or comment_limit after the comments have been fetched raises .ClientException.
Subreddit.submit_gallery , Subreddit.submit_image , Subreddit.submit_poll , and Subreddit.submit_video have been merged into :meth: .Subreddit.submit
Changed
Subreddit.submit_gallery, Subreddit.submit_image, Subreddit.submit_poll,Subreddit.submit_video have been merged into :meth:.Subreddit.submit. Thegallery, image, poll, url, orvideo keyword argument. At least one of those, or selftext, must be provided,selftext may accompany any of them asimage takes a :class:.PostMedia instance;gallery takes a list of :class:.PostMedia instances or dict\ s with amedia key; video takes a :class:.PostMedia instance or a dict with amedia key and optional gif and thumbnail keys; and poll takes adict with duration and options keys. selftext is no longer requiredAdd a :ref: migration guide <praw8_migration> covering all breaking changes in PRAW 8.
Added
selftext when submitting link, image,migration guide <praw8_migration> covering all breaking changes in PRAW.Media and its subclasses :class:.EmojiMedia, :class:.PostMedia,.StylesheetAsset, :class:.StylesheetImage, and :class:.WidgetMedia tobytes content along with a name, so media no longer has to be written to diskChanged
Bumped prawcore to 3.0.2.
Drop support for Python 3.8, which was end-of-life on 2024-10-07.
Drop support for Python 3.9, which was end-of-life on 2025-10-31.
Change Reddit.user.me to raise :class:.ReadOnlyException when called in
:attr:.read_only mode.
The subreddit attribute of :class:.Redditor is a :class:.UserSubreddit
instance.
The data argument to Objector.objectify must now be passed by keyword.
The mark_read argument to subreddit.modmail (:class:.ModmailConversation)
must now be passed by keyword.
The flair_type argument to :class:.SubredditFlairTemplates must be passed by
keyword.
The selftext and url arguments to :meth:.Subreddit.submit are no longer
mutually exclusive. When url is provided selftext will be used as optional
body text to accompany the link submission. An exception is raised when trying to use
inline_media with selftext for a url submission because Reddit does not
support inline media in body text for link submissions.
:meth:.Subreddit.submit_video, :meth:.Subreddit.submit_gallery, and
:meth:.Subreddit.submit_image now accept an optional Markdown-formatted selftext
parameter.
The reason_id argument to :class:.RemovalReason has been renamed to id.
Media upload methods now accept :class:.Media instances instead of file paths:
image_path argument to :meth:.SubredditEmoji.add has been replaced byemoji_media, which takes an :class:.EmojiMedia instance.image_path arguments to :meth:.SubredditStylesheet.upload,.upload_header, :meth:.upload_mobile_header, and.upload_mobile_icon have been replaced by image_media, which takes a.StylesheetImage instance.image_path arguments to :meth:.SubredditStylesheet.upload_banner,.upload_banner_additional_image, :meth:.upload_banner_hover_image, and.upload_mobile_banner have been replaced by image_media, which takes a.StylesheetAsset instance.image_media arguments to the :class:.SubredditStylesheet upload_*.SubredditStylesheet.upload, must be passedfile_path argument to :meth:.SubredditWidgetsModeration.upload_image hasimage_media, which takes a :class:.WidgetMedia instance andimage_path argument to :meth:.Subreddit.submit_image has been replaced byimage_media, which takes a :class:.PostMedia instance. All arguments,title, must now be passed by keyword.video_path and thumbnail_path arguments to.Subreddit.submit_video have been replaced by video_media andthumbnail_media, which take :class:.PostMedia instances. All arguments,title, must now be passed by keyword.image_path key in the images dictionaries passed to.Subreddit.submit_gallery has been replaced by image_media, which takes.PostMedia instance. All arguments, including title and images,path argument to :class:.InlineMedia (:class:.InlineGif,.InlineImage, and :class:.InlineVideo) has been replaced by media,.PostMedia instance.An unknown media type now raises :class:.ClientException when uploading media,
instead of falling back to JPEG.
Media uploads to Reddit's S3 buckets now respect the configured timeout and raise
prawcore.RequestException on transport errors, consistent with all other requests,
instead of having no timeout and raising raw requests exceptions.
Fixed
.Submission.hide and :meth:.Submission.unhide.Removed
Reddit.random_subreddit, Subreddit.random, andSubreddit.random_rising.APIException class.Comment.award and Submission.award methods.Comment.gild, Redditor.gild, and Submission.gild methods.Redditor.gilded and Subreddit.gilded methods.Redditor.gildings method.Subreddit.mod.inbox, Subreddit.mod.unread, andSubreddit.mod.stream.unread methods.Subreddits.search_by_topic method.Subreddits.gold method..Reddit keyword argument token_manager and all associated tokenReddit.validate_on_submit configuration attribute.WebSocketException.original_exception method.after argument for :meth:.conversations.reset_timestamp from :meth:.limits.SubredditMessage.mute and SubredditMessage.unmute methods.InboxableMixin.unblock_subreddit method.Update the Read the Docs configuration to the currently supported schema so documentation builds again.
Fixed
7.8.1 (2024/10/25) Changed Bumped prawcore to 2.4.0.
Changed
:meth: ~.SubredditLinkFlairTemplates.reorder to reorder a subreddit's link flair templates.
Added
~.SubredditLinkFlairTemplates.reorder to reorder a subreddit's link flair~.SubredditRedditorFlairTemplates.reorder to reorder a subreddit's redditor.stream_generator now accepts the continue_after_id parameter, which.Reddit has a new configurable parameter, window_size. This tells PRAWFixed
Changed
An issue with replying to a modmail conversation results in a error.
Fixed
.delete_mobile_banner to delete mobile banners.
Added
.delete_mobile_banner to delete mobile banners.
.upload_mobile_banner to upload mobile banners.
Experimental ~.Submission._edit_experimental for adding new inline media or editing a submission that has inline media.
!DANGER!
This method is experimental. It is reliant on undocumented API endpoints and may result in existing inline media not displaying correctly and/or creating a malformed body. Use at your own risk. This method may be removed in the future without warning.
This method is identical to .Submission.edit except for the following:
The ability to add inline media to existing posts.
Additional preserve_inline_media keyword argument to allow PRAW to attempt to preserve the existing inline media when editing a post. This is an experimental fix for an issue that occurs when editing a post with inline media would cause the media to lose their inline appearance.
Fixed
An issue with iterating .ModNote when a user has more than a hundred notes.
Removal reasons are now returned in the same order as they appear on Reddit.
Revert ~.Comment.edit positional argument deprecation.
Changed
Revert ~.Comment.edit positional argument deprecation.
Revert ~.Comment.reply positional argument deprecation.
Revert ~.Message.reply positional argument deprecation.
Revert ~.Submission.edit positional argument deprecation.
Revert ~.Submission.reply positional argument deprecation.
Fixed
An issue where .ModmailConversation's messages attribute would only contain the latest message.
It will encourage more explicit argument passing, enable arguments to be sorted alphabetically, and prevent breaking changes when adding new arguments…
Added
.pin to manage pinned submissions on the authenticated user's profile.
.update_display_layout to update the display layout of posts in a .Collection.
.SubredditCollectionsModeration.create keyword argument display_layout for specifying a display layout when creating a .Collection.
~.Message.parent to get the parent of a .Message.
.ModNote to represent a moderator note.
.ModNote.delete to delete a single moderator note.
.RedditModNotes to interact with moderator notes from a .Reddit instance. This provides the ability to create and fetch notes for one or more redditors from one or more subreddits.
.RedditorModNotes to interact with moderator notes from a .Redditor instance.
.RedditorModNotes.subreddits to obtain moderator notes from multiple subreddits for a single redditor.
.SubredditModNotes to interact with moderator notes from a .Subreddit instance.
.SubredditModNotes.redditors to obtain moderator notes for multiple redditors from a single subreddit.
~.BaseModNotes.create to create a moderator note.
.Redditor.notes to interact with .RedditorModNotes.
.SubredditModeration.notes to interact with .SubredditModNotes.
~.ModNoteMixin.create_note create a moderator note from a .Comment or .Submission.
~.ModNoteMixin.author_notes to view the moderator notes for the author of a .Comment or .Submission.
Changed
Drop support for Python 3.6, which is end-of-life on 2021-12-23.
.conversations now returns a .ListingGenerator allowing you to page through more than 100 conversations.
Deprecated
The after argument for .conversations will now have to be included in params keyword argument.
Positional keyword arguments for applicable functions and methods. Starting with PRAW 8, most functions and methods will no longer support positional arguments. It will encourage more explicit argument passing, enable arguments to be sorted alphabetically, and prevent breaking changes when adding new arguments to existing methods.
Log a warning if a submission's comment_sort attribute is updated after the submission has already been fetched and a warn_comment_sort config setting
Added
Log a warning if a submission's comment_sort attribute is updated after the submission has already been fetched and a warn_comment_sort config setting to turn off the warning.
.user_selectable to get available subreddit link flairs.
Automatic RateLimit handling will support errors with millisecond resolution.
Fixed
An import error when using PRAW in environments where libsqlite3-dev is needed to utilize the sqlite3 builtin.
Fixed bug where some keyword arguments that are passed to .Draft.submit would not have an effect.
~.WikiPage.discussions to obtain site-wide link submissions that link to the WikiPage.
Added
~.WikiPage.discussions to obtain site-wide link submissions that link to the WikiPage.
.revert to revert a WikiPage to a specified revision.
.Inbox.mark_all_read to mark all messages as read with one API call.
InboxableMixin.unblock_subreddit to unblock a subreddit.
.update_crowd_control_level to update the crowd control level of a post.
.moderator_subreddits, which returns information about the subreddits that the authenticated user moderates, has been restored.
The configuration setting refresh_token has been added back. See https://www.reddit.com/r/redditdev/comments/olk5e6/followup_oauth2_api_changes_regarding_refresh/ for more info.
.Draft to represent a submission draft.
.Draft.delete to delete drafts.
.Draft.submit to submit drafts.
.Draft.update to modify drafts.
.DraftHelper to fetch or create drafts on new Reddit.
.DraftList to represent a list of .Draft objects.
Changed
.Reddit.delete now accepts the params parameter.
Deprecated
.Reddit keyword argument token_manager.
Legacy modmail is slated for deprecation by Reddit in June 2021. See https://www.reddit.com/r/modnews/comments/mar9ha/even_more_modmail_improvements/…
Added
.UserSubreddit for the subreddit attribute of .Redditor.
.username_available checks if a username is available.
.trusted to retrieve a .RedditorList of trusted users.
.trust to add a user to the trusted list.
.distrust to remove a user from the trusted list.
SQLiteTokenManager (may not work on Windows).
Changed
.moderated will now objectify all data returned from the API.
The wiki_edit endpoint has been changed from r/{subreddit}/api/wiki/edit/ to r/{subreddit}/api/wiki/edit.
.Redditor.block no longer needs to retrieve a user's fullname.
Deprecated
The subreddit attribute of .Redditor will no longer function as a dict.
Legacy modmail is slated for deprecation by Reddit in June 2021. See https://www.reddit.com/r/modnews/comments/mar9ha/even_more_modmail_improvements/ for more info.
Fixed
Fixed bug where .WikiPage.edit and .SubredditWiki.create would fail if passed content and reason parameters that produced a request with a body greater than 500 KiB, even when the parameters did not exceed their respective permitted maximum lengths.
Fixed bug where .request could not handle instances of BadRequests when the JSON data contained only the keys "reason" and "message".
Fixed bug where .request could not handle instances of BadRequests when the response did not contain valid JSON data.
Fixed bug where ~.FullnameMixin.fullname sometimes returned the wrong fullname.
The configuration setting refresh_token is deprecated and its use will result in a class:DeprecationWarning. This deprecation applies in all ways of s…
Added
.Reddit keyword argument token_manager.
FileTokenManager and its parent abstract class BaseTokenManager.
Deprecated
The configuration setting refresh_token is deprecated and its use will result in a DeprecationWarning. This deprecation applies in all ways of setting configuration values, i.e., via praw.ini, as a keyword argument when initializing an instance of .Reddit, and via the PRAW_REFRESH_TOKEN environment variable. To be prepared for PRAW 8, use the new .Reddit keyword argument token_manager. See refresh_token in PRAW's documentation for an example.
Reddit.user.me will no longer return None when called in .read_only mode starting in PRAW 8. A DeprecationWarning will be issued. To switch forward to the PRAW 8 behavior set praw8_raise_exception_on_me=True in your .Reddit call.
Asynchronous check will no longer fail in Python 3.6 multithreading edge cases.
Fixed
Asynchronous check will no longer fail in Python 3.6 multithreading edge cases.
Asynchronous check will no longer occur when in a Jupyter notebook.
Changed
Asynchronous check will no longer occur when in a Jupyter notebook.
Asynchronous check would not work on Python 3.6 as func:~asyncio.get_running_loop only exists on Python 3.7+.
Fixed
Asynchronous check would not work on Python 3.6 as ~asyncio.get_running_loop only exists on Python 3.7+.
Add method .Subreddits.premium to reflect the naming change in Reddit's API.
Added
Add method .Subreddits.premium to reflect the naming change in Reddit's API.
Ability to submit image galleries with Subreddit.submit_gallery.
Ability to pass a gallery url to .Reddit.submission.
Ability to specify modmail mute duration.
Add method .invited to get invited moderators of a subreddit.
Ability to submit text/self posts with inline media.
Add method Submission.award and Comment.award with the ability to specify type of award, anonymity, and message when awarding a submission or comment.
Ability to specify subreddits by name using the subreddits parameter in .Reddit.info.
A check to see if PRAW is running in an asynchronous environment and will advise the user to use Async PRAW. This also adds a configuration option to disable the check.
Changed
Drop support for Python 3.5, which is end-of-life on 2020-09-13.
.BoundedSet will now utilize a Last-Recently-Used (LRU) storing mechanism, which will change the order in which elements are removed from the set.
Improved Subreddit.submit_image and Subreddit.submit_video performance in slow network environments by removing a race condition when establishing a websocket connection.
Deprecated
Subreddits.gold is superseded by .Subreddits.premium.
Submission.gild is superseded by Submission.award.
Comment.gild is superseded by Comment.award.
Fixed
An issue where leaving as a moderator fails if you are using token auth.
An issue where an incorrect error was being raised due to invalid submission urls.
Some cases where streams yield the same item multiple times. This cannot be prevented in every case.
WebSocketException.original_exception is deprecated and slated for removal in PRAW 8.0.
Added
.Rule to represent one rule of a subreddit.
.SubredditRules to get and add rules.
Ability to submit polls with Subreddit.submit_poll.
.PollData and .PollOption.
Ability to view poll data and poll options via the .poll_data attribute on poll submissions.
Add method ~.Reddit.delete to .Reddit class to support HTTP DELETE requests.
Added .CalendarConfiguration to represent the configuration of a .Calendar widget.
Added .Hover to represent the hover state of a .Button.
Added .Styles to represent widget styling information.
Ability to stream live thread updates via new class .LiveThreadStream with method ~.LiveThreadStream.updates.
Changed
.RemovalReason.update's parameters are now optional.
.SubredditRemovalReasons.__getitem__ now takes integers and slices to get removal reasons from the list of reasons as returned by Reddit.
Deprecated
WebSocketException.original_exception is deprecated and slated for removal in PRAW 8.0.
Fixed
An issue where certain subreddit settings could not be set through .SubredditModeration.update, such as welcome_message_enabled and welcome_message_text. This change also removes the need for PRAW to track current subreddit settings and send unmodified ones in the update request.
Instances of BadRequests captured by PRAW that do not contain any detailed JSON data are re-raised as the original BadRequest.
Subreddit.submit_image and Subreddit.submit_video will throw .MediaPostFailed when Reddit fails to post an image or video post.
This attribute will be functionally useless once Reddit implements their change. This attribute will be deprecated on the next release after Reddit's…
Added
config_interpolation parameter for .Reddit supporting basic and extended modes.
Add .partial_redditors that returns lightweight redditor objects that contain only a few fields. This is useful for resolving .Redditor IDs to their usernames in bulk.
.User.friends has a new parameter user that takes either an instance of .Redditor or a string containing a redditor name and returns an instance of .Redditor if the authenticated user is friends with the user, otherwise throws an exception.
.SubmissionModeration.flair has the parameter flair_template_id for applying flairs with template IDs.
.Emoji.update supports modifying an emoji's permissions.
.SubredditEmoji.add now supports optionally passing booleans to set an emoji's permissions upon upload.
Methods .SubredditLinkFlairTemplates.update and .SubredditRedditorFlairTemplates.update contain a new parameter, fetch, that toggles the automatic fetching of existing data from Reddit. It is set to True by default.
Values in methods .SubredditLinkFlairTemplates.update and .SubredditRedditorFlairTemplates.update that are left as the defaults will no longer be over-written if the fetch parameter is set to True, but will fill in existing values for the flair template.
The parameter text for methods .SubredditLinkFlairTemplates.update and .SubredditRedditorFlairTemplates.update is no longer required.
There is a new method, ~.Subreddit.post_requirements, to fetch a subreddit's post requirements.
Method .SubmissionModeration.sticky will now ignore the Conflict exception generated by trying to sticky the same post multiple times.
A new method .CommentModeration.show will uncollapse a comment that was collapsed because of Crowd Control
Methods Subreddit.submit_image and Subreddit.submit_video will throw .TooLargeMediaException if the submitted media is rejected by Reddit due to the size of the media.
Class .Reddit has an attribute, validate_on_submit, that can be set after class initialization that causes methods ~.Subreddit.submit, Subreddit.submit_image, Subreddit.submit_video, and .Submission.edit to check that the submission matches a subreddit's post validation rules. This attribute will be functionally useless once Reddit implements their change. This attribute will be deprecated on the next release after Reddit's change, and will be removed on the next major release after Reddit's change.
Warning
In May-June 2020, Reddit will force all submissions to run through a subreddit's validation rules.
Introduced a data class, .RedditErrorItem, to represent an individual error item returned from Reddit.
Class RedditAPIException now serves as a container for the .RedditErrorItems. You can access the items by doing RedditAPIException.items, which returns a list.
APIException is an alias to .RedditAPIException.
Parameter discussion_type to methods ~.Subreddit.submit, Subreddit.submit_image, and Subreddit.submit_video to support submitting as a live discussion (set to "CHAT").
Instances of .Trophy can be compared for equality with each other.
.Reddit has a new configurable parameter, timeout. This defaults to 16 seconds. It controls how long PRAW will wait for a response before throwing an exception.
PRAW now handles ratelimit errors returned as instances of .RedditAPIException.
.Reddit has one new parameter, ratelimit_seconds . The parameter configures the maximum amount of seconds to catch ratelimits for. It defaults to 5 seconds when not specified.
Changed
prawcore.BadRequest should no longer be raised. Instead, a more useful .RedditAPIException instance will be raised.
Set the default comment sort to confidence instead of best because it turns out best isn't actually the correct value for the parameter.
Deprecated
APIException is deprecated and slated for removal in PRAW 8.0.
Fixed
.SubredditFlair.update will not error out when the flair text contains quote marks.
Removed
Converting APIException to string will no longer escape unicode characters.
Module praw.models.modaction no longer exists. Please use the module praw.models.mod_action, or directly import ModAction from praw.models.
Methods .SubredditLinkFlairTemplates.update and .SubredditRedditorFlairTemplates.update will no longer create flairs that are using an invalid template id, but instead throw a .InvalidFlairTemplateID.
Method reddit.user.moderator_subreddits has been removed. Please use .moderated instead.
Removed usages of NoReturn that caused PRAW to fail due to ImportError in Python <3.5.4 and <3.6.2.
Fixed
Removed usages of NoReturn that caused PRAW to fail due to ImportError in Python <3.5.4 and <3.6.2.
The file for ModActions (praw/models/modaction.py) has been moved to praw/models/mod_action.py and the previous has been deprecated.
Added
.set_original_content supports marking a submission as original content.
.unset_original_content supports unmarking a submission as original content.
.moderated to get a list of a redditor's moderated subreddits.
Parameter without_websockets to Subreddit.submit_image and Subreddit.submit_video to submit without using WebSockets.
.Reddit.redditor supports fullname param to fetch a .Redditor by the fullname instead of name. .Redditor constructor now also has fullname param.
Add .RemovalReason and .SubredditRemovalReasons to work with removal reasons
Attribute removal_reasons to .SubredditModeration to interact with new removal reason classes
Parameters mod_note and reason_id to ~.ThingModerationMixin.remove to optionally apply a removal reason on removal
Add .SubredditModerationStream to enable moderation streams
Attribute stream to .SubredditModeration to interact with new moderation streams
Add ~.SubredditModerationStream.edited to allow streaming of .SubredditModeration.edited
Add ~.SubredditModerationStream.log to allow streaming of .SubredditModeration.log
Add ~.SubredditModerationStream.modmail_conversations to allow streaming of .Modmail.conversations
Add ~.SubredditModerationStream.modqueue to allow streaming of .SubredditModeration.modqueue
Add ~.SubredditModerationStream.reports to allow streaming of .SubredditModeration.reports
Add ~.SubredditModerationStream.spam to allow streaming of .SubredditModeration.spam
Add ~.SubredditModerationStream.unmoderated to allow streaming of .SubredditModeration.unmoderated
Add SubredditModerationStream.unread to allow streaming of SubredditModeration.unread
Parameter exclude_before to .stream_generator to allow ~.SubredditModerationStream.modmail_conversations to work
Parameters allowable_content and max_emojis to ~.SubredditRedditorFlairTemplates.add, ~.SubredditLinkFlairTemplates.add, and ~.SubredditFlairTemplates.update, as well as its child classes.
Deprecated
Method reddit.user.moderator_subreddits as .moderated provides more functionality.
The file for ModActions (praw/models/modaction.py) has been moved to praw/models/mod_action.py and the previous has been deprecated.
Expected Changes
The behavior of APIException will no longer unicode-escape strings in the next minor release.
.crosspost support parameter flair_id to flair the submission immediately upon crossposting.
Added
.crosspost support parameter flair_id to flair the submission immediately upon crossposting.
.crosspost support parameter flair_text to set a custom text to the flair immediately upon crossposting.
.crosspost support parameter nsfw to mark the submission NSFW immediately upon crossposting.
.crosspost support parameter spoiler to mark the submission as a spoiler immediately upon crossposting.
Fixed
.add_community_list has parameter description to support unannounced upstream Reddit API changes.
.WidgetModeration.update supports passing a list of .Subreddit objects.
Changed
Removed css_class parameter cannot be used with background_color, text_color, or mod_only constraint on methods:
SubredditFlairTemplates.update()
SubredditRedditorFlairTemplates.add()
SubredditLinkFlairTemplates.add()
Removed
Drop official support for Python 2.7.
Multireddit.rename() no longer works due to a change in the Reddit API.
SubredditListingMixin.gilded(), as this was supposed to be removed in 6.0.0 after deprecation in 5.2.0.
Removed
SubredditListingMixin.gilded(), as this was supposed to be removed in 6.0.0 after deprecation in 5.2.0.
.upload_banner_additional_image
Added
.upload_banner
.upload_banner_additional_image
.upload_banner_hover_image
.delete_banner
.delete_banner_additional_image
.delete_banner_hover_image
~.Subreddit.submit, Subreddit.submit_image, and Subreddit.submit_video support parameter nsfw to mark the submission NSFW immediately upon posting.
~.Subreddit.submit, Subreddit.submit_image, and Subreddit.submit_video support parameter spoiler to mark the submission as a spoiler immediately upon posting.
Subreddit.submit_image and Subreddit.submit_video support parameter timeout. Default timeout has been raised from 2 seconds to 10 seconds.
Added parameter function_kwargs to .stream_generator to pass additional kwargs to function.
Fixed
Subreddit.random returns None instead of raising .ClientException when the subreddit does not support generating random submissions.
Other
Bumped minimum prawcore version to 1.0.1.
.SubredditFlair.set supports parameter flair_template_id for giving a user redesign flair.
Added
.SubredditFlair.set supports parameter flair_template_id for giving a user redesign flair.
Add method .Redditor.trophies to get a list of the Redditor's trophies.
Added
Add method .Redditor.trophies to get a list of the Redditor's trophies.
Add class .PostFlairWidget.
Add attributes reply_limit and reply_sort to class .Comment
Add class .SubredditWidgetsModeration (accessible through .SubredditWidgets.mod) and method .add_text_area.
Add class .WidgetModeration (accessible through the .mod attribute on any widget) with methods ~.WidgetModeration.update and ~.WidgetModeration.delete.
Add method .Reddit.put for HTTP PUT requests.
Add methods .add_calendar and .add_community_list.
Add methods .add_image_widget and .upload_image.
Add method .add_custom_widget.
Add method .add_post_flair_widget.
Add method .add_menu.
Add method .add_button_widget.
Add method ~.SubredditWidgetsModeration.reorder to reorder a subreddit's widgets.
Add .Redditors (reddit.redditors) to provide .Redditor listings.
Add Subreddit.submit_image for submitting native images to Reddit.
Add Subreddit.submit_video for submitting native videos and videogifs to Reddit.
Changed
.me returns None in .read_only mode.
.SubredditLinkFlairTemplates.__iter__ uses the v2 flair API endpoint. This change will result in additional fields being returned. All fields that were previously returned will still be returned.
.SubredditRedditorFlairTemplates.__iter__ uses the v2 flair API endpoint. The method will still return the exact same items.
Methods .SubredditRedditorFlairTemplates.add, .SubredditLinkFlairTemplates.add, .SubredditRedditorFlairTemplates.update, and .SubredditLinkFlairTemplates.update can add and update redesign-style flairs with the v2 flair API endpoint. They can still update pre-redesign-style flairs with the older endpoint.
Fixed
Widgets of unknown types are parsed as .Widgets rather than raising an exception.
Add method .revision to get a specific wiki page revision.
Added
Add method .revision to get a specific wiki page revision.
Added parameter skip_existing to .stream_generator to skip existing items when starting a stream.
Add method .Front.best to get the front page "best" listing.
Add .Subreddit.widgets, .SubredditWidgets, and widget subclasses like .TextArea to support fetching Reddit widgets.
Add method .Submission.mark_visited to mark a submission as visited on the Reddit backend.
Fixed
Fix RecursionError on .SubredditEmoji's repr and str.
.SubredditFilters.add and .SubredditFilters.remove also accept a .Subreddit for the subreddit parameter.
Remove restriction which prevents installed (non-confidential) apps from using OAuth2 authorization code grant flow.
Removed
Subreddit.submissions as the API endpoint backing the method is no more. See https://www.reddit.com/r/changelog/comments/7tus5f/update_to_search_api/.
Add method ~.Reddit.patch to .Reddit class to support HTTP PATCH requests.
Added
Add method ~.Reddit.patch to .Reddit class to support HTTP PATCH requests.
Add class .Preferences to access and update Reddit preferences.
Add attribute .User.preferences to access an instance of .Preferences.
Add method .Message.delete.
Add class .Emoji to work with custom subreddit emoji.
Deprecated
Subreddit.submissions as the API endpoint backing the method is going away. See https://www.reddit.com/r/changelog/comments/7tus5f/update_to_search_api/.
Fixed
Fix bug with positive pause_after values in streams provided by .stream_generator where the wait time was not reset after a yielded None.
Parse URLs with trailing slashes and no "comments" element when creating .Submission objects.
Fix bug where Subreddit.submissions returns a same submission more than once
Fix bug where ListingGenerator fetches the same batch of submissions in an infinite loop when "before" parameter is provided.
Removed
Removed support for Python 3.3 as it is no longer supported by requests.
.Multireddit.stream, to stream submissions and comments from a multireddit.
Added
.Multireddit.stream, to stream submissions and comments from a multireddit.
.Redditor.block
Fixed
Now raises prawcore.UnavailableForLegalReasons instead of an AssertionError when encountering a HTTP 451 response.
An attribute on .LiveUpdate now works as lazy attribute (i.e., populate an attribute when the attribute is first accessed).
Changed
An attribute on .LiveUpdate now works as lazy attribute (i.e., populate an attribute when the attribute is first accessed).
Deprecated
subreddit.comments.gilded because there isn't actually an endpoint that returns only gilded comments. Use subreddit.gilded instead.
Fixed
Removed comment.permalink() because comment.permalink is now an attribute returned by Reddit.
.Redditor.stream, with methods .RedditorStream.submissions and .RedditorStream.comments to stream a Redditor's comments or submissions
Added
.Redditor.stream, with methods .RedditorStream.submissions and .RedditorStream.comments to stream a Redditor's comments or submissions
.RedditorStream has been added to facilitate .Redditor.stream
.Inbox.collapse to mark messages as collapsed.
.Inbox.uncollapse to mark messages as uncollapsed.
Raise .ClientException when calling .Comment.refresh when the comment does not appear in the resulting comment tree.
.Submission.crosspost to crosspost to a subreddit.
Fixed
Calling .Comment.refresh on a directly fetched, deeply nested .Comment will additionally pull in as many parent comments as possible (currently 8) enabling significantly quicker traversal to the top-most .Comment via successive .parent calls.
Calling ~.Comment.refresh previously could have resulted in a AttributeError: "MoreComments" object has no attribute "_replies" exception. This situation will now result in a .ClientException.
Properly handle BAD_CSS_NAME errors when uploading stylesheet images with invalid filenames. Previously an AssertionError was raised.
.Submission's gilded attribute properly returns the expected value from reddit.
Calls to .Submission.hide and .Submission.unhide properly batch into requests of 50 submissions at a time.
Fixed
Calls to .Submission.hide and .Submission.unhide properly batch into requests of 50 submissions at a time.
Lowered the average maximum delay between inactive stream checks by 4x to 16 seconds. It was previously 64 seconds, which was too long.
.Comment.disable_inbox_replies, .Comment.enable_inbox_replies .Submission.disable_inbox_replies, and .Submission.enable_inbox_replies to toggle inbox
Added
.Comment.disable_inbox_replies, .Comment.enable_inbox_replies .Submission.disable_inbox_replies, and .Submission.enable_inbox_replies to toggle inbox replies on comments and submissions.
Changed
cloudsearch is no longer the default syntax for ~.Subreddit.search. lucene is now the default syntax so that PRAW's default is aligned with Reddit's default.
.Reddit.info will now take either a list of fullnames or a single URL string.
.Subreddit.submit accepts a flair template ID and text.
Fixed
Fix accessing .LiveUpdate.contrib raises AttributeError.
Removed
Iterating directly over .SubredditRelationship (e.g., subreddit.banned, subreddit.contributor, subreddit.moderator, etc) and .SubredditFlair is no longer possible. Iterate instead over their callables, e.g. subreddit.banned() and subreddit.flair().
The following methods are removed: Subreddit.mod.approve, Subreddit.mod.distinguish, Subreddit.mod.ignore_reports, Subreddit.mod.remove, Subreddit.mod.undistinguish, Subreddit.mod.unignore_reports.
Support for passing a .Submission to .SubredditFlair.set is removed.
The thing argument to .SubredditFlair.set is removed.
Return values from .Comment.block, .Message.block, .SubredditMessage.block, .SubredditFlair.delete, .friend, .Redditor.message, .Subreddit.message, .select, and .unfriend are removed as they do not provide any useful information.
praw.ini no longer reads in http_proxy and https_proxy settings.
is_link parameter of .SubredditRedditorFlairTemplates.add and .SubredditRedditorFlairTemplates.clear. Use .SubredditLinkFlairTemplates instead.
The release's sole purpose is to announce the deprecation of the is_link parameter as described below:
The release's sole purpose is to announce the deprecation of the is_link parameter as described below:
Added
.SubredditFlair.link_templates to manage link flair templates.
Deprecated
is_link parameter of .SubredditRedditorFlairTemplates.add and .SubredditRedditorFlairTemplates.clear. Use .SubredditLinkFlairTemplates instead.
Calling .parent works on .Comment instances obtained via .comment_replies.
Fixed
Calling .parent works on .Comment instances obtained via .comment_replies.
.Modmail.unread_count to get unread count by conversation state.
Added
.Modmail.unread_count to get unread count by conversation state.
.Modmail.bulk_read to mark conversations as read by conversation state.
.Modmail.subreddits to fetch subreddits using new modmail.
.Modmail.create to create a new modmail conversation.
.ModmailConversation.read to mark modmail conversations as read.
.ModmailConversation.unread to mark modmail conversations as unread.
.conversations to get new modmail conversations.
.ModmailConversation.highlight to highlight modmail conversations.
.ModmailConversation.unhighlight to unhighlight modmail conversations.
.ModmailConversation.mute to mute modmail conversations.
.ModmailConversation.unmute to unmute modmail conversations.
.ModmailConversation.archive to archive modmail conversations.
.ModmailConversation.unarchive to unarchive modmail conversations.
.ModmailConversation.reply to reply to modmail conversations.
.Modmail.__call__ to get a new modmail conversation.
.Inbox.stream to stream new items in the inbox.
Exponential request delay to all streams when no new items are returned in a request. The maximum delay between requests is 66 seconds.
Changed
~.Subreddit.submit accepts selftext='' to create a title-only submission.
.Reddit accepts requestor_class=cls for a customized requestor class and requestor_kwargs={"param": value} for passing arguments to requestor initialization.
.SubredditStream.comments, .SubredditStream.submissions, and .Subreddits.stream accept a pause_after argument to allow pausing of the stream. The default value of None retains the preexisting behavior.
Deprecated
cloudsearch will no longer be the default syntax for .Subreddit.search in PRAW 5. Instead, lucene will be the default syntax so that PRAW's default is aligned with Reddit's default.
Fixed
Fix bug where .WikiPage revisions with deleted authors caused TypeError.
.Submission attributes comment_limit and comment_sort maintain their values after making instances non-lazy.
.LiveThreadContribution.update to update settings of a live thread.
Added
.LiveThreadContribution.update to update settings of a live thread.
reset_timestamp to .limits to provide insight into when the current rate limit window will expire.
.upload_mobile_header to upload subreddit mobile header.
.upload_mobile_icon to upload subreddit mobile icon.
.delete_mobile_header to remove subreddit mobile header.
.delete_mobile_icon to remove subreddit mobile icon.
.LiveUpdateContribution.strike to strike a content of a live thread.
.LiveContributorRelationship.update to update contributor permissions for a redditor.
.LiveContributorRelationship.update_invite to update contributor invite permissions for a redditor.
.LiveThread.discussions to get submissions linking to the thread.
.LiveThread.report to report the thread violating the Reddit rules.
.LiveHelper.now to get the currently featured live thread.
.LiveHelper.info to fetch information about each live thread in live thread IDs.
Fixed
Uploading an image resulting in too large of a request (>500 KB) now raises prawcore.TooLarge instead of an AssertionError.
Uploading an invalid image raises APIException.
.Redditor instances obtained via ~.Subreddit.moderator (e.g., reddit.subreddit("test").moderator()) will contain attributes with the relationship metadata (e.g., mod_permissions).
.Message instances retrieved from the inbox now have attributes author, dest replies and subreddit properly converted to their appropriate PRAW model.
.LiveContributorRelationship.leave to abdicate the live thread contributor position.
Added
.LiveContributorRelationship.leave to abdicate the live thread contributor position.
.LiveContributorRelationship.remove to remove the redditor from the live thread contributors.
.limits to provide insight into number of requests made and remaining in the current rate limit window.
.LiveThread.contrib to obtain an instance of .LiveThreadContribution.
.LiveThreadContribution.add to add an update to the live thread.
.LiveThreadContribution.close to close the live thread permanently.
.LiveUpdate.contrib to obtain an instance of .LiveUpdateContribution.
.LiveUpdateContribution.remove to remove a live update.
.LiveContributorRelationship.accept_invite to accept an invite to contribute the live thread.
.SubredditHelper.create and .SubredditModeration.update have documented support for spoilers_enabled. Note, however, that .SubredditModeration.update will currently unset the spoilers_enabled value until such a time that Reddit returns the value along with the other settings.
.spoiler and .unspoiler to change a submission's spoiler status.
Fixed
.LiveContributorRelationship.invite and .LiveContributorRelationship.remove_invite now hit endpoints, which starts with "api/", for consistency.
.ModeratorRelationship.update, and .ModeratorRelationship.update_invite now always remove known unlisted permissions.
.Subreddit.rules to get the rules of a subreddit.
Added
.Subreddit.rules to get the rules of a subreddit.
.LiveContributorRelationship, which can be obtained through .LiveThread.contributor, to interact with live threads' contributors.
~.ModeratorRelationship.remove_invite to remove a moderator invite.
.LiveContributorRelationship.invite to send a contributor invitation.
.LiveContributorRelationship.remove_invite to remove the contributor invitation.
Deprecated
Return values from .Comment.block, .Message.block, .SubredditMessage.block, .SubredditFlair.delete, .friend, .Redditor.message, .Subreddit.message, .select, and .unfriend will be removed in PRAW 5 as they do not provide any useful information.
Fixed
.Submission.hide and .Submission.unhide now accept a list of additional submissions.
.replace_more is now recoverable. Previously, when an exception was raised during the work done by .replace_more, all unreplaced .MoreComments instances were lost. Now .MoreComments instances are only removed once their children have been added to the .CommentForest enabling callers of .replace_more to call the method as many times as required to complete the replacement.
Working with contributors on .SubredditWiki is done consistently through contributor not contributors.
Subreddit.moderator() works.
live_thread.contributor() now returns .RedditorList correctly.
Removed
validate_time_filter is no longer part of the public interface.
The following methods are deprecated to be removed in PRAW 5 and are replaced with similar Comment.mod... and Submission.mod... alternatives: Subreddi…
Added
Subreddits.search_by_topic to search subreddits by topic.
.LiveHelper.__call__ to provide interface to praw.models.LiveThread.__init__.
.SubredditFilters to work with filters for special subreddits, like r/all.
Added callables for .SubredditRelationship and .SubredditFlair so that limit and other parameters can be passed.
Add .Message.reply to .Message which was accidentally missed previously.
Add sticky parameter to .CommentModeration.distinguish to sticky comments.
.Submission.flair to add a submission's flair from an instance of .Submission.
.Comment.parent to obtain the parent of a .Comment.
.opt_in and .opt_out to .Subreddit to permit working with quarantined subreddits.
.LiveUpdate to represent an individual update in a .LiveThread.
Ability to access an individual .LiveUpdate via reddit.live("THREAD_ID")["UPDATE_ID"].
.LiveThread.updates to iterate the updates of the thread.
Changed
.me now caches its result in order to reduce redundant requests for methods that depend on it. Set use_cache=False when calling to bypass the cache.
.replace_more can be called on .Comment replies.
Deprecated
validate_time_filter will be removed from the public interface in PRAW 4.2 as it was never intended to be part of it to begin with.
Iterating directly over .SubredditRelationship (e.g., subreddit.banned, subreddit.contributor, subreddit.moderator, etc) and .SubredditFlair will be removed in PRAW 5. Iterate instead over their callables, e.g. subreddit.banned() and subreddit.flair().
The following methods are deprecated to be removed in PRAW 5 and are replaced with similar Comment.mod... and Submission.mod... alternatives: Subreddit.mod.approve, Subreddit.mod.distinguish, Subreddit.mod.ignore_reports, Subreddit.mod.remove, Subreddit.mod.undistinguish, Subreddit.mod.unignore_reports.
Support for passing a .Submission to .SubredditFlair.set will be removed in PRAW 5. Use .Submission.flair instead.
The thing argument to .SubredditFlair.set is replaced with redditor and will be removed in PRAW 5.
Fixed
.SubredditModeration.update accurately updates exclude_banned_modqueue, header_hover_text, show_media and show_media_preview values.
Instances of .Comment obtained through the inbox (including mentions) are now refreshable.
Searching r/all should now work as intended for all users.
Accessing an invalid attribute on an instance of .Message will raise AttributeError instead of .PRAWException.
Fix bug where ipython tries to access attribute _ipython_canary_method_should_not_exist_ resulting in a useless fetch.
Fixed
Fix bug where ipython tries to access attribute _ipython_canary_method_should_not_exist_ resulting in a useless fetch.
Fix bug where .Comment replies becomes [] after attempting to access an invalid attribute on the Comment.
Reddit.wiki[...] converts the passed in page name to lower case as pages are only saved in lower case and non-lower case page names results in a Redirect exception (thanks pcjonathan).
implicit parameter to .url to support the implicit flow for installed applications (see: https://github.com/reddit-archive/reddit/wiki/OAuth2#authoriz
Added
implicit parameter to .url to support the implicit flow for installed applications (see: https://github.com/reddit-archive/reddit/wiki/OAuth2#authorization-implicit-grant-flow)
.scopes to discover which scopes are available to the current authentication
Lots of documentation: https://praw.readthedocs.io/
.Auth.authorize properly sets the session's Authentication (thanks @williammck).
Fixed
.Auth.authorize properly sets the session's Authentication (thanks @williammck).
PRAW 4 introduces significant breaking changes. The numerous changes are not listed here, only the feature removals. Please read through /getting_star…
PRAW 4 introduces significant breaking changes. The numerous changes are not listed here, only the feature removals. Please read through /getting_started/quick_start to help with updating your code to PRAW 4. If you require additional help please ask on r/redditdev or via Slack.
Added
.Comment.block, .Message.block, and .SubredditMessage.block to permit blocking unwanted user contact.
.LiveHelper.create to create new live threads.
.Redditor.unblock to undo a block.
Subreddits.gold to iterate through gold subreddits.
.Subreddits.search to search for subreddits by name and description.
.Subreddits.stream to obtain newly created subreddits in near realtime.
.User.karma to retrieve the current user's subreddit karma.
praw.models.reddit.submission.SubmissionModeration.lock and praw.models.reddit.submission.SubmissionModeration.unlock to change a Submission's lock state.
.SubredditFlairTemplates.delete to delete a single flair template.
SubredditModeration.unread to iterate over unread moderation messages.
.ModeratorRelationship.invite to invite a moderator to a subreddit.
.ModeratorRelationship.update to update a moderator's permissions.
.ModeratorRelationship.update_invite to update an invited moderator's permissions.
Front.random_rising, Subreddit.random_rising and Multireddit.random_rising.
.WikiPage supports a revision argument.
.SubredditWiki.revisions to obtain a list of recent revisions to a subreddit.
.WikiPage.revisions to obtain a list of revisions for a wiki page.
Support installed-type OAuth apps.
Support read-only OAuth for all application types.
Support script-type OAuth apps.
Changed
Note
Only prominent changes are listed here.
helpers.comments_stream is now .SubredditStream.comments
helpers.submissions_between is now Subreddit.submissions. This new method now only iterates through newest submissions first and as a result makes approximately 33% fewer requests.
helpers.submission_stream is now .SubredditStream.submissions
Removed
Removed .Reddit's login method. Authentication must be done through OAuth.
Removed praw-multiprocess as this functionality is no longer needed with PRAW 4.
Removed non-oauth functions Message.collapse and Message.uncollapse is_username_available.
Removed captcha related functions.
For changes prior to version 4.0 please see: 3.6.2 changelog
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Your coding agent can read these notes before it upgrades. Set up the MCP server →