{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://raw.githubusercontent.com/api-evangelist/marine-traffic/main/json-schema/marine-traffic-vessel-position-schema.json",
  "title": "MarineTraffic Vessel Position",
  "description": "A single AIS-derived vessel position record as returned by the MarineTraffic AIS API (PS01–PS08 / MTA030AD families). Field semantics match the MarineTraffic AIS data dictionary at https://servicedocs.marinetraffic.com/.",
  "type": "object",
  "properties": {
    "MMSI": {
      "type": ["string","integer"],
      "description": "Maritime Mobile Service Identity — 9-digit AIS-broadcast vessel identifier."
    },
    "IMO": {
      "type": ["string","integer","null"],
      "description": "International Maritime Organization number — permanent 7-digit vessel identifier (when known)."
    },
    "SHIP_ID": {
      "type": ["string","integer"],
      "description": "MarineTraffic internal vessel identifier."
    },
    "SHIPNAME": {
      "type": ["string","null"],
      "description": "Vessel name as broadcast via AIS Message 5."
    },
    "CALLSIGN": {
      "type": ["string","null"],
      "description": "Radio call sign assigned to the vessel."
    },
    "SHIPTYPE": {
      "type": ["string","integer"],
      "description": "AIS-coded ship type (numeric range 0–99 per ITU-R M.1371)."
    },
    "TYPE_NAME": {
      "type": ["string","null"],
      "description": "Human-readable MarineTraffic ship-type classification (e.g. \"Container Ship\", \"Tanker\")."
    },
    "LAT": {
      "type": ["number","string"],
      "description": "Latitude in WGS84 decimal degrees (-90 to 90)."
    },
    "LON": {
      "type": ["number","string"],
      "description": "Longitude in WGS84 decimal degrees (-180 to 180)."
    },
    "SPEED": {
      "type": ["number","string","null"],
      "description": "Speed Over Ground in tenths of a knot (raw AIS value); divide by 10 for SOG in knots."
    },
    "COURSE": {
      "type": ["number","string","null"],
      "description": "Course Over Ground in degrees from true north (0–359)."
    },
    "HEADING": {
      "type": ["number","string","null"],
      "description": "True heading in degrees (0–359). 511 means \"not available\"."
    },
    "STATUS": {
      "type": ["string","integer","null"],
      "description": "AIS navigational status code (0=under way using engine, 1=at anchor, 5=moored, ...)."
    },
    "DESTINATION": {
      "type": ["string","null"],
      "description": "Free-text destination as broadcast via AIS Message 5."
    },
    "ETA_AIS": {
      "type": ["string","null"],
      "format": "date-time",
      "description": "Estimated Time of Arrival as broadcast via AIS."
    },
    "ETA_PREDICTED": {
      "type": ["string","null"],
      "format": "date-time",
      "description": "MarineTraffic predictive ETA computed from voyage forecasting."
    },
    "DSRC": {
      "type": ["string","null"],
      "enum": ["TER","SAT",null],
      "description": "Data source — TER (terrestrial AIS receiver) or SAT (satellite AIS)."
    },
    "TIMESTAMP": {
      "type": "string",
      "format": "date-time",
      "description": "UTC timestamp of the AIS position report."
    },
    "FLAG": {
      "type": ["string","null"],
      "description": "ISO 3166-1 alpha-2 flag-state country code."
    },
    "LENGTH": {
      "type": ["number","string","null"],
      "description": "Vessel length overall in metres."
    },
    "WIDTH": {
      "type": ["number","string","null"],
      "description": "Vessel beam in metres."
    },
    "DWT": {
      "type": ["number","string","null"],
      "description": "Deadweight tonnage in metric tons."
    },
    "GRT": {
      "type": ["number","string","null"],
      "description": "Gross registered tonnage."
    },
    "DRAUGHT": {
      "type": ["number","string","null"],
      "description": "Reported draught in tenths of a metre."
    },
    "CURRENT_PORT": {
      "type": ["string","null"],
      "description": "Resolved current-port name if the vessel is currently in port."
    },
    "LAST_PORT": {
      "type": ["string","null"],
      "description": "Last-known port departed."
    },
    "NEXT_PORT_NAME": {
      "type": ["string","null"],
      "description": "MarineTraffic-predicted next port name."
    },
    "NEXT_PORT_UNLOCODE": {
      "type": ["string","null"],
      "description": "UN/LOCODE for the predicted next port."
    }
  },
  "required": ["MMSI","LAT","LON","TIMESTAMP"],
  "additionalProperties": true
}
