Padmapper Scraper - Apartment Rentals & Rent Data avatar

Padmapper Scraper - Apartment Rentals & Rent Data

Pricing

from $1.80 / 1,000 listing records

Go to Apify Store
Padmapper Scraper - Apartment Rentals & Rent Data

Padmapper Scraper - Apartment Rentals & Rent Data

Scrape Padmapper apartment rentals across US/CA cities: rent, beds, baths, sqft, location, photos, source-site links, availability. Monitoring (NEW, UPDATED, REAPPEARED, EXPIRED), incremental runs, resume, MCP export.

Pricing

from $1.80 / 1,000 listing records

Rating

0.0

(0)

Developer

Abot API

Abot API

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

1

Monthly active users

4 days ago

Last modified

Categories

Share

Padmapper Scraper: Apartment Rentals, Rent & Availability Data

Padmapper Scraper turns PadMapper (padmapper.com), the US and Canadian rental aggregator, into a clean apartment-listing feed. Search one or more cities with rent, bedroom, bathroom and pet filters, or paste listing and building links for a direct read. Every record carries rent, beds, baths, square feet, address with coordinates, neighborhood, photos, source-site link and the full upstream object. It also monitors listing changes across runs (NEW, UPDATED, UNCHANGED, REAPPEARED, EXPIRED), resumes an interrupted pull, and pipes results into your apps through MCP connectors.

Why This Scraper?

  • Real inventory data: rent range, beds, baths, square feet, address with coordinates, neighborhood, photos and the source-site link in one record.
  • City search with the filters that matter: rent range, bedroom counts, minimum bathrooms, cats and dogs allowed.
  • Listing and building links: paste a listing link, a building link or a bare listing id for a direct read; a building link returns that building's listings (one page, up to 50).
  • Availability monitoring: scheduled runs classify every listing as NEW, UPDATED, UNCHANGED, REAPPEARED or EXPIRED, with per-campaign state you can name or share.
  • Resume long pulls: paste a previous run or dataset id and continue without paying twice for what was already collected.
  • MCP connector export: send results to Notion and other connectors without changing the dataset.
  • Structured failures: a blocked or broken run fails loudly with a clear message instead of returning an empty dataset.

Use Cases

  • Rent trend and market research: track rent ranges, price changes and new listings across neighborhoods and cities over time.
  • Apartment hunters and relocation services: pull filtered listings (price, bedrooms, pets) for a target city into your own site or alert tool.
  • PropTech and rental aggregators: build a secondary rental feed spanning many source sites without visiting each one.
  • Investors and property managers: monitor competing listings' pricing and availability in a submarket.
  • Lead generation for movers and brokers: watch specific buildings or listings for status changes (NEW, price change, EXPIRED).

Data You Get

Sample shape: values are illustrative placeholders, not from a live record.

FieldExample
kind"listing"
recordId / listingId"23456789"
urlPadMapper link to the listing
title"Sunny 1BR near the park"
description"Light-filled one bedroom near the park..."
currency"USD" (also "CAD" for Canadian listings)
rentMin / rentMax1800 / 2100
previousRent1950
bedrooms / bedroomsMax1 / 2
bathrooms / bathroomsMax1 / 2
squareFeetMin / squareFeetMax600 / 750
dateAvailable"2026-11-01"
address / city / state / zipcode"123 Example Street" / "Springfield" / "IL" / "62704"
neighborhood"Downtown"
latitude / longitude39.799 / -89.644
propertyType"apartment" (also condo, house, room, other)
sourceFeed / providerUrl"example_feed_cities" / the source-site link, when the feed publishes one
phone"(555) 0102"
petAmenities["Cats OK", "Dogs OK"]
imageUrl / imageUrlslisting photo URL(s)
listedOn"2026-08-25T11:00:02+00:00"
changeType / changedFields"NEW" / list of changed field names (incremental mode)
firstSeenAt / lastSeenAttracking timestamps (incremental mode)

Every record also carries the full upstream object (raw), so no upstream field is ever dropped.

