# Propwire Scraper — US Property & Owner Data (`solidcode/propwire-com-scraper`) Actor

\[💰 $0.75 / 1K] Extract US property and owner data from Propwire.com: owner names and mailing addresses, equity and value estimates, mortgages, transfers, foreclosure notices and MLS status. 107 fields, 38 verified filters, 24 off-market lead types. Export to JSON, CSV or Excel.

- **URL**: https://apify.com/solidcode/propwire-com-scraper.md
- **Developed by:** [SolidCode](https://apify.com/solidcode) (community)
- **Categories:** Real estate, Lead generation
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.75 / 1,000 properties

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/platform/actors/running/actors-in-store#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

## Propwire Scraper — US Property & Owner Data

Pull US property, owner and off-market lead records from Propwire.com at scale — owner names and mailing addresses, equity and value estimates, mortgage and transfer history, foreclosure filings and MLS status, in one clean row per property. Built for real estate investors, wholesalers, and lead-generation teams who need a skip-trace-ready list of motivated sellers without clicking through a map one parcel at a time.

Propwire indexes 131 million US properties. Set your filters here or paste a search link from the site, and get structured rows back.

### Why This Scraper?

- **Owner name and mailing address on 95% of rows** — measured across 300 properties spanning Los Angeles, Houston, Chicago and Miami and three property classes (single-family, condo, land). Street address, city, state, ZIP and GPS coordinates land on 98%. That is a skip-trace-ready list straight out of the search, with no second lookup.
- **38 search inputs, every one verified live against Propwire's own index** — Los Angeles holds 412,706 properties; `high_equity` narrows it to 255,117, a 90-day time-on-market to 548, a $500k–$600k value band to 39,425, and `zombie_property` to 28. Nothing is offered here that was not measured returning rows.
- **24 lead types that all return data** — high equity, absentee owner, free and clear, cash buyer, tired landlord, empty nester, pre-probate, out-of-state owner, negative equity, vacant home, vacant lot, flipped, private lender, bank owned, pre-foreclosure, auction, zombie property and more. Categories behind Propwire's paid Premium Leads add-on are refused up front with a clear message instead of failing halfway through a paid run.
- **107 fields per property, 37 of them behind one switch** — parcel number, legal description, zoning and land use; the tax bill, tax year and delinquency year; up to 25 mortgage records with lender, rate, balance, loan type and maturity date; transfer history; the foreclosure notice type, lender, opening bid and judgment amount; and the owner's whole portfolio with its value, equity and other property IDs.
- **100% enrichment, measured** — 1,800 of 1,800 properties came back with their full detail record attached across two cloud runs. Parcel number and county on 100%, tax year on 100%, portfolio size on 99.8%.
- **Radius search around any map point** — a 1-mile circle on downtown Los Angeles matches 8,987 properties, 5 miles 161,857, 25 miles 2,163,971. Verified in the output: across 1,200 rows drawn on a 5-mile circle, the furthest was 3.06 miles from the centre, and the rows spanned two states — a circle on Lower Manhattan returns Jersey City and Hoboken parcels, which no city or state filter can do.
- **Sort on 7 verified fields** — estimated value, estimated equity, equity percentage, MLS list price, list price per sq ft, days on market, last sold price. Propwire serves at most 10,000 rows per search, so the sort decides *which* 10,000 of a 412,706-property market you get.
- **Foreclosure notices that work in every state** — Lis Pendens, Notice of Default, Notice of Trustee Sale, Notice of Sale and REO, cross-checked in five metros: Miami returns 4,601 Lis Pendens and no Notices of Default, Houston returns 1,044 Trustee Sale notices and no Lis Pendens. Judicial and non-judicial states are both covered, and each option says which states use it.
- **Look up properties you already know** — paste street addresses or Propwire property IDs and get the same full row back, with a match mode for the addresses that resolve to several parcels ("101 Crawfords Corner Rd, Holmdel, NJ 07733" resolves to 4).

### Use Cases

**Off-Market Lead Generation**

- Build absentee-owner, tired-landlord and empty-nester lists with mailing addresses ready for direct mail
- Target pre-foreclosure and auction properties with the notice type, recording date and auction date attached
- Screen for vacancy, tax delinquency and free-and-clear ownership — the three strongest distress signals in the dataset

**Investment & Acquisition Analysis**

- Pull comparables with last sold price and date, estimated value, price per sq ft and the ZIP median to benchmark against
- Find high-equity and long-held property by equity percentage, dollar equity or years of ownership
- Read the debt before you offer: loan amount, current balance, interest rate, loan type and maturity date per mortgage

**Portfolio & Landlord Research**

- Identify owners holding 5, 10 or 50+ properties and pull their whole portfolio's value, equity and mortgage balance
- Separate individual, company, trust and bank ownership to route entity deals differently from consumer ones
- Follow transfer history to see intrafamily transfers, quitclaims and non-arms-length deeds

**Market Research & Analytics**

- Measure equity, vacancy and ownership mix across a city, county, ZIP or map radius
- Track failed, pending and sold MLS listings alongside off-market inventory in the same table
- Compare price per sq ft against the ZIP median across thousands of properties at once

**Data Enrichment & CRM Integration**

- Refresh a saved list by property ID and get today's values, mortgages and status
- Append owner, equity and tax data to an address list you already hold
- Feed results into a CRM, sheet or warehouse with the built-in integrations below

### Getting Started

#### Simplest run

Everything else falls back to its default — 100 properties from California:

```json
{
  "maxItems": 100
}
```

#### A filtered search

High-equity single-family homes in Houston, absentee owners only, largest equity first:

```json
{
  "state": "TX",
  "city": "Houston",
  "propertyType": "sfr",
  "leadType": "high_equity",
  "ownerOccupancy": "absentee",
  "sortBy": "estimated_equity",
  "sortOrder": "desc",
  "maxItems": 1500
}
```

#### Paste a search URL from the site

Set your filters on Propwire.com, then copy the address bar URL. Several lead types or
property types at once — which the drop-downs take one of — come across this way.

```json
{
  "searchUrls": [
    "https://propwire.com/search?filters=%7B%22locations%22%3A%5B%7B%22searchType%22%3A%22C%22%2C%22state%22%3A%22CA%22%2C%22city%22%3A%22Los%20Angeles%22%2C%22title%22%3A%22Los%20Angeles%2C%20CA%22%7D%5D%2C%22lead_type%22%3A%5B%22high_equity%22%5D%2C%22property_type%22%3A%5B%22sfr%22%5D%2C%22estimated_equity_percent%22%3A%7B%22min%22%3A60%7D%7D"
  ],
  "maxItems": 10000
}
```

#### A map radius, with full details

Every property within 5 miles of a point, enriched with mortgages, taxes and ownership:

```json
{
  "latitude": 40.7128,
  "longitude": -74.006,
  "radiusMiles": 5,
  "propertyType": "mfh_2_to_4",
  "bedroomsMin": 3,
  "enrichDetails": true,
  "maxItems": 1200
}
```

### Input Reference

#### What to Scrape

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `searchUrls` | array | — | Paste Propwire URLs copied straight from your browser. A search link -- propwire.com/search?filters=... -- is read for the area and filters you set on the site and re-run here, so everything the Propwire search bar can express comes across, including several lead types or property types at once, which the drop-downs below only take one of. A property link -- propwire.com/realestate/<address>/<id> -- pulls just that one property, with exactly the same fields as a search result. Anything else on propwire.com is rejected before the run starts rather than quietly returning the wrong area. When this box has any URL in it, the filters below are ignored. |
| `maxItems` | integer | `100` | Maximum properties per search URL (0 = collect everything each search returns). Propwire.com pages through at most 10,000 properties per search, so use several narrower searches to collect more. |

#### Options

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `state` | string | `CA` | The US state to search. Required unless you use a ZIP code or a map point below. Leaving it on "Any state" together with an empty city, county and ZIP code is refused before any request is made - an unbounded search would return the whole 131-million-record national database. |
| `city` | string | — | One city inside the state above, spelled the way Propwire spells it ("Los Angeles", "Fort Worth"). Capitalisation does not matter. Leave empty to search the whole state. |
| `county` | string | — | One county inside the state above, without the word "County" - "Orange", "Cook", "Harris". Use this instead of a city to cover a whole metro area. |
| `zipCode` | string | — | A single 5-digit ZIP code. A ZIP code works on its own - you do not need to set the state - and it wins over the city and county above when you set both. ZIP codes are the most reliable way to cover a big city without running into the 10,000-result-per-search limit. |
| `latitude` | number | — | Search a circle around a point on the map instead of an area. Set latitude, longitude and radius together. When all three are set they replace the state, city, county and ZIP code above entirely. |
| `longitude` | number | — | The longitude of the map point. Negative in the United States. |
| `radiusMiles` | number | — | How far around the map point to search, in miles. Required when you set a latitude and longitude. A 1-mile circle around downtown Los Angeles matches about 9,000 properties, a 5-mile circle about 162,000. |
| `leadType` | string | `""` | One of Propwire's lead categories. Each one is a signal that the owner may be willing to sell below market. Five further categories (bankruptcies, code violations, divorce, liens and tax liens) are behind Propwire's paid Premium Leads add-on and are not available to this actor. |
| `ownerType` | string | `""` | Who holds the title. |
| `ownerOccupancy` | string | `""` | Absentee owners are the classic investor lead: they are landlords or inheritors rather than residents. |
| `occupancyStatus` | string | `""` | A vacant property costs its owner money every month in taxes, insurance and upkeep, which is why vacancy is one of the strongest motivation signals. |
| `cashBuyerOnly` | boolean | `false` | Only properties bought outright without a mortgage. These owners are usually investors who buy again. |
| `yearsOwnedMin` | integer | — | How long the current owner has held the property. 10+ years is the usual tired-landlord threshold; 20+ years is the usual empty-nester threshold. |
| `propertiesOwnedMin` | integer | — | Find portfolio owners. Set to 5 or more to reach landlords and small funds rather than single-home owners. |
| `taxDelinquentSinceYear` | integer | — | Only properties with unpaid property taxes going back to this year or later. Unpaid taxes are a public, dated distress signal. |
| `propertyType` | string | `""` | Propwire's own eight property categories. |
| `bedroomsMin` | integer | — | Only properties with at least this many bedrooms. |
| `bathroomsMin` | integer | — | Only properties with at least this many bathrooms. |
| `buildingSqftMin` | integer | — | Only properties whose building is at least this many square feet. |
| `lotSqftMin` | integer | — | Only properties whose lot is at least this many square feet. One acre is 43,560 square feet. |
| `yearBuiltMin` | integer | — | Only properties built in this year or later. Leave empty for any age. |
| `mustHavePool` | boolean | `false` | Only properties Propwire records as having a swimming pool. |
| `estimatedValueMin` | integer | — | Propwire's own estimate of what the property is worth today. |
| `estimatedValueMax` | integer | — | Upper end of the estimated-value band. Set it with the minimum above to search a price range. |
| `estimatedEquityMin` | integer | — | How much of the property's value the owner actually owns, in dollars. |
| `estimatedEquityPercentMin` | integer | — | The same thing as a percentage. 60% or more is Propwire's own "high equity" threshold. |
| `lastSoldPriceMin` | integer | — | What the current owner paid when they bought it. |
| `lastSoldSince` | string | — | A date written as YYYY-MM-DD. Only properties whose most recent recorded sale happened on or after this date - the fastest way to build a recent-buyer or comps list. |
| `noticeType` | string | `""` | Which foreclosure filing the county recorded. Which one applies depends on the state: Lis Pendens and Notice of Foreclosure Sale are used in court-driven states such as Florida, New York, New Jersey and Illinois, while Notice of Default and Notice of Trustee Sale are used in states such as California and Texas. Pick the one your state uses, or leave it on "Any". |
| `auctionDateFrom` | string | — | A date written as YYYY-MM-DD. Only properties with a foreclosure auction scheduled on or after this date. Use today's date to get only auctions that have not happened yet. |
| `mlsStatus` | string | `""` | Whether the property is on the open market. "Failed" listings are owners who tried to sell and could not, which is why they are the most contacted group on Propwire. |
| `daysOnMarketMin` | integer | — | Only listings that have been for sale at least this long. A listing sitting for 90+ days usually means the asking price is wrong and the seller knows it. |
| `mlsKeyword` | string | `""` | Searches the agent's own listing copy for one of three groups of phrases Propwire tracks. Only applies to properties that are or were on the MLS. |
| `sortBy` | string | `""` | Which number to order the results by. |
| `sortOrder` | string | `desc` | Only used when you pick something to sort by. |
| `addresses` | array | — | One street address per line, e.g. 101 Crawfords Corner Rd, Holmdel, NJ 07733. Each address is matched against Propwire's own address index and the matching properties are returned with the same fields as a search result. Propwire often has several parcels behind one street address - use the setting below to choose what happens then. |
| `addressMatchMode` | string | `first` | Propwire returns up to five candidate parcels for a street address: "101 Crawfords Corner Rd, Holmdel, NJ 07733" returns 4 and "1 Main St" returns 5. This decides whether you get the top one or all of them. |
| `propertyIds` | array | — | One Propwire property ID per line, e.g. 108859. This is the number at the end of a Propwire property link and the `id` field in this actor's own output, so it is the way to re-pull a saved list or refresh yesterday's results. |
| `enrichDetails` | boolean | `false` | Add 37 extra fields per property. Adds one request per property and is billed at the higher rate. |
| `concurrency` | integer | `8` | How many requests to run in parallel. Lower this if you see failures. |
| `proxyConfiguration` | object | Apify Proxy | Proxy settings for the run. |

### Output

Every property is one dataset row. Enabling `enrichDetails` adds 37 further fields to the same row — there is no second record type to join.

```json
{
  "id": 128162,
  "url": "https://propwire.com/realestate/property/128162",
  "address": "3303 S 81st Ave",
  "city": "Phoenix",
  "state": "AZ",
  "zip": "85043",
  "latitude": 33.418902,
  "longitude": -112.233291,
  "propertyType": "SFR",
  "bedrooms": 3,
  "bathrooms": 2.5,
  "buildingAreaSqft": 1966,
  "lotSizeSqft": 8591,
  "lotSizeAcres": 0.197,
  "yearBuilt": 2002,
  "pool": "Yes",
  "heatingType": "Forced Air With Air Conditioning",
  "estimatedValue": 417541,
  "estimatedEquity": 132672,
  "estimatedEquityPercent": 32,
  "estimatedPricePerSqft": 234.969611705,
  "estimatedZipPricePerSqft": 261.341937796,
  "lastSoldPrice": 236000,
  "lastSoldDate": "2018-03-20T00:00:00",
  "taxAssessedTotal": 13828,
  "ownerNames": ["<owner name>", "<owner name>"],
  "ownerOccupied": true,
  "ownerMailingAddress": "<owner mailing street>",
  "ownerMailingCity": "PHOENIX",
  "ownerMailingState": "AZ",
  "ownerMailingZip": "85043",
  "yearsOfOwnership": 5,
  "highEquity": false,
  "freeAndClear": false,
  "cashBuyer": false,
  "vacantHome": false,
  "preForeclosure": true,
  "foreclosure": true,
  "auctionDate": "2026-08-05T00:00:00",
  "leadTypes": ["adjustable_loan", "assumable_loan", "auction", "intrafamily_transfer", "preforeclosure"],
  "apn": "104-53-280",
  "legalDescription": "SUNDANCE RANCH 2 MCR 567-26",
  "county": "Maricopa",
  "zoning": "R-8",
  "landUse": "RESIDENTIAL",
  "propertyUseDescription": "Single Family Residence",
  "stories": 1,
  "roomsCount": 6,
  "constructionType": "Frame",
  "taxBilledAmount": 1716.36,
  "taxYear": 2025,
  "marketTotalValue": 331100,
  "currentMortgages": [
    {
      "recording_date": "2020-01-15",
      "loan_amount": 239107,
      "estimated_loan_balance": "207042.68",
      "interest_rate": 3.65,
      "loan_type": "FHA",
      "lender_name": "ACADEMY MORTGAGE CORP",
      "loan_maturity_date": "2050-02-01",
      "assumable": true,
      "position": "First"
    }
  ],
  "transferHistory": [
    {
      "recording_date": "2022-01-12",
      "deed_type": "INTRAFAMILY TRANSFER",
      "transfer_amount": 0,
      "grantor_name": "<previous owner>",
      "grantee_name": "<owner name>",
      "arms_length_transaction": false
    }
  ],
  "ownerType": ["INDIVIDUAL"],
  "ownerRelationshipType": "Community Property",
  "propertiesOwned": 1,
  "portfolioValue": 417541,
  "portfolioEquity": 132672.05,
  "portfolioMortgageBalance": 284868.95,
  "foreclosureActive": true,
  "foreclosureNoticeType": "NOTICE OF TRUSTEE SALE",
  "foreclosureRecordingDate": "2026-05-04T00:00:00",
  "foreclosureLender": "Freedom Mortgage Corporation"
}
```

That is a real captured Phoenix property with the owner's names and street line replaced by
placeholders, and its history arrays shortened — the live record carried 13 mortgage entries
and 10 transfers.

#### Core Fields & Location

| Field | Type | Description |
|-------|------|-------------|
| `id` | number | Property ID |
| `url` | string | Property page |
| `address` | string | Street address |
| `city` | string | City |
| `state` | string | State |
| `zip` | string | ZIP |
| `latitude` | number | Latitude |
| `longitude` | number | Longitude |
| `propertyType` | string | Property type |
| `bedrooms` | number | Bedrooms |
| `bathrooms` | number | Bathrooms |
| `buildingAreaSqft` | number | Building area (sq ft) |
| `livingAreaSqft` | number | Living area (sq ft) |
| `lotSizeSqft` | number | Lot size (sq ft) |
| `lotSizeAcres` | number | Lot size (acres) |
| `yearBuilt` | number | Year built |
| `units` | number | Units |
| `absenteeOwner` | boolean | Absentee owner |
| `highEquity` | boolean | High equity |
| `freeAndClear` | boolean | Free and clear |
| `cashBuyer` | boolean | Cash buyer |
| `vacantHome` | boolean | Vacant home |
| `preForeclosure` | boolean | Pre-foreclosure |

#### Price & Value

| Field | Type | Description |
|-------|------|-------------|
| `estimatedValue` | number | Estimated value (USD) |
| `estimatedEquity` | number | Estimated equity (USD) |
| `estimatedEquityPercent` | number | Estimated equity (%) |
| `estimatedLtv` | number | Estimated LTV |
| `estimatedPricePerSqft` | number | Estimated $/sq ft |
| `estimatedZipPricePerSqft` | number | ZIP median $/sq ft |
| `lastSoldPrice` | number | Last sold price (USD) |
| `lastSoldDate` | string | Last sold date |
| `taxAssessedTotal` | number | Assessed value (USD) |
| `taxAssessedLand` | number | Assessed land (USD) |
| `taxAssessedImprovements` | number | Assessed improvements (USD) |
| `taxAssessmentYear` | number | Assessment year |

#### Owner, Agent & Media

| Field | Type | Description |
|-------|------|-------------|
| `ownerNames` | array | Owner names |
| `ownerOccupied` | boolean | Owner occupied |
| `ownerMailingAddress` | string | Owner mailing address |
| `ownerMailingCity` | string | Owner mailing city |
| `ownerMailingState` | string | Owner mailing state |
| `ownerMailingZip` | string | Owner mailing ZIP |
| `yearsOfOwnership` | number | Years owned |
| `companyOwned` | boolean | Company owned |
| `trustOwned` | boolean | Trust owned |
| `investorOwned` | boolean | Investor owned |
| `mlsAgentName` | string | Listing agent |
| `mlsAgentPhone` | string | Listing agent phone |
| `mlsAgentEmail` | string | Listing agent email |
| `mlsOfficeName` | string | Listing office |
| `mlsOfficePhone` | string | Listing office phone |
| `mlsBrokerageWebsite` | string | Brokerage website |
| `mlsPhotoUrls` | array | MLS photo URLs |
| `mlsVirtualTourUrl` | string | Virtual tour |

#### Details & Timestamps

| Field | Type | Description |
|-------|------|-------------|
| `pool` | string | Pool |
| `coolingType` | string | Cooling |
| `heatingType` | string | Heating |
| `garageType` | string | Garage |
| `fireplace` | boolean | Fireplace |
| `daysOnMarket` | number | Days on market |
| `mlsStatus` | string | MLS status |
| `mlsStatusDate` | string | MLS status date |
| `mlsLastPrice` | number | MLS last price (USD) |
| `mlsListPrice` | number | MLS list price (USD) |
| `mlsListDate` | string | MLS list date |
| `mlsSoldPrice` | number | MLS sold price (USD) |
| `mlsSoldDate` | string | MLS sold date |
| `mlsListingUrl` | string | Listing page (MLS partner) |
| `mlsDescription` | string | Listing description |
| `foreclosure` | boolean | In foreclosure |
| `auctionDate` | string | Auction date |

#### Full Details — Parcel, Building & Tax

Added to every row when `enrichDetails` is on.

| Field | Type | Description |
|-------|------|-------------|
| `apn` | string | Parcel number (APN) |
| `legalDescription` | string | Legal description |
| `county` | string | County |
| `zip4` | string | ZIP+4 |
| `subdivision` | string | Subdivision |
| `zoning` | string | Zoning |
| `landUse` | string | Land use |
| `propertyUseDescription` | string | Property use |
| `stories` | number | Stories |
| `roomsCount` | number | Rooms |
| `constructionType` | string | Construction |
| `exteriorType` | string | Exterior |
| `buildingStyle` | string | Building style |
| `taxBilledAmount` | number | Tax billed (USD) |
| `taxYear` | number | Tax year |
| `marketTotalValue` | number | Market value (county) (USD) |
| `taxDelinquentYear` | number | Tax delinquent since |
| `taxExemptions` | object | Tax exemptions |
| `photoUrls` | array | Photo URLs |

#### Full Details — Ownership, Mortgages & Foreclosure

| Field | Type | Description |
|-------|------|-------------|
| `leadTypes` | array | Lead types |
| `ownerType` | array | Owner type |
| `ownerRelationshipType` | string | Owner relationship |
| `propertiesOwned` | number | Properties owned |
| `portfolioValue` | number | Portfolio value (USD) |
| `portfolioEquity` | number | Portfolio equity (USD) |
| `portfolioMortgageBalance` | number | Portfolio mortgage balance (USD) |
| `linkedPropertyIds` | array | Other properties owned (IDs) |
| `currentMortgages` | array | Current mortgages |
| `mortgageHistory` | array | Mortgage history |
| `transferHistory` | array | Transfer history |
| `mlsHistory` | array | MLS history |
| `foreclosureActive` | boolean | Foreclosure active |
| `foreclosureNoticeType` | string | Foreclosure notice type |
| `foreclosureRecordingDate` | string | Foreclosure recorded |
| `foreclosureLender` | string | Foreclosure lender |
| `foreclosureOpeningBid` | number | Auction opening bid (USD) |
| `foreclosureJudgmentAmount` | number | Judgment amount (USD) |

### Tips for Best Results

- **Propwire serves at most 10,000 properties per search, and Los Angeles alone holds 412,706.** To cover a big market, split it: run one search per ZIP code (ZIP 90003 is 10,683 properties), per county, or per value band. Several searches in one run are de-duplicated against each other, so overlapping slices cost you nothing.
- **When a market is bigger than 10,000, the sort decides which 10,000 you get.** Sorting by `estimated_equity` descending returns the highest-equity properties in the city rather than an arbitrary slice — the single highest-leverage setting for a lead list.
- **A ZIP code works on its own — no state needed** — and it beats a city when you set both. It is the most reliable way to work a large city without hitting the per-search ceiling.
- **Lead types combine as AND, not OR.** Picking one gives you that whole pool; if you want the overlap of two, set both on Propwire.com and paste the search URL. Bank-owned (961 in Los Angeles) and vacant (3,084) intersect at just 4.
- **Foreclosure notice types are state-specific.** Lis Pendens and Notice of Sale are filed in judicial states (FL, NY, NJ, IL); Notice of Default and Notice of Trustee Sale in states like CA and TX. Picking the wrong one for your state returns nothing — the input's description says which is which.
- **Leave full details off while you are still narrowing the search.** The search tier alone returns 70 fields including owner name, mailing address, equity and value, and it runs in seconds; turn full details on for the shortlist, where the extra 37 fields and the second rate are worth it.
- **Photo URLs are usually empty on off-market properties** — Propwire's source carries no images for parcels that were never listed. Listed property returns photos in `mlsPhotoUrls` instead, so filter on an MLS status when images matter.

### Pricing

**From $0.75 per 1,000 results** (search only) or **from $1.295 per 1,000 results** (with full details).

| Results | Search Only | With Full Details |
|---------|-------------|-------------------|
| 100 | $0.075 | $0.1295 |
| 1,000 | $0.75 | $1.295 |
| 10,000 | $7.50 | $12.95 |
| 100,000 | $75.00 | $129.50 |

Those are the rates on Gold and above. Higher-volume plans pay less per result:

| Your Apify plan | Search Only | With Full Details |
|-----------------|-------------|-------------------|
| No discount | $0.90 | $1.55 |
| Bronze | $0.85 | $1.47 |
| Silver | $0.80 | $1.38 |
| **Gold and above** | **$0.75** | **$1.295** |

Per 1,000 results.

A "result" is any property row in the output dataset. When you run several searches at once, a property matching more than one of them is de-duplicated before it reaches the dataset, so you are never charged twice for the same property. The full-details rate applies only to rows that actually came back enriched — if a property's detail record is unavailable, the row is still delivered and charged at the search-only rate. Platform fees (compute, storage) are additional and depend on your Apify plan.

### Integrations

Export data in JSON, CSV, Excel, XML, or RSS. Connect to 1,500+ apps via:

- **Zapier** / **Make** / **n8n** — Workflow automation
- **Google Sheets** — Direct spreadsheet export
- **Slack** / **Email** — Notifications on new results
- **Webhooks** — Trigger custom APIs on run completion
- **Apify API** — Full programmatic access

### Legal & Ethical Use

**This is an unofficial scraper. It is not affiliated with, endorsed by, or connected to Propwire.com or its operators in any way.** All trademarks belong to their respective owners.

This actor is intended for legitimate market research and analytics. You are responsible for complying with applicable laws and with Propwire.com's Terms of Service.

Results include personal data — owner names and mailing addresses. Treat them accordingly:
do not use them for spam, harassment, or any unlawful purpose, and follow applicable privacy
and direct-marketing rules when storing or processing them. Property and owner data must not
be used to discriminate on any basis protected by the Fair Housing Act or equivalent local law.

# Actor input Schema

## `searchUrls` (type: `array`):

Paste Propwire URLs copied straight from your browser. A search link -- propwire.com/search?filters=... -- is read for the area and filters you set on the site and re-run here, so everything the Propwire search bar can express comes across, including several lead types or property types at once, which the drop-downs below only take one of. A property link -- propwire.com/realestate/<address>/<id> -- pulls just that one property, with exactly the same fields as a search result. Anything else on propwire.com is rejected before the run starts rather than quietly returning the wrong area. When this box has any URL in it, the filters below are ignored.

## `state` (type: `string`):

The US state to search. Required unless you use a ZIP code or a map point below. Leaving it on "Any state" together with an empty city, county and ZIP code is refused before any request is made - an unbounded search would return the whole 131-million-record national database.

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

One city inside the state above, spelled the way Propwire spells it ("Los Angeles", "Fort Worth"). Capitalisation does not matter. Leave empty to search the whole state.

## `county` (type: `string`):

One county inside the state above, without the word "County" - "Orange", "Cook", "Harris". Use this instead of a city to cover a whole metro area.

## `zipCode` (type: `string`):

A single 5-digit ZIP code. A ZIP code works on its own - you do not need to set the state - and it wins over the city and county above when you set both. ZIP codes are the most reliable way to cover a big city without running into the 10,000-result-per-search limit.

## `latitude` (type: `number`):

Search a circle around a point on the map instead of an area. Set latitude, longitude and radius together. When all three are set they replace the state, city, county and ZIP code above entirely.

## `longitude` (type: `number`):

The longitude of the map point. Negative in the United States.

## `radiusMiles` (type: `number`):

How far around the map point to search, in miles. Required when you set a latitude and longitude. A 1-mile circle around downtown Los Angeles matches about 9,000 properties, a 5-mile circle about 162,000.

## `leadType` (type: `string`):

One of Propwire's lead categories. Each one is a signal that the owner may be willing to sell below market. Five further categories (bankruptcies, code violations, divorce, liens and tax liens) are behind Propwire's paid Premium Leads add-on and are not available to this actor.

## `ownerType` (type: `string`):

Who holds the title.

## `ownerOccupancy` (type: `string`):

Absentee owners are the classic investor lead: they are landlords or inheritors rather than residents.

## `occupancyStatus` (type: `string`):

A vacant property costs its owner money every month in taxes, insurance and upkeep, which is why vacancy is one of the strongest motivation signals.

## `cashBuyerOnly` (type: `boolean`):

Only properties bought outright without a mortgage. These owners are usually investors who buy again.

## `yearsOwnedMin` (type: `integer`):

How long the current owner has held the property. 10+ years is the usual tired-landlord threshold; 20+ years is the usual empty-nester threshold.

## `propertiesOwnedMin` (type: `integer`):

Find portfolio owners. Set to 5 or more to reach landlords and small funds rather than single-home owners.

## `taxDelinquentSinceYear` (type: `integer`):

Only properties with unpaid property taxes going back to this year or later. Unpaid taxes are a public, dated distress signal.

## `propertyType` (type: `string`):

Propwire's own eight property categories.

## `bedroomsMin` (type: `integer`):

Only properties with at least this many bedrooms.

## `bathroomsMin` (type: `integer`):

Only properties with at least this many bathrooms.

## `buildingSqftMin` (type: `integer`):

Only properties whose building is at least this many square feet.

## `lotSqftMin` (type: `integer`):

Only properties whose lot is at least this many square feet. One acre is 43,560 square feet.

## `yearBuiltMin` (type: `integer`):

Only properties built in this year or later. Leave empty for any age.

## `mustHavePool` (type: `boolean`):

Only properties Propwire records as having a swimming pool.

## `estimatedValueMin` (type: `integer`):

Propwire's own estimate of what the property is worth today.

## `estimatedValueMax` (type: `integer`):

Upper end of the estimated-value band. Set it with the minimum above to search a price range.

## `estimatedEquityMin` (type: `integer`):

How much of the property's value the owner actually owns, in dollars.

## `estimatedEquityPercentMin` (type: `integer`):

The same thing as a percentage. 60% or more is Propwire's own "high equity" threshold.

## `lastSoldPriceMin` (type: `integer`):

What the current owner paid when they bought it.

## `lastSoldSince` (type: `string`):

A date written as YYYY-MM-DD. Only properties whose most recent recorded sale happened on or after this date - the fastest way to build a recent-buyer or comps list.

## `noticeType` (type: `string`):

Which foreclosure filing the county recorded. Which one applies depends on the state: Lis Pendens and Notice of Foreclosure Sale are used in court-driven states such as Florida, New York, New Jersey and Illinois, while Notice of Default and Notice of Trustee Sale are used in states such as California and Texas. Pick the one your state uses, or leave it on "Any".

## `auctionDateFrom` (type: `string`):

A date written as YYYY-MM-DD. Only properties with a foreclosure auction scheduled on or after this date. Use today's date to get only auctions that have not happened yet.

## `mlsStatus` (type: `string`):

Whether the property is on the open market. "Failed" listings are owners who tried to sell and could not, which is why they are the most contacted group on Propwire.

## `daysOnMarketMin` (type: `integer`):

Only listings that have been for sale at least this long. A listing sitting for 90+ days usually means the asking price is wrong and the seller knows it.

## `mlsKeyword` (type: `string`):

Searches the agent's own listing copy for one of three groups of phrases Propwire tracks. Only applies to properties that are or were on the MLS.

## `sortBy` (type: `string`):

Which number to order the results by.

## `sortOrder` (type: `string`):

Only used when you pick something to sort by.

## `addresses` (type: `array`):

One street address per line, e.g. 101 Crawfords Corner Rd, Holmdel, NJ 07733. Each address is matched against Propwire's own address index and the matching properties are returned with the same fields as a search result. Propwire often has several parcels behind one street address - use the setting below to choose what happens then.

## `addressMatchMode` (type: `string`):

Propwire returns up to five candidate parcels for a street address: "101 Crawfords Corner Rd, Holmdel, NJ 07733" returns 4 and "1 Main St" returns 5. This decides whether you get the top one or all of them.

## `propertyIds` (type: `array`):

One Propwire property ID per line, e.g. 108859. This is the number at the end of a Propwire property link and the `id` field in this actor's own output, so it is the way to re-pull a saved list or refresh yesterday's results.

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

Maximum properties per search URL (0 = collect everything each search returns). Propwire.com pages through at most 10,000 properties per search, so use several narrower searches to collect more.

## `enrichDetails` (type: `boolean`):

Add 37 extra fields per property. Adds one request per property and is billed at the higher rate.

## `concurrency` (type: `integer`):

How many requests to run in parallel. Lower this if you see failures.

## `proxyConfiguration` (type: `object`):

Proxy settings for the run. Propwire.com only answers US residential addresses, so this actor ships US residential proxies as the default. Datacenter addresses are turned away before any property data is returned, and a run configured that way finishes with zero results.

## Actor input object example

```json
{
  "searchUrls": [],
  "state": "CA",
  "city": "Los Angeles",
  "leadType": "",
  "ownerType": "",
  "ownerOccupancy": "",
  "occupancyStatus": "",
  "cashBuyerOnly": false,
  "propertyType": "",
  "mustHavePool": false,
  "noticeType": "",
  "mlsStatus": "",
  "mlsKeyword": "",
  "sortBy": "",
  "sortOrder": "desc",
  "addresses": [],
  "addressMatchMode": "first",
  "propertyIds": [],
  "maxItems": 100,
  "enrichDetails": false,
  "concurrency": 8,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}
```

# Actor output Schema

## `core` (type: `string`):

Core Fields for each property.

## `financial` (type: `string`):

Price & Value for each property.

## `location` (type: `string`):

Location for each property.

## `contact` (type: `string`):

Contacts for each property.

## `media` (type: `string`):

Media for each property.

## `meta` (type: `string`):

Details & Timestamps for each property.

# 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 = {
    "city": "Los Angeles",
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "US"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("solidcode/propwire-com-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 = {
    "city": "Los Angeles",
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "US",
    },
}

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

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

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

```

## CLI example

```bash
echo '{
  "city": "Los Angeles",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}' |
apify call solidcode/propwire-com-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=solidcode/propwire-com-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/7eJc2hljcwGOU35dG/builds/PrPf3HUIORwaHJMJ0/openapi.json
