Bid4Assets Scraper - County Tax Deed & Sheriff Sale Parcels avatar

Bid4Assets Scraper - County Tax Deed & Sheriff Sale Parcels

Pricing

$4.00 / 1,000 per lot returneds

Go to Apify Store
Bid4Assets Scraper - County Tax Deed & Sheriff Sale Parcels

Bid4Assets Scraper - County Tax Deed & Sheriff Sale Parcels

From $4.00 per 1,000 lots, no start fee. Every county tax-deed parcel and sheriff-sale property on Bid4Assets: 15,029 lots across 55 counties, measured. APN, minimum bid, close date, plaintiff, defendant, court case, debt amount. Optional per-parcel assessed value and due-diligence documents.

Pricing

$4.00 / 1,000 per lot returneds

Rating

0.0

(0)

Developer

Scrapers Delight

Scrapers Delight

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

5 days ago

Last modified

Share

Bid4Assets Scraper — County Tax Deed & Sheriff Sale Parcels

Every lot on Bid4Assets, at the grain a tax-deed fund actually underwrites: one row = one parcel, not one county sale.

$4.00 per 1,000 lots. No run-start fee. No login, no cookie, no API key.

Bid4Assets is where US county tax collectors and sheriffs sell tax-defaulted parcels and foreclosed property. On 2026-09-18 this Actor pulled the whole site and counted:

storefrontslotscounties
County tax sales4714,30432
Sheriff & foreclosure sales3672529
Total8315,02955

Across CA, FL, LA, NV, OK, PA, WA and WI. Those are counted numbers — the Actor summed each collection's own declared total and verified 15,029 distinct auction IDs, no duplicates, no short reads. Coverage changes as counties open and close sales; the run's RUN_SUMMARY always records what the site declared against what was actually read.


What one row is

One lot. Either a tax-defaulted parcel from a county tax-collector sale (upset, judicial, repository, tax-defaulted, tax-title, adjudicated), or a property in a sheriff / mortgage foreclosure sale. Both halves land in one dataset with one schema and one sort order, so you can work a single close-date-ordered list.

A real tax-sale row, with per-parcel enrichment on

Taken verbatim from a run on 2026-09-18 (auctionId 1261009, Monterey County CA), trimmed only where marked:

{
"auctionId": 1261009,
"recordType": "tax-sale-parcel",
"saleCategory": "tax-sale",
"saleType": "Tax Defaulted Property Sale",
"title": "Monterey County, CA: APN:003-145-002-000-Item No: 1",
"county": "Monterey County",
"state": "CA",
"stateName": "California",
"city": "Salinas",
"parcelId": "003-145-002-000",
"address": "116 N Main St | Salinas, CA",
"streetAddress": "116 N Main St",
"postalCode": null,
"minimumBid": 224300,
"currentBid": 224300,
"bidIncrement": 100,
"buyerPremiumPercent": 3,
"auctionStatus": "withdrawn",
"statusLabel": "Closed",
"isWithdrawn": true,
"auctionOpenDate": "2026-03-21T11:00:00",
"actualCloseDate": "2026-03-25T16:00:00",
"saleDate": "2026-03-25",
"assessedTotal": 236752,
"landValue": 159809,
"improvementsValue": 76943,
"assessedYear": "2025-2026",
"equityMarginEstimate": 12452,
"discountVsAssessedPct": 5.3,
"countyItemNumber": "1",
"parcelMapUrl": "https://www.bid4assets.com/info/sfid17554/Maps/003-145-002.pdf",
"gisUrl": "https://maps.co.monterey.ca.us/wab/parcelreportwebapp/?marker=-121.654,36.680…",
"dueDiligenceDocuments": [
{ "name": null, "url": "https://www.bid4assets.com/info/sfid17554/Legals/003-145-001.pdf" },
{ "name": "County Terms of Sale", "url": "https://www.bid4assets.com/storefront/viewDueDiligence/24176?key=85082495-…" },
{ "name": "California Revenue and Taxation Code", "url": "https://www.bid4assets.com/storefront/viewDueDiligence/24177?key=36e30c23-…" }
],
"itemSpecifics": {
"Parcel Information": { "APN": "003-145-002-000", "County Item No": "1", "Address": "116 N Main St | Salinas, CA", "Community": "Salinas" },
"Assessed Values": { "Assessed Values From": "2025-2026", "Improvements": "$76,943.00", "Land Value": "$159,809.00", "Total Assessed Values": "$236,752.00" },
"Tax Bill": { "Ad Valorem": "$236,752.00" }
},
"sellerName": "Monterey County",
"storefrontUrl": "https://www.bid4assets.com/storefront/MontereyMar26",
"saleWindow": "March 21st - 25th",
"sourceUrl": "https://www.bid4assets.com/auction/index/1261009",
"scrapedAt": "2026-09-18T19:37:01.569Z"
}

