pyo3 breaking changes
Every breaking API change we have recorded in pyo3 on crates.io: 189 breaking changes in 5 versions. Below are its newest 5 versions, removals and renames first, each with its source.
Newest change October 14, 2026

On this page
0.30.1
- Removed
pyo3::prelude::Py::from_borrowed_ptr
Use Borrowed::from_borrowed_ptr instead. crates.io - Removed
pyo3::prelude::Py::from_borrowed_ptr_or_err
Use Borrowed::from_borrowed_ptr_or_err instead. crates.io - Removed
pyo3::prelude::Py::from_borrowed_ptr_or_opt
Use Borrowed::from_borrowed_ptr_or_opt instead. crates.io - Removed
pyo3::prelude::Py::from_owned_ptr
Use Bound::from_owned_ptr instead. crates.io - Removed
pyo3::prelude::Py::from_owned_ptr_or_err
Use Bound::from_owned_ptr_or_err instead. crates.io - Removed
pyo3::prelude::Py::from_owned_ptr_or_opt
Use Bound::from_owned_ptr_or_opt instead. crates.io - Removed
pyo3::Py::from_borrowed_ptr
Use Borrowed::from_borrowed_ptr instead. crates.io - Removed
pyo3::Py::from_borrowed_ptr_or_err
Use Borrowed::from_borrowed_ptr_or_err instead. crates.io - Removed
pyo3::Py::from_borrowed_ptr_or_opt
Use Borrowed::from_borrowed_ptr_or_opt instead. crates.io - Removed
pyo3::Py::from_owned_ptr
Use Bound::from_owned_ptr instead. crates.io
And 49 more in this version.
0.29.0
- Removed
PyO3 0.29 no longer supports the experimental free-threaded Python 3.13t build; use Python 3.14t instead. github.com - Removed
PyO3 0.29 no longer supports Python 3.7, so projects on Python 3.7 must stay on PyO3 0.28 or move to a newer Python. github.com - Removed
Private CPython APIs with the _Py underscore prefix have been removed from pyo3-ffi's public API, so code that uses them must change. github.com - Removed
From<char.DecodeUtf16Error> for PyErr
Build a UnicodeDecodeError manually with PyUnicodeDecodeError::new_err instead. pyo3.rs - Removed
pyo3::conversion::FromPyObject::type_input
pyo3::conversion::FromPyObject::type_input was removed in pyo3 0.29.0 crates.io - Removed
pyo3::conversion::IntoPyObject::type_output
pyo3::conversion::IntoPyObject::type_output was removed in pyo3 0.29.0 crates.io - Removed
pyo3::DowncastError
Use CastError instead. crates.io - Removed
pyo3::DowncastIntoError
Use CastIntoError instead. crates.io - Removed
pyo3::FromPyObject::type_input
pyo3::FromPyObject::type_input was removed in pyo3 0.29.0 crates.io - Removed
pyo3::import_exception_bound!
pyo3::import_exception_bound! was removed in pyo3 0.29.0 crates.io
And 55 more in this version.
0.28.2
- Removed
PyClassInitializer
The From<Bound<T>> and From<Py<T>> conversions into PyClassInitializer were removed. Use clone or clone_ref on the existing object instead. pyo3.rs - Removed
pyo3::buffer::PyBuffer::buf_ptr
pyo3::buffer::PyBuffer::buf_ptr was removed in pyo3 0.28.2 crates.io - Removed
pyo3::buffer::PyBuffer::dimensions
pyo3::buffer::PyBuffer::dimensions was removed in pyo3 0.28.2 crates.io - Removed
pyo3::buffer::PyBuffer::format
Methods such as format moved from PyBuffer to PyUntypedBuffer. Method call syntax still works through dereferencing, but direct references to the moved functions need updating. crates.io - Removed
pyo3::buffer::PyBuffer::get_ptr
pyo3::buffer::PyBuffer::get_ptr was removed in pyo3 0.28.2 crates.io - Removed
pyo3::buffer::PyBuffer::is_c_contiguous
pyo3::buffer::PyBuffer::is_c_contiguous was removed in pyo3 0.28.2 crates.io - Removed
pyo3::buffer::PyBuffer::is_fortran_contiguous
pyo3::buffer::PyBuffer::is_fortran_contiguous was removed in pyo3 0.28.2 crates.io - Removed
pyo3::buffer::PyBuffer::item_count
pyo3::buffer::PyBuffer::item_count was removed in pyo3 0.28.2 crates.io - Removed
pyo3::buffer::PyBuffer::item_size
pyo3::buffer::PyBuffer::item_size was removed in pyo3 0.28.2 crates.io - Removed
pyo3::buffer::PyBuffer::len_bytes
pyo3::buffer::PyBuffer::len_bytes was removed in pyo3 0.28.2 crates.io
And 51 more in this version.
0.28.0
- Removed
Code that relied on these private FFI definitions from pyo3::ffi will no longer compile. github.com - Configuration changed
Projects building PyO3 must use Rust 1.83 or later. github.com
0.30.0
- Removed
Python 3.8 is no longer supported, so projects on it must move to a newer Python version before upgrading. github.com - Configuration changed
Projects must build with Rust 1.85 or newer to use this release. github.com
Check your code
These are the changes. To see which of them reach your code, scan a public repository, or have your coding agent call check_code with your manifest or lockfile over MCP. The API reads every change in every version, not only the newest. On Team and up, a fix pull request opens for the changes that reach a connected repository. Nothing merges or deploys.

Put your code on continuous management.
Scan a public repository now, or give your agent one line.
See how out of date your code is.
Tell your agent what changed since it was trained.
claude mcp add --transport http since https://api.since.dev/mcp