SpotHero Hourly Parking Search API
Find hourly and daily parking near a point for a time window: each facility's total and base price, availability, address, walking distance, operator and rating.
- 1 credit per call
- Failed calls are free
- Updated
- spothero.parking.search
{ "search_type": "transient", "facilities": [ { "title": "100 W Monroe St. - Hyatt Centric The Loop Chicago", "address": "100 West Monroe Street", "available": true, "base_price": 70.5, "facility_id": 96444, "facility_type": "valet_stand", "lat": 41.880914999999995, "lon": -87.631092, "navigation_tip": "Enter this location on West Monroe Street. Arrive at 100 W Monroe St. This is the Valet Stand for Hyatt Centric The Loop, operated by SP+. …", "operator": "SP+ Parking", "rating_average": 4.1, "rating_count": 27, "total_price": 74.73, "walking_meters": 167 }, { "title": "172 W Madison St. - Washington-Madison-Wells (WMW) Garage", "address": "172 W Madison St", "available": true, "base_price": 15, "facility_id": 118195, "facility_type": "garage", "lat": 41.88198, "lon": -87.63324, "navigation_tip": "****Parking is available on all levels of the garage, including the rooftop. Please proceed up the ramps if lower levels appear full.\r\n\r\nEnte…", "operator": "InterPark Parking", "rating_average": 4.6, "rating_count": 4662, "total_price": 15.99, "walking_meters": 202 } ]}
| # | Facility | Address | Total price | Base price | Available | Walk (m) | Rating | Operator | Type | Facility ID |
|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 100 W Monroe St. - Hyatt Centric The Loop Chicago | 100 West Monroe Street | 74.73 | 70.5 | true | 167 | 4.1 | SP+ Parking | valet_stand | 96444 |
| 2 | 172 W Madison St. - Washington-Madison-Wells (WMW) Garage | 172 W Madison St | 15.99 | 15 | true | 202 | 4.6 | InterPark Parking | garage | 118195 |
| 3 | 10 S Wells St. - Poetry Garage | 10 South Wells Street | 19.53 | 18 | true | 287 | 4.8 | garage | 4436 | |
| 4 | 71 W Monroe St. - Italian Village Valet | 71 West Monroe Street | 20.14 | 19 | true | 198 | 4 | Royal Key Parking | valet_stand | 177083 |
| 5 | 35 S Dearborn St. (30 W Monroe St.) - Garage | 35 South Dearborn Street | 34.72 | 32 | true | 204 | 4.6 | LAZ Parking | garage | 10369 |
| 6 | 44 W Marble Place (33 W Monroe) | 26.5 | 25 | true | 283 | 4.6 | LAZ Parking | garage | 636 | |
| 7 | 22 W Monroe St. - Hampton Inn Majestic Valet Stand | 22 West Monroe Street | 31.8 | 30 | true | 314 | 4.3 | LAZ Parking | valet_stand | 152959 |
| 8 | 201 W Madison St. - Poetry Garage | 201 West Madison Street | 19.53 | 18 | true | 351 | 4.8 | SP+ Parking | garage | 1192 |
| 9 | 183 W Monroe St. - Garage | 183 West Monroe Street | 19.61 | 18.5 | true | 341 | 4.3 | ABM Parking | garage | 88794 |
| 10 | 38 N Wells St. - Washington-Wells Garage | 38 North Wells Street | 19.08 | 18 | true | 342 | 4.8 | garage | 4532 |
What you send
The input
object of the request, with every field the endpoint accepts.
| Field | Type | Required | What it does | Example |
|---|---|---|---|---|
| ends | string | yes | When parking ends, in the same format. | 2026-10-10T20:00:00-05:00 |
| latitude | number | yes | Where you want to park: the latitude of the destination. | 41.881943 |
| longitude | number | yes | Where you want to park: the longitude of the destination. | -87.630976 |
| starts | string | yes | When parking starts, with its time zone, such as 2026-10-10T16:00:00-05:00. | 2026-10-10T16:00:00-05:00 |
| cursor | string | no | Pass next_cursor from the last response to get the next page. | |
| include_unavailable | boolean | no | Keep facilities that have no space for that window. | |
| limit | integer | no | How many facilities to return. | |
| max_distance_meters | integer | no | How far from the point to look, in metres. |
Fields it returns
What each record in the response holds, with the values from the sample above.
| Field | Type | What it is | Example |
|---|---|---|---|
| facilities[].title | string | The name as SpotHero shows it. | 100 W Monroe St. - Hyatt Centric The Loop Chicago |
| facilities[].address | string | The parking facility's street address. | 100 West Monroe Street |
| facilities[].total_price | number | The price with fees. | 74.73 |
| facilities[].base_price | number | The price before fees. | 70.5 |
| facilities[].available | boolean | Whether a space can be booked for the time asked. | true |
| facilities[].walking_meters | integer | The walk from the facility to the destination, in metres. | 167 |
| facilities[].rating_average | number | The facility's average star rating. | 4.1 |
| facilities[].operator | string | The company that runs the facility. | SP+ Parking |
| facilities[].facility_type | string | The kind of facility, such as a lot or garage. | valet_stand |
| facilities[].facility_id | integer | SpotHero's ID for the facility. | 96,444 |
| facilities[].lat | number | The facility's latitude. | 41.88 |
| facilities[].lon | number | The facility's longitude. | -87.63 |
| facilities[].navigation_tip | string | The facility's directions for drivers. | Enter this location on West Monroe Street. Arrive at 100 W Monr… |
| facilities[].rating_count | integer | How many ratings the facility has. | 27 |
| facilities | array | The parking facilities. | 20 records |
| search_type | string | Whether hourly or monthly parking was searched. | transient |
Call it from your code, or ask your agent
Set UPSCRAPE_API_KEY to your key and copy a working request.
curl --request POST \ --url https://data.upscrape.com/execute \ --header "Authorization: Bearer $UPSCRAPE_API_KEY" \ --header "Content-Type: application/json" \ --header "Prefer: wait=30" \ --data '{ "capability": "spothero.parking.search", "input": { "ends": "2026-10-10T20:00:00-05:00", "latitude": 41.881943, "longitude": -87.630976, "starts": "2026-10-10T16:00:00-05:00" }}'
import jsonimport osimport requestspayload = json.loads(r'''{ "capability": "spothero.parking.search", "input": { "ends": "2026-10-10T20:00:00-05:00", "latitude": 41.881943, "longitude": -87.630976, "starts": "2026-10-10T16:00:00-05:00" }}''')response = requests.post( "https://data.upscrape.com/execute", headers={ "Authorization": f"Bearer {os.environ['UPSCRAPE_API_KEY']}", "Content-Type": "application/json", "Prefer": "wait=30", }, json=payload,)response.raise_for_status()print(json.dumps(response.json(), indent=2))
const response = await fetch("https://data.upscrape.com/execute", { method: "POST", headers: { "Authorization": `Bearer ${process.env.UPSCRAPE_API_KEY}`, "Content-Type": "application/json", "Prefer": "wait=30", }, body: JSON.stringify({ "capability": "spothero.parking.search", "input": { "ends": "2026-10-10T20:00:00-05:00", "latitude": 41.881943, "longitude": -87.630976, "starts": "2026-10-10T16:00:00-05:00" }}),});if (!response.ok) { throw new Error(`Upscrape request failed: ${response.status}`);}console.log(JSON.stringify(await response.json(), null, 2));
https://data.upscrape.com/mcp
Using Upscrape, find SpotHero parking near 41.881943, -87.630976 in Chicago from 4 pm to 8 pm this Friday. Make a table of facility, total price, walking distance and rating, cheapest first.
More from the SpotHero API
The same data from other platforms
SpotHero Hourly Parking Search API FAQ
The short answers. The docs have the long ones.
How much does the SpotHero Hourly Parking Search API cost?
1 credit per successful call, shown before it runs. You buy credits once, and paid credits never expire.
What do I send?
Send latitude, longitude, starts and ends. The input fields below list every option with its type and limits.
Do I need a SpotHero login?
No. It reads public SpotHero data; nothing runs on your account.
Can my AI agent call it?
Yes, over MCP: the agent finds spothero.parking.search, checks its price and runs it with the same credits as the REST API.
Your first SpotHero call is free.
Up to 100 free credits to start, no card needed.