How-to
How to run Recent Home Sales & New Homeowner Leads Scraper
Step-by-step: the exact input, what each field does, and the rows that come back from 274 town assessor databases.
You sell something people buy in their first months in a house: a new furnace, a roof, a security system, home insurance. The people who just bought in your towns are on public record, in each town assessor’s online database. In Connecticut, 72 towns publish theirs on the same Vision Government Solutions platform, and each one is a separate site. Its Sales Search shows 20 sales a page, and the buyer’s name and mailing address sit on a separate property page per sale. A month of sales in one mid-size town like Fairfield was 36 sales on 28 October 2026, so doing it by hand means 36 page opens plus the searches, for every town you serve.
What you’ll need
Nothing but an Apify account. The actor talks to the assessors’ databases directly.
No API key, no proxy, no CAPTCHA. Our first run on Apify (28 October 2026, a test customer account) went out on Apify’s ordinary connection and returned 3 Fairfield sales in 12 seconds. The proxy setting stays off unless a run reports that a database refused it.
Step 1: Open the actor
Open Recent Home Sales & New Homeowner Leads Scraper on the Apify Store and press Try for free. The actor’s own page on this site lists its live health and pricing.
Step 2: Fill in the input
| Field | Type | Required | What it does |
|---|---|---|---|
state | string | no | The state to search. Covered: the cities, towns and counties whose assessor publishes its records on a Vision Government Solutions online database (274 in all). (default CT) |
cities | array | no | City or town names, e.g. ‘New Haven’ or ‘Canton’. In Virginia and Pennsylvania, a county or independent city, e.g. ‘Gloucester County’. Leave empty to search every city and town in the state. |
city | string | no | One city or town; kept for saved tasks and API callers that send one value. Combined with ‘Cities or towns’. |
soldWithinDays | integer | no | Sales recorded in this many days up to today. (default 30) |
dateFrom | string | no | Start date, YYYY-MM-DD. Overrides ‘Sold within the last’. |
dateTo | string | no | End date, YYYY-MM-DD. Defaults to today. |
propertyTypes | array | no | Which sales to return: single_family, condo, multi_family, vacant_land, commercial, other. (default ['single_family', 'condo', 'multi_family']) |
minPrice | integer | no | The default of 1 leaves out $0 deeds (transfers between family members or into a trust). Set 0 to include them. (default 1) |
maxPrice | integer | no | Optional upper price limit. |
includeOwnerDetails | boolean | no | Open each property’s record for the buyer, the seller, the owner’s mailing address, beds, baths, year built and assessed value. (default True) |
maxResults | integer | no | Spend cap for the whole run, across every city and town, not per city. (default 1000) |
Two fields decide what you get. soldWithinDays has to fit the town’s own posting schedule: when we checked 24 towns on 28 October 2026, four had sales from the week before, most were one to three months behind, and about nine showed nothing since July because they update once a year. If a town comes back empty at 30 days, try 90 before deciding it had no sales. The other is cities: leave it empty and the run covers every covered town in the state (72 in Connecticut), which is what a statewide mailing wants but costs accordingly.
A working input:
{
"state": "CT",
"cities": [
"Bridgeport",
"Fairfield",
"Trumbull"
],
"soldWithinDays": 30
}
Step 3: Run it
Press Start. The run log prints one line per town with its sale count and its newest sale date.
In our test runs on 28 October 2026, that input returned 112 sales (43 in Bridgeport, 36 in Fairfield, 33 in Trumbull) in 24 seconds. A run over all 72 Connecticut towns for the same 30 days returned 628 sales in a little over 3 minutes, with 28 towns posting no sales in that window. An empty result is a free notice row saying so, not a silent zero; widen the window before suspecting the actor.
Step 4: Read the output
Each run returns a labelled table, not raw JSON:
Every row looks like this, a real row from a real run:
{
"state": "CT",
"city": "Branford",
"address": "17 BALLOU RD",
"sale_date": "2026-09-28",
"sale_price": 340000,
"property_type": "single_family",
"model": "Residential",
"style": "Ranch",
"living_area_sqft": 710,
"land_area_sqft": 10454,
"buyer": "LUCY & DIANE DEVELOPERS LLC",
"owner_is_buyer": true,
"owner_mailing_address": "302 FIELD POINT RD, BRANFORD, CT 06405",
"owner_mailing_zip": "06405",
"absentee_owner": true,
"book_page": "1436/0747",
"previous_sale_price": 208000,
"previous_sale_date": "2021-04-27",
"year_built": 1950,
"bedrooms": 2,
"bathrooms": 1.0,
"heat_type": "Hot Water",
"assessed_value": 202400,
"appraised_value": 289100,
"photo_url": "https://gis.vgsi.com/photos/BranfordCTPhotos/0035/BALLOU%20RD%2017_35226.jpg",
"source_url": "https://gis.vgsi.com/BranfordCT/Parcel.aspx?pid=8075"
}
| Field | Example value | Meaning |
|---|---|---|
sale_date, sale_price | 2026-09-28, 340000 | When the sale was recorded and for how much |
city, state, address | Branford | The property sold |
property_type | single_family | single_family, condo, multi_family, vacant_land, commercial or other; plus the town’s own model and style |
buyer | LUCY & DIANE DEVELOPERS LLC | The new owner, from the sale history on the property record |
owner_mailing_address | 302 FIELD POINT RD, BRANFORD, CT 06405 | Where the owner gets mail, also split into street, city, state and ZIP |
owner_is_buyer | True | True when the owner of record (and the mailing address) is this sale’s buyer; false when the town has not updated the record yet |
absentee_owner | True | True when the buyer’s mailing address is somewhere else: an investor, landlord or second-home buyer |
seller, previous_sale_price, previous_sale_date | 2021-04-27 | The previous owner and what they paid |
The field people come for is owner_mailing_address, and the one to check before mailing is owner_is_buyer. When a town records a sale before it updates the property record, the owner and address shown are still the seller’s; that was 15 of the 628 Connecticut sales above, and those rows carry no buyer. Filter them out of a welcome mailer. absentee_owner was true on 85 of the 628: those buyers get mail somewhere other than the house, so a door hanger misses them and the mailing address reaches them.
Step 5: Export it
Open the Dataset tab and export to CSV, JSON or Excel, or pull the same rows from the API, which is what you want if this is going to run on a schedule.
What it costs
$0.02 per sale delivered. Notices are free: a town with no sales in the window, a database that did not answer, a run cut short. The three-town input above came to 112 sales, $2.24; the 72-town Connecticut month was 628 sales, about $12.56. Set maxResults to cap a run before you start it. Apify’s platform usage is billed separately per your plan.
Where the data comes from
This reads each town assessor’s online database, hosted by Vision Government Solutions at gis.vgsi.com, directly. Every night a canary runs this actor against that live source and diffs the result against a frozen fixture (what “verified” means).
Vision lists 286 databases across nine states, and we opened every one on 28 October 2026: 274 answer, while 7 have moved to another vendor, 3 Pennsylvania counties ask for a login and 1 returns an error. The sales search pages through postbacks whose row order is not stable between pages; without sorting first, our New Haven test skipped 60 of 179 sales. The actor sorts before paging, so you get every sale once.
See it used
Fairfield County CT New Homeowner Leads turns the three-town input above into a monthly mailing for a home-service company.
For every property in an area rather than only the recent sales, with owner lookups by address, use US Property Records Export & Owner Lookup.
Last updated 2026-10-28