MarineTraffic Voyage Information API

Machine-learning–powered voyage intelligence: voyage forecast (`/voyageforecast`), predictive destination areas (`/predictive-destination-areas`), and ETA-to-port (`/etatoport`). Combines live AIS positions, port-call history, and predictive routing to deliver destination predictions with probability scores, ranked alternative destination ports, and predictive ETAs that outperform raw AIS-broadcast ETAs.

MarineTraffic Voyage Information API is one of 8 APIs that MarineTraffic publishes on the APIs.io network, described by a machine-readable OpenAPI specification.

This API exposes 1 machine-runnable capability that can be deployed as REST, MCP, or Agent Skill surfaces via Naftiko and 1 JSON Schema definition.

Tagged areas include AIS, Maritime, Voyage Forecasting, Predictive Intelligence, and ETA. The published artifact set on APIs.io includes API documentation, an OpenAPI specification, sample payloads, 1 Naftiko capability spec, and 1 JSON Schema.

OpenAPI Specification

marine-traffic-voyage-info-openapi.yml Raw ↑
openapi: 3.0.2
info:
  title: MarineTraffic Voyage Information API
  version: 1.0.0
  description: Voyage forecasts, predictive destination areas, and vessel ETA to port — combining live AIS positions with
    machine-learning–driven predictive intelligence.
  contact:
    name: MarineTraffic
    url: https://www.marinetraffic.com/
