Zillow Transactions Scraper

An agent's track record,
as rows you can total.

Point it at a zillow.com/profile/ page and every transaction listed on it comes back as a row - the address, the price, the type and status of the deal, the date, beds, baths, square footage, the property type, which side the agent was on and a link to the listing.

one-time 500 free rows$0.002 per row after13 columnsCSV · XLSX · JSON
How it works

Name the agent,
not the property.

This is the one input that matters, and it is worth saying plainly: you do not search for houses here. You give it an agent's Zillow profile and get back what that agent transacted.

  1. STEP 1Sign in to the platform.
  2. STEP 2Open the Zillow Transactions Scraper.
  3. STEP 3Paste your agent profile URLs - https://www.zillow.com/profile/agent-name/ - one per line, or upload a CSV, XLSX, TXT or Parquet file.
  4. STEP 4Set a limit per query, or leave it at zero to take everything on the profile.
  5. STEP 5Point the run at a residential proxy. Without one Zillow returns nothing.
  6. STEP 6Choose your output format and click Get Data.

One row per transaction, tagged with the profile URL it came from. Pages are fetched through our proxy pool rather than your real IP - but the pool alone is not enough here, which the section below explains.

Why teams use it

What an agent actually did,
not what they claim.

A track record you can add up

A profile page shows transactions as cards you scroll. As rows, the same information totals, sorts and filters - by price, by date, by property type, by which side of the deal the agent was on. That is the difference between reading a profile and measuring one.

Property detail on every row

Each transaction carries the address, beds, baths, square footage and property type alongside the price, so you are not comparing a studio against a five-bedroom on headline price alone. The listing URL comes too, for when you need to go back to the source.

A whole list of agents in one run

Paste a column of profile URLs, or upload the file you already keep them in, and the run works through the lot. Every row is tagged with the profile it came from, so one file can hold a whole brokerage or a whole market and still split cleanly by agent.

Before you run it

Zillow needs a residential proxy,
and the failure is silent.

This is the first thing to know about this scraper, so it is not buried further down the page.

Zillow sits behind PerimeterX. A run without a residential proxy does not error, does not warn and does not stop - it finishes successfully and hands you a file with the thirteen-column header row and nothing under it. That is a much worse failure than a crash, because an empty file looks exactly like an agent who has no transactions listed. If a profile you know is busy comes back empty, check the proxy before you check anything else.

We are in a position to say this with some confidence rather than as a disclaimer. Every run export we hold for this service is empty, and so is every one for our other two Zillow profile scrapers - the agents and reviews services - across runs spread over several months. Every one of them carries a correct header row and zero data rows. That is a consistent, well-corroborated picture of what happens without a residential exit, and it is why the requirement is stated in the hero rather than in a footnote.

The consequence for this page is that the column names are solid and the cell contents are not. The thirteen names below, and their order, are confirmed twice over - by the XLSX header row of five separate runs and by the published column array, which agree exactly. What we will not do is tell you what the values look like, because we have not seen one. Where a description below would have needed a format, a scale or a vocabulary, it says so instead of guessing.

Data dictionary

Thirteen columns,
in export order.

The export's header row, in order. Descriptions say what each field is for; they deliberately claim nothing about its format, scale or vocabulary - see the note above.

query
The agent profile URL you submitted, repeated on every row that came from it. This is how one file holding many agents splits cleanly back into one per agent.
agent
The agent whose profile the transaction was listed on.
address
The property's address. We have not seen this populated, so do not assume whether it arrives as one line or split into parts.
price
The transaction price. Confirm the format against a real run before you parse it - we cannot tell you whether it carries a currency symbol, thousands separators or a bare number.
transaction_type
What kind of transaction it was. A separate column from status - that much is clear from the header row - but we have not seen its vocabulary, so do not code against a fixed set of values.
date
When the transaction happened. Format unconfirmed; parse defensively.
status
The transaction's status. Distinct from transaction_type, and like it, a vocabulary we have not seen populated.
beds
Bedroom count for the property. Whether it arrives as a number or a string is unconfirmed.
baths
Bathroom count. Same caveat, and worth noting that half-baths are commonly written in ways that are not integers.
sqft
The property's floor area. Unit and formatting unconfirmed.
property_type
What kind of property it is. Another vocabulary we have not seen, so treat it as open rather than as an enum.
represented
Which side of the deal the agent was on. This is the one column worth handling carefully. The name points at a side rather than a person, but we have never seen it populated - so if a real run puts a name in it rather than a side, treat that cell as personal data. See the legal section.
listing_url
Link back to the property on Zillow, for when a row raises a question the file cannot answer.

