ForSaleByOwner Listings Scraper - FSBO Homes by City
Pricing
from $7.50 / 1,000 forsalebyowner listings scraper - fsbo homes by cities
ForSaleByOwner Listings Scraper - FSBO Homes by City
Collect public FSBO listings from ForSaleByOwner.com. Get structured property, seller, media, and address data. Run with city/state slugs, featured cards, or sitemap mode without a login or API key. Pricing: $0.0075 per dataset item and $0.00005 per Actor Start event on Free.
Pricing
from $7.50 / 1,000 forsalebyowner listings scraper - fsbo homes by cities
Rating
0.0
(0)
Developer
Vitalii Bondarev
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Features
Share
ForSaleByOwner FSBO Listings Scraper
Scrape public FSBO listing data from ForSaleByOwner.com by city, state, featured cards, or sitemap, with no login or API key. On the Free plan, each dataset item costs $0.0075 and each Actor Start event costs $0.00005.
- Collect listing records with price, beds, baths, square footage, coordinates, seller name, photos, open houses, and home features
- Build lead lists of owners selling without an agent
- Track FSBO inventory and pricing by state or city
- Monitor a target market by rerunning a location search through Apify Schedules
- Extract featured cards or address-only sitemap records
What you get
The Actor reads the public listing feed used by the ForSaleByOwner.com search page, home-page featured cards, and public listings sitemap.
apiis the default mode and collects full listing records for a city or state slug such asmiami-florida,austin-texas, ortexas. State searches are paginated untilmaxResults.featuredcollects the home-page cards.sitemapcollects address-only records from the public listings sitemap.
| Field family | Fields | Type |
|---|---|---|
| Listing identity | id, url, title, listing_status | String; omitted when unavailable |
| Price and location | price, address, unit_number, city, state, postal_code, county, neighborhoods, longitude, latitude | price: integer; location text: string; neighborhoods: array of strings; coordinates: number; unavailable fields and empty arrays are omitted |
| Property details | property_type, bedrooms, bathrooms, living_area_sqft, lot_size, lot_size_unit, year_built | Text fields: string; bedrooms, living_area_sqft, year_built: integer; bathrooms, lot_size: number; unavailable fields are omitted |
| Description and dates | description, listing_date, activated_date, updated_date, is_new, is_new_construction, is_price_reduced | description: string; dates: ISO 8601 string; flags: boolean; unavailable fields are omitted |
| Seller and media | seller_name, seller_photo_url, brokerage_name, image_url, photo_count, photos | Text fields: string; photo_count: integer; photos: array of strings; unavailable fields and empty arrays are omitted |
| Open houses | open_houses | Array of objects with ISO 8601 start and end strings and string or null notes; omitted when empty |
| Home features | appliances, parking, floor_covering, heating, cooling, view_types | Array of strings; omitted when empty |
| Outdoor features | has_fenced_yard, has_patio, has_porch, has_deck, has_pool, has_fireplace | Boolean; omitted when unavailable |
| Buyer preferences | buyer_agent_preference, buyer_offer_types | buyer_agent_preference: string; buyer_offer_types: array of strings; unavailable fields and empty arrays are omitted |
| Run metadata | search_location, source, scraped_at | search_location and source: string; scraped_at: ISO 8601 string; omitted when unavailable |
| Featured-card fields | listing_label, badge, listed_by, image_url, seller_photo_url | String; omitted when unavailable |
| Sitemap fields | full_address, last_modified, state, postal_code, url, title | String; omitted when unavailable |
A field such as open_houses[].notes is null when the source does not provide the value. Top-level fields without a value and empty arrays are omitted. Sitemap mode does not provide the full property details available in API mode. The description field is free text and can contain owner contact details, as the description in a listing record can; review it before reuse.
Sample output
The following shortened sample keeps the core fields from one dataset record.
{"id": "6ab16341627b7de50b07e65a","url": "https://www.forsalebyowner.com/listing/13326-Southwest-9th-Terrace-Miami-FL-33184/6ab16341627b7de50b07e65a","title": "13326 Southwest 9th Terrace, Miami, FL 33184","listing_status": "Active","price": 725000,"address": "13326 Southwest 9th Terrace","city": "Miami","state": "FL","postal_code": "33184","bedrooms": 3,"bathrooms": 2,"living_area_sqft": 1844,"property_type": "House","seller_name": "Laura Zience","photo_count": 22}
Pricing
This Actor uses pay-per-event billing.
You pay only for the events listed below. This Actor does not use the Pay per event + usage option, so the platform usage of your runs (compute, proxy traffic and storage) is not billed to you separately.
| Event | Unit and condition | Free-plan price |
|---|---|---|
apify-actor-start | Once per GB of run memory per run, minimum one event | $0.00005 |
apify-default-dataset-item | One scraped result with all fields pushed to the dataset | $0.0075 |
| Results | Dataset-item charge (Free plan) |
|---|---|
| 1,000 | 1,000 x $0.0075 = $7.50 |
| 10,000 | 10,000 x $0.0075 = $75.00 |
The Actor Start event is charged once per run, not per result: a run at one GB of memory pays one $0.00005 event (Free plan) on top of the dataset items.
How to use
- Choose
api,featured, orsitemapinmode. - Enter a city-state or state slug in
searchSlugfor API mode, such asmiami-floridaortexas; separate slugs with commas. - Set
maxResultsand optionally provide two-letter US state codes instateFilter. - Leave
proxyConfigurationat its default (Apify Proxy,RESIDENTIALgroup). It is optional because the site works without a proxy. - Start the Actor in Apify Console and review the resulting dataset.
- Repeat the run through Apify Schedules.
Example input:
{"mode": "api","searchSlug": "miami-florida","stateFilter": ["FL"],"maxResults": 10}
Export the dataset as JSON or CSV, or read it through the Apify dataset API.
Input parameters
| Parameter | What it does | Default |
|---|---|---|
mode | Run mode: api, featured, or sitemap | api |
searchSlug | City-state or state slug for API mode; separate several slugs with commas | miami-florida |
stateFilter | US state codes to keep; applied after fetching | – |
maxResults | Maximum number of listing records; the schema minimum is 1 | 50 |
proxyConfiguration | Optional proxy settings; the site works without a proxy, so enable Apify Proxy only if you hit blocks | Apify Proxy, RESIDENTIAL group |
Limits and edge cases
| Condition | What you see | What to do |
|---|---|---|
maxResults is 0 or negative | The Actor returns without records; the schema requires at least 1 | Set it to 1 or higher |
| API search uses a state slug | The whole state can be searched and pages are fetched until maxResults | Use a state slug and set an appropriate limit |
| Several API slugs contain the same listing | The same id is skipped after its first occurrence | Use comma-separated slugs; duplicate IDs are not pushed twice |
stateFilter excludes fetched listings | The dataset can be empty because filtering occurs after fetching | Check the state codes and searchSlug |
featured is selected | featured returns the home-page cards, not the full API details | Use api for descriptions, coordinates, features, or other full fields |
sitemap is selected | Records contain address-oriented fields such as full_address, state, postal_code, and last_modified | Use sitemap for address and URL discovery, or api for details |
| An API request fails | The Actor retries up to five times; 400 and 404 responses stop immediately. The failed page logs a warning, the run can finish Succeeded with an empty or short dataset, and rows already pushed remain | Check the slug and proxy settings, then run again |
| No API records are produced | The log warns that no records were produced and points to the location slug | Verify the slug and remove a restrictive stateFilter |
A featured or sitemap fetch fails | These modes have no retry fallback beyond the five request attempts; a failed fetch ends the run with an error and no records | Run again; the page warning above applies only to api |
| A listing has no value for an output field | The field is omitted | Treat it as unavailable for that listing |
FAQ
How much does it cost to scrape ForSaleByOwner.com?
On the Free plan, each dataset item costs $0.0075 and each Actor Start event costs $0.00005. See Pricing for examples.
Does the Actor require a login or API key?
No. The Actor uses public listing data and requires no login or API key. proxyConfiguration defaults to Apify Proxy (RESIDENTIAL group) and is optional because the site works without a proxy.
Why did my run return no records?
An invalid API location, an excluding stateFilter, or a non-positive maxResults can result in no records. Check the slug and state code, and set maxResults to at least 1.
What should I do if the Actor is not working?
For API mode, inspect the run log for a failed-page warning, verify the slug, and try again. You can also configure the Apify Proxy settings input.
Is using this public data legal under the source's ToS?
The Actor reads public data from the ForSaleByOwner.com search listing feed, home-page featured cards, and public listings sitemap. Check the source terms and your local law for your use case.
Related actors
- At Home Japan Rental Listings — related property-listing data for Japan rental listings.
- NewHomeSource Scraper - Markets, Builders & States — related property data organized around markets, builders, and states.
- Property24 Scraper | South Africa — related property data for South Africa.