openapi: 3.1.0 info: title: VesselFinder AIS API description: | REST API providing real-time and on-demand AIS vessel positions, voyage information, and vessel master data from the VesselFinder global AIS network (terrestrial and satellite). Authentication is performed via the `userkey` query parameter. Responses default to JSON and may be requested as XML by setting `format=xml`. Most pay-per-use methods deduct credits from the account's balance; subscription methods (VesselsList, LiveData) are billed by fleet or area size and dataset selection. version: '1.0' contact: name: VesselFinder API Support url: https://api.vesselfinder.com/docs/ license: name: Commercial — VesselFinder Terms of Use url: https://www.vesselfinder.com/terms servers: - url: https://api.vesselfinder.com description: VesselFinder AIS API tags: - name: Vessels description: On-demand vessel position, voyage, and master data lookups. - name: Port Calls description: Arrival and departure events for vessels or ports. - name: Expected Arrivals description: Vessels with announced ETAs at a selected port. - name: Master Data description: Static vessel particulars by IMO. - name: Distance description: Sea-route distance and geometry between two points. - name: Vessels List description: Predefined-fleet data, subscription-based. - name: Live Data description: All vessels within a predefined geographic area, subscription-based. - name: Status description: Account status and remaining credits. - name: List Manager description: Manage the watchlist of vessels backing the VesselsList method. paths: /vessels: get: tags: [Vessels] summary: Get Vessels description: Return AIS and optionally Voyage / Master data for one or more vessels identified by IMO or MMSI. operationId: getVessels parameters: - $ref: '#/components/parameters/userkey' - name: imo in: query description: Comma-separated list of IMO numbers. Either imo or mmsi is required. schema: type: string example: '9175717' - name: mmsi in: query description: Comma-separated list of MMSI numbers. Either imo or mmsi is required. schema: type: string example: '538003422' - $ref: '#/components/parameters/format' - name: extradata in: query description: Additional datasets to include in the response. Supported values are `voyage` and `master`. schema: type: string enum: [voyage, master, 'voyage,master'] - name: interval in: query description: Maximum age of returned positions in minutes. schema: type: integer minimum: 1 - name: sat in: query description: Set to 1 to include satellite positions. schema: type: integer enum: [0, 1] default: 0 responses: '200': description: Array of vessels with AIS data and optional Voyage / Master sections. content: application/json: schema: type: array items: $ref: '#/components/schemas/Vessel' '401': $ref: '#/components/responses/Unauthorized' '402': $ref: '#/components/responses/PaymentRequired' /portcalls: get: tags: [Port Calls] summary: Get Port Calls description: Return arrival and departure events for one or more vessels (by IMO or MMSI) or for a port (by LOCODE). operationId: getPortCalls parameters: - $ref: '#/components/parameters/userkey' - name: interval in: query required: true description: Maximum age of returned events in minutes. schema: type: integer minimum: 1 - name: imo in: query description: Comma-separated list of IMO numbers. One of imo, mmsi, or locode is required. schema: { type: string } - name: mmsi in: query description: Comma-separated list of MMSI numbers. One of imo, mmsi, or locode is required. schema: { type: string } - name: locode in: query description: UN/LOCODE port identifier. Cannot be combined with imo or mmsi. schema: { type: string, example: 'BGVAR' } - $ref: '#/components/parameters/format' - name: event in: query description: Filter to a single event type. schema: { type: string, enum: [arrival, departure] } - name: fromdate in: query description: Start of the date window (YYYY-MM-DD HH:MM:SS, UTC). schema: { type: string, format: date-time } - name: todate in: query description: End of the date window (YYYY-MM-DD HH:MM:SS, UTC). schema: { type: string, format: date-time } - name: extradata in: query description: Additional datasets to include. Supported values are `ais` and `voyage`. schema: { type: string, enum: [ais, voyage, 'ais,voyage'] } - name: limit in: query description: Maximum number of events to return. schema: { type: integer, minimum: 1 } - name: last_id in: query description: Return only events with id greater than this value. schema: { type: integer } - name: anchorage in: query description: 0 to exclude anchorage events, 1 to include, 2 to return anchorage events only. schema: { type: integer, enum: [0, 1, 2] } - name: imo_only in: query description: Restrict events to vessels carrying an IMO number. schema: { type: integer, enum: [0, 1] } responses: '200': description: Array of port-call events. content: application/json: schema: type: array items: { $ref: '#/components/schemas/PortCall' } '401': { $ref: '#/components/responses/Unauthorized' } '402': { $ref: '#/components/responses/PaymentRequired' } /expectedarrivals: get: tags: [Expected Arrivals] summary: Get Expected Arrivals description: Return vessels with announced ETAs at the selected port within an interval or date window. operationId: getExpectedArrivals parameters: - $ref: '#/components/parameters/userkey' - name: locode in: query required: true description: UN/LOCODE port identifier. schema: { type: string, example: 'BGVAR' } - name: interval in: query description: Look-ahead window in minutes from now. Use either interval or fromdate/todate. schema: { type: integer, minimum: 1 } - name: fromdate in: query schema: { type: string, format: date-time } - name: todate in: query schema: { type: string, format: date-time } - $ref: '#/components/parameters/format' - name: extradata in: query schema: { type: string, enum: [voyage, master, 'voyage,master'] } - name: limit in: query schema: { type: integer, minimum: 1 } - name: aistype in: query description: Filter by AIS ship type code(s), comma separated. schema: { type: string } responses: '200': description: Array of expected vessel arrivals. content: application/json: schema: type: array items: { $ref: '#/components/schemas/Vessel' } '401': { $ref: '#/components/responses/Unauthorized' } '402': { $ref: '#/components/responses/PaymentRequired' } /masterdata: get: tags: [Master Data] summary: Get Master Data description: Return static vessel particulars (Master dataset) by IMO. operationId: getMasterData parameters: - $ref: '#/components/parameters/userkey' - name: imo in: query required: true description: Comma-separated list of IMO numbers. schema: { type: string, example: '9175717' } - $ref: '#/components/parameters/format' responses: '200': description: Array of master-data records. content: application/json: schema: type: array items: { $ref: '#/components/schemas/MasterData' } '401': { $ref: '#/components/responses/Unauthorized' } '402': { $ref: '#/components/responses/PaymentRequired' } /distance: get: tags: [Distance] summary: Get Sea Distance description: Return the shortest sea route between two coordinates as a GeoJSON LineString together with distance in meters. operationId: getDistance parameters: - $ref: '#/components/parameters/userkey' - name: from in: query required: true description: Origin as `lon,lat`. schema: { type: string, example: '27.3711,43.256' } - name: to in: query required: true description: Destination as `lon,lat`. schema: { type: string, example: '128.345,-34.223' } - name: gateways in: query description: Comma-separated list of allowed gateways (suez, panama, kiel, oresund, messina, corinth, malacca, drake, magellan, northeast, northwest). schema: { type: string } - name: ECA in: query description: Emission Control Area preference. schema: { type: string, enum: [allow, deny, minimize] } - name: EPSG3857 in: query description: Set to 1 to return coordinates in WebMercator (EPSG:3857). schema: { type: integer, enum: [0, 1] } responses: '200': description: GeoJSON Feature describing the computed route. content: application/json: schema: { $ref: '#/components/schemas/DistanceResponse' } '401': { $ref: '#/components/responses/Unauthorized' } '402': { $ref: '#/components/responses/PaymentRequired' } /vesselslist: get: tags: [Vessels List] summary: Get Vessels List description: Return AIS, Voyage, and/or Master data for the account's predefined fleet (subscription). operationId: getVesselsList parameters: - $ref: '#/components/parameters/userkey' - $ref: '#/components/parameters/format' - name: interval in: query description: Maximum position age in minutes. schema: { type: integer, minimum: 1 } responses: '200': description: Array of vessels in the account's predefined fleet. content: application/json: schema: type: array items: { $ref: '#/components/schemas/Vessel' } '401': { $ref: '#/components/responses/Unauthorized' } /livedata: get: tags: [Live Data] summary: Get Live Area Data description: Return all vessels in the account's predefined rectangular area (subscription). operationId: getLiveData parameters: - $ref: '#/components/parameters/userkey' - $ref: '#/components/parameters/format' - name: interval in: query description: Maximum position age in minutes. schema: { type: integer, minimum: 1 } responses: '200': description: Array of vessels currently in the predefined area. content: application/json: schema: type: array items: { $ref: '#/components/schemas/Vessel' } '401': { $ref: '#/components/responses/Unauthorized' } /status: get: tags: [Status] summary: Get Account Status description: Return the remaining API credits and access expiration date for the account. operationId: getStatus parameters: - $ref: '#/components/parameters/userkey' - $ref: '#/components/parameters/format' responses: '200': description: Account status object. content: application/json: schema: { $ref: '#/components/schemas/Status' } '401': { $ref: '#/components/responses/Unauthorized' } /listmanager: get: tags: [List Manager] summary: Get Watchlist description: Return the current list of vessels (IMO and MMSI) backing the VesselsList method. operationId: getWatchlist parameters: - $ref: '#/components/parameters/userkey' responses: '200': description: Array of vessel identifiers in the watchlist. content: application/json: schema: { $ref: '#/components/schemas/Watchlist' } '401': { $ref: '#/components/responses/Unauthorized' } post: tags: [List Manager] summary: Add Vessels To Watchlist description: Add the supplied vessels (by IMO or MMSI) to the watchlist. operationId: addWatchlistVessels parameters: - $ref: '#/components/parameters/userkey' requestBody: required: true content: application/x-www-form-urlencoded: schema: { $ref: '#/components/schemas/WatchlistEdit' } responses: '200': { description: Watchlist updated. } '401': { $ref: '#/components/responses/Unauthorized' } put: tags: [List Manager] summary: Replace Watchlist description: Replace all vessels in the watchlist with the supplied list. operationId: replaceWatchlistVessels parameters: - $ref: '#/components/parameters/userkey' requestBody: required: true content: application/x-www-form-urlencoded: schema: { $ref: '#/components/schemas/WatchlistEdit' } responses: '200': { description: Watchlist replaced. } '401': { $ref: '#/components/responses/Unauthorized' } delete: tags: [List Manager] summary: Remove Vessels From Watchlist description: Remove the supplied vessels from the watchlist. operationId: deleteWatchlistVessels parameters: - $ref: '#/components/parameters/userkey' - name: imo in: query schema: { type: string } - name: mmsi in: query schema: { type: string } responses: '200': { description: Vessels removed. } '401': { $ref: '#/components/responses/Unauthorized' } components: parameters: userkey: name: userkey in: query required: true description: Personal API key issued by VesselFinder. schema: { type: string } format: name: format in: query description: Response format. Defaults to JSON. schema: type: string enum: [json, xml] default: json responses: Unauthorized: description: Invalid or missing userkey. PaymentRequired: description: Insufficient credits or expired access. schemas: AIS: type: object description: AIS position and dynamic vessel state. properties: MMSI: { type: integer } TIMESTAMP: { type: string, format: date-time } LATITUDE: { type: number, format: float } LONGITUDE: { type: number, format: float } COURSE: { type: number, format: float } SPEED: { type: number, format: float } HEADING: { type: integer } NAVSTAT: { type: integer, description: AIS navigation status code. } IMO: { type: integer } NAME: { type: string } CALLSIGN: { type: string } TYPE: { type: integer, description: AIS ship-type code. } A: { type: integer, description: Distance from GNSS receiver to bow (m). } B: { type: integer, description: Distance from GNSS receiver to stern (m). } C: { type: integer, description: Distance from GNSS receiver to port (m). } D: { type: integer, description: Distance from GNSS receiver to starboard (m). } DRAUGHT: { type: number, format: float } DESTINATION: { type: string } LOCODE: { type: string } ETA_AIS: { type: string } ETA: { type: string, format: date-time } SRC: { type: string, enum: [TER, SAT], description: Source — terrestrial or satellite. } ZONE: { type: string } ECA: { type: integer, description: 1 if currently in an Emission Control Area. } Voyage: type: object description: Last completed port call summary for a vessel. properties: LOCODE: { type: string } DEPARTURE: { type: string, format: date-time } LASTPORT: { type: string } LASTCOUNTRY: { type: string } MasterData: type: object description: Static vessel particulars. properties: IMO: { type: integer } NAME: { type: string } FLAG: { type: string } TYPE: { type: string } BUILT: { type: integer } BUILDER: { type: string } OWNER: { type: string } MANAGER: { type: string } LENGTH: { type: number, format: float } BEAM: { type: number, format: float } MAXDRAUGHT: { type: number, format: float } GT: { type: integer, description: Gross tonnage. } NT: { type: integer, description: Net tonnage. } DWT: { type: integer, description: Deadweight tonnage. } TEU: { type: integer } CRUDE: { type: integer } Vessel: type: object description: A vessel returned from /vessels, /vesselslist, /livedata, or /expectedarrivals. properties: AIS: { $ref: '#/components/schemas/AIS' } VOYAGE: { $ref: '#/components/schemas/Voyage' } MASTERDATA: { $ref: '#/components/schemas/MasterData' } PortCall: type: object description: A vessel arrival or departure event at a port. properties: MMSI: { type: integer } IMO: { type: integer } LOCODE: { type: string } EVENT: { type: string, enum: [arrival, departure] } TIMESTAMP: { type: string, format: date-time } PORT: { type: string } COUNTRY: { type: string } AIS: { $ref: '#/components/schemas/AIS' } VOYAGE: { $ref: '#/components/schemas/Voyage' } DistanceResponse: type: object description: GeoJSON Feature describing the computed route. properties: type: { type: string, example: Feature } properties: type: object properties: Crossing: type: array items: { type: string } description: Ordered list of canals, straits, and passages crossed. Distance: { type: number, description: Route length in meters. } DistanceECA: { type: number, description: Distance spent in ECA zones in meters. } geometry: type: object properties: type: { type: string, example: LineString } coordinates: type: array items: type: array items: { type: number } Status: type: object properties: CREDITS: { type: integer, description: Remaining API credits. } EXPIRATION_DATE: { type: string, format: date-time } Watchlist: type: object properties: imo: type: array items: { type: integer } mmsi: type: array items: { type: integer } WatchlistEdit: type: object properties: imo: { type: string, description: Comma-separated IMO numbers. } mmsi: { type: string, description: Comma-separated MMSI numbers. } securitySchemes: UserKey: type: apiKey in: query name: userkey security: - UserKey: []