---
title: "Machine Storefront — sealed field catalog"
method: GET
path: "/api/v1/storefront/catalog"
tags: ["Storefront"]
---

# Machine Storefront — sealed field catalog

`GET /api/v1/storefront/catalog`

## Request

- Base URL: `https://propraven.com`
- URL: `https://propraven.com/api/v1/storefront/catalog`
- Auth: one of:
  - HTTP bearer
  - none

The data catalog IS the storefront: every column of the serving parcel relation with its measured national (and optional per-state) coverage, grain, tier, honesty flags, and pipeline freshness warts, plus the dossier pricing model and base quote (the per-parcel value-tiered price comes from /storefront/availability?parcel_id=). FREE -- authenticated callers are unmetered and uncapped (rate-limited at the scale window); anonymous callers are served and IP-throttled at the free tier. Answered from a committed, sealed artifact -- no database access.

## Query parameters

- `state` string
- `tier` string
- `section` string
- `grain` string
- `min_coverage` string
- `red_cells` string
- `q` string
- `include` string
- `fields` string

## Response `200`

The sealed catalog for the current serving epoch.

- object: The sealed field catalog. Additional top-level blocks (headline, sections, tiers, freshness, advisories, state_index, and an optional per-state `state` block) are present; the load-bearing ones are documented here.
  - `contract_version` number, required
  - `catalog_version` string, required: The serving epoch this catalog was built for.
  - `generated_at` string, required
  - `seal` object, required: Content hash: two callers under the same seal get byte-identical numbers.
    - `algorithm` string, required
    - `value` string, required
    - `covers` string, required
  - `disclosures` object, required
    - `annotation_version` string, required
    - `seal_scope` string, required
    - `withheld_fields` object[], required
      - `field` string, nullable, required
      - `reason` string, nullable, required
      - `withheld_on` string, nullable, required
      - `note` string, nullable, required
    - `annotation_basis` string, required
    - `reference_catalog` object, required
      - `version` string, required
      - `seal` string, required
    - `reference_catalog_matches` boolean, required
    - `catalog_published_at` string, required
    - `catalog_generated_at` string, required
    - `serving_epoch_match` string, required
    - `current_source_vintage` string, required
    - `freshness_scope` string, required
    - `coverage_scope` string, required
    - `pricing_scope` string, required
    - `applicability` string, required
    - `field_advisories` object[], required
      - `field` string, nullable, required
      - `documented_at` string, nullable, required
      - `evidence_source` string, nullable, required
      - `evidence_scope` string, nullable, required
      - `reference_catalog_version` string, nullable, required
      - `reference_catalog_seal` string, nullable, required
      - `reference_catalog_matches` boolean, nullable, required
      - `current_value_verified` boolean, nullable, required
      - `code` string, nullable, required
      - `note` string, nullable, required
  - `measured_from` object, required: National counts (distinct parcels, rows, mapped locations, geocoded parcels) each with the definition it was measured under.
    - `relation` string, required
    - `schema` string, required
    - `parent` string, required
    - `parcels` number, required
    - `states` number, required
    - `method` string, required
    - `weight_source` string, required
    - `weights_reconcile_to_snapshot` boolean, required
    - `manifest` string, required
    - `snapshot_watermark` string, required
    - `snapshot_swapped_at` string, required
    - `parity_status` string, required
    - `partition_analyze_min` string, required
    - `partition_analyze_max` string, required
    - `geocode_coverage` number, required
    - `sampling` string, required
    - `baseline` object, required
      - `source` string, required
      - `last_analyze` string, required
      - `note` string, required
    - `parcel_counts_epoch` string, required
    - `mapped_locations` number, required
    - `geocoded_parcels` number, required
    - `rows` number, required
    - `parcel_count_definitions` object, required
      - `parcels` string, required
      - `mapped_locations` string, required
      - `geocoded_parcels` string, required
      - `rows` string, required
    - `geocode_coverage_basis` string, required
  - `counts` object, required
    - `columns` number, required
    - `sellable` number, required
    - `plumbing` number, required
    - `headline_parcel_grain_at_80` number, required
    - `red_cells` number, required
    - `epoch_regressions` number, required
    - `curation_review_required` number, required
    - `by_grain` object, required
      - `county` integer, required
      - `parcel` number, required
      - `tract` number, required
      - `unknown` number, required
      - `zip` number, required
    - `cumulative_at` object, required
      - `0.95` number, required
      - `0.80` number, required
      - `0.60` number, required
      - `0.30` number, required
    - `withheld` number, required
  - `tiers` object, required
    - `prime` number, required
    - `strong` number, required
    - `good` number, required
    - `partial` number, required
    - `sparse` number, required
    - `trace` number, required
  - `headline` object, required
    - `floor` number, required
    - `parcel_grain_fields` number, required
    - `all_sellable_fields` number, required
    - `claim` string, required
  - `sections` object, required
    - `parcel` object, required
      - `relation` string, required
      - `rows` number, required
    - `permits` object, required
      - `relation` string, required
      - `rows` number, required
      - `national_share` number, required
    - `deeds` object, required
      - `relation` string, required
      - `rows` number, required
      - `national_share` number, required
    - `comps` object, required
      - `relation` string, required
      - `rows` number, required
      - `national_share` number, required
    - `geometry` object, required
      - `relation` string, required
      - `rows` number, required
      - `national_share` number, required
  - `pricing` object, required: The dossier pricing model (base price, floor/cap, add-ons).
    - `dossier` object, required
      - `amount` string, required
      - `currency` string, required
    - `add_ons` object[], required
      - `code` string, nullable, required
      - `label` string, nullable, required
      - `price` object, required
        - `amount` string, nullable, required
        - `currency` string, nullable, required
      - `purchasable` boolean, nullable, required
      - `note` string, nullable, required
    - `catalog` string, required
    - `availability` string, required
    - `purchase_flow` string, required
  - `quote` object, required: The base dossier quote derived from the pricing model. The per-parcel, value-tiered price is quoted by /storefront/availability?parcel_id=.
    - `price` object, required
      - `amount` string, required
      - `currency` string, required
    - `currency` string, required
    - `add_ons` object[], required
      - `code` string, nullable, required
      - `label` string, nullable, required
      - `price` object, required
        - `amount` string, nullable, required
        - `currency` string, nullable, required
      - `available` boolean, nullable, required
      - `purchasable` boolean, nullable, required
      - `note` string, nullable, required
    - `pay` unknown[], required
      - unknown
    - `purchase_flow` string, required
  - `warts` object[], required: Every non-ok freshness probe, shipped rather than hidden (the honesty layer).
    - `dataset` string, nullable, required
    - `surface` string, nullable, required
    - `status` string, nullable, required
    - `observed_max_date` string, nullable, required
    - `age_days` number, nullable, required
    - `max_age_days` integer, nullable, required
    - `probed_at` string, nullable, required
    - `reason` string, nullable, required
  - `freshness` object[], required
    - `dataset` string, nullable, required
    - `surface` string, nullable, required
    - `status` string, nullable, required
    - `observed_max_date` string, nullable, required
    - `age_days` number, nullable, required
    - `max_age_days` integer, nullable, required
    - `probed_at` string, nullable, required
    - `reason` string, nullable, required
  - `advisories` object[], required
    - `code` string, nullable, required
    - `severity` string, nullable, required
    - `headline` string, nullable, required
    - `cause` string, nullable, required
    - `effect` string, nullable, required
    - `remedy` string, nullable, required
    - `worst_affected` object[]
      - `name` string, nullable, required
      - `coverage` number, nullable, required
      - `baseline_coverage` number, nullable, required
      - `delta` number, nullable, required
  - `state_index` union[], required
    - union
      - number
      - string
  - `state` object, required
    - `state_fips` string, required
    - `state` string, required
    - `counties` integer, required
    - `parcels` number, required
    - `rollup_parcels` number, required
    - `share_of_national` number, required
    - `coverage` object, required
      - `address` number, required
      - `geocode` number, required
      - `owner` number, required
      - `value` number, required
      - `geometry` number, required
    - `last_analyze` string, required
    - `worst_gaps` object[], required
      - `name` string, nullable, required
      - `label` string, nullable, required
      - `national` number, nullable, required
      - `state` number, nullable, required
      - `section` string, nullable, required
  - `field_count` integer, required: Number of field entries returned after filters.
  - `fields` object[], required: The field dictionary: one entry per serving column with name, label, section, grain, tier, national (and optional per-state) coverage, and honesty flags.
    - `name` string, nullable, required
    - `type` string, nullable, required
    - `section` string, nullable, required
    - `grain` string, nullable, required
    - `category` string, nullable, required
    - `sellable` boolean, nullable, required
    - `label` string, nullable, required
    - `description` string, nullable, required
    - `source` string, nullable, required
    - `curated` boolean, nullable, required
    - `coverage` number, nullable, required
    - `tier` string, nullable, required
    - `baseline_coverage` number, nullable, required
    - `coverage_delta` number, nullable, required
    - `states_measured` number, nullable, required
    - `states_with_any_coverage` number, nullable, required
    - `n_distinct` number, nullable, required
    - `flags` string[], required
    - `red_cell` boolean, nullable, required
    - `headline_eligible` boolean, nullable, required
    - `curation_review_required` boolean, nullable, required
    - `source_as_of` string, nullable, required
    - `source_as_of_basis` string, required
    - `catalog_published_at` string, nullable, required
    - `catalog_generated_at` string, nullable, required
    - `source_label_basis` string, required
    - `grain_basis` string, required
    - `catalog_description` string, nullable, required
    - `historical_advisories` unknown[], required
      - unknown
    - `state_coverage` number, nullable, required

## Other responses

- `400`: Invalid filter (unknown state/tier/grain, or min_coverage out of range).
- `401`: Missing, malformed or invalid credential.
- `405`: The endpoint exists but does not support this method. `Allow` lists the methods it does.
- `429`: Rate limit exceeded.
- `500`: Unexpected server error. The body never carries database or driver text.

---

[API](https://skmtc.dev/propraven/apis/propraven-api.md) · [All operations](https://skmtc.dev/propraven/apis/propraven-api/llms.txt) · [OpenAPI document](https://skmtc.dev/propraven/apis/propraven-api/revisions/37f8158c4eda?raw)
