Maritime Navigation API
Programmatic access to NAVAREA and coastal warnings. Subscription REST is under /api/v1/ with header X-API-Token. Higher tiers unlock coordinates, keyword maps, the archive in bulk, and advanced filters.
Developers: sign in with GitHub and a Developer key is on your API tab in ten seconds, with 2,000 requests free on active warnings. Archives and the full analysis come with the paid plans.
Send a route, get the NAVAREAs and the warnings along it: POST /api/v2/route/ with a route file (RTZ, GPX, KML, CSV...) or JSON waypoints; the same at /api/v2/drop/<token>/route/ for tools that can only drop a file. Section 15 of the README has the calls.
v3: integrate from GitHub
Developers overviewEverything to connect is in one public repository: the OpenAPI specification, the data models, Python and JavaScript clients, an MCP server for Claude, Cursor, VS Code, Windsurf and Zed, and a GitHub Action that checks a route against the warnings in force. The endpoints stay the ones below; the kit is the way in.
- Editors and agents: add the MCP server and ask in plain words; the tools are search_warnings, warnings_near, route_check, navareas and feeds.
- Code:
python/sealagom.pyandjs/sealagom.mjs, no dependencies beyond requests or fetch; generate any other language fromopenapi.yaml. - No-code and agents: import sealagom.com/openapi.json into n8n, Make, Zapier, Pipedream, Postman, ChatGPT actions or LangChain. Send the key as
X-API-TokenorAuthorization: Bearer. - Routes:
POST /api/v2/route/with a route file or waypoints, or the drop link/api/v2/drop/<key>/route/for tools that can only POST a file. - Sky view:
GET /api/v2/sky/link/?vessel=(ormmsi,warningandregion,port,locode,latandlon) gives a ready link that stands there in the sky view;POST /api/v2/sky/route/takes a route and gives its sky link, drawn on the sea, with the RTZ and GPX. Section 20 of the README has the calls. Not for navigation. - CI: the Action fails a build when a critical warning lies on a route kept in the repository.
- Scripts and agents paying for themselves:
POST /api/agent/checkout/, crypto, the key once paid (in the profile when the e-mail already has an account).
Getting started
- Pick a plan on contributor plans.
- Create an API token under Profile → API.
- Send
X-API-Tokenon every/api/v1/call. - Respect pagination and token usage on list endpoints.
API subscription plans
Upgrade to API Default for raw text and coordinates, to Full API for structured geometry (geo_features), or contact us for a bespoke integration.
Free API tier
The API without a key: 100 calls a day, up to 50 warnings a call, for 3 days or 300 calls, whichever comes first.
When a quota is used, the API answers HTTP 402 with what was used, when it starts again and the links to pay at once: the checkout, crypto, or POST /api/agent/checkout/ from a script.
Signed in without an API plan, the same free tier counts on your account. The GitHub Developer allowance keeps its own requests.
Live messages only. No archived feed, coordinates, enhanced coordinates, keywords, webhooks, or advanced filters.
API Default
Unlimited requests, $20 first month, then $18 / month with auto-renew
- Unlimited API requests
- NAVAREA & Coastal live messages
- Archived messages access
- Raw message text and coordinates
- Webhook integration for real-time updates
Not included: geo_features (areas, circles, sectors, lanes, safety zones), analysis, keywords, or enhanced coordinate formats. Those need Full API.
Subscribe to API DefaultFull API
Unlimited requests, $100 first month, then $90 / month with auto-renew
- Unlimited API requests
- NAVAREA & Coastal live messages
- Archived messages access
- Coordinates (all formats: decimal, GeoJSON, DMS, Google Maps)
- geo_features: points, lines, lanes, areas, circles, sectors, displacement, safety zones
- analysis of every warning: summary, status, validity / expiry, hazards, recurring series
- Structured geometry in GeoJSON, CSV, Shapefile, WKT (ECDIS & KML full geometry on Contributor)
- Keyword map extraction
- Advanced filters (date, keyword, country, type, has_coordinates)
- Webhook integration for real-time updates
Custom API
Tailored to your needs; contact us
- Everything in Full API
- Custom response shapes & data formats
- Specific fields, structures, or spatial formats on request
- Dedicated support and integration guidance
- Enterprise or high-volume arrangements
- SLA and bespoke webhook payloads
Need something bespoke? Email contact@sealagom.com API responses can be customised to any format or spatial structure.
View current plans and subscribeInteractive request builder
Compose a GET URL and copy examples (cURL, Python, JavaScript, Java, Rust). Replace the token with yours.
Using the same parameters every time? Save them on the token itself with the API v2 builder on your profile, with a live preview.
Generated URL
https://www.sealagom.com/api/v1/navarea/?include_messages=truecurl -X GET "https://www.sealagom.com/api/v1/navarea/?include_messages=true" \
-H "X-API-Token: YOUR_API_TOKEN"Overview
Welcome to the SeaLag.om Maritime Navigation API!
This API provides programmatic access to NAVAREA and Coastal warnings essential for maritime safety and navigation.
Full API subscribers receive enhanced data including coordinates (multiple formats), keywords, the archive in bulk, and advanced filters. Need a custom format or spatial structure? Contact us for a tailored integration.
Responses are JSON list / detail shapes. Use page and page_size where supported.
Authentication
Send header X-API-Token: <token> on every /api/v1/ request. Missing or invalid tokens return 401 Unauthorized. Tokens are created in your profile; rotate or revoke from the same screen.
X-API-Token: YOUR_API_TOKENToken management
- GET /api/v1/tokens/ - list your tokens
- POST /api/v1/tokens/ - create a token
- POST /api/v1/tokens/{id}/regenerate/ - rotate (invalidates old value)
# List tokens
curl -X GET "https://www.sealagom.com/api/v1/tokens/" \
-H "Authorization: Bearer YOUR_JWT_TOKEN"
# Create a token
curl -X POST "https://www.sealagom.com/api/v1/tokens/" \
-H "Authorization: Bearer YOUR_JWT_TOKEN" \
-H "Content-Type: application/json" \
-d '{"name": "My API Token"}'
# Regenerate a token
curl -X POST "https://www.sealagom.com/api/v1/tokens/1/regenerate/" \
-H "Authorization: Bearer YOUR_JWT_TOKEN"API v2 and token settings
API v2 uses the same token, plans and request accounting as v1. Everything under /api/v1/ keeps working exactly as before, so existing integrations need no change. v2 adds:
- One list of every warning:
GET /api/v2/messages/, NAVAREA and coastal together, newest first, each message with its region, country and archive status. - Message filters on the region endpoints:
/api/v2/navarea/and/api/v2/coastal/answer like v1 and also applydate_from,date_to,keywordandhas_coordinatesto the messages they return. - Settings saved on each token: pick a token on Profile > API > API v2 builder, build the response with menus and a live preview, and save. Every /api/v2/ call with that token returns that shape; /api/v1/ calls ignore saved settings and answer exactly as before.
- prompt filter (Full API):describe the warnings a token should return in your own words, for example "only space debris warnings around the USA".
- Integrate: the kit on GitHub (OpenAPI spec, clients, MCP server, Action) is the way in; a README.md per token, with its settings, plan and every parameter and field, is there for any program that wants one file.
- Settings file:instead of ticking options, ask LagoPal (with the README) for a settings file: a small JSON file with the token's endpoint, parameters and prompt. Load it on Profile > API (Load settings file); it fills the builder so you can check the live preview before saving. Download settings file gives the current settings in the same form. JSON Schema:
/api/public/api-settings-schema/.
GET /api/v2/messages/
| Parameter | Plan | What it does |
|---|---|---|
| scope | All | navarea, coastal or all (default). |
| navarea_id | All | One or more NAVAREA ids (repeat or comma-separate). |
| coastal_id | All | One or more coastal region ids. |
| country | All | Country name, partial match (e.g. France). |
| q | All | Words in the warning text (original or English). |
| date_from, date_to | All | Added on or after / on or before, YYYY-MM-DD. |
| keyword | All | Keyword category or any word in the text; repeat for several. |
| has_coordinates | All | true: only warnings with positions. |
| include_locals | All | true: French local (AVURNAV) warnings too. |
| include_archived, only_archived | Paid API | Active and archived, or archived only. |
| status, message_class, station, lat, lon, radius_nm, bbox | All | Archive filters: in_force, cancelled or expired; the type; a NAVTEX station; a position with a radius in NM, or a box west,south,east,north. |
| include_coordinates | Paid API | Positions read from each warning. |
| include_enhanced_coordinates | Full API | Decimal, DMS, GeoJSON and map links for each position. |
| include_keywords | Full API | Keyword map per warning. |
| include_geo_features | Full API | Areas, circles, lines, lanes, sectors as GeoJSON. |
| include_ai_analysis | Full API | The analysis object per warning. |
| ai_severity | Full API | critical, high, moderate, low, info (repeat for several). |
| ai_category | Full API | category ids, e.g. firing_practice, piracy_or_security. |
| ai_status | Full API | Live status: active, scheduled, expired, withdrawn (archived), cancellation_notice, informational. |
| ai_in_force | Full API | true: only warnings in force right now. |
| expires_within_hours | Full API | Only warnings whose valid_until falls in the next N hours. |
| expires_after, expires_before | Full API | valid_until on or after / on or before a date (YYYY-MM-DD) or ISO time. |
| exclude_routine | Full API | true: leave out routine reports (ice reports, rig lists, in-force lists). |
| ai_has | Full API | Only analyses with: contacts, vessels, aids, keep_clear, time_windows, charts, hazards. |
| min_keep_clear_nm | Full API | Keep-clear distance of at least N nautical miles. |
| page, page_size | All | Default 50 per page; up to 200 on paid plans, 50 on free. |
| prompt_filter | Full API | off: ignore the token's prompt filter for this call. |
| topic | Full API | A feed: ice, military, space, cables, offshore, survey, hazards, aton, sar, security (see Themed feeds). |
| settings | All | off: ignore the token's saved settings for this call (a plain call). |
Fields or filters your plan does not include are left out and listed in meta.warnings, never an error.
content is the text as broadcast; content_en is the English text (the official English version or a machine translation) for sources that broadcast in another language, such as China or Turkey, and source_language names the original language.
The US Coast Guard Local Notices to Mariners (10 districts, updated weekly) are coastal regions titled US Coast Guard LNM, country US. They are not analysed, so their automatic fields are empty; each district also has one message, number LNMxx-DISCREPANCIES, listing its aids to navigation with a discrepancy.
curl "https://www.sealagom.com/api/v2/messages/?country=France&include_coordinates=true&include_ai_analysis=true" \
-H "X-API-Token: YOUR_API_TOKEN"
{
"count": 42,
"page": 1,
"page_size": 50,
"next": null,
"previous": null,
"results": [
{
"scope": "coastal",
"region_id": 57,
"region_title": "FRANCE Atlantic",
"country": "France",
"is_archived": false,
"archived_on": null,
"id": 90211,
"number": "AVURNAV 1234/26",
"content": "BAY OF BISCAY. DRIFTING BUOY ...",
"content_en": "BAY OF BISCAY. DRIFTING BUOY ...",
"source_language": "en",
"added_on": "2026-09-27T08:10:00Z",
"coordinates": ["45-10.0N 002-05.0W"],
"ai_analysis": { "headline": "...", "severity": "moderate", "valid_until": null }
}
]
}Settings saved on a token
- One token, one shape: each token keeps its own endpoint and parameters. Need a second shape (say France coastal with coordinates, and a worldwide feed)? Create a second token.
- Every option is shown, Full API ones included, with the plan each needs. Saving needs an active API plan.
- URL wins: any parameter you put in the URL replaces the saved value for that call;
?settings=offmakes a plain call. - Relative periods: "last 30 days" sends
date_fromas today minus 30 days on every call. - Responses carry an
X-API-Token-Settingsheader naming the token whose settings were applied.
Ice feed: GET /api/v2/ice/
- Every warning about ice at sea, from NAVAREA, coastal and NAVTEX sources: icebergs and iceberg limits, sea ice, ice edge, vessel icing and freezing spray, ice reports, icebreaker operations and ice navigation rules. An model reads each warning that mentions ice and keeps only those really about it, with its kind in
ice.type. - Positions, shapes (iceberg limit lines, ice areas) and the analysis are included by default.
?output=geojsonreturns a GeoJSON FeatureCollection, one feature per shape, ready for route checks and chart overlays. ice_typenarrows it: iceberg, sea_ice, ice_edge, icing, ice_report, icebreaker, ice_navigation, other_ice (repeat or comma-separate). Every /api/v2/messages/ parameter also works, and/api/v2/messages/?topic=iceis the same feed.- Full API plan, or an ice feed licence (annual, invoiced): contact us.
curl "https://www.sealagom.com/api/v2/ice/?output=geojson&ice_type=iceberg,ice_edge" -H "X-API-Token: YOUR_API_TOKEN"Themed feeds: GET /api/v2/feeds/<feed>/
- Ready-made feeds built from the category the analysis gives every warning: military exercises and firing, rocket launches and space debris, cable and pipeline work, offshore works and rigs, surveys, wrecks and drifting hazards, aids to navigation, search and rescue, security and restricted areas.
- Same output as the ice feed: positions, shapes and the analysis by default, the category in
feed.category,?output=geojsonfor a FeatureCollection and?category=to keep only some of a feed's categories. Every /api/v2/messages/ parameter also works, and/api/v2/messages/?topic=militaryis the same feed. - Only warnings with an analysis are included.
GET /api/v2/feeds/(no token needed) lists every feed with how many of its warnings are in force. - Full API plan, or a feed licence for a single feed (annual, invoiced): contact us.
- Free and without a token, for feed readers and scripts: RSS at
/feeds/warnings.xml,/feeds/navarea/<id>.xmland/feeds/coastal/<id>.xml; the same three as Atom (.atom) and JSON Feed 1.1 (.json); plain text at/feeds/warnings.txt. The newest 100 warnings, text only, a warning keeps its id when it is updated. Region pages carry the feed links in their head, so a reader finds the feed from the page address.
Loading feeds…
curl "https://www.sealagom.com/api/v2/feeds/military/?output=geojson&navarea_id=3" -H "X-API-Token: YOUR_API_TOKEN"prompt filter
- Write what you want in plain words on the token (Full API plan). When you save, a model checks every warning in force against it; each new warning is checked within about 10 minutes of arriving.
/api/v2/messages/calls with that token then return only the matching warnings. A warning that matched while in force stays matched after it is archived.- The response adds
meta.prompt_filterwith the prompt, its status (matchingright after saving,readyafterwards) and how many warnings matched.?prompt_filter=offskips it for one call. - The filter can miss or over-include a warning. Use it to narrow a feed, not as the only safety check; the official broadcast stays the authority.
# Token with saved settings: nothing else needed
curl "https://www.sealagom.com/api/v2/messages/" -H "X-API-Token: YOUR_API_TOKEN"
# Same token, override the period for one call
curl "https://www.sealagom.com/api/v2/messages/?date_from=2026-09-01" -H "X-API-Token: YOUR_API_TOKEN"
# Token with the prompt "only space debris warnings around the USA"
{
"count": 3,
"results": [ ... ],
"meta": {
"prompt_filter": {
"prompt": "only space debris warnings around the USA",
"status": "ready",
"matched": 3
}
}
}Structured geo features
Full API subscriptionRequest with include_messages=true and include_geo_features=true on NAVAREA or Coastal list/detail endpoints. Each message may include a geo_features object with structured geometries ready for charts and GIS.
- features[].kind:
point,line,lane,area,circle,sector,displacement - circle / sector: include
radius_nm, centre point, and optional bearing limits - lane: centreline plus corridor width in
corridor_nmorcorridors_nm points[]: decimal degrees;coordinates_raw[]: original coordinate strings from the warning- Multi-zone warnings:
message_profile,multi_zone,zone_labels, and per-featuremetadata.zone_label - Optional safety zones:
safety_zone_meters,safety_zone_nm - File exports: Contributors receive full geometry in ECDIS and KML. Other export formats include structured geometry when your account has Full API access (see plans).
Example message field
{
"id": 123,
"number": "105/26",
"content": "HAZARDOUS OPERATIONS IN AREAS BOUND BY: A. 25-40.00N 096-47.00W, ... B. 25-58.00N ...",
"coordinates": ["25-40.00N 096-47.00W", "..."],
"geo_features": {
"version": 1,
"message_profile": "labeled_areas",
"multi_zone": true,
"zone_labels": ["A", "B"],
"features": [
{
"id": "feat-a1b2c3d4",
"kind": "area",
"label": "Area A",
"source": "labeled_zone",
"coordinates_raw": ["25-40.00N 096-47.00W", "..."],
"points": [{ "lat": 25.6667, "lon": -96.7833, "text": "25-40.00N 096-47.00W" }],
"closed": true,
"metadata": { "zone_label": "A" }
},
{
"id": "feat-b2c3d4e5",
"kind": "area",
"label": "Area B",
"source": "labeled_zone",
"metadata": { "zone_label": "B" }
}
]
}
}Sample request
curl -X GET "https://www.sealagom.com/api/v1/navarea/4/?include_messages=true&include_geo_features=true&include_coordinates=true" \
-H "X-API-Token: YOUR_API_TOKEN"analysis
Full API subscriptionEvery new or changed warning is read by a model and turned into structured data. Add include_ai_analysis=true (with include_messages=true) on NAVAREA or Coastal list/detail endpoints and each message carries an ai_analysis object, or null while a new warning is still waiting to be analysed.
- headline, summary: plain-English description (non-English warnings are translated)
- status:
active,scheduled,expired,withdrawn(no longer in the issuer's in-force list),cancellation_notice,informational. Recomputed on every request from the validity dates, so a warning moves from scheduled to active to expired by itself. - valid_from / valid_until (ISO 8601 UTC) and
time_windows[]: activity periods and the self-cancel time;validity_textquotes the source phrase - category, severity (critical, high, moderate, low, info),
hazards[],mariner_action,location newsworthy/background: for events the wider public would care about (space launches, missile tests, conflict, disasters), a few sentences of general context. It comes from general knowledge, not from the warning text, and can be wrong; empty for routine warningscancels[]/references[]: warning numbers this message cancels or refers to- Operational details:
keep_clear_nm(largest keep-clear distance, NM),contacts[](VHF channels, stations, phones),vessels[](name, call sign, MMSI, IMO, role),depth_m(least depth over a wreck),observed_at(when a drifting object was reported),aids[](lights and buoys affected, with condition),charts[] translations: headline, summary and action in Chinese, Spanish, Russian, Portuguese, Greek, Ukrainian, Turkish, French and Filipinocoord_check: positions the automatic read compared with the parser's (ok,mismatchwith the positions only one side found)- Also:
status_label,category_label,status_at_analysis(status as judged when analysed),positions_read[](positions as the automatic read them),confidence(0 to 1),analyzed_atandmodel - Recurring series:
is_routine,series_keyandseries_labelgroup repeating bulletins (ice reports, rig position lists, warnings-in-force lists) so you can keep only the latest issue
On the website, everyone sees each warning's headline and status; the full analysis on message pages and the map is part of the Contributor plan, and the full LagoPal (warning search, PDF reports, reading attached files and images) plus watch alerts are part of Full Contributor. Through the API the analysis comes with the Full API plan.
With API v2 you can also filter by this data: live status, expiry (for example everything expiring in the next 24 hours), in force now, severity, category, keep-clear distance, and analyses that name contacts, vessels or lights.
The analysis is generated automatically and can be wrong. The original warning text in content stays the authoritative source.
Example message field
{
"id": 123,
"number": "1234/26",
"content": "NAVAREA III 1234/26 ... GUNNERY EXERCISES ... CANCEL THIS MSG 301600 UTC SEP 26.",
"ai_analysis": {
"headline": "Gunnery firing exercises south of Crete, 28-30 Sep",
"summary": "Live gunnery firing south of Crete daily 0600-1500 UTC from 28 to 30 September. Ships should keep clear of the area.",
"category": "firing_practice",
"category_label": "Firing practice",
"subject": "firing",
"subject_label": "Firing exercise",
"severity": "high",
"status": "active",
"status_label": "Active",
"status_at_analysis": "scheduled",
"valid_from": "2026-09-28T06:00:00+00:00",
"valid_until": "2026-09-30T16:00:00+00:00",
"validity_text": "280600 UTC TO 301500 UTC SEP 26. CANCEL THIS MSG 301600 UTC SEP 26",
"time_windows": [{ "start": "2026-09-28T06:00:00+00:00", "end": "2026-09-30T15:00:00+00:00", "note": "daily 0600-1500 UTC" }],
"location": "South of Crete",
"hazards": ["live firing"],
"mariner_action": "Keep clear of the area during the firing periods.",
"newsworthy": false,
"background": "",
"keep_clear_nm": 3,
"contacts": [{ "type": "vhf", "value": "VHF 16", "note": "HN warship" }],
"vessels": [],
"depth_m": null,
"observed_at": null,
"aids": [],
"charts": [],
"coord_check": { "status": "ok", "ai_count": 4, "parser_count": 4, "ai_only": [], "parser_only": [] },
"translations": { "es": { "headline": "Ejercicios de tiro al sur de Creta, 28-30 sep", "summary": "...", "mariner_action": "..." } },
"cancels": ["1198/26"],
"references": [],
"is_routine": false,
"series_key": "",
"series_label": "",
"confidence": 0.92,
"analyzed_at": "2026-09-27T08:10:00+00:00",
"model": "gpt-5-mini"
}
}Sample request
curl -X GET "https://www.sealagom.com/api/v1/navarea/3/?include_messages=true&include_ai_analysis=true" \
-H "X-API-Token: YOUR_API_TOKEN"Map objects (rigs & MODU)
Warnings that include rig or MODU position lists may return a map_objects field on each message when you use include_messages=true.
Message field: map_objects.oil_rigs[]
name: rig or unit name as publishedcoordinate: coordinate string from the warninglat,lon: decimal degreesis_new_rig,is_new_position: when flagged in the source textcatalog(optional): matched catalogue entry with slug, href, MMSI, navigation area
Public catalogue (no API token)
- GET /api/public/modu/?q=&page=1 - search active rigs
- GET /api/public/modu/s/{slug}/ - rig detail and linked warnings
- GET /api/public/map-rigs/ - all active rigs for map overlays
Coast radio stations and rescue centres
Rescue coordination centres (RCC, MRCC, MRSC, JRCC) and DSC coast stations of 70 countries, from NGA Pub 117 Radio Navigational Aids (chapter 4), with SeaLagom's MF/HF DSC test stations marked. No API token needed.
- GET /api/public/coast-stations/ - every station with a position, short rows (id, k, n, c, m, la, lo, r, b, t)
- GET /api/public/coast-stations/{id}/ - one station: MMSI, bands and ranges, watch times, area, contacts
- GET /api/public/coast-stations/near/?lat=&lon=&radius_nm=200&limit=12 - nearest stations
near returns rcc_covering (rescue centres whose area holds the position), rcc_near, dsc_near and test_nearest, each with distance_nm. position_approximate is true when Pub 117 gives no position and the station is placed at the port of the same name. Check every entry against your official radio list.
curl "https://www.sealagom.com/api/public/coast-stations/near/?lat=36.8&lon=3.1&radius_nm=150"Space: launches, hazard warnings, re-entries, objects in orbit
Rocket launches of every agency and company from Launch Library 2 (The Space Devs), refreshed hourly, each with the NAVAREA and coastal warnings of its hazard areas at sea (stage, booster and fairing drop zones, landing zones), SpaceX droneships and capsule splashdowns. A warning is linked only when its wording is a launch, one of its windows holds the launch time and opens within an hour of the launch window, an area lies within 1,000 nm of the pad and no other launch fits as well. No API token needed.
- GET /api/public/space/launches/?from=&to=&provider=&limit= - launches (default 7 days back to 60 ahead) with warnings
- GET /api/public/space/launches/{id}/ - one launch, its description and the warning page line
- GET /api/public/space/reentries/ - re-entry predictions (Space-Track TIP) when available
- GET /api/public/sky/space/?g=bright|stations|recent|rocket|debris - positions now and a minute later (SGP4)
- GET /api/public/sky/space/meta/?g= - names, owners, launch dates and sizes (SATCAT)
Sources: Launch Library 2 (thespacedevs.com), CelesTrak, Space-Track.org (USSPACECOM). The warnings themselves stay the authority for navigation.
curl "https://www.sealagom.com/api/public/space/launches/?provider=SpaceX&limit=10"Finland and the Baltic: ice navigation, faulty lights and buoys
Winter navigation of the Finnish-Swedish icebreaker service (ports with ice restrictions or closed, icebreakers and their tasks, dirways through the ice) and the lights and buoys out of order in Finnish waters, from Fintraffic Digitraffic, refreshed every 10 minutes. No API token needed. Licence CC BY 4.0: show the credit that comes with the data.
- GET /api/public/winter-navigation/
- GET /api/public/aton-faults/
A restriction such as IA 2000 means icebreaker assistance only for ships of at least that ice class and deadweight in tonnes. Out of season the lists are empty. The official notices of the winter navigation services are the authority.
curl "https://www.sealagom.com/api/public/winter-navigation/"Your own vessels: positions in by API or webhook
Push the positions of your own vessels from trackers, satellite AIS, Noon or the bridge. They show live in your sky view and on the chart, for your account only, drawn at their real size, with a Fleet panel: status (under way, at anchor or stopped, no update), the last position and its age, speed and course, the ETA when a route is set, the warnings in force near each vessel and along her route, and the approximate under-keel clearance. Private by default; showing a vessel to everyone is a paid placement labelled Sponsored. Not for navigation.
- POST /api/v2/fleet/positions/: one position, a list, or {positions: [...]}, at most 500 a request
- GET /api/v2/fleet/vessels/: every vessel with her live state (?detail=1)
- GET /api/v2/fleet/vessels/{vessel}/: one vessel: our id, MMSI, IMO, your own id or her name; her last 24 hours
- PUT|DELETE /api/v2/fleet/vessels/{vessel}/route/: her route for the ETA and the warnings along it
- GET|POST /api/v2/fleet/webhook/: your webhook receiver; {rotate: true} makes a new signing secret, shown once
- GET /api/v2/fleet/access/, POST /api/v2/fleet/trial/: what your account may do; the free trial
A position
The vessel by vessel_id (our id, or your own id for her), mmsi or imo, with her name the first time; lat and lon in decimal degrees; time in UTC as ISO 8601 or Unix seconds. Optional: speed (knots), course, heading, draught (metres, as reported), length and beam (metres), destination, nav_status (the AIS number). The spellings providers use are read too: latitude, lng, sog, cog, hdg, timestamp, a nested position, a GeoJSON Point.
curl -X POST https://www.sealagom.com/api/v2/fleet/positions/ \
-H "Authorization: Bearer YOUR_KEY" -H "Content-Type: application/json" \
-d '{"positions": [
{"mmsi": "244123456", "name": "NORTH STAR", "lat": 51.9512, "lon": 4.0417,
"time": "2026-10-31T12:00:00Z", "speed": 12.1, "course": 271, "heading": 270,
"draught": 9.4, "length": 182, "beam": 28},
{"vessel_id": "TRK-0042", "name": "SEA BIRD", "lat": 1.2402, "lon": 103.8523,
"time": 1793448000}
]}'Each position is checked and refused with a plain reason in the answer (refused: [{index, why}]): no vessel named, out of range or 0, 0, no time, older than 24 hours or more than 5 minutes ahead of our clock, a speed over 80 knots, an impossible jump from her last position (over 60 knots), a second position within 10 seconds of the last one or older than it (send them in time order), a new vessel over your plan's number of vessels. 200 when any was kept, 422 when none was.
Reading your fleet
curl https://www.sealagom.com/api/v2/fleet/vessels/ -H "Authorization: Bearer YOUR_KEY"
curl https://www.sealagom.com/api/v2/fleet/vessels/244123456/ -H "Authorization: Bearer YOUR_KEY"
curl -X PUT https://www.sealagom.com/api/v2/fleet/vessels/244123456/route/ \
-H "Authorization: Bearer YOUR_KEY" -H "Content-Type: application/json" \
-d '{"name": "Rotterdam to Felixstowe", "speed_kn": 14,
"waypoints": [[51.95, 4.05], [51.98, 2.90], [51.93, 1.40]]}'import datetime, requests
KEY = "YOUR_KEY"
now = datetime.datetime.now(datetime.timezone.utc).isoformat()
r = requests.post(
"https://www.sealagom.com/api/v2/fleet/positions/",
headers={"Authorization": f"Bearer {KEY}"},
json={"positions": [{"imo": "9074729", "name": "ALPHA", "lat": 36.84, "lon": -6.42,
"time": now, "speed": 11.4, "course": 145, "draught": 8.2}]},
timeout=20,
)
print(r.status_code, r.json()) # accepted, refused [{index, why}], vessels
for v in requests.get("https://www.sealagom.com/api/v2/fleet/vessels/",
headers={"Authorization": f"Bearer {KEY}"}, timeout=20).json()["vessels"]:
print(v["name"], v["status"], v["position"]["age_s"], v["speed_kn"],
(v["route"] or {}).get("eta"), v["warnings_near"]["count"])The ETA is worked out along the rest of her route at her reported speed, or at the route's planned speed while she reports none. The warnings near her are those in force within 50 nm; along her route, those within 10 nm of the rest of it, in the order she meets them. The under-keel clearance is an estimate, never a safety value: GEBCO is not a nautical chart, depths are not reduced to chart datum, tides are not included, the draught is what the crew reported.
Webhook for providers that push
Your account has its own receiver address (GET /api/v2/fleet/webhook/ or the Fleet panel). Point your tracker, satellite AIS provider or Noon at it; any JSON with positions is read (our format, a list, data or items envelopes, a GeoJSON FeatureCollection). Sign every push with your secret: the header X-SeaLagom-Signature: t=<Unix seconds>,v1=<hex HMAC-SHA256 of t, a dot and the raw body>, within 5 minutes of our clock; or X-Hub-Signature-256: sha256=<hex HMAC-SHA256 of the raw body>. ?provider= names the source.
import hashlib, hmac, json, time, requests
SECRET = "flsec_..." # Fleet panel, Make the signing secret
URL = "https://www.sealagom.com/api/fleet/hook/flh_.../" # GET /api/v2/fleet/webhook/
body = json.dumps({"data": [{"MMSI": "244123456", "LATITUDE": 51.95, "LONGITUDE": 4.05,
"SOG": 12.1, "COG": 271, "TIMESTAMP": int(time.time())}]}).encode()
t = int(time.time())
sig = hmac.new(SECRET.encode(), f"{t}.".encode() + body, hashlib.sha256).hexdigest()
r = requests.post(URL + "?provider=MyTracker", data=body, timeout=20, headers={
"Content-Type": "application/json", "X-SeaLagom-Signature": f"t={t},v1={sig}"})
print(r.status_code, r.json())Agents (MCP)
The same as an MCP server: tools fleet_access, fleet_vessels, fleet_vessel, fleet_push_positions, fleet_set_route and fleet_start_trial, with your key as Bearer.
{
"mcpServers": {
"sealagom-fleet": {
"url": "https://www.sealagom.com/mcp/fleet",
"headers": { "Authorization": "Bearer YOUR_KEY" }
}
}
}Who may use it
The plans that include fleets (Fleet, All In, Fleet Pro and the Fleet unlimited license) and company licences. People can try it free for 7 days with up to 3 vessels, once per account (POST /api/v2/fleet/trial/ or the Fleet panel). Limits: 120 requests a minute per account and a number of positions a day by the access. These calls never use the requests of a data plan. Plans with fleets
Coastal API
Coastal navigational warnings by hydrographic region, typically more localised than NAVAREA, covering port operations, coastal hazards, and local maritime safety notices.
- GET /api/v1/coastal/
- GET /api/v1/coastal/{id}/
- GET /api/v1/coastal/{id}/messages/
- GET /api/v1/coastal/{id}/archived_messages/
Basic request
curl -X GET "https://www.sealagom.com/api/v1/coastal/?include_messages=true" \
-H "X-API-Token: YOUR_API_TOKEN"Coastal query parameters
Coastal list / detail endpoints accept the same style of filters as NAVAREA where applicable.
| Parameter | Type | Description |
|---|---|---|
| id | integer | Filter by coastal region ID. |
| title | string | Filter by title. |
| sub_title | string | Filter by sub_title. |
| include_messages | boolean | Include active coastal messages. |
| include_archived | boolean | Include archived messages (Full / Custom). |
| include_coordinates | boolean | Coordinates in response (Full / Custom). |
| include_enhanced_coordinates | boolean | Decimal, Google Maps, GeoJSON, DMS formats (Full / Custom). |
| include_keywords | boolean | Keyword map in response (Full / Custom). |
| include_geo_features | boolean | Structured geo_features JSON per message (Full API only). |
| include_ai_analysis | boolean | ai_analysis JSON per message (Full API only). |
| date_from | date | Same semantics as NAVAREA (Full / Custom). |
| date_to | date | Same semantics as NAVAREA (Full / Custom). |
| keyword | string | Keyword filter (Full / Custom). |
| has_coordinates | boolean | Filter messages that have coordinates (Full / Custom). |
| country | string | Filter by country name (partial match). |
| content_search | string | Search message body (partial). |
| title_search | string | Search within titles (partial match). |
Webhook integration
Full API and Custom subscribers can configure a webhook URL to receive real-time POST notifications whenever NAVAREA or Coastal warnings are added, updated, or archived (no polling required).
How webhooks work
- Configure a webhook URL in your subscription settings.
- When a warning is published or updated, we send a signed POST to your URL.
- Verify the request using your webhook secret.
- Your server processes the payload and takes action (update DB, push notification, etc.).
Security
- Only public https:// URLs are called (no private or local addresses, port 443, no redirects followed).
X-Sealagom-Signatureis HMAC-SHA256 of the body with your secret;X-Sealagom-Signature-256issha256=+ HMAC-SHA256 of<X-Sealagom-Timestamp>.<body>. Check one of them, and reject deliveries whose timestamp is older than five minutes.X-Sealagom-Deliveryis unique per call: keep the last ids to drop a repeated delivery.- Alerts can also go to a Slack, Discord or Teams incoming webhook, or to Zapier, Make, n8n and IFTTT: Integrations.
Configure webhook
curl -X POST "https://www.sealagom.com/api/v1/subscriptions/1/webhook/" \
-H "Authorization: Bearer YOUR_JWT_TOKEN" \
-H "Content-Type: application/json" \
-d '{"webhook_url": "https://your-server.com/webhook", "webhook_secret": "your_secret_key"}'Webhook payload example
{
"event_type": "navarea_message_added",
"timestamp": "2024-06-01T12:34:56Z",
"data": {
"navarea_id": 1,
"message_id": 123,
"title": "NAVAREA I",
"number": "123/24",
"content": "Message content...",
"added_on": "2024-06-01T12:30:00Z"
},
"signature": "generated_signature_for_verification"
}Use cases
The SeaLag.om API is suited to a wide range of maritime applications. A few examples:
Navigation software
Overlay live NAVAREA and Coastal warnings directly on electronic charts. Use coordinate filtering to surface only hazards relevant to the vessel's position or planned route.
Mobile apps for mariners
Push notifications about new warnings in areas of interest. Pair geographic filtering with webhooks to alert users only for their specified regions.
Risk assessment tools
Incorporate warning data into route planning and safety analysis. Keyword filtering lets you isolate hazard types such as SUBMARINE CABLES, MILITARY EXERCISES, or PIRACY.
Historical analysis
Use date filtering and the archived messages feed to identify seasonal warning patterns, recurring hazards, or high-risk corridors over time.
GIS integration
Feed the coordinates data (decimal, GeoJSON, DMS) into ArcGIS, QGIS, or custom map layers to create dynamic maritime hazard visualisations.
Custom alert systems
Build automated alerting for shipping companies, offshore operators, or port authorities. Webhooks trigger instantly when new warnings match your criteria.
Need something not listed here? contact@sealagom.com
Data integration patterns
Common patterns for integrating maritime warning data into your systems:
| Pattern | Description | Recommended tier |
|---|---|---|
| Periodic sync | Schedule regular API calls to sync warnings into your database. Good when real-time delivery is not required. | Full API |
| Real-time updates | Webhook integration delivers immediate notifications on publish / update events. | Full or Custom |
| Geographic filtering | Filter by coordinates to retrieve only data relevant to specific areas of operation. | Full or Custom |
| Keyword-based alerts | Automated alerts triggered by specific keywords in warning messages (e.g. submarine cables, military exercises). | Full or Custom |
| Data warehousing | Feed warning data into BI and analytics pipelines using the date-range and archive endpoints. | Full or Custom |
| Chart / GIS overlay | Plot coordinate-enriched warnings on electronic charts or mapping systems. | Full or Custom |
| Custom response shapes | Specific field selection, bespoke spatial formats, or non-standard JSON structures. | Custom |
Developer tip: Use advanced filters to minimise data transfer and processing. This keeps free-tier answers within the records a call allows and reduces payload size on Full / Custom plans.
Rate limiting & token usage
The free tier counts calls a day (above). The Full API plans count no tokens and have a daily fair use (UTC): 20,000 calls and 2,000,000 warnings on API Default, 60,000 calls and 6,000,000 warnings on every Full API plan, shown in X-API-Daily-Calls-Limit and X-API-Daily-Calls-Remaining; past it the API answers 429 until 00:00 UTC. No limit at all comes with the Fleet unlimited license: yearly, by a proposal to [email protected].
| Plan | Requests | Archived / Coordinates / Keywords |
|---|---|---|
| Free tier | The API without a key: 100 calls a day, up to 50 warnings a call, for 3 days or 300 calls, whichever comes first | Not included |
| API Default | Unlimited | Archived + raw coordinates; no keywords, enhanced coordinates, geo_features or analysis |
| Full API | Unlimited | All included |
| Custom | Agreed per contract | Fully customisable |
Your free API calls left are shown under Profile → API.
Examples
Basic collection request
curl -X GET "https://www.sealagom.com/api/v1/navarea/?include_messages=true" \
-H "X-API-Token: YOUR_API_TOKEN"Sample list response (truncated)
{
"count": 21,
"next": "https://www.sealagom.com/api/v1/navarea/?page=2",
"previous": null,
"results": [
{
"id": 1,
"title": "NAVAREA I",
"time_upd": "2024-06-01T12:30:00Z",
"active_messages": [
{
"id": 123,
"number": "123/24",
"content": "Full warning text as published...",
"added_on": "2024-06-01T12:30:00Z",
"cancel_date": null
}
]
}
]
}Advanced filters (Full / Custom)
curl -X GET "https://www.sealagom.com/api/v1/navarea/?include_messages=true&date_from=2024-01-01&date_to=2024-12-31&keyword=GUNNERY%20EXERCISE&country=United%20Kingdom" \
-H "X-API-Token: YOUR_API_TOKEN"Full API response with coordinates & keywords
{
"count": 21,
"next": "https://www.sealagom.com/api/v1/navarea/?page=2&include_messages=true&include_coordinates=true&include_keywords=true",
"previous": null,
"results": [
{
"id": 1,
"title": "NAVAREA I",
"country": "United Kingdom",
"time_upd": "2024-06-01T12:30:00Z",
"active_messages": [
{
"id": 123,
"number": "123/24",
"content": "NORTH SEA. UNIT ORCADES FIELD...",
"added_on": "2024-06-01T12:30:00Z",
"cancel_date": null,
"coordinates": {
"text_coordinates": ["59-08.0N 000-34.0E"],
"decimal_coordinates": [[59.1333, 0.5667]],
"google_coordinates": ["59.1333 0.5667"],
"geojson_coordinates": [[0.5667, 59.1333]],
"dms_coordinates": [["59°08'00"N", "0°34'00"E"]]
},
"keywords": {
"hazard": "HAZARD TO NAVIGATION",
"location": "NORTH SEA, ORCADES FIELD",
"action": "CANCEL"
}
}
]
}
]
}Filter messages with coordinates, all formats
curl -X GET "https://www.sealagom.com/api/v1/navarea/?include_messages=true&has_coordinates=true&include_coordinates=true&include_enhanced_coordinates=true" \
-H "X-API-Token: YOUR_API_TOKEN"Combined filters
curl -X GET "https://www.sealagom.com/api/v1/navarea/?include_messages=true&date_from=2024-01-01&keyword=GUNNERY%20EXERCISE&has_coordinates=true&country=United%20Kingdom" \
-H "X-API-Token: YOUR_API_TOKEN"