Two endpoints for consolidated position data: where a set of vessels is now, and where one vessel has been. Both merge every position source you are licensed for into a single track.Ask by vessel, by area, or by both. Neither endpoint filters by fleet.
Where are these vessels, or what is in this area, right now?
POST /v1/historical
Where has this vessel been, between these two times?
These endpoints sit behind a base path of their own
Vessel Positions is served by our consolidated position service, which the gateway reaches at /meridia-voyage-intelligence. Call it at https://api.polestar-production.com/meridia-voyage-intelligence/v1/latest and /v1/historical. The reference pages show the full path including this prefix.
Both are reads, despite the verb
Neither endpoint creates anything. They are POSTs because the filter payload carries nested objects, a list of identifiers and a circle or an arbitrary polygon ring, which does not survive a query string at usable length. Treat them as reads: safe to repeat, and grouped with the other reads in this section.
POST /v1/latest returns the most recent position for each matching vessel. Send at least one of vessel or geographic_filter.
Each entry carries the vessel's identity and a voyage_last_location block: position, timestamp, source, speed, course, heading, navigational status, draught, and the destination the vessel reported. matched_destination is our reading of that free text against the port library, so you get a port name and UN/LOCODE alongside the raw_destination string the crew typed.
The lookback window is set by us, not by you
There is no time parameter on this endpoint. When you pass a geographic_filter we look back 3 hours; without one we look back 31 days. An area search therefore answers "what is here now", and an identifier search answers "where was this vessel last seen", even though both are the same call. A vessel silent for longer than the window is absent from the response rather than returned with a stale position.
POST /v1/historical returns positions for one vessel, or for an area, across a time window. Both timestamps are required.
Results come back grouped by vessel, each with a voyages array of positions in the same shape latest uses for its single reading. The window may not exceed 731 days, and neither bound may be in the future.downsampling_frequency thins the track to one position every N minutes. A year of a busy vessel at full resolution is a large response and usually more detail than a map needs.
The identifier fields are not the same on both endpoints#
This is the easiest mistake to make here, and it returns a 400 rather than an empty result.
/v1/latest
/v1/historical
By IMO
imo_numbers, an array
imo_number, a single value
By MMSI
mmsi_numbers, an array
mmsi, a single value
latest is a batch endpoint and takes lists; historical builds one track and takes one vessel. Set exactly one of the identifier fields in either case.
fleet_id exists on the wire and is rejected
Both request bodies declare fleet_id, and both reject it with a 400 and ERROR_152. Fleet filtering is not supported on these endpoints yet. Read the fleet's membership with Fleet Management and pass the IMO numbers to /v1/latest instead.
geographic_filter takes exactly one of circle or polygon. Sending both, or an empty object, is a 400 with ERROR_146.
A circle needs all three of latitude, longitude and radius together, and the radius is in metres, between 100 and 50,000. A polygon is an array of [longitude, latitude] pairs, longitude first, with at least three points. We close the ring for you if the first and last points differ.The 50 km ceiling on a circle is the practical limit worth planning around. For anything larger, use a polygon, or search by the zone-and-port endpoint and take the vessel list from there.
sources restricts the position sources we draw from: S_AIS and T_AIS for satellite and terrestrial AIS, R_AIS, PT_AIS, SATCOMMS and LRIT. Sources you are not licensed for are ignored rather than rejected, so listing one you do not hold changes nothing
speed_min and speed_max bound speed over ground in knots. An upper bound is how you separate vessels at anchor or alongside from traffic under way
The two endpoints page differently. latest uses limit and offset. historical uses an opaque cursor: read meta.next_cursor from a response and send it back as cursor on the next call. Keep requesting until next_cursor comes back empty rather than counting against total_count.