BYTETOOLS

facha.dev (AIS Ships) API

Free AIS vessel tracking API with no key: live ship positions in a radius, with MMSI, IMO, name, vessel type, dimensions, draught and declared destination. Tested example included.

No API key requiredCORS enabledHTTPSFree tier

Endpoint tested and returned HTTP 200 on 2026-08-21

What is the facha.dev (AIS Ships) API?

facha.dev exposes a free, key-free AIS ship tracking API. Querying a radius around a coordinate returns the vessels currently reporting there, each with its MMSI and IMO numbers, name, call sign, decoded vessel type, hull dimensions, draught, speed, course and declared destination.

Live vessel positions are usually the preserve of maritime data vendors charging by the query, so a key-free AIS radius search is unusual. The decoding is the valuable part: raw AIS transmits numeric type codes and packed dimension offsets, and this API turns type 52 into "Port Tender" and gives you `dimensionToBow`, `dimensionToStern`, `dimensionToPort` and `dimensionToStarboard` as usable metres, from which the vessel's actual length and beam follow.

Two fields are self-reported by the crew and should be treated accordingly. `destination` is free text typed into the transponder — "PT LIS", "BARREIRO-LISBOA" — with no controlled vocabulary, and `estimatedTimeOfArrival` is an AIS-format month-day-hour-minute string with no year, which is why a stale entry can show an ETA months in the past. Coverage is receiver-dependent: coastal areas near contributing stations are dense, open ocean is not.

Quick facts

Base URL
https://api.facha.dev/v1
Authentication
No API key or account for the public endpoints. Rate limits are applied per bucket and reported in the response headers.
Rate limit
20 requests per 60 seconds on the live ship bucket, reported via `X-RateLimit-Remaining` and `X-RateLimit-Reset`.
Pricing
Free.
CORS
Enabled — callable directly from browser JavaScript
Official docs
Read the docs

How to use the facha.dev (AIS Ships) 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. List vessels within 30 km of a coordinate

GET https://api.facha.dev/v1/ship/radius/38.70/-9.15/30

curl
curl 'https://api.facha.dev/v1/ship/radius/38.70/-9.15/30'
JavaScript (fetch)
const res = await fetch("https://api.facha.dev/v1/ship/radius/38.70/-9.15/30");
if (!res.ok) throw new Error(`Request failed: ${res.status}`);
const data = await res.json();
console.log(data);
Python (requests)
import requests

