BYTETOOLS

Digitraffic Marine (AIS) API

Free official Finnish marine traffic API with no key: live AIS vessel positions as GeoJSON, vessel metadata, port calls and winter navigation data. Tested example included.

No API key requiredCORS enabledHTTPSFree tier

Endpoint tested and returned HTTP 200 on 2026-08-21

What is the Digitraffic Marine (AIS) API?

Digitraffic Marine is the Finnish Transport Infrastructure Agency's free, key-free API for maritime traffic. It serves live AIS vessel positions as GeoJSON, vessel metadata by MMSI, port call records, and winter navigation information for the Baltic ice season.

Coming from the national agency rather than a reseller shows in how complete this feed is: alongside live positions there are port call records, fairway data and — unusually — winter navigation restrictions, because the Gulf of Bothnia freezes and icebreaker assistance is a scheduled operational reality rather than an edge case.

Two mechanical requirements catch first-time callers. Digitraffic refuses any request that does not advertise `Accept-Encoding: gzip`, answering 406 with a message saying so, and it asks callers to identify themselves with a `Digitraffic-User` header. Both are visible in the example below. The positions endpoint returns GeoJSON, so coordinates are `[longitude, latitude]`, and the `timestamp` property inside each feature is the AIS second-of-minute field, not a Unix time — the real time is `timestampExternal` in milliseconds.

Quick facts

Base URL
https://meri.digitraffic.fi/api/ais/v1
Authentication
No API key or account. The service asks callers to send a `Digitraffic-User` header identifying the application, and requires gzip.
Rate limit
No published numeric quota. Positions update every few seconds; the agency asks that you use the MQTT feed rather than polling hard.
Pricing
Free. Finnish open government data under a CC BY licence.
CORS
Enabled — callable directly from browser JavaScript
Official docs
Read the docs

How to use the Digitraffic Marine (AIS) API

Every request below was executed against the live API on 2026-08-21, and the response shown is the real body it returned — not an illustration.

1. Fetch live vessel positions within a radius

GET https://meri.digitraffic.fi/api/ais/v1/locations?radius=10&latitude=60.16&longitude=24.94

curl
curl 'https://meri.digitraffic.fi/api/ais/v1/locations?radius=10&latitude=60.16&longitude=24.94' \
  -H 'Accept-Encoding: gzip' \
  -H 'Digitraffic-User: Bytevancer/ByteTools'
JavaScript (fetch)
const res = await fetch("https://meri.digitraffic.fi/api/ais/v1/locations?radius=10&latitude=60.16&longitude=24.94", {
  headers: {
    "Accept-Encoding": "gzip",
    "Digitraffic-User": "Bytevancer/ByteTools",
  },
});
if (!res.ok) throw new Error(`Request failed: ${res.status}`);
const data = await res.json();
console.log(data);
Python (requests)
import requests

headers = {
    "Accept-Encoding": "gzip",
    "Digitraffic-User": "Bytevancer/ByteTools",
}

