{
  "data": {
    "id": "rqVaq22Xv16eLhVf8",
    "actId": "nsNiNL5MalNOLsSyK",
    "userId": "NL4ThgItAwaoBlffQ",
    "startedAt": "2026-11-05T11:59:20.516Z",
    "finishedAt": "2026-11-05T11:59:40.715Z",
    "status": "SUCCEEDED",
    "meta": {
      "origin": "CLI"
    },
    "stats": {
      "durationMillis": 20117,
      "runTimeSecs": 20.117,
      "computeUnits": 0.02235222222222222,
      "imageSizeBytes": 319192064
    },
    "options": {
      "useCache": true,
      "betaPackages": false,
      "memoryMbytes": 4096,
      "diskMbytes": 8192
    },
    "createdByOrganizationMemberUserId": "zifX0mkAFMHe8CatY",
    "exitCode": 0,
    "inputSchema": "{\n  \"title\": \"Google Maps Directions Scraper\",\n  \"description\": \"Get route alternatives, multi-stop trips, turn-by-turn steps, traffic, transit detail, distance matrices and directions URLs from Google Maps.\",\n  \"type\": \"object\",\n  \"schemaVersion\": 1,\n  \"properties\": {\n    \"mode\": {\n      \"title\": \"Mode\",\n      \"type\": \"string\",\n      \"description\": \"What to scrape: one route (with optional waypoints), a distance matrix, or a list of Google Maps directions URLs.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"route\",\n        \"matrix\",\n        \"urls\"\n      ],\n      \"enumTitles\": [\n        \"Route — one trip, 2–10 stops\",\n        \"Matrix — every origin × destination\",\n        \"URLs — scrape directions links\"\n      ],\n      \"default\": \"route\",\n      \"prefill\": \"route\"\n    },\n    \"stops\": {\n      \"title\": \"Stops\",\n      \"type\": \"array\",\n      \"description\": \"Ordered stops for route mode: 2–10 locations. The first is the origin, the last is the destination, and everything in between becomes a waypoint.\",\n      \"editor\": \"stringList\",\n      \"minItems\": 2,\n      \"maxItems\": 10,\n      \"items\": {\n        \"type\": \"string\"\n      },\n      \"prefill\": [\n        \"Times Square, New York, NY\",\n        \"Central Park, New York, NY\"\n      ]\n    },\n    \"origins\": {\n      \"title\": \"Origins\",\n      \"type\": \"array\",\n      \"description\": \"Starting locations for matrix mode. Each origin is paired with every destination below.\",\n      \"editor\": \"stringList\",\n      \"items\": {\n        \"type\": \"string\"\n      },\n      \"prefill\": [\n        \"Times Square, New York, NY\",\n        \"Grand Central Terminal, New York, NY\"\n      ]\n    },\n    \"destinations\": {\n      \"title\": \"Destinations\",\n      \"type\": \"array\",\n      \"description\": \"Ending locations for matrix mode. Each destination is paired with every origin above.\",\n      \"editor\": \"stringList\",\n      \"items\": {\n        \"type\": \"string\"\n      },\n      \"prefill\": [\n        \"Central Park, New York, NY\",\n        \"Brooklyn Bridge, New York, NY\",\n        \"JFK Airport, New York, NY\"\n      ]\n    },\n    \"directionsUrls\": {\n      \"title\": \"Directions URLs\",\n      \"type\": \"array\",\n      \"description\": \"Google Maps directions links for URLs mode. Canonical /maps/dir/ links and short share links are both accepted; waypoints and travel mode are read from the link when present.\",\n      \"editor\": \"requestListSources\",\n      \"items\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"url\": {\n            \"type\": \"string\",\n            \"title\": \"URL\",\n            \"description\": \"Public Google Maps directions link.\"\n          }\n        },\n        \"required\": [\n          \"url\"\n        ]\n      }\n    },\n    \"maxPairs\": {\n      \"title\": \"Max Pairs\",\n      \"type\": \"integer\",\n      \"description\": \"Maximum number of origin × destination pairs to request in matrix mode. Pairs beyond this cap are left out.\",\n      \"editor\": \"number\",\n      \"default\": 100,\n      \"minimum\": 1,\n      \"maximum\": 1000,\n      \"prefill\": 100\n    },\n    \"travelMode\": {\n      \"title\": \"Travel Mode\",\n      \"type\": \"string\",\n      \"description\": \"How to travel between the stops.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"driving\",\n        \"walking\",\n        \"bicycling\",\n        \"transit\"\n      ],\n      \"enumTitles\": [\n        \"Driving\",\n        \"Walking\",\n        \"Bicycling\",\n        \"Public transit\"\n      ],\n      \"default\": \"driving\",\n      \"prefill\": \"driving\"\n    },\n    \"avoidTolls\": {\n      \"title\": \"Avoid Tolls\",\n      \"type\": \"boolean\",\n      \"description\": \"Driving only — ask Google Maps to avoid toll roads. If no toll-free route exists, Google may still return a toll route.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"avoidHighways\": {\n      \"title\": \"Avoid Highways\",\n      \"type\": \"boolean\",\n      \"description\": \"Driving only — ask Google Maps to avoid highways and motorways. If no practical alternative exists, Google may still return a highway route.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"avoidFerries\": {\n      \"title\": \"Avoid Ferries\",\n      \"type\": \"boolean\",\n      \"description\": \"Driving only — prefer routes without ferry crossings. If every route uses a ferry, the result is still returned and marked with avoidanceUnmet.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"departureTime\": {\n      \"title\": \"Departure Time\",\n      \"type\": \"string\",\n      \"description\": \"Optional ISO 8601 departure time as local time at the origin, for example 2026-06-16T10:30:00. Used for driving traffic estimates and transit schedules. A timezone offset is accepted but ignored; walking and bicycling ignore the field.\",\n      \"editor\": \"textfield\"\n    },\n    \"maxAlternatives\": {\n      \"title\": \"Max Alternatives\",\n      \"type\": \"integer\",\n      \"description\": \"Maximum number of route alternatives to return per trip, including Google's recommended route. Applies to route and URLs modes. Google usually supplies up to 3 alternatives.\",\n      \"editor\": \"number\",\n      \"default\": 5,\n      \"minimum\": 1,\n      \"maximum\": 8,\n      \"prefill\": 1\n    },\n    \"maxItems\": {\n      \"title\": \"Max Results\",\n      \"type\": \"integer\",\n      \"description\": \"Global cap on the number of records pushed to the dataset.\",\n      \"editor\": \"number\",\n      \"default\": 50,\n      \"minimum\": 1,\n      \"maximum\": 1000,\n      \"prefill\": 5\n    },\n    \"includeSteps\": {\n      \"title\": \"Include Steps\",\n      \"type\": \"boolean\",\n      \"description\": \"Add turn-by-turn steps with instruction, distance, duration, maneuver, coordinates and route geometry for every returned route.\",\n      \"default\": true,\n      \"prefill\": false\n    },\n    \"includeStreetView\": {\n      \"title\": \"Include Street View\",\n      \"type\": \"boolean\",\n      \"description\": \"Add a Street View panorama ID and thumbnail URL to each step where Google publishes one. This also enables step details.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"language\": {\n      \"title\": \"Language\",\n      \"type\": \"string\",\n      \"description\": \"Language for instructions and other localized text.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"en\",\n        \"es\",\n        \"fr\",\n        \"de\",\n        \"it\",\n        \"pt\",\n        \"ja\",\n        \"ko\",\n        \"zh\",\n        \"ar\",\n        \"ru\"\n      ],\n      \"enumTitles\": [\n        \"English\",\n        \"Spanish\",\n        \"French\",\n        \"German\",\n        \"Italian\",\n        \"Portuguese\",\n        \"Japanese\",\n        \"Korean\",\n        \"Chinese\",\n        \"Arabic\",\n        \"Russian\"\n      ],\n      \"default\": \"en\",\n      \"prefill\": \"en\"\n    },\n    \"units\": {\n      \"title\": \"Units\",\n      \"type\": \"string\",\n      \"description\": \"Preferred distance units for the formatted distance fields. Meter values stay unchanged.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"metric\",\n        \"imperial\"\n      ],\n      \"enumTitles\": [\n        \"Metric (km, m)\",\n        \"Imperial (mi, ft)\"\n      ],\n      \"default\": \"metric\",\n      \"prefill\": \"metric\"\n    },\n    \"requestDelayMs\": {\n      \"title\": \"Request Delay (ms)\",\n      \"type\": \"integer\",\n      \"description\": \"Pause between directions requests. A small delay keeps large matrix runs polite and reduces rate limiting.\",\n      \"editor\": \"number\",\n      \"default\": 250,\n      \"minimum\": 0,\n      \"maximum\": 5000,\n      \"prefill\": 250\n    },\n    \"proxyConfiguration\": {\n      \"title\": \"Proxy Configuration\",\n      \"type\": \"object\",\n      \"description\": \"Optional fallback proxy. The actor first requests Google Maps directly and only retries through this proxy if the direct request is blocked.\",\n      \"editor\": \"proxy\"\n    }\n  }\n}",
    "readme": "# Google Maps Route & Distance Matrix Scraper\n\nGet Google Maps directions as structured data — route alternatives, multi-stop trips, turn-by-turn steps, live and typical traffic, transit lines and fares, Street View previews, and full origin × destination travel-time matrices. No Google API key, login or cookie is needed.\n\n## What this actor does\n\n- **Route mode** — one trip with 2–10 ordered stops. Middle stops become waypoints, just like Google Maps' \"Add destination\" feature.\n- **Matrix mode** — every origin × destination pair, one row per pair, with distance, duration and traffic estimates.\n- **URLs mode** — paste public Google Maps directions links, including canonical `/maps/dir/...` links and short share links.\n- **Four travel modes** — driving, walking, bicycling and public transit.\n- **Route alternatives** — Google's recommended route plus the alternatives it returns (usually up to 3); `maxAlternatives` caps the list at 1–8.\n- **Turn-by-turn steps** — instruction, distance, duration, maneuver, start/end coordinates, route geometry and optional Street View pano/thumbnail for every route, not just the first one.\n- **Traffic detail** — current duration, typical duration, no-traffic duration and the expected traffic range for driving routes.\n- **Transit detail** — line, vehicle, headsign, line colour, departure/arrival times, departure and arrival stops, intermediate stops, agency and fare when Google publishes it.\n- **Departure planning** — request driving or transit directions for a future departure time, expressed as local time at the origin.\n- **Avoid flags** — tolls, highways and ferries for driving routes.\n- **Localized output** — 11 instruction languages and metric or imperial distance formatting.\n\nFields are omitted when Google does not provide a value. The actor never fills a missing fare, ETA, instruction or coordinate with a guess.\n\n## Input\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `mode` | select | `route` | `route`, `matrix` or `urls` |\n| `stops` | string list | – | Ordered stops for route mode (2–10); the prefill is Times Square → Central Park |\n| `origins` | string list | – | Matrix origins |\n| `destinations` | string list | – | Matrix destinations |\n| `directionsUrls` | request list | – | Google Maps directions links for URLs mode |\n| `maxPairs` | integer | `100` | Maximum matrix pairs (1–1000) |\n| `travelMode` | select | `driving` | `driving`, `walking`, `bicycling` or `transit` |\n| `avoidTolls` | boolean | `false` | Driving only |\n| `avoidHighways` | boolean | `false` | Driving only |\n| `avoidFerries` | boolean | `false` | Driving only |\n| `departureTime` | text | – | ISO 8601 datetime in the origin's local time; driving and transit |\n| `maxAlternatives` | integer | `5` | Route alternatives per trip (1–8) |\n| `maxItems` | integer | `50` | Global record cap (1–1000) |\n| `includeSteps` | boolean | `true` | Turn-by-turn steps and geometry |\n| `includeStreetView` | boolean | `false` | Street View pano ID and thumbnail per step |\n| `language` | select | `en` | Instruction language |\n| `units` | select | `metric` | `metric` or `imperial` formatting |\n| `requestDelayMs` | integer | `250` | Pause between requests (0–5000 ms) |\n| `proxyConfiguration` | proxy | – | Optional fallback; direct requests are tried first |\n\nExisting saved tasks that still send `origin` and `destination` keep working: the actor maps them to the first and last stop automatically.\n\n## Output: route records\n\nEach route alternative becomes one record:\n\n- `origin`, `destination`, `stops[]`, `waypoints[]` — your inputs plus Google's resolved names, addresses, coordinates and place IDs\n- `originResolved`, `destinationResolved`, `originCoords`, `destinationCoords`\n- `recordType`, `routeIndex`, `routeName`, `routeSummary`, `isRecommended`\n- `distance`, `distanceMeters`, `distanceText` — formatted distance, exact meters, and Google's original text\n- `duration`, `durationSeconds`, `durationText`\n- `durationInTraffic`, `durationInTrafficSeconds`\n- `typicalDuration`, `typicalDurationSeconds`, `noTrafficDuration`, `noTrafficDurationSeconds`, `trafficRange`, `trafficRangeMinSeconds`, `trafficRangeMaxSeconds`, `trafficLevel`, `trafficCondition`\n- `via` — the main road or highway\n- `departureTime`, `arrivalTime`, `transitWindow`, plus ISO timestamps and timezone for transit\n- `fare`, `fares[]`, `transit` and `transitSegments[]` — line, vehicle, headsign, colour, stops, times and fare\n- `steps[]` — instruction, instruction parts, maneuver, distance, duration, start/end coordinates, Street View fields and notes\n- `geometry[]` — route geometry built from step coordinates\n- `legs[]` — per-leg distance, duration and step range for multi-stop trips\n- `availableModes[]` — Google's duration comparison for driving, walking, bicycling and transit\n- `avoidanceUnmet[]` — set when an avoidance request could not be honoured\n- `notes[]`, `googleMapsUrl`, `sourceUrl`, `inputUrl`, `scrapedAt`\n\n## Output: matrix records\n\nMatrix mode adds `originIndex`, `destinationIndex`, `pairIndex` and `routesAvailable` to the best route for each pair. `recordType` is `matrix`. `maxPairs` caps requested pairs and `maxItems` caps pushed rows.\n\n## Examples\n\n### Driving route with a waypoint\n\n```json\n{\n  \"mode\": \"route\",\n  \"stops\": [\n    \"New York, NY\",\n    \"Hartford, CT\",\n    \"Boston, MA\"\n  ],\n  \"travelMode\": \"driving\",\n  \"includeSteps\": true\n}\n```\n\n### Transit trip with a future departure\n\n```json\n{\n  \"mode\": \"route\",\n  \"stops\": [\"Heathrow Airport, London\", \"British Museum, London\"],\n  \"travelMode\": \"transit\",\n  \"departureTime\": \"2026-11-06T13:00:00+00:00\",\n  \"maxAlternatives\": 6\n}\n```\n\n### Distance matrix\n\n```json\n{\n  \"mode\": \"matrix\",\n  \"origins\": [\n    \"Warehouse A, Newark, NJ\",\n    \"Warehouse B, Elizabeth, NJ\"\n  ],\n  \"destinations\": [\n    \"10 Wall St, New York, NY\",\n    \"20 Hudson Yards, New York, NY\",\n    \"JFK Airport, Queens, NY\"\n  ],\n  \"travelMode\": \"driving\",\n  \"maxPairs\": 20,\n  \"maxItems\": 20\n}\n```\n\n### Directions URLs\n\n```json\n{\n  \"mode\": \"urls\",\n  \"directionsUrls\": [\n    {\"url\": \"https://www.google.com/maps/dir/Times+Square,+New+York,+NY/Central+Park,+New+York,+NY/?travelmode=driving\"},\n    {\"url\": \"https://www.google.com/maps/dir/Heathrow+Airport,+London/British+Museum,+London/?travelmode=transit\"}\n  ],\n  \"maxAlternatives\": 3\n}\n```\n\n## Use cases\n\n- Fleet dispatch and delivery-route planning\n- Commute and relocation comparisons across driving, walking, cycling and transit\n- Travel-time matrices for store, warehouse or service-area analysis\n- Itinerary planning with multi-stop road trips\n- Transit schedule and fare research\n\n## FAQ\n\n**How many alternatives can I get?**\n`maxAlternatives` accepts 1–8 as a cap. Google's directions data usually provides up to 3 alternatives; the actor returns exactly what Google provides and never invents a route.\n\n**Do steps appear on every alternative?**\nYes. Every returned route contains its own steps, coordinates and geometry when `includeSteps` is on. Earlier versions only returned steps for the first route.\n\n**How does departure time handle timezones?**\n`departureTime` is interpreted as the local clock time at the origin, matching Google Maps' \"Depart at\" control. An ISO 8601 offset is accepted but ignored, so `2026-11-06T13:00:00-05:00` and `2026-11-06T13:00:00` both mean 1 PM at the origin. Transit output also includes `departureTimezone` and ISO timestamps with the local offset.\n\n**Why is a fare or transit line missing from one route?**\nGoogle only publishes fares and detailed line information for some transit agencies and routes. Those fields are omitted when absent instead of being estimated.\n\n**What happens when Google cannot avoid a toll, highway or ferry?**\nGoogle may still return the only available route. In that case the record is kept and `avoidanceUnmet` explains which preference could not be met.\n\n**How large can a matrix be?**\n`maxPairs` limits requested pairs (up to 1000) and `maxItems` limits pushed rows. For a matrix, one row is produced per pair, using Google's recommended route.\n\n**Do short share links work in URLs mode?**\nYes. Both full `/maps/dir/...` links and short Google Maps share links are resolved before scraping. Travel mode, waypoints and avoid preferences are read from the link when present.\n\n**Is an API key, cookie or login required?**\nNo. The actor reads the same public directions data Google Maps serves to a browser, without an account, cookie or API key.\n\n**Why do distances sometimes differ from Google's displayed text?**\nGoogle localizes displayed units by country. The actor keeps the original text in `distanceText` and also converts the exact meter value into your selected `units`.\n\n**Is this affiliated with Google?**\nNo. This is an independent, third-party actor and is not affiliated with or endorsed by Google.\n",
    "actorDefinition": {
      "actorSpecification": 1,
      "name": "google-maps-route-and-distance-matrix-scraper",
      "title": "Google Maps Route & Distance Matrix Scraper",
      "description": "Get driving, walking, bicycling and transit directions for 2–10 stops — route alternatives, turn-by-turn steps, traffic, transit lines and fares, distance matrices and directions URLs, with no API key.",
      "version": "1.0",
      "buildTag": "latest",
      "dockerfile": "./Dockerfile",
      "readme": "# Google Maps Route & Distance Matrix Scraper\n\nGet Google Maps directions as structured data — route alternatives, multi-stop trips, turn-by-turn steps, live and typical traffic, transit lines and fares, Street View previews, and full origin × destination travel-time matrices. No Google API key, login or cookie is needed.\n\n## What this actor does\n\n- **Route mode** — one trip with 2–10 ordered stops. Middle stops become waypoints, just like Google Maps' \"Add destination\" feature.\n- **Matrix mode** — every origin × destination pair, one row per pair, with distance, duration and traffic estimates.\n- **URLs mode** — paste public Google Maps directions links, including canonical `/maps/dir/...` links and short share links.\n- **Four travel modes** — driving, walking, bicycling and public transit.\n- **Route alternatives** — Google's recommended route plus the alternatives it returns (usually up to 3); `maxAlternatives` caps the list at 1–8.\n- **Turn-by-turn steps** — instruction, distance, duration, maneuver, start/end coordinates, route geometry and optional Street View pano/thumbnail for every route, not just the first one.\n- **Traffic detail** — current duration, typical duration, no-traffic duration and the expected traffic range for driving routes.\n- **Transit detail** — line, vehicle, headsign, line colour, departure/arrival times, departure and arrival stops, intermediate stops, agency and fare when Google publishes it.\n- **Departure planning** — request driving or transit directions for a future departure time, expressed as local time at the origin.\n- **Avoid flags** — tolls, highways and ferries for driving routes.\n- **Localized output** — 11 instruction languages and metric or imperial distance formatting.\n\nFields are omitted when Google does not provide a value. The actor never fills a missing fare, ETA, instruction or coordinate with a guess.\n\n## Input\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `mode` | select | `route` | `route`, `matrix` or `urls` |\n| `stops` | string list | – | Ordered stops for route mode (2–10); the prefill is Times Square → Central Park |\n| `origins` | string list | – | Matrix origins |\n| `destinations` | string list | – | Matrix destinations |\n| `directionsUrls` | request list | – | Google Maps directions links for URLs mode |\n| `maxPairs` | integer | `100` | Maximum matrix pairs (1–1000) |\n| `travelMode` | select | `driving` | `driving`, `walking`, `bicycling` or `transit` |\n| `avoidTolls` | boolean | `false` | Driving only |\n| `avoidHighways` | boolean | `false` | Driving only |\n| `avoidFerries` | boolean | `false` | Driving only |\n| `departureTime` | text | – | ISO 8601 datetime in the origin's local time; driving and transit |\n| `maxAlternatives` | integer | `5` | Route alternatives per trip (1–8) |\n| `maxItems` | integer | `50` | Global record cap (1–1000) |\n| `includeSteps` | boolean | `true` | Turn-by-turn steps and geometry |\n| `includeStreetView` | boolean | `false` | Street View pano ID and thumbnail per step |\n| `language` | select | `en` | Instruction language |\n| `units` | select | `metric` | `metric` or `imperial` formatting |\n| `requestDelayMs` | integer | `250` | Pause between requests (0–5000 ms) |\n| `proxyConfiguration` | proxy | – | Optional fallback; direct requests are tried first |\n\nExisting saved tasks that still send `origin` and `destination` keep working: the actor maps them to the first and last stop automatically.\n\n## Output: route records\n\nEach route alternative becomes one record:\n\n- `origin`, `destination`, `stops[]`, `waypoints[]` — your inputs plus Google's resolved names, addresses, coordinates and place IDs\n- `originResolved`, `destinationResolved`, `originCoords`, `destinationCoords`\n- `recordType`, `routeIndex`, `routeName`, `routeSummary`, `isRecommended`\n- `distance`, `distanceMeters`, `distanceText` — formatted distance, exact meters, and Google's original text\n- `duration`, `durationSeconds`, `durationText`\n- `durationInTraffic`, `durationInTrafficSeconds`\n- `typicalDuration`, `typicalDurationSeconds`, `noTrafficDuration`, `noTrafficDurationSeconds`, `trafficRange`, `trafficRangeMinSeconds`, `trafficRangeMaxSeconds`, `trafficLevel`, `trafficCondition`\n- `via` — the main road or highway\n- `departureTime`, `arrivalTime`, `transitWindow`, plus ISO timestamps and timezone for transit\n- `fare`, `fares[]`, `transit` and `transitSegments[]` — line, vehicle, headsign, colour, stops, times and fare\n- `steps[]` — instruction, instruction parts, maneuver, distance, duration, start/end coordinates, Street View fields and notes\n- `geometry[]` — route geometry built from step coordinates\n- `legs[]` — per-leg distance, duration and step range for multi-stop trips\n- `availableModes[]` — Google's duration comparison for driving, walking, bicycling and transit\n- `avoidanceUnmet[]` — set when an avoidance request could not be honoured\n- `notes[]`, `googleMapsUrl`, `sourceUrl`, `inputUrl`, `scrapedAt`\n\n## Output: matrix records\n\nMatrix mode adds `originIndex`, `destinationIndex`, `pairIndex` and `routesAvailable` to the best route for each pair. `recordType` is `matrix`. `maxPairs` caps requested pairs and `maxItems` caps pushed rows.\n\n## Examples\n\n### Driving route with a waypoint\n\n```json\n{\n  \"mode\": \"route\",\n  \"stops\": [\n    \"New York, NY\",\n    \"Hartford, CT\",\n    \"Boston, MA\"\n  ],\n  \"travelMode\": \"driving\",\n  \"includeSteps\": true\n}\n```\n\n### Transit trip with a future departure\n\n```json\n{\n  \"mode\": \"route\",\n  \"stops\": [\"Heathrow Airport, London\", \"British Museum, London\"],\n  \"travelMode\": \"transit\",\n  \"departureTime\": \"2026-11-06T13:00:00+00:00\",\n  \"maxAlternatives\": 6\n}\n```\n\n### Distance matrix\n\n```json\n{\n  \"mode\": \"matrix\",\n  \"origins\": [\n    \"Warehouse A, Newark, NJ\",\n    \"Warehouse B, Elizabeth, NJ\"\n  ],\n  \"destinations\": [\n    \"10 Wall St, New York, NY\",\n    \"20 Hudson Yards, New York, NY\",\n    \"JFK Airport, Queens, NY\"\n  ],\n  \"travelMode\": \"driving\",\n  \"maxPairs\": 20,\n  \"maxItems\": 20\n}\n```\n\n### Directions URLs\n\n```json\n{\n  \"mode\": \"urls\",\n  \"directionsUrls\": [\n    {\"url\": \"https://www.google.com/maps/dir/Times+Square,+New+York,+NY/Central+Park,+New+York,+NY/?travelmode=driving\"},\n    {\"url\": \"https://www.google.com/maps/dir/Heathrow+Airport,+London/British+Museum,+London/?travelmode=transit\"}\n  ],\n  \"maxAlternatives\": 3\n}\n```\n\n## Use cases\n\n- Fleet dispatch and delivery-route planning\n- Commute and relocation comparisons across driving, walking, cycling and transit\n- Travel-time matrices for store, warehouse or service-area analysis\n- Itinerary planning with multi-stop road trips\n- Transit schedule and fare research\n\n## FAQ\n\n**How many alternatives can I get?**\n`maxAlternatives` accepts 1–8 as a cap. Google's directions data usually provides up to 3 alternatives; the actor returns exactly what Google provides and never invents a route.\n\n**Do steps appear on every alternative?**\nYes. Every returned route contains its own steps, coordinates and geometry when `includeSteps` is on. Earlier versions only returned steps for the first route.\n\n**How does departure time handle timezones?**\n`departureTime` is interpreted as the local clock time at the origin, matching Google Maps' \"Depart at\" control. An ISO 8601 offset is accepted but ignored, so `2026-11-06T13:00:00-05:00` and `2026-11-06T13:00:00` both mean 1 PM at the origin. Transit output also includes `departureTimezone` and ISO timestamps with the local offset.\n\n**Why is a fare or transit line missing from one route?**\nGoogle only publishes fares and detailed line information for some transit agencies and routes. Those fields are omitted when absent instead of being estimated.\n\n**What happens when Google cannot avoid a toll, highway or ferry?**\nGoogle may still return the only available route. In that case the record is kept and `avoidanceUnmet` explains which preference could not be met.\n\n**How large can a matrix be?**\n`maxPairs` limits requested pairs (up to 1000) and `maxItems` limits pushed rows. For a matrix, one row is produced per pair, using Google's recommended route.\n\n**Do short share links work in URLs mode?**\nYes. Both full `/maps/dir/...` links and short Google Maps share links are resolved before scraping. Travel mode, waypoints and avoid preferences are read from the link when present.\n\n**Is an API key, cookie or login required?**\nNo. The actor reads the same public directions data Google Maps serves to a browser, without an account, cookie or API key.\n\n**Why do distances sometimes differ from Google's displayed text?**\nGoogle localizes displayed units by country. The actor keeps the original text in `distanceText` and also converts the exact meter value into your selected `units`.\n\n**Is this affiliated with Google?**\nNo. This is an independent, third-party actor and is not affiliated with or endorsed by Google.\n",
      "input": {
        "title": "Google Maps Directions Scraper",
        "description": "Get route alternatives, multi-stop trips, turn-by-turn steps, traffic, transit detail, distance matrices and directions URLs from Google Maps.",
        "type": "object",
        "schemaVersion": 1,
        "properties": {
          "mode": {
            "title": "Mode",
            "type": "string",
            "description": "What to scrape: one route (with optional waypoints), a distance matrix, or a list of Google Maps directions URLs.",
            "editor": "select",
            "enum": [
              "route",
              "matrix",
              "urls"
            ],
            "enumTitles": [
              "Route — one trip, 2–10 stops",
              "Matrix — every origin × destination",
              "URLs — scrape directions links"
            ],
            "default": "route",
            "prefill": "route"
          },
          "stops": {
            "title": "Stops",
            "type": "array",
            "description": "Ordered stops for route mode: 2–10 locations. The first is the origin, the last is the destination, and everything in between becomes a waypoint.",
            "editor": "stringList",
            "minItems": 2,
            "maxItems": 10,
            "items": {
              "type": "string"
            },
            "prefill": [
              "Times Square, New York, NY",
              "Central Park, New York, NY"
            ]
          },
          "origins": {
            "title": "Origins",
            "type": "array",
            "description": "Starting locations for matrix mode. Each origin is paired with every destination below.",
            "editor": "stringList",
            "items": {
              "type": "string"
            },
            "prefill": [
              "Times Square, New York, NY",
              "Grand Central Terminal, New York, NY"
            ]
          },
          "destinations": {
            "title": "Destinations",
            "type": "array",
            "description": "Ending locations for matrix mode. Each destination is paired with every origin above.",
            "editor": "stringList",
            "items": {
              "type": "string"
            },
            "prefill": [
              "Central Park, New York, NY",
              "Brooklyn Bridge, New York, NY",
              "JFK Airport, New York, NY"
            ]
          },
          "directionsUrls": {
            "title": "Directions URLs",
            "type": "array",
            "description": "Google Maps directions links for URLs mode. Canonical /maps/dir/ links and short share links are both accepted; waypoints and travel mode are read from the link when present.",
            "editor": "requestListSources",
            "items": {
              "type": "object",
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL",
                  "description": "Public Google Maps directions link."
                }
              },
              "required": [
                "url"
              ]
            }
          },
          "maxPairs": {
            "title": "Max Pairs",
            "type": "integer",
            "description": "Maximum number of origin × destination pairs to request in matrix mode. Pairs beyond this cap are left out.",
            "editor": "number",
            "default": 100,
            "minimum": 1,
            "maximum": 1000,
            "prefill": 100
          },
          "travelMode": {
            "title": "Travel Mode",
            "type": "string",
            "description": "How to travel between the stops.",
            "editor": "select",
            "enum": [
              "driving",
              "walking",
              "bicycling",
              "transit"
            ],
            "enumTitles": [
              "Driving",
              "Walking",
              "Bicycling",
              "Public transit"
            ],
            "default": "driving",
            "prefill": "driving"
          },
          "avoidTolls": {
            "title": "Avoid Tolls",
            "type": "boolean",
            "description": "Driving only — ask Google Maps to avoid toll roads. If no toll-free route exists, Google may still return a toll route.",
            "default": false,
            "prefill": false
          },
          "avoidHighways": {
            "title": "Avoid Highways",
            "type": "boolean",
            "description": "Driving only — ask Google Maps to avoid highways and motorways. If no practical alternative exists, Google may still return a highway route.",
            "default": false,
            "prefill": false
          },
          "avoidFerries": {
            "title": "Avoid Ferries",
            "type": "boolean",
            "description": "Driving only — prefer routes without ferry crossings. If every route uses a ferry, the result is still returned and marked with avoidanceUnmet.",
            "default": false,
            "prefill": false
          },
          "departureTime": {
            "title": "Departure Time",
            "type": "string",
            "description": "Optional ISO 8601 departure time as local time at the origin, for example 2026-06-16T10:30:00. Used for driving traffic estimates and transit schedules. A timezone offset is accepted but ignored; walking and bicycling ignore the field.",
            "editor": "textfield"
          },
          "maxAlternatives": {
            "title": "Max Alternatives",
            "type": "integer",
            "description": "Maximum number of route alternatives to return per trip, including Google's recommended route. Applies to route and URLs modes. Google usually supplies up to 3 alternatives.",
            "editor": "number",
            "default": 5,
            "minimum": 1,
            "maximum": 8,
            "prefill": 1
          },
          "maxItems": {
            "title": "Max Results",
            "type": "integer",
            "description": "Global cap on the number of records pushed to the dataset.",
            "editor": "number",
            "default": 50,
            "minimum": 1,
            "maximum": 1000,
            "prefill": 5
          },
          "includeSteps": {
            "title": "Include Steps",
            "type": "boolean",
            "description": "Add turn-by-turn steps with instruction, distance, duration, maneuver, coordinates and route geometry for every returned route.",
            "default": true,
            "prefill": false
          },
          "includeStreetView": {
            "title": "Include Street View",
            "type": "boolean",
            "description": "Add a Street View panorama ID and thumbnail URL to each step where Google publishes one. This also enables step details.",
            "default": false,
            "prefill": false
          },
          "language": {
            "title": "Language",
            "type": "string",
            "description": "Language for instructions and other localized text.",
            "editor": "select",
            "enum": [
              "en",
              "es",
              "fr",
              "de",
              "it",
              "pt",
              "ja",
              "ko",
              "zh",
              "ar",
              "ru"
            ],
            "enumTitles": [
              "English",
              "Spanish",
              "French",
              "German",
              "Italian",
              "Portuguese",
              "Japanese",
              "Korean",
              "Chinese",
              "Arabic",
              "Russian"
            ],
            "default": "en",
            "prefill": "en"
          },
          "units": {
            "title": "Units",
            "type": "string",
            "description": "Preferred distance units for the formatted distance fields. Meter values stay unchanged.",
            "editor": "select",
            "enum": [
              "metric",
              "imperial"
            ],
            "enumTitles": [
              "Metric (km, m)",
              "Imperial (mi, ft)"
            ],
            "default": "metric",
            "prefill": "metric"
          },
          "requestDelayMs": {
            "title": "Request Delay (ms)",
            "type": "integer",
            "description": "Pause between directions requests. A small delay keeps large matrix runs polite and reduces rate limiting.",
            "editor": "number",
            "default": 250,
            "minimum": 0,
            "maximum": 5000,
            "prefill": 250
          },
          "proxyConfiguration": {
            "title": "Proxy Configuration",
            "type": "object",
            "description": "Optional fallback proxy. The actor first requests Google Maps directly and only retries through this proxy if the direct request is blocked.",
            "editor": "proxy"
          }
        }
      },
      "output": {
        "actorOutputSchemaVersion": 1,
        "title": "Google Maps Route & Distance Matrix Scraper Output",
        "description": "Route, matrix and URL records from Google Maps directions — resolved stops, distance, duration, traffic, route alternatives, steps, geometry, transit lines and fares.",
        "properties": {
          "directions": {
            "type": "string",
            "title": "Directions records",
            "description": "Dataset containing route, matrix and URL records. Each record contains one route alternative or one matrix row.",
            "template": "{{links.apiDefaultDatasetUrl}}/items"
          }
        }
      },
      "defaultMemoryMbytes": 1024,
      "minMemoryMbytes": 1024,
      "maxMemoryMbytes": 1024,
      "storages": {
        "dataset": {
          "actorSpecification": 1,
          "views": {
            "overview": {
              "title": "Directions",
              "transformation": {
                "fields": [
                  "recordType",
                  "origin",
                  "destination",
                  "originResolved",
                  "destinationResolved",
                  "routeName",
                  "routeIndex",
                  "isRecommended",
                  "travelMode",
                  "distance",
                  "distanceMeters",
                  "duration",
                  "durationSeconds",
                  "durationInTraffic",
                  "typicalDuration",
                  "noTrafficDuration",
                  "trafficRange",
                  "trafficCondition",
                  "departureTime",
                  "arrivalTime",
                  "fare",
                  "availableModes",
                  "googleMapsUrl",
                  "sourceUrl",
                  "scrapedAt",
                  "steps",
                  "notes"
                ]
              },
              "display": {
                "component": "table",
                "properties": {}
              }
            },
            "matrix": {
              "title": "Distance Matrix",
              "transformation": {
                "fields": [
                  "recordType",
                  "originIndex",
                  "destinationIndex",
                  "pairIndex",
                  "origin",
                  "destination",
                  "originResolved",
                  "destinationResolved",
                  "travelMode",
                  "distance",
                  "distanceMeters",
                  "duration",
                  "durationSeconds",
                  "durationInTraffic",
                  "typicalDuration",
                  "noTrafficDuration",
                  "trafficRange",
                  "routesAvailable",
                  "googleMapsUrl",
                  "scrapedAt"
                ]
              },
              "display": {
                "component": "table",
                "properties": {}
              }
            },
            "transit": {
              "title": "Transit",
              "transformation": {
                "fields": [
                  "origin",
                  "destination",
                  "routeIndex",
                  "transitLine",
                  "transitVehicle",
                  "transitHeadsign",
                  "departureTime",
                  "arrivalTime",
                  "duration",
                  "fare",
                  "transit",
                  "googleMapsUrl",
                  "scrapedAt"
                ]
              },
              "display": {
                "component": "table",
                "properties": {}
              }
            }
          }
        }
      },
      "environmentVariables": {}
    },
    "buildNumber": "1.0.2",
    "imageDigest": "85f3b0a4c6b7f9bda97a23410e07b385ffbe3038dba13d21a1c1e553c9a96a8c",
    "actVersion": {
      "sourceType": "SOURCE_FILES",
      "buildTag": "latest",
      "versionNumber": "1.0"
    },
    "usage": {
      "ACTOR_COMPUTE_UNITS": 0.02235222222222222
    }
  }
}