Waze Traffic Alerts Scraper
Pricing
from $3.10 / 1,000 alert chargeds
Waze Traffic Alerts Scraper
Get crowd-sourced road closures, hazards, and events from Waze. Talks directly to Waze's own protocol, no login needed. Split from the mature, published waze-all-in-one-api for a focused, single-purpose workflow.
What does Waze Traffic Alerts Scraper do?
Waze Traffic Alerts Scraper takes one or more geographic bounding boxes and pushes every real-time crowd-sourced road event (closures, contraflow lanes, hazards) found within them — one dataset row per event.
It talks directly to the same internal protocol the official Waze Android app uses (rt.waze.com), reverse-engineered by live MITM capture against a real device and cross-referenced against the app's own decompiled protobuf schema (see proto/waze_rt.proto in the source repo — field names and numbers are the real app's, not guesses). No Waze account, no API key, no scraping setup. This is the /alerts slice of Waze All-in-One API, split out as its own focused Actor.
Why use Waze Traffic Alerts Scraper?
- Real crowd-sourced road events — closures, contraflow lanes, and hazards with geometry, the same data rendered as dashed lines and pins in the Waze app
- Batch multiple areas in one run — pass many bounding boxes and get every event across all of them in a single dataset
- No account needed — every request authenticates itself with a fresh anonymous session
- Confirmed working worldwide — the underlying protocol was tested live in Indonesia, the UK, the US, and Israel during development, not just one market
- Use cases: traffic monitoring dashboards, road-closure alerting, urban mobility research, logistics/routing risk analysis
Input
| Field | Type | Description |
|---|---|---|
boundingBoxes | array | Required. One or more { north, south, east, west } bounding boxes (decimal degrees). |
Example:
{"boundingBoxes": [{ "north": -6.15, "south": -6.18, "east": 106.83, "west": 106.82 }]}
Output
One dataset row per road event, tagged with the bounding box it came from:
{"boundingBox": { "north": -6.15, "south": -6.18, "east": 106.83, "west": 106.82 },"id": "750503858","version": 0,"typeCode": 5,"street": "Contra Flow Hayam Wuruk","city": "Jakarta Pusat","crossStreet": "Gajah Mada","points": [{ "lon": 106.820862, "lat": -6.167265 },{ "lon": 106.819936, "lat": -6.163168 }],"roadSegmentIds": ["516284383", "516266383"],"raw": ["AddRoadInfo","750503858","0","5","0","Contra Flow Hayam Wuruk","Jakarta Pusat","","Gajah Mada","F","F","0","0","2","0","-1","T","-1","-1","12","-1","F","0","0","465","","1164106498","1"]}
Data table
| Field | Description |
|---|---|
boundingBox | The bounding box this event was found in (echoes back the input) |
id | Stable event id, unchanged across live updates |
version | Update/sequence number for this event |
typeCode | Numeric event type (not yet mapped to a name — see Known limitations) |
street / city / crossStreet | Location context, as reported |
points | Event geometry (polyline), decoded lon/lat |
roadSegmentIds | Underlying Waze road-graph segment ids the event is linked to |
raw | The unparsed AddRoadInfo CSV fields, for the handful of positions not yet mapped to a named field above |
How it connects to the parent
This Actor is a narrow, batch-run spin-off of Waze All-in-One API, a Standby REST API exposing eight Waze endpoints. It reuses that Actor's exact session-handshake and CSV-parsing logic for the /alerts endpoint only, restructured as a normal input-in/dataset-out batch Actor instead of an always-on HTTP API. If you need routing, search, nearby POI, reverse geocoding, walking distance, batch ETA, or SOS providers too, use the parent Actor instead.
Known limitations
typeCode, and a handful of other numeric fields, aren't mapped to human-readable names.AddRoadInfois parsed entirely natively (no Java-side protobuf class to cross-reference, unlike the parent's other endpoints) — confirmed by decompiling the actual native parser function. That decompile did surface two verified wire-format facts not yet correlated to an exact field position: one numeric field is a float scaled ×10 (not a plain int), and one field supports a|-delimited sub-list of up to 20 integers — never populated in any sample captured so far. The unmapped positions are returned underrawrather than guessed at.- This is an unofficial, reverse-engineered integration, not affiliated with or endorsed by Waze / Google. Behavior may change if Waze changes its protocol.
Pricing
Pay per event: $0.004 per alert — charged once for each road event returned within a bounding box (Free plan price; lower on paid Apify plans). See the Actor's Pricing tab for current tiered rates.
Found a bug or have a feature request? Use the Issues tab on this Actor's page.