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.
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 'https://api.facha.dev/v1/ship/radius/38.70/-9.15/30'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);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())[
{
"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
| Parameter | Type | Required | Description |
|---|---|---|---|
lat / lon / radius | path | Required | `/ship/radius/{lat}/{lon}/{km}` returns vessels within that radius in kilometres. 38.70 / -9.15 / 30 |
(mmsi) | path | Optional | Look up a single vessel by its MMSI identifier. 263619000 |
(aircraft) | path | Optional | The 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
Distance Calculator
Calculate the straight-line distance and bearing between two points on a map by latitude/longitude using the Haversine formula — km, miles and nautical miles.
Bearing Calculator
Calculate the initial and final bearing between two latitude/longitude points, with compass direction, quadrant bearing and great-circle distance.
Unit Converter
Convert between units of length, weight, temperature, area, volume, speed, time and data storage instantly, with a swap button and common conversion tables.
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.