Waze All-in-One API avatar

Waze All-in-One API

Pricing

from $4.68 / 1,000 real-time road alerts

Go to Apify Store
Waze All-in-One API

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

Romy

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

1

Monthly active users

7 days ago

Last modified

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 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 — 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

MethodPathDescription
GET/alertsReal-time road events (closures, contraflow, hazards) within a bounding box
GET/routeLive route calculation between two points — distance, ETA, traffic, warnings
GET/searchPlace/venue search, biased toward a location
GET/nearbyPoints of interest near a location, with real category tags
GET/reverse-geocodeTurn a coordinate into a street address
GET/walking-distanceWalking distance in meters between two points
GET/eta-batchLive ETA from one origin to many destinations in a single call
GET/sos-providersEmergency numbers and roadside-assistance contacts for a location

How to use Waze All-in-One API

  1. Open this Actor's Standby API URL (shown on the Actor's page, under the API tab).
  2. 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"
  3. 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:

FieldDescription
idStable event id, unchanged across live updates
versionUpdate/sequence number for this event
typeCodeNumeric event type (not yet mapped to a name — see Known limitations)
street / city / crossStreetLocation context, as reported
pointsEvent geometry (polyline), decoded lon/lat
roadSegmentIdsUnderlying Waze road-graph segment ids the event is linked to
rawThe unparsed AddRoadInfo CSV fields, for the handful of positions not yet mapped to a named field above

/route alternatives:

FieldDescription
totalLengthDistance in meters
totalSecondsETA in seconds
trafficCommentLive traffic-comparison text (e.g. "lighter traffic than usual"), when present
isInvalidForPrivateVehicleTrue when this route needs a taxi/permit/restricted-vehicle type
questionRoute-level warnings/confirmations (tolls, permits, restricted lanes), when present

/search, /nearby venues / /reverse-geocode venue:

FieldDescription
name / houseNumber / street / city / country / address / phoneVenue/address details, as reported (not every field is populated for every result)
location.x / location.yLongitude / latitude (plain decimal degrees) — /search and /nearby only
categoriesReal Waze taxonomy (e.g. ["MUSEUM"], ["CAFE"]) — /nearby only

/eta-batch results:

FieldDescription
lat / lonEchoes back the destination requested
secondsLive ETA in seconds, null if that leg failed

/sos-providers providers:

FieldDescription
name / phone / urlContact details, as reported
type / subtypeNumeric 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. AddRoadInfo is 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 under raw rather than guessed at.
  • /route doesn'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-geocode returned 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.
  • /nearby doesn't support filtering by category. The protocol has a category filter 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 the categories field 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.