NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #2477 most downloaded on PyPI
Python library for working with the SpatioTemporal Asset Catalog (STAC) specification
Last release 2 months ago
27 Jul 2026
Ships fairly regularly
a new release about every 2 months
Nearly every release is documented
notes for 44 of 46 stable releases
3 versions withdrawn
withdrawn after publishing
9 years old
57 releases · first in 2018
circular imports for extensions
actually link pystac-core and pystac via release-please
One column per quarter.
persist stac_io when reading items
fix: dependent version for pystac-core by @gadomski in https://github.com/stac-utils/pystac/pull/1735
Full Changelog: https://github.com/stac-utils/pystac/compare/pystac-ext-classification-v2.0.0-rc.0...v1.15.0-rc.1
Release candidate for v1.15.0 to allow us to test out the new extension setup.
Release candidate for v1.15.0 to allow us to test out the new extension setup.
/vsi* paths are always absolute
## 1.14.2 (2025-12-17) ### Bug Fixes * clone extra_fields for Item (#1601) (6ba7da1) * make it two separate jobs
extent not required for VerticalSpatialDimension (#1596)Asset.get_absolute_href() now properly resolves root relative hrefs (#1599)Item (#1601)Support older versions of urllib3 by @jsignell in https://github.com/stac-utils/pystac/pull/1580
Full Changelog: https://github.com/stac-utils/pystac/compare/v1.14.0...v1.14.1
update parquet and zarr media types, add others by @philvarner in https://github.com/stac-utils/pystac/pull/1554
DefaultStacIO to fix parsing non-ascii in urls by @jsignell in https://github.com/stac-utils/pystac/pull/1566Full Changelog: https://github.com/stac-utils/pystac/compare/v1.13.0...v1.14.0
Make sure that VersionRange has VersionIDs rather than strings by @jsignell in https://github.com/stac-utils/pystac/pull/1512
pull-static by @jsignell in https://github.com/stac-utils/pystac/pull/1519Collection.from_items by @jsignell in https://github.com/stac-utils/pystac/pull/1522test_catalog.py, test_layout.py and test_link.py to pytest by @teks in https://github.com/stac-utils/pystac/pull/1527Full Changelog: https://github.com/stac-utils/pystac/compare/v1.12.1...v1.13.0
Collection.from_items for creating a pystac.Collection from an ItemCollection (#1522)extensions.mlm for supporting the MLM extension (#1542)Make sure that VersionRange has VersionIDs rather than strings by @jsignell in https://github.com/stac-utils/pystac/pull/1512
pull-static by @jsignell in https://github.com/stac-utils/pystac/pull/1519Full Changelog: https://github.com/stac-utils/pystac/compare/v1.12.1...v1.12.2
VersionRange has VersionIDs rather than strings (#1512)Fix up some breaks in the projection extension handling.
Fix up some breaks in the projection extension handling.
Full Changelog: https://github.com/stac-utils/pystac/compare/v1.12.0...v1.12.1
STAC v1.1.0 is now the default 🥳
file:// prefix - but don't write them that way by default by @jsignell in https://github.com/stac-utils/pystac/pull/1489Full Changelog: https://github.com/stac-utils/pystac/compare/v1.11.0...v1.12.0
item_assets dict on Collections (#1476)ItemAssetExtension (#1476)file:// prefix - but don't write them that way by default (#1489)get_root_link, get_child_links, get_item_links: Ensure json media types (#1497)STACError with message when a link is expected to resolve to a STAC object but doesn't (#1500)fix gridcode pydoc by @philvarner in https://github.com/stac-utils/pystac/pull/1332
name argument to Classification.apply to agree with extension specification by @bmcandr in https://github.com/stac-utils/pystac/pull/1356get_all_collections properly recursive by @jsignell in https://github.com/stac-utils/pystac/pull/1361save_object by @moradology in https://github.com/stac-utils/pystac/pull/1423Full Changelog: https://github.com/stac-utils/pystac/compare/v1.10.1...v1.11.0
Items (#1423)items, collections, search, conformance, service_desc and service_doc href methods (#1335)name argument to Classification.apply and Classification.create to agree with extension specification (#1356)StacIO for Azure Blob Storage to docs (#1372)get_all_collections properly recursive (#1361)Item::collection to None when there is no collection (#1400)name not set on eo:bands (#1406)Small bugfix release for #1337.
Small bugfix release for #1337.
Full Changelog: https://github.com/stac-utils/pystac/compare/v1.10.0...v1.10.1
Item.__getstate__ (#1337)Do not use the deprecated utcnow by @avalentino in https://github.com/stac-utils/pystac/pull/1283
Full Changelog: https://github.com/stac-utils/pystac/compare/v1.9.0...v1.10.0
validator input to STACObject.validate for inline reference of the validator to use (#1320)datetime.utcnow method that has been deprecated in Python 3.12 (#1283)Fix deprecation messages by @gadomski in https://github.com/stac-utils/pystac/pull/1271
Simpler extension interface! 🎉
assert item.ext.has("proj")
print(item.ext.proj.epsg)
Link.ext by @jsignell in https://github.com/stac-utils/pystac/pull/1265bboxes and intervals by @bmcandr in https://github.com/stac-utils/pystac/pull/1268Full Changelog: https://github.com/stac-utils/pystac/compare/v1.8.4...v1.9.0
validate_all_dict replaces the previous implementation of validate_all (i.e., validate_all was renamed to validate_all_dict, and validate_all was changed as described below) (#1246)validate_all now accepts a STACObject (in addition to accepting a dict, which is now deprecated), but prohibits supplying a value for href, which must be supplied only when supplying an object as a dict. Once validate_all removes support for an object as a dict, the href parameter will also be removed. (#1246)href when schema url resolution fails (#1263)href arguments (#1234)registry when instantiating Draft7Validator (#1240)bboxes and intervals arguments to SpatialExtent and TemporalExtent, respectively (#1268)ExtensionManagementMixin.validate_has_extension is replaced with ExtensionManagementMixin.ensure_has_extension. Calling ExtensionManagementMixin.validate_has_extension will raise a DeprecationWarning and call ExtensionManagementMixin.ensure_has_extension (#1248)validate_all for dicts; use validate_all_dict instead (#1246)Label extension (#1270)Use three digits for ~= v0.* deps by @gadomski in https://github.com/stac-utils/pystac/pull/1211
RefResolver by @jsignell in https://github.com/stac-utils/pystac/pull/1215Full Changelog: https://github.com/stac-utils/pystac/compare/v1.8.3...v1.8.4
pystac.validation.local_validator.LocalValidator (#1215)Fix warning message from get_all_items deprecation by @gadomski in https://github.com/stac-utils/pystac/pull/1203
Full Changelog: https://github.com/stac-utils/pystac/compare/v1.8.2...v1.8.3
fields parameter in the Summarizer constructor (#1195)fields parameter in the Summarizer constructor (#1195)Allow a DeprecationWarning from jsonschema by @gadomski in https://github.com/stac-utils/pystac/pull/1187
Full Changelog: https://github.com/stac-utils/pystac/compare/v1.8.1...v1.8.2
Fix release workflow by @gadomski in https://github.com/stac-utils/pystac/pull/1179
Full Changelog: https://github.com/stac-utils/pystac/compare/v1.8.0...v1.8.1
Expand get_items - deprecate get_all_items and Catalog.get_item by @jsignell in https://github.com/stac-utils/pystac/pull/1075
⚠️ This release was yanked from PyPI because it did not include the packages jsonschemas. Use v1.8.1 instead.
get_child by first checking links that have id in them by @jsignell in https://github.com/stac-utils/pystac/pull/1064get_items - deprecate get_all_items and Catalog.get_item by @jsignell in https://github.com/stac-utils/pystac/pull/1075assets from get_assets by @jsignell in https://github.com/stac-utils/pystac/pull/1087stac_extensions by @jsignell in https://github.com/stac-utils/pystac/pull/1109Link.to_dict() should only contain strings by @jsignell in https://github.com/stac-utils/pystac/pull/1114/-delimited paths by @pjhartzell in https://github.com/stac-utils/pystac/pull/1125get/add/remove_derived_from to pystac.Item by @jsignell in https://github.com/stac-utils/pystac/pull/1136_repr_html_ look like _repr_json_ output by @jsignell in https://github.com/stac-utils/pystac/pull/1142tutorials/example-catalog by @jsignell in https://github.com/stac-utils/pystac/pull/1145add_if_missing is always be optional and defaults to False by @jsignell in https://github.com/stac-utils/pystac/pull/1147Catalog.validate_all by @jsignell in https://github.com/stac-utils/pystac/pull/1150keep_parent to set_parent and add flag on obj indicating parent override of href by @jsignell in https://github.com/stac-utils/pystac/pull/1155make_all_asset_hrefs_relative/absolute by @jsignell in https://github.com/stac-utils/pystac/pull/1168Full Changelog: https://github.com/stac-utils/pystac/compare/v1.7.3...v1.8.0
sort_links_by_id to Catalog get_child() and modify_links to get_stac_objects() (#1064)*ids to Catalog and Collection get_items() for only including the provided ids in the iterator (#1075)recursive to Catalog and Collection get_items() to walk the sub-catalogs and sub-collections (#1075)logging.DEBUG (#1096)set_parent to Catalog add_item and add_child to avoid overriding existing parents (#1117, #1155)owner attribute to AssetDefinition in the item-assets extension (#1110)\\ path delimiters are converted to POSIX style / delimiters (#1125)AssetDefinitions and raster's RasterBand objects.get_derived_from, add_derived_from and remove_derived_from to Items (#1136)ItemEOExtension.get_assets for getting assets filtered on band name or common_name (#1140)max_items and recursive to Catalog.validate_all (#1141)KML as a built in media type (#1127)move/copy/delete operations for local Assets (#1158)fields.json file (for summaries) with each distribution of PySTAC (#1045).get_assets() return a deepcopy (#1087)to_dict methods returning JSON (#1074)pyproject.toml instead of setup.py (#1100)DefaultStacIO now raises an error if it tries to write to a non-local url (#1107)"stac_extensions": null (#1109)Link.to_dict() only contain strings (#1114)JsonSchemaSTACValidator (#1120)id in STACTypeError instead of entire dict (#1126)get_items is backwards compatible (#1139)_repr_html_ look like _repr_json_ output (#1142).ext is called on a Collection (#1157)add_child and add_item return a Link object instead of None (#1160)add_children and add_items return a list of Link objects instead of None (#1160)make_all_asset_hrefs_relative/absolute (#1168)Remove duplicate self links on items by @gadomski in https://github.com/stac-utils/pystac/pull/1103
Full Changelog: https://github.com/stac-utils/pystac/compare/v1.7.2...v1.7.3
This is a bugfix release to allow older versions of the Projection Extension.
This is a bugfix release to allow older versions of the Projection Extension.
Full Changelog: https://github.com/stac-utils/pystac/compare/v1.7.1...v1.7.2
This is a bugfix release for #1048 which corrects Item's __geo_interface__ property to return the whole feature, not just the geometry. This also incl
This is a bugfix release for #1048 which corrects Item's __geo_interface__ property to return the whole feature, not just the geometry. This also includes some linting and infrastructure fixups.
__geo_interface__ by @gadomski in https://github.com/stac-utils/pystac/pull/1049Full Changelog: https://github.com/stac-utils/pystac/compare/v1.7.0...v1.7.1
__geo_interface__ now correctly returns a Feature, rather than only the Geometry (#1049)A DeprecatedWarning when deserializing an Item or Collection to a STAC object via the from_dict() method (1006)
Many bug fixes and feature additions. Some changes/additions of note:
ItemCollection now clones its items by default (#1016).Item now implements __geo_interface__ (#885). For more about __geo_interface__, see https://gist.github.com/sgillies/2217756.Issues and pull requests are grouped into the Github milestone.
now_in_utc and now_to_rfc3339_str (#760)media_type and role filtering to Item and Collection get_assets() method (#936)Asset.has_role (#936)header support to DefaultStacIO (#889)Catalog.normalize_hrefs and Catalog.normalize_and_save, via a new skip_unresolved argument (#900)timespec to utils.datetime_to_str (#929)isort (#961)AsIsLayoutStrategy (#919)__geo_interface__ for items (#885)strategy parameter to catalog.add_items() (#967)start_datetime and end_datetime arguments to the Item constructor (#918)RetryStacIO (#986)STACObject.remove_hierarchical_links and Link.is_hierarchical (#999)extra_fields to AssetDefinition in the item assets extension (#1003)Catalog.fully_resolve (#1001)DeprecatedWarning when deserializing an Item or Collection to a STAC object via the from_dict() method (1006)make_absolute_href (#884)from __future__ import annotations for type signatures (#962)TypeVar for alternate constructors (#983)Item.from_dict (#994)ItemCollection now clones items in iterator (clone_items=True) (#1016)TemplateError in layout.py deprecated in favor of duplicate in errors.py (#1018)requirements-dev.txt (#897)media_type in get_links() and get_single_link() (#966)_repr_html_() (#975)clone methods (#983)href from Item.from_dict to constructor (#984)Pins jsonschema to >=4.0.1 to avoid a RefResolutionError when validating some extensions
jsonschema to >=4.0.1 to avoid a RefResolutionError when validating some extensions (#857)Full Changelog: https://github.com/stac-utils/pystac/compare/v1.6.0...v1.6.1
NOTE: This release exists purely to drop support for Python 3.7.
NOTE: This release exists purely to drop support for Python 3.7.
Full Changelog: https://github.com/stac-utils/pystac/compare/v1.5.0...v1.6.0
Enum MediaType entry for PDF documents
assets argument to Item and Collection init methods to allow adding Assets during object initialization (#834)Asset.extra_fields on a cloned Asset also mutated the original asset (#826)variables argument, to accompany dimensions, for the apply method of stac objects extended with datacube (#782)clone method for Summaries (#794)Collection.clone (#834)StacIO.read_text and StacIO.write_text now match the type annotations for the source argument. (#835)tzutc timezone even when system timezone is set to UTC. (#848)apply method by @itcarroll in https://github.com/stac-utils/pystac/pull/782Full Changelog: https://github.com/stac-utils/pystac/compare/v1.4.0...v1.5.0
Experimental support for Python 3.11
StacIO I/O methods, pystac.read_file and pystac.write_file (#728)StacIO instance as argument to Catalog.save/Catalog.normalize_and_save (#751)pystac.utils functions and classes (#735)v1.0.1 (#726)media_type in STACObject.get_links and STACObject.get_single_link
(#704)PropertyExtension.ext(..., add_if_missing=True) on an Asset
with no owner (#746)TemporalExtent using a list of datetime objects (#744)Thanks to @fnattino & @mneagul for your contributions!
Type annotations for instance attributes on all classes
extensions.datacube.Variable.to_dict method (#699]).ext to extend an object (#701)pystac.extensions.file.MappingObject (#700)PropertiesExtension._get_property to properly set return type in TableExtension (#712)DatacubeExtension.variables now has a setter (#699])Catalog.save (#714).python-version files are now ignored by Git
.python-version files are now ignored by Git (#647)tests from package distribution. This should make the package lighter (#604)mypy (#591)title from their target if no title is provided (#607)LabelClasses from List to Sequence (#627)generate_subcatalogs can include multiple template values in a single subfolder layer
(#595)Enum values were not serialized properly in methods like Link.to_dict (#654)Include type information during packaging for use with e.g. mypy
mypy (#579)dest_href argument to Catalog.save to allow saving Catalog instances to
locations other than their self href (#565)HREFs in Link objects with rel == "self" are converted to absolute HREFs
Link objects with rel == "self" are converted to absolute HREFs (#574)ProjectionExtension.crs_string to provide a single string to describe the coordinate reference system (CRS). Useful because projections can be defined
ProjectionExtension.crs_string to provide a single string to describe the coordinate reference system (CRS).
Useful because projections can be defined by EPSG code, WKT, or projjson.
(#548)sar:type -> sar:product_type and sar:polarization ->
sar:polarizations for pre-0.9 catalogs
(#556)eo:epsg -> proj:epsg for pre-0.9 catalogs (#557)PhenomenologyType enum for recommended values of pc:type & SchemaType enum for
valid values of type in Point Cloud Schema
Objects
(#548)to_dict and equality definition for extensions.item_asset.AssetDefinition (#564)Asset.common_metadata property (#563)from_dict method on STACObjects will set the object's root link when a root parameter is present. An ItemCollection from_dict with a root parameter will set the root on each of it's Items. (#549)ExtensionManagementMixin.validate_has_extension with add_if_missing = True
on an ownerless Asset will raise a STACError (#554)PointcloudSchema -> Schema, PointcloudStatistic -> Statistic for consistency
with naming convention in other extensions
(#548)RequiredPropertyMissing always raised when trying to get a required property that is
None (STACError or KeyError was previously being raised in some cases)
(#561)Collections as a type that can be extended for extensions whose fields can appear in collection summaries (#547)STAC_IO class in favor of StacIO. This was deprecated in v1.0.0-beta.1 and has been removed in this release.
LabelTask enum in pystac.extensions.label with recommended values for
"label:tasks" field (#484)LabelMethod enum in pystac.extensions.label with recommended values for
"label:methods" field (#484)__repr__ of RangeSummary instances based on to_dict
representation (#513)Catalog.get_collections for getting all child
Collections for a catalog, and Catalog.get_all_collections for recursively getting
all child Collections for a catalog and its children (#511)Asset.properties -> Asset.extra_fields and Link.properties ->
Link.extra_fields for consistency with other STAC objects
(#510)pystac.serialization.identify_stac_object_type where invalid objects with
stac_version == 1.0.0 were incorrectly identified as Catalogs
(#487)Link constructor classes (e.g. Link.from_dict, Link.canonical, etc.) now return
the calling class instead of always returning the Link class
(#512)Add a preserve_dict parameter to ItemCollection.from_dict and set it to False when using ItemCollection.from_file.
preserve_dict parameter to ItemCollection.from_dict and set it to False when
using ItemCollection.from_file.
(#468)StacIO.json_dumps and StacIO.json_loads methods for JSON
serialization/deserialization. These were "private" methods, but are now "public" and
documented (#471)pystac.stac_io.DuplicateObjectKeyError moved to pystac.DuplicateObjectKeyError
(#471)License file included in distribution
>=3.6 (#409)ItemCollection class for working with GeoJSON FeatureCollections containing only
STAC Items (#430)STACObject that does not contain the extension's schema URI in
stac_extensions raises new ExtensionNotImplementedError (#450)STACObject.from_dict now takes a preserve_dict parameter, which if False will avoid a call to deepcopy on the passed in dict and can result in performance gains (defaults to True. Reading from a file will use preserve_dict=False resulting in better performance. (#454)stac-utils, email to stac@radiant.earth, url to this repo (#409)StacIO.read_json passes arbitrary positional and keyword arguments to
StacIO.read_text (#433)FileExtension updated to work with File Info Extension v2.0.0 (#442)FileExtension only operates on pystac.Asset instances (#442)*Extension.ext methods now have an optional add_if_missing argument, which will
add the extension schema URI to the object's stac_extensions list if it is not
present (#450)from_file and from_dict methods on STACObject sub-classes always return instance
of calling class (#451)EOExtension.get_bands returns None for asset without EO bands (#406)identify_stac_object_type returns None and identify_stac_object raises STACTypeError for non-STAC objects
(#402)ExtensionManagementMixin.add_to is now idempotent (only adds schema URI to
stac_extensions once per Item regardless of the number of calls) (#419)Summaries for View Geometry, Projection, and Scientific extensions
Link.canonical static method for creating links with "canonical" rel type (#351)RelType enum containing common rel values (#351)stac-extensions GitHub org (#368)Split DefaultStacIO's reading and writing into two methods to allow subclasses to use the default link resolution behavior
DefaultStacIO's reading and writing into two methods to allow subclasses to use the default link resolution behavior (#354)API change: Refactored the global STAC_IO object to an instance-specific StacIO implementation. STAC_IO is deprecated and will be removed next release…
item_assets extension (#309)datacube extension (#309)ExtensionAlreadyExistsError, ExtensionTypeError, and RequiredPropertyMissing; moved custom exceptions to pystac.errors (#309)StacIO implementation. STAC_IO is deprecated and will be removed next release. (#309)properties from Collections (#309)LinkMixin, and implemented those methods on STACObject directly. STACObject was the only class using LinkMixin and this should not effect users (#309single-file-stac extension; this extension is being removed in favor of ItemCollection usage (#309item_assets extension (#309)datacube extension (#309)ExtensionAlreadyExistsError, ExtensionTypeError, and RequiredPropertyMissing; moved custom exceptions to pystac.errors (#309)StacIO implementation. (#309)properties from Collections (#309)LinkMixin, and implemented those methods on STACObject directly. STACObject was the only class using LinkMixin and this should not effect users (#309single-file-stac extension; this extension is being removed in favor of ItemCollection usage (#309STAC_IO in favor of new StacIO class. STAC_IO will be removed in
v1.0.0. (#309)HIERARCHICAL_LINKS array constant of all the types of hierarchical links (self is not included)
catalog_type field (#290)normalize_hrefs or manual setting of the hrefs for newly added STAC objects (#294)link_type field from links (#290)Added support for STAC file extension
deepcopy calls in to_dict methods to avoid costly overhead (#273)Add support for the scientific extension.
generate_subcatalogs (#241)Catalog.save (#244)Added support for the pointcloud extension
normalize_hrefs (#219)catalog_type property to track the CatalogType of read in or previously saved catalogs (#224)Thank you to all the new contributors that contributed during STAC Sprint 6!
Thank you to all the new contributors that contributed during STAC Sprint 6!
update_extent_from_items method to Collection for updating Extent objects within a collection based on the contained items. (#168)validate_all method to Catalogs (and by inheritance collections) for validating all catalogs, collections and items contained in that catalog (#162)validate_all method to pystac.validdation for validating all catalogs, collections and items contained in STAC JSON dicts across STAC versions. (#162)A tutorial for creating extensions
Added support for the Projection extension
pystac.set_stac_version and pystac.get_stac_version (#130)pystac.serialization.identify package (#138)get_asset_bands and set_asset_bands were renamed get_bands and set_bands and follow the new item asset property access pattern.single-file-stac extension to extend Catalog (#128)Nothing published for this version
The two major changes for this release are:
The two major changes for this release are:
eo and view)See the stac-spec 0.9.0 changelog and issue #65 for more information.
These are the major API changes that will have to be accounted for when upgrading PySTAC:
This change affects the two extensions that were implemented for Item - EOItem and LabelItem
have become EOItemExt and LabelItemExt, and no longer inherit from Item.
This change was motivated by the 0.9 change that split some properties out from eo into
the view extension. If we kept an inheritance-based extension architecture, we would not
be able to account well for these new items that implemented both the eo and view extensions.
See the Extensions section in the documentation for more information on the new way to use extensions.
pystac.label -> pystac.extensions.labelpystac.eo -> pystac.extensions.eopystac.single_file_stac -> pystac.extensions.single_file_stacpystac.read_file as a convenience function for reading in a STACObject from a file at a URI which delegates to STACObject.from_file.pystac.read_file as a convenience function for reading in a STACObject from a file at a URI.Migrated CI workflows from Travis CI to GitHub Actions #108
Dropped support for Python 3.5 #108
Extension classes for label, eo and single-file-stac were moved to the pystac.extensions package.
the eo and label extensions changed from being a subclass of Item to wrapping items. Note: This is a major change in the API for dealing with extensions. See the note below for more information.
Renamed the class that enumerates extension names from Extension to Extensions
Asset properties always return a dict instead of being None for Assets that have non-core properties.
The Band constructor in the EO extension changed to taking a dict. To create a band from property values,
use Band.create
Further narrow version for SAR extension #85
Allow for backwards compatibility for reading STAC #77
Add functionality for identifying STAC JSON information #50
Add methods for removing single items and children from catalogs.
[Unreleased]: [v1.14.1]: [v1.14.0]: [v1.13.0]: [v1.12.2]: [v1.12.1]: [v1.12.0]: [v1.11.0]: [v1.10.1]: [v1.10.0]: [v1.9.0]: [v1.8.4]: [v1.8.3]: [v1.8.2
Initial release.
<!-- markdownlint-disable-file MD024 -->
Nothing published for this version
Nothing published for this version
Your coding agent can read these notes before it upgrades. Set up the MCP server →