One API for
the entire ocean.
Every layer of the SeaSignals dataset uses the same conventions: GeoJSON in and out, ISO 8601 time, shared entity IDs, and a single join parameter to combine layers.
# Sea state + nearby vessels for a point curl https://seasignals.com/v1/ocean/point \ -H "Authorization: Bearer $SS_KEY" \ -G -d lat=51.95 -d lon=3.9 \ -d layers=waves,wind,vessels,storms \ -d radius_nm=25
import os, requests snap = requests.get( "https://seasignals.com/v1/ocean/point", headers={"Authorization": f"Bearer {os.environ['SS_KEY']}"}, params={"lat": 51.95, "lon": 3.9, "radius_nm": 25, "layers": "waves,wind,vessels,storms"}, ).json() print(snap["waves"]["hs_m"], len(snap["features"]))
const url = new URL("https://seasignals.com/v1/ocean/point"); url.search = new URLSearchParams({ lat: 51.95, lon: 3.9, radius_nm: 25, layers: "waves,wind,vessels,storms", }); const snap = await (await fetch(url, { headers: { Authorization: `Bearer ${process.env.SS_KEY}` }, })).json();
{
"type": "FeatureCollection",
"time": "2026-10-26T14:00:00Z",
"cell": "h3:861969d97ffffff",
"waves": { "hs_m": 2.4, "tp_s": 9.1, "dir_deg": 305 },
"wind": { "speed_kn": 18, "dir_deg": 40 },
"storms": [],
"features": [
{ "id": "vessel:mmsi:244123456",
"geometry": { "type": "Point", "coordinates": [3.82, 51.97] },
"properties": { "sog_kn": 11.2, "type": "container",
"next_port": "port:NLRTM" } }
],
"provenance": { "waves": { "source": "model+buoy", "confidence": 0.92 } }
}
Same structure, every layer
Responses are standard GeoJSON with the extras you'll want: grid cell, timestamp, typed IDs that link layers together, and provenance on every block.
- Typed IDs:
vessel:,port:,storm:,buoy:,taxon: - Time travel: add
as_of=to any request to get historical state - Units in the name:
_m,_kn,_deg, so there's no guessing
The API at a glance
Live in the free trial. Endpoints marked Soon are on the roadmap. Errors come back as {"error": {"code", "message"}}, and every response carries X-RateLimit-* headers.
/v1/ocean/pointEverything known about one location, across all layers/v1/ocean/areaLayers aggregated over a polygon or grid cells Soon/v1/vesselsVessels by bbox or point + radius_nm, filtered by type, status or name q/v1/vessels/{id}/trackTrack between from and to, with join=waves for sea state along the way/v1/storms/activeActive systems with forecast cones and wind radii/v1/waves/forecastHourly wave and wind forecast for a point or a route of up to 20 waypoints/v1/ports/{locode}/congestionQueue, dwell and anchorage metrics over time/v1/portsPorts with UN/LOCODE ids and whether they're in live AIS coverage/v1/coverageCovered regions, sources, licences and feed freshness (no key needed)/v1/wildlife/sightingsCetacean, shark and turtle records by area, group and since date/v1/alertsCreate geofence, threshold and proximity alerts Soon/v1/streamLive feed of positions, advisories and events SoonEverything you need to build on the sea
Coming after the REST API, in roughly this order. Tell us which one you need first: info@seasignals.com.
Live streams
Subscribe by area, entity or event type over WebSocket or SSE. Positions arrive within seconds.
Alerts & webhooks
"Vessel enters zone", "storm within 200 nm of port", "Hs above 3 m on my route". Delivered to your endpoint.
Bulk & warehouse
Partitioned Parquet history, delivered to S3/GCS or shared directly into your data warehouse.
SDKs
Typed clients for Python and TypeScript, with pandas/GeoPandas helpers and map-ready output.
Embeddable widgets
Drop-in port status, buoy conditions and storm tracker widgets for your own site.
MCP server for AI agents
Give AI assistants direct, structured access to ocean conditions, vessels and events.
Start building on the ocean
Free trial keys include all five layers, 1,000 requests a day and 14 days of history.