U.S. Department of Transportation · AsyncAPI Specification

USDOT ITS JPO Operational Data Environment (ODE) — Kafka event surface

Version 1.0.0

DERIVED, NOT PUBLISHED BY USDOT. The U.S. Department of Transportation publishes no AsyncAPI document. This document is a faithful derivation of the Kafka topic catalog the USDOT ITS Joint Program Office declares verbatim in github.com/usdot-jpo-ode/jpo-ode at jpo-ode-svcs/src/main/resources/application.yaml (ode.kafka.topics), read on 2026-07-28. Every channel address below is a topic name copied from that file; no topic, message or payload was invented. The ODE is deployable connected-vehicle infrastructure, not a DOT-hosted service. There is no public DOT-operated broker: an operator (a state DOT, a research site) runs the ODE against its own Kafka cluster and its own roadside units. Payload schemas are the ODE JSON projections of SAE J2735 messages, documented in the ODE User Guide; they are deliberately left unresolved here rather than guessed.

View Spec View on GitHub TravelUnited StatesAviationAirlinesAirportsGovernmentRegulatorDistributionAviation Consumer ProtectionOpen DataTransportationSafetyStatisticsAutomotiveRailAsyncAPIWebhooksEvents

Channels

Asn1DecoderInput
ASN.1 UPER-encoded messages queued for decoding.
Asn1DecoderOutput
Decoded ASN.1 output emitted by the asn1_codec.
Asn1EncoderInput
Messages queued for ASN.1 UPER encoding prior to RSU or SDX deposit.
Asn1EncoderOutput
ASN.1 UPER-encoded output ready for deposit.
OdeBsmJson
Basic Safety Messages (SAE J2735 BSM) as ODE JSON.
OdeMapJson
MAP intersection geometry messages as ODE JSON.
OdePsmJson
Personal Safety Messages (vulnerable road users) as ODE JSON.
OdeSpatJson
Signal Phase and Timing messages as ODE JSON.
OdeSrmJson
Signal Request Messages as ODE JSON.
OdeSsmJson
Signal Status Messages as ODE JSON.
OdeTimJson
Traveler Information Messages as ODE JSON.
OdeSdsmJson
Sensor Data Sharing Messages as ODE JSON.
OdeRtcmJson
RTCM differential correction messages as ODE JSON.
OdeRsmJson
Road Safety Messages as ODE JSON.
OdeDriverAlertJson
Driver alert events emitted by the ODE.
FilteredOdeBsmJson
BSMs after privacy filtering (jpo-cvdp privacy protection module).
FilteredOdeSpatJson
SPaT messages after filtering.
FilteredOdeTimJson
TIMs after filtering.
OdeTimJsonTMCFiltered
TIMs filtered for Traffic Management Center consumption.
OdeTIMCertExpirationTimeJson
Security-credential expiration times for deposited TIMs.
OdeTimKTableJson
Kafka Streams KTable of current TIM state.
OdeRawEncodedBSMJson
OdeRawEncodedMAPJson
OdeRawEncodedPSMJson
OdeRawEncodedSPATJson
OdeRawEncodedSRMJson
OdeRawEncodedSSMJson
OdeRawEncodedTIMJson
OdeRawEncodedSDSMJson
OdeRawEncodedRTCMJson
OdeRawEncodedRSMJson
SDWDepositorInput
Messages queued for deposit into the Situation Data Exchange (SDX).

Servers

kafka
kafka
Operator-supplied Kafka cluster. Configured through the ODE_KAFKA_BROKERS environment variable; the ODE also supports Confluent Cloud via CONFLUENT_KEY / CONFLUENT_SECRET. No U.S. DOT public broker exists.

AsyncAPI Specification

Raw ↑
asyncapi: 3.0.0
info:
  title: USDOT ITS JPO Operational Data Environment (ODE) — Kafka event surface
  version: '1.0.0'
  description: >-
    DERIVED, NOT PUBLISHED BY USDOT. The U.S. Department of Transportation publishes no
    AsyncAPI document. This document is a faithful derivation of the Kafka topic catalog
    the USDOT ITS Joint Program Office declares verbatim in
    github.com/usdot-jpo-ode/jpo-ode at
    jpo-ode-svcs/src/main/resources/application.yaml (ode.kafka.topics), read on
    2026-07-28. Every channel address below is a topic name copied from that file; no
    topic, message or payload was invented.

    The ODE is deployable connected-vehicle infrastructure, not a DOT-hosted service.
    There is no public DOT-operated broker: an operator (a state DOT, a research site)
    runs the ODE against its own Kafka cluster and its own roadside units. Payload
    schemas are the ODE JSON projections of SAE J2735 messages, documented in the ODE
    User Guide; they are deliberately left unresolved here rather than guessed.
  license:
    name: Apache License 2.0
    url: https://github.com/usdot-jpo-ode/jpo-ode/blob/master/LICENSE
  externalDocs:
    description: ODE Kafka documentation
    url: https://github.com/usdot-jpo-ode/jpo-ode/blob/master/kafka.md
