AppFolio Rental Listings Scraper: Rent, Beds, Map & Apply Link avatar

AppFolio Rental Listings Scraper: Rent, Beds, Map & Apply Link

Pricing

from $1.00 / 1,000 vacancies

Go to Apify Store
AppFolio Rental Listings Scraper: Rent, Beds, Map & Apply Link

AppFolio Rental Listings Scraper: Rent, Beds, Map & Apply Link

Scrape current rental vacancies from any AppFolio property manager portal: rent, beds, baths, square feet, address with map coordinates, availability, pet policy, photo and apply link. Add the manager's website to get their office phone. Filters included. No login. Pay per vacancy.

Pricing

from $1.00 / 1,000 vacancies

Rating

0.0

(0)

Developer

The Mine Works

The Mine Works

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

5 hours ago

Last modified

Share

140 AppFolio vacancies in 4 seconds

From The Mine Works, makers of Threads Scraper and B2B Leads Finder, with over 140,000 runs across 170+ public actors. This actor ranks #1 for "appfolio listings" in Apify Store search.

Why choose this actor?

  • Every current vacancy of a property manager, in one request. Give an AppFolio portal (just the subdomain works) and get one row per vacancy with rent, bedrooms, bathrooms, square feet, the address split into parts, map coordinates, availability, pet policy and the rental application link. Our proof run read 140 vacancies from 3 portals in 4 seconds. No AppFolio login, no cookies.
  • The manager's name, phone and email when you start from their website. AppFolio's listings page names no manager. Paste the manager's own rentals page instead, and the actor finds the AppFolio portal on it and adds the office contact the manager publishes there.
  • Pay only for vacancies you keep. Bedroom, bathroom, rent and city filters are applied before delivery, and vacancies they leave out are never charged. Neither are empty portals, links that are not portals, refused portals or duplicates.

Run it on Apify

Part of The Mine Works Leads and business directories family: B2B Leads Finder, Skip Trace Lookup, Google Maps Email Scraper, JustDial Scraper, 2GIS Places Scraper, IndiaMART Scraper.

Try it in one minute

Paste this input and press Start. It returns about 10 vacancies from two managers:

{
"startUrls": ["rivertonrentals", "https://apg.appfolio.com/listings"],
"maxListings": 5
}

You can point it at a property manager in these ways, and mix them in one run:

  • A subdomain: rivertonrentals (for rivertonrentals.appfolio.com).
  • A host or any link on the portal: apg.appfolio.com, the listings page https://apg.appfolio.com/listings, or the tenant login page. A link to one listing (/listings/detail/<id>) returns only that listing.
  • The manager's own website page that shows their AppFolio listings, for example https://www.sdppm.com/available.html. The actor finds the portal on the page (or on up to two rentals pages linked from it) and adds the office name, phone and email published there.

A Buildium link (managebuilding.com) is reported with a pointer to our Buildium actor instead.

Apify's free plan includes $5 of credit every month, which covers about 2,400 vacancies at this actor's Free plan price.

Copy to your AI assistant