servers:
- url: https://services.marinetraffic.com/api
tags:
- name: Voyage Information
paths:
  '/voyageforecast/{api_key} ':
    get:
      tags:
      - Voyage Information
      summary: Single Vessel Voyage Forecast
      description: "Get voyage information for a single vessel. </br></br> <b>Notes</b> <ul>\n    <li>Information about <a\
        \ href=\"https://support.marinetraffic.com/en/articles/9552860-what-kind-of-information-is-ais-transmitted\">AIS-transmitted\
        \ data</a></li>\n    <li>**SPEED** returned in (knots x10) and **TIMESTAMP** in UTC</li>\n    <li>The <b>frequency\
        \ of allowed API calls</b> is specific to your API key and is detailed in your contract as a number of successful\
        \ calls per time period. For example “2 calls per minute”. </br>Regardless of this agreed limit, each API key is technically\
        \ restricted to a maximum of 100 total (including successful and unsuccessful) requests per minute to ensure system\
        \ stability.</li>\n</ul>"
      operationId: voyageforecast_
      parameters:
      - $ref: '#/components/parameters/api_key'
      - $ref: '#/components/parameters/v_VI01'
      - $ref: '#/components/parameters/mmsi_VI01'
      - $ref: '#/components/parameters/imo_VI01'
      - $ref: '#/components/parameters/shipid_VI01'
      - $ref: '#/components/parameters/msgtype_VI01'
      - $ref: '#/components/parameters/protocol_new'
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                oneOf:
                - $ref: '#/components/schemas/200_vi01_default'
                - $ref: '#/components/schemas/200_vi01_extended'
            application/xml:
              schema:
                oneOf:
                - $ref: '#/components/schemas/200_vi01_default'
                - $ref: '#/components/schemas/200_vi01_extended'
              examples:
                Default:
                  summary: Simple
                  value: "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"no\"?>\n<FORECASTS>\n    <FORECAST MMSI=\"\
                    310627000\" IMO=\"9241061\" SHIP_ID=\"371681\" SHIPNAME=\"QUEEN MARY 2\" DESTINATION=\"TORQUAY\" LAST_PORT_ID=\"\
                    106\" LAST_PORT=\"SOUTHAMPTON\" LAST_PORT_UNLOCODE=\"GBSOU\" LAST_PORT_TIME=\"2020-10-14T17:00:00\" NEXT_PORT_ID=\"\
                    10379\" NEXT_PORT_NAME=\"TORQUAY\" NEXT_PORT_UNLOCODE=\"GBTOR\" ETA=\"2020-10-14T13:00:00\" ETA_CALC=\"\
                    \"/>\n</FORECASTS>"
                Extended:
                  summary: Extended
                  value: "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"no\"?>\n<FORECASTS>\n    <FORECAST MMSI=\"\
                    310627000\" IMO=\"9241061\" SHIP_ID=\"371681\" SHIPNAME=\"QUEEN MARY 2\" DESTINATION=\"TORQUAY\" LAST_PORT_ID=\"\
                    106\" LAST_PORT=\"SOUTHAMPTON\" LAST_PORT_UNLOCODE=\"GBSOU\" LAST_PORT_TIME=\"2020-10-14T17:00:00\" NEXT_PORT_ID=\"\
                    10379\" NEXT_PORT_NAME=\"TORQUAY\" NEXT_PORT_UNLOCODE=\"GBTOR\" ETA=\"2020-10-14T13:00:00\" ETA_CALC=\"\
                    \" DISTANCE_TRAVELLED=\"201\" DISTANCE_TO_GO=\"0\" SPEED_CALC=\"\" DRAUGHT=\"101\" DRAUGHT_MAX=\"105\"\
                    \ LOAD_STATUS_NAME=\"N/A\" ROUTE=\"\"/>\n</FORECASTS>"
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/400_vi01_missing_or_invalid_ship_identifier'
            application/xml:
              schema:
                $ref: '#/components/schemas/400_vi01_missing_or_invalid_ship_identifier'
              examples:
                Missing or invalid ship identifier:
                  summary: Missing or invalid ship identifier
                  value: "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"no\"?>\n<RESPONSE>\n    <STATUS>\n       \
                    \ <ERROR CODE=\"2a\" DESCRIPTION=\"VESSEL MMSI OR IMO OR SHIPID OR PORTID OR UNLOCODE MISSING\"/>\n  \
                    \  </STATUS>\n</RESPONSE>"
        '429':
          description: Too Many Requests
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/429_too_many_requests'
            application/xml:
              schema:
                $ref: '#/components/schemas/429_too_many_requests'
              examples:
                Area out of bound:
                  summary: Too Many Requests
                  value: "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"no\"?>\n<RESPONSE>\n    <STATUS>\n       \
                    \ <ERROR CODE=\"1r\" DESCRIPTION=\"TOO MANY REQUESTS\"/>\n    </STATUS>\n</RESPONSE>"
  /voyageforecast/{api_key}:
    get:
      tags:
      - Voyage Information
      summary: Fleet Voyage Forecast
      description: "Get voyage information for one for your MarineTraffic Fleets. </br></br> <b>Notes</b> <ul>\n    <li>Information\
        \ about <a href=\"https://support.marinetraffic.com/en/articles/9552860-what-kind-of-information-is-ais-transmitted\"\
        >AIS-transmitted data</a></li>\n    <li>**SPEED** returned in (knots x10) and **TIMESTAMP** in UTC</li>\n    <li>The\
        \ <b>frequency of allowed API calls</b> is specific to your API key and is detailed in your contract as a number of\
        \ successful calls per time period. For example “2 calls per minute”. </br>Regardless of this agreed limit, each API\
        \ key is technically restricted to a maximum of 100 total (including successful and unsuccessful) requests per minute\
        \ to ensure system stability.</li>\n</ul>"
      operationId: voyageforecast
      parameters:
      - $ref: '#/components/parameters/api_key'
      - $ref: '#/components/parameters/v_VI01'
      - $ref: '#/components/parameters/fleet_id_VI01'
      - $ref: '#/components/parameters/msgtype_VI01'
      - $ref: '#/components/parameters/protocol_new'
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                oneOf:
                - $ref: '#/components/schemas/200_vi01_default'
                - $ref: '#/components/schemas/200_vi01_extended'
            application/xml:
              schema:
                oneOf:
                - $ref: '#/components/schemas/200_vi01_default'
                - $ref: '#/components/schemas/200_vi01_extended'
              examples:
                Default:
                  summary: Simple
                  value: "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"no\"?>\n<FORECASTS>\n    <FORECAST MMSI=\"\
                    310627000\" IMO=\"9241061\" SHIP_ID=\"371681\" SHIPNAME=\"QUEEN MARY 2\" DESTINATION=\"TORQUAY\" LAST_PORT_ID=\"\
                    106\" LAST_PORT=\"SOUTHAMPTON\" LAST_PORT_UNLOCODE=\"GBSOU\" LAST_PORT_TIME=\"2020-10-14T17:00:00\" NEXT_PORT_ID=\"\
                    10379\" NEXT_PORT_NAME=\"TORQUAY\" NEXT_PORT_UNLOCODE=\"GBTOR\" ETA=\"2020-10-14T13:00:00\" ETA_CALC=\"\
                    \"/>\n</FORECASTS>"
                Extended:
                  summary: Extended
                  value: "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"no\"?>\n<FORECASTS>\n    <FORECAST MMSI=\"\
                    310627000\" IMO=\"9241061\" SHIP_ID=\"371681\" SHIPNAME=\"QUEEN MARY 2\" DESTINATION=\"TORQUAY\" LAST_PORT_ID=\"\
                    106\" LAST_PORT=\"SOUTHAMPTON\" LAST_PORT_UNLOCODE=\"GBSOU\" LAST_PORT_TIME=\"2020-10-14T17:00:00\" NEXT_PORT_ID=\"\
                    10379\" NEXT_PORT_NAME=\"TORQUAY\" NEXT_PORT_UNLOCODE=\"GBTOR\" ETA=\"2020-10-14T13:00:00\" ETA_CALC=\"\
                    \" DISTANCE_TRAVELLED=\"201\" DISTANCE_TO_GO=\"0\" SPEED_CALC=\"\" DRAUGHT=\"101\" DRAUGHT_MAX=\"105\"\
                    \ LOAD_STATUS_NAME=\"N/A\" ROUTE=\"\"/>\n</FORECASTS>"
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/404_vi01_invalid_fleet_identifier'
            application/xml:
              schema:
                $ref: '#/components/schemas/404_vi01_invalid_fleet_identifier'
              examples:
                Invalid fleet identifier:
                  summary: Invalid fleet identifier
                  value: "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"no\"?>\n<RESPONSE>\n    <STATUS>\n       \
                    \ <ERROR CODE=\"6b\" DESCRIPTION=\"FLEET NOT FOUND\"/>\n    </STATUS>\n</RESPONSE>"
        '429':
          description: Too Many Requests
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/429_too_many_requests'
            application/xml:
              schema:
                $ref: '#/components/schemas/429_too_many_requests'
              examples:
                Area out of bound:
                  summary: Too Many Requests
                  value: "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"no\"?>\n<RESPONSE>\n    <STATUS>\n       \
                    \ <ERROR CODE=\"1r\" DESCRIPTION=\"TOO MANY REQUESTS\"/>\n    </STATUS>\n</RESPONSE>"
  /predictive-destination-areas/{api_key}:
    get:
      tags:
      - Voyage Information
      summary: Single Vessel Predictive Destinations
      description: "Receive a prediction of the likely destination of a single vessel.</br></br> <b>Notes</b> <ul>\n    <li>The\
        \ <b>frequency of allowed API calls</b> is specific to your API key and is detailed in your contract as a number of\
        \ successful calls per time period. For example “2 calls per minute”. </br>Regardless of this agreed limit, each API\
        \ key is technically restricted to a maximum of 100 total (including successful and unsuccessful) requests per minute\
        \ to ensure system stability.</li>\n</ul>"
      operationId: predictive-destination-areas
      parameters:
      - $ref: '#/components/parameters/api_key'
      - $ref: '#/components/parameters/mmsi_VI04'
      - $ref: '#/components/parameters/imo_VI04'
      - $ref: '#/components/parameters/shipid_VI04'
      - $ref: '#/components/parameters/fromportid_VI04'
      - $ref: '#/components/parameters/protocol'
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/200_vi04_default'
            application/xml:
              schema:
                $ref: '#/components/schemas/200_vi04_default'
              examples:
                Default:
                  summary: Simple
                  value: "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"no\"?>\n<PredictiveDestinationAreas>\n   \
                    \ <PredictiveDestinationArea IMO=\"9450832\" SHIP_ID=\"4615400\" MMSI=\"538003690\" SHIPNAME=\"APHRODITE\
                    \ M\" SHIPCLASS=\"HANDYSIZE\" MARKET=\"DRY BULK\" MANAGER=\"EMPIRE BULKERS\" OWNER=\"BANK OF AMERICA LEASING\
                    \ AND CAPITAL\" FROM_PORT_ID=\"257\" FROM_PORT=\"ARATU\" NEXT_PRED_PORT_1_ID=\"5018\" NEXT_PRED_PORT_1=\"\
                    FORTALEZA\" NEXT_PRED_PORT_1_PROB=\"0.400\" NEXT_PRED_AREA_1=\"ECSA\" NEXT_PRED_AREA_1_PROB=\"1.000\"\
                    \ NEXT_PRED_PORT_2_ID=\"5026\" NEXT_PRED_PORT_2=\"RECIFE\" NEXT_PRED_PORT_2_PROB=\"0.200\" NEXT_PRED_AREA_2=\"\
                    ECSA\" NEXT_PRED_AREA_2_PROB=\"1.000\" NEXT_PRED_PORT_3_ID=\"645\" NEXT_PRED_PORT_3=\"VITORIA\" NEXT_PRED_PORT_3_PROB=\"\
                    0.200\" NEXT_PRED_AREA_3=\"ECSA\" NEXT_PRED_AREA_3_PROB=\"1.000\" NEXT_PRED_PORT_4_ID=\"2479\" NEXT_PRED_PORT_4=\"\
                    CABEDELO\" NEXT_PRED_PORT_4_PROB=\"0.200\" NEXT_PRED_AREA_4=\"ECSA\" NEXT_PRED_AREA_4_PROB=\"1.000\" NEXT_PRED_PORT_5_ID=\"\
                    \" NEXT_PRED_PORT_5=\"\" NEXT_PRED_PORT_5_PROB=\"\" NEXT_PRED_AREA_5=\"\" NEXT_PRED_AREA_5_PROB=\"\"/>\n\
                    </PredictiveDestinationAreas>"
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/400_vi04_missing_or_invalid_ship_identifier'
            application/xml:
              schema:
                $ref: '#/components/schemas/400_vi04_missing_or_invalid_ship_identifier'
              examples:
                Missing or invalid ship identifier:
                  summary: Missing or invalid ship identifier
                  value: "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"no\"?>\n<RESPONSE>\n    <STATUS>\n       \
                    \ <ERROR CODE=\"1\" DESCRIPTION=\"INCORRECT CALL-CHECK PARAMETERS\"/>\n    </STATUS>\n</RESPONSE>"
        '429':
          description: Too Many Requests
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/429_too_many_requests'
            application/xml:
              schema:
                $ref: '#/components/schemas/429_too_many_requests'
              examples:
                Area out of bound:
                  summary: Too Many Requests
                  value: "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"no\"?>\n<RESPONSE>\n    <STATUS>\n       \
                    \ <ERROR CODE=\"1r\" DESCRIPTION=\"TOO MANY REQUESTS\"/>\n    </STATUS>\n</RESPONSE>"
  '/predictive-destination-areas/{api_key} ':
    get:
      tags:
      - Voyage Information
      summary: Fleet Predictive Destinations
      description: "Receive a prediction of the likely destination for one of your MarineTraffic fleets.</br></br> <b>Notes</b>\
        \ <ul>\n    <li>The <b>frequency of allowed API calls</b> is specific to your API key and is detailed in your contract\
        \ as a number of successful calls per time period. For example “2 calls per minute”. </br>Regardless of this agreed\
        \ limit, each API key is technically restricted to a maximum of 100 total (including successful and unsuccessful)\
        \ requests per minute to ensure system stability.</li>\n</ul>"
      operationId: predictive-destination-areas_
      parameters:
      - $ref: '#/components/parameters/api_key'
      - $ref: '#/components/parameters/fleet_id_VI04'
      - $ref: '#/components/parameters/fromportid_VI04'
      - $ref: '#/components/parameters/protocol'
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/200_vi04_default'
            application/xml:
              schema:
                $ref: '#/components/schemas/200_vi04_default'
              examples:
                Default:
                  summary: Simple
                  value: "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"no\"?>\n<PredictiveDestinationAreas>\n   \
                    \ <PredictiveDestinationArea IMO=\"9450832\" SHIP_ID=\"4615400\" MMSI=\"538003690\" SHIPNAME=\"APHRODITE\
                    \ M\" SHIPCLASS=\"HANDYSIZE\" MARKET=\"DRY BULK\" MANAGER=\"EMPIRE BULKERS\" OWNER=\"BANK OF AMERICA LEASING\
                    \ AND CAPITAL\" FROM_PORT_ID=\"257\" FROM_PORT=\"ARATU\" NEXT_PRED_PORT_1_ID=\"5018\" NEXT_PRED_PORT_1=\"\
                    FORTALEZA\" NEXT_PRED_PORT_1_PROB=\"0.400\" NEXT_PRED_AREA_1=\"ECSA\" NEXT_PRED_AREA_1_PROB=\"1.000\"\
                    \ NEXT_PRED_PORT_2_ID=\"5026\" NEXT_PRED_PORT_2=\"RECIFE\" NEXT_PRED_PORT_2_PROB=\"0.200\" NEXT_PRED_AREA_2=\"\
                    ECSA\" NEXT_PRED_AREA_2_PROB=\"1.000\" NEXT_PRED_PORT_3_ID=\"645\" NEXT_PRED_PORT_3=\"VITORIA\" NEXT_PRED_PORT_3_PROB=\"\
                    0.200\" NEXT_PRED_AREA_3=\"ECSA\" NEXT_PRED_AREA_3_PROB=\"1.000\" NEXT_PRED_PORT_4_ID=\"2479\" NEXT_PRED_PORT_4=\"\
                    CABEDELO\" NEXT_PRED_PORT_4_PROB=\"0.200\" NEXT_PRED_AREA_4=\"ECSA\" NEXT_PRED_AREA_4_PROB=\"1.000\" NEXT_PRED_PORT_5_ID=\"\
                    \" NEXT_PRED_PORT_5=\"\" NEXT_PRED_PORT_5_PROB=\"\" NEXT_PRED_AREA_5=\"\" NEXT_PRED_AREA_5_PROB=\"\"/>\n\
                    </PredictiveDestinationAreas>"
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/400_vi04_invalid_fleet_identifier'
            application/xml:
              schema:
                $ref: '#/components/schemas/400_vi04_invalid_fleet_identifier'
              examples:
                Invalid fleet identifier:
                  summary: Invalid fleet identifier
                  value: "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"no\"?>\n<RESPONSE>\n    <STATUS>\n       \
                    \ <ERROR CODE=\"1\" DESCRIPTION=\"INCORRECT CALL-CHECK PARAMETERS\"/>\n    </STATUS>\n</RESPONSE>"
        '429':
          description: Too Many Requests
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/429_too_many_requests'
            application/xml:
              schema:
                $ref: '#/components/schemas/429_too_many_requests'
              examples:
                Area out of bound:
                  summary: Too Many Requests
                  value: "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"no\"?>\n<RESPONSE>\n    <STATUS>\n       \
                    \ <ERROR CODE=\"1r\" DESCRIPTION=\"TOO MANY REQUESTS\"/>\n    </STATUS>\n</RESPONSE>"
  /etatoport/{api_key}:
    get:
      tags:
      - Voyage Information
      summary: Vessel ETA to Port
      description: "Get ETA and voyage information for a vessel of your choice, to any port you define.</br></br> <b>Notes</b>\
        \ <ul>\n    <li>The <b>frequency of allowed API calls</b> is specific to your API key and is detailed in your contract\
        \ as a number of successful calls per time period. For example “2 calls per minute”. </br>Regardless of this agreed\
        \ limit, each API key is technically restricted to a maximum of 100 total (including successful and unsuccessful)\
        \ requests per minute to ensure system stability.</li>\n</ul>"
      operationId: etatoport
      parameters:
      - $ref: '#/components/parameters/api_key'
      - $ref: '#/components/parameters/v_VI07'
      - $ref: '#/components/parameters/portid_VI07'
      - $ref: '#/components/parameters/unlocode_VI07'
      - $ref: '#/components/parameters/mmsi_VI07'
      - $ref: '#/components/parameters/imo_VI07'
      - $ref: '#/components/parameters/shipid_VI07'
      - $ref: '#/components/parameters/speed_calc_VI07'
      - $ref: '#/components/parameters/msgtype_VI07'
      - $ref: '#/components/parameters/protocol'
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                oneOf:
                - $ref: '#/components/schemas/200_vi07_default'
                - $ref: '#/components/schemas/200_vi07_extended'
            application/xml:
              schema:
                oneOf:
                - $ref: '#/components/schemas/200_vi07_default'
                - $ref: '#/components/schemas/200_vi07_extended'
              examples:
                Default:
                  summary: Simple
                  value: "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"no\"?>\n<ETATOPORT>\n    <ETATOPORT_ROW SHIP_ID=\"\
                    4615400\" MMSI=\"538003690\" IMO=\"9450832\" LAST_PORT_ID=\"133\" LAST_PORT=\"TERNEUZEN\" LAST_PORT_UNLOCODE=\"\
                    NLTNZ\" LAST_PORT_TIME=\"2020-10-23 07:20:00\" NEXT_PORT_NAME=\"ARATU\" NEXT_PORT_UNLOCODE=\"BRARB\" ETA_CALC=\"\
                    2020-11-17 04:18:35\"/>\n</ETATOPORT>"
                Extended:
                  summary: Extended
                  value: "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"no\"?>\n<ETATOPORT>\n    <ETATOPORT_ROW SHIP_ID=\"\
                    4615400\" MMSI=\"538003690\" IMO=\"9450832\" LAST_PORT_ID=\"133\" LAST_PORT=\"TERNEUZEN\" LAST_PORT_UNLOCODE=\"\
                    NLTNZ\" LAST_PORT_TIME=\"2020-10-23 07:20:00\" NEXT_PORT_NAME=\"ARATU\" NEXT_PORT_UNLOCODE=\"BRARB\" ETA_CALC=\"\
                    2020-11-17 04:20:14\" DISTANCE_TRAVELLED=\"519\" DISTANCE_TO_GO=\"2629\" SPEED_CALC=\"58\" DRAUGHT=\"\
                    93\" DRAUGHT_MAX=\"104\" LOAD_STATUS_NAME=\"LADEN\" ROUTE=\"LINESTRING (-3.25721 50.5102, -3.36854 50.4274,\
                    \ -3.43517 50.4228, -3.43879 50.4169, -3.43297 50.4142, -3.42169 50.4115, -3.41547 50.407, -3.41412 50.4007,\
                    \ -3.41569 50.395, -3.4188 50.3885, -3.56497 50.1962, -4.6912 49.5453, -5.17703 49.2673, -5.78868 48.8526,\
                    \ -6.98989 47.5559, -7.2535 47.316, -7.2102 47.0939, -7.2935 46.9586, -8.33592 45.8395, -9.09363 44.8248,\
                    \ -9.5244 44.2492, -9.70133 44.0603, -10.0427 43.6447, -10.1111 43.4934, -10.2361 43.3193, -10.2123 42.2985,\
                    \ -10.1906 41.2322, -10.1462 40.1117, -10.1056 39.0589, -10.0989 38.6851, -10.0265 38.4306, -10.0125 38.3022,\
                    \ -9.69923 37.261, -9.57864 36.8751, -9.52376 36.7973, -9.25278 36.5721, -9.19231 36.5391, -8.15901 36.2992,\
                    \ -7.0206 36.0401, -6.48534 35.9174, -5.82036 35.9016, -5.63979 35.9169, -5.26123 35.984, -4.97929 36.0055,\
                    \ -4.90942 36.0021, -3.80999 36.1162, -2.70866 36.1953, -1.70453 36.3222, -0.620848 36.4784, 0.607268\
                    \ 36.6633, 1.71278 36.8284, 2.7549 36.9733, 3.87165 37.1261, 4.69295 37.2316, 5.74852 37.2387, 6.90585\
                    \ 37.2472, 8.02881 37.2582, 8.64414 37.2678, 9.70149 37.5087, 10.0471 37.569, 10.1756 37.5695, 10.9414\
                    \ 37.4179, 11.4793 37.2768, 11.9401 37.095, 12.4415 36.9732, 13.4569 36.7885, 13.5064 36.7736, 14.5303\
                    \ 36.6101, 15.1167 36.5096, 16.1937 36.477, 17.4477 36.4471, 18.371 36.4181, 18.7263 36.3965, 20.799 36.3638,\
                    \ 21.7999 36.3351, 22.0905 36.3339, 22.2645 36.3226, 22.7168 36.356, 22.9405 36.4011, 23.1341 36.3843,\
                    \ 23.1449 36.3864, 23.1681 36.3932, 23.176 36.3965, 23.2887 36.4584, 23.2941 36.4631, 23.2984 36.4683,\
                    \ 23.3022 36.4743, 23.3053 36.4812, 23.4143 36.9312, 23.6949 37.4873, 23.7461 37.6468, 23.75 37.6672,\
                    \ 23.749 37.6724, 23.6701 37.8133, 23.5845 37.8766, 23.5848 37.8872)\" ETD_CALC=\"2020-11-26 16:20:14\"\
                    \ TIME_ANCH=\"3.4\" TIME_PORT=\"6.1\"/>\n</ETATOPORT>"
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                oneOf:
                - $ref: '#/components/schemas/400_vi07_missing_or_invalid_port_identifier'
                - $ref: '#/components/schemas/400_vi07_missing_or_invalid_ship_identifier'
            application/xml:
              schema:
                oneOf:
                - $ref: '#/components/schemas/400_vi07_missing_or_invalid_port_identifier'
                - $ref: '#/components/schemas/400_vi07_missing_or_invalid_ship_identifier'
              examples:
                Missing or invalid port identifier:
                  summary: Missing or invalid port identifier
                  value: "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"no\"?>\n<RESPONSE>\n    <STATUS>\n       \
                    \ <ERROR CODE=\"2a10\" DESCRIPTION=\"PORT_ID OR UNLOCODE MISSING\"/>\n    </STATUS>\n</RESPONSE>"
                Missing or invalid ship identifier:
                  summary: Missing or invalid ship identifier
                  value: "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"no\"?>\n<RESPONSE>\n    <STATUS>\n       \
                    \ <ERROR CODE=\"2\" DESCRIPTION=\"VESSEL MMSI OR IMO OR SHIPID MISSING\"/>\n    </STATUS>\n</RESPONSE>"
        '429':
          description: Too Many Requests
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/429_too_many_requests'
            application/xml:
              schema:
                $ref: '#/components/schemas/429_too_many_requests'
              examples:
                Area out of bound:
                  summary: Too Many Requests
                  value: "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"no\"?>\n<RESPONSE>\n    <STATUS>\n       \
                    \ <ERROR CODE=\"1r\" DESCRIPTION=\"TOO MANY REQUESTS\"/>\n    </STATUS>\n</RESPONSE>"