The names are solid; the contents are not yet. The thirteen columns above and their order are corroborated by two independent sources - the XLSX header row of five separate run exports and the published column array - so build your schema around those names with confidence. What this page will not tell you is what the cells hold: every export we hold is a header with no rows beneath it. Note the one structural point you can rely on: transaction_type and status are two distinct columns, so they are not two names for the same thing, whatever their vocabularies turn out to be. And Zillow sits behind PerimeterX, so a live run needs a residential proxy - that is the reason those exports are empty, not any doubt about the column set.

What it accepts

An agent profile,
not a property search.

One URL per line, and it has to be a profile page. A listing URL or a search result is a different kind of page and not what this run reads.

https://www.zillow.com/profile/agent-name/ One profile URL per line CSV · XLSX · TXT · Parquet upload Limit per query, or 0 for everything One row per transaction Never your real IP PerimeterX - residential proxy required No sort option
Common workflows

Three jobs people
most often run here.

A few examples of what a track record is worth once it is a table rather than a page you scroll.

Agent research

Compare agents on what they actually closed

Run a shortlist of profile URLs and put their transactions side by side - price bands, property types, which side of the deal they usually sit on. It is a far better basis for choosing or recruiting an agent than the summary numbers a profile page chooses to show.

Brokerage · Recruiting
Market view

Build a picture of who is active where

Feed in the agents working a market and the combined file shows the shape of it - what is transacting, at what prices, in what kind of property. Every row keeps its profile URL, so the aggregate never loses track of who did what.

Market research · Strategy
Verification

Check a claim against the record

An agent's pitch and an agent's profile do not always tell the same story. Pulling the transactions as rows lets you total them yourself instead of taking a headline figure on trust - and the listing URL on each row is there for when you need to look one up.

Due diligence · Compliance
Pricing

Pay only for the transactions
you actually pull.

No subscription, no minimum, no recurring bill. Your first 500 rows are on us - after that, pay-as-you-go at the same flat rate as every other scraper here.

Free tier

500 free rows - $0

Every new account, one-time. No credit card required. Per-query limits, file upload and every export format included. The residential proxy this scraper needs is yours to supply, on the free tier and after it.

$0 forever
Pay-as-you-go

$0.002 per row, after the free tier

The same flat rate as every other scraper on the platform. The pre-flight estimator shows the row count and credit cost before a run starts - no surprise bills, no compute units to translate.

Most popular
Volume

Custom · high volume

Volume pricing, dedicated workers and an SLA for running many agent profiles on a schedule. Tell us your numbers and we will quote.

Talk to us
10% off your first paid run.Use code LIVESCRAPER10 at checkout.
Sign up
Pairs well with

What this export
does not carry.

Thirteen columns about deals and properties, and no way to contact anybody. These three cover the ground around it.

The legal bit

Is it legal to scrape
Zillow profiles?

Short answer: the transactions are published on a public profile, but Zillow's own terms are the part that actually governs this - and they are stricter than the page being public would suggest.

Everything in these thirteen columns is shown on a public Zillow agent profile to any visitor, signed in or not. No login is used, no paywall is crossed and no account is touched, and the run is fetched through our proxy pool rather than your own IP. In the United States, property transaction records are also public record in most states, so the underlying facts are not secret ones.

That is not the same as permission. Zillow's terms of use restrict automated access to their site, and PerimeterX is there because they mean it. "The page is public" is an argument about the data, not about the contract you accept by using the site - so read those terms and decide whether your use is consistent with them before you scale a run. This is the sort of page where that sentence is the important one, and we would rather put it here than in small print.

On personal data: this export is about a professional and a property. The agent is a named individual acting in a business capacity and the other columns describe deals and buildings, so it sits much lighter than a consumer dataset would. One caveat we will not paper over - represented is the one column whose contents we have never seen. Its name points at which side of a deal the agent was on, but if a real run puts a person's name there instead, that is personal data and the GDPR or UK GDPR obligations that follow are yours as the controller. Check that column on your first run. We run no third-party trackers on the data layer, and your exports auto-delete after 30 days.

livescraper.app · principles
Public profile pages only
No logins, no accounts touched
Never your real IP
Zillow's terms restrict automated access - read them!
Exports auto-delete (30 days)
Check Zillow's own terms before scaling.
Common questions

Things people
ask before signing up.

The questions we hear most. Anything else? Talk to us - humans, not bots, write the answers.

