# FSBO.com Scraper — For Sale By Owner Listings (`memo23/fsbo-scraper`) Actor

Scrape owner-listed US homes from FSBO.com: address, price, beds/baths, sqft, GPS, photos & status. Filter by state, city and property type.

- **URL**: https://apify.com/memo23/fsbo-scraper.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:**
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 listings

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## FSBO.com Scraper — For Sale By Owner Listings

Pull **for-sale-by-owner** homes straight from [FSBO.com](https://fsbo.com), the US owner-listing marketplace. Search by state, city, or property type and get one clean row per listing — address, asking price, beds, baths, square footage, GPS coordinates, photos, and status. No agents, no brokers: every listing is posted by the owner.

![How the FSBO.com Scraper works](https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/how-it-works-fsbo.png)

### Why use this scraper

- **Owner listings only.** FSBO.com is a pure for-sale-by-owner marketplace, so every row is a property listed directly by its owner — exactly the inventory agents' feeds leave out.
- **Whole-country coverage.** Scrape a single city, a list of states, or the entire FSBO.com inventory in one run.
- **Rich, structured rows.** Address, price, beds/baths, square footage, year built, lot GPS, photos and status arrive parsed and typed — no HTML cleanup.
- **Daily fresh-listing feed.** Monitoring mode returns only listings you haven't seen before, so a scheduled run gives you just the new owner listings each day.
- **Fast and quiet.** Built on FSBO.com's own listing API, so runs are quick and light — no browser, no proxy needed.

### What it does

The scraper reads FSBO.com's public listing feed and returns one structured record per owner-listed property. You point it at locations and optional filters (property type, beds, baths, price); it paginates the full result set — past any on-site page limit — and delivers clean JSON or CSV.

### Supported inputs

- **US states** — one or more two-letter codes (`FL`, `TX`, `CA`), or leave empty for every state.
- **City** — narrow to a single city within a state.
- **FSBO.com search URLs** — paste a state index (`https://fsbo.com/search/list/state/fl`) or a `/search?state=FL&city=Miami` URL directly.
- **Filters** — property type, min/max bedrooms, min/max bathrooms, min/max asking price.

### Use cases

- **Real-estate investors & wholesalers** sourcing motivated, agent-free sellers to approach directly.
- **iBuyers and cash-buyer operations** building a pipeline of owner listings by market.
- **Buyer's agents** finding FSBO inventory to represent buyers on.
- **Market analysts** tracking owner-listing supply, pricing and days-on-market by state or city.
- **Lead tools & CRMs** enriching a territory with fresh for-sale-by-owner records on a schedule.

### How it works

1. You provide states, a city, or FSBO.com search URLs, plus any filters.
2. The actor resolves each search and queries FSBO.com's listing feed, paginating through every page of results.
3. Each listing is mapped to a clean row (prices converted from cents to dollars, photo URLs made absolute, coordinates included).
4. With monitoring mode on, listings delivered on earlier runs are skipped so you only get new ones.
5. Results stream to the dataset, exportable as JSON, CSV, Excel or via API.

### Input configuration

| Field | Type | Description |
|---|---|---|
| `states` | array | Two-letter US state codes. Empty = every state. |
| `city` | string | City name, used with a single state. |
| `startUrls` | array | FSBO.com search URLs (override states/city). |
| `propertyTypes` | array | `SINGLE_FAMILY`, `CONDO`, `TOWNHOUSE`, `MULTI_FAMILY`, `MOBILE_HOME`, `LAND`, `OTHER`. |
| `minBeds` / `maxBeds` | integer | Bedroom bounds. |
| `minBaths` / `maxBaths` | integer | Bathroom bounds. |
| `minPrice` / `maxPrice` | integer | Asking-price bounds in whole US dollars. |
| `monitoringMode` | boolean | Return only listings not seen on previous runs. |
| `maxItems` | integer | Hard cap on delivered listings. |
| `pageConcurrency` | integer | Result pages fetched in parallel per search. |

#### Example input

```json
{
  "states": ["FL", "TX"],
  "propertyTypes": ["SINGLE_FAMILY", "CONDO"],
  "minBeds": 3,
  "maxPrice": 500000,
  "maxItems": 2000
}
```

### Output overview

One row per owner listing. Prices are in US dollars (raw cents preserved in `askingPriceCents`), photo URLs are absolute, and every row is flagged `forSaleByOwner: true` with `mlsListed: false`.

#### Output sample

```json
{
  "listingId": "cmpaqky7502x1s601gmhtu0g7",
  "listingUrl": "https://fsbo.com/search/list/1049-forest-grove-dr-dallas-tx-75218-1785767490282",
  "headline": "Fully Renovated East Dallas Home on Rare 1/3-Acre Corner Lot",
  "street": "1049 Forest Grove Dr",
  "city": "Dallas",
  "state": "TX",
  "zip": "75218",
  "propertyType": "SINGLE_FAMILY",
  "beds": 3,
  "baths": 3,
  "sqft": 2600,
  "yearBuilt": 1969,
  "askingPrice": 749000,
  "askingPriceCents": 74900000,
  "latitude": 32.8461092,
  "longitude": -96.6950535,
  "status": "ACTIVE",
  "mlsListed": false,
  "forSaleByOwner": true,
  "primaryPhotoUrl": "https://fsbo.com/api/fsbo/photos?key=listings%2Fcmpaqky7502x1s601gmhtu0g7%2Fscraped%2Fmpaqls7rdihqf2sf.jpg",
  "photoCount": 6,
  "listingSource": "FSBO.com",
  "scrapedAt": "2026-09-11T10:14:49.112Z"
}
```

### Key output fields

| Field | Description |
|---|---|
| `listingId` | FSBO.com internal listing ID. |
| `listingUrl` | Browsable FSBO.com URL for the listing. |
| `street`, `city`, `state`, `zip` | Full property address. |
| `propertyType` | Single family, condo, townhouse, multi-family, mobile home, land or other. |
| `beds`, `baths`, `sqft`, `yearBuilt` | Core property facts. |
| `askingPrice` / `askingPriceCents` | Asking price in dollars / raw cents. |
| `latitude`, `longitude` | Property coordinates. |
| `status` | `ACTIVE` or `PENDING`. |
| `primaryPhotoUrl`, `photoUrls`, `photoCount` | Listing photos (absolute URLs). |
| `forSaleByOwner` | Always `true`. |
| `mlsListed` | Whether the listing is also on the MLS (owner listings: `false`). |
| `daysOnMarket` | Whole days since the listing was published. |
| `ownerPhone`, `ownerPhones`, `ownerEmails` | Contact pulled from the description when present (FSBO.com usually routes contact through the platform, so this is often empty). |
| `motivationScore`, `motivationReasons` | Seller-motivation score 0–100 and the signals behind it. |

### FAQ

**Does this include the owner's phone number or email?**
No. On FSBO.com, buyers contact sellers through the platform, so direct owner phone/email is not published on the listing and is not scraped. You get the full property record and the listing URL to reach the seller through the site.

**Are these really for-sale-by-owner, not agent listings?**
Yes. FSBO.com is an owner-listing marketplace; every row is flagged `forSaleByOwner: true` and `mlsListed: false`.

**Can I get only new listings each day?**
Yes — turn on monitoring mode and schedule the actor. It remembers listing IDs delivered on prior runs and returns only ones it hasn't seen.

**How many listings are there?**
The FSBO.com inventory runs into the tens of thousands nationwide, spread across all 50 states. The actor paginates the entire result set for your search.

**Which filters actually work?**
State, city, property type, bedroom range, bathroom range and price range are applied at the source. Every returned row still carries the full data, so you can filter further downstream.

### Support

Found a bug or need an extra field? Open an issue on the actor's **Issues** tab in Apify Console and it will be addressed.

### Additional services

Need the owner's contact details appended, or the same data from other owner-listing sources (Zillow FSBO, Craigslist by-owner, Facebook Marketplace)? Those are available as separate actors — ask via the contact on the profile.

### Explore more scrapers

This actor is part of a large real-estate scraping suite covering Zillow, Redfin, Realtor.com, Trulia, LoopNet, Crexi, Land.com and more. Browse the full profile for the rest.

### 🤖 For AI agents & LLM apps

This actor is MCP- and agent-friendly. Inputs and outputs are plain JSON with stable, documented field names, so an LLM agent can call it to answer questions like "list for-sale-by-owner single-family homes under $400k in Texas" and get structured rows back — address, price, beds/baths, coordinates and listing URL — with no HTML parsing.

### ⚠️ Disclaimer

This scraper collects only publicly available listing information from FSBO.com. It does not access private, gated, or personal data, and it does not extract owner phone numbers or emails. Use the data in line with FSBO.com's terms of service and all applicable laws, including real-estate marketing, data-protection and anti-solicitation regulations in your jurisdiction. You are responsible for how you use the output.

### SEO keywords

FSBO scraper, FSBO.com scraper, for sale by owner scraper, for sale by owner listings, FSBO leads, owner listings scraper, US real estate scraper, off-market properties, real estate investor leads, wholesale real estate leads, property data API, homes for sale by owner, FSBO data extraction, real estate lead generation, motivated seller leads.

# Actor input Schema

## `states` (type: `array`):

Two-letter US state codes to scrape, one per line — e.g. `FL`, `TX`, `CA`. Leave empty to scrape every state (the entire FSBO.com owner-listing inventory).

## `city` (type: `string`):

Optional city name to narrow the search (e.g. `Miami`). Use together with a single state.

## `startUrls` (type: `array`):

Optional. Paste FSBO.com search URLs, one per line — a state index like `https://fsbo.com/search/list/state/fl`, or a `/search?state=FL&city=Miami` URL. When set, these take precedence over the states/city fields above.

## `propertyTypes` (type: `array`):

Restrict to these property types, one per line. Allowed values: `SINGLE_FAMILY`, `CONDO`, `TOWNHOUSE`, `MULTI_FAMILY`, `MOBILE_HOME`, `LAND`, `OTHER`. Leave empty for all types.

## `minBeds` (type: `integer`):

Only listings with at least this many bedrooms. Leave empty for no lower bound.

## `maxBeds` (type: `integer`):

Only listings with at most this many bedrooms. Leave empty for no upper bound.

## `minBaths` (type: `integer`):

Only listings with at least this many bathrooms. Leave empty for no lower bound.

## `maxBaths` (type: `integer`):

Only listings with at most this many bathrooms. Leave empty for no upper bound.

## `minPrice` (type: `integer`):

Only listings priced at or above this amount, in whole US dollars. Leave empty for no lower bound.

## `maxPrice` (type: `integer`):

Only listings priced at or below this amount, in whole US dollars. Leave empty for no upper bound.

## `monitoringMode` (type: `boolean`):

Remember the listing IDs delivered on previous runs (per user) and return only listings not seen before. Ideal for a daily fresh-FSBO feed.

## `maxItems` (type: `integer`):

Hard cap on the number of listings delivered across all searches.

## `pageConcurrency` (type: `integer`):

How many result pages to fetch in parallel per search. 6 is a good default.

## `proxy` (type: `object`):

Optional. FSBO.com's API is open, so the actor runs without a proxy by default. Set this only if you want to route requests through one.

## Actor input object example

```json
{
  "states": [
    "FL",
    "TX"
  ],
  "propertyTypes": [
    "SINGLE_FAMILY",
    "CONDO"
  ],
  "monitoringMode": false,
  "maxItems": 1000,
  "pageConcurrency": 6
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "states": [
        "FL"
    ],
    "maxItems": 1000
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/fsbo-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "states": ["FL"],
    "maxItems": 1000,
}

# Run the Actor and wait for it to finish
run = client.actor("memo23/fsbo-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "states": [
    "FL"
  ],
  "maxItems": 1000
}' |
apify call memo23/fsbo-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,memo23/fsbo-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/mVjYf1uNzCG5Td86p/builds/Ch3HKQL0wfNiDznEc/openapi.json
