May Mobility · AsyncAPI Specification

May Mobility Fleet Events

Version

View Spec View on GitHub CompanyAutonomous VehiclesTransportationMobilityRobotaxiFleet ManagementTelemetryPublic TransitAutomotiveStreamingAsyncAPIWebhooksEvents

AsyncAPI Specification

may-mobility-fleet-events.yml Raw ↑
generated: '2026-08-01'
method: searched
source: https://docs.maymobility.com/docs/fleet-api/types-of-data
spec_type: null
spec_type_note: 'May Mobility publishes NO AsyncAPI document. Every probe for one
  missed (docs.maymobility.com/asyncapi.yaml 404, /asyncapi.json 404, no spec link
  anywhere in the docs, no public GitHub repo). This file is therefore an
  event-surface CATALOG harvested from the provider''s own per-topic documentation
  pages — it is not, and must not be presented as, an AsyncAPI specification.'
surface_type: websocket-streaming
surface_note: 'The May Mobility Fleet Realtime API is a WebSocket pub/sub stream, not
  an HTTP webhook callback surface. It is catalogued here because it is the
  provider''s genuine event surface. Topics were previously delivered over a NATS
  client SDK; release notes for v2.0.0 (August 2023) record the migration from NATS
  to WebSockets, with protobuf-to-JSON conversion moved server-side.'
transport:
  protocol: websocket
  auth: AWS Cognito client-credentials access token passed as a `token` URL query
    parameter
  encryption: 'All connections are encrypted (documented as: "Note: All connections
    are encrypted").'
  server_url: null
  server_url_note: The connection domain is issued per account by the May Mobility
    Fleet API team and is written as `domain` in all published examples. It is not
    published and has not been guessed here.
addressing:
  realtime_topic_pattern: /.vehicle.{vehicleID}.{topicName}
  realtime_subscription: Comma-separated topic list passed as a `topics` query
    parameter, e.g. `domain/topics=/.vehicle.testvehicle.GPS,/.vehicle.examplevehicle.POSE`
  video_subscription: Comma-separated vehicle list passed as a `vehicles` query
    parameter, e.g. `domain/vehicles=vehiclename1,vehiclename2`
  batch_path_pattern: /vehicles/{vehicleID}/topics/{topicName}
limits:
- limit: Maximum 20 topics per Realtime connection or request. Exceeding it fails the
    connection with an error.
- limit: Maximum 4 vehicles per video-mode connection or request. Exceeding it fails
    the connection with an error.
modes:
- name: telemetry
  description: Streams JSON messages for subscribed per-vehicle topics. Protobuf is
    decoded to JSON server-side, so no protobuf tooling is needed on the client.
  encoding: application/json
- name: video
  description: Streams exterior camera feeds. Output is a serialized `quic_wrapper`
    protobuf whose `data` field carries a `May.image_t` message. Encodings observed
    in the docs are JPEG, VP8 and VP9 (mostly VP9); frame types are KEY and DELTA.
    Clients must sequence frames themselves; the docs publish a reference
    `decodingWithFrameSequencing` routine in TypeScript.
  encoding: application/x-protobuf
  schema: grpc/may-mobility-quic-wrapper.proto
  cameras: 'Camera position is carried in the `mqtt_topic` field of the wrapper —
    e.g. a value containing "fc" denotes front center.'
common_message_fields:
- field: utime
  datatype: string
  description: Best estimate of when this message is from, host clock in UTC
    (microseconds).
- field: vehicle
  datatype: string
  description: Unique vehicle name the data is associated to.
- field: topic
  datatype: string
  description: Type of telemetry data.