Note isWithdrawn: true while the site's own status still reads Closed. That lot's owner paid the back taxes and the county pulled it. See The withdrawn problem below.

A real sheriff-sale row

From the same day (auctionId 1305945), a lot that was still in preview:

{
"auctionId": 1305945,
"recordType": "sheriff-sale-property",
"saleCategory": "sheriff-sale",
"saleType": "HUD Foreclosure Sale",
"title": "Philadelphia County, PA Sale: 1913 N. Hancock Street",
"county": "Philadelphia County",
"state": "PA",
"city": "Philadelphia",
"parcelId": "183261000",
"address": "1913 N. Hancock Street, Philadelphia PA 19122",
"streetAddress": "1913 N. Hancock Street",
"postalCode": "19122",
"minimumBid": 242101,
"currentBid": 242101,
"bidCount": 0,
"attorneyHasSetMinimumBid": true,
"auctionStatus": "preview",
"statusLabel": "Preview",
"auctionOpenDate": "2026-09-21T10:00:00",
"saleDate": "2026-09-21",
"timeLeftSeconds": 249560,
"plaintiff": "Secretary of Housing and Urban Development",
"defendant": "Rosa Romero",
"attorney": "Stephen Hladik",
"courtCase": "26-01126-1",
"debtAmount": 242100.57,
"township": "Philadelphia",
"sellerName": "Philadelphia County",
"storefrontUrl": "https://www.bid4assets.com/phillyhudpa",
"sourceUrl": "https://www.bid4assets.com/auction/index/1305945",
"scrapedAt": "2026-09-18T19:40:39.645Z"
}

Every field, with its measured fill

Counts are from real captured bytes on 2026-09-18, recomputed by offline_validate.mjs on every run so these numbers cannot drift away from the data. "N/A", "-", "" and link placeholders like "Click Here" are not counted as filled.

On every lot, both halves — 0 extra requests (N = 15,029)

fieldfillwhat it is
auctionId15,029 / 100.0%Bid4Assets' own lot id
recordType15,029 / 100.0%tax-sale-parcel or sheriff-sale-property
saleCategory15,029 / 100.0%tax-sale or sheriff-sale
saleType15,028 / 100.0%Tax Upset / Judicial / Repository / Defaulted / Title / Adjudicated / Sheriff / HUD
title15,029 / 100.0%the lot title, with any ***MARKER*** prefix lifted out
county15,029 / 100.0%in the site's own wording — "Vermilion Parish", never an invented "County"
state, stateName15,029 / 100.0%two-letter code and full name
parcelId14,835 / 98.7%APN / PIN / parcel number, read out of the lot title
minimumBid14,999 / 99.8%opening bid. The 30 nulls are sheriff lots whose attorney has not filed one
currentBid14,999 / 99.8%
bidIncrement14,304 tax / 100.0%tax rows only
buyerPremiumPercent14,304 tax / 100.0%tax rows only; 287 counties charge a real 0%
auctionStatus15,029 / 100.0%preview · open · sold · closed · withdrawn · postponed · stayed · in_person
statusLabel15,029 / 100.0%the site's own wording, markup stripped
isWithdrawn15,029 / 100.0%true on 5,760 lots (38.3%)
isSealedBid15,029 / 100.0%
auctionOpenDate, auctionCloseDate, actualCloseDate, saleDate15,029 / 100.0%the site's naive local timestamps, kept verbatim
timeLeftSeconds2,498 / 16.6%set on exactly the preview + open lots; a withdrawn or stayed lot counts down to nothing
winningBid1,683 / 11.2%only on lots that sold
sellerName, storefrontName, storefrontSlug, storefrontUrl15,029 / 100.0%the county office running the sale
saleWindow14,304 tax / 100.0%e.g. "September 18th - 21st", off the site's own calendar
imageUrl14,304 tax / 100.0%
sourceUrl, scrapedAt15,029 / 100.0%

