Zillow Photos Scraper: Full-Res Listing Images avatar

Zillow Photos Scraper: Full-Res Listing Images

Pricing

from $0.73 / 1,000 photos

Go to Apify Store
Zillow Photos Scraper: Full-Res Listing Images

Zillow Photos Scraper: Full-Res Listing Images

Download every photo from any Zillow listing at full resolution (up to 1536px), by URL or ZPID. One row per photo. No login, no API key. Works in Claude, ChatGPT & any MCP-compatible AI agent.

Pricing

from $0.73 / 1,000 photos

Rating

0.0

(0)

Developer

The Mine Works

The Mine Works

Maintained by Community

Actor stats

0

Bookmarked

6

Total users

2

Monthly active users

2 hours ago

Last modified

Share

16 full size Zillow listing photos in 4 seconds

From The Mine Works, makers of Threads Scraper and B2B Leads Finder, with over 140,000 runs across 170+ public actors. This actor ranks #2 for "zillow photos" in Apify Store search.

Give it Zillow listing links or ZPIDs and get every listing photo as its own row, at the largest size Zillow serves (up to 1,536 pixels wide), with the property's ZPID, address and the photo's position in the gallery.

Why choose this actor?

  • The whole gallery, full size, in seconds. In our 2 October test, a Beverly Hills listing returned all 16 photos in 3.9 seconds, each as a direct photos.zillowstatic.com link at up to 1,536 pixels wide.
  • $0.73 per 1,000 photos on every plan, failures free. You pay per photo delivered. A listing Zillow refuses or has removed comes back as a free error row, so you can see it was tried and run it again.
  • No Zillow login, API key or proxy setup. Paste links or bare ZPIDs, including straight from our Zillow search actors' output. The proxy each request needs is included in the price.

Run it on Apify

Part of The Mine Works Real estate family: Zillow Rentals Scraper, Zillow Sold Comps Scraper, Housing.com Scraper, India Real Estate MCP, Zillow Property Scraper, 99acres Scraper.

Try it in one minute

Paste this into the JSON tab of the input page and press Start. It returns up to 25 photos in a few seconds.

{
"urls": ["https://www.zillow.com/homedetails/9837-Easton-Dr-Beverly-Hills-CA-90210/20532709_zpid/"],
"maxPhotosPerProperty": 25
}

Give listings in urls as full Zillow homedetails links or as bare ZPIDs (the number before _zpid, such as 124839253). Both forms worked in our tests. The listing links and ZPIDs from our Zillow Listings Scraper and Zillow ZIP Code Bulk Search go in unchanged.

Apify's free plan includes $5 of credit every month, which covers about 6,600 photos at this actor's price ($0.73 per 1,000 photos on every plan, plus the $0.005 start fee on each run, in runs of 10 listings with 25 photos each).

Copy to your AI assistant

themineworks/zillow-photos on Apify. Returns every photo of each Zillow listing you give it as one row per photo, at up to 1536 px wide: zpid, address, photoIndex, photoCount, url (direct image link), sourceUrl, scraped_at. Call ApifyClient("TOKEN").actor("themineworks/zillow-photos").call(run_input={...}), then client.dataset(run["defaultDatasetId"]).list_items().items. Required: urls (array of Zillow homedetails URLs or bare ZPIDs). Optional: maxPhotosPerProperty (integer 1 to 60, default 25), maxItems (cap on listings processed, 1 to 2000, default all). Listings Zillow refuses come back as _type "error" rows and are not charged; _type "summary" and "info" rows are run reports and are never billed. Full spec: GET https://api.apify.com/v2/acts/themineworks~zillow-photos/builds/default (Bearer TOKEN), which returns inputSchema and readme. Token: https://console.apify.com/account/integrations?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral

Key features

  • One row per photo. Each row carries the image link plus photoIndex and photoCount, so you can rebuild the gallery in Zillow's order or keep just the first photo as a cover.
  • The largest size Zillow serves. The actor picks the biggest JPEG Zillow lists for each photo, up to 1,536 pixels wide (links end in uncropped_scaled_within_1536_1152.jpg or cc_ft_1536.jpg).
  • Up to 60 photos per listing. maxPhotosPerProperty sets the cap (default 25); set it to 60 to take whole galleries.
  • Up to 2,000 listings per run, with maxItems to cap how many of your list are processed.
  • Links or ZPIDs, mixed. A bare ZPID is turned into its Zillow listing link for you.
  • A free error row for every miss. If Zillow refuses a listing after two tries, you get a _type: "error" row with the input and the reason, and no charge.

How to use it

{
"urls": ["https://www.zillow.com/homedetails/9837-Easton-Dr-Beverly-Hills-CA-90210/20532709_zpid/"],
"maxPhotosPerProperty": 60
}

Our test of this input returned 16 photos, the full gallery, in 3.9 seconds.

{
"urls": [
"https://www.zillow.com/homedetails/9837-Easton-Dr-Beverly-Hills-CA-90210/20532709_zpid/",
"124839253"
],
"maxPhotosPerProperty": 25
}

