# Centros y zonas

> Un centro es una planta del cliente. Sus zonas y puntos de reunión llegan en GeoJSON, y su nivel de privacidad decide qué posiciones ve la API.

Página: https://safeonuba.com/desarrolladores/conceptos/centros · API de SafeOnuba v1 (`api_version: "2026-09-24"`), en vista previa: el contrato puede cambiar.

Un **centro** es una planta, un emplazamiento con su recinto, sus zonas y sus puntos de reunión. Tu cliente puede tener uno o varios, y todo lo demás cuelga de ellos: cada alerta, cada evacuación y cada evento lleva el suyo.

## Centros

`GET /v1/sites` devuelve los centros a los que tiene acceso tu cliente. Vale con cualquier scope.

| Campo | Qué es |
| --- | --- |
| `id` | UUID del centro. Es el que usas en los filtros `site_id`. |
| `name` | Nombre del centro. |
| `location` | Ubicación en texto, o `null`. |
| `privacy_mode` | Nivel de privacidad de la planta. Decide qué posiciones ve la API. |
| `unveil_min_severity` | En «Solo en emergencia», la gravedad mínima de una alerta a partir de la cual se ve la posición de esa persona. |

| privacy_mode | Qué significa |
| --- | --- |
| `continuous` | La planta ve las posiciones de forma continua, y la API también. |
| `on_demand` | «Solo en emergencia», el valor de serie. La posición de una persona solo se ve con una alerta abierta desde `unveil_min_severity`, durante una evacuación o con una solicitud aprobada. |

La API obedece la misma regla que el panel. Lo cuenta con detalle [Posiciones](https://safeonuba.com/desarrolladores/conceptos/posiciones).

## Zonas y puntos de reunión

`GET /v1/sites/{id}/zones` devuelve las zonas en vigor de un centro. Pide `alerts:read`.

Cada zona trae su geometría como polígono **GeoJSON en WGS84** (`geometry.type: "Polygon"`), así que se puede pintar directamente sobre el plano o el mapa de tu sala.

| type | Qué significa |
| --- | --- |
| `work_area` | Zona de trabajo. |
| `restricted` | Zona restringida. Entrar genera una alerta `restricted_zone_entry`. |
| `forbidden` | Zona prohibida. Entrar genera una alerta `forbidden_zone_entry`. |
| `assembly_point` | Punto de reunión de una evacuación. Trae además el objeto `assembly_point`. |
| `privacy` | Zona de privacidad, como vestuarios o comedores. Llega con nombre y tipo, pero sin geometría (`geometry: null`). |
| `building` | Edificio. |

### Zonas de privacidad

Dentro de una zona de privacidad no se registra la posición de nadie. La API da su nombre y su tipo, pero no su polígono.

### Puntos de reunión

Las zonas de tipo `assembly_point` llevan además:

| Campo | Qué es |
| --- | --- |
| `serves` | Para qué evacuaciones vale: `general`, `tsunami`, `earthquake`. |
| `elevation_m` | Cota en metros, o `null`. |
| `elevation_source` | De dónde sale la cota: `dem` o `verified`. |
| `vertical` | `true` si es un refugio en altura, dentro de un edificio. |
| `capacity` | Aforo, o `null`. |

Durante una evacuación, la sala puede descartar puntos de reunión. Eso no cambia las zonas: se ve en la propia evacuación (ver [Evacuaciones y recuento](https://safeonuba.com/desarrolladores/conceptos/evacuaciones#puntos-de-reunion)).

## Filtrar por centro

Si tu sala solo cubre una planta, filtra por ella en vez de recibirlo todo:

- En las listas, con el parámetro `site_id` (`/v1/alerts`, `/v1/musters`, `/v1/workers`, `/v1/devices`, `/v1/positions/latest`).
- En los webhooks, con `filters.site_ids` al crear el destino (ver [Webhooks](https://safeonuba.com/desarrolladores/webhooks#filtros)).

Pedir un centro que no es de tu cliente da `403` o `404`, según la ruta.
