---
title: "Public Site"
method: GET
path: "/api/v1/search/site/{site_id}"
---

# Public Site

`GET /api/v1/search/site/{site_id}`

## 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/site/{site_id}`
- Auth: one of:
  - API key in header `X-Access-Token`
  - HTTP bearer

## Path parameters

- `site_id` string, uuid, required

## Query parameters

- `start_date` string, date, nullable

## Response `200`

Successful Response

- PublicSiteResponse
  - `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
  - `id` string, uuid, required
  - `name` string, required
  - `address_line` string, required
  - `city` string, required
  - `country_code` string, required
  - `lat` number, required
  - `lng` number, required
  - `description` string, nullable, required
  - `access_rules` string, nullable, required
  - `amenities` string[], required
  - `photos` PhotoRef[], required
    - `id` string, uuid, required
    - `url` string, required
    - `position` integer, required
    - `draft` boolean
  - `plans` PublicPlan[], required
    - `id` string, uuid, required
    - `name` string, required
    - `level` integer, required
    - `width_m` number, required
    - `depth_m` number, required
    - `designed_height_m` number, required
    - `units` PublicUnit[], required
      - `id` string, uuid, required
      - `label` string, required
      - `x_m` number, required
      - `y_m` number, required
      - `width_m` number, required
      - `depth_m` number, required
      - `rotation` integer, required
      - `area_m2` number, required
      - `unit_type` string, required
      - `size_class_m2` integer, required
      - `price_month_cents` integer, nullable, required
      - `currency` string, required
      - `features` string[], required
      - `availability` string, required
      - `effective_width_m` number, required
      - `effective_depth_m` number, required
      - `effective_area_m2` number, required
      - `effective_height_m` number, required
      - `dimension_source` string, required
      - `dimension_verified_at` string, date-time, nullable, required
    - `obstacles` ObstacleResponse[], required
      - `id` string, uuid, required
      - `kind` string, required
      - `x_m` number, required
      - `y_m` number, required
      - `width_m` number, required
      - `depth_m` number, required
      - `rotation` integer, required
  - `self_serve_booking` boolean
  - `min_term_months` integer
  - `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

## 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)
