> ## Documentation Index
> Fetch the complete documentation index at: https://docs.axiomancer.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Ports

> List monitored Overwatch ports and query port events across all verticals — vessel arrivals, departures, berth holds, and disruption signals by UNLOCODE.

List monitored ports and query port events across all verticals.

## `GET` `/api/v1/ports`

List all monitored ports with slug, name, country, and region.

**Response**

```json theme={null}
{ "ports": [...] }
```

**Example**

```bash theme={null}
curl -X GET \
  https://axiomoverwatch.io/api/v1/ports
```

## Port events

Port events represent arrivals, departures, berth assignments, and other vessel activity recorded at monitored ports. Each port event carries the full [APRS envelope](/locus/data-standards) plus these domain-specific fields:

| Field       | Type   | Description                                                                                                                                 |
| ----------- | ------ | ------------------------------------------------------------------------------------------------------------------------------------------- |
| `mmsi`      | `text` | 9-digit Maritime Mobile Service Identity of the vessel. Use this to join port events to vessel records or cross-reference identity changes. |
| `h3_index`  | `text` | H3 cell at resolution 8 for the event location.                                                                                             |
| `record_id` | `text` | Stable APRS URN for deduplication and audit trails.                                                                                         |

You can query port events through the `codex_compliance_summary` view to verify envelope coverage, or join them directly to vessel data using `mmsi`:

```sql theme={null}
-- Port events for a vessel, joined to the vessel registry
select pe.*, v.name, v.flag, v.vessel_type
from port_events pe
join vessels v on v.mmsi = pe.mmsi
where pe.mmsi = '211331640'
order by pe.occurred_at desc;
```

<Tip>
  The `mmsi` column is indexed with a partial index on non-null values, so vessel-scoped queries against `port_events` are efficient even on large datasets.
</Tip>

## `GET` `/api/v1/health`

System health check. Returns position counts and ingestion status.

**Response**

```json theme={null}
{ "status", "positions", "vessels", "positions_last_hour" }
```

**Example**

```bash theme={null}
curl -X GET \
  https://axiomoverwatch.io/api/v1/health
```