How to Use

  1. Pick a mode: search (one or more cities, with filters) or url (paste listing or building links).
  2. In search mode, add cities and any filters (rent range, bedrooms, bathrooms, pets).
  3. Set Max items to control run size and cost, then click Start.
  4. Download the dataset as JSON, CSV or Excel, or read it through the API.

Search one city with rent and bedroom filters:

{
"mode": "search",
"locations": ["Austin, TX"],
"minPrice": 1500,
"maxPrice": 2500,
"bedrooms": ["1", "2"],
"maxItems": 50
}

Search several cities, pet-friendly only:

{
"mode": "search",
"locations": ["Austin, TX", "Toronto, Ontario"],
"catsOk": true,
"dogsOk": true,
"maxItems": 100
}

Read specific listings by id or link:

{
"mode": "url",
"listingInputs": [
"87654321",
"https://www.padmapper.com/rentals/23456789p/example-1-bedroom-chicago-il-60601"
]
}

Read a building's listings (one page, up to 50):

{
"mode": "url",
"listingInputs": ["https://www.padmapper.com/buildings/9000001/example-apartments-chicago-il-60601"]
}

Run it from your code

Python:

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("abotapi/padmapper-rental-listings-scraper").call(
run_input={"mode": "search", "locations": ["Austin, TX"], "maxItems": 50})
for listing in client.dataset(run["defaultDatasetId"]).iterate_items():
print(listing["title"], listing["rentMin"], listing["city"])

