Every API here is available over the APIs.io API and to AI agents over MCP.
{
"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}"
}
}
}
}
]
}
]
}