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
| Property | Value |
|---|---|
| Rate | 10 Hz, the rate required by the CTI 4501 Connected Intersections guide; some early deployments used 1 or 2 Hz |
| PSID | 0x8002 (p-encoded 8002) |
| Channel | Same C-V2X channel as everything else under FCC 24-123 |
| Signing | Signed with the RSU's application certificate holding PSID 0x8002; CTI 4501 expects a full certificate at least once per second |
| Source | Controller or SPaT generator → RSU immediate-forward (rsuIFMTable), never the store-and-repeat table, because the content changes every tenth of a second |
| Size | 60 to 250 bytes depending on the number of signal groups |
Structure, section by section
Top level: SPAT
| Field | Meaning | Units and range | Typical value | Where it comes from |
|---|---|---|---|---|
timeStamp | Minute of the year the message was built | MinuteOfTheYear, optional | 403200 | generator clock |
name | Human-readable name | up to 63 chars, optional | configuration | |
intersections | One or more IntersectionState entries; usually exactly one | list 1 … 32 |
IntersectionState
| Field | Meaning | Units and range | Typical value | Where it comes from |
|---|---|---|---|---|
id | region (RoadRegulatorID) and id (IntersectionID); must equal the MAP's | 0 … 65535 each | region 0, id 1201 | agency's intersection numbering |
revision | Edition of the MAP this SPaT corresponds to | MsgCount 0 … 127 | 3 | must track the MAP revision |
status | 16-bit IntersectionStatusObject | bits: 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) | 0000000000000000 | controller status via NTCIP 1202 |
moy | Minute of the year | 0 … 527039 | 403200 | generator clock |
timeStamp | Milliseconds into the current minute | DSecond 0 … 59999 | 12345 | generator clock, from the controller's tick |
enabledLanes | Lane IDs whose MAP isVehicleRevocableLane or crosswalk revocable flag is active right now | list of LaneID, optional | time-of-day plan | |
states | One MovementState per signal group | list 1 … 255 | controller outputs | |
maneuverAssistList | Queue length and storage per connection | optional | detection | |
roadAuthorityID | Object identifier of the road authority, new in 2024 | optional | agency |
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:
| Field | Meaning | Units and range | Typical value |
|---|---|---|---|
eventState | MovementPhaseState: 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) | enum | protected-Movement-Allowed |
timing.startTime | When this state began | TimeMark 0.1 s past the hour, optional | 1200 |
timing.minEndTime | Earliest the state can end; mandatory | TimeMark | 1450 |
timing.maxEndTime | Latest the state can end | TimeMark, optional | 1550 |
timing.likelyTime | Best estimate | TimeMark, optional | 1500 |
timing.confidence | Confidence in likelyTime | 0 … 15 | 12 |
timing.nextTime | When the state will next recur | TimeMark, optional | |
speeds | Advisory speeds: type (greenwave, ecoDrive, transit), speed (0.1 m/s), distance (m), class | optional |
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
- 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.
- Set
id.idto your intersection andrevisionto your MAP's revision. SetmoyandtimeStampto now (the quick fields offer "now"). - For each signal group set
eventStateand the three TimeMarks. Compute them as tenths of a second past the hour; the?help onminEndTimeshows the current value for "now + 10 s". - Add a second
MovementEventto a red movement witheventState protected-Movement-Allowedand later TimeMarks to describe the upcoming green. - 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. - 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
idandrevisionversus 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.statusbits.preemptIsActiveorsignalPriorityIsActivetells you a priority call is being served (see signal priority).failureFlash,failureModeornoValidSPATisAvailableAtThisTimemeans the timing fields should be ignored.- TimeMarks must be ahead of the time stamp. A
minEndTimeearlier than the message's owntimeStampwithin 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
timeStampadvancing; 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).
Related standards and further reading
- 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.