SHIP POSITIONS & FLEET TRACKING

Ship Tracking API

Track one ship by IMO or MMSI, a whole fleet in one batch request, or every ship inside a bounding box or radius. Live ship positions, crew-reported ETAs and port-call alerts over a REST API, with coverage strongest in coastal waters and around ports.

700K+

Vessel records

100 km

Max Search Radius

SDKs

TypeScript, Python, Go · API explorer · MCP server

31 days

Positions kept; area queries in 4-hour windows

What the Ship Tracking API Provides

Access AIS position data, vessel metadata, and crew-reported ETAs through RESTful endpoints. Built for developers who need reliable ship position data.

AIS Vessel Positions

Latitude, longitude, speed over ground, course, heading, and navigational status. Updated continuously from terrestrial AIS receivers.

Area-Based Queries

Find vessels within a bounding box or radius. Query by geographic area with spatial indexing for fast responses.

Crew-Reported ETAs

Access destination and ETA data as reported by vessel crew via AIS. Includes draught information for port planning.

Batch Position Queries

Retrieve positions for multiple vessels in a single request. Filter by MMSI or IMO number with time range support.

Vessel Search

Find vessels by name, callsign, flag, type, or year built. Full-text search with flexible filters.

MMSI & IMO Resolution

Query by either MMSI or IMO number. The API automatically resolves vessel identifiers across all endpoints.

Five Tracking Workflows, One Key

Each workflow is one GET request with the same Authorization: Bearer header.

One ship

Latest position, particulars and crew-reported ETA for a vessel identified by IMO or MMSI.

GET /v1/vessel/9838395/position?filter.idType=imo

A fleet

Positions for several vessels in one request, with an optional time range inside the last 31 days.

GET /v1/vessels/positions?filter.ids=215808000,244758000,211331640&filter.idType=mmsi

An area

Every ship within 100 km of a point, or inside a bounding box whose latitude and longitude spans add up to at most 4 degrees. Each call covers up to 4 hours.

GET /v1/location/vessels/radius?filter.latitude=51.9&filter.longitude=4.05&filter.radius=50000

An ETA

Destination, ETA and draught as reported by the crew, with the time of the report. The notifications API can push ETA changes instead.

GET /v1/vessel/215808000/eta?filter.idType=mmsi

An alert

A webhook or WebSocket message when a ship arrives at or leaves a port, changes ETA, changes speed or enters a geofence, checked every few minutes. Alerts are on paid plans; see the vessel notifications API and its documentation.

What One Ship Position Request Returns

The position endpoint returns the latest report together with the vessel's particulars, its reported ETA and a check against the previous position.

# Get the current position of a vessel by MMSI
curl -H "Authorization: Bearer YOUR_API_KEY" \
  "https://api.vesselapi.com/v1/vessel/215808000/position?filter.idType=mmsi"
{
  "vesselPosition": {
    "mmsi": 215808000,
    "imo": 9838395,
    "vessel_name": "CELEBRITY BEYOND",
    "latitude": 25.30714,
    "longitude": -79.87168,
    "location": { "type": "Point", "coordinates": [-79.87168, 25.30714] },
    "timestamp": "2026-10-25T22:45:39Z",
    "processed_timestamp": "2026-10-25T22:50:28.286171Z",
    "suspected_glitch": false,
    "cog": 159,
    "sog": 16.5,
    "heading": 158,
    "nav_status": 0
  },
  "vessel": {
    "imo": 9838395,
    "mmsi": 215808000,
    "call_sign": "9HA5296",
    "name": "CELEBRITY BEYOND",
    "name_ais": "CELEBRITY BEYOND",
    "vessel_type": "Passenger",
    "country": "Malta",
    "country_code": "MT",
    "year_built": 2022,
    "operating_status": "Active",
    "length": 327,
    "length_unit": "m",
    "breadth": 40,
    "breadth_unit": "m",
    "gross_tonnage": 141420,
    "deadweight_tonnage": 13991,
    "speed_calculated_avg": 13.3,
    "speed_observed_max": 20.8,
    "draught_calculated_avg": 8.3,
    "draught_observed_max": 8.3
  },
  "vesselEta": {
    "mmsi": 215808000,
    "imo": 9838395,
    "vessel_name": "CELEBRITY BEYOND",
    "destination": "USMIA-DOPOP",
    "draught": 8.3,
    "eta": "2026-10-27T11:00:00Z",
    "timestamp": "2026-10-25T22:45:39Z"
  },
  "positionCheck": {
    "previous_position": {
      "timestamp": "2026-10-25T22:39:27Z",
      "latitude": 25.33353,
      "longitude": -79.8835
    },
    "minutes_since_previous": 6,
    "distance_nm": 1.7,
    "implied_speed_kn": 16.5,
    "implied_course": 158,
    "exceeds_typical_speed": false,
    "identity_match": true,
    "lookback_hours": 80
  }
}

