Pydantic

Data validation using Python type hints.
Fast and extensible, Pydantic plays nicely with your linters/IDE/brain.
Define how data should be in pure, canonical Python 3.9+; validate it with Pydantic.
Pydantic Logfire :fire:
We've recently launched Pydantic Logfire to help you monitor your applications.
Learn more
Pydantic V1.10 vs. V2
Pydantic V2 is a ground-up rewrite that offers many new features, performance improvements, and some breaking changes compared to Pydantic V1.
If you're using Pydantic V1 you may want to look at the
pydantic V1.10 Documentation or,
1.10.X-fixes
git branch. Pydantic V2 also ships with the latest version of Pydantic V1 built in so that you can incrementally upgrade your code base and projects: from pydantic import v1 as pydantic_v1
.
Help
See documentation for more details.
Installation
Install using pip install -U pydantic
or conda install pydantic -c conda-forge
.
For more installation options to make Pydantic even faster,
see the Install section in the documentation.
A Simple Example
from datetime import datetime
from typing import Optional
from pydantic import BaseModel
class User(BaseModel):
id: int
name: str = 'John Doe'
signup_ts: Optional[datetime] = None
friends: list[int] = []
external_data = {'id': '123', 'signup_ts': '2017-06-01 12:22', 'friends': [1, '2', b'3']}
user = User(**external_data)
print(user)
print(user.id)
Contributing
For guidance on setting up a development environment and how to make a
contribution to Pydantic, see
Contributing to Pydantic.
Reporting a Security Vulnerability
See our security policy.
Changelog
v2.11.3 (2025-04-08)
GitHub release
What's Changed
Packaging
Fixes
- Preserve field description when rebuilding model fields by @Viicos in #11698
v2.11.2 (2025-04-03)
GitHub release
What's Changed
Fixes
- Bump
pydantic-core
to v2.33.1 by @Viicos in #11678
- Make sure
__pydantic_private__
exists before setting private attributes by @Viicos in #11666
- Do not override
FieldInfo._complete
when using field from parent class by @Viicos in #11668
- Provide the available definitions when applying discriminated unions by @Viicos in #11670
- Do not expand root type in the mypy plugin for variables by @Viicos in #11676
- Mention the attribute name in model fields deprecation message by @Viicos in #11674
- Properly validate parameterized mappings by @Viicos in #11658
v2.11.1 (2025-03-28)
GitHub release
What's Changed
Fixes
- Do not override
'definitions-ref'
schemas containing serialization schemas or metadata by @Viicos in #11644
v2.11.0 (2025-03-27)
GitHub release
What's Changed
Pydantic v2.11 is a version strongly focused on build time performance of Pydantic models (and core schema generation in general).
See the blog post for more details.
Packaging
New Features
- Add
encoded_string()
method to the URL types by @YassinNouh21 in #11580
- Add support for
defer_build
with @validate_call
decorator by @Viicos in #11584
- Allow
@with_config
decorator to be used with keyword arguments by @Viicos in #11608
- Simplify customization of default value inclusion in JSON Schema generation by @Viicos in #11634
- Add
generate_arguments_schema()
function by @Viicos in #11572
Fixes
- Allow generic typed dictionaries to be used for unpacked variadic keyword parameters by @Viicos in #11571
- Fix runtime error when computing model string representation involving cached properties and self-referenced models by @Viicos in #11579
- Preserve other steps when using the ellipsis in the pipeline API by @Viicos in #11626
- Fix deferred discriminator application logic by @Viicos in #11591
New Contributors
v2.11.0b2 (2025-03-17)
GitHub release
What's Changed
Packaging
New Features
Fixes
- Fix
NotRequired
qualifier not taken into account in stringified annotation by @Viicos in #11559
New Contributors
v2.11.0b1 (2025-03-06)
GitHub release
What's Changed
Packaging
New Features
Changes
Performance
Fixes
New Contributors
v2.11.0a2 (2025-02-10)
GitHub release
What's Changed
Pydantic v2.11 is a version strongly focused on build time performance of Pydantic models (and core schema generation in general).
This is another early alpha release, meant to collect early feedback from users having issues with core schema builds.
Packaging
Performance
Fixes
- Use the correct JSON Schema mode when handling function schemas by @Viicos in #11367
- Fix JSON Schema reference logic with
examples
keys by @Viicos in #11366
- Improve exception message when encountering recursion errors during type evaluation by @Viicos in #11356
- Always include
additionalProperties: True
for arbitrary dictionary schemas by @austinyu in #11392
- Expose
fallback
parameter in serialization methods by @Viicos in #11398
- Fix path serialization behavior by @sydney-runkle in #11416
New Contributors
v2.11.0a1 (2025-01-30)
GitHub release
What's Changed
Pydantic v2.11 is a version strongly focused on build time performance of Pydantic models (and core schema generation in general).
This is an early alpha release, meant to collect early feedback from users having issues with core schema builds.
Packaging
New Features
- Support unsubstituted type variables with both a default and a bound or constraints by @FyZzyss in #10789
- Add a
default_factory_takes_validated_data
property to FieldInfo
by @Viicos in #11034
- Raise a better error when a generic alias is used inside
type[]
by @Viicos in #11088
- Properly support PEP 695 generics syntax by @Viicos in #11189
- Properly support type variable defaults by @Viicos in #11332
Changes
- Rework
create_model
field definitions format by @Viicos in #11032
- Raise a deprecation warning when a field is annotated as final with a default value by @Viicos in #11168
- Deprecate accessing
model_fields
and model_computed_fields
on instances by @Viicos in #11169
- Move core schema generation logic for path types inside the
GenerateSchema
class by @sydney-runkle in #10846
- Move
deque
schema gen to GenerateSchema
class by @sydney-runkle in #11239
- Move
Mapping
schema gen to GenerateSchema
to complete removal of prepare_annotations_for_known_type
workaround by @sydney-runkle in #11247
- Remove Python 3.8 Support by @sydney-runkle in #11258
- Disable
pydantic-core
core schema validation by @sydney-runkle in #11271
Performance
Fixes
- Add validation tests for
_internal/_validators.py
by @tkasuz in #10763
- Improve
TypeAdapter
instance repr by @sydney-runkle in #10872
- Revert "ci: use locally built pydantic-core with debug symbols by @sydney-runkle in #10942
- Re-enable all FastAPI tests by @tamird in #10948
- Fix typo in HISTORY.md. by @felixxm in #11077
- Infer final fields with a default value as class variables in the mypy plugin by @Viicos in #11121
- Recursively unpack
Literal
values if using PEP 695 type aliases by @Viicos in #11114
- Override
__subclasscheck__
on ModelMetaclass
to avoid memory leak and performance issues by @Viicos in #11116
- Remove unused
_extract_get_pydantic_json_schema()
parameter by @Viicos in #11155
- Add FastAPI and SQLModel to third-party tests by @sydney-runkle in #11044
- Fix conditional expressions syntax for third-party tests by @Viicos in #11162
- Move FastAPI tests to third-party workflow by @Viicos in #11164
- Improve discriminated union error message for invalid union variants by @Viicos in #11161
- Unpack PEP 695 type aliases if using the
Annotated
form by @Viicos in #11109
- Include
openapi-python-client
check in issue creation for third-party failures, use main
branch by @sydney-runkle in #11182
- Add pandera third-party tests by @Viicos in #11193
- Add ODMantic third-party tests by @sydney-runkle in #11197
- Add missing stacklevel in
deprecated_instance_property
warning by @Viicos in #11200
- Copy
WithJsonSchema
schema to avoid sharing mutated data by @thejcannon in #11014
- Do not cache parametrized models when in the process of parametrizing another model by @Viicos in #10704
- Re-enable Beanie third-party tests by @Viicos in #11214
- Add discriminated union related metadata entries to the
CoreMetadata
definition by @Viicos in #11216
- Consolidate schema definitions logic in the
_Definitions
class by @Viicos in #11208
- Support initializing root model fields with values of the
root
type in the mypy plugin by @Viicos in #11212
- Fix various issues with dataclasses and
use_attribute_docstrings
by @Viicos in #11246
- Only compute normalized decimal places if necessary in
decimal_places_validator
by @misrasaurabh1 in #11281
- Fix two misplaced sentences in validation errors documentation by @ananiavito in #11302
- Fix mkdocstrings inventory example in documentation by @pawamoy in #11311
- Add support for
validation_alias
in the mypy plugin by @Viicos in #11295
- Do not transform model serializer functions as class methods in the mypy plugin by @Viicos in #11298
- Simplify
GenerateJsonSchema.literal_schema()
implementation by @misrasaurabh1 in #11321
- Add additional allowed schemes for
ClickHouseDsn
by @Maze21127 in #11319
- Coerce decimal constraints to
Decimal
instances by @Viicos in #11350
- Fix
ValueError
on year zero by @davidhewitt in pydantic-core#1583
New Contributors
v2.10.6 (2025-01-23)
GitHub release
What's Changed
Fixes
v2.10.5 (2025-01-08)
GitHub release
What's Changed
Fixes
v2.10.4 (2024-12-18)
GitHub release
What's Changed
Packaging
Fixes
- Fix for comparison of
AnyUrl
objects by @alexprabhat99 in #11082
- Properly fetch PEP 695 type params for functions, do not fetch annotations from signature by @Viicos in #11093
- Include JSON Schema input core schema in function schemas by @Viicos in #11085
- Add
len
to _BaseUrl
to avoid TypeError by @Kharianne in #11111
- Make sure the type reference is removed from the seen references by @Viicos in #11143
New Contributors
v2.10.3 (2024-12-03)
GitHub release
What's Changed
Fixes
- Set fields when
defer_build
is set on Pydantic dataclasses by @Viicos in #10984
- Do not resolve the JSON Schema reference for
dict
core schema keys by @Viicos in #10989
- Use the globals of the function when evaluating the return type for
PlainSerializer
and WrapSerializer
functions by @Viicos in #11008
- Fix host required enforcement for urls to be compatible with v2.9 behavior by @sydney-runkle in #11027
- Add a
default_factory_takes_validated_data
property to FieldInfo
by @Viicos in #11034
- Fix url json schema in
serialization
mode by @sydney-runkle in #11035
v2.10.2 (2024-11-25)
GitHub release
What's Changed
Fixes
- Only evaluate FieldInfo annotations if required during schema building by @Viicos in #10769
- Do not evaluate annotations for private fields by @Viicos in #10962
- Support serialization as any for
Secret
types and Url
types by @sydney-runkle in #10947
- Fix type hint of
Field.default
to be compatible with Python 3.8 and 3.9 by @Viicos in #10972
- Add hashing support for URL types by @sydney-runkle in #10975
- Hide
BaseModel.__replace__
definition from type checkers by @Viicos in #10979
v2.10.1 (2024-11-21)
GitHub release
What's Changed
Packaging
Fixes
New Contributors
v2.10.0 (2024-11-20)
The code released in v2.10.0 is practically identical to that of v2.10.0b2.
GitHub release
See the v2.10 release blog post for the highlights!
What's Changed
Packaging
New Features
Changes
Performance
- Schema cleaning: skip unnecessary copies during schema walking by @Viicos in #10286
- Refactor namespace logic for annotations evaluation by @Viicos in #10530
- Improve email regexp on edge cases by @AlekseyLobanov in #10601
CoreMetadata
refactor with an emphasis on documentation, schema build time performance, and reducing complexity by @sydney-runkle in #10675
Fixes
New Contributors
v2.10.0b2 (2024-11-13)
Pre-release, see the GitHub release for details.
v2.10.0b1 (2024-11-06)
Pre-release, see the GitHub release for details.
... see here for earlier changes.