Spire Maritime Vessels API

GraphQL `vessels` query returning up to 1,000 vessels per page - static data (name, MMSI, IMO, callsign, flag, shipType, dimensions), last position update (lat/long, course, heading, speed, collectionType SATELLITE or TERRESTRIAL), current voyage (destination, draught, ETA, matched port), and extended vessel characteristics. Filter by MMSI/IMO/callsign/flag/shipType, area of interest (GeoJSON/WKT polygon), or last-position time range; cursor pagination via first/after.

Postman Collection

spire-maritime.postman_collection.json Raw ↑
{
  "info": {
    "name": "Spire Maritime 2.0 (GraphQL)",
    "description": "GraphQL requests for the Spire Maritime 2.0 API (https://api.spire.com/graphql). Auth: Authorization: Bearer {{spire_maritime_token}}. Queries grounded in Spire Maritime 2.0 docs and the official spireglobal/maritime Postman collection; the messages and predictedVesselRoute bodies are representative. NOTE: following the Kpler acquisition the endpoint is migrating to https://api.sml.kpler.com/graphql.",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "auth": {
    "type": "bearer",
    "bearer": [
      {
        "key": "token",
        "value": "{{spire_maritime_token}}",
        "type": "string"
      }
    ]
  },
  "variable": [
    {
      "key": "baseUrl",
      "value": "https://api.spire.com/graphql"
    },
    {
      "key": "spire_maritime_token",
      "value": ""
    }
  ],
  "item": [
    {
      "name": "Vessels",
      "item": [
        {
          "name": "Vessels by MMSI list",
          "request": {
            "method": "POST",
            "header": [
              { "key": "Content-Type", "value": "application/json" }
            ],
            "url": {
              "raw": "{{baseUrl}}",
              "host": ["{{baseUrl}}"]
            },
            "body": {
              "mode": "graphql",
              "graphql": {
                "query": "query Vessels($mmsi: [MMSI!], $first: Int) {\n  vessels(mmsi: $mmsi, first: $first) {\n    pageInfo { hasNextPage endCursor }\n    totalCount { relation value }\n    nodes {\n      id\n      updateTimestamp\n      staticData { name mmsi imo callsign flag shipType aisClass dimensions { length width } }\n      lastPositionUpdate { latitude longitude speed course heading collectionType timestamp }\n      currentVoyage { destination draught eta matchedPort { port { name unlocode } } timestamp }\n    }\n  }\n}",
                "variables": "{\n  \"mmsi\": [\"244660000\"],\n  \"first\": 100\n}"
              }
            }
          }
        },
        {
          "name": "Vessels in an area of interest (polygon)",
          "request": {
            "method": "POST",
            "header": [
              { "key": "Content-Type", "value": "application/json" }
            ],
            "url": {
              "raw": "{{baseUrl}}",
              "host": ["{{baseUrl}}"]
            },
            "body": {
              "mode": "graphql",
              "graphql": {
                "query": "query VesselsInAOI($aoi: AreaOfInterest, $shipType: [ShipType!], $first: Int) {\n  vessels(areaOfInterest: $aoi, shipType: $shipType, first: $first) {\n    pageInfo { hasNextPage endCursor }\n    nodes {\n      staticData { name mmsi shipType }\n      lastPositionUpdate { latitude longitude timestamp collectionType }\n    }\n  }\n}",
                "variables": "{\n  \"aoi\": { \"wkt\": \"POLYGON((-122.5 37.7,-122.3 37.7,-122.3 37.9,-122.5 37.9,-122.5 37.7))\" },\n  \"shipType\": [\"CONTAINER\"],\n  \"first\": 1000\n}"
              }
            }
          }
        }
      ]
    },
    {
      "name": "Messages (representative)",
      "item": [
        {
          "name": "Recent AIS messages by MMSI + time range",
          "request": {
            "method": "POST",
            "header": [
              { "key": "Content-Type", "value": "application/json" }
            ],
            "url": {
              "raw": "{{baseUrl}}",
              "host": ["{{baseUrl}}"]
            },
            "body": {
              "mode": "graphql",
              "graphql": {
                "query": "query Messages($mmsi: [MMSI!], $range: TimeRange, $first: Int) {\n  messages(mmsi: $mmsi, receivedTime: $range, first: $first) {\n    pageInfo { hasNextPage endCursor }\n    nodes { mmsi msgType latitude longitude speed course timestamp collectionType }\n  }\n}",
                "variables": "{\n  \"mmsi\": [\"244660000\"],\n  \"range\": { \"startTime\": \"2026-07-11T00:00:00Z\", \"endTime\": \"2026-07-12T00:00:00Z\" },\n  \"first\": 20000\n}"
              }
            }
          }
        }
      ]
    },
    {
      "name": "Port Events",
      "item": [
        {
          "name": "Port events by vessel",
          "request": {
            "method": "POST",
            "header": [
              { "key": "Content-Type", "value": "application/json" }
            ],
            "url": {
              "raw": "{{baseUrl}}",
              "host": ["{{baseUrl}}"]
            },
            "body": {
              "mode": "graphql",
              "graphql": {
                "query": "query PortEventsByVessel($mmsi: MMSI, $first: Int) {\n  portEventsByVessel(mmsi: $mmsi, first: $first) {\n    pageInfo { hasNextPage endCursor }\n    nodes { id eventType timestamp port { name unlocode } }\n  }\n}",
                "variables": "{\n  \"mmsi\": \"244660000\",\n  \"first\": 100\n}"
              }
            }
          }
        }
      ]
    },
    {
      "name": "Ports",
      "item": [
        {
          "name": "Port by UNLOCODE",
          "request": {
            "method": "POST",
            "header": [
              { "key": "Content-Type", "value": "application/json" }
            ],
            "url": {
              "raw": "{{baseUrl}}",
              "host": ["{{baseUrl}}"]
            },
            "body": {
              "mode": "graphql",
              "graphql": {
                "query": "query Port($unlocode: UNLOCODE!) {\n  port(unlocode: $unlocode) {\n    name\n    unlocode\n    centerPoint { latitude longitude }\n  }\n}",
                "variables": "{\n  \"unlocode\": \"DEHAM\"\n}"
              }
            }
          }
        },
        {
          "name": "Match port by text",
          "request": {
            "method": "POST",
            "header": [
              { "key": "Content-Type", "value": "application/json" }
            ],
            "url": {
              "raw": "{{baseUrl}}",
              "host": ["{{baseUrl}}"]
            },
            "body": {
              "mode": "graphql",
              "graphql": {
                "query": "query MatchedPort($text: String!) {\n  matchedPort(text: $text) {\n    matchScore\n    port { name unlocode centerPoint { latitude longitude } }\n  }\n}",
                "variables": "{\n  \"text\": \"JEDDAH S ARABIA\"\n}"
              }
            }
          }
        }
      ]
    },
    {
      "name": "Predicted ETA / Routing (representative)",
      "item": [
        {
          "name": "Predicted vessel route",
          "request": {
            "method": "POST",
            "header": [
              { "key": "Content-Type", "value": "application/json" }
            ],
            "url": {
              "raw": "{{baseUrl}}",
              "host": ["{{baseUrl}}"]
            },
            "body": {
              "mode": "graphql",
              "graphql": {
                "query": "query PredictedRoute($origin: RoutePoint!, $destination: RoutePoint!, $vessel: MMSI!) {\n  predictedVesselRoute(origin: $origin, destination: $destination, vessel: $vessel) {\n    distance\n    eta\n    durationHours\n    route\n  }\n}",
                "variables": "{\n  \"origin\": { \"unlocode\": \"CNSHA\" },\n  \"destination\": { \"unlocode\": \"NLRTM\" },\n  \"vessel\": \"244660000\"\n}"
              }
            }
          }
        }
      ]
    }
  ]
}