curl --request GET \
--url https://gdeltcloud.com/api/v2/maritime/activity \
--header 'Authorization: Bearer <token>'import requests
url = "https://gdeltcloud.com/api/v2/maritime/activity"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://gdeltcloud.com/api/v2/maritime/activity', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"success": true,
"bucket": "day",
"data": [
{
"bucket": "2026-06-14 00:00:00",
"vessels": 318,
"positions": 24117,
"moving_positions": 19842,
"avg_sog": 8.7,
"max_sog": 22.4
},
{
"bucket": "2026-06-13 00:00:00",
"vessels": 341,
"positions": 26508,
"moving_positions": 21733,
"avg_sog": 9.1,
"max_sog": 23.8
}
],
"pagination": {
"limit": 200,
"cursor": null,
"next_cursor": null
},
"applied_filters": {
"date_start": "2026-06-01",
"date_end": "2026-06-14",
"chokepoint": "hormuz",
"bucket": "day",
"ignored": {}
}
}{
"success": false,
"error": "<string>",
"code": "<string>",
"details": {}
}{
"success": false,
"error": "<string>",
"code": "<string>",
"details": {}
}{
"success": false,
"error": "<string>",
"code": "<string>",
"details": {}
}{
"success": false,
"error": "<string>",
"code": "<string>",
"details": {}
}Area activity over time
Aggregate vessel activity over an area, bucketed by hour or day — distinct vessels, total + moving positions, and average/max speed per bucket. Generalizes /transits to arbitrary geography (chokepoint, bounding box, or proximity). The “is this area’s traffic anomalous vs the baseline” view. Requires a plan with Maritime intelligence access (can_use_maritime) — see Pricing for the plans that include it.
Historical / baseline surface: reads raw AIS positions directly (not the derived rollups). Forward-accruing: positions begin at launch (June 2026) — no historical backfill. Terrestrial AIS only (no satellite). Date windows are capped at 30 days; defaults to the trailing 14 days. Bucket auto-selects hour for spans ≤2 days, otherwise day.
curl --request GET \
--url https://gdeltcloud.com/api/v2/maritime/activity \
--header 'Authorization: Bearer <token>'import requests
url = "https://gdeltcloud.com/api/v2/maritime/activity"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://gdeltcloud.com/api/v2/maritime/activity', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"success": true,
"bucket": "day",
"data": [
{
"bucket": "2026-06-14 00:00:00",
"vessels": 318,
"positions": 24117,
"moving_positions": 19842,
"avg_sog": 8.7,
"max_sog": 22.4
},
{
"bucket": "2026-06-13 00:00:00",
"vessels": 341,
"positions": 26508,
"moving_positions": 21733,
"avg_sog": 9.1,
"max_sog": 23.8
}
],
"pagination": {
"limit": 200,
"cursor": null,
"next_cursor": null
},
"applied_filters": {
"date_start": "2026-06-01",
"date_end": "2026-06-14",
"chokepoint": "hormuz",
"bucket": "day",
"ignored": {}
}
}{
"success": false,
"error": "<string>",
"code": "<string>",
"details": {}
}{
"success": false,
"error": "<string>",
"code": "<string>",
"details": {}
}{
"success": false,
"error": "<string>",
"code": "<string>",
"details": {}
}{
"success": false,
"error": "<string>",
"code": "<string>",
"details": {}
}Authorizations
GDELT Cloud API key. Send as Authorization: Bearer gdelt_sk_....
Query Parameters
Restrict to one chokepoint. Omit to use bbox / near / near_gem_id, or for global. Full value list: https://docs.gdeltcloud.com/reference/enums#chokepoint
hormuz, bab_el_mandeb, malacca, suez, panama, bosphorus, gibraltar, dover, kerch, taiwan, danish_straits Bounding box filter: minLon,minLat,maxLon,maxLat (lon-first axis order, e.g. 56,26,57,27).
Point 'lat,lon' for a radius area; combine with radius_km (default 50 km). Format: lat,lon — pass the radius separately in radius_km.
"51.5,-0.12"
GEM energy-asset gem_id center — traffic within radius_km of that LNG terminal / platform (default 25 km). The cross-source 'traffic near energy infrastructure' join.
Radius in km for near / near_gem_id. Default 50 (near) or 25 (near_gem_id); clamped 1–2000.
Time bucket. Auto-selects hour for spans ≤2 days, otherwise day. Full value list: https://docs.gdeltcloud.com/reference/enums#maritime_activity_bucket
hour, day Window start YYYY-MM-DD (≤30-day window).
Window end YYYY-MM-DD.
Trailing N-day window (1–30). Defaults to 14.
1 <= x <= 30Buckets per page (1–1000).
1 <= x <= 1000Response
Bucketed activity, most recent first. Envelope: { success, bucket ('hour'|'day'), data, pagination, applied_filters }. Each data row: bucket (timestamp), vessels (distinct mmsi), positions (AIS message count), moving_positions (sog > 1), avg_sog, max_sog (knots).

