Skip to main content
Vessel registry and real-time AIS positions.

GET /api/v1/vessels

Search vessels by port and type. Returns IMO, name, DWT, flag, dimensions. Parameters Response
Example

GET /api/v1/positions

Latest AIS positions for all vessels at a port. Includes course, speed, draft, nav status. Parameters Response
Example

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 All four bounds must be supplied together; partial bounds are ignored and a global response is returned. Bounding boxes that cross the antimeridian (where west > east) are supported. Response
The full global payload is roughly 800 KB gzipped. Refresh no more than once every 5 minutes — additional requests inside that window are served from the CDN cache and return identical data. Example

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.
A machine-readable OpenAPI 3.1 spec for this endpoint is published at https://axiomoverwatch.io/openapi/positions.yaml. Path parameters Response headers Every successful response includes rate-limit headers:
  • X-RateLimit-Limit-Minute, X-RateLimit-Remaining-Minute
  • X-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 Example