Listings are processed one after another with a short pause between them. In our test the bare ZPID 124839253 (a house in Austin, Texas) returned 25 photos, stopping at the cap.

Cover photos for a listings site or CRM

{
"urls": ["124839253", "20532709"],
"maxPhotosPerProperty": 1
}

With a cap of 1 you get just the first gallery photo of each listing, at $0.000727 a listing.

Photo archive for a portfolio

Feed the ZPIDs from a Zillow ZIP Code Bulk Search run into urls with maxPhotosPerProperty: 60, then download each url into folders named by zpid. Schedule it monthly (for example 0 5 1 * *) and compare url values with last month's to catch new or removed photos.

Listing quality checks

Count rows per zpid to find listings with few photos, or compare photoCount across a set of comparable homes before pricing or marketing a property.

Input parameters

ParameterTypeDefaultWhat it does
urlsarray of stringsrequired (form prefill: one Beverly Hills listing)Zillow homedetails listing links or bare ZPIDs.
maxPhotosPerPropertyinteger (1 to 60)25Most photos to return per listing.
maxItemsinteger (1 to 2,000)none (all listings in urls)Most listings to process from your list.

Run length. Each listing takes a few seconds plus a pause of 1 to 2 seconds before the next. The default run timeout is 300 seconds, which suits lists of a few dozen listings; for hundreds, raise the timeout in the run options. A run nearing its timeout stops cleanly and keeps the photos already delivered.

What data do you get?

One row per photo:

  • zpid: Zillow's property ID.
  • address: street, city, state and ZIP code, as one string.
  • photoIndex: the photo's position in the gallery, starting at 1.
  • photoCount: how many photos this run returned for the listing (after your maxPhotosPerProperty cap).
  • url: the direct image link on photos.zillowstatic.com, at up to 1,536 pixels wide.
  • sourceUrl: the link or ZPID you gave, so you can match rows to your input.
  • scraped_at: ISO timestamp.

A listing that could not be read gives one _type: "error" row with input and error (for example Property page HTTP 403). Each run ends with a _type: "summary" row (total_requested, total_properties, total_photos, total_failed, charged_for) and a _type: "info" row. None of these is a photo and none is charged. Skip rows that have a _type field when you load the data.

Stable fields for automations

All 7 photo fields were present in every photo row we sampled (44 rows: two test runs on 2 October and a scheduled platform run):

FieldWhat it holds
zpidZillow property ID, as text
addressFull address as one string
photoIndexPosition in the gallery, from 1
photoCountPhotos returned for this listing in this run
urlDirect full size image link
sourceUrlThe input that produced the row
scraped_atISO timestamp when the row was captured

We will not rename these fields. New fields may be added over time; existing ones keep their names.

Output examples

Real rows from our runs.

The last of the 16 photos of a Beverly Hills listing (2 October test, given as a link):

{
"zpid": "20532709",
"address": "9837 Easton Dr, Beverly Hills, CA, 90210",
"photoIndex": 16,
"photoCount": 16,
"url": "https://photos.zillowstatic.com/fp/c474b25d490a79a4bef01a22b4f9f09b-uncropped_scaled_within_1536_1152.jpg",
"sourceUrl": "https://www.zillow.com/homedetails/9837-Easton-Dr-Beverly-Hills-CA-90210/20532709_zpid/",
"scraped_at": "2026-10-02T08:40:53.613Z"
}

A photo from an Austin listing given as a bare ZPID:

{
"zpid": "124839253",
"address": "7200 Cordelia Ct, Austin, TX, 78741",
"photoIndex": 25,
"photoCount": 25,
"url": "https://photos.zillowstatic.com/fp/eb04f419c93c8c09e033fdc825455513-cc_ft_1536.jpg",
"sourceUrl": "124839253",
"scraped_at": "2026-10-02T08:41:26.236Z"
}

A listing Zillow refused on both tries (not charged):

{
"_type": "error",
"input": "https://www.zillow.com/homedetails/9837-Easton-Dr-Beverly-Hills-CA-90210/20532709_zpid/",
"error": "Property page HTTP 403"
}

The summary row of that run (never charged; run locally, so charged_for reads 0; on Apify it equals the photos charged; internal counters trimmed):

{
"_type": "summary",
"total_requested": 2,
"total_properties": 1,
"total_photos": 25,
"total_failed": 1,
"charged_for": 0,
"scraped_at": "2026-10-02T08:41:26.236Z"
}

Pricing

Pay per event: you pay for each photo delivered to your dataset, plus a small start fee per run. The photo price is the same on every Apify plan.

EventFreeBronzeSilverGold and above
photo-scraped, per photo$0.000727$0.000727$0.000727$0.000727
photo-scraped, per 1,000 photos$0.727$0.727$0.727$0.727
apify-actor-start, per run$0.005 per GB of run memory, minimum one eventsamesamesame

The start fee, exactly. Apify's apify-actor-start event is charged once when a run starts, at $0.005 for each GB of memory the run uses, with a minimum of one event. This actor runs on 512 MB by default, so a default run pays one event: $0.005.

