---
title: "Patch Site"
method: PATCH
path: "/api/v1/sites/{site_id}"
---

# Patch Site

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

Change what a centre says. Every fact written is recorded as supplied
by the operator, today.

A new address is applied at once on a centre that has never been public.
On one that has, the pin does not move: the answer is **202** with the
proposal in `address_change`, and an admin decides. Everything else in the
same call is written.

On a centre the operator claimed and an admin has not decided, nothing is
written on the centre: the body is validated and kept as a draft, which
the answer shows over the public facts with `draft: true`.

## Path parameters

- `site_id` string, uuid, required

## Request body

- SitePatchRequest: What an operator changes about a centre. A field left out is left as it is. Of the fields added on 10 October 2026, the ones that can be empty (`brand_label`, `phone`, `website`, `contact_email`, the declared sizes, `postcode`, `province`, `operator_reference`) are cleared by sending `null`; the four older ones keep reading `null` as "unchanged". `website` and `contact_email` are stored and linked, never requested (SSRF-1). The address is one group: any of its four fields is a change of address, applied at once on a centre that has never been public and held for an admin on one that has.
  - `description` string, nullable
  - `access_rules` string, nullable
  - `amenities` 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
  - `name` string, nullable
  - `brand_label` string, nullable
  - `phone` string, nullable
  - `website` string, nullable
  - `contact_email` string, email, nullable
  - `declared_min_m2` union
    - number
    - string
  - `declared_max_m2` union
    - number
    - string
  - `min_term_months` integer, nullable
  - `notice_period_days` integer, nullable
  - `grace_period_days` integer, nullable
  - `price_unit` 'm2' | 'm3', nullable
  - `operator_reference` string, nullable
  - `address_line` string, nullable
  - `city` string, nullable
  - `postcode` string, nullable
  - `province` string, nullable

## Response `200`

Successful Response

- SiteResponse
  - `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
  - `min_term_months` integer, required
  - `notice_period_days` integer, required
  - `grace_period_days` integer, required
  - `published` boolean, required
  - `unit_count` integer
  - `cover_photo_url` 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
  - `slug` string, required
  - `public_path` string, required
  - `category` 'self_storage' | 'container_yard' | 'mover_depository', required
  - `price_unit` 'm2' | 'm3', required
  - `listing_rung` integer, required
  - `brand_label` string, nullable
  - `postcode` string, nullable
  - `province` string, nullable
  - `phone` string, nullable
  - `website` string, nullable
  - `contact_email` string, nullable
  - `declared_min_m2` number, nullable
  - `declared_max_m2` number, nullable
  - `operator_reference` string, nullable
  - `address_change` AddressChange: A new address waiting for an admin, as the operator's page and the admin's read it.
    - `address_line` string, required
    - `city` string, required
    - `postcode` string, nullable
    - `province` string, nullable
    - `lat` number, required
    - `lng` number, required
    - `requested_at` string, date-time, required
  - `claim_status` string, nullable
  - `claim_id` string, uuid, nullable
  - `draft` boolean
  - `signage_required` boolean
  - `signage_code` string, nullable
  - `signage_uploaded` boolean

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