PadMapper APIpadmapper.com ↗
Search rental listings, retrieve full property details, contact info, and city-wide price trends from PadMapper via 5 structured API endpoints.
What is the PadMapper API?
The PadMapper API provides 5 endpoints to search, filter, and extract rental listing data from padmapper.com. Use search_listings to query rentals by city slug with price and bedroom filters, get_listing_detail to pull full unit info including floorplans, amenities, and agent contacts, or get_city_overview to retrieve neighborhood-level median prices and historical rent trends. Response fields cover coordinates, price ranges, brokerage names, and more.
curl -X GET 'https://api.parse.bot/scraper/aa36e0b6-65ae-43b9-8e67-32513ddb6d73/search_listings?page=1&bedrooms=1%2C2&city_slug=montreal-qc&max_price=3000&min_price=1000' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace padmapper-com-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""PadMapper SDK — search rentals, browse map pins, get building details and city stats."""
from parse_apis.padmapper_api import PadMapper, ListingNotFound
client = PadMapper()
# Search listings in Montreal with price filters, capped to 5 results
for listing in client.listings.search(city_slug="montreal-qc", min_price=1200, max_price=2500, limit=5):
print(listing.building_name, listing.address, listing.min_price, listing.max_price)
# Drill into first result for full building details
listing = client.listings.search(city_slug="toronto-on", bedrooms="1,2", limit=1).first()
if listing:
building = client.buildings.get(listing_id=f"p{listing.pb_id}")
print(building.name, building.formatted_address, building.description[:80])
# Get contact info via instance method
contact = building.contact()
for agent in contact.agents:
print(agent.long_name, agent.email, agent.company_name)
# Get city overview with price trends and neighborhoods
overview = client.cityoverviews.get(city_slug="montreal-qc")
print(overview.city_name, overview.listing_count)
for hood in overview.neighborhoods[:3]:
print(hood.name, hood.listing_count, hood.lat, hood.lng)
# Map-based search for pins in a bounding box
for pin in client.mappins.search(west=-73.59, south=45.49, east=-73.55, north=45.52, limit=3):
print(pin.building_name, pin.address, pin.min_price, pin.max_price)
# Typed error handling for a non-existent listing
try:
client.buildings.get(listing_id="p999999999")
except ListingNotFound as exc:
print(f"Not found: {exc}")
print("exercised: listings.search / buildings.get / building.contact / cityoverviews.get / mappins.search / ListingNotFound")
Search for rental listings in a given city with optional filters for price range and bedroom count. Returns paginated listing results along with neighborhood data for the city. Each page returns up to ~20 listings. Pagination is via page number.
| Param | Type | Description |
|---|---|---|
| page | integer | Page number for pagination. |
| bedrooms | string | Comma-separated list of bedroom counts to filter by (0 for studio, 1, 2, 3, 4). Example: '0,1,2'. |
| city_slugrequired | string | City slug identifying the market to search, formatted as city-state (e.g. 'montreal-qc', 'toronto-on', 'new-york-ny'). |
| max_price | integer | Maximum monthly rent price filter. |
| min_price | integer | Minimum monthly rent price filter. |
{
"type": "object",
"fields": {
"city": "string, display name of the city",
"page": "integer, current page number",
"listings": "array of listing summary objects with address, price range, bedrooms, amenities, coordinates, and building info",
"total_count": "integer or null, total number of matching listings",
"neighborhoods": "array of neighborhood objects with pricing, listing counts, and location data"
},
"sample": {
"data": {
"city": "Montréal",
"page": 1,
"listings": [
{
"lat": 45.5102,
"lng": -73.5602,
"city": "Montréal",
"pb_id": 891463,
"address": "170 Boul René-Lévesque E",
"max_price": 2729,
"min_price": 1440,
"listing_id": 64168221,
"building_id": 1789946,
"amenity_tags": [
"Electric",
"Dishwasher",
"Heat"
],
"is_spotlight": true,
"max_bedrooms": 2,
"min_bedrooms": 0,
"building_name": "170 René-Lévesque",
"padmapper_url": "/buildings/p891463/apartments-at-170-boul-rene-levesque-e-montreal-qc-h2x-0g1",
"neighborhood_id": 44342,
"neighborhood_name": "Quartier Ville-Marie"
}
],
"total_count": null,
"neighborhoods": [
{
"lat": 45.502405,
"lng": -73.554693,
"name": "Vieux-Montréal",
"listing_count": 996,
"neighborhood_id": 43721
}
]
},
"status": "success"
}
}About the PadMapper API
Searching and Browsing Listings
The search_listings endpoint accepts a required city_slug parameter formatted as city-state (e.g. new-york-ny, toronto-on) and returns paginated listing summaries. Each listing object includes address, price range, bedroom count, amenities, coordinates, and building info. The response also includes a neighborhoods array with per-neighborhood pricing stats and listing counts, and a total_count for the full result set. Optional filters include min_price, max_price, and a comma-separated bedrooms string where 0 represents studios.
Listing Details and Contact Info
get_listing_detail returns the full profile for a single building, identified by either a listing_id (prefixed with p, e.g. p123456) or a slug URL path. The response includes a description, amenity_tags array, media array with photos and virtual tours, and an agents array with email, phone, and company fields. get_listing_contact targets the same identification inputs but returns a narrower payload focused on contact data: phone, agent_name, brokerage_name, and the full agents array.
Map-Based Discovery and Market Overviews
get_map_listings accepts a geographic bounding box via north, south, east, and west parameters and returns building pin objects with listing_id, address, lat/lng, price range, and available bedroom counts — useful for rendering map UIs or querying rentals within a drawn area. get_city_overview delivers market-level data for a given city_slug: listing_count, a price_trends object keyed by bedroom count (0–4) containing historical median price arrays, and a neighborhoods array with bedroom-level pricing breakdowns.
The PadMapper API is a managed, monitored endpoint for padmapper.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when padmapper.com changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official padmapper.com API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Build a rental search app filtered by city, price range, and bedroom count using
search_listings - Aggregate agent contact info and brokerage names across listings for lead generation pipelines
- Render an interactive apartment map by querying
get_map_listingswith a dynamic bounding box - Track historical median rent trends by bedroom count per city using
get_city_overviewprice_trends data - Compare neighborhood-level pricing and listing counts within a city for market analysis dashboards
- Compile full building profiles including amenities, photos, and unit floorplans via
get_listing_detail - Monitor active listing counts and median prices across multiple city slugs for rental market reporting
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does PadMapper have an official developer API?+
How does city targeting work in `search_listings` and `get_city_overview`?+
city_slug parameter formatted as city-state, for example chicago-il, toronto-on, or new-york-ny. The slug determines the market returned. search_listings also accepts page, min_price, max_price, and bedrooms filters on top of the city context.What does the `price_trends` field in `get_city_overview` contain?+
Does the API return individual unit-level availability or lease dates?+
get_listing_detail. Granular unit availability calendars and lease start dates are not part of the current response schema. You can fork this API on Parse and revise it to add an endpoint targeting that data if it becomes accessible.Are listings outside the US and Canada covered?+
san-francisco-ca, vancouver-bc). Listings outside North America are not part of the current API's scope. You can fork the API on Parse and revise it to point at additional markets if PadMapper expands coverage in a region you need.