{
  "opencollection": "1.0.0",
  "info": {
    "name": "Spire Maritime 2.0 (GraphQL)",
    "version": "2.0",
    "description": "GraphQL requests against https://api.spire.com/graphql. Bearer token auth. Vessels/Port Events/Ports queries are grounded in Spire Maritime 2.0 docs and the official Postman collection; messages and predictedVesselRoute are representative. Real-time AIS is a separate raw TCP stream (streamingv2.ais.spire.com:56784), not modeled here."
  },
  "request": {
    "auth": {
      "type": "bearer",
      "token": "{{spire_maritime_token}}"
    }
  },
  "items": [
    {
      "info": {
        "name": "Vessels",
        "type": "folder"
      },
      "items": [
        {
          "info": {
            "name": "Vessels by MMSI list",
            "type": "http"
          },
          "http": {
            "method": "POST",
            "url": "https://api.spire.com/graphql",
            "headers": [
              { "name": "Content-Type", "value": "application/json" }
            ],
            "body": {
              "type": "graphql",
              "graphql": {
                "query": "query Vessels($mmsi: [MMSI!], $first: Int) { vessels(mmsi: $mmsi, first: $first) { pageInfo { hasNextPage endCursor } totalCount { relation value } nodes { id staticData { name mmsi imo callsign flag shipType dimensions { length width } } lastPositionUpdate { latitude longitude speed course heading collectionType timestamp } currentVoyage { destination draught eta matchedPort { port { name unlocode } } } } } }",
                "variables": "{ \"mmsi\": [\"244660000\"], \"first\": 100 }"
              }
            }
          },
          "docs": "Retrieve vessels (static, position, voyage) by MMSI list. Up to 1000 per page; cursor paginate with first/after."
        },
        {
          "info": {
            "name": "Vessels in an area of interest",
            "type": "http"
          },
          "http": {
            "method": "POST",
            "url": "https://api.spire.com/graphql",
            "headers": [
              { "name": "Content-Type", "value": "application/json" }
            ],
            "body": {
              "type": "graphql",
              "graphql": {
                "query": "query VesselsInAOI($aoi: AreaOfInterest, $shipType: [ShipType!], $first: Int) { vessels(areaOfInterest: $aoi, shipType: $shipType, first: $first) { pageInfo { hasNextPage endCursor } nodes { staticData { name mmsi shipType } lastPositionUpdate { latitude longitude timestamp collectionType } } } }",
                "variables": "{ \"aoi\": { \"wkt\": \"POLYGON((-122.5 37.7,-122.3 37.7,-122.3 37.9,-122.5 37.9,-122.5 37.7))\" }, \"shipType\": [\"CONTAINER\"], \"first\": 1000 }"
              }
            }
          },
          "docs": "Last positions within a GeoJSON/WKT polygon, filtered by ship type."
        }
      ]
    },
    {
      "info": {
        "name": "Messages (representative)",
        "type": "folder"
      },
      "items": [
        {
          "info": {
            "name": "Recent AIS messages by MMSI + time range",
            "type": "http"
          },
          "http": {
            "method": "POST",
            "url": "https://api.spire.com/graphql",
            "headers": [
              { "name": "Content-Type", "value": "application/json" }
            ],
            "body": {
              "type": "graphql",
              "graphql": {
                "query": "query Messages($mmsi: [MMSI!], $range: TimeRange, $first: Int) { messages(mmsi: $mmsi, receivedTime: $range, first: $first) { pageInfo { hasNextPage endCursor } nodes { mmsi msgType latitude longitude speed course timestamp collectionType } } }",
                "variables": "{ \"mmsi\": [\"244660000\"], \"range\": { \"startTime\": \"2026-07-11T00:00:00Z\", \"endTime\": \"2026-07-12T00:00:00Z\" }, \"first\": 20000 }"
              }
            }
          },
          "docs": "Representative: paginated decoded AIS messages by MMSI + time window (up to ~20000 per page)."
        }
      ]
    },
    {
      "info": {
        "name": "Port Events",
        "type": "folder"
      },
      "items": [
        {
          "info": {
            "name": "Port events by vessel",
            "type": "http"
          },
          "http": {
            "method": "POST",
            "url": "https://api.spire.com/graphql",
            "headers": [
              { "name": "Content-Type", "value": "application/json" }
            ],
            "body": {
              "type": "graphql",
              "graphql": {
                "query": "query PortEventsByVessel($mmsi: MMSI, $first: Int) { portEventsByVessel(mmsi: $mmsi, first: $first) { pageInfo { hasNextPage endCursor } nodes { id eventType timestamp port { name unlocode } } } }",
                "variables": "{ \"mmsi\": \"244660000\", \"first\": 100 }"
              }
            }
          },
          "docs": "Arrivals/departures (ATA/ATD) and port calls for a vessel."
        }
      ]
    },
    {
      "info": {
        "name": "Ports",
        "type": "folder"
      },
      "items": [
        {
          "info": {
            "name": "Port by UNLOCODE",
            "type": "http"
          },
          "http": {
            "method": "POST",
            "url": "https://api.spire.com/graphql",
            "headers": [
              { "name": "Content-Type", "value": "application/json" }
            ],
            "body": {
              "type": "graphql",
              "graphql": {
                "query": "query Port($unlocode: UNLOCODE!) { port(unlocode: $unlocode) { name unlocode centerPoint { latitude longitude } } }",
                "variables": "{ \"unlocode\": \"DEHAM\" }"
              }
            }
          },
          "docs": "Look up a port by UNLOCODE."
        },
        {
          "info": {
            "name": "Match port by text",
            "type": "http"
          },
          "http": {
            "method": "POST",
            "url": "https://api.spire.com/graphql",
            "headers": [
              { "name": "Content-Type", "value": "application/json" }
            ],
            "body": {
              "type": "graphql",
              "graphql": {
                "query": "query MatchedPort($text: String!) { matchedPort(text: $text) { matchScore port { name unlocode centerPoint { latitude longitude } } } }",
                "variables": "{ \"text\": \"JEDDAH S ARABIA\" }"
              }
            }
          },
          "docs": "Resolve a free-text port name to a matched port with a score."
        }
      ]
    },
    {
      "info": {
        "name": "Predicted ETA / Routing (representative)",
        "type": "folder"
      },
      "items": [
        {
          "info": {
            "name": "Predicted vessel route",
            "type": "http"
          },
          "http": {
            "method": "POST",
            "url": "https://api.spire.com/graphql",
            "headers": [
              { "name": "Content-Type", "value": "application/json" }
            ],
            "body": {
              "type": "graphql",
              "graphql": {
                "query": "query PredictedRoute($origin: RoutePoint!, $destination: RoutePoint!, $vessel: MMSI!) { predictedVesselRoute(origin: $origin, destination: $destination, vessel: $vessel) { distance eta durationHours route } }",
                "variables": "{ \"origin\": { \"unlocode\": \"CNSHA\" }, \"destination\": { \"unlocode\": \"NLRTM\" }, \"vessel\": \"244660000\" }"
              }
            }
          },
          "docs": "Representative: predicted route, distance, and ETA between origin and destination for a vessel."
        }
      ]
    }
  ],
  "bundled": true
}
