Open Source Intelligence (OSINT) is the practice of collecting and analyzing publicly available data for intelligence purposes. One fascinating and practical use of OSINT is ship tracking — monitoring the movement, identity, and status of vessels around the world using open data.

Whether you're a maritime enthusiast, journalist, analyst, or just curious, this guide will walk you through the basics and also give you high-level tips used by professionals.

🌍 Why Track Ships?

Tracking ships can be useful for:

🧭 The Basics: How Ships Are Tracked

Ships are tracked primarily through a system called AIS (Automatic Identification System). This system uses radio signals to broadcast a ship's identity, position, speed, course, and other data. AIS is mandated for most commercial ships over 300 gross tons and all passenger vessels.

🔑 Key Concepts in Ship Tracking

Before diving into tools and techniques, let's cover some foundational concepts.

1. Automatic Identification System (AIS)

AIS is a tracking system used by ships to broadcast their position, speed, course, and other details via VHF radio signals. Mandated by the International Maritime Organization (IMO) for most commercial vessels over 300 gross tons, AIS data is publicly available through various platforms.

What AIS Provides:

Limitations of AIS
  • Ships can disable AIS (known as "going dark"), often for legitimate reasons (e.g., avoiding pirates) or illicit ones (e.g., sanctions evasion).
  • Not all vessels are required to use AIS (e.g., small boats or military ships).
  • AIS data can be spoofed, where ships broadcast false locations or identities.

🚤 Types of Vessels

Understanding vessel types helps contextualize tracking data:

🛠️ Tools for Tracking Ships with OSINT

Here's a detailed look at the most accessible and beginner-friendly tools for ship tracking, along with tips for using them effectively.

1. MarineTraffic

Overview: MarineTraffic is one of the most popular platforms for real-time ship tracking, aggregating AIS data from a global network of receivers.

Features:

How to Use:

2. VesselFinder

Overview: Similar to MarineTraffic, VesselFinder offers real-time AIS tracking with a user-friendly interface.

Features:

How to Use:

3. FleetMon

Overview: FleetMon focuses on commercial shipping and provides detailed vessel and port data.

Features:

How to Use:

4. Satellite Imagery Platforms

Overview: For ships not broadcasting AIS or in remote areas, satellite imagery can provide visual confirmation. Platforms like Sentinel Hub or Google Earth Pro offer free or low-cost options.

Features:

How to Use:

5. Social Media and Crowdsourced Data

Overview: Platforms like X, Reddit, or maritime forums can provide real-time tips, photos, or reports about ship movements.

How to Use:

6. Ship Registries and Databases

Overview: Public ship registries provide detailed information about a vessel's ownership, flag, and technical specifications.

Key Resources:

Tips
  • Ownership data can reveal links to companies involved in suspicious activities.
  • Check inspection reports for safety or compliance issues.

🧠 Advanced OSINT Tactics

🛰️ 1. Detecting AIS Spoofing

What It Is: AIS spoofing is when a ship deliberately broadcasts a false location, identity, or destination to hide its true activity — often for sanctions evasion, smuggling, or military concealment.

How to Spot It:

Red Flags to Watch For
  • Two ships using the same MMSI at different locations.
  • A ship reporting it's docked, but satellite imagery shows open water.
  • Location changes that suggest the ship "teleported" thousands of kilometers in hours.

Example: A tanker reports being in Singapore, but a satellite image reveals it near Somalia — likely trying to mask an illicit fuel transfer in the Horn of Africa.

🕳️ 2. Tracking "Dark" Vessels

What It Is: A "dark" vessel is a ship that has turned off its AIS transponder, making it invisible to most tracking platforms. This often happens near conflict zones, sanctioned waters, or during illegal transfers.

How to Track:

Tools to Use:

Example: A fishing vessel goes dark near a marine protected area off South America. Sentinel imagery from the next day reveals a small vessel operating within the no-fishing zone.

🕵️‍♀️ 3. Analyzing Ownership Networks

What It Is: Ships often change names, flags, and companies to hide their real owners. Tracing ownership networks can uncover links to illicit trade, sanctions evasion, or money laundering.

How to Investigate:

Example: You find that the company behind the tanker Ocean Star is registered in the Marshall Islands, with a corporate director also linked to a shipping firm under US sanctions for trading with North Korea.

📍 4. Geofencing and Alerts

What It Is: Geofencing is the practice of defining virtual boundaries on a map to get real-time alerts when a ship enters or exits that zone. Ideal for monitoring sensitive ports, restricted waters, or choke points.

How to Set It Up:

Use Cases:

Example: You receive an alert when Ocean Star crosses into a high-risk port in Libya known for illegal oil exports. That movement suggests possible violations of embargo laws.

⚠️ Legal and Ethical Considerations

Tracking ships via public AIS data is legal in most jurisdictions, but be aware:

🛠️ Real-World Example: Sanctions Evasion

Let's say you want to investigate a tanker suspected of violating oil sanctions:

  1. Find the IMO number via news or watchlist.
  2. Use MarineTraffic or VesselFinder to check past movements.
  3. Look for dark periods or STS transfers near sanctioned regions.
  4. Use Sentinel Hub EO Browser to examine satellite imagery from those dates.
  5. Check ownership via Equasis.
  6. Use corporate registries (e.g., Panama, Marshall Islands) to trace shell companies.
  7. Monitor port calls in regions of interest (e.g., Syria, North Korea).

