Real Estate Listing Screenshots via API

Capture property listings from Zillow, Realtor.com, and MLS portals automatically. Archive, monitor prices, generate flyers — one API call per listing.

Vitalii Holben Updated

The API captures any property listing as a full-page screenshot or PDF. Pass a Zillow URL, a Realtor.com link, or a page from your local MLS portal, and you get back a pixel-perfect image of the listing exactly as it appeared at that moment. One API call per property. Schedule it daily and you have an archive of every listing you care about, including the ones that disappear when they go under contract.

Why real estate listings vanish

Listings have a shelf life. A property sells and the page goes offline within days. The MLS feed removes it. Zillow keeps a skeletal record but strips the photos, the agent remarks, the price history chart. If you needed that listing for a comp analysis, an appraisal report, or a dispute with a client about what was disclosed, it's gone.

And it's not just sold listings. Price reductions get overwritten. Descriptions change after an open house. A property gets delisted, relisted at a new price, and the old version evaporates. Who's manually screenshotting 40 active listings every morning? Nobody. And even if someone did, a browser screenshot doesn't include a timestamp or any proof of authenticity.

A scheduled API capture fixes this. You get the visual record, and with certified=true, you get a SHA-256 hash and timestamp that prove the image hasn't been altered. Simple.

Capture a property listing in one API call

Here's a Zillow listing captured with lazy-loaded images fully rendered and cookie banners stripped:

curl "https://api.screenshotrun.com/v1/screenshots/capture?\
url=https://www.zillow.com/homedetails/123-main-st/12345678_zpid/\
&full_page=true\
&delay=3000\
&block_cookies=true\
&block_ads=true\
&block_chats=true\
&format=png\
&response_type=json" \
  -H "Authorization: Bearer YOUR_API_KEY"

The delay=3000 matters here. Zillow lazy-loads property photos with Intersection Observer, and the image carousel doesn't render until the browser scrolls past each section. The full-page capture triggers that scroll, but the images need 2-3 seconds after becoming visible to actually load. Without the delay, you get grey placeholders instead of photos. We tested this across 20 Zillow listings and 3000ms consistently captured all images, while 1000ms missed the bottom half of the gallery on about 60% of pages.

Archive listings before they expire

A brokerage tracking 200 active listings needs daily snapshots. Not because something changes every day, but because you won't know which listing mattered until it's already gone. The agent who needs that comp six months from now doesn't know it yet.

This Python script captures a list of URLs and organizes them by date:

import requests, os
from datetime import date

API = "https://api.screenshotrun.com/v1/screenshots/capture"
HEADERS = {"Authorization": "Bearer YOUR_API_KEY"}

listings = [
    "https://www.zillow.com/homedetails/123-main-st/12345678_zpid/",
    "https://www.realtor.com/realestateandhomes-detail/456-oak-ave",
    "https://www.redfin.com/CA/Los-Angeles/789-Pine-Dr/home/987654",
]

today = date.today().isoformat()
os.makedirs(f"archives/{today}", exist_ok=True)

for url in listings:
    resp = requests.get(API, headers=HEADERS, params={
        "url": url,
        "full_page": "true",
        "delay": "3000",
        "block_cookies": "true",
        "block_ads": "true",
        "format": "png",
        "certified": "true",
        "response_type": "json",
    }).json()

    slug = url.split("/")[-2][:50]
    img = requests.get(resp["data"]["screenshot_url"]).content

    with open(f"archives/{today}/{slug}.png", "wb") as f:
        f.write(img)

    print(f"Archived {slug} — cert hash: {resp['data']['certification']['hash'][:16]}...")

200 listings at one capture per day is 6,000 API calls per month. The Starter plan covers that. Store the images wherever your team already keeps documents (S3, Google Drive, SharePoint). The certification hashes go into a spreadsheet or database for audit trails.

Monitor competitor listings and price drops

Price tracking on Zillow and Realtor.com is the most common use case we hear from real estate investors. Capture the same listing page daily, diff the screenshots, and you catch price reductions the day they happen. But why screenshots instead of scraping the price from the DOM? Because screenshots catch what scraping misses: a new "Price Reduced" banner, updated photos after staging, a shifted "days on market" counter, a swap from "For Sale" to "Pending." The visual context tells a story that a number in a spreadsheet doesn't.

For teams watching specific neighborhoods, pair this with website change monitoring to automate the comparison. Capture the listing, run SSIM against yesterday's version, and alert the team if the visual diff crosses a threshold. The same approach works for tracking your own listings across syndication partners to make sure the photos, pricing, and descriptions match what's in the MLS.

What makes real estate sites hard to screenshot?

Zillow, Realtor.com, and Redfin are some of the most screenshot-hostile sites on the web (outside of financial services). Here's what you'll hit:

Lazy-loaded images. Every major listing portal loads photos only when they scroll into view. The full_page parameter handles the scrolling, but you need delay to give images time to actually load after the scroll completes. Three seconds works for most portals. Redfin? Sometimes needs four.

Interactive map widgets load asynchronously and render blank if the capture fires too early. Using wait_for_selector=.mapboxgl-canvas (Zillow uses Mapbox) or a similar selector for Google Maps ensures the map has rendered before the screenshot fires.

Bot detection. Zillow and Redfin both run Cloudflare or similar protection. The stealth parameter handles most challenges, but if you're hammering 200 captures per hour from the same IP, you'll start seeing CAPTCHAs. So space your requests. Or use a proxy.

MLS portals behind logins require passing session cookies via the cookies parameter. The API won't log in for you, but once you have a valid session cookie (from a browser login or your MLS API token), you can pass it through and capture authenticated pages.

