---
title: "Search Area"
method: GET
path: "/api/v1/search/area"
---

# Search Area

`GET /api/v1/search/area`

## Request

- Base URL: `https://trovastorage.it` (the document declares no server; this is the origin it was published from)
- URL: `https://trovastorage.it/api/v1/search/area`
- Auth: one of:
  - API key in header `X-Access-Token`
  - HTTP bearer

Centres inside the map's rectangle (M7) — the question a map asks.

`lat`/`lng` are the point distances are measured from (an address the
customer typed); without them, the middle of the rectangle. `radius_km`
then narrows the rectangle to a circle around that point. Nearest first,
at most `SEARCH_MAX_RESULTS`, and `truncated` says when there were more.

## Query parameters

- `min_lat` number, required
- `max_lat` number, required
- `min_lng` number, required
- `max_lng` number, required
- `lat` number, nullable
- `lng` number, nullable
- `radius_km` number, nullable
- `min_m2` number, nullable
- `max_m2` number, nullable
- `max_price_cents` integer, nullable
- `features` string[]
- `amenities` string[]
- `operators` string[]
- `available` boolean
- `category` string, nullable

## Response `200`

Successful Response

- SearchAreaResponse: `GET /search/area` (M7). An envelope rather than a bare list, because a map has to know when it is not seeing everything in the rectangle.
  - `results` SearchResultItem[], required
    - `slug` string, required
    - `public_path` string, required
    - `category` 'self_storage' | 'container_yard' | 'mover_depository', required
    - `price_unit` 'm2' | 'm3', required
    - `listing_rung` integer, required
    - `listing_status` 'unmanaged' | 'confirmed' | 'managed', required
    - `confirmed_on` string, date, nullable
    - `postcode` string, nullable
    - `province` string, nullable
    - `phone` string, nullable
    - `website` string, nullable
    - `from_price` FromPrice: The lowest price an operator publishes, as published: never converted, and never without where and when it was read (M2).
      - `cents` integer, required
      - `period` string, required
      - `basis` string, required
      - `vat_included` boolean, nullable
      - `insurance_included` string, required
      - `source_url` string, nullable
      - `checked_on` string, date, required
    - `field_sources` FieldSource[]
      - `field` string, required
      - `source_kind` string, required
      - `source_url` string, nullable
      - `checked_on` string, date, required
    - `size_availability` SizeAvailability[]
      - `size` 'small' | 'medium' | 'large', required
      - `min_m2` integer, required
      - `max_m2` integer, nullable, required
      - `status` 'available' | 'limited' | 'full', nullable, required
    - `availability_updated_at` string, date-time, nullable
    - `site_id` string, uuid, required
    - `name` string, required
    - `address_line` string, required
    - `city` string, required
    - `country_code` string, required
    - `lat` number, required
    - `lng` number, required
    - `distance_km` number, required
    - `starting_price_cents` integer, nullable, required
    - `available_unit_count` integer, nullable, required
    - `size_classes` integer[], required
    - `amenities` string[], required
    - `cover_photo_url` string, nullable
    - `self_serve_booking` boolean
    - `size_unknown` boolean
    - `operator` ListingOperator, required: Whose centre this is, on every card and centre page (M7). Until M7 nothing public said whose a centre was — the search carried no operator at all, because there was only ever one on the map. `manages_listing` is what the page needs to know it is looking at a listing read off a competitor's website rather than at inventory somebody is selling.
      - `slug` string, required
      - `business_name` string, required
      - `legal_name` string, nullable
      - `manages_listing` boolean, required
      - `has_specialist` boolean, required
      - `publishes_public_prices` boolean, required
      - `logo_url` string, nullable
      - `accent_colour` string, nullable
    - `opening_hours` OpeningHours: When a centre is staffed and when a customer can get in (0017). `None` and `[]` are different answers and the difference is the point: `office: None` means the operator does not publish office hours, `office: []` means there are no fixed ones — by appointment, or no staffed office. A card that turns "we do not know" into "closed" says something false about a real business.
      - `office` OpeningInterval[], nullable
        - `days` integer[], required
        - `opens` string, required
        - `closes` string, required
      - `access` OpeningInterval[], nullable
        - `days` integer[], required
        - `opens` string, required
        - `closes` string, required
      - `access_24_7` boolean
    - `declared_min_m2` number, nullable
    - `declared_max_m2` number, nullable
    - `declared_from_price_cents` integer, nullable
    - `source_url` string, nullable
    - `source_checked_on` string, date, nullable
  - `truncated` boolean, required
  - `max_results` integer, required

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/trovastorage/apis/stock-your-inventory.md) · [All operations](https://skmtc.dev/trovastorage/apis/stock-your-inventory/llms.txt) · [OpenAPI document](https://skmtc.dev/trovastorage/apis/stock-your-inventory/revisions/c75f591a585c?raw)