Sheriff / foreclosure rows only — the court record (N = 725)

fieldfill
address, streetAddress, courtCase, bidCount, attorneyHasSetMinimumBid725 / 100.0%
defendant724 / 99.9%
plaintiff710 / 97.9%
attorney694 / 95.7%
parcelId538 / 74.2%
township527 / 72.7%
debtAmount519 / 71.6%
sheriffNumber481 / 66.3%
postalCode461 / 63.6%
city352 / 48.6%

With includeParcelDetails on — 1 extra request per delivered lot

Counted over 92 real detail pages, two from each of the 47 tax storefronts. These are county-optional fields: a county that does not publish an assessment leaves it null, never 0.

fieldfillnote
parcelId92 / 100.0%the county's own table overrides the title-derived value
address92 / 100.0%situs address. Street number present on about half; 3 of 92 literally say "no site address"
dueDiligenceDocuments92 / 100.0%302 documents across the 92 pages — terms of sale, legals, maps, statutes
itemSpecifics92 / 100.0%the county's raw table, verbatim: tax rate area, recording fee, exemptions, personal property value, special assessments, fixtures…
sellerName92 / 100.0%
streetAddress89 / 96.7%
city79 / 85.9%
situsLocation74 / 80.4%
depositRequired60 / 65.2%
bidCount60 / 65.2%the bid box is dropped on some closed lots
countyItemNumber59 / 64.1%
assessedTotal54 / 58.7%
equityMarginEstimate, discountVsAssessedPct54 / 58.7%derived; null unless both the assessment and the opening bid are real
parcelMapUrl51 / 55.4%
legalDescription50 / 54.3%
gisUrl42 / 45.7%several counties' GIS links embed the parcel's lat/long
acreage41 / 44.6%
landValue32 / 34.8%
assessedYear28 / 30.4%
postalCode28 / 30.4%
improvementsValue25 / 27.2%
zoning22 / 23.9%
totalTaxBill15 / 16.3%
irsLiens13 / 14.1%a federal lien survives a tax deed in most states — worth knowing before you bid

The lot page prints a Minimum Bid on 60 of those 92 pages, and where it does it equals the API's minimumBid on 60 of 60. The two surfaces agree.

Enrichment also works on the sheriff half, where it mostly fills in the address. Counted over 56 real sheriff lot pages, up to two from each of the 29 sheriff storefronts that currently list lots:

fieldbeforeafter
situsLocation0 / 0.0%55 / 98.2%
itemSpecifics0 / 0.0%55 / 98.2%
city27 / 48.2%52 / 92.9%
postalCode32 / 57.1%51 / 91.1%
depositRequired0 / 0.0%46 / 82.1%
legalDescription0 / 0.0%23 / 41.1%
parcelId32 / 57.1%34 / 60.7%

Sheriff lots have no assessed values, no acreage and no due-diligence documents on their pages — the county publishes the court record instead, which is already in the base row.


What this Actor does that the other one does not

There is exactly one other Actor in the Apify store that names this site — confirmed by grepping all 12 store sitemaps (599,202 URLs), not just by searching. It reads the site's /api/search/process index. That is a different corpus:

  1. Parcel-level, not sale-level. The search index is an auction-event list. One of its rows reads "NOTICE OF SALE: Clinton County, Pennsylvania — Live Tax Deed Sale, 366 Deeds" — 366 parcels compressed into one row with no APN and no address. This Actor enumerates the county storefront collections instead and returns each of the parcels.
  2. 33× the corpus. The search index reported 437 live auctions on 2026-09-18 and hard-caps at total=999 on closed/all, so the sold and closed history — the comps a tax-deed fund underwrites against — cannot be enumerated through it at all. The storefront path returned 15,029 lots including 6,614 sold and closed ones.
  3. The sheriff-sale half. 725 properties across 29 counties with plaintiff, defendant, attorney, courtCase, debtAmount, sheriffNumber and township. No other Actor ships these for this site.
  4. Per-parcel enrichment at no extra charge — assessed values, legal description, acreage, zoning, IRS liens, the county parcel-map and GIS links, and every attached due-diligence document, all at the same per-lot price.
  5. isWithdrawn. See below.
  6. A completeness assertion. Every collection is floor-asserted against the API's own declared total and every sheriff page against its own "Total". A short read aborts the run instead of shipping a quietly incomplete list. RUN_SUMMARY records the reconciliation.
  7. No run-start fee. The other Actor charges $0.005 per GB of memory at start, on 4,096 MB — $0.02 before the first row.