Generate listing flyers as PDF

Some brokerages use screenshot APIs not to capture third-party listings but to generate their own marketing materials. Build a listing page template in HTML (property photos, description, price, agent contact, QR code to the online listing), host it internally, and call the API with format=pdf to produce a print-ready flyer.

curl "https://api.screenshotrun.com/v1/screenshots/capture?\
url=https://your-brokerage.com/listings/123-main-st/flyer\
&format=pdf\
&pdf_page_format=letter\
&delay=2000\
&response_type=json" \
  -H "Authorization: Bearer YOUR_API_KEY"

The HTML template approach beats Canva for consistency. Every flyer looks the same. And when the listing price changes in your CRM, the flyer updates automatically because the template pulls live data. ScreenshotOne has a dedicated page about this workflow, and for good reason. But their focus is PDF-only. Our API also gives you PNG and WebP versions of the same template for social media posts, email campaigns, and MLS photo uploads.

Fair Housing documentation with certified screenshots

Fair Housing Act compliance requires brokerages to document that their listings don't contain discriminatory language or imagery. Under 42 U.S.C. 3604(c), at least three parties are liable for a discriminatory listing: the agent, the brokerage, and the publishing platform. When a complaint comes in months after the listing was edited or removed, having a certified screenshot of what the listing said on a specific date is the difference between "we can prove compliance" and "we have no records."

Run a weekly certified capture of every active listing across every portal where you syndicate. The SHA-256 hash timestamps the exact content. If a listing description changes between Tuesday and Thursday, you have both versions with verifiable dates. For deeper evidence workflows, see legal evidence.

Build listing reports for investors

Investment firms tracking multi-family properties or commercial real estate portfolios need regular listing snapshots for board decks and investor reports. Capture each property's listing page, combine the screenshots into a PDF report (the same approach from investor reporting), and distribute it weekly.

For commercial real estate, the same workflow applies to LoopNet and CoStar listings. Capture the listing, the comparable sales page, and the market analytics map. Three API calls per property, assembled into one report. Appraisers doing comparable analysis can use the same approach: capture the three comps, timestamp them with certified=true, and include them in the appraisal file.

What the API won't do for real estate

It won't scrape structured data from listings. You get an image or PDF, not JSON with beds, baths, and price fields. If you need structured listing data, use a real estate data API like RentCast or Homesage alongside the screenshot API. The screenshot gives you the visual proof, the data API gives you the numbers.

It also won't bypass CAPTCHAs indefinitely. Stealth mode handles standard Cloudflare challenges, but aggressive rate limiting or interactive CAPTCHAs will block captures. Space your requests (we recommend no more than 10 per minute per domain for real estate portals) and rotate through geolocation or proxy settings if needed.

MLS login walls require your own credentials. The API doesn't store or manage login sessions. You extract the session cookie from your browser or MLS integration and pass it per-request.

Real estate screenshots vs Stillio and manual tools

Stillio ($29-$199/month) captures scheduled screenshots of any URL. Good for non-technical users who want a dashboard. But it's not an API, so you can't integrate it into your CRM, your report generator, or your compliance pipeline. Apify has a bulk screenshot actor for real estate sites, but it's a scraping platform first and the screenshot quality reflects that (no full-page stitching, no cookie/ad blocking, no stealth mode).

Manual browser screenshots work for one listing. They fall apart at 50. Your team opens each page, scrolls through, screenshots, renames the file, drops it in the right folder. At 200 listings, that's a full workday every week on filing screenshots. The API does the same thing in about 10 minutes, unattended, with timestamped proof attached to every image. I'd rather spend that workday on actual real estate work.

Start with your highest-value listings. Ten properties captured daily is 300 API calls per month, well within the free tier. Scale to hundreds when you've proven the workflow. For scheduling, a cron job or GitHub Actions workflow handles the daily captures. The Python integration guide covers error handling for production scripts.

FAQ#

Three seconds (delay=3000) works for most major real estate portals including Zillow and Realtor.com. These sites lazy-load property photos using Intersection Observer, so images only render after scrolling triggers them. We tested across 20 Zillow listings and 3000ms consistently captured all images. Redfin sometimes needs 4000ms due to heavier JavaScript rendering.

Yes, but you need to provide your own session credentials. The API accepts cookies via the cookies parameter. Log into your MLS portal in a browser, extract the session cookie, and pass it with the API request. The API does not store or manage login sessions — each request uses the cookie you provide.

One capture per listing per day. If you track 200 active listings daily, that is 6,000 API calls per month. The Starter plan covers this volume. For price drop monitoring where you want multiple daily snapshots, multiply accordingly — 200 listings twice daily is 12,000 calls per month.

The stealth parameter handles standard Cloudflare challenges that Zillow and Redfin use. However, aggressive rate limiting can trigger CAPTCHAs if you send too many requests too fast. We recommend no more than 10 requests per minute per domain. Spacing requests and rotating geolocation settings helps avoid blocks.

Yes. Build your listing template as an HTML page (property photos, description, price, agent contact info), host it on your server, and call the API with format=pdf and pdf_page_format=letter. The template can pull live data from your CRM, so flyers update automatically when listing details change.

Written by

Vitalii Holben

Co-founder and CEO of ScreenshotRun. Full-stack developer building screenshot API tools that help developers capture, automate, and monitor web pages at scale. Based in Europe, shipping code since 201...

Screenshot API in a few clicks

Free plan includes 200 screenshots every month. No credit card required.

Sign up → copy your key → make your first call