ForSaleByOwner Listings Scraper - FSBO Homes by City avatar

ForSaleByOwner Listings Scraper - FSBO Homes by City

Pricing

from $7.50 / 1,000 forsalebyowner listings scraper - fsbo homes by cities

Go to Apify Store
ForSaleByOwner Listings Scraper - FSBO Homes by City

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

Vitalii Bondarev

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Features

Limited permissions

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.

  • api is the default mode and collects full listing records for a city or state slug such as miami-florida, austin-texas, or texas. State searches are paginated until maxResults.
  • featured collects the home-page cards.
  • sitemap collects address-only records from the public listings sitemap.
Field familyFieldsType
Listing identityid, url, title, listing_statusString; omitted when unavailable
Price and locationprice, address, unit_number, city, state, postal_code, county, neighborhoods, longitude, latitudeprice: integer; location text: string; neighborhoods: array of strings; coordinates: number; unavailable fields and empty arrays are omitted
Property detailsproperty_type, bedrooms, bathrooms, living_area_sqft, lot_size, lot_size_unit, year_builtText fields: string; bedrooms, living_area_sqft, year_built: integer; bathrooms, lot_size: number; unavailable fields are omitted
Description and datesdescription, listing_date, activated_date, updated_date, is_new, is_new_construction, is_price_reduceddescription: string; dates: ISO 8601 string; flags: boolean; unavailable fields are omitted
Seller and mediaseller_name, seller_photo_url, brokerage_name, image_url, photo_count, photosText fields: string; photo_count: integer; photos: array of strings; unavailable fields and empty arrays are omitted
Open housesopen_housesArray of objects with ISO 8601 start and end strings and string or null notes; omitted when empty
Home featuresappliances, parking, floor_covering, heating, cooling, view_typesArray of strings; omitted when empty
Outdoor featureshas_fenced_yard, has_patio, has_porch, has_deck, has_pool, has_fireplaceBoolean; omitted when unavailable
Buyer preferencesbuyer_agent_preference, buyer_offer_typesbuyer_agent_preference: string; buyer_offer_types: array of strings; unavailable fields and empty arrays are omitted
Run metadatasearch_location, source, scraped_atsearch_location and source: string; scraped_at: ISO 8601 string; omitted when unavailable
Featured-card fieldslisting_label, badge, listed_by, image_url, seller_photo_urlString; omitted when unavailable
Sitemap fieldsfull_address, last_modified, state, postal_code, url, titleString; 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.

EventUnit and conditionFree-plan price
apify-actor-startOnce per GB of run memory per run, minimum one event$0.00005
apify-default-dataset-itemOne scraped result with all fields pushed to the dataset$0.0075
ResultsDataset-item charge (Free plan)
1,0001,000 x $0.0075 = $7.50
10,00010,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

  1. Choose api, featured, or sitemap in mode.
  2. Enter a city-state or state slug in searchSlug for API mode, such as miami-florida or texas; separate slugs with commas.
  3. Set maxResults and optionally provide two-letter US state codes in stateFilter.
  4. Leave proxyConfiguration at its default (Apify Proxy, RESIDENTIAL group). It is optional because the site works without a proxy.
  5. Start the Actor in Apify Console and review the resulting dataset.
  6. 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

ParameterWhat it doesDefault
modeRun mode: api, featured, or sitemapapi
searchSlugCity-state or state slug for API mode; separate several slugs with commasmiami-florida
stateFilterUS state codes to keep; applied after fetching–
maxResultsMaximum number of listing records; the schema minimum is 150
proxyConfigurationOptional proxy settings; the site works without a proxy, so enable Apify Proxy only if you hit blocksApify Proxy, RESIDENTIAL group

Limits and edge cases

ConditionWhat you seeWhat to do
maxResults is 0 or negativeThe Actor returns without records; the schema requires at least 1Set it to 1 or higher
API search uses a state slugThe whole state can be searched and pages are fetched until maxResultsUse a state slug and set an appropriate limit
Several API slugs contain the same listingThe same id is skipped after its first occurrenceUse comma-separated slugs; duplicate IDs are not pushed twice
stateFilter excludes fetched listingsThe dataset can be empty because filtering occurs after fetchingCheck the state codes and searchSlug
featured is selectedfeatured returns the home-page cards, not the full API detailsUse api for descriptions, coordinates, features, or other full fields
sitemap is selectedRecords contain address-oriented fields such as full_address, state, postal_code, and last_modifiedUse sitemap for address and URL discovery, or api for details
An API request failsThe 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 remainCheck the slug and proxy settings, then run again
No API records are producedThe log warns that no records were produced and points to the location slugVerify the slug and remove a restrictive stateFilter
A featured or sitemap fetch failsThese modes have no retry fallback beyond the five request attempts; a failed fetch ends the run with an error and no recordsRun again; the page warning above applies only to api
A listing has no value for an output fieldThe field is omittedTreat 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.

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.