components:
  parameters:
    api_key:
      name: api_key
      in: path
      description: 'API key: 40-character hexadecimal number'
      required: true
      schema:
        type: string
    cursor:
      name: cursor
      in: query
      description: The pagination cursor provided in the metadata section of the previous response
      required: false
      schema:
        type: string
    limit:
      name: limit
      in: query
      description: The limit of vessels per page (min=1000, max=5000)
      required: false
      schema:
        type: integer
        default: 2000
    protocol_mandatory:
      name: protocol
      in: query
      description: "Response type. Use one of the following: <ul>\n  <li>jsono</li>\n  <li>csv</li>"
      required: false
      schema:
        type: string
        default: jsono
    protocol_new:
      name: protocol
      in: query
      description: "Response type. Use one of the following: <ul>\n  <li>xml</li>\n  <li>csv</li>\n  <li>jsono</li>"
      required: false
      schema:
        type: string
        default: xml
    v_PS01:
      name: v
      in: query
      description: Version of the service to be executed. Use version 3 to get the latest
      schema:
        type: integer
        default: 1
    shipid_PS01:
      name: shipid
      in: query
      description: A uniquely assigned ID by MarineTraffic for the subject vessel </br></br> You can <b>instead</b> use imo
        or mmsi
      required: true
      schema:
        type: integer
    mmsi_PS01:
      name: mmsi
      in: query
      description: The Maritime Mobile Service Identity (MMSI) of the vessel you wish to track
      required: false
      schema:
        type: integer
    imo_PS01:
      name: imo
      in: query
      description: The International Maritime Organization (IMO) number of the vessel you wish to track
      required: false
      schema:
        type: integer
    days_PS01:
      name: days
      in: query
      description: The number of days, starting from the time of request and going backwards, for which the response should
        look for position data </br></br> Maximum value is 190 (days)
      required: true
      schema:
        type: integer
    fromdate_PS01:
      name: fromdate
      in: query
      description: Use with todate <b>instead</b> of days to get data for a date period
      required: false
      schema:
        type: string
        format: date-time
    todate_PS01:
      name: todate
      in: query
      description: Use with fromdate <b>instead</b> of days to get data for a date period
      required: false
      schema:
        type: string
        format: date-time
    period_PS01:
      name: period
      in: query
      description: "Limit position per vessel. Omit to get all the available positions </br></br> Values are: <ul>\n  <li>hourly:\
        \ get one position per hour</li>\n  <li>daily: get one position per day</li>\n</ul>"
      required: false
      schema:
        type: string
    msgtype_PS01:
      name: msgtype
      in: query
      description: "Resolution of the response. Available values: <ul>\n  <li>simple</li>\n  <li>extended</li>\n</ul> If used\
        \ with the value <b>extended</b>, the response includes also weather data"
      required: false
      schema:
        type: string
        default: simple
    protocol:
      name: protocol
      in: query
      description: "Response type. Use one of the following: <ul>\n  <li>xml</li>\n  <li>csv</li>\n  <li>json</li>\n  <li>jsono</li>"
      required: false
      schema:
        type: string
        default: xml
    MINLAT_PS01:
      name: MINLAT
      in: query
      description: Use with MAXLAT, MINLON, MAXLON to define an area for which you wish to either get all the historical vessels'
        positions or historical positions for a specific vessel </br></br> The absolute value of MAXLAT - MINLAT + MAXLON
        - MINLON has to be equal to or less than <b>2</b> </br></br> If you do not define a vessel, the maximum period for
        which you can look back has a maximum period of one day
      required: true
      schema:
        type: number
    MAXLAT_PS01:
      name: MAXLAT
      in: query
      description: Use with MINLAT, MINLON, MAXLON to define an area for which you wish to either get all the historical vessels'
        positions or historical positions for a specific vessel </br></br> The absolute value of MAXLAT - MINLAT + MAXLON
        - MINLON has to be equal to or less than <b>2</b> </br></br> If you do not define a vessel, the maximum period for
        which you can look back has a maximum period of one day
      required: true
      schema:
        type: number
    MINLON_PS01:
      name: MINLON
      in: query
      description: Use with MINLAT, MAXLAT, MAXLON to define an area for which you wish to either get all the historical vessels'
        positions or historical positions for a specific vessel </br></br> The absolute value of MAXLAT - MINLAT + MAXLON
        - MINLON has to be equal to or less than <b>2</b> </br></br> If you do not define a vessel, the maximum period for
        which you can look back has a maximum period of one day
      required: true
      schema:
        type: number
    MAXLON_PS01:
      name: MAXLON
      in: query
      description: Use with MINLAT, MAXLAT, MINLON to define an area for which you wish to either get all the historical vessels'
        positions or historical positions for a specific vessel </br></br> The absolute value of MAXLAT - MINLAT + MAXLON
        - MINLON has to be equal to or less than <b>2</b> </br></br> If you do not define a vessel, the maximum period for
        which you can look back has a maximum period of one day
      required: true
      schema:
        type: number
    shipid_PS01_2:
      name: shipid
      in: query
      description: A uniquely assigned ID by MarineTraffic for the subject vessel </br></br> You can <b>instead</b> use imo
        or mmsi
      required: false
      schema:
        type: integer
    v_PS02:
      name: v
      in: query
      description: Version of the service to be executed. Use version 8 to get the latest
      required: true
      schema:
        type: integer
        default: 1
    timespan_PS02:
      name: timespan
      in: query
      description: The maximum age, in minutes, of the returned positions.  </br></br> Maximum value for terrestrial coverage
        is 60. Maximum value for satellite coverage is 180
      required: false
      schema:
        type: integer
        default: 5
    shiptype_PS02:
      name: shiptype
      in: query
      description: "Filter data by vessel type: <ul>\n  <li>2: Fishing</li>\n  <li>4: High Speed Craf</li>\n  <li>6: Passenger</li>\n\
        \  <li>7: Cargo</li>\n  <li>8: Tanker</li>"
      required: false
      schema:
        type: integer
    msgtype_PS02:
      name: msgtype
      in: query
      description: "Resolution of the response. Available values: <ul>\n  <li>simple</li>\n  <li>extended</li>\n  <li>full</li>\n\
        </ul> If used with the value <b>extended</b> or <b>full</b>, the response includes scheduled static and voyage related\
        \ vessel data report (AIS Message 5). In this case your request frequency might be limited (depending on your service\
        \ terms) </br></br> If omitted, the returned records include only position reports (AIS Messages 1, 2, 3/ 18, 19)"
      required: false
      schema:
        type: string
        default: simple
    v_PS03:
      name: v
      in: query
      description: Version of the service to be executed. Use version 8 to get the latest
      required: true
      schema:
        type: integer
        default: 1
    vessel_type:
      name: vesseltypeid
      in: quer

# --- truncated at 32 KB (108 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/marine-traffic/refs/heads/main/openapi/marine-traffic-voyage-info-openapi.yml