---
title: "Local (crowd-observed) shelf prices near a point (SA-0164)"
method: GET
path: "/api/v1/public/catalog/local-prices"
tags: ["Stores"]
---

# Local (crowd-observed) shelf prices near a point (SA-0164)

`GET /api/v1/public/catalog/local-prices`

## Request

- Base URL: `https://api.shelfatlas.com`
- URL: `https://api.shelfatlas.com/api/v1/public/catalog/local-prices`
- Auth: HTTP bearer

The radius-wide sibling of `/stores/{id}/local-prices`: the latest APPROVED, non-outlier observation per (store, product) that carries a price, at any active store within radius_km of lat/lng — newest first. Same data-separation as the per-store route: never a CatalogOffer, never mixed with discount prices. `summary` gives the same-radius proof-line counts: `today` (since local Copenhagen midnight) prices/stores, `week` (rolling 7 days) prices/contributors — contributors is a COUNT only, never a reporter id. Open to any catalog key — no coverage-package grant required. RAW facts only: `observedAt` carries no server-computed age (the response is CDN-cached).

## Query parameters

- `lat` number, required
- `lng` number, required
- `radius_km` number
- `limit` integer

## Response `200`

Nearby local observed prices plus the radius summary.

- object
  - `ok` true, required
  - `data` NearbyLocalPrices, required
    - `items` object[], required
      - `ean` string, required
      - `label` string, nullable, required: Curated product name, or null when the ean is not a known product.
      - `priceCents` integer, required: Shelf price in øre (DKK×100) as observed.
      - `stockStatus` 'in_stock' | 'low_stock' | 'out_of_stock' | 'null', nullable, required
      - `observedAt` string, date-time, required: When the shelf was seen — a raw fact, no server-computed age.
      - `trust` 'partner' | 'established' | 'new', required: Source class — never the reporter identity.
      - `store` object, required
        - `id` string, uuid, required
        - `name` string, required
        - `chainSlug` string, required
        - `chainName` string, required
      - `distanceKm` number, required: Great-circle distance from lat/lng, rounded to 0.1 km.
    - `summary` object, required: Same-radius proof-line counts (design 2026-09-23 §1, §2 layer 5).
      - `today` object, required: Since local Copenhagen midnight.
        - `prices` integer, required
        - `stores` integer, required: Distinct stores with at least one price seen today.
      - `week` object, required: Rolling last 7 days.
        - `prices` integer, required
        - `contributors` integer, required: Distinct contributors (count only — never a reporter id).

## Other responses

- `400`: Invalid parameters (`invalid_params`, `incompatible_params`).
- `401`: Missing, invalid, or revoked API key (`missing_api_key` / `invalid_api_key` / `revoked_api_key`).
- `429`: Rate limit or monthly limit reached (`rate_limited` / `monthly_limit_reached`).
- `503`: Temporary backend failure (`service_unavailable`).

---

[API](https://skmtc.dev/shelfatlas/apis/shelfatlas-catalog-api.md) · [All operations](https://skmtc.dev/shelfatlas/apis/shelfatlas-catalog-api/llms.txt) · [OpenAPI document](https://skmtc.dev/shelfatlas/apis/shelfatlas-catalog-api/revisions/943a8773856b?raw)
