---
name: fintraffic-digitraffic-ingestion
description: "How to get Fintraffic Digitraffic Transport APIs data into a pandas DataFrame and Parquet: access, the request, the format, limits, quirks and terms."
---

# Load Digitraffic marine AIS into pandas and Parquet

Source entry: https://signal-lab-jet.vercel.app/datasets/fintraffic-digitraffic
Provider: https://www.digitraffic.fi/en/service-overview/
Checked against the provider's documentation: 2026-11-01

## Access
- No account or key. The marine AIS locations endpoint is a public JSON request.
- Send a non-personal Digitraffic-User application identifier; requests without it have lower limits.

## Request
```bash
curl --compressed -H 'Digitraffic-User: SignalLab ingestion example/1.0' 'https://meri.digitraffic.fi/api/ais/v1/locations'
```

## Format
GeoJSON FeatureCollection with a dataUpdatedTime and point features containing MMSI, longitude, latitude, speed over ground, course over ground, heading, navigation status and source timestamps.

## Load into pandas and Parquet
Needs Python 3 with requests, pandas and pyarrow.
```python
"""Fintraffic Digitraffic marine AIS locations -> pandas -> Parquet."""
import requests
import pandas as pd

URL = "https://meri.digitraffic.fi/api/ais/v1/locations"
HEADERS = {"Digitraffic-User": "SignalLab ingestion example/1.0"}
r = requests.get(URL, headers=HEADERS, timeout=60)
r.raise_for_status()
payload = r.json()
df = pd.json_normalize(payload["features"])
df["longitude"] = df["geometry.coordinates"].str[0]
df["latitude"] = df["geometry.coordinates"].str[1]
df["position_time"] = pd.to_datetime(df["properties.timestampExternal"], unit="ms", utc=True)
df.to_parquet("fintraffic_marine_ais.parquet", index=False)
print(len(df), "vessel positions; data updated", payload["dataUpdatedTime"],
      "; latest position", df["position_time"].max().isoformat())
```
Run by us on 2026-11-01 (python 3.13.5 | pandas 3.1.0 | pyarrow 26.0.0 | requests 2.34.2). Result: 1023 vessel positions; data updated 2026-11-02T02:20:40Z ; latest position 2026-11-02T02:20:40.155000+00:00

## Limits
- Without Digitraffic-User, the general HTTP limit and the tie/meri V1 limit are 60 requests per minute per IP.
- MQTT is limited to five connections per IP.
- The provider does not quantify the higher allowance granted when Digitraffic-User is sent.

## Quirks
- properties.timestampExternal is milliseconds since the Unix epoch; the MQTT documentation separately warns that metadata and location timestamps use different units.
- GeoJSON coordinates are longitude then latitude.
- The endpoint is a current snapshot rather than a historical archive; persist retrieval and source timestamps for a local time series.
- HTTP compression is mandatory on Digitraffic interfaces; requests supplies an Accept-Encoding header automatically.

## Terms and attribution
- Digitraffic open data is licensed under CC BY 4.0, including commercial reuse.
- Credit Fintraffic, link the licence and indicate changes when publishing the data.
- Preserve copyright notices, source identifiers, warranties, disclaimers and liability limitations where applicable.
- Terms page: https://www.digitraffic.fi/en/terms-of-service

## Sources
- https://www.digitraffic.fi/en/marine-traffic/: "Marine traffic information is gathered from Finnish Transport Infrastructure Agency’s data sources."
- https://www.digitraffic.fi/en/support/instructions/: "there is a limit on the number of requests for the interfaces."
- https://www.digitraffic.fi/en/terms-of-service: "Fintraffic’s open data is licensed under the Creative Commons 4.0 By license."

## Help improve this skill
Missing a source, or see something to improve? Call the MCP tool suggest_source or feedback (or POST /api/suggest or /api/feedback). Reviewed ideas: https://signal-lab-jet.vercel.app/agent-suggestions

Information for educational purposes only. Free tiers, limits and licenses belong to the providers and may change; check the provider's own terms before using the data.