channels:
- name: GPS
  topic: /.vehicle.{vehiclename}.GPS
  batch_path: /vehicles/{vehiclename}/topics/GPS
  realtime: true
  batch: true
  description: Provides latitude, longitude, and elevation information of a vehicle.
    This also contains uncertainties on those measurements.
  fields:
  - {name: utime, type: string}
  - {name: utimeGlobal, type: double, description: Global time of navigation solution
      generation}
  - {name: lat, type: double, description: latitude of a vehicle}
  - {name: lon, type: double, description: longitude of a vehicle}
  - {name: elevation, type: double, description: Meters above sea level}
  - {name: horizDop, type: double, description: Horizontal Dilution of Precision}
  - {name: timeDop, type: double, description: GPS Time Dilution of Precision}
  - {name: nsats, type: int32, description: number of satellites}
  - {name: errX, type: double, description: meters covariance East West}
  - {name: errY, type: double, description: meters covariance North South}
  - {name: errZ, type: double, description: meters covariance Up Down}
  - {name: vehicle, type: string}
  - {name: topic, type: string}
  docs: https://docs.maymobility.com/docs/fleet-api/topics-channels/gps
- name: GPS_VELOCITY
  topic: /.vehicle.{vehiclename}.GPS_VELOCITY
  batch_path: /vehicles/{vehiclename}/topics/GPS_VELOCITY
  realtime: true
  batch: true
  description: NED velocity, ground speed and heading of the vehicle with ublox
    accuracy estimates.
  fields:
  - {name: utime, type: string}
  - {name: utimeGlobal, type: double}
  - {name: vNorth, type: double, description: NED north velocity m/s}
  - {name: vEast, type: double, description: NED east velocity m/s}
  - {name: vDown, type: double, description: NED down velocity m/s}
  - {name: groundSpeed, type: double, description: ground speed (2-D) m/s}
  - {name: heading, type: double, description: NED heading of motion (0.0 = North)
      (2-D) rad}
  - {name: speedAccuracy, type: double, description: ublox model speed estimate
      accuracy m/s}
  - {name: headingAccuracy, type: double, description: ublox model heading estimate
      accuracy rad}
  - {name: validFix, type: bool, description: GNSS fix is within ublox configured DOP
      and accuracy masks}
  - {name: vehicle, type: string}
  - {name: topic, type: string}
  docs: https://docs.maymobility.com/docs/fleet-api/topics-channels/gps-velocity
- name: POSE
  topic: /.vehicle.{vehiclename}.POSE
  batch_path: /vehicles/{vehiclename}/topics/POSE
  realtime: true
  batch: true
  description: Provides position, orientation, linear velocity, angular velocity, and
    linear acceleration for the rigid body of a vehicle.
  fields:
  - {name: utime, type: string, description: utime that the actual measurement took
      place}
  - {name: pos, type: '[double]', description: position (x,y,z) in meters in local
      frame}
  - {name: quat, type: '[double]', description: quaternion which rotates a vector
      from body to local frame}
  - {name: vel, type: '[double]', description: velocity in m/s, expressed in body
      frame}
  - {name: avel, type: '[double]', description: angular velocity about (x,y,z) in
      rad/s in body frame}
  - {name: acc, type: '[double]', description: acceleration in m/s^2 in body frame}
  - {name: vehicle, type: string}
  - {name: topic, type: string}
  docs: https://docs.maymobility.com/docs/fleet-api/topics-channels/pose
