> For the complete documentation index, see [llms.txt](https://protectedseas.gitbook.io/navigator-api-docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://protectedseas.gitbook.io/navigator-api-docs/conventions/response-conventions.md).

# Response Conventions

* **Content type:** JSON (GeoJSON where boundaries are returned).
* **Character encoding:** UTF-8.
* **Languages:** The `lang` parameter selects a language for translated content on the Site Details endpoint. **It has no effect on Search**, which validates the parameter and returns `200` but always responds in English. See the [Search](/navigator-api-docs/api-reference/search.md) page for detail.

### **Value types**

* **Numbers are returned as JSON numbers.** Identifiers, codes, counts and measurements are typed — `"ogc_fid": 36432`, `"anchoring": 1`, `"total_area": 195.71`. Activity codes and LFP scores compare correctly with `===` / `==` against integers.
* **Booleans are returned as JSON booleans** (`true` / `false`), not as `0`/`1` codes or `"t"`/`"f"` strings. This applies to `subzone`, `children`, `display_simplified`, `region_report`, `is_multi_jurisdictional`, and `includes_multi_jurisdictional_areas`.
* **Identifiers stay strings**, even where they look numeric: `ps_id` is alphanumeric (e.g. `"AIHSMA126"`), `wdpa_id` may hold several identifiers separated by `"; "`, and `iucn_cat` is a category label (`"Ia"`, `"Unassigned"`).
* **Dates are ISO 8601 strings** (`YYYY-MM-DD`): `last_update`, `last_reviewed`, `last_stats_update`. They sort chronologically as strings and can be compared directly against the `changed_since` parameter without parsing.
* **`null` means "not recorded" and is never coerced.** For activity fields, `null` is *Not Yet Coded* and is meaningfully different from `0` (*Allowed*). Client code that treats a missing value as `0` will report regulations as permitted when they are simply unknown. Check for `null` explicitly rather than relying on truthiness.
* **Some fields hold multiple values in one string, separated by `"; "`.** These are strings, not JSON arrays — split on `"; "` to obtain the individual values. Fields using this convention are marked in the field reference. Note that commas may appear *within* an individual value and are not separators.
* `effective_from`, `effective_to` and `moratorium_reg_expiration_date` are free text, not dates — see [Site keys](/navigator-api-docs/field-reference/site-keys.md).
* Boundary coordinates are two-dimensional: each position is `[longitude, latitude]`.

### Boundary geometry

* Boundaries returned by the API are display geometries: for sites above 10,000 vertices they are simplified, with maximum deviation from the authoritative boundary bounded at 9.55 m or 2.39 m depending on the site's protection level. The `display_simplified` field indicates which sites this applies to. Polygon and ring counts are never changed by simplification, and area fields are always computed from the authoritative boundary. See [Site keys](/navigator-api-docs/field-reference/site-keys.md) for the full method.
* Polygon ring winding follows the right-hand rule (exterior rings clockwise, interior rings counter-clockwise) across all boundary endpoints. Note this is the shapefile convention rather than RFC 7946's, which specifies the opposite. Most GeoJSON consumers determine interiors from ring nesting and ignore winding entirely.

### Versioning

* Region and site records include version fields such as `site_major_version`, `site_minor_version`, `region_version`, and `region_stats_version`.
* `last_reviewed` records when the site's **regulatory content** was last verified against its source regulation. It is not advanced by data corrections, geometry changes, or schema work — only by legal review. A review that confirms the existing coding without changing it still advances `last_reviewed`, so `last_reviewed` can be newer than `last_update`.
* Use `last_update` to [synchronize](/navigator-api-docs/conventions/data-synchronization.md); use `last_reviewed` to assess how current the regulatory information is.
