Create an Item with processing metadata

Install the package, then run this complete example:

from datetime import datetime, timezone

import pystac
from pystac.extensions.processing import ProcessingExpression, ProcessingExtension

acquired_at = datetime(2024, 1, 1, tzinfo=timezone.utc)
processed_at = datetime(2024, 1, 2, 12, tzinfo=timezone.utc)
item = pystac.Item(
    id="example-product",
    geometry=None,
    bbox=None,
    datetime=acquired_at,
    properties={},
)
processing = ProcessingExtension.ext(item, add_if_missing=True)
processing.apply(
    expression=ProcessingExpression.create(format="gdal-calc", expression="A * 2"),
    lineage="Scaled the source raster by two.",
    level="L2",
    facility="Example processing centre",
    software={"example-processor": "1.0.0"},
    version="1.0.0",
    processing_datetime=processed_at,
)

serialized = item.to_dict()
assert ProcessingExtension.get_schema_uri() in serialized["stac_extensions"]
assert serialized["properties"]["processing:level"] == "L2"
assert serialized["properties"]["processing:datetime"] == "2024-01-02T12:00:00Z"

restored = ProcessingExtension.ext(pystac.Item.from_dict(serialized))
assert restored.processing_datetime == processed_at
assert restored.expression is not None
assert restored.expression.format == "gdal-calc"
assert restored.expression.expression == "A * 2"

The wrapper records the expression; it does not run a processor. The Item's acquisition timestamp and its processing timestamp are independent. Supply timezone-aware UTC datetimes for processing metadata.

Serialization does not validate JSON Schema. See validation boundaries.