Field definitions are in the vessel lookup documentation. For decoded field-level AIS data and a batch time-range sample, see the AIS data API.

SDKs and MCP Server

Official SDKs for Python, TypeScript and Go cover every tracking endpoint on this page, with pagination, retries and typed errors. The MCP server gives Claude, Cursor and other MCP clients the same positions, ETAs and area queries as tools.

Available Endpoints

GET /v1/vessel/{id}/position

Get the latest position for a single vessel by MMSI or IMO number.

GET /v1/vessels/positions

Get positions for multiple vessels in a single request. Filter by time range.

GET /v1/location/vessels/bounding-box

Find vessels within a geographic bounding box. H3-indexed for fast spatial queries.

GET /v1/location/vessels/radius

Find vessels within a radius (up to 100 km) of a given coordinate.

GET /v1/vessel/{id}/eta

Get the crew-reported ETA, destination, and draught for a vessel.

GET /v1/search/vessels

Search vessels by name, callsign, flag, or vessel type.

Frequently Asked Questions

How often are ship positions updated?

A vessel under way broadcasts a position every 2 to 30 seconds, and every 3 minutes at anchor. Reports are processed as they arrive where coverage exists, and each one carries the broadcast timestamp and a processed timestamp so its age is visible.

Can I track a ship by IMO, MMSI or name?

Yes. The position, ETA and batch endpoints take an IMO or MMSI, with filter.idType saying which. A name, callsign or ENI goes through /v1/search/vessels first, which returns the IMO and MMSI to track with.

Can I track a whole fleet in one request?

Yes. /v1/vessels/positions takes several IMOs or MMSIs in filter.ids and returns their positions in one paginated response, optionally within a time range from the last 31 days. The SDKs page through the results.

Can I track ships by area instead of by identifier?

Yes. The bounding box endpoint takes a box whose latitude and longitude spans add up to at most 4 degrees; the radius endpoint takes a point and a radius of up to 100 km. Each call covers a time window of up to 4 hours, and a longer period is fetched as consecutive 4-hour slices.

Is there a free ship tracking API tier?

Yes. The free tier gives 150 calls a month on every tracking endpoint on this page, with no card. Alerts (webhooks and WebSocket) need a paid plan. Plans and quotas are on the pricing page.

Does the API include satellite AIS data?

Positions come from terrestrial AIS receivers, where coverage is strongest in coastal waters and port areas. The satellite add-on for vessels outside that range is deprecated.

Deprecated. The satellite fallback is withdrawn in its current form. Requests with filter.sat=true keep working for existing credit holders until 00:00 UTC on and carry Deprecation and Sunset headers. From the parameter is accepted and ignored, the response carries a Warning header, and no credit is charged. Credit packs are no longer on sale; unspent credits are refunded on request to support@vesselapi.com.

Start Tracking Ships Today

Get your free API key and make your first ship position query in minutes.