GET /api/v1/vessels
Search vessels by port and type. Returns IMO, name, DWT, flag, dimensions.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
port | string | Port slug | |
type | string | Vessel type filter | |
limit | number | Default 50, max 200 |
GET /api/v1/positions
Latest AIS positions for all vessels at a port. Includes course, speed, draft, nav status.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
port | string | ✓ | Port slug |
GET /api/v1/positions/latest
Global GeoJSON FeatureCollection of the latest known position for every tracked vessel (~18K). Powers the public live vessel map. Public, no auth required, CDN-cached for 5 minutes (Cache-Control: public, s-maxage=300, stale-while-revalidate=60).
Use this when you want a single global snapshot — for a map, a heatmap, or a periodic dashboard refresh — instead of paging by port. To zoom into a region, supply a bounding box; omit it to get every vessel worldwide.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
type | string | Filter by vessel type (e.g. bulk_carrier, tanker, container) | |
west | number | Western longitude of bounding box | |
south | number | Southern latitude of bounding box | |
east | number | Eastern longitude of bounding box | |
north | number | Northern latitude of bounding box |
west > east) are supported.
Response
GET /api/v1/ais/{provider}/{imo}/location/latest
Public, no-auth, citable lookup of the latest known position for a single vessel. Reads from a deduped materialized view (one row per IMO per source) and returns a JSON-LD payload that AI ingestion pipelines and academic citations can pick up directly.
Use this when you need a single vessel’s most recent fix and want a stable, machine-readable contract you can reference from a paper, news article, or LLM training pipeline. For port-wide snapshots use /api/v1/positions; for the global feed use /api/v1/positions/latest.
- No API key required.
- Open CORS (
Access-Control-Allow-Origin: *). - IP-keyed rate limiting: 60 requests/minute and 1,000 requests/UTC day.
- Cached at the edge for 60 seconds (
Cache-Control: public, max-age=60). - Released under CC-BY 4.0 with attribution.
https://axiomoverwatch.io/openapi/positions.yaml.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
provider | string | ✓ | AIS source. One of aishub, aisstream, satellite, spire, or any. Use any to get the freshest position across all sources. |
imo | string | ✓ | 7-digit IMO number, zero-padded if needed (matches ^[0-9]{7}$). |
X-RateLimit-Limit-Minute,X-RateLimit-Remaining-MinuteX-RateLimit-Limit-Day,X-RateLimit-Remaining-Day
429 responses include Retry-After (seconds until the offending bucket resets).
Response (200)
freshness_seconds is the age of the position relative to request time. Stale positions (vessel hasn’t broadcast in a while) are still returned — inspect freshness_seconds and timestamp to decide whether to trust the fix. The self-declared destination field is frequently inaccurate or deliberately deceptive; for due-diligence work prefer the paid-tier destination-reliability scoring.
Error responses
| Status | When |
|---|---|
400 | provider not in the allowed set, or imo is not 7 digits |
404 | No recent position for this IMO + provider combination |
429 | Rate limit exceeded (per-minute or per-day) |
500 | Backing materialized view lookup failed |