diff --git a/README.md b/README.md
index 22cff6b0b..53c9f6329 100644
--- a/README.md
+++ b/README.md
@@ -45,7 +45,7 @@ While cibuildwheel itself requires a recent Python version to run (we support th
⁴ Experimental, not yet supported on PyPI, but can be used directly in web deployment. Use `--platform pyodide` to build.
⁵ manylinux armv7l support is experimental. As there are no RHEL based image for this architecture, it's using an Ubuntu based image instead.
-- Builds manylinux, musllinux, macOS 10.9+ (10.13+ for Python 3.12+), and Windows wheels for CPython, PyPy, and GraalPy
+- Builds manylinux, musllinux, macOS, and Windows wheels for CPython, PyPy, and GraalPy
- Works on GitHub Actions, Azure Pipelines, Travis CI, CircleCI, GitLab CI, and Cirrus CI
- Bundles shared library dependencies on Linux and macOS through [auditwheel](https://github.com/pypa/auditwheel) and [delocate](https://github.com/matthew-brett/delocate)
- Runs your library's tests against the wheel-installed version of your library
diff --git a/cibuildwheel/platforms/macos.py b/cibuildwheel/platforms/macos.py
index 05d5d1623..e329ccf37 100644
--- a/cibuildwheel/platforms/macos.py
+++ b/cibuildwheel/platforms/macos.py
@@ -289,8 +289,11 @@ def setup_python(
# For arm64, the minimal deployment target is 11.0.
# On x86_64 (or universal2), use 10.9 as a default.
# CPython 3.12.6+ needs 10.13.
+ # CPython 3.14.0 needs 10.15.
if config_is_arm64:
default_target = "11.0"
+ elif Version(python_configuration.version) >= Version("3.14"):
+ default_target = "10.15"
elif Version(python_configuration.version) >= Version("3.12"):
default_target = "10.13"
elif python_configuration.identifier.startswith("pp") and Version(
diff --git a/docs/platforms.md b/docs/platforms.md
index 551f293bb..1cb931ebc 100644
--- a/docs/platforms.md
+++ b/docs/platforms.md
@@ -63,7 +63,8 @@ macOS builds will honor the `MACOSX_DEPLOYMENT_TARGET` environment variable to c
| Arch | Python version range | Minimum target |
|-------|----------------------|----------------|
| Intel | CPython 3.8-3.11 | 10.9 |
-| Intel | CPython 3.12+ | 10.13 |
+| Intel | CPython 3.12-3.13 | 10.13 |
+| Intel | CPython 3.14+ | 10.15 |
| AS | CPython or PyPy | 11 |
| Intel | PyPy 3.8 | 10.13 |
| Intel | PyPy 3.9+ | 10.15 |
diff --git a/test/utils.py b/test/utils.py
index 21fbb4f10..6acdc8044 100644
--- a/test/utils.py
+++ b/test/utils.py
@@ -366,8 +366,10 @@ def _expected_wheels(
elif python_abi_tag.startswith("cp"):
if python_abi_tag.startswith(("cp38", "cp39", "cp310", "cp311")):
min_macosx = macosx_deployment_target
- else:
+ elif python_abi_tag.startswith(("cp312", "cp313")):
min_macosx = _floor_macosx(macosx_deployment_target, "10.13")
+ else:
+ min_macosx = _floor_macosx(macosx_deployment_target, "10.15")
elif python_abi_tag.startswith("graalpy"):
if python_abi_tag.startswith("graalpy311"):
min_macosx = macosx_deployment_target