- name: L2G
  topic: /.vehicle.{vehiclename}.L2G
  realtime: true
  batch: false
  description: Converts Local Position to Global Position (pose). Global position is
    relative to the map.
  fields:
  - {name: topic, type: string}
  - {name: vehicle, type: string}
  - {name: utime, type: string, description: Time (UTC) of the L2G reading}
  - {name: xyt, type: '[double]', description: 'Encoding of POSE channel as X, Y,
      Theta — a vector to map (translate and rotate) pose''s position to the global
      (RTN) position.'}
  docs: https://docs.maymobility.com/docs/fleet-api/topics-channels/l2g
- name: ROUTE_LOCATION
  topic: /.vehicle.{vehiclename}.ROUTE_LOCATION
  batch_path: /vehicles/{vehiclename}/topics/ROUTE_LOCATION
  realtime: true
  batch: true
  description: Provides details on the edge we are currently on or closest to in
    route network, along with the latitude, longitude, and altitude associated with
    that location.
  fields:
  - {name: utime, type: string}
  - {name: layerId, type: '[string]', description: road, lane, navigation as defined
      by route network}
  - {name: lla, type: '[double]', description: latitude, longitude, altitude relative
      to the route network (degrees, degrees, meters)}
  - {name: vehicle, type: string}
  - {name: topic, type: string}
  docs: https://docs.maymobility.com/docs/fleet-api/topics-channels/route-location
- name: DRIVE_STATUS
  topic: /.vehicle.{vehiclename}.DRIVE_STATUS
  batch_path: /vehicles/{vehiclename}/topics/DRIVE_STATUS
  realtime: true
  batch: true
  availability_note: This topic is unavailable for Lexus vehicles.
  description: Provides details on throttle, brake and steering on a vehicle ride.
  fields:
  - {name: utime, type: string}
  - {name: throttleValid, type: bool}
  - {name: throttleUtime, type: string}
  - {name: throttle, type: double, description: 'forward is positive and reverse is
      negative [-1, 1]; reports last known state. Throttle does not exist when brake
      is applied, in which case brake is available in its place.'}
  - {name: brakeValid, type: bool}
  - {name: brakeUtime, type: string}
  - {name: steerValid, type: bool}
  - {name: steerUtime, type: string}
  - {name: steer, type: double, description: wheel angle, left is positive and right
      is negative; reports last known state}
  - {name: shiftValid, type: bool}
  - {name: shiftUtime, type: string}
  - {name: shift, type: int32, description: SHIFT type enum; reports last known state}
  - {name: modeValid, type: bool}
  - {name: modeUtime, type: string}
  - {name: mode, type: int32, description: MODE type enum; reports last known state}
  - {name: vehicle, type: string}
  - {name: topic, type: string}
  docs: https://docs.maymobility.com/docs/fleet-api/topics-channels/drive-status
- name: RUNLEVEL
  topic: /.vehicle.{vehiclename}.RUNLEVEL
  batch_path: /vehicles/{vehiclename}/topics/RUNLEVEL
  realtime: true
  batch: true
  description: Provides information if the vehicle is in manual or autonomy.
  safety_relevant: true
  fields:
  - {name: utime, type: string}
  - {name: runlevel, type: string, description: The current runlevel for the system —
      the actual mode the vehicle is being driven in (autonomy or manual).}
  - {name: healthRunlevel, type: string, description: 'Runlevel specified by the
      health monitoring system. "nominal" means the vehicle is capable of autonomous
      driving; any value other than nominal or controlled stop means it is not and
      the safety driver must take over.'}
  - {name: requestedRunlevel, type: string, description: The runlevel currently being
      requested by a user.}
  - {name: vehicle, type: string}
  - {name: topic, type: string}
  docs: https://docs.maymobility.com/docs/fleet-api/topics-channels/runlevel
- name: DRIVER_TAKEOVER
  topic: /.vehicle.{vehiclename}.DRIVER_TAKEOVER
  batch_path: /vehicles/{vehiclename}/topics/DRIVER_TAKEOVER
  realtime: true
  batch: true
  availability_note: This topic is unavailable for Lexus vehicles.
  safety_relevant: true
  description: Driver Intervention signals and determination of Takeover Status, as
    well as safety cross checks of associated signals.
  fields:
  - {name: utime, type: string}
  - {name: primaryChannelIntervention, type: integer, description: Takeover determined
      from a primary channel (0 or 1)}
  - {name: secondaryChannelIntervention, type: integer, description: 'For internal
      use only: takeover determined from secondary channel (0 or 1)'}
  - {name: adnDetectedTakeover, type: integer, description: 'For internal use only:
      takeover determined from the two channel interventions'}
  - {name: adnModeCommand, type: integer, description: 'For internal use only:
      takeover determined from interventions'}
  - {name: mayIntervention, type: boolean, description: Whether there was a driver
      takeover, based on adnDetectedTakeover and the channel interventions.}
  - {name: vehicle, type: string}
  - {name: topic, type: string}
  docs: https://docs.maymobility.com/docs/fleet-api/topics-channels/driver-takeover
- name: COLLISION_NOTIFICATION
  topic: /.vehicle.{vehiclename}.COLLISION_NOTIFICATION
  realtime: true
  batch: false
  safety_relevant: true
  description: This event is triggered when an impact is detected on ego.
  fields:
  - {name: utime, type: string}
  - {name: impact_detection, type: string, description: 'NORMAL_STATUS,
      CRASH_DETECTION_AIRBAG, CRASH_DETECTION_NON_AIRBAG, INVALID_VALUE'}
  - {name: vehicle, type: string}
  - {name: topic, type: string}
  enums:
    impact_detection:
    - {value: NORMAL_STATUS, meaning: normal, no impact detected}
    - {value: IMPACT_POINT, meaning: Crash detection with activated airbag; shuts off
        high voltage circuit, with airbag deployment.}
    - {value: CRASH_DETECTION_AIRBAG, meaning: Crash detection; shuts off high voltage
        circuit, without airbag deployment.}
    - {value: INVALID_VALUE, meaning: Invalid value}
  note: 'The field table and the enum table disagree — the field description lists
    CRASH_DETECTION_NON_AIRBAG while the enum table lists IMPACT_POINT in its place.
    Recorded verbatim as published; not reconciled.'
  added: '2026-04 (April 2024 release notes)'
  docs: https://docs.maymobility.com/docs/fleet-api/topics-channels/collision-detected
- name: TRAFFIC_LIGHT
  topic: /.vehicle.{vehiclename}.TRAFFIC_LIGHT
  realtime: true
  batch: false
  description: Provides current status of the traffic light and the distance to the
    next traffic light per May's Planner.
  fields:
  - {name: utime, type: string, description: Local machine time when this list was
      generated}
  - {name: distance, type: int32, description: 'distance to the next traffic light we
      plan to wait for; -1 if no traffic light is currently relevant'}
  - {name: signal_type, type: SignalType, description: Configuration of traffic light}
  - {name: status_straight_turn, type: Status, description: Estimate of the light
      status}
  - {name: status_right_turn, type: Status, description: Estimate of the light status}
  - {name: status_left_turn, type: Status, description: Estimate of the light status}
  added: '2024-06 (June 2024 release notes)'
  docs: https://docs.maymobility.com/docs/fleet-api/topics-channels/traffic-light
- name: VEHICLE_STATE
  topic: /.vehicle.{vehiclename}.VEHICLE_STATE
  realtime: true
  batch: false
  description: 'Provides a comprehensive overview of a vehicle''s status, including
    the state of signals, lights, windows, windshield wipers, airbags, access control,
    seat belts, AC temperature, tire pressure, odometer, fuel status, and the
    vehicle''s VIN. The topic is organised into subtopics (for instance "Seat Belts")
    each broken into their own fields.'
  subtopics:
  - name: Seat Belts
    fields:
    - seatBeltStatus1L
    - seatBeltStatus1R
    - seatBeltStatus2L
    - seatBeltStatus2R
    - seatBeltStatus3L
    - seatBeltStatus3R
    - seatBeltStatus3C
    values: 'BUCKLED, UNBUCKLED, Undetermined (sensor not working just after IG-ON,
      communication disruption to the seat sensor, or switch fault)'
  added: '2024-04 (April 2024 release notes)'
  docs: https://docs.maymobility.com/docs/fleet-api/topics-channels/vehicle-state
- name: HEALTH_SUMMARY
  topic: /.vehicle.{vehiclename}.HEALTH_SUMMARY
  batch_path: /vehicles/{vehiclename}/topics/HEALTH_SUMMARY
  realtime: true
  batch: true
  description: Outputs the status/errors of various modules running in a vehicle.
  fields:
  - {name: utime, type: string, description: Local machine utime of the most recently
      reported health update}
  - {name: statuses, type: '[Statuses]', description: Array of Statuses}
  - {name: nuids, type: uint32, description: How many uids there are in the report}
  - {name: nfields, type: uint32, description: How many reporting fields for every
      uid there are}
  - {name: vehicle, type: string}
  - {name: topic, type: string}
  docs: https://docs.maymobility.com/docs/fleet-api/topics-channels/health-summary
- name: PLATFORM_HEALTH
  topic: /.vehicle.{vehiclename}.PLATFORM_HEALTH
  batch_path: /vehicles/{vehiclename}/topics/PLATFORM_HEALTH
  realtime: true
  batch: true
  description: Provides details on the compute, storage, power and processes of a
    vehicle.
  fields:
  - {name: utime, type: string}
  - {name: groupId, type: Group Id, description: Each group is identified by its ID}
  - {name: value, type: uint32, description: the value of interpretation}
  - {name: valueId, type: Value Id, description: the ID that defines the
      interpretation of the value}
  - {name: vehicle, type: string}
  - {name: topic, type: string}
  docs: https://docs.maymobility.com/docs/fleet-api/topics-channels/platform-health
- name: LIGHTING_STATUS
  topic: /.vehicle.{vehiclename}.LIGHTING_STATUS
  batch_path: /vehicles/{vehiclename}/topics/LIGHTING_STATUS
  realtime: true
  batch: true
  availability_note: This topic is unavailable for Lexus vehicles.
  description: Provides details on the condition of all the lights that are reported
    on by firmware.
  fields:
  - {name: utime, type: string}
  - {name: output, type: uint32, description: bitfield of lights that are reported on
      by firmware}
  - {name: vehicle, type: string}
  - {name: topic, type: string}
  docs: https://docs.maymobility.com/docs/fleet-api/topics-channels/lighting-status
- name: TELE_OP_OBJECTS
  topic: /.vehicle.{vehiclename}.TELE_OP_OBJECTS
  batch_path: /vehicles/{vehiclename}/topics/TELE_OP_OBJECTS
  realtime: true
  batch: true
  description: Perception object list published for teleoperation, as tele_op_object_t
    entries.
  fields:
  - {name: utime, type: string, description: Local machine time when this list was
      generated}
  - {name: id, type: int32, description: 'The ID of the object; -1 == EGO agent, else
      a real object'}
  - {name: vel, type: '[double]', description: 'estimated velocity vector for the
      object in global frame [m/s]'}
  - {name: pose, type: '[double]', description: position (x,y,z) in meters in global
      frame}
  - {name: quat, type: '[double]', description: quaternion which rotates a vector
      from body to global frame}
  - {name: poly, type: polygon_t, description: A bounding polygon for the object in
      global frame}
  - {name: classLabel, type: string, description: The maximum probability class of
      this object as a human readable string}
  docs: https://docs.maymobility.com/docs/fleet-api/topics-channels/teleop-objects
batch_only_resources:
- name: LIDAR
  description: This object is an abstraction of vehicle lidar (Ouster and Velodyne)
    data. Retrieved through a two-step Batch API flow.
  realtime: false
  batch: true
  format: ROSBAG
  docs: https://docs.maymobility.com/docs/fleet-api/topics-channels/lidar
- name: SHIFT_TIMING
  description: Vehicle shifts associated with a vehicle and day.
  realtime: false
  batch: true
  docs: https://docs.maymobility.com/docs/fleet-api/topics-channels/vehicle-shift-timing
- name: LAST_ACTIVE
  description: Last time a vehicle was in service, as an ISO DateTime.
  realtime: false
  batch: true
  docs: https://docs.maymobility.com/docs/fleet-api/topics-channels/last-active
coverage:
  realtime_channels: 15
  batch_capable_channels: 11
  realtime_only_channels: 4
  batch_only_resources: 3
  safety_relevant_channels: 3
x-evidence:
  fetched: '2026-08-01'
  pages:
  - https://docs.maymobility.com/docs/intro
  - https://docs.maymobility.com/docs/fleet-api/types-of-data
  - https://docs.maymobility.com/docs/fleet-api/video-data-output
  - https://docs.maymobility.com/docs/fleet-api/decoding-a-message
  - https://docs.maymobility.com/docs/fleet-api/topics-channels/* (18 pages)
  http_status: 200