---
title: "pyo3 Breaking Changes on crates.io | Since.dev"
description: "What each pyo3 release removed, renamed or changed: 189 breaking changes in 5 versions on crates.io, each with its source."
canonical_url: https://since.dev/packages/crates/pyo3
last_updated: 2026-10-14
---

# 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

## 0.30.1

59 breaking changes, first published October 14, 2026.

- **Removed** `pyo3::prelude::Py::from_borrowed_ptr`  

Use Borrowed::from_borrowed_ptr instead. [crates.io](https://crates.io/crates/pyo3/0.30.1)
- **Removed** `pyo3::prelude::Py::from_borrowed_ptr_or_err`  

Use Borrowed::from_borrowed_ptr_or_err instead. [crates.io](https://crates.io/crates/pyo3/0.30.1)
- **Removed** `pyo3::prelude::Py::from_borrowed_ptr_or_opt`  

Use Borrowed::from_borrowed_ptr_or_opt instead. [crates.io](https://crates.io/crates/pyo3/0.30.1)
- **Removed** `pyo3::prelude::Py::from_owned_ptr`  

Use Bound::from_owned_ptr instead. [crates.io](https://crates.io/crates/pyo3/0.30.1)
- **Removed** `pyo3::prelude::Py::from_owned_ptr_or_err`  

Use Bound::from_owned_ptr_or_err instead. [crates.io](https://crates.io/crates/pyo3/0.30.1)
- **Removed** `pyo3::prelude::Py::from_owned_ptr_or_opt`  

Use Bound::from_owned_ptr_or_opt instead. [crates.io](https://crates.io/crates/pyo3/0.30.1)
- **Removed** `pyo3::Py::from_borrowed_ptr`  

Use Borrowed::from_borrowed_ptr instead. [crates.io](https://crates.io/crates/pyo3/0.30.1)
- **Removed** `pyo3::Py::from_borrowed_ptr_or_err`  

Use Borrowed::from_borrowed_ptr_or_err instead. [crates.io](https://crates.io/crates/pyo3/0.30.1)
- **Removed** `pyo3::Py::from_borrowed_ptr_or_opt`  

Use Borrowed::from_borrowed_ptr_or_opt instead. [crates.io](https://crates.io/crates/pyo3/0.30.1)
- **Removed** `pyo3::Py::from_owned_ptr`  

Use Bound::from_owned_ptr instead. [crates.io](https://crates.io/crates/pyo3/0.30.1)

And 49 more in this version.

## 0.29.0

65 breaking changes, first published June 11, 2026.

- **Removed**  

PyO3 0.29 no longer supports the experimental free-threaded Python 3.13t build; use Python 3.14t instead. [github.com](https://github.com/PyO3/pyo3/releases/tag/v0.29.0)
- **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](https://github.com/PyO3/pyo3/releases/tag/v0.29.0)
- **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](https://github.com/PyO3/pyo3/releases/tag/v0.29.0)
- **Removed** `From<char.DecodeUtf16Error> for PyErr`  

Build a UnicodeDecodeError manually with PyUnicodeDecodeError::new_err instead. [pyo3.rs](https://pyo3.rs/v0.29.0/migration.html)
- **Removed** `pyo3::conversion::FromPyObject::type_input`  

pyo3::conversion::FromPyObject::type_input was removed in pyo3 0.29.0 [crates.io](https://crates.io/crates/pyo3/0.29.0)
- **Removed** `pyo3::conversion::IntoPyObject::type_output`  

pyo3::conversion::IntoPyObject::type_output was removed in pyo3 0.29.0 [crates.io](https://crates.io/crates/pyo3/0.29.0)
- **Removed** `pyo3::DowncastError`  

Use CastError instead. [crates.io](https://crates.io/crates/pyo3/0.29.0)
- **Removed** `pyo3::DowncastIntoError`  

Use CastIntoError instead. [crates.io](https://crates.io/crates/pyo3/0.29.0)
- **Removed** `pyo3::FromPyObject::type_input`  

pyo3::FromPyObject::type_input was removed in pyo3 0.29.0 [crates.io](https://crates.io/crates/pyo3/0.29.0)
- **Removed** `pyo3::import_exception_bound!`  

pyo3::import_exception_bound! was removed in pyo3 0.29.0 [crates.io](https://crates.io/crates/pyo3/0.29.0)

And 55 more in this version.

## 0.28.2

61 breaking changes, first published February 18, 2026.

- **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](https://pyo3.rs/v0.28.0/migration.html)
- **Removed** `pyo3::buffer::PyBuffer::buf_ptr`  

pyo3::buffer::PyBuffer::buf_ptr was removed in pyo3 0.28.2 [crates.io](https://crates.io/crates/pyo3/0.28.2)
- **Removed** `pyo3::buffer::PyBuffer::dimensions`  

pyo3::buffer::PyBuffer::dimensions was removed in pyo3 0.28.2 [crates.io](https://crates.io/crates/pyo3/0.28.2)
- **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](https://crates.io/crates/pyo3/0.28.2)
- **Removed** `pyo3::buffer::PyBuffer::get_ptr`  

pyo3::buffer::PyBuffer::get_ptr was removed in pyo3 0.28.2 [crates.io](https://crates.io/crates/pyo3/0.28.2)
- **Removed** `pyo3::buffer::PyBuffer::is_c_contiguous`  

pyo3::buffer::PyBuffer::is_c_contiguous was removed in pyo3 0.28.2 [crates.io](https://crates.io/crates/pyo3/0.28.2)
- **Removed** `pyo3::buffer::PyBuffer::is_fortran_contiguous`  

pyo3::buffer::PyBuffer::is_fortran_contiguous was removed in pyo3 0.28.2 [crates.io](https://crates.io/crates/pyo3/0.28.2)
- **Removed** `pyo3::buffer::PyBuffer::item_count`  

pyo3::buffer::PyBuffer::item_count was removed in pyo3 0.28.2 [crates.io](https://crates.io/crates/pyo3/0.28.2)
- **Removed** `pyo3::buffer::PyBuffer::item_size`  

pyo3::buffer::PyBuffer::item_size was removed in pyo3 0.28.2 [crates.io](https://crates.io/crates/pyo3/0.28.2)
- **Removed** `pyo3::buffer::PyBuffer::len_bytes`  

pyo3::buffer::PyBuffer::len_bytes was removed in pyo3 0.28.2 [crates.io](https://crates.io/crates/pyo3/0.28.2)

And 51 more in this version.

## 0.28.0

2 breaking changes, first published February 18, 2026.

- **Removed**  

Code that relied on these private FFI definitions from pyo3::ffi will no longer compile. [github.com](https://github.com/PyO3/pyo3/releases/tag/v0.28.0)
- **Configuration changed**  

Projects building PyO3 must use Rust 1.83 or later. [github.com](https://github.com/PyO3/pyo3/releases/tag/v0.28.0)

## 0.30.0

2 breaking changes, first published October 14, 2026.

- **Removed**  

Python 3.8 is no longer supported, so projects on it must move to a newer Python version before upgrading. [github.com](https://github.com/PyO3/pyo3/releases/tag/v0.30.0)
- **Configuration changed**  

Projects must build with Rust 1.85 or newer to use this release. [github.com](https://github.com/PyO3/pyo3/releases/tag/v0.30.0)

## Check your code

These are the changes. To see which of them reach your code, [scan a public repository](https://since.dev/scan.md), or have your coding agent call `check_code` with your manifest or lockfile over [MCP](https://since.dev/docs.md#mcp). [The API](https://since.dev/docs.md#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.

[Scan a repository](https://since.dev/scan.md). Any public GitHub repository. No sign-in.

### Tell your agent what changed since it was trained.

`claude mcp add --transport http since https://api.since.dev/mcp`

---

Every page on this site as Markdown: https://since.dev/sitemap.md. For agents: https://since.dev/llms.txt.
