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.
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 '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'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);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()){
"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": "PParameters
| Parameter | Type | Required | Description |
|---|---|---|---|
latitude / longitude / radius | query | Optional | Circle filter for `/locations`. Radius is in kilometres. 60.16 / 24.94 / 10 |
mmsi | query | Optional | Filter to a single vessel by MMSI. 230681000 |
from / to | query | Optional | Time bounds in Unix milliseconds, for historical positions. 1787299625385 |
(vessels) | path | Optional | `/vessels/{mmsi}` returns static metadata — name, call sign, IMO, ship type, draught, destination. 230681000 |
Accept-Encoding | header | Required | Must be `gzip`. The service returns 406 without it. gzip |
Digitraffic-User | header | Optional | Identifies 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
GeoJSON Validator
Validate GeoJSON against RFC 7946 and get the exact JSON path of every problem: unclosed rings, swapped coordinates, missing properties and more.
GeoJSON to CSV Converter
Flatten a GeoJSON FeatureCollection into a CSV table with one row per feature, a centroid for lines and polygons, and every property as a column.
Coordinate Converter
Convert GPS coordinates between decimal degrees, degrees-minutes-seconds and decimal minutes instantly. Paste any format like 40°26'46"N and copy the result.
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.