themineworks/appfolio-rental-listings-scraper on Apify. Returns every current rental vacancy from AppFolio property manager portals (<name>.appfolio.com): rent, bedrooms, bathrooms, square feet, address, coordinates, availability, pets, amenities, photo and rental application link, plus the manager's name, phone and email when started from the manager's website. Call ApifyClient("TOKEN").actor("themineworks/appfolio-rental-listings-scraper").call(run_input={"startUrls": ["rivertonrentals", "https://apg.appfolio.com/listings"], "maxListings": 100}), then client.dataset(run["defaultDatasetId"]).list_items().items. Required: startUrls (AppFolio subdomains, portal links, or the manager's website page). Optional: maxListings (per portal, default 100, up to 5,000), minBedrooms, minBathrooms, minRent, maxRent (USD), cities (for example "Oakland, CA"), allowUnblockerFallback (default true). It does not search all of AppFolio; you supply the portals. Skip rows that have "_type": "info". Full spec: GET https://api.apify.com/v2/acts/themineworks~appfolio-rental-listings-scraper/builds/default (Bearer TOKEN), which returns inputSchema and readme. Token: https://console.apify.com/account/integrations

Key features

  • Up to 40 fields per vacancy: listing and portal links, manager contact (website start), title, full address and its parts, coordinates, rent, rent range, rent per square foot (commercial), bedrooms, bathrooms, square feet, availability, pet policy, amenities, appliances, utilities, property and lease type (commercial), description, photo and apply link.
  • One request per portal, no paging. An AppFolio portal lists every current vacancy on one page; the largest portal in our 1 Oct runs (82 vacancies) was one request.
  • Up to 1,000 start URLs per run and 5,000 vacancies per portal. A portal reached through two start URLs is read once, and a vacancy is delivered and charged once.
  • 5 filters (minimum bedrooms, minimum bathrooms, rent range, cities), the same ones the portal page offers, applied before delivery.
  • Manager contact from the manager's website: office name, phone and email, on every row from that portal.
  • Reads robots.txt first on every host and keeps AppFolio's 10 second crawl delay. Plain HTTP, no browser. A run summary (status per start URL, vacancies found and delivered, attempts, the robots.txt rule behind each request) is saved as the OUTPUT record.

How to use it

Basic: one manager

{
"startUrls": ["smartland"],
"maxListings": 500
}

Every vacancy Smartland lists on smartland.appfolio.com; 82 on 1 Oct 2026.

Several managers at once

{
"startUrls": [
"rivertonrentals",
"mhtpropertymanagement.appfolio.com",
"https://apg.appfolio.com/listings",
"https://www.sdppm.com/available.html"
],
"maxListings": 100
}

This was our second proof run: 26 vacancies from 4 portals in 7 seconds, the last one found through the manager's website with its office name, phone and email.

Weekly rent tracking in your market

Rental analysts and investors compare asking rents of the managers they follow. Filter to the units you track and schedule the run weekly (Apify Console, Schedules, Add schedule):

{
"startUrls": ["pointmanagementllc", "smartland", "aaaprop"],
"minBedrooms": 2,
"maxRent": 2000,
"maxListings": 500
}

Group by postal_code and bedrooms and compare rent from week to week. listing_id stays the same while a vacancy is listed, so you can also see how long each unit stays open.

Leads for property services

Vendors who sell to property managers (cleaning, turnover, maintenance, photography) want offices with open units right now. Start from the managers' websites to get each office's name and phone next to its vacancies:

{
"startUrls": [
"https://www.sdppm.com/available.html"
],
"maxListings": 1
}

With maxListings at 1 you pay for one vacancy per manager, and the OUTPUT record still shows how many vacancies each portal lists (vacancies_on_portal).

Vacancies in one city across many managers

Aggregators and relocation services pull one city from a list of portals:

{
"startUrls": ["pointmanagementllc", "smartland"],
"cities": ["Roanoke, VA", "Canton"],
"maxListings": 500
}

Roanoke, VA pins the state; Canton matches any state. Vacancies in other cities are left out and not charged.

Input parameters

ParameterTypeDefaultWhat it does
startUrlsarray of stringsrequired (Console prefill: apg.appfolio.com/listings and www.sdppm.com/available.html)One per line: an AppFolio subdomain (acme), its host (acme.appfolio.com), any link on it, or the manager's own website page. Up to 1,000 per run. startUrl, urls and portals are accepted too.
maxListingsinteger100 (Console prefill 20)Most vacancies to return from each portal, 1 to 5,000. A portal lists everything on one page, so this trims the result; it does not make the run faster.
minBedroomsintegernoneOnly vacancies with at least this many bedrooms (0 to 10). A studio counts as 0. Vacancies that do not state bedrooms are left out when this is set.
minBathroomsintegernoneOnly vacancies with at least this many bathrooms (0 to 10). Half baths count, so 1.5 passes a minimum of 1.
minRentintegernoneOnly vacancies asking at least this much a month, in US dollars. Vacancies with no rent shown are left out when a rent filter is set.
maxRentintegernoneOnly vacancies asking at most this much a month.
citiesarray of stringsnoneOnly vacancies in these cities. Oakland, CA pins the state, Oakland matches any state.
allowUnblockerFallbackbooleantrueIf a portal refuses the datacenter connection three times, try once more through Apify's unblocking proxy (included in the price). Off: such portals are reported as blocked.

Filters are applied by the actor to each portal's full list after reading it. They save you money (filtered vacancies are not charged), not time.

What data do you get?

One row per vacancy. Fields with no value are left out of the row instead of being sent as null.

The vacancy

  • listing_id, listing_url (the public listing link), portal (always appfolio), portal_url, title

Address and map

  • address, street, city, state, postal_code, country, latitude, longitude (from the portal's map)

Rent

  • rent (a number; the low end of a range), rent_max (the high end), rent_text (as shown), currency (USD; CAD for a Canadian address), rent_per_sqft (commercial listings)

The unit

  • bedrooms (a studio is 0), bathrooms (half baths count: 1.5), square_feet
  • available_date, or available_now: true when the portal says NOW
  • pets_policy (the text) and pets_allowed (true or false when the text is clear)
  • amenities, appliances, utilities_included
  • property_type and lease_type (commercial listings such as offices and retail)

Description, photo and application

  • description (as the listings page shows it, usually the first few hundred characters) and description_truncated
  • photo_urls (the main photo), apply_url (the rental application for this vacancy)

Manager contact (only when you started from the manager's website)

  • manager_name, manager_phone, manager_email, manager_website

Run context

  • source_input (the start URL the row came from), scraped_at

Each run also ends with one row that has "_type": "info" and a short message. It is never billed; filter it out by _type.

Stable fields for automations

These fields were present in every one of the 166 vacancies of our proof runs on 1 Oct 2026 (7 portals), and their names will not change:

FieldWhat it holds
listing_idAppFolio's listing id, the same while the vacancy is listed
listing_urlPublic link to the listing
portalAlways appfolio
portal_urlThe manager's AppFolio listings page
addressFull address as the portal shows it
streetStreet line, with the unit
cityCity
stateTwo letter state code
postal_codeZIP code
countryUS (or CA)
latitudeLatitude from the portal map
longitudeLongitude from the portal map
apply_urlLink to the rental application
source_inputThe start URL that produced the row
scraped_atWhen the row was read (ISO 8601)

Fill rates for the rest on the same 166 vacancies: title and description 166, bathrooms 165, rent and bedrooms 164 (two Roanoke listings showed no rent), photo_urls 161, available_now 161 (a date in 51), square_feet 158, pets_policy 155, appliances 82, amenities 71, utilities_included 66.

Output examples

Real rows from our proof runs on 1 Oct 2026. The first is complete except for a masked email and its title, left out here; the others are trimmed.

Started from the manager's website (https://www.sdppm.com/available.html), so the row carries the office contact published there:

{
"listing_id": "eb4d8bd1-2cd7-4134-b55e-dd18ba8d7730",
"listing_url": "https://sdppm.appfolio.com/listings/detail/eb4d8bd1-2cd7-4134-b55e-dd18ba8d7730",
"portal": "appfolio",
"portal_url": "https://sdppm.appfolio.com/listings",
"manager_name": "San Diego Professional Property Managers",
"manager_phone": "(858) 627-9320",
"manager_email": "h*****@sdppm.com",
"manager_website": "https://www.sdppm.com/available.html",
"address": "13336 Caminito Ciera #34 , San Diego, CA 92129",
"street": "13336 Caminito Ciera #34",
"city": "San Diego",
"state": "CA",
"postal_code": "92129",
"country": "US",
"latitude": 32.9605609,
"longitude": -117.1040431,
"rent": 2700,
"rent_text": "$2,700",
"currency": "USD",
"bedrooms": 2,
"bathrooms": 2,
"square_feet": 889,
"available_date": "2026-11-09",
"available_now": false,
"pets_policy": "Cats not allowed, Dogs not allowed",
"pets_allowed": false,
"amenities": ["Laundry Facilities", "Community Pool"],
"appliances": ["Stove Oven Dishwasher Refrigerator", "Microwave"],
"utilities_included": "Trash",
"description": "FEATURES: 13336 Caminito Ciera #34, San Diego, CA 92129. Rental amount is $2,700/ month. This property is available 11/09/2026. Nice 2 bedroom and 2 bath condo with 899 square feet. Upper-level corner unit with mountain views in the highly sought after Sun Ridge Vista community. Balcony with views and extra storage. Enjoy the privacy of it's location and it's bright cheerful ambiance. Newer wo...",
"description_truncated": true,
"photo_urls": ["https://images.cdn.appfolio.com/sdppm/images/c1703a29-090f-4e50-9a4a-29b9915fd809/large.jpg"],
"apply_url": "https://sdppm.appfolio.com/listings/rental_applications/new?listable_uid=eb4d8bd1-2cd7-4134-b55e-dd18ba8d7730&source=Website",
"source_input": "https://www.sdppm.com/available.html",
"scraped_at": "2026-10-01T13:45:33.324Z"
}

A vacancy available now, from a portal given by its subdomain (no manager contact, because the listings page has none):

{
"listing_id": "e317309f-954f-423e-b945-087483f45e24",
"listing_url": "https://pointmanagementllc.appfolio.com/listings/detail/e317309f-954f-423e-b945-087483f45e24",
"portal": "appfolio",
"title": "3 Bedroom 1 Bath Located in Salem VA!",
"address": "105 S Bruffey St, Salem, VA 24152",
"city": "Salem",
"state": "VA",
"postal_code": "24152",
"latitude": 37.2889701,
"longitude": -80.075531,
"rent": 1495,
"rent_text": "$1,495",
"bedrooms": 3,
"bathrooms": 1,
"square_feet": 1190,
"available_now": true,
"pets_policy": "Cats allowed, Small dogs allowed",
"pets_allowed": true,
"amenities": ["24 Hour Emergency Maintenance", "Online Portal", "Resident Benefit Package"],
"appliances": ["Stove", "Fridge"],
"utilities_included": "None",
"photo_urls": ["https://images.cdn.appfolio.com/pointmanagementllc/images/c1743d4d-fdb9-4114-bf38-07b15ee36121/large.jpeg"],
"source_input": "pointmanagementllc"
}

A vacancy whose portal card shows no rent, so rent, rent_text and currency are left out (it would also be left out by any rent filter):

{
"listing_id": "200aea12-301a-4c7c-a60d-5d9ce75b433c",
"title": "Spacious 3-Bedroom Home with Great Kitchen & Backyard",
"address": "611 Morrill Ave SE, Roanoke, VA 24013",
"postal_code": "24013",
"latitude": 37.2593774,
"longitude": -79.9307169,
"bedrooms": 3,
"bathrooms": 1,
"square_feet": 1050,
"available_now": true,
"pets_policy": "Cats allowed, Small dogs allowed",
"pets_allowed": true,
"description": "APPLY TODAY & SCHEDULE YOUR SELF-GUIDED SHOWING!\nApartments are leasing quickly-submit your application today to get pre-approved and secure your next home faster! ...",
"description_truncated": true,
"apply_url": "https://pointmanagementllc.appfolio.com/listings/rental_applications/new?listable_uid=200aea12-301a-4c7c-a60d-5d9ce75b433c&source=Website",
"source_input": "pointmanagementllc"
}

The info row that ends every run (never billed):

{
"_type": "info",
"delivered": 140,
"message": "140 vacancies delivered. This row is informational: it is never billed.",
"scraped_at": "2026-10-01T13:45:46.125Z"
}

The OUTPUT record gives every start URL a status: ok, no_vacancies (a live portal with nothing listed), no_matches (nothing passed your filters), listing_not_found, not_a_portal, blocked, robots_disallowed, duplicate, parse_error, push_failed or stopped, with a message, the vacancies on the portal, how many matched and were delivered, the attempts, and the robots.txt rule that allowed each request. A website start also lists the portals found and the contact read from the site.

Pricing

You pay per vacancy delivered to your dataset, plus a flat $0.005 per run whatever memory you choose. Filters, the manager website lookup, the map coordinates and the proxies are included.

EventFree planStarter (Bronze)Scale (Silver)Business (Gold) and above
Vacancy (listing-scraped), per vacancy$0.002$0.0017$0.0014$0.001
Same, per 1,000 vacancies$2.00$1.70$1.40$1.00
Run start (run-start), once per run$0.005$0.005$0.005$0.005

The run start is our own flat event, charged once when the run starts. It is not Apify's per GB start fee, so it stays $0.005 at any memory size. No other pricing change is scheduled.

Never charged:

  • portals that refused the connection, and portals with no vacancies;
  • start URLs that are not a live AppFolio portal, or that robots.txt disallows;
  • vacancies your filters left out, and vacancies above your maxListings per portal;
  • the same vacancy found twice in one run;
  • the info row at the end of the dataset, and the OUTPUT run summary.

To cap what a run can cost, set a maximum total charge in the run options. The Pricing tab always shows the rate for your own plan; if this table and the Pricing tab ever disagree, the Pricing tab is right.

FAQ

What is AppFolio, and does this search all AppFolio listings?

AppFolio is property management software. Each property manager who uses it gets a portal at <name>.appfolio.com with a public listings page of its current vacancies. This actor reads those pages. It does not search all AppFolio listings in a city, because AppFolio publishes no directory of its portals: it is useful when you know which managers you care about.

How do I find AppFolio portals?

AppFolio does not publish a list, and the actor does not discover portals on its own. What works:

  • The manager's website. Most managers on AppFolio show their vacancies from their own site. The "Available rentals", "Apply" or "Pay rent" links point to something.appfolio.com. You can paste the website page itself and the actor finds the portal.
  • Web search. Searching for appfolio.com/listings together with a city or state name returns portals that search engines have indexed. It is partial, but free and quick.
  • Rental ads. Ads on the big rental sites often link to the manager's AppFolio application page; the subdomain in that link is the portal.
  • Your own lists. If you already have a list of property managers, their websites are the fastest route.

A subdomain that is not a live portal is reported as not_a_portal and costs nothing.

How much does it cost to scrape 1,000 AppFolio vacancies?

1,000 times your plan's price per vacancy, plus $0.005 for the run: $2.00 on the Free plan, down to $1.00 on Business. Portals with no vacancies and vacancies your filters leave out are not charged.

How fresh is the data?

Every run reads the portals live; nothing comes from a cache. A portal shows what the manager advertises at that moment, and scraped_at records when the row was read. For a history, save your input as a task and add a schedule in Apify Console (for example every Monday); each scheduled run is billed like a manual one.

Do I need an AppFolio account, cookies or a proxy?

No. The listings pages are public. The actor reads them without signing in, through Apify's datacenter proxies, which are included in the price.

Why is there no phone number or manager name on most rows?

AppFolio's public listings page does not show them, and the detail pages that do are closed to crawlers by AppFolio's robots.txt. Start from the manager's own website page and the actor adds the office name, phone and email the manager publishes there.

Why is the description cut off, and why one photo?

The actor reads only the listings page, because AppFolio's robots.txt allows crawlers there and asks them to stay out of everything else, including the listing detail pages. The listings page shows the first few hundred characters of each description (description_truncated tells you when it was cut), one photo per vacancy, and no deposit. Everything else on the listings page is returned.

Does it respect robots.txt?

Yes. It reads robots.txt on every host before requesting anything from it, applies it the way Google does (wildcards, end anchors, the most specific rule wins), and never requests a page it disallows, including after a redirect. It also keeps AppFolio's 10 second crawl delay between requests to the same portal. On 1 Oct 2026 AppFolio's robots.txt still read Allow: /listings$ and Disallow: / for all crawlers, and the run summary records the rule that allowed each request.

What happens when a portal refuses the connection?

Portals are read over Apify's datacenter proxy first. In our two proof runs on 1 Oct 2026, all 18 requests (robots.txt and portal pages, 8 portals plus one website) were answered on the first try. If a portal refuses three times, the actor tries once through Apify's unblocking proxy, unless you turned allowUnblockerFallback off. A portal refused every time is listed as blocked in the run summary and never charged.

What about Buildium portals?

Buildium is different software. Use Buildium Rental Listings Scraper for managebuilding.com links; this actor tells you when a link belongs there.

Which formats can I export?

JSON, CSV, Excel, XML, HTML table and RSS from the dataset page in Apify Console, or through the Apify API.

Can I use it from Claude, ChatGPT or another AI agent?

  • Connector URL: https://mcp.apify.com/?tools=themineworks/appfolio-rental-listings-scraper.
  • Claude: Settings > Connectors > Add custom connector, paste the URL, sign in with Apify.
  • ChatGPT: developer mode, add an MCP connector with the URL, sign in with Apify.
  • Cursor or VS Code: add it as an HTTP MCP server with that URL.
  • Claude Code: claude mcp add -t http appfolio-rental-listings-scraper "https://mcp.apify.com/?tools=themineworks/appfolio-rental-listings-scraper".

The actor collects only public rental advertisements, which describe properties, not people. It never signs in, reads no tenant or applicant data, and follows each site's robots.txt. The manager contact it adds is the business contact the manager publishes on its own website. You are responsible for how you use the data, including the sites' terms and data protection laws such as GDPR and CCPA. This actor is an independent tool and is not affiliated with AppFolio, Inc.; AppFolio is a trademark of AppFolio, Inc.

Integrations

  • Google Sheets: send each run's vacancies to a sheet with Apify's Google Sheets integration.
  • Make, Zapier and n8n: start runs and receive the rows in your workflows.
  • Webhooks: get a call when a run finishes, for example to post new vacancies to Slack.
  • API: start runs and read datasets from any language with the Apify API or the Python and JavaScript clients.
  • MCP clients: Claude, ChatGPT and other agents through Apify's MCP server.

More from The Mine Works

Leads and business directories

Social media and video

Marketing, SEO and reviews

LinkedIn

Real estate

Science, health and government data

Jobs and hiring

E-commerce and marketplaces

Company and business data

Food and local services

Developer and AI tools

More tools

Support

Found a problem or need a field? Open an issue on the actor's Issues tab and we will answer there. For a new source or a custom build, email dmineworks@gmail.com.

AppFolio Rental Listings Scraper turns a list of property manager portals into one row per current vacancy, with rent, rooms, address, map position and apply link, and the office contact when you start from the manager's website.