Product fields

The current wrapper exposes these properties on Items, Collections, Assets, and item asset definitions:

STAC field Python property Python value
product:type product_type str
product:timeliness timeliness ISO 8601 duration string, such as PT3H
product:timeliness_category timeliness_category Provider category string, such as NRT
product:acquisition_type acquisition_type AcquisitionType or str
product:status status ProductStatus
product:quality_status quality_status QualityStatus

All getters can return None; setters accept None to remove the local field. Item Asset reads may still return an inherited Item value after removal.

AcquisitionType defines NOMINAL, CALIBRATION, and OTHER, serialized as lowercase strings. Its getter preserves unknown strings.

ProductStatus defines ARCHIVED, ACQUIRED, CANCELLED, FAILED, PLANNED, POTENTIAL, REJECTED, QUALITY_DEGRADED, and ACCEPTED. Their serialized values are lowercase, with QUALITY_DEGRADED serialized as qualitydegraded. The status setter expects an enum; the getter raises ValueError for an unknown stored status.

Updates and runtime checks

apply() accepts keyword-only arguments matching the properties above. Its defaults have different effects:

Argument omitted or None Effect
product_type, acquisition_type, status, quality_status Remove the local field.
timeliness, timeliness_category Preserve the existing field.

Setting a non-null category requires a readable timeliness value. apply() checks this dependency before making assignments. Individual category assignment checks it too. However, removing timeliness does not check whether a category remains, so remove the category first.

QualityStatus defines NOMINAL and DEGRADED, serialized as nominal and degraded. Its setter expects an enum, and its getter raises ValueError for unknown stored values. Quality and lifecycle status are independent; an accepted product can have degraded quality. Leave quality status unset until a quality check has taken place.

The wrapper does not validate duration syntax, nonempty strings, or acquisition enum membership on assignment. Type annotations are not runtime validation. Reading existing fields does not rerun setter checks. Updates are not transactional if a later assignment fails.

Collection summaries

ProductExtension.summaries(collection) exposes all six properties as lists: list[str] for the first four, list[ProductStatus] for status, and list[QualityStatus] for quality status. Getters return the stored list or None; they do not convert each entry to an enum. Setters replace the whole list, and None removes the summary. The helper neither aggregates Items nor enforces the timeliness dependency.

Specification compatibility

The implementation declares Product v1.1.0 and supports all fields in the upstream specification, including ProductStatus.ACCEPTED and quality_status on objects and summaries.

ProductStatus.QUALITY_DEGRADED remains readable and writable for compatibility, but is deprecated by the specification. For new metadata, set a lifecycle status separately from QualityStatus.DEGRADED. The wrapper does not automatically infer a lifecycle status from a legacy quality value.

For an existing v1.0.0 document, review its metadata, remove the old schema identifier from stac_extensions, then call ProductExtension.ext(document, add_if_missing=True) to add v1.1.0. Registering PRODUCT_EXTENSION_HOOKS with PySTAC enables recognition of the previous identifier during STAC migration; it does not rewrite field values. See migration behavior.

Product status describes the product itself. Order extension status describes a request or processing transaction; a completed order does not imply an accepted product.