
Global Sources Supplier Scraper
scrape.ly/store/cornerledger/globalsources-scraperLead generationE-commerce
2 monthly users

Get public Zillow property details from a home URL, street address, or search.
Turn Zillow home pages into clean, structured records. Paste home URLs, street addresses, or a city to search, and get price, address, beds and baths, living area, Zestimate, photos, MLS details, and listing agent when Zillow shows one. No Zillow account and no browser to manage.
Greenville, SC.isValid: false, and the rest of the run finishes.Greenville, SC.| Field | Type | What it does |
|---|---|---|
startUrls | array | Zillow home URLs (/homedetails/), search URLs, or building pages. |
addresses | array | US street addresses, for example 18 Zelma Dr, Greenville, SC 29617. |
searchQueries | array | Cities or neighborhoods, as you would type them into Zillow search. |
maxItems | integer | Maximum listings to return. Default 10 (0 = no limit). |
propertyStatus | string | FOR_SALE, RECENTLY_SOLD, or FOR_RENT, applied to location searches. |
extractBuildingUnits | string | On a building URL: disabled (one summary), all, or for_rent units, one row each. |
searchResultsDatasetId | string | A dataset whose rows have propertyUrl, detailUrl, or address; they are scraped like pasted URLs. |
proxyConfiguration | object | Datacenter proxy by default. |
{
"startUrls": [
{ "url": "https://www.zillow.com/homedetails/17-Zelma-Dr-Greenville-SC-29617/11026031_zpid/" }
],
"maxItems": 10,
"propertyStatus": "FOR_SALE"
}
Location search:
{ "searchQueries": ["Greenville, SC"], "maxItems": 5, "propertyStatus": "FOR_SALE" }
Each row is one listing. The dataset table shows address, price, beds, baths, type, status, Zestimate, and the property URL.
| Field | Description |
|---|---|
zpid, propertyUrl, addressOrUrlFromInput | Zillow id, listing URL, and what you gave. |
address, listingAddress, coordinates | Address parts and latitude / longitude. |
price, listingPrice, lastSoldPrice, pricePerSquareFoot | Price fields. |
bedrooms, bathrooms, livingArea, lotArea, yearBuilt, homeType | Property facts. |
listingStatus, listingType, daysOnZillow, datePosted | Status and timing. |
zestimate, rentZestimate, monthlyHoaFee, propertyTaxRate | Zillow estimates and costs when shown. |
description, mainImage, listingPhotos, photoCount | Text and images. |
agent, broker, mls, attributionInfo | Listing agent, broker, and MLS details when present. |
resoFacts, parking | Structured property facts and parking. |
isValid, scrapedAt | Row status and timestamp. |
Real item from a test run (trimmed):
{
"zpid": 12345678,
"homeType": "SINGLE_FAMILY",
"bedrooms": 3,
"bathrooms": 2,
"livingArea": 1498,
"yearBuilt": 1953,
"zestimate": 267000,
"rentZestimate": 1772,
"photoCount": 27,
"listingPrice": { "amount": 275000, "currency": "USD", "formatted": "$275,000" },
"price": 275000,
"address": "123 Example St, Greenville, SC 29601",
"coordinates": { "latitude": 34.897034, "longitude": -82.44892 },
"listingStatus": "forSale",
"propertyUrl": "https://www.zillow.com/homedetails/123-Example-St-Greenville-SC-29601/12345678_zpid/",
"lotArea": { "value": 0.64, "unit": "Acres", "formatted": "0.64 Acres" },
"pricePerSquareFoot": 184,
"agent": null,
"mls": { "id": "1606268", "name": "Greater Greenville AOR" },
"mainImage": {
"thumbnail": "https://photos.zillowstatic.com/fp/0123456789abcdef0123456789abcdef-p_a.jpg",
"hiRes": "https://photos.zillowstatic.com/fp/0123456789abcdef0123456789abcdef-p_f.jpg"
},
"isValid": true
}
A URL or address that cannot be found saves no row and is not charged. It is listed in the run's status message and in failedInputs of the OUTPUT record, and the rest of the run completes.
$1 per 1,000 listings, which is $0.001 per result. A result is one listing saved. Inputs that could not be read are not charged.
Worked example: 5 homes cost $0.005 in result fees. Compute and datacenter proxy traffic are billed separately at standard rates; our measured total for a 5-home search at 2048 MB was about $0.0094, including the result fees.
Is it legal to scrape Zillow? The actor reads publicly visible listing pages only. You are responsible for using the data in line with Zillow's terms and local law.
Do I need a Zillow login or my own proxy? No. Datacenter proxy is built in and is the default.
Can I pass a Zillow search URL? Yes. A city, neighborhood, or filtered search URL is expanded into home pages, up to Maximum homes.
What if a home URL is wrong?
The run stays successful, saves no row for that URL and lists it under failedInputs in the OUTPUT record. Other homes in the run are still saved.
Are sold and rental listings supported? Set Listing status to recently sold or for rent for a location search. A pasted home URL is read as Zillow published it.
Why is a field empty?
Zillow does not show every field on every listing, for example agent contact details or days on Zillow, so those come back as null.
Every field below can be set in the run form, passed through the API, or saved as a task. Unset fields fall back to the defaults shown.
startUrlsarrayOptionalProperty or search URLs
Zillow home URLs (…/homedetails/…), search URLs, or building pages. Home URLs return one listing. Search URLs return homes up to the maximum.
addressesarrayOptionaldefault []Street addresses
US street addresses, for example 18 Zelma Dr, Greenville, SC 29617.
searchQueriesarrayOptionaldefault []Location searches
Cities or neighborhoods, the same way you would type them into Zillow search. Example: Greenville, SC.
maxItemsintegerOptionaldefault 10Maximum homes
Maximum number of listings to return. 0 means no limit.
searchResultsDatasetIdstringOptionalDataset of listing URLs
Optional dataset ID whose rows contain propertyUrl, detailUrl, or address. Those rows are scraped like pasted URLs.
Applies to location searches and search URLs.
propertyStatusenumOptionaldefault "FOR_SALE"Listing status
Which listings a location search should return. A home URL is read as published, whatever status you pick.
extractBuildingUnitsenumOptionaldefault "disabled"Units on a building page
On an apartment or building URL, return one building summary or one row per available unit.
proxyConfigurationobjectOptionaldefault {"useScrapelyProxy":true,"scrapelyProxyGroups":["DATACENTER…Proxy configuration
Proxy used to reach Zillow. Datacenter is the usual choice.
Every run writes its results to a dataset. Preview it in the dashboard, then export it or read it through the API.
| Field | Type | Description |
|---|---|---|
| address | string | Full property address |
| price | number | Listing price in USD |
| bedrooms | number | Bedrooms |
| bathrooms | number | Bathrooms |
| homeType | string | Home type such as SINGLE_FAMILY or CONDO |
| listingStatus | string | Normalized status: forSale, forRent, sold, pending, or other |
| propertyUrl | string | Zillow property page |
| zpid | string | number | Zillow property ID |
| zestimate | number | Zestimate |
| livingArea | number | Living area in square feet |
| isValid | boolean | False when the URL could not be read |
You pay for the events the actor reports, such as each result or page it produces. Platform usage is included in the event prices.
| Event | Charged when | Price |
|---|---|---|
| Result | One property listing saved from Zillow. | $0.001 |
Run this actor from your own code. Swap in your API token and the examples work as-is.
import { ScrapelyClient } from 'scrapely-client'
const client = new ScrapelyClient({ token: process.env.SCRAPELY_TOKEN })
// Start the actor and wait for the run to finish.
const run = await client.actor('roamandroof/zillow-detail-scraper').call({
"startUrls": [
{
"url": "https://www.zillow.com/homedetails/17-Zelma-Dr-Greenville-SC-29617/11026031_zpid/"
}
],
"addresses": [],
"searchQueries": [],
"maxItems": 10,
"propertyStatus": "FOR_SALE",
"extractBuildingUnits": "disabled",
"proxyConfiguration": {
"useScrapelyProxy": true,
"scrapelyProxyGroups": [
"DATACENTER"
]
}
})
// Read the dataset the run produced.
const { items } = await client.dataset(run.defaultDatasetId).listItems()
console.log(items)Tokens live in your account settings. Keep them server-side: a token carries the full permissions of your account.
Connect the Scrape.ly MCP server once and your agent can run this actor as a tool. Pick your tool:
Fetch scrape.ly/agents.md and run roamandroof/zillow-detail-scraperPaste into Claude Code, Codex, Cursor or any AI agent. It signs you in once in the browser.
{
"mcpServers": {
"scrapely": {
"url": "https://api.scrape.ly/mcp?tools=actors,runs,storage,docs&actors=roamandroof/zillow-detail-scraper"
}
}
}No key in the file: your client opens the browser to sign you in the first time it connects.
Inputs the developer prepared for common jobs. Open one to see its input, then copy it to your account to run it as-is or adjust it.
Property details for a location search.
Details for Austin, Denver, Seattle and one listing.
Recently sold properties with full details.
Scrape.ly gives you the infrastructure, the tooling, and the team to extract, process, and operationalize web data at any scale. Setup takes minutes. The advantage lasts forever.