How do I scrape Zillow transactions?+
Using the Zillow Transactions Scraper: sign in to the platform, open the Zillow Transactions Scraper, paste your agent profile URLs - https://www.zillow.com/profile/agent-name/ - one per line (or upload a CSV, XLSX, TXT or Parquet file), set a limit per query or leave it at zero to take everything on the profile, point the run at a residential proxy, then choose your output format and click Get Data.
What do I put in as input?+
A Zillow agent profile URL, one per line. Not a listing and not a search result - this run reads a profile page and returns the transactions listed on it. You can paste them one per line or upload a CSV, XLSX, TXT or Parquet file with a column of them.
Do I need a residential proxy?+
Yes. Zillow sits behind PerimeterX and a run without a residential proxy comes back with nothing. Every run export we hold for this service is empty, as is every one for our other two Zillow profile scrapers - the agents and reviews services - each a correct header row with zero data rows beneath it. Supply a residential exit and that is the difference between an empty file and a full one.
Why did my run finish successfully but return an empty file?+
Almost certainly the proxy. This is the failure mode worth knowing about, because it is silent: the job does not error or warn, it completes and hands you the thirteen-column header with nothing under it. An empty file looks identical to an agent with no transactions listed, so check the proxy before you conclude anything about the agent.
What columns will I get?+
Thirteen, in this order: query, agent, address, price, transaction_type, date, status, beds, baths, sqft, property_type, represented and listing_url. Those names and that order are confirmed twice over - by the XLSX header row of five separate run exports and by the published column array, which agree exactly.
What do transaction_type and status contain?+
We are not going to tell you, because we have not seen them populated. What is verifiable from the header row is that they are two separate columns rather than two names for the same thing. Confirm both vocabularies against a real run before you code against a fixed set of values - that goes for property_type as well.
Does the export include the agent's contact details?+
No. There is no email, phone or contact column among the thirteen - this export tells you what an agent transacted, not how to reach them. If you need that, our Email Addresses Finder takes a name and a company domain and returns a work address with a status saying how sure it is.
Is it legal to scrape Zillow?+
The transactions are shown on a public agent profile and, in most US states, property transaction records are public record - so the underlying facts are not secret. But Zillow's terms of use restrict automated access to their site, and that is the part that actually governs this. Read them and decide whether your use is consistent with them before you scale a run.
How much does it cost?+
The first 500 rows are free and one-time, with no credit card. After that it is $0.002 per row - the same flat rate as every other scraper on the platform. The estimator shows the cost of a run before it starts. The residential proxy is a separate cost, and it is on you.

Turn a profile page
into a track record you can total.

Your first 500 rows are free - no card, no subscription. After that it is $0.002 per row, flat.

Activates instantly · no card required

Scrape an agent's transactions from Zillow

A Zillow agent profile lists the transactions that agent has been part of, as cards you scroll through. The Zillow Transactions Scraper turns that into rows. The input is a zillow.com/profile/ URL - an agent, not a listing and not a search - pasted one per line or uploaded as a CSV, XLSX, TXT or Parquet file, and every transaction on the profile comes back as a record with the address, the price, the transaction type and status, the date, beds, baths, square footage, the property type, which side the agent represented and a link to the listing. Thirteen columns, one row per transaction, each tagged with the profile URL it came from so a file covering a whole brokerage still splits cleanly by agent.

One thing needs saying before you plan a run. Zillow sits behind PerimeterX, and a run without a residential proxy returns nothing. Worse, it does not tell you: the job finishes successfully and hands you the thirteen-column header row with no data under it, which looks exactly like an agent who has no transactions listed. Every export we hold for this service is in that state, as is every one for our other two Zillow profile scrapers, across runs spread over several months - which is why the requirement is stated at the top of this page rather than in a footnote.

That has an honest consequence for what this page claims. The column names are confirmed and the cell contents are not. The thirteen names and their order are corroborated by two independent sources - the XLSX header row of five separate runs and the published column array - so you can build a schema around them with confidence. But we will not tell you what format price or date arrive in, what vocabulary transaction_type, status and property_type use, or whether beds, baths and sqft are numbers or strings, because we have never seen one populated. What is verifiable from the header alone is that transaction_type and status are two distinct columns rather than two names for one thing.

On the legal question: the transactions are published on a public profile, and in most US states property transaction records are public record - but Zillow's terms of use restrict automated access, and that is the part that governs this rather than the page being public. Read them before you scale. Note too that there is no contact column anywhere in this export: it tells you what an agent sold, not how to reach them. Start free: your first 500 rows cost nothing and need no credit card, and after that it is $0.002 per row, flat - with the residential proxy as a separate cost, and yours.