HomeMapSky mapAlpha
More
Account
Loading…
Language: English

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 overview

Everything 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.py and js/sealagom.mjs, no dependencies beyond requests or fetch; generate any other language from openapi.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-Token or Authorization: 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= (or mmsi, warning and region, port, locode, lat and lon) 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

  1. Pick a plan on contributor plans.
  2. Create an API token under Profile → API.
  3. Send X-API-Token on every /api/v1/ call.
  4. 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 Default

Full 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
Subscribe to Full API

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
Contact us

Need something bespoke? Email contact@sealagom.com API responses can be customised to any format or spatial structure.

View current plans and subscribe

Interactive 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=true
curl -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_TOKEN
Security: Keep tokens private. Use separate tokens per application. Regenerate periodically or immediately if compromised.

Token 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 apply date_from, date_to, keyword and has_coordinates to 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/

ParameterPlanWhat it does
scopeAllnavarea, coastal or all (default).
navarea_idAllOne or more NAVAREA ids (repeat or comma-separate).
coastal_idAllOne or more coastal region ids.
countryAllCountry name, partial match (e.g. France).
qAllWords in the warning text (original or English).
date_from, date_toAllAdded on or after / on or before, YYYY-MM-DD.
keywordAllKeyword category or any word in the text; repeat for several.
has_coordinatesAlltrue: only warnings with positions.
include_localsAlltrue: French local (AVURNAV) warnings too.
include_archived, only_archivedPaid APIActive and archived, or archived only.
status, message_class, station, lat, lon, radius_nm, bboxAllArchive 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_coordinatesPaid APIPositions read from each warning.
include_enhanced_coordinatesFull APIDecimal, DMS, GeoJSON and map links for each position.
include_keywordsFull APIKeyword map per warning.
include_geo_featuresFull APIAreas, circles, lines, lanes, sectors as GeoJSON.
include_ai_analysisFull APIThe analysis object per warning.
ai_severityFull APIcritical, high, moderate, low, info (repeat for several).
ai_categoryFull APIcategory ids, e.g. firing_practice, piracy_or_security.
ai_statusFull APILive status: active, scheduled, expired, withdrawn (archived), cancellation_notice, informational.
ai_in_forceFull APItrue: only warnings in force right now.
expires_within_hoursFull APIOnly warnings whose valid_until falls in the next N hours.
expires_after, expires_beforeFull APIvalid_until on or after / on or before a date (YYYY-MM-DD) or ISO time.
exclude_routineFull APItrue: leave out routine reports (ice reports, rig lists, in-force lists).
ai_hasFull APIOnly analyses with: contacts, vessels, aids, keep_clear, time_windows, charts, hazards.
min_keep_clear_nmFull APIKeep-clear distance of at least N nautical miles.
page, page_sizeAllDefault 50 per page; up to 200 on paid plans, 50 on free.
prompt_filterFull APIoff: ignore the token's prompt filter for this call.
topicFull APIA feed: ice, military, space, cables, offshore, survey, hazards, aton, sar, security (see Themed feeds).
settingsAlloff: 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=off makes a plain call.
  • Relative periods: "last 30 days" sends date_from as today minus 30 days on every call.
  • Responses carry an X-API-Token-Settings header 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=geojson returns a GeoJSON FeatureCollection, one feature per shape, ready for route checks and chart overlays.
  • ice_type narrows 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=ice is 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=geojson for 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=military is 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>.xml and /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_filter with the prompt, its status (matching right after saving, ready afterwards) and how many warnings matched. ?prompt_filter=off skips 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 subscription

Request 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_nm or corridors_nm
  • points[]: decimal degrees; coordinates_raw[]: original coordinate strings from the warning
  • Multi-zone warnings: message_profile, multi_zone, zone_labels, and per-feature metadata.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 subscription

Every 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_text quotes 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 warnings
  • cancels[] / 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 Filipino
  • coord_check: positions the automatic read compared with the parser's (ok, mismatch with 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_at and model
  • Recurring series: is_routine, series_key and series_label group 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 published
  • coordinate: coordinate string from the warning
  • lat, lon: decimal degrees
  • is_new_rig, is_new_position: when flagged in the source text
  • catalog (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.

ParameterTypeDescription
idintegerFilter by coastal region ID.
titlestringFilter by title.
sub_titlestringFilter by sub_title.
include_messagesbooleanInclude active coastal messages.
include_archivedbooleanInclude archived messages (Full / Custom).
include_coordinatesbooleanCoordinates in response (Full / Custom).
include_enhanced_coordinatesbooleanDecimal, Google Maps, GeoJSON, DMS formats (Full / Custom).
include_keywordsbooleanKeyword map in response (Full / Custom).
include_geo_featuresbooleanStructured geo_features JSON per message (Full API only).
include_ai_analysisbooleanai_analysis JSON per message (Full API only).
date_fromdateSame semantics as NAVAREA (Full / Custom).
date_todateSame semantics as NAVAREA (Full / Custom).
keywordstringKeyword filter (Full / Custom).
has_coordinatesbooleanFilter messages that have coordinates (Full / Custom).
countrystringFilter by country name (partial match).
content_searchstringSearch message body (partial).
title_searchstringSearch 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

  1. Configure a webhook URL in your subscription settings.
  2. When a warning is published or updated, we send a signed POST to your URL.
  3. Verify the request using your webhook secret.
  4. 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-Signature is HMAC-SHA256 of the body with your secret; X-Sealagom-Signature-256 is sha256= + HMAC-SHA256 of <X-Sealagom-Timestamp>.<body>. Check one of them, and reject deliveries whose timestamp is older than five minutes.
  • X-Sealagom-Delivery is 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:

PatternDescriptionRecommended tier
Periodic syncSchedule regular API calls to sync warnings into your database. Good when real-time delivery is not required.Full API
Real-time updatesWebhook integration delivers immediate notifications on publish / update events.Full or Custom
Geographic filteringFilter by coordinates to retrieve only data relevant to specific areas of operation.Full or Custom
Keyword-based alertsAutomated alerts triggered by specific keywords in warning messages (e.g. submarine cables, military exercises).Full or Custom
Data warehousingFeed warning data into BI and analytics pipelines using the date-range and archive endpoints.Full or Custom
Chart / GIS overlayPlot coordinate-enriched warnings on electronic charts or mapping systems.Full or Custom
Custom response shapesSpecific 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].

PlanRequestsArchived / Coordinates / Keywords
Free tierThe API without a key: 100 calls a day, up to 50 warnings a call, for 3 days or 300 calls, whichever comes firstNot included
API DefaultUnlimitedArchived + raw coordinates; no keywords, enhanced coordinates, geo_features or analysis
Full APIUnlimitedAll included
CustomAgreed per contractFully 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"
Beta look