VesselFinder AIS API

Credit-based and subscription REST API exposing the VesselFinder global AIS network. On-demand methods (Vessels, PortCalls, ExpectedArrivals, MasterData, Distance) deduct credits per call proportional to dataset and source (terrestrial / satellite); fleet-wide (VesselsList) and area-wide (LiveData) feeds are subscription-priced. Authenticates via the userkey query parameter. Responses default to JSON and may be requested as XML.

VesselFinder AIS API is one of 2 APIs that VesselFinder publishes on the APIs.io network, described by a machine-readable OpenAPI specification.

This API exposes 8 machine-runnable capabilities that can be deployed as REST, MCP, or Agent Skill surfaces via Naftiko and 3 JSON Schema definitions.

Tagged areas include AIS, Vessels, Maritime, and Tracking. The published artifact set on APIs.io includes API documentation, an OpenAPI specification, a JSON-LD context, 8 Naftiko capability specs, and 3 JSON Schemas.

Documentation

Specifications

Schemas & Data

Other Resources

OpenAPI Specification

vesselfinder-ais-api-openapi.yml Raw ↑
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: []