Worked examples. Our 16 photo gallery costs about $0.0116 plus $0.005. 100 listings at the default 25 photos each (2,500 photos) cost about $1.82 plus $0.005. Cover photos only (maxPhotosPerProperty: 1) for 1,000 listings cost $0.727 plus $0.005.

Never charged: listings Zillow refuses or that cannot be read (the error rows), listings with no photos, retries, the proxy, and the summary and info rows. A run in which no listing can be read pays only the start fee.

There is no scheduled price change for this actor. The Pricing tab on this page always shows the rate for your own plan; if it and this table ever differ, the Pricing tab is right.

FAQ

What resolution are the photos? The largest JPEG Zillow lists for each photo, up to 1,536 pixels wide, the same files Zillow's own gallery opens. Links point straight at photos.zillowstatic.com, so you can download them with any HTTP client.

How many photos can I get per listing? Up to 60, set by maxPhotosPerProperty (default 25). photoCount tells you how many came back for each listing in this run.

What can I put in urls? Zillow listing links of the form zillow.com/homedetails/.../NNN_zpid/, or the ZPID number on its own. Search pages, map links and agent pages are not listing pages and will not return photos.

Do I need a Zillow account, cookies or an API key? No. You need only an Apify account. The actor reads public listing pages without logging in.

What happens when Zillow blocks a request? Zillow sometimes refuses a request (HTTP 403). The actor tries each listing twice on fresh proxy addresses; if both fail, you get a free error row for that listing and the run moves on. In our tests the Beverly Hills listing was refused in 2 of the 4 runs that tried it (on both tries each time) and returned its full gallery in the other 2, so rerunning the failed inputs usually works. After 3 listings in a row return no photos, the run stops to avoid paying for a run that is being blocked.

How do I find listings to feed in? Run a search first. Our Zillow Listings Scraper returns the listings for a city, ZIP code or map area, and our Zillow ZIP Code Bulk Search covers many ZIP codes in one run. Both return each listing's link and ZPID, which go straight into urls, so a search run followed by a photos run gives you the galleries of a whole area.

Does a failed listing stop the run? No. A listing that cannot be read is recorded as an error row and the run carries on with the next one. Only a streak of 3 listings in a row with no photos stops the run early, so a run that is being blocked ends quickly instead of grinding through your list. The summary row's total_failed tells you how many inputs to retry.

How fresh are the photos? Each run reads the listing live, so you get the gallery as Zillow shows it at that moment. Galleries change when a home is relisted or sold, so schedule repeat runs if you need to track changes.

Can I run it on a schedule? Yes. Save your input as a task, then in Apify Console open Schedules, click Create new and pick a cron expression such as 0 5 * * 1. Each scheduled run is billed per photo like a manual run.

How do I download the image files? Export the dataset (JSON, CSV or Excel from the run's Storage tab, or the API) and fetch each url. Name the files by zpid and photoIndex to keep the gallery order.

Can I use it from Claude, ChatGPT or another AI assistant?

  • Connector URL: https://mcp.apify.com/?tools=themineworks/zillow-photos.
  • Claude: Settings > Connectors > Add custom connector, paste the URL, sign in with Apify.
  • ChatGPT: developer mode, add an MCP connector with the URL, sign in with Apify.
  • Cursor or VS Code: add it as an HTTP MCP server with that URL.
  • Claude Code: claude mcp add -t http zillow-photos "https://mcp.apify.com/?tools=themineworks/zillow-photos".

Is it legal to scrape Zillow photos? The actor reads only listing photos that Zillow shows publicly, without logging in. Listing photos are usually copyrighted by the photographer, agent or Zillow, so collecting them for analysis is different from republishing them. You are responsible for how you use the data, including Zillow's terms, image copyright, and data protection laws such as GDPR and CCPA. This is general information, not legal advice.

Integrations

  • Google Sheets: export a run to a sheet with one photo link per row, ready for an image column.
  • Make, Zapier and n8n: use the Apify app or node to start a run for new listings and save the photos to cloud storage.
  • Webhooks: have Apify call your URL when a run succeeds, then fetch the dataset.
  • API and client libraries: start runs and read datasets from Python, JavaScript or any HTTP client. The "Copy to your AI assistant" block above has the exact call.
  • MCP clients: Claude, ChatGPT, Cursor, VS Code and Claude Code can call the actor through https://mcp.apify.com.

For the full listing record (price, beds, baths, tax and price history) of the same homes, use our Zillow Property Scraper.

More from The Mine Works

Real estate

Social media and video

Leads and business directories

Marketing, SEO and reviews

LinkedIn

Science, health and government data

Jobs and hiring

E-commerce and marketplaces

Company and business data

Food and local services

Developer and AI tools

More tools

Support

Found a bug or need a field we do not return yet? Open an issue on the Issues tab of this page and we will reply there. To ask for a new real estate source, email dmineworks@gmail.com. A guide and FAQ for this actor also live at themineworks.com.

Zillow Photos Scraper turns Zillow listing links or ZPIDs into one row per full size photo, at $0.73 per 1,000 photos on every plan.