res = requests.get("https://api.facha.dev/v1/ship/radius/38.70/-9.15/30", timeout=20)
res.raise_for_status()
print(res.json())
Response — HTTP 200 (truncated)
[
  {
    "mmsi": 263619000,
    "timestamp": "2026-08-21T08:01:04.000Z",
    "longitude": -9.15964,
    "latitude": 38.70255,
    "courseOverGround": 249.6,
    "speedOverGround": 0.1,
    "heading": null,
    "rateOfTurn": 128,
    "navigationalStatus": 0,
    "imoNumber": 9276119,
    "name": "MONTENOVO",
    "callSign": "CSDT",
    "type": 52,
    "vesselType": "Port Tender",
    "vesselTypeSlug": "port-tender",
    "dimensionToBow": 13,
    "dimensionToStern": 13,
    "dimensionToPort": 3,
    "dimensionToStarboard": 5,
    "draught": 4.6,
    "destination": "PT LIS",
    "estimatedTimeOfArrival": "04-21 22:00"
  },
  {
    "mmsi": 263701460,
    "timestamp": "2026-08-21T08:00:54.000Z",
    "longitude": -9.13347,
    "latitude": 38.70622,
    "courseOverGround": 18,
    "speedOverGround": 0.1,
    "heading": 246,
    "rateOfTurn": 128,
    "navigationalStatus": 0,
    "imoNumber": 0,
    "name": "ANTERO DE QUENTAL",
    "callSign": "CSKP",
    "type": 69,
    "vesselType": "Passenger",
    "vesselTypeSlug": "passenger",
    "dimensionToBow": 19,
    "dimensionToStern": 30,
    "dimensionToPort": 6,
    "dimensionToStarboard": 6,
    "draught": 0.3,
    "destination": "BARREIRO-LISBOA",
    "estimatedTimeOfArrival": "08-21 19:30"
  },
  {
    "mmsi": 263442559,
    "timestamp": "2026-08-21T08:00:15.000Z",
    "longitude": -9.41747,
    "latitude": 38.69129,
    "courseOverGround": null,
    "speedOverGround": 0,
    "heading": null,
    "rateOfTurn": 128,
    "navigationalStatus": 15,
    "imoNumber": 0,
    "name": "SEA YOU TOO",
    "callSign": "CRB2157",
    "type":

Parameters

ParameterTypeRequiredDescription
lat / lon / radiuspathRequired`/ship/radius/{lat}/{lon}/{km}` returns vessels within that radius in kilometres. 38.70 / -9.15 / 30
(mmsi)pathOptionalLook up a single vessel by its MMSI identifier. 263619000
(aircraft)pathOptionalThe same host also serves aircraft tracking endpoints under `/aircraft/`.

Response fields

mmsiinteger
Maritime Mobile Service Identity — the radio identifier. Its first three digits are the flag state's MID code.
imoNumberinteger
IMO number, permanent for the hull's life. Returns 0 for vessels that have none, such as small ferries.
name / callSignstring
Vessel name and radio call sign as broadcast.
latitude / longitudefloat
Last reported position.
timestampstring
ISO 8601 time of that report. Check it — vessels at anchor transmit only every few minutes.
speedOverGround / courseOverGround / headingfloat
Speed in knots, course made good, and hull heading. Heading is null when no gyro data is transmitted.
navigationalStatusinteger
AIS status code: 0 under way using engine, 1 at anchor, 5 moored, and so on.
vesselType / vesselTypeSlug / typestring / integer
Decoded vessel category with a slug form, plus the raw numeric AIS type code.
dimensionToBow / Stern / Port / Starboardinteger
Distances in metres from the transponder to each extremity. Bow plus stern gives length; port plus starboard gives beam.
draughtfloat
Declared draught in metres — crew-entered, and often stale after loading or discharge.
destination / estimatedTimeOfArrivalstring
Free-text destination and an AIS-format ETA with no year. Both are typed in by the crew.

What you can build with the facha.dev (AIS Ships) API

  • Show live vessel traffic in a port or approach channel
  • Monitor arrivals and departures at a specific terminal
  • Identify a ship visible from shore by its position and heading
  • Estimate vessel size from the transmitted dimension offsets
  • Build a maritime traffic dashboard without a data vendor contract

Common errors and how to fix them

429 Too Many Requests

The live ship bucket allows 20 requests per minute.

Fix: Read `X-RateLimit-Remaining` and `X-RateLimit-Reset` from the headers. One radius query per minute is enough — AIS position reports are not more frequent than that for most vessels.

Empty array offshore

No contributing receiver is within range.

Fix: AIS is VHF and line-of-sight, so terrestrial coverage extends only tens of nautical miles from shore. Open-ocean tracking needs satellite AIS, which this is not.

destination is unhelpful or wrong

It is free text entered by the crew, with no controlled vocabulary.

Fix: Never parse it as a port code. Use it as a hint for a human reader, not as data.

ETA appears to be in the past

The AIS ETA format carries month, day, hour and minute but no year.

Fix: Interpret it relative to the report `timestamp`, and discard ETAs that predate the last position report.

facha.dev (AIS Ships) API — frequently asked questions

Is this AIS ship tracking API free?

Yes, the public endpoints need no key or account. The live ship bucket is limited to 20 requests per minute, which is ample for a dashboard given how often vessels actually report.

What is the difference between MMSI and IMO number?

MMSI identifies the radio installation and can change when a vessel is reflagged or sold; the IMO number is assigned to the hull for its whole life. Use IMO for identity over time and MMSI for matching live transmissions. Small vessels often have no IMO number and return 0.

How do I work out a ship's length?

Add `dimensionToBow` and `dimensionToStern` for overall length, and `dimensionToPort` plus `dimensionToStarboard` for beam. The four values are offsets from the transponder's position on the vessel, which is why they are given separately.

Why do some vessels not appear?

AIS reception is line-of-sight from shore-based receivers, so coverage thins quickly offshore. Small craft below the carriage threshold and vessels with their transponders switched off will not appear at all.

Tools that pair with this API

facha.dev (AIS Ships) 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.