NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #3679 most downloaded on PyPI
Low-level communication layer for PRAW 4+.
Last release 3 months ago
13 Jun 2026
Release timing varies
gaps range from 2 weeks to 2.2 years
Nearly every release is documented
notes for 50 of 50 stable releases
Nothing withdrawn
no release was ever pulled
11 years old
51 releases · first in 2016
Make every public parameter either keyword-only or positional-only. The requestor , authenticator , and authorizer subjects of the authenticator and a
Changed
requestor,authenticator, and authorizer subjects of the authenticator and authorizer.Requestor, :meth:.Session.request, and.BaseAuthenticator.authorize_url, the only_access argument of.Authorizer.revoke, and the session factory are now keyword-only, whiletoken argument of.BaseAuthenticator.revoke_token, the code argument of.Authorizer.authorize, and the response argument of the exception classes)Changed
Make every public parameter either keyword-only or positional-only. The requestor, authenticator, and authorizer subjects of the authenticator and authorizer classes, the parameters of .Requestor, .Session.request, and .BaseAuthenticator.authorize_url, the only_access argument of .Authorizer.revoke, and the session factory are now keyword-only, while the single obvious operand of a method (such as the token argument of .BaseAuthenticator.revoke_token, the code argument of .Authorizer.authorize, and the response argument of the exception classes) is positional-only.
One column per quarter.
Add Sphinx-based documentation, published at https://prawcore.readthedocs.io/ .
Added
Changed
Add an __all__ to the prawcore package to explicitly define its public API.
Added
__all__ to the prawcore package to explicitly define its public API.py.typed marker (:PEP:561) so that downstream projects can type check.Session.authorizer, :attr:.Session.rate_limiter, and.Session.requestor properties, a :attr:.BaseAuthorizer.authenticator.BaseAuthenticator.requestor property, so that downstream codeChanged
authorizer parameter of :func:.session to BaseAuthorizer to match.Session, so that passing an :class:.ImplicitAuthorizer or.DeviceIDAuthorizer type checks.data, files, json, and params parameter annotations of.Session.request to reflect the values it already accepts at runtime (fordata body, a list json payload, and any IO fileAdded
Add an __all__ to the prawcore package to explicitly define its public API.
Add a py.typed marker (PEP 561) so that downstream projects can type check against prawcore's inline annotations.
Add read-only .Session.authorizer, .Session.rate_limiter, and .Session.requestor properties, a .BaseAuthorizer.authenticator property, and a .BaseAuthenticator.requestor property, so that downstream code can reach these objects without accessing protected attributes.
Changed
Widen the authorizer parameter of .session to BaseAuthorizer to match .Session, so that passing an .ImplicitAuthorizer or .DeviceIDAuthorizer type checks.
Widen the data, files, json, and params parameter annotations of .Session.request to reflect the values it already accepts at runtime (for example a non-dict data body, a list json payload, and any IO file object), so that callers no longer need to cast these arguments.
Drop support for Python 3.9, which was end-of-life on 2025-10-31.
Added
Changed
Drop support for Python 3.9, which was end-of-life on 2025-10-31.
3.1.0rc1 (2026/06/07)
Added
Changed
3.0.2 (2025/02/10) Changed Improved type hinting.
Changed
Increase half-second delay introduced in 3.0.0 to a full second delay.
Fixed
3.0.0 to a full second delay.Drop support for Python 3.8, which was end-of-life on 2024-10-07.
Changed
RateLimiter attribute next_request_timestamp has been removed andnext_request_timestamp_ns.Fixed
TooManyRequests exception.Removed
RateLimiter attribute reset_timestamp.Drop support for Python 3.6, which is end-of-life on 2021-12-23.
Changed
Changed
Drop support for Python 3.6, which was end-of-life on 2021-12-23.
Updated rate limit algorithm to better handle Reddit's new rate limits.
Drop support for Python 3.7, which was end-of-life on 2023-06-27.
301 redirects result in a Redirect exception.
Added
301 redirects result in a Redirect exception.
.Requestor is now initialized with a timeout parameter.
.ScriptAuthorizer, .ReadOnlyAuthorizer, and .DeviceIDAuthorizer have a new parameter, scopes, which determines the scope of access requests.
Retry 408 "Request Timeout" HTTP responses.
Changed
.DeviceIDAuthorizer can be now used with .TrustedAuthenticator.
Support 202 "Accepted" HTTP responses.
Added
Support 202 "Accepted" HTTP responses.
Fixed
The expected HTTP response status code for a request made with the proper credentials to api/v1/revoke_token has been changed from 204 to 200.
.ScriptAuthorizer has a new parameter two_factor_callback that supplies OTPs (One-Time Passcodes) when .ScriptAuthorizer.refresh is called.
Added
Add a .URITooLong exception.
.ScriptAuthorizer has a new parameter two_factor_callback that supplies OTPs (One-Time Passcodes) when .ScriptAuthorizer.refresh is called.
Add a .TooManyRequests exception.
.Authorizer optionally takes a pre_refresh_callback keyword argument. If provided, the function will called with the instance of .Authorizer prior to
Added
.Authorizer optionally takes a pre_refresh_callback keyword argument. If provided, the function will called with the instance of .Authorizer prior to refreshing the access and refresh tokens.
.Authorizer optionally takes a post_refresh_callback keyword argument. If provided, the function will called with the instance of .Authorizer after refreshing the access and refresh tokens.
Changed
The refresh_token argument to .Authorizer must now be passed by keyword, and cannot be passed as a positional argument.
Drop support for Python 3.5, which was end-of-life on 2020-09-13.
Changed
Drop support for Python 3.5, which was end-of-life on 2020-09-13.
When calling .Session.request, we add the key-value pair "api_type": "json" to the json parameter, if it is a dict.
Added
When calling .Session.request, we add the key-value pair "api_type": "json" to the json parameter, if it is a dict.
Changed
(Non-breaking) Requests to www.reddit.com use the Connection: close header to avoid warnings when tokens are refreshed after their one-hour expiration.
All other requestor methods, most notably .Session.request, now contain a timeout parameter.
Added
All other requestor methods, most notably .Session.request, now contain a timeout parameter.
.Requestor.request can be given a timeout parameter to control the amount of time to wait for a request to succeed.
Added
.Requestor.request can be given a timeout parameter to control the amount of time to wait for a request to succeed.
Changed
Updated rate limit algorithm to more intelligently rate limit when there are extra requests remaining.
Drop python 2.7 support.
.RateLimiter will not sleep longer than next_request_timestamp.
Fixed
.RateLimiter will not sleep longer than next_request_timestamp.
I am releasing 1.0.0 as prawcore is quite stable and it's unlikely that any breaking changes will need to be introduced in the near future.
I am releasing 1.0.0 as prawcore is quite stable and it's unlikely that any breaking changes will need to be introduced in the near future.
Added
Log debug messages for all sleep times.
SpecialError is raised on HTTP 415.
Added
SpecialError is raised on HTTP 415.
ReadTimeout is automatically retried like the server errors.
Added
ReadTimeout is automatically retried like the server errors.
Changed
Drop support for Python 3.3 as it is no longer supported by requests.
UnavailableForLegalReasons exception raised when HTTP Response 451 is encountered.
Added
UnavailableForLegalReasons exception raised when HTTP Response 451 is encountered.
BadJSON exception for the rare cases that a response that should contain valid JSON has unparsable JSON.
Added
BadJSON exception for the rare cases that a response that should contain valid JSON has unparsable JSON.
Conflict exception is raised when response status 409 is returned.
Added
Conflict exception is raised when response status 409 is returned.
InvalidToken is again raised on 401 when a non-refreshable application is in use.
Fixed
InvalidToken is again raised on 401 when a non-refreshable application is in use.
ConnectionError exceptions are automatically retried. This handles Connection Reset by Peer issues that appear to occur somewhat frequently when runni
Added
ConnectionError exceptions are automatically retried. This handles Connection Reset by Peer issues that appear to occur somewhat frequently when running on Amazon EC2.
Changed
Calling RateLimiter now requires a second positional argument, set_header_callback.
In the event a 401 unauthorized occurs, the access token is cleared and the request is retried.
Fixed
Check if the access token is expired immediately before every authorized request,rather than just before the request flow. This new approach accounts for failure retries, and rate limiter delay.
Add session parameter to Requestor to ease support of custom sessions (e.g. caching or mock ones).
Added
Add session parameter to Requestor to ease support of custom sessions (e.g. caching or mock ones).
Handle 413 Request entity too large responses.
Added
Handle 413 Request entity too large responses.
reset_timestamp to RateLimiter.
Fixed
Avoid modifying passed in data and params to Session.request.
ChunkedEncodingError is automatically retried like the server errors.
Added
ChunkedEncodingError is automatically retried like the server errors.
Handle Cloudflare 520 responses.
Added
Handle 500 responses.
Handle Cloudflare 520 responses.
All network requests now have a 16 second timeout by default. The environment variable prawcore_timeout can be used to adjust the value.
Added
All network requests now have a 16 second timeout by default. The environment variable prawcore_timeout can be used to adjust the value.
Prevent '(None)' from appearing in OAuthException message.
Changed
Prevent '(None)' from appearing in OAuthException message.
Add files parameter to Session.request to support image upload operations.
Added
Add files parameter to Session.request to support image upload operations.
Add duration and implicit parameters to UntrustedAuthenticator.authorization_url so that the method also supports the code grant flow.
Fixed
.Authorizer class can be used with .UntrustedAuthenticator.
session works with .DeviceIDAuthorizer and .ImplicitAuthorizer.
Fixed
session works with .DeviceIDAuthorizer and .ImplicitAuthorizer.
Split Authenticator into .TrustedAuthenticator and .UntrustedAuthenticator.
Added
Add .ImplicitAuthorizer.
Changed
Split Authenticator into .TrustedAuthenticator and .UntrustedAuthenticator.
Add .DeviceIDAuthorizer that permits installed application access to the API.
Added
Add .DeviceIDAuthorizer that permits installed application access to the API.
RequestException which wraps all exceptions that occur from requests.request in a prawcore.RequestException.
Added
RequestException which wraps all exceptions that occur from requests.request in a prawcore.RequestException.
Changed
What was previously RequestException is now ResponseException.
Handle Cloudflare 522 responses.
Added
Handle Cloudflare 522 responses.
Add ServerError exception for 502, 503, and 504 HTTP status codes that is only raised after three failed attempts to make the request.
Added
Add ServerError exception for 502, 503, and 504 HTTP status codes that is only raised after three failed attempts to make the request.
Add json parameter to Session.request.
Automatically attempt to refresh access tokens when making a request if the access token is expired.
Added
Automatically attempt to refresh access tokens when making a request if the access token is expired.
Fixed
Consider access tokens expired slightly earlier than allowed for to prevent InvalidToken exceptions from occuring.
Handle 0-byte HTTP 200 responses.
Added
Handle 0-byte HTTP 200 responses.
Support 404 "Not Found" HTTP responses.
Added
Add a NotFound exception.
Support 404 "Not Found" HTTP responses.
Support 400 "Bad Request" HTTP responses.
Added
Add a BadRequest exception.
Support 400 "Bad Request" HTTP responses.
Support 204 "No Content" HTTP responses.
Support 201 "Created" HTTP responses used in some v1 endpoints.
Added
Support 201 "Created" HTTP responses used in some v1 endpoints.
Sort Session.request data values. Sorting the values permits betamax body matcher to work as expected.
Added
Sort Session.request data values. Sorting the values permits betamax body matcher to work as expected.
Added data parameter to Session.request.
Added
Added data parameter to Session.request.
prawcore objects can be pickled.
Fixed
prawcore objects can be pickled.
302 redirects result in a Redirect exception.
Added
302 redirects result in a Redirect exception.
Add a generic Forbidden exception for 403 responses without the www-authenticate header.
Added
Add a generic Forbidden exception for 403 responses without the www-authenticate header.
Added params parameter to Session.request.
Added
Added params parameter to Session.request.
Log requests to the prawcore logger in debug mode.
README.rst for display purposes on pypi.
Fixed
README.rst for display purposes on pypi.
Your coding agent can read these notes before it upgrades. Set up the MCP server →