The withdrawn problem

When a delinquent owner pays their back taxes before the sale, the county pulls the parcel. Bid4Assets has no status code for this. It prefixes the lot's own title with ***Withdrawn*** and leaves the structured row reading statusID: 6 / "Closed" — indistinguishable from a parcel that went to auction and got no bid.

Measured: 5,760 of 15,029 lots — 38.3% — are withdrawn. Six more are ***Stayed***. Anyone building comps off the raw status field is treating more than a third of the corpus as failed auctions when the tax was simply paid.

This Actor lifts the marker out of the title, sets auctionStatus and isWithdrawn accordingly, hands you a clean title, and gives you a switch (excludeWithdrawn) to drop them before you are charged for them.


Fields that are NOT shipped, and why

Every one of these was checked against the captured bytes and found empty. Shipping them would be a column of nulls.

not shippedmeasured
locatedCity, locatedState (parcel API)filled on 0 / 14,304 rows. City comes from the detail page instead
SaleType (sheriff rows)0 / 725
TimeZoneSuffix, CustomStayedStatusLabel, ImagesXML, DueDiligenceXML (sheriff rows)0 / 725 each
Images, DueDiligenceItems (sheriff rows)present as empty arrays on 725 / 725
reserve (tax rows)0 on all 14,304
beds, baths, square footage, year built, property typeBid4Assets publishes none of these on any surface. Zero matching keys in the parcel API, the sheriff rows, or the Item Specifics tables across 92 detail pages. A competing aggregator lists them in its schema; on this source they would be null
normalizedAddressa derived string; streetAddress / city / postalCode are shipped split instead
daysUntilAuctionshipped as timeLeftSeconds, the same fact at finer resolution

Inputs

inputwhat it does
saleTypestax-sale, sheriff-sale, or both (default)
statestwo-letter codes. Applied to the site's index page before any storefront is fetched
countiescounty / parish names, with or without the suffix
storefrontspin to named sales by slug, path or URL
auctionStatusany of the eight statuses
excludeWithdrawndrop the 38% of lots the county pulled
closingAfter / closingBeforeYYYY-MM-DD, on the sale date
minMinimumBid / maxMinimumBidopening-bid range
includeParcelDetailsopen each delivered lot's page for the county's own table
maxLotshard cap on rows delivered — and therefore charged. 0 = no cap
concurrency1–16, default 8
proxyConfigurationoptional; datacenter by default

The state and county filters read the site's own index pages, which already carry every storefront's county, state, sale type and date window. Narrowing makes the run cheaper, not just smaller: the prefilled demo (Louisiana sheriff sales, 25 rows) issues 10 requests, where an unfiltered full-site walk issues 235.

A state code that is not a US state fails the run before it charges you, rather than returning a convincing empty result.


Pricing

$0.004 per lot delivered — $4.00 per 1,000. No run-start fee.

You are charged once per row that reaches your dataset, at the same price whether or not per-parcel enrichment is on. You are not charged for:

  • lots excluded by any filter or by maxLots
  • a storefront that exists but currently lists no lots (7 of the 83 on 2026-09-18 — they are listed by name in RUN_SUMMARY)
  • a storefront that could not be read after retries
  • a run that matches nothing

