---
title: "Port disruption pulse"
method: GET
path: "/api/v2/maritime/port-pulse"
tags: ["Maritime"]
---

# Port disruption pulse

`GET /api/v2/maritime/port-pulse`

Port-level disruption intelligence — geo-fuses the WPI ports reference with GDELT events near each port (within `event_radius_km` over the last `days`): relevant-event volume, conflict signal, a 7d-vs-baseline anomaly ratio, recent headlines, nearby flagged-energy-asset exposure, and AIS-coverage context. Scope by country, terminal type, name, or proximity; with no scope it defaults to strategic ports (LNG/oil terminals + large harbors). Requires a plan with Maritime intelligence access (`can_use_maritime`) — the Corporate & Supply Chain plan and above.

Each row scores a `pulse_level` (critical / elevated / active / quiet) and rows are risk-ranked. Envelope: `{ success, data, summary, applied_filters }`.

## Query parameters

- `country` string
- `search` string
- `lng_terminal` boolean
- `oil_terminal` boolean
- `near` string
- `near_gem_id` string
- `radius_km` number
- `days` integer
- `event_radius_km` number
- `limit` integer

## Response `200`

Risk-ranked ports with their pulse. Each row: port_id, name, unlocode, country, lat, lon, harbor_size, lng_terminal / oil_terminal, relevant_events, conflict_events, events_last_7d, anomaly_ratio, energy_exposure, pulse_level, ais_coverage, and up to 3 recent_events. A summary block totals the window.

- object
  - `success` boolean
  - `data` object[]
    - `port_id` string
    - `name` string
    - `unlocode` string, nullable
    - `country` string
    - `country_name` string
    - `lat` number
    - `lon` number
    - `harbor_size` string
    - `lng_terminal` boolean
    - `oil_terminal` boolean
    - `relevant_events` integer
    - `conflict_events` integer
    - `events_last_7d` integer
    - `anomaly_ratio` number, nullable — Last-7d event volume vs the windowed weekly baseline; null when there is no baseline.
    - `energy_exposure` object
      - `assets_nearby` integer
      - `state_owned` integer
      - `sanctions` integer
      - `china` integer
    - `pulse_level` 'critical' | 'elevated' | 'active' | 'quiet'
    - `ais_coverage` string
    - `recent_events` object[]
      - `headline` string
      - `family` string
      - `event_date` string
      - `distance_km` integer
      - `cluster_id` string
      - `cluster_date` string
  - `summary` object
    - `ports` integer
    - `window_days` integer
    - `event_radius_km` number
    - `ports_with_conflict` integer
    - `ports_active` integer
  - `applied_filters` object
    - `country` string
    - `days` integer
    - `event_radius_km` number
    - `ignored` object

## Other responses

- `401` — Missing/invalid API key
- `403` — Plan required (PLAN_REQUIRED) — the caller's plan does not carry the required source entitlement.
- `500` — Server error

---

[API](https://skmtc.net/gdeltcloud/apis/gdelt-cloud-api-v2.md) · [All operations](https://skmtc.net/gdeltcloud/apis/gdelt-cloud-api-v2/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/gdeltcloud/gdelt-cloud-api-v2/revisions/01aaa6255180/schema)