res = requests.get("https://meri.digitraffic.fi/api/ais/v1/locations?radius=10&latitude=60.16&longitude=24.94", headers=headers, timeout=20)
res.raise_for_status()
print(res.json())
Response — HTTP 200 (truncated)
{
  "type": "FeatureCollection",
  "dataUpdatedTime": "2026-08-21T08:13:03Z",
  "features": [
    {
      "mmsi": 230044550,
      "type": "Feature",
      "geometry": {
        "type": "Point",
        "coordinates": [
          25.02534,
          60.185142
        ]
      },
      "properties": {
        "mmsi": 230044550,
        "sog": 0.0,
        "cog": 360.0,
        "navStat": 5,
        "rot": -128,
        "posAcc": true,
        "raim": true,
        "heading": 511,
        "timestamp": 49,
        "timestampExternal": 1787299970004
      }
    },
    {
      "mmsi": 230955000,
      "type": "Feature",
      "geometry": {
        "type": "Point",
        "coordinates": [
          24.924752,
          60.16079
        ]
      },
      "properties": {
        "mmsi": 230955000,
        "sog": 0.0,
        "cog": 261.3,
        "navStat": 5,
        "rot": 0,
        "posAcc": true,
        "raim": false,
        "heading": 313,
        "timestamp": 0,
        "timestampExternal": 1787299980553
      }
    },
    {
      "mmsi": 230061040,
      "type": "Feature",
      "geometry": {
        "type": "Point",
        "coordinates": [
          25.009405,
          60.169143
        ]
      },
      "properties": {
        "mmsi": 230061040,
        "sog": 0.0,
        "cog": 282.8,
        "navStat": 5,
        "rot": 0,
        "posAcc": true,
        "raim": false,
        "heading": 349,
        "timestamp": 15,
        "timestampExternal": 1787299876550
      }
    },
    {
      "mmsi": 230024660,
      "type": "Feature",
      "geometry": {
        "type": "P

Parameters

ParameterTypeRequiredDescription
latitude / longitude / radiusqueryOptionalCircle filter for `/locations`. Radius is in kilometres. 60.16 / 24.94 / 10
mmsiqueryOptionalFilter to a single vessel by MMSI. 230681000
from / toqueryOptionalTime bounds in Unix milliseconds, for historical positions. 1787299625385
(vessels)pathOptional`/vessels/{mmsi}` returns static metadata — name, call sign, IMO, ship type, draught, destination. 230681000
Accept-EncodingheaderRequiredMust be `gzip`. The service returns 406 without it. gzip
Digitraffic-UserheaderOptionalIdentifies your application. Requested by the agency as a condition of fair use. MyCompany/MyApp

Response fields

typestring
Always `FeatureCollection` — the positions endpoint returns GeoJSON.
dataUpdatedTimestring
When the underlying data was last refreshed, in UTC.
features[].mmsiinteger
Vessel MMSI, present both at feature level and inside properties.
features[].geometry.coordinatesarray
Position as `[longitude, latitude]` — GeoJSON order, longitude first.
properties.sog / cogfloat
Speed over ground in knots and course over ground in degrees. A course of 360.0 means not available.
properties.navStatinteger
AIS navigational status: 0 under way using engine, 1 at anchor, 5 moored.
properties.headinginteger
Hull heading in degrees, which differs from course when a vessel is crabbing in wind or current.
properties.rotinteger
Rate of turn. The value 127 or -127 means turning faster than the field can express, not a precise rate.
properties.posAcc / raimboolean
Position accuracy flag and RAIM integrity flag from the transponder.
properties.timestampinteger
AIS second-of-minute for the fix — 0 to 59, not a Unix time.
properties.timestampExternalinteger
The actual report time in Unix milliseconds. This is the field to use.

What you can build with the Digitraffic Marine (AIS) API

  • Display live vessel traffic in Finnish waters and the Baltic
  • Monitor arrivals and departures at a Finnish port
  • Overlay ship positions on a map straight from GeoJSON
  • Track winter navigation restrictions and icebreaker assistance
  • Analyse port call patterns from the historical endpoints

Common errors and how to fix them

406 Not Acceptable

The request did not advertise gzip.

Fix: Send `Accept-Encoding: gzip` and decompress the response. Most HTTP clients do this automatically; hand-rolled ones frequently do not.

timestamp is a number between 0 and 59

It is the AIS second-of-minute field, not a Unix timestamp.

Fix: Use `timestampExternal`, which is Unix milliseconds. Mistaking the two produces dates in January 1970.

Coordinates plot in the wrong hemisphere

The response is GeoJSON, so longitude comes first.

Fix: Finnish longitudes are around 20 to 30 and latitudes around 60 to 70, which makes a swapped pair obvious once you look.

Empty features array

The filter excluded everything, or no vessel is reporting in that circle.

Fix: Widen the radius. Coverage is dense in Finnish coastal waters and thins rapidly outside the agency's receiver network.

Digitraffic Marine (AIS) API — frequently asked questions

Is Digitraffic free?

Yes, free with no key or account. It is Finnish open government data published under a CC BY licence, and the agency asks only that you identify your application in a `Digitraffic-User` header.

Why do I get a 406 error?

Because the request did not advertise gzip. Digitraffic requires `Accept-Encoding: gzip` on every request and refuses anything else, which is a bandwidth measure rather than a bug.

What area does it cover?

Finnish waters and the surrounding Baltic, from the agency's own shore-based AIS receivers. Coverage thins outside that network, so this is a regional feed rather than a global one.

Is there a streaming option?

Yes. Digitraffic runs an MQTT broker for live positions, which the agency prefers over frequent polling of the REST endpoint and which delivers updates as they arrive rather than on your schedule.

Tools that pair with this API

Digitraffic Marine (AIS) is an independent third-party service and is not affiliated with ByteTools or ByteVancer. Details on this page were verified on 2026-08-21; always check the official documentation before relying on this API in production, as terms and limits can change.