Waze All-in-One API
Pricing
from $4.68 / 1,000 real-time road alerts
Waze All-in-One API
Standby REST API for Waze: real-time road events, live route calculation, place search, nearby POI, reverse geocoding, walking distance, batch ETA, and emergency/roadside-assistance contacts — via Waze's internal RT protocol. Confirmed working worldwide, not just one region. No API key needed.
Pricing
from $4.68 / 1,000 real-time road alerts
Rating
0.0
(0)
Developer
Romy
Maintained by CommunityActor stats
0
Bookmarked
6
Total users
1
Monthly active users
7 days ago
Last modified
Categories
Share
What does Waze All-in-One API do?
Waze All-in-One API is a REST endpoint for Waze's live data — crowd-sourced road events, route calculation with real-time traffic, place search, nearby points of interest, reverse geocoding, logistics helpers (walking distance, batch ETA), and real local emergency/roadside-assistance contacts — from a single always-on API powered by Apify Standby.
It talks directly to the same protocol the official Waze Android app uses, using the real app's own message schema (field names and numbers are the real app's, not guesses). No Waze account, no API key, no scraping setup — call the endpoint, get JSON back. Each request mints its own short-lived anonymous session server-side; you never see or manage credentials.
Confirmed working worldwide — every endpoint below was tested live in Indonesia, the UK, the US, and Israel during development, not just one market.
Why use Waze All-in-One API?
- 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
- Live route calculation — distance, ETA, live traffic comparison, and route-level warnings (tolls, permits, restricted lanes), the same engine behind the app's own navigation
- Place search — the same location-biased venue lookup as the app's search bar
- Nearby POI discovery — what's around a point, with real category tags, no text query needed
- Reverse geocoding — turn any coordinate into a street address
- Batch ETA — real-time ETA to many destinations in one request, for dispatch/delivery routing
- Emergency & roadside assistance contacts — real local numbers (police/ambulance/fire, auto clubs, manufacturer roadside assistance), not templated
- Global — not tied to one country's data
- Always-on — Standby mode means no cold start, responds in milliseconds
- No account needed — every request authenticates itself
- Use cases: traffic monitoring dashboards, logistics/routing risk analysis, road-closure alerting, ETA estimation, delivery dispatch, urban mobility research, travel/safety apps
Endpoints
| Method | Path | Description |
|---|---|---|
GET | /alerts | Real-time road events (closures, contraflow, hazards) within a bounding box |
GET | /route | Live route calculation between two points — distance, ETA, traffic, warnings |
GET | /search | Place/venue search, biased toward a location |
GET | /nearby | Points of interest near a location, with real category tags |
GET | /reverse-geocode | Turn a coordinate into a street address |
GET | /walking-distance | Walking distance in meters between two points |
GET | /eta-batch | Live ETA from one origin to many destinations in a single call |
GET | /sos-providers | Emergency numbers and roadside-assistance contacts for a location |
How to use Waze All-in-One API
- Open this Actor's Standby API URL (shown on the Actor's page, under the API tab).
- Call any endpoint — for example:
curl "https://romy--waze-all-in-one-api.apify.actor/alerts?north=-6.15&south=-6.18&east=106.83&west=106.82"curl "https://romy--waze-all-in-one-api.apify.actor/route?from_lat=-6.1754&from_lon=106.827&to_lat=-6.1274&to_lon=106.6577"curl "https://romy--waze-all-in-one-api.apify.actor/search?query=SPBU&lat=-6.1754&lon=106.827"curl "https://romy--waze-all-in-one-api.apify.actor/nearby?lat=-6.175&lon=106.827"curl "https://romy--waze-all-in-one-api.apify.actor/reverse-geocode?lat=-6.1954&lon=106.8206"curl "https://romy--waze-all-in-one-api.apify.actor/walking-distance?from_lat=-6.1754&from_lon=106.827&to_lat=-6.178&to_lon=106.83"curl "https://romy--waze-all-in-one-api.apify.actor/eta-batch?from_lat=-6.1754&from_lon=106.827&to=-6.1274,106.6577&to=-6.1954,106.8206"curl "https://romy--waze-all-in-one-api.apify.actor/sos-providers?lat=40.7580&lon=-73.9855"
- Read the JSON response — no setup required.
Input
This Actor takes no run-input; it starts immediately in Standby mode. All parameters are passed per-request as HTTP query strings — see the endpoint table above and the OpenAPI schema (API tab on the Actor's page).
Output
Every response is returned directly over HTTP — this Actor does not write to an Apify dataset. Real responses (trimmed):
GET /alerts?north=-6.15&south=-6.18&east=106.83&west=106.82:
{"success": true,"events": [{"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"]}]}
GET /route?from_lat=-6.1754&from_lon=106.827&to_lat=-6.1274&to_lon=106.6577:
{"success": true,"routes": [{ "totalLength": 31365, "totalSeconds": 1986 },{ "totalLength": 27001, "totalSeconds": 2909 },{ "totalLength": 27176, "totalSeconds": 1990 }]}
GET /search?query=SPBU&lat=-6.1754&lon=106.827:
{"success": true,"venues": [{"name": "SPBU 34.10401","location": { "x": 106.843635672, "y": -6.184980284 },"city": "Jakarta Pusat","country": "ID","address": "Kramat Raya 116 RT 002/09","phone": "+62-21-3106507"}]}
GET /nearby?lat=-6.175&lon=106.827&max_results=2:
{"success": true,"venues": [{ "name": "Monumen Nasional", "categories": ["MUSEUM"], "location": { "x": 106.827159601, "y": -6.175430914 }, "city": "Jakarta Pusat", "country": "ID" },{ "name": "Monas Futsal Arenas", "categories": ["STADIUM_ARENA"], "location": { "x": 106.829028705, "y": -6.174461243 }, "street": "Medan Merdeka Timur", "city": "Jakarta Pusat", "country": "ID" }]}
GET /reverse-geocode?lat=-6.1954&lon=106.8206:
{"success": true,"venue": { "street": "Jalan Teluk Betung", "city": "Jakarta Pusat" }}
GET /walking-distance?from_lat=-6.1754&from_lon=106.827&to_lat=-6.178&to_lon=106.83:
{ "success": true, "meters": 411 }
GET /eta-batch?from_lat=-6.1754&from_lon=106.827&to=-6.1274,106.6577&to=-6.1954,106.8206:
{"success": true,"results": [{ "lat": -6.1274, "lon": 106.6577, "seconds": 2056 },{ "lat": -6.1954, "lon": 106.8206, "seconds": 455 }]}
GET /sos-providers?lat=40.7580&lon=-73.9855:
{"success": true,"providers": [{ "phone": "911", "name": "911" },{ "type": 1, "subtype": 3, "phone": "18444110791", "name": "AAA" },{ "type": 1, "subtype": 3, "phone": "18777983752", "name": "Tesla" }]}
Data table
/alerts events:
| Field | Description |
|---|---|
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 |
/route alternatives:
| Field | Description |
|---|---|
totalLength | Distance in meters |
totalSeconds | ETA in seconds |
trafficComment | Live traffic-comparison text (e.g. "lighter traffic than usual"), when present |
isInvalidForPrivateVehicle | True when this route needs a taxi/permit/restricted-vehicle type |
question | Route-level warnings/confirmations (tolls, permits, restricted lanes), when present |
/search, /nearby venues / /reverse-geocode venue:
| Field | Description |
|---|---|
name / houseNumber / street / city / country / address / phone | Venue/address details, as reported (not every field is populated for every result) |
location.x / location.y | Longitude / latitude (plain decimal degrees) — /search and /nearby only |
categories | Real Waze taxonomy (e.g. ["MUSEUM"], ["CAFE"]) — /nearby only |
/eta-batch results:
| Field | Description |
|---|---|
lat / lon | Echoes back the destination requested |
seconds | Live ETA in seconds, null if that leg failed |
/sos-providers providers:
| Field | Description |
|---|---|
name / phone / url | Contact details, as reported |
type / subtype | Numeric category (not yet mapped to a name) |
Pricing
Pay-per-event, billed on each successful call. See the Actor's Pricing tab for current rates.
Known limitations
/alerts'typeCode, and a handful of its other numeric fields, aren't mapped to human-readable names.AddRoadInfois parsed entirely natively (no Java-side protobuf class to cross-reference, unlike every other endpoint here) — 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./routedoesn't return route line geometry. Waze encodes it with Google's S2 cell geometry format (a compressed spherical-geometry encoding), which isn't decoded by this Actor — distance, ETA, traffic, and warnings are all real-time and accurate, only the polyline itself is omitted./reverse-geocodereturned empty in some regions during testing (New York and Tel Aviv, both otherwise dense Waze markets) despite working reliably in Indonesia and the UK. Cause not yet isolated — logged as a regional caveat rather than assumed fixed everywhere.- Parking search exists in the protocol but isn't exposed here. It returned zero results in every live test during development — Jakarta, a Jakarta mall district, and Tel Aviv (Waze's own home market) — despite a well-formed request, across multiple radii and with/without the "popular" flag. Most likely the request needs a different shape than a generic point+radius search (e.g. anchored to a specific venue) rather than a data gap. Kept in the proto schema for future work, not exposed as a public endpoint while empty.
/nearbydoesn't support filtering by category. The protocol has acategoryfilter field, and real category strings were pulled straight from the app (GAS_STATION,PARKING_LOT,CHARGING_STATION,EV_CHARGING_STATION, ...), but every one tried returned zero results in testing, while leaving the filter unset reliably returns real nearby venues with their category already attached. Filter client-side on thecategoriesfield in the response for now.- This is an unofficial, reverse-engineered integration, not affiliated with or endorsed by Waze / Google. Behavior may change if Waze changes its protocol.
Found a bug or have a feature request? Use the Issues tab on this Actor's page.