JavaScript:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('abotapi/padmapper-rental-listings-scraper').call({
mode: 'search', locations: ['Austin, TX'], maxItems: 50,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();

Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the Integrations tab.

How Max items shapes a search run

Filters apply to search mode only; URL mode reads the listings or buildings you name directly. Search mode pages 50 listings at a time per city and stops on that city's last page or its share of Max items, whichever comes first; with several cities, each gets an equal share of the budget. A capped city therefore does not necessarily walk to the true end of that city's inventory before stopping. Each share is rounded down (Max items 5 across 2 cities gives each city 2), and in incremental mode only returned rows use up a share; suppressed UNCHANGED listings do not.

In URL mode a building link reads one page (up to 50 listings), and Max items is checked before each entry, so a building link that follows other entries can push the total slightly past Max items.

Known limitation: a run is flagged as "capped" only when the total across all cities reaches Max items. A city that stopped because its own share ran out is not flagged, so when the total ends below Max items (another city had fewer listings, or the share was rounded down), the run still counts as a complete scan. With Emit expired records on a multi-city, capped search, a still-live listing that was simply never re-checked in a cut-short city can then be marked EXPIRED. Workaround: when relying on EXPIRED with several cities, set Max items to 0 (or high enough that no city fills its share), or run one city per campaign. A single-city search is not affected.

Resume and recurring updates

  • Resume (resumeFromRunId) continues one interrupted run: paste its run or dataset id and the actor skips everything already collected there, so you don't pay twice.
  • Incremental mode (incrementalMode) is for scheduled runs over the same scope. Each record is classified NEW, UPDATED (with changedFields), UNCHANGED (suppressed and not billed unless emitUnchanged is on), REAPPEARED or EXPIRED (only after a run that scanned the whole scope, and only with emitExpired). stateKey names or shares the stored state. With incremental mode off, output is exactly as before.

Known limitation: emitExpired rows are not subject to Max items. Once a run qualifies to detect EXPIRED listings (a complete, non-resumed, non-capped scan), every tracked listing that disappeared since the last scan is pushed, however many that is; the cap only limits the live NEW/UPDATED/REAPPEARED side of the same run. On a monitoring campaign with a large tracked baseline, a run that finds most of that baseline gone can push far more rows, and cost, than Max items suggests. Budget for this when a campaign has run for a while, or keep emitExpired off unless you want the full expired batch every time it fires.

Send results into your apps (MCP connectors)

Optionally pipe the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. This is an extra delivery step after the scrape: the Apify dataset is never changed.

What gets written to the connector: a condensed, human-readable summary of each record, not the full JSON. Each item becomes one entry with a title and its key fields flattened to plain text. The complete record always stays in the Apify dataset.

  1. Authorize a connector once under Apify → Settings → Integrations (Notion, Linear, Airtable, or Apify).
  2. Select it in the mcpConnectors input field. (If the picker is empty, you haven't authorized a connector yet.)
  3. For Notion, also set notionParentPageUrl to the page where items should be created.

The connection is mediated by Apify's MCP proxy, so this actor never sees your third-party credentials. Leave the field empty to skip.

Input Parameters

ParameterTypeDefaultDescription
modestringsearchsearch (city search) or url (listing or building links).
locationsarray["Austin, TX"]Cities to search, one entry per city ('City, ST' or a full city name). Search mode only.
minPriceinteger(none)Search mode: minimum monthly rent.
maxPriceinteger(none)Search mode: maximum monthly rent.
bedroomsarray(none)Search mode: bedroom counts to keep, as strings ("0" = studio). Empty keeps all bedroom counts.
bathroomsinteger(none)Search mode: minimum bathrooms.
catsOkboolean(none)Search mode: keep only listings that allow cats.
dogsOkboolean(none)Search mode: keep only listings that allow dogs.
listingInputsarray["58574913"]URL mode: listing links, building links, or bare numeric listing ids.
urlsarray(none)Alias for listingInputs, accepted under the name other Apify actors use for URL mode.
maxItemsinteger20Stop after this many records (0 = no limit; the run then stops when listings run out). Split equally across cities; EXPIRED rows are not counted.
currencyHintstring(none)USD or CAD. Currently accepted but not applied: the currency field is always derived from each listing's ZIP or postal code (numeric ZIP is USD, Canadian postal code is CAD).
resumeFromRunIdstring(none)Paste a previous run id or dataset id to continue a large pull without returning items already collected there.
incrementalModebooleanfalseTurn on for daily or recurring monitoring, returning NEW, UPDATED and REAPPEARED listings on later runs.
stateKeystring(none)Name this monitoring campaign, or deliberately share state across differently configured runs (incremental mode).
emitUnchangedbooleanfalseAlso return (and bill) listings that have not changed since the last run, marked UNCHANGED.
emitExpiredbooleanfalseAlso return (and bill) listings that were present before but are no longer found, marked EXPIRED, only after a complete scan.
mcpConnectorsarray(none)Optional: send a summary of each record to apps you authorized under Integrations.
notionParentPageUrlstring(none)Notion connector only: page under which item pages are created.
maxNotifyListingsinteger50Cap on items written to each connector per run. Does not affect the dataset.
proxyConfigurationobjectResidential proxyApify Proxy settings; the source requires the residential proxy pool.

Output Example

Sample shape: values are illustrative placeholders, not from a live record.

{
"kind": "listing",
"recordId": "23456789",
"listingId": "23456789",
"url": "https://www.padmapper.com/rentals/23456789p/example-1-bedroom-chicago-il-60601",
"title": "Sunny 1BR near the park",
"description": "Light-filled one bedroom near the park, steps from transit.",
"currency": "USD",
"rentMin": 1800,
"rentMax": 2100,
"previousRent": 1950,
"bedrooms": 1,
"bedroomsMax": 1,
"bathrooms": 1,
"bathroomsMax": 1,
"squareFeetMin": 650,
"squareFeetMax": 650,
"dateAvailable": "2026-11-01",
"address": "123 Example Street",
"city": "Chicago",
"state": "IL",
"zipcode": "60601",
"citySlug": "chicago-il",
"neighborhood": "Downtown",
"latitude": 41.885,
"longitude": -87.622,
"propertyType": "apartment",
"listingType": 1,
"leaseType": 1,
"sourceFeed": "example_feed_cities",
"providerUrl": "https://www.example-rentals.com/listings/23456789",
"phone": "(555) 0102",
"petCodes": [1, 2],
"petAmenities": ["Cats OK", "Dogs OK"],
"buildingAmenities": ["Elevator", "Onsite Laundry"],
"imageUrl": "https://img.example.com/23456789/1280x960",
"imageUrls": ["https://img.example.com/23456789/1280x960"],
"isFeatured": false,
"listedOn": "2026-08-25T11:00:02+00:00",
"createdAt": "2026-08-20T09:00:00+00:00",
"updatedAt": "2026-08-25T11:00:02+00:00",
"timezone": "America/Chicago",
"raw": { "full upstream listing object": true },
"changeType": "NEW",
"changedFields": [],
"firstSeenAt": "2026-01-01T00:00:00.000Z",
"lastSeenAt": "2026-01-01T00:00:00.000Z"
}

Plan Requirement

The source refuses non-residential connections on its inventory routes, so this actor runs on the residential proxy pool: use it on a plan that includes residential proxy. Exit rotation is automatic. PadMapper is a free rental site: the actor reads the same inventory the website reads, and automated reading may sit outside the source's terms of use, so keep volumes reasonable and respect the source's terms.

FAQ

How much does it cost?

You pay per record returned. The Pricing tab shows the current rates. Use Max items to cap the cost of a search run; note the separate limitation below for emitExpired.

This actor collects only publicly available rental listing data. You are responsible for how you use it: follow PadMapper's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution. Listing facts (rent, beds, baths, address) are generally not subject to copyright, but photos and provider descriptions may carry third-party rights.

Can I get only new or changed listings on a schedule?

Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Each run then returns only new, updated and reappeared records, and unchanged ones are not billed unless you turn on emitUnchanged.

Why did my run return fewer listings than I expected?

With several cities, Max items is split equally between them, and each city stops at its share or its last page, whichever comes first. Filters (rent range, bedrooms, bathrooms, pets) also narrow the result set. Raise Max items, or set it to 0, to collect more of a city's inventory.

Why did my run fail instead of returning an empty dataset?

If the site refuses every request, or a city's page comes back in a shape the actor cannot read, the run stops with a clear message so "no listings for this search" is never confused with "nothing could be read". Run it again in a few minutes. If only some cities or listings could be read, you still get what was found.

Does emitExpired respect Max items?

No. Max items caps the live NEW/UPDATED/REAPPEARED side of a run; once a run qualifies to detect EXPIRED listings, every tracked listing found gone is pushed regardless of Max items. See the known limitation under "Resume and recurring updates" above for the sizing implication.

Can EXPIRED ever be wrong on a multi-city run?

In a specific case, yes: with several cities and a Max items cap, a city that stops because its equal share ran out is not treated as capped. If the run's total still ends below Max items (another city had fewer listings, or the share was rounded down), the run counts as a complete scan even though that city was not fully re-checked, and a still-live listing there can be marked EXPIRED. Use Max items 0 or one city per campaign when you rely on EXPIRED. See the known limitation under "How Max items shapes a search run".

Can I use it with AI agents or MCP?

Yes. Call it from any Apify integration or MCP client, and use the mcpConnectors field to push results into Notion, Linear or Airtable.

🔗 More scrapers you might like

Pair this actor with these related scrapers from the same team:

🏠 Zumper Scraper
Scrape Zumper.com rental listings: apartments, houses, condos and rooms. Pulls 60+ fields...
🏠 Rent.com Scraper
Extract rental listings from rent.com. Get comprehensive data including monthly rent...
🏠 StreetEasy Scraper
Scrape StreetEasy sales, rentals and in-contract listings across NYC and Jersey City...
🏠 Realtor.com
From $0.9/1K. Extract property listings from realtor.com. Get comprehensive data...
🏠 Apartments.com Scraper
From $1.50/1K. Scrape Apartments.com rentals by city, ZIP, neighborhood, address or URL...
🏠 QuintoAndar Scraper
Scrape QuintoAndar property listings across Brazil with 80+ fields, including rent, sale...

👉 Browse all abotapi scrapers

💬 Support

  • 🐞 Found a bug or a missing field? Open a ticket on the Issues tab. We usually reply within hours.
  • 🛠️ Need another site, extra fields or a private build? Email contact@abotapi.com.
  • ⭐ Enjoying it? A quick review on the actor page helps other users find it.