Ze'ev Manilovich
09/28/2026, 4:32 PMbulk_check() and filter_objects() now pass your context through. Context-based checks used to be evaluated against an empty context
• Sync client: the permit.api.* methods no longer raise an error after the write already went through
• authorized_users(), get_user_permissions() and filter_objects() work on permit.sync.Permit
• authorized_users() works on pydantic 2
• A wrong API key now shows the real 403 instead of “cannot connect to the PDP container”
• first_name and last_name are no longer dropped from checks
New
• Python 3.14 support
• Type information (py.typed): mypy and pyright now check your calls into permit
• Tested on Python 3.10 to 3.14, with both pydantic 1 and pydantic 2
Breaking changes
• Requires Python 3.10+
• httpx is no longer installed with permit, so add it yourself if your code uses it
• A few API changes, for example resource_relations.list() now returns a page, and the three sync-client methods above no longer need await. The migration guide lists every change with before/after examples
Let an agent do the upgrade
The permit-python-3-migration skill takes an AI agent such as Claude Code through the whole migration guide:
1. Download permit-python-3-migration.skill from the release and unzip it into .claude/skills/
2. Ask “upgrade permit to 3.0.0", or run /permit-python-3-migration
It checks your Python version first, then:
• scans your project
• updates your dependencies and applies the mechanical edits
• asks you about every judgement call
• runs your tests, type checker and linter at the end
Just want the list of changes? The scanner is read-only and runs on its own:
python3 .claude/skills/permit-python-3-migration/scripts/scan.py .
📚 Migration guide: github.com/permitio/permit-python/blob/…/MIGRATION.md
📝 Release notes: github.com/permitio/permit-python/…/v3.0.0
📦 pip install -U permit