defaultContentType: application/json
servers:
  kafka:
    host: '{brokers}'
    protocol: kafka
    description: >-
      Operator-supplied Kafka cluster. Configured through the ODE_KAFKA_BROKERS
      environment variable; the ODE also supports Confluent Cloud via CONFLUENT_KEY /
      CONFLUENT_SECRET. No U.S. DOT public broker exists.
    variables:
      brokers:
        default: localhost:9092
        description: ODE_KAFKA_BROKERS
channels:
  Asn1DecoderInput:
    address: topic.Asn1DecoderInput
    description: ASN.1 UPER-encoded messages queued for decoding.
    messages:
      asn1DecoderInput:
        name: Asn1DecoderInput
        contentType: application/json
  Asn1DecoderOutput:
    address: topic.Asn1DecoderOutput
    description: Decoded ASN.1 output emitted by the asn1_codec.
    messages:
      asn1DecoderOutput:
        name: Asn1DecoderOutput
        contentType: application/json
  Asn1EncoderInput:
    address: topic.Asn1EncoderInput
    description: Messages queued for ASN.1 UPER encoding prior to RSU or SDX deposit.
    messages:
      asn1EncoderInput:
        name: Asn1EncoderInput
        contentType: application/json
  Asn1EncoderOutput:
    address: topic.Asn1EncoderOutput
    description: ASN.1 UPER-encoded output ready for deposit.
    messages:
      asn1EncoderOutput:
        name: Asn1EncoderOutput
        contentType: application/json
  OdeBsmJson:
    address: topic.OdeBsmJson
    description: Basic Safety Messages (SAE J2735 BSM) as ODE JSON.
    messages:
      odeBsm: {name: OdeBsm, contentType: application/json}
  OdeMapJson:
    address: topic.OdeMapJson
    description: MAP intersection geometry messages as ODE JSON.
    messages:
      odeMap: {name: OdeMap, contentType: application/json}
  OdePsmJson:
    address: topic.OdePsmJson
    description: Personal Safety Messages (vulnerable road users) as ODE JSON.
    messages:
      odePsm: {name: OdePsm, contentType: application/json}
  OdeSpatJson:
    address: topic.OdeSpatJson
    description: Signal Phase and Timing messages as ODE JSON.
    messages:
      odeSpat: {name: OdeSpat, contentType: application/json}
  OdeSrmJson:
    address: topic.OdeSrmJson
    description: Signal Request Messages as ODE JSON.
    messages:
      odeSrm: {name: OdeSrm, contentType: application/json}
  OdeSsmJson:
    address: topic.OdeSsmJson
    description: Signal Status Messages as ODE JSON.
    messages:
      odeSsm: {name: OdeSsm, contentType: application/json}
  OdeTimJson:
    address: topic.OdeTimJson
    description: Traveler Information Messages as ODE JSON.
    messages:
      odeTim: {name: OdeTim, contentType: application/json}
  OdeSdsmJson:
    address: topic.OdeSdsmJson
    description: Sensor Data Sharing Messages as ODE JSON.
    messages:
      odeSdsm: {name: OdeSdsm, contentType: application/json}
  OdeRtcmJson:
    address: topic.OdeRtcmJson
    description: RTCM differential correction messages as ODE JSON.
    messages:
      odeRtcm: {name: OdeRtcm, contentType: application/json}
  OdeRsmJson:
    address: topic.OdeRsmJson
    description: Road Safety Messages as ODE JSON.
    messages:
      odeRsm: {name: OdeRsm, contentType: application/json}
  OdeDriverAlertJson:
    address: topic.OdeDriverAlertJson
    description: Driver alert events emitted by the ODE.
    messages:
      odeDriverAlert: {name: OdeDriverAlert, contentType: application/json}
  FilteredOdeBsmJson:
    address: topic.FilteredOdeBsmJson
    description: BSMs after privacy filtering (jpo-cvdp privacy protection module).
    messages:
      filteredOdeBsm: {name: FilteredOdeBsm, contentType: application/json}
  FilteredOdeSpatJson:
    address: topic.FilteredOdeSpatJson
    description: SPaT messages after filtering.
    messages:
      filteredOdeSpat: {name: FilteredOdeSpat, contentType: application/json}
  FilteredOdeTimJson:
    address: topic.FilteredOdeTimJson
    description: TIMs after filtering.
    messages:
      filteredOdeTim: {name: FilteredOdeTim, contentType: application/json}
  OdeTimJsonTMCFiltered:
    address: topic.OdeTimJsonTMCFiltered
    description: TIMs filtered for Traffic Management Center consumption.
    messages:
      odeTimTmcFiltered: {name: OdeTimTMCFiltered, contentType: application/json}
  OdeTIMCertExpirationTimeJson:
    address: topic.OdeTIMCertExpirationTimeJson
    description: Security-credential expiration times for deposited TIMs.
    messages:
      odeTimCertExpiration: {name: OdeTIMCertExpirationTime, contentType: application/json}
  OdeTimKTableJson:
    address: topic.OdeTimKTableJson
    description: Kafka Streams KTable of current TIM state.
    messages:
      odeTimKTable: {name: OdeTimKTable, contentType: application/json}
  OdeRawEncodedBSMJson:
    address: topic.OdeRawEncodedBSMJson
    messages: {raw: {name: OdeRawEncodedBSM, contentType: application/json}}
  OdeRawEncodedMAPJson:
    address: topic.OdeRawEncodedMAPJson
    messages: {raw: {name: OdeRawEncodedMAP, contentType: application/json}}
  OdeRawEncodedPSMJson:
    address: topic.OdeRawEncodedPSMJson
    messages: {raw: {name: OdeRawEncodedPSM, contentType: application/json}}
  OdeRawEncodedSPATJson:
    address: topic.OdeRawEncodedSPATJson
    messages: {raw: {name: OdeRawEncodedSPAT, contentType: application/json}}
  OdeRawEncodedSRMJson:
    address: topic.OdeRawEncodedSRMJson
    messages: {raw: {name: OdeRawEncodedSRM, contentType: application/json}}
  OdeRawEncodedSSMJson:
    address: topic.OdeRawEncodedSSMJson
    messages: {raw: {name: OdeRawEncodedSSM, contentType: application/json}}
  OdeRawEncodedTIMJson:
    address: topic.OdeRawEncodedTIMJson
    messages: {raw: {name: OdeRawEncodedTIM, contentType: application/json}}
  OdeRawEncodedSDSMJson:
    address: topic.OdeRawEncodedSDSMJson
    messages: {raw: {name: OdeRawEncodedSDSM, contentType: application/json}}
  OdeRawEncodedRTCMJson:
    address: topic.OdeRawEncodedRTCMJson
    messages: {raw: {name: OdeRawEncodedRTCM, contentType: application/json}}
  OdeRawEncodedRSMJson:
    address: topic.OdeRawEncodedRSMJson
    messages: {raw: {name: OdeRawEncodedRSM, contentType: application/json}}
  SDWDepositorInput:
    address: topic.SDWDepositorInput
    description: Messages queued for deposit into the Situation Data Exchange (SDX).
    messages:
      sdwDepositorInput: {name: SDWDepositorInput, contentType: application/json}
operations:
  receiveBsm:
    action: receive
    channel: {$ref: '#/channels/OdeBsmJson'}
    summary: Consume decoded Basic Safety Messages.
  receiveMap:
    action: receive
    channel: {$ref: '#/channels/OdeMapJson'}
  receiveSpat:
    action: receive
    channel: {$ref: '#/channels/OdeSpatJson'}
  receiveTim:
    action: receive
    channel: {$ref: '#/channels/OdeTimJson'}
    summary: Consume Traveler Information Messages deposited through the ODE REST API.
  receivePsm:
    action: receive
    channel: {$ref: '#/channels/OdePsmJson'}
  receiveSdsm:
    action: receive
    channel: {$ref: '#/channels/OdeSdsmJson'}
  receiveDriverAlert:
    action: receive
    channel: {$ref: '#/channels/OdeDriverAlertJson'}
  sendSdwDeposit:
    action: send
    channel: {$ref: '#/channels/SDWDepositorInput'}
    summary: Queue a message for deposit into the SDX.