Baltic & Nordic Vessel Tracker — Live AIS for AI Agents
Pricing
from $0.70 / 1,000 results
Baltic & Nordic Vessel Tracker — Live AIS for AI Agents
Track live ships in the Baltic & Nordic seas via AIS. Get real-time vessel positions, speed, course, type, size, IMO/MMSI, flag and destination — filter by area, MMSI or ship type. Real-time maritime grounding for AI agents, logistics & compliance.
Baltic & Nordic Vessel Tracker — Live AIS Ship Positions, Type, Flag & Destination
Track live ships across the Baltic and Nordic seas in real time. This high-performance vessel tracker turns raw maritime AIS (Automatic Identification System) data into a clean, structured feed: give it a sea area, a ship type, a destination, or a list of MMSI numbers and it returns every matching vessel's live position, speed, course, heading, ship type, size, flag, destination and ETA — no login, no coding, no API key. Use it to track ships and scrape AIS vessel data the way you need it.
Export to JSON, CSV, Excel, or API.
Built for AI agents that need real-time maritime grounding, logistics and port-operations teams, compliance and sanctions analysts watching tanker traffic, and researchers studying one of the world's busiest shipping corridors. Extraction is completely unlocked for 1,000+ vessels, scaling across the entire regional fleet.
⚡ At a glance
| Metric / Feature | Specification |
|---|---|
| Coverage Area | Baltic Sea, Gulf of Finland, Gulf of Bothnia, Baltic Proper, Danish Straits, Kattegat & Skagerrak |
| Data Protocol | Live terrestrial AIS telemetry combined with static ship registration records |
| Ship Capacity | 1,000+ vessels unlocked — processes the entire active regional fleet (1,500–2,500+ ships) |
| Throughput / Speed | ~300–500 moving vessels extracted and filtered in under 5 seconds |
| Recommended Memory | 512 MB – 1024 MB (lightweight & ultra-fast pure HTTP execution) |
| Output Formats | JSON, CSV, Excel (XLSX), XML, HTML |
| Deduplication | 100% unique records keyed by Maritime Mobile Service Identity (MMSI) |
| Live Telemetry | Latitude, longitude, speed over ground (SOG), course over ground (COG), true heading |
| Voyage Data | Reported destination, decoded ISO-8601 ETA, current draught, ship dimensions |
🔎 Why scrape Baltic & Nordic AIS vessel data?
AIS (Automatic Identification System) is the VHF transponder signal every commercial ship broadcasts — transmitting its identity, position, speed, course and voyage plan. Those positions change by the minute, so a static snapshot is useless almost immediately. A large language model cannot know where a ship is right now; a logistics dashboard needs the current picture of inbound traffic; a compliance desk needs to see which tankers are moving through a sensitive corridor today.
Collecting this manually is frustrating. Public ship-tracking websites throttle scrapers, hide data behind heavy interactive maps and paywalls, and refuse to provide clean machine-readable exports. Raw government AIS feeds, meanwhile, are split across two separate data streams — live spatial coordinates in one, vessel identity and dimensions in another — and encode ship types, navigation statuses, and ETAs as cryptic integers. This AIS vessel tracker does all of that decoding and joins both feeds into one flat, ready-to-use record per ship.
The Baltic Sea and Gulf of Finland are among the most heavily trafficked and most geopolitically scrutinized waters on Earth — the maritime gateway to St. Petersburg, Ust-Luga, Primorsk, Tallinn, Helsinki, and the Gulf of Bothnia industrial ports. It is also the focal corridor for monitoring "shadow fleet" oil tankers and maritime sanctions compliance. This vessel tracker provides an open, programmable window directly into those waters.
Commercial Marine Platforms vs. This Vessel Tracker
| Feature | Commercial Map Portals | Baltic & Nordic Vessel Tracker |
|---|---|---|
| API Pricing | $300–$2,000/month subscriptions | Fraction of a cent per run ($0.001) |
| Export Formats | Restricted or proprietary UI | JSON, CSV, Excel, XML via 1-click or API |
| Rate Limiting | Strict IP throttling & CAPTCHAs | Direct keyless open-data pipeline |
| Data Enrichment | Raw cryptic codes (AIS type 70) | Decoded human labels ("Cargo", "Under way") |
| ETA Decoding | Often raw 20-bit integer format | Fully normalized ISO-8601 UTC timestamp |
| AI Agent Integration | Heavy JavaScript web maps | Flat JSON records ready for MCP tool-calling |
High-Value Reasons to Extract AIS Vessel Data
- Maritime Grounding for AI Agents: Feed real-time spatial reality into LLMs — e.g., "Which crude oil tankers are currently navigating the Gulf of Finland towards Primorsk?"
- Inbound Port Operations: Monitor approaching traffic, expected times of arrival (ETA), and draught limits to optimize pilotage and berth allocation.
- Fleet Surveillance: Track an operator's specific fleet across multiple sea sectors by supplying an array of MMSI numbers.
- Sanctions & Compliance Monitoring: Screen tankers by flag state (Panama, Liberia, Gabon, Marshall Islands) moving through sensitive Baltic export corridors.
- Maritime Supply Chain Logistics: Detect arrival delays of container ships and dry bulk carriers before they dock.
- Live Geospatial Mapping: Stream vessel coordinates, courses, and speeds into custom GIS systems or interactive Leaflet/Mapbox visualizations.
✨ Key Features & Capabilities
- ✅ Full Basin Coverage: Captures the live operational fleet across the Gulf of Finland, Gulf of Bothnia, Baltic Proper, Danish Straits, Kattegat, and Skagerrak.
- ✅ Custom Geospatial Bounding Box: Define exact rectangular map areas (
minLon,minLat,maxLon,maxLat) to focus on a specific strait, anchorage, or harbor approach. - ✅ Decoded Vessel Taxonomy: Categorizes raw numeric AIS types into intuitive classifications: Cargo, Tanker, Passenger, Fishing, Tug / Towing, Sailing, Pleasure craft, High-speed craft, and Other.
- ✅ Specific MMSI Fleet Tracking: Input one or several MMSI transponder IDs to filter the entire fleet and isolate only the ships you care about.
- ✅ Fuzzy Text Matching: Filter by ship name or reported destination port (case-insensitive substring matching, e.g.
"HELSINKI","ROTTERDAM","UST-LUGA"). - ✅ Moving-Only Filter: Eliminate stationary noise by filtering out anchored, moored, or aground ships to focus exclusively on active traffic under way.
- ✅ Automatic Flag State Resolution: Derives the vessel's national flag registry directly from Maritime Identification Digits (MID), covering 50+ sovereign registries and flags of convenience.
- ✅ ISO-8601 Decoded ETA: Reconstructs the crew-reported 20-bit ETA broadcast into an absolute UTC timestamp with automated year-rollover protection.
- ✅ Dimensional Hull Profiles: Extracts vessel length, beam width, and current water draught in meters.
- ✅ 1,000+ Fleet Scale: Fetches and joins entire regional fleets in a single blazing-fast HTTP pass (< 5 seconds).
🎯 Primary Use Cases
1. Port Authorities & Marine Terminal Operators
Forecast vessel arrival times, manage tug and pilot dispatch schedules, and cross-reference vessel length and draught against berth channel restrictions.
2. Maritime Sanctions & Commodity Traders
Track crude oil and refined product tankers operating in northern European export corridors. Monitor flag hopping and sudden destination changes across the Danish Straits.
3. Freight Forwarders & Supply Chain Teams
Track inbound cargo vessels carrying containerized goods or bulk commodities. Calculate realistic transit times based on real-time speed over ground (SOG).
4. Marine Environmental & Fisheries Researchers
Study commercial fishing vessel density, measure high-speed craft traffic in marine conservation zones, and analyze commercial route compliance.
5. AI Copilots & Autonomous Agents
Empower AI agents with live maritime tool-calling capabilities. Using Apify MCP or REST API, agents can query ship whereabouts and verify shipping claims instantly.
📥 Input Parameters
Configure the actor easily using the visual form in Apify Console or pass a JSON payload via the REST API.
| Field | Type | Default | Description |
|---|---|---|---|
region | Select | "all" | Sea area: "all", "gulf-of-finland", "gulf-of-bothnia", "baltic-proper", "danish-straits", "kattegat-skagerrak", "custom". |
bbox | String | "" | Custom bounding box minLon,minLat,maxLon,maxLat (used when region is "custom"), e.g. "22,59,28,61". |
shipType | Select | "all" | Filter by vessel classification: "all", "cargo", "tanker", "passenger", "fishing", "tug", "sailing", "pleasure", "high-speed", "other". |
movingOnly | Boolean | false | When true, hides stopped, anchored, or moored vessels and keeps only ships navigating with speed > 0.5 knots. |
nameQuery | String | "" | Optional case-insensitive substring to filter vessels by name (e.g. "Maersk", "Baltic"). |
destination | String | "" | Optional case-insensitive substring to filter by reported destination port (e.g. "HELSINKI", "KLAIPEDA"). |
mmsi | Array | [] | List of specific 9-digit MMSI transponder numbers to follow. |
maxItems | Integer | 0 | Maximum vessels to output. Set to 0 for unlimited extraction (entire matching fleet). |
proxyConfiguration | Object | {"useApifyProxy": false} | Proxy settings. Public open data source; proxy is off by default. |
Input Examples
Example 1: Active Tankers in the Gulf of Finland (Moving Only)
{"region": "gulf-of-finland","shipType": "tanker","movingOnly": true,"maxItems": 200}
Example 2: Inbound Ships Heading to Helsinki or St. Petersburg
{"region": "all","destination": "HELSINKI","maxItems": 500}
Example 3: Tracking Specific Fleet by MMSI
{"mmsi": ["244772000","230123456","265847000"],"movingOnly": false}
Example 4: Custom Spatial Bounding Box (Stockholm Archipelago)
{"region": "custom","bbox": "18.0,59.0,19.5,59.8","shipType": "all","maxItems": 0}
📤 Output Dataset & Field Coverage
The actor outputs flat JSON objects where each record represents a single tracked vessel.
Field Specification & Coverage Indicators
🚢 Vessel Identification
| Field | Type | Coverage | Description |
|---|---|---|---|
mmsi | String | 🟢 High (100%) | Unique 9-digit Maritime Mobile Service Identity. |
imo | String | 🟡 Conditional (~72%) | Permanent 7-digit IMO hull number. Empty for smaller craft. |
name | String | 🟡 Conditional (~75%) | Broadcast vessel name. |
callSign | String | 🟡 Conditional (~71%) | Marine radio call sign assigned by licensing flag. |
flag | String | 🟢 High (~87%) | Flag state resolved from MMSI maritime identification digits. |
shipType | String | 🟢 High (100%) | Raw numeric AIS ship-type identifier. |
shipTypeText | String | 🟢 High (100%) | Human-readable category (e.g. "Cargo", "Tanker"). |
🌐 Real-Time Telemetry & Navigation
| Field | Type | Coverage | Description |
|---|---|---|---|
latitude | String | 🟢 High (100%) | Current WGS-84 latitude in decimal degrees. |
longitude | String | 🟢 High (100%) | Current WGS-84 longitude in decimal degrees. |
speedKnots | String | 🟢 High (100%) | Speed over ground in knots (SOG). |
courseOverGround | String | 🟢 High (100%) | Course over ground in degrees (COG). |
heading | String | 🟢 High (~92%) | Compass heading in degrees. Empty if uncalibrated. |
navStatus | String | 🟢 High (100%) | Raw numeric navigation status code. |
navStatusText | String | 🟢 High (100%) | Readable status ("Under way using engine", "At anchor", "Moored"). |
⚓ Voyage & Port Destination
| Field | Type | Coverage | Description |
|---|---|---|---|
destination | String | 🟡 Conditional (~70%) | Crew-reported destination port string. |
eta | String | 🟡 Conditional (~70%) | Decoded ISO-8601 UTC timestamp of estimated arrival. |
positionTime | String | 🟢 High (100%) | Timestamp of AIS transponder observation. |
scrapedAt | String | 🟢 High (100%) | ISO 8601 timestamp of extraction. |
📏 Vessel Dimensions & Hull Profile
| Field | Type | Coverage | Description |
|---|---|---|---|
draughtMeters | String | 🟡 Conditional (~68%) | Current water draught in meters. |
lengthMeters | String | 🟡 Conditional (~74%) | Total hull length in meters. |
widthMeters | String | 🟡 Conditional (~74%) | Total hull beam width in meters. |
Sample Output Record
{"mmsi": "244772000","imo": "9331361","name": "LEONIE","callSign": "PHLE","shipType": "70","shipTypeText": "Cargo","flag": "Netherlands","latitude": "57.815853","longitude": "18.044017","speedKnots": "8.6","courseOverGround": "210.9","heading": "209","navStatus": "0","navStatusText": "Under way using engine","destination": "PLSZZ","eta": "2026-11-12T03:00:00Z","draughtMeters": "5.5","lengthMeters": "90","widthMeters": "13","positionTime": "2026-11-10T16:15:46Z","scrapedAt": "2026-11-10T16:18:00.000Z"}
🔁 Scale, Architecture & Performance
- Zero-Pagination Bulk Pipeline: The actor utilizes high-efficiency stream compression to download live AIS position vectors and static metadata in parallel batches, joining thousands of entities in memory in milliseconds.
- Uncapped Fleet Retrieval: Removing legacy demo caps allows full fleet extractions exceeding 1,000+ active vessels across the entire Baltic basin.
- Micro-Cost Execution: Because no browser instances or proxy rotation bandwidth are consumed, runs finish in 2–5 seconds with compute costs typically under $0.0005 per run.
- Strict MMSI Deduplication: Every vessel record is uniquely mapped by transponder ID, guaranteeing 0% duplicates in your downstream datasets.
💻 Programmatic Integration & AI Agent Tool Calling
Node.js (Apify SDK)
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('haketa/vessel-tracker').call({region: 'gulf-of-finland',shipType: 'tanker',movingOnly: true,maxItems: 100,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(`Tracked ${items.length} active tankers navigating the Gulf of Finland.`);
Python (Apify Client)
import osfrom apify_client import ApifyClientclient = ApifyClient(os.getenv('APIFY_TOKEN'))run = client.actor('haketa/vessel-tracker').call(run_input={'region': 'baltic-proper','shipType': 'cargo','destination': 'ROTTERDAM','maxItems': 50,})for ship in client.dataset(run['defaultDatasetId']).list_items().items:print(f"{ship['name']} ({ship['flag']}) -> SOG: {ship['speedKnots']} kn, ETA: {ship['eta']}")
Direct cURL Request
curl -X POST "https://api.apify.com/v2/acts/haketa~vessel-tracker/runs" \-H "Authorization: Bearer YOUR_APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"region": "all","shipType": "tanker","movingOnly": true,"maxItems": 250}'
🗺️ Supported Sea Sectors & Coordinate Boundaries
The actor comes pre-configured with boundary coordinates for the key waterways of Northern Europe:
| Region Key | Region Label | Geographic Boundaries (Lon/Lat) | Key Ports & Passages Included |
|---|---|---|---|
all | All Areas (Baltic & Nordic) | Full regional terrestrial AIS coverage | Complete Baltic Sea, Kattegat, Skagerrak |
gulf-of-finland | Gulf of Finland | 22°E–30.5°E, 59°N–61°N | Helsinki, Tallinn, St. Petersburg, Ust-Luga, Primorsk |
gulf-of-bothnia | Gulf of Bothnia | 17°E–26°E, 60°N–66°N | Oulu, Vaasa, Rauma, Pori, Luleå, Umeå |
baltic-proper | Baltic Proper | 12°E–23°E, 54°N–60°N | Stockholm, Riga, Klaipeda, Gdansk, Gdynia, Kaliningrad |
danish-straits | Danish Straits | 9°E–13°E, 54°N–58°N | Great Belt, Little Belt, The Sound (Øresund), Copenhagen |
kattegat-skagerrak | Kattegat & Skagerrak | 7°E–13°E, 56°N–59.5°N | Gothenburg, Oslofjord approaches, Skagen passage |
custom | Custom Map Area | User-defined minLon,minLat,maxLon,maxLat | Pinpoint monitoring of harbor berths and pilot stations |
⚓ AIS Navigational Status Reference
Every broadcast AIS dynamic message contains a 4-bit navigation status integer. This scraper maps each code to its standardized International Maritime Organization (IMO) definition:
| Code | Status Text | Marine Meaning |
|---|---|---|
0 | Under way using engine | Vessel is navigating actively under engine power |
1 | At anchor | Vessel is held in place by anchor equipment |
2 | Not under command | Vessel unable to maneuver due to exceptional circumstance |
3 | Restricted manoeuvrability | Vessel restricted in ability to maneuver (dredging, towing) |
4 | Constrained by draught | Vessel severely restricted in maneuvering by water depth |
5 | Moored | Vessel secured to dock, pier, or buoy equipment |
6 | Aground | Vessel has touched ground and is stationary |
7 | Engaged in fishing | Commercial vessel operating trawls, lines, or nets |
8 | Under way sailing | Vessel navigating under sail power |
14 | AIS-SART active | Search and rescue transponder broadcast active |
15 | Undefined | Default state when transponder status is unassigned |
💡 Practical Pro-Tips
- Filter Anchored Ships: If building a traffic velocity map, set
movingOnly: trueto avoid cluttering your visualization with hundreds of vessels moored at harbor berths. - Monitor Specific Ports: Pass the destination port name (e.g.
"KLAIPEDA") intodestinationto capture vessels approaching that harbor regardless of where they currently are in the Baltic. - Geofence Chokepoints: Use
region: "custom"with bounding box coordinates around the Fehmarn Belt or Great Belt to track all traffic passing between the North Sea and the Baltic Sea. - Automated Alerts via Webhooks: Connect Apify Webhooks to Make or Zapier to trigger SMS or Slack notifications whenever a monitored MMSI enters a specific port.
❓ Frequently Asked Questions (FAQ)
Where does this AIS data come from?
The data is aggregated from official coastal terrestrial AIS sensor networks across the Baltic Sea and Nordic coastlines (Fintraffic / digitraffic.fi), published openly under CC BY 4.0.
Can I track ships outside the Baltic and Nordic region?
No. This specific scraper operates across the Baltic Sea, Gulf of Finland, Gulf of Bothnia, Baltic Proper, Danish Straits, and Kattegat/Skagerrak coastal waters.
Why are some vessel names or IMO numbers blank?
AIS transmits in two channels: dynamic position (every few seconds) and static voyage metadata (every 6 minutes). If a vessel recently turned on its transponder, its static identity packet may not yet have been received.
What does movingOnly do?
It filters out vessels with speed over ground (SOG) below 0.5 knots or reported navigation status of "At anchor", "Moored", or "Aground".
📋 Changelog
v1.2 (2026-11)
- Unlocked 1,000+ Fleet Scale: Removed pagination and demo limits when explicit
maxItems > 200is requested, allowing extraction of the entire active fleet across the Baltic & Nordic basins. - Enhanced ETA ISO Parsing: Decoded 20-bit AIS ETA transmissions into verified UTC ISO-8601 timestamps with year-boundary rollover protection.
- Expanded Flag State Mapping: Added Maritime Identification Digits (MID) resolution for flags of convenience (Panama, Liberia, Marshall Islands, Gabon, Palau).
- Optimized Prefill Execution: Runs finish in under 10 seconds on Apify platform.
v1.1 (2026-07)
- Custom Bounding Box Support: Enabled spatial coordinates filtering (
minLon,minLat,maxLon,maxLat) for targeted straits and ports. - Moving-Only Filter: Added speed threshold filter to drop anchored and moored vessels.
v1.0 (2026-07)
- Initial release featuring live AIS position and static metadata join, ship type classification, and multi-format exports.