# EstateSales.net Estate Sale Listings Scraper (`jungle_synthesizer/estatesales-net-estate-sale-listings-scraper`) Actor

Nationwide estate sale and estate-auction listings from EstateSales.net, covering all 50 states plus DC. Each record includes sale dates, address, geocoded location, description, photo count, and the estate-sale company name, phone, and profile link for sourcing leads or inventory.

- **URL**: https://apify.com/jungle\_synthesizer/estatesales-net-estate-sale-listings-scraper.md
- **Developed by:** [BowTiedRaccoon](https://apify.com/jungle_synthesizer) (community)
- **Categories:** Lead generation, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.60 / 1,000 record scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## EstateSales.net Estate Sale Listings Scraper

Scrape estate sale and estate auction listings from [EstateSales.net](https://www.estatesales.net), the largest US estate sale directory. Returns sale dates, address and geocoded location, full description, photo counts and URLs, and the estate-sale company's name, phone, and profile link — covering all 50 states plus DC.

***

### EstateSales.net Scraper Features

- Walks every state, city, and live sale on the site — not just whatever a radius search happens to return
- Returns the estate-sale company block: name, phone number, and profile link, not just the sale itself
- Includes geocoded latitude/longitude and the full street address once the listing reveals it
- Captures every sale date, not only a start/end range, for multi-day sales
- Classifies each listing's status as upcoming, running, or completed
- Returns up to 30 full-size photo URLs per sale plus the true total photo count
- Filter by one or more US states, or leave it open and pull the whole country

***

### Who Uses Estate Sale Data?

- **Antique and vintage dealers** — build a route of upcoming sales in a region instead of checking the site by hand every morning
- **Resellers and pickers** — turn new listings into a pick list before the weekend crowd shows up
- **Estate-liquidation companies** — track which competitors are running sales in their territory, and how often
- **Real estate and probate lead buyers** — an estate sale is a public, leading signal that a property is about to change hands, well before it hits an MLS
- **Researchers and market analysts** — measure regional estate-liquidation activity over time

***

### How EstateSales.net Scraper Works

1. Pick one or more states, or leave the field empty to cover the whole country.
2. The scraper walks each state's city and metro pages to find every currently listed sale.
3. Each sale page is parsed for its full details — dates, address, description, photos, and the listing company.
4. Records land in your dataset as they're found, so a run you stop early still keeps what it already collected.

***

### Input

```json
{
  "maxItems": 10,
  "states": ["CA", "TX"]
}
```

| Field       | Type    | Default | Description |
|-------------|---------|---------|-------------|
| `maxItems`  | integer | `10`    | Maximum number of sale records to return. Raise it for a full state or nationwide pull. |
| `states`    | array   | `[]`    | One or more US state codes (e.g. `CA`, `TX`). Leave empty to crawl every state plus DC. |

#### Nationwide pull

```json
{
  "maxItems": 5000,
  "states": []
}
```

***

### EstateSales.net Scraper Output Fields

```json
{
  "sale_id": "5056071",
  "sale_url": "https://www.estatesales.net/CA/Westlake-Village/91362/5056071",
  "title": "Upscale Estate Sale by Appointment – Stickley Furniture, Dining Set, Art & More!",
  "company_name": "Caring Transitions Ventura County",
  "company_url": "https://www.estatesales.net/companies/CA/Camarillo/93012/156200",
  "company_phone": "8186201657",
  "sale_type": "By Appointment",
  "address_line": null,
  "city": "Westlake Village",
  "state": "CA",
  "postal_code": "91362",
  "latitude": 34.196318,
  "longitude": -118.819288,
  "starts_at": "2026-08-29T16:00:00Z",
  "ends_at": "2026-09-02T01:00:00Z",
  "sale_dates": "2026-08-29T16:00:00Z, 2026-09-01T23:00:00Z",
  "is_online": false,
  "listing_status": "running",
  "description": "Beautifully furnished estate featuring an impressive large glass-top dining table...",
  "photo_count": 72,
  "image_urls": "https://picturescdn.estatesales.net/5056071/1-1/....jpg|https://picturescdn.estatesales.net/5056071/1-1/....jpg",
  "terms": "See TERMS & CONDITIONS on CTBids.com website",
  "scraped_at": "2026-09-01T18:19:00.110Z"
}
```

| Field             | Type    | Description |
|-------------------|---------|-------------|
| `sale_id`         | string  | The sale's numeric id on EstateSales.net. |
| `sale_url`        | string  | Direct link to the sale listing. |
| `title`           | string  | The sale's title. |
| `company_name`    | string  | Name of the estate-sale or liquidation company running the sale. `null` for privately listed sales. |
| `company_url`     | string  | Link to the company's profile page. `null` for privately listed sales. |
| `company_phone`   | string  | Contact phone number for the sale. |
| `sale_type`       | string  | Estate Sale, Online Only Auction, Moving Sale, By Appointment, Business Closing, etc. |
| `address_line`    | string  | Street address, once the listing reveals it. `null` before then. |
| `city`            | string  | City. |
| `state`           | string  | Two-letter state code. |
| `postal_code`     | string  | ZIP code. |
| `latitude`        | number  | Geocoded latitude. |
| `longitude`       | number  | Geocoded longitude. |
| `starts_at`       | string  | Sale start date/time (UTC, ISO 8601). |
| `ends_at`         | string  | Sale end date/time (UTC, ISO 8601). |
| `sale_dates`      | string  | Comma-separated list of the sale's individual day dates (UTC, ISO 8601). |
| `is_online`       | boolean | `true` for online-only auctions. |
| `listing_status`  | string  | `upcoming`, `running`, or `completed`. |
| `description`     | string  | The full sale description. |
| `photo_count`     | integer | Total number of photos on the listing. |
| `image_urls`      | string  | Pipe-separated list of full-size photo URLs (capped at 30). |
| `terms`           | string  | The sale's posted terms and conditions. |
| `scraped_at`      | string  | When this record was collected. |

***

### Resuming a large crawl

Every run emits a `resumeCursor` in its Output. If a large crawl stops before it finishes — because it hit `maxItems`, your spend cap (`maxTotalChargeUsd`), or was aborted — start a new run with **the same input** plus that `resumeCursor` to continue from where it left off. The crawl resumes from the queued work the previous run didn't reach.

- You are **not re-charged** for records the earlier run already delivered.
- Resume within your account's run-retention window — on the free tier, roughly your 10 most recent runs. Once the source run is pruned, its `resumeCursor` is no longer valid.
- `resumeCursor` is opaque — supply it unmodified.

***

### 🔍 FAQ

#### How do I scrape EstateSales.net?

Run this actor with a list of states (or leave it empty for the whole country) and a `maxItems` cap. No account or API key is required — EstateSales.net is a public directory.

#### What data can I get from EstateSales.net?

Sale dates, full address and geocoded location, a description, photo count and URLs, sale type, listing status, and — when the sale is company-run — the estate-sale company's name, phone, and profile link.

#### Can I filter by state?

Yes. Pass one or more two-letter state codes in `states`. Leave it empty and the run covers every state plus DC.

#### Does this include the estate-sale company's contact info?

Yes, for company-run listings. `company_name`, `company_phone`, and `company_url` are populated whenever a sale is listed by an estate-sale or liquidation business rather than a private seller.

#### How often should I re-run this?

Estate sales are date-scoped and addresses are often revealed only shortly before the sale starts, so a daily run against upcoming sales catches details that weren't available yet on the first pass.

***

### Need More Features?

Need custom fields or a different geographic scope? [File an issue](https://console.apify.com/actors/issues) or get in touch.

### Why Use EstateSales.net Scraper?

- **National coverage** — walks the state-to-city-to-sale tree instead of returning whatever a single radius search picks up.
- **Built for lead generation, not just browsing** — the company block (name, phone, profile URL) is what turns a sale listing into a sourcing or lead-gen dataset, not just a page to read.
- **Every sale date, not a range** — multi-day sales return each individual day, so you know exactly when to show up.

# Actor input Schema

## `sp_intended_usage` (type: `string`):

What will this data feed? E.g. lead lists, KYB checks, price tracking.

## `sp_improvement_suggestions` (type: `string`):

Provide any feedback or suggestions for improvements.

## `sp_contact` (type: `string`):

We'll personally help with your use case. No spam.

## `resumeCursor` (type: `string`):

Leave empty for a fresh crawl. To CONTINUE a previous run where it stopped — without paying again for records you already received — paste the `resumeCursor` value from that run's Output (the run's OUTPUT key). Resume promptly: the previous run's data expires with your account's retention window (free tier: your ~10 most recent runs).

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

Maximum number of sale records to scrape. Leave at the default for a quick preview; raise it for a full state/nationwide pull.

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

Restrict the crawl to one or more US states (2-letter code). Leave empty to crawl every state plus DC — EstateSales.net's own top-level partition, and the cost of minting a clearance is the same whether one state or all of them are crawled.

## Actor input object example

```json
{
  "sp_intended_usage": "Describe your intended use...",
  "sp_improvement_suggestions": "Share your suggestions here...",
  "sp_contact": "Share your email here...",
  "maxItems": 10,
  "states": []
}
```

# 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 = {
    "sp_intended_usage": "Describe your intended use...",
    "sp_improvement_suggestions": "Share your suggestions here...",
    "sp_contact": "Share your email here...",
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("jungle_synthesizer/estatesales-net-estate-sale-listings-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 = {
    "sp_intended_usage": "Describe your intended use...",
    "sp_improvement_suggestions": "Share your suggestions here...",
    "sp_contact": "Share your email here...",
    "maxItems": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("jungle_synthesizer/estatesales-net-estate-sale-listings-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 '{
  "sp_intended_usage": "Describe your intended use...",
  "sp_improvement_suggestions": "Share your suggestions here...",
  "sp_contact": "Share your email here...",
  "maxItems": 10
}' |
apify call jungle_synthesizer/estatesales-net-estate-sale-listings-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,jungle_synthesizer/estatesales-net-estate-sale-listings-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/amrtOM6GYD4PR4V0N/builds/3ttpvaoMl4RfIbNJS/openapi.json
