Wiki › Messages › SPaT, Signal Phase and Timing: what the traffic signal is doing and when it will change

Updated 2026-10-09

What it is and who sends it

A Signal Phase and Timing message tells vehicles the current state of every movement at a signalized intersection (red, green, yellow and their permissive or protected variants) and when that state is expected to change. It is generated at the roadside, either by the traffic signal controller itself or by a SPaT generator in the RSU or a roadside cabinet device that reads the controller over NTCIP 1202, and it is broadcast by the RSU. Vehicles use it for red-light violation warning, green-light optimal speed advisory, eco-approach and transit priority decisions. A SPaT describes timing only; the geometry that says which lanes each signal group applies to is the companion MAP message, and the two are bound together by signal group numbers, as explained in MAP to SPaT.

If the phases, rings and barriers inside a controller are new to you, read how signal timing works first.

When it is broadcast

PropertyValue
Rate10 Hz, the rate required by the CTI 4501 Connected Intersections guide; some early deployments used 1 or 2 Hz
PSID0x8002 (p-encoded 8002)
ChannelSame C-V2X channel as everything else under FCC 24-123
SigningSigned with the RSU's application certificate holding PSID 0x8002; CTI 4501 expects a full certificate at least once per second
SourceController or SPaT generator → RSU immediate-forward (rsuIFMTable), never the store-and-repeat table, because the content changes every tenth of a second
Size60 to 250 bytes depending on the number of signal groups

Structure, section by section

Top level: SPAT

FieldMeaningUnits and rangeTypical valueWhere it comes from
timeStampMinute of the year the message was builtMinuteOfTheYear, optional403200generator clock
nameHuman-readable nameup to 63 chars, optionalconfiguration
intersectionsOne or more IntersectionState entries; usually exactly onelist 1 … 32

IntersectionState

FieldMeaningUnits and rangeTypical valueWhere it comes from
idregion (RoadRegulatorID) and id (IntersectionID); must equal the MAP's0 … 65535 eachregion 0, id 1201agency's intersection numbering
revisionEdition of the MAP this SPaT corresponds toMsgCount 0 … 1273must track the MAP revision
status16-bit IntersectionStatusObjectbits: manualControlIsEnabled (0), stopTimeIsActivated (1), failureFlash (2), preemptIsActive (3), signalPriorityIsActive (4), fixedTimeOperation (5), trafficDependentOperation (6), standbyOperation (7), failureMode (8), off (9), recentMAPmessageUpdate (10), recentChangeInMAPassignedLanesIDsUsed (11), noValidMAPisAvailableAtThisTime (12), noValidSPATisAvailableAtThisTime (13)0000000000000000controller status via NTCIP 1202
moyMinute of the year0 … 527039403200generator clock
timeStampMilliseconds into the current minuteDSecond 0 … 5999912345generator clock, from the controller's tick
enabledLanesLane IDs whose MAP isVehicleRevocableLane or crosswalk revocable flag is active right nowlist of LaneID, optionaltime-of-day plan
statesOne MovementState per signal grouplist 1 … 255controller outputs
maneuverAssistListQueue length and storage per connectionoptionaldetection
roadAuthorityIDObject identifier of the road authority, new in 2024optionalagency

MovementState and MovementEvent

Each MovementState carries a signalGroup number and a state-time-speed list of one or more MovementEvents. The first event is the current state; later events, when present, describe what comes next (for example the green that follows the current red). Each event has:

FieldMeaningUnits and rangeTypical value
eventStateMovementPhaseState: unavailable, dark, stop-Then-Proceed (flashing red), stop-And-Remain (red), pre-Movement (red-amber, not used in the US), permissive-Movement-Allowed (green ball, yield), protected-Movement-Allowed (green arrow or through green), permissive-clearance (yellow after permissive), protected-clearance (yellow after protected), caution-Conflicting-Traffic (flashing yellow)enumprotected-Movement-Allowed
timing.startTimeWhen this state beganTimeMark 0.1 s past the hour, optional1200
timing.minEndTimeEarliest the state can end; mandatoryTimeMark1450
timing.maxEndTimeLatest the state can endTimeMark, optional1550
timing.likelyTimeBest estimateTimeMark, optional1500
timing.confidenceConfidence in likelyTime0 … 1512
timing.nextTimeWhen the state will next recurTimeMark, optional
speedsAdvisory speeds: type (greenwave, ecoDrive, transit), speed (0.1 m/s), distance (m), classoptional