💻 Build Your Own Marine Tracking System Using Python + APIs

What It Is: Instead of relying solely on platforms like MarineTraffic or VesselFinder, you can build your own lightweight tracking tool using Python and various maritime APIs. This gives you more control, custom automation, and the power to integrate data across platforms.

What You'll Need:

Install Dependencies:

pip install flask requests pandas folium geopandas datetime

Step 1: Set Up Your Flask Project

Python Project Setup

Create a project structure to keep things organized.

app.py

from flask import Flask, render_template
import requests
import pandas as pd
import folium
import geopandas as gpd
from datetime import datetime
import os

app = Flask(__name__)

# Function to fetch data from MarineTraffic API
def get_marinetraffic_data(api_key, area):
    url = f"https://services.marinetraffic.com/api/exportvessels/{api_key}"
    params = {
        'timespan': 10,
        'area': area,
        'protocol': 'json'
    }
    try:
        response = requests.get(url, params=params)
        if response.status_code == 200:
            return response.json()
        else:
            print(f"MarineTraffic API error: {response.status_code}")
            return []
    except Exception as e:
        print(f"Error fetching MarineTraffic data: {e}")
        return []

# Function to fetch data from FleetMon API
def get_fleetmon_data(api_key):
    url = f"https://www.fleetmon.com/api/v1/vessels/{api_key}"
    try:
        response = requests.get(url)
        if response.status_code == 200:
            return response.json()
        else:
            print(f"FleetMon API error: {response.status_code}")
            return []
    except Exception as e:
        print(f"Error fetching FleetMon data: {e}")
        return []

# Function to aggregate AIS data from multiple APIs
def fetch_ais_data():
    data = []

    mt_api_key = os.environ.get('MARINETRAFFIC_API_KEY', 'YOUR_MT_API_KEY')
    mt_data = get_marinetraffic_data(mt_api_key, 'MED')
    for vessel in mt_data:
        try:
            data.append({
                'mmsi': vessel.get('MMSI'),
                'name': vessel.get('SHIPNAME', 'Unknown'),
                'lat': float(vessel.get('LAT')),
                'lon': float(vessel.get('LON')),
                'speed': vessel.get('SPEED', 0),
                'timestamp': vessel.get('LAST_POS',
                    datetime.utcnow().isoformat())
            })
        except (ValueError, TypeError):
            continue

    fm_api_key = os.environ.get('FLEETMON_API_KEY', 'YOUR_FM_API_KEY')
    fm_data = get_fleetmon_data(fm_api_key)

    df = pd.DataFrame(data)
    if not df.empty:
        df['timestamp'] = pd.to_datetime(df['timestamp'])
    return df

# Function to create interactive map with Folium
def create_map(df):
    m = folium.Map(location=[35.0, 15.0], zoom_start=5, tiles=None)

    folium.TileLayer(
        tiles='https://tiles.openseamap.org/seamark/{z}/{x}/{y}.png',
        attr='OpenSeaMap',
        name='OpenSeaMap'
    ).add_to(m)

    folium.TileLayer('openstreetmap').add_to(m)

    for _, row in df.iterrows():
        try:
            folium.Marker(
                location=[row['lat'], row['lon']],
                popup=f"{row['name']} (MMSI: {row['mmsi']})"
                      f"<br>Speed: {row['speed']} knots",
                icon=folium.Icon(icon='ship', prefix='fa',
                    color='blue')
            ).add_to(m)
        except (KeyError, ValueError):
            continue

    folium.LayerControl().add_to(m)

    os.makedirs('static/maps', exist_ok=True)
    map_path = 'maps/vessel_map.html'
    m.save(f'static/{map_path}')
    return map_path

# Flask route
@app.route('/')
def index():
    try:
        df = fetch_ais_data()
        if not df.empty:
            df.to_csv('data/vessels.csv', index=False)
    except Exception as e:
        print(f"Error fetching data: {e}")
        try:
            df = pd.read_csv('data/vessels.csv')
        except FileNotFoundError:
            df = pd.DataFrame()

    map_path = create_map(df) if not df.empty \
        else 'maps/empty_map.html'
    return render_template('index.html', map_path=map_path)

if __name__ == '__main__':
    os.makedirs('data', exist_ok=True)
    app.run(debug=True)

index.html (template)

<!DOCTYPE html>
<html>
<head>
    <title>Marine Tracker 🌊</title>
    <style>
        #map { height: 600px; width: 100%; }
        body { font-family: monospace; margin: 20px; }
        h1 { color: #00ffff; }
    </style>
</head>
<body>
    <h1>Real-Time Ship Tracking 🚢</h1>
    <div id="map">
        <iframe
            src="{{ url_for('static', filename=map_path) }}"
            width="100%" height="600px"
            frameborder="0">
        </iframe>
    </div>
    <p>Data updates every 5 minutes.</p>
    <script>
        function refreshMap() {
            document.querySelector('iframe')
                .contentWindow.location.reload();
        }
        setInterval(refreshMap, 300000);
    </script>
</body>
</html>

⛴️ Final Thoughts

Tracking ships using OSINT combines real-time data, analytical thinking, and detective work. You don't need expensive tools to get started — just curiosity and methodical research. As global shipping remains the backbone of trade and geopolitics, understanding how to follow the movements of vessels across the oceans gives you a powerful lens into world affairs.