Speed and reliability, measured

  • Whole site, no filters: 235 requests → 15,029 lots, 37.1 s wall clock through the Apify datacenter proxy, 14.79 MB on the wire, peak RSS 248 MB.
  • Per-parcel enrichment: 12.4 requests/second measured over 92 pages through the Apify residential proxy, 92 / 92 HTTP 200.
  • No anti-bot anywhere on the data path. The Apify datacenter and residential pools returned byte-identical HTTP 200s to a home IP on every surface. ~700 requests in a day, zero blocks, zero 429s. No login and no CSRF token is needed for anything this Actor reads.
  • Transport failures are retried on a fresh proxy session, never mistaken for the end of the data. During the full-site run three requests failed transiently (a socket hang-up, a proxy 590 UPSTREAM502, a TLS disconnect); all three succeeded on retry and the run still delivered 15,029 of 15,029 declared rows. An HTTP 200 carrying an anti-bot interstitial is treated as a failure, not as data.
  • Short reads abort the run. Both large-body surfaces are gzipped — one of them Transfer-Encoding: chunked with no Content-Length at all — so the header cannot be trusted to detect truncation. The site's own declared counts are used instead.

Bid4Assets is the auction platform US county tax collectors and sheriffs use to publish statutory sale notices. The underlying notices are public by law: California Rev. & Tax. Code §§ 3691–3702, the Pennsylvania Real Estate Tax Sale Law (72 P.S. § 5860.601 et seq.) for upset, judicial and repository sales, and the equivalent state sheriff-sale statutes. The named seller on every storefront is the county office itself.

bid4assets.com serves no robots.txt — /robots.txt returns 404 (an HTML soft-404 of 31,807 bytes), and there is no /sitemap.xml. There is therefore no Disallow line to quote here; that is stated plainly rather than implied as permission. This Actor reads only the public pages and the public JSON endpoints those pages call, unauthenticated, exactly as a visitor's browser does. It does not log in, does not bid, and does not touch the one path that requires an account (the storefront's "Download Property List Spreadsheet" button, which is a convenience export of rows the open API already returns).

This Actor is independent and not affiliated with or endorsed by Bid4Assets.


Honest limits

  • Bid4Assets is not every US county. It is a rotating set — 55 counties in 8 states today. A county that is not currently running a sale on the platform is not in the data, and no filter will conjure it. RUN_SUMMARY and the run log list exactly which counties were available.
  • Tax-sale storefront slugs are dated (AlamedaMar26, MonroePATaxOct26) and turn over every sale season. Pinning a run with storefronts will break eventually; states and counties will not.
  • City and street address are not on the tax-sale API at all. locatedCity and locatedState are filled on 0 of 14,304 rows. Situs address and the county's assessment only exist on the lot's own page, which is why includeParcelDetails costs one request per lot. County and state are still 100% filled without it.
  • Assessed values are county-optional. 58.7% total assessed, 34.8% land, 27.2% improvements over 92 pages. Legal description 54.3%, acreage 44.6%. Those are the measured rates, not a promise, and they vary a lot by county.
  • parcelId is null on 194 of 15,029 lots (1.3%) without enrichment. 7 of those are tax lots whose title is a multi-parcel bundle listing two or three APNs joined by "&" or "," — null rather than silently returning only the first one. (With includeParcelDetails on, the county's own table lists the bundle in full: "12220-50-10201 & 30-10320". That is also why the detail value overrides the title-derived one on 4 of 92 sampled tax pages — every disagreement is a truncated bundle, and the detail page is the correct one.) The other 187 are sheriff lots; the detail page recovers only a couple more, because those counties genuinely publish no APN.
  • 30 sheriff lots publish no opening bid because the plaintiff's attorney has not filed one. minimumBid and currentBid are null on those, never 0; attorneyHasSetMinimumBid tells you which.
  • Timestamps are the site's own naive local times, kept verbatim rather than being given an invented timezone. timeLeftSeconds is computed against the site's stated Eastern wall clock.
  • The storefront's marketing blurb is not a coverage target. Of the 24 tax storefronts that advertise a parcel count, only 18 match what the API returns — withdrawn lots are still returned. The Actor floor-asserts against the API's own total, which matched on 47 of 47 storefronts.
  • No contact data. There is no per-lot phone or email anywhere on the site; the seller is the named county office, which is what sellerName carries. The two mailto addresses on the site are corporate.
  • Historical depth is what the site keeps. 6,614 of today's lots are sold or closed. This is a live mirror of the platform, not an archive: once a county removes a storefront, those lots are gone from the source.