The TimeMark unit is a tenth of a second past the current UTC hour, so 1450 means 2 minutes 25.0 seconds past the hour. To turn it into a countdown, subtract the receiver's own time within the hour. A fixed-time controller reports minEndTime equal to maxEndTime; an actuated controller reports the minimum green as minEndTime and the maximum green as maxEndTime, with likelyTime from its own prediction. Values 36000 to 36009 only occur during a leap second, and 36111 means the time is unknown; a decoder should not turn that into a countdown.

Pedestrian movements are signal groups like any other, typically with protected-Movement-Allowed for WALK, protected-clearance for the flashing DON'T WALK countdown and stop-And-Remain for solid DON'T WALK. Flashing yellow arrows are permissive-Movement-Allowed on the left-turn signal group. Overlaps get their own signal group number in the MAP and SPaT even though the controller derives them from parent phases.

How to create one in this portal

  1. Open the creator and load SPaT. The template is intersection 1201 with four signal groups: eastbound through green (2), northbound through red (4), one pedestrian crossing red (6) and one walking (8). It matches the MAP template, so you can load both and see the binding on the map.
  2. Set id.id to your intersection and revision to your MAP's revision. Set moy and timeStamp to now (the quick fields offer "now").
  3. For each signal group set eventState and the three TimeMarks. Compute them as tenths of a second past the hour; the ? help on minEndTime shows the current value for "now + 10 s".
  4. Add a second MovementEvent to a red movement with eventState protected-Movement-Allowed and later TimeMarks to describe the upcoming green.
  5. Encode / Validate. The hex begins 0013 (messageId 19). Check the summary: each movement is listed with its state and a countdown relative to the message's own time stamp.
  6. Push it with Push to my RSU only for a bench test. On a real intersection SPaT comes from the controller path at 10 Hz; a stored SPaT would announce a frozen signal state to every vehicle that hears it.

How to read a decoded one

  • id and revision versus the MAP. If either differs the vehicle will discard the pair. The portal's live view flags a mismatch between the MAP and SPaT it sees for the same intersection.
  • status bits. preemptIsActive or signalPriorityIsActive tells you a priority call is being served (see signal priority). failureFlash, failureMode or noValidSPATisAvailableAtThisTime means the timing fields should be ignored.
  • TimeMarks must be ahead of the time stamp. A minEndTime earlier than the message's own timeStamp within the hour means the generator's clock or hour rollover is wrong, a frequent bug near the top of the hour.
  • minEndTime ≤ likelyTime ≤ maxEndTime. Anything else is a generator error.
  • Every signal group the MAP references must appear. A missing one leaves those lanes with no state. Extra ones are harmless.
  • Rate and freshness. Consecutive messages should be 100 ms apart with timeStamp advancing; a SPaT whose timing never changes is being served from the wrong table.

Common mistakes: a payload that starts 0012 is a MAP, not a SPaT; a SPaT encoded with revision 0 while the MAP says 3; TimeMarks given as a countdown in seconds instead of an absolute mark; status written as a 14-bit string (it is 16 bits with two reserved bits).

  • SAE J2735_202409, SPAT module; CTI 4501, Connected Intersections Implementation Guide (10 Hz, mandatory timing fields, signal group conventions, MAP and SPaT consistency).
  • NTCIP 1202 v03 and v04, Object Definitions for Actuated Signal Controllers, which define the SPaT-related objects a controller exposes, and NTCIP 1218 v01A for the RSU's immediate-forward table.
  • How signal timing works, MAP, MAP to SPaT, signal priority, units cheat sheet.