ScreenshotNeo

BlogHow-to

How to Scrape Real Estate Listings From Redfin

Redfin prohibits automated scraping without prior written permission. Learn the authorized ways to access listing data and how to capture a page for permitted uses.

By the ScreenshotNeo team4 October 20269 min read

Direct answer: Redfin’s Terms of Use prohibit automated crawling or querying of its services—including screen scraping and database scraping—unless you have prior express written permission from the applicable Redfin company. Do not automate collection from Redfin pages without that permission. If your project needs listing records, ask the relevant local MLS or an authorized data provider about a licensed feed and its permitted uses.

This guide explains how to pursue access, what to confirm before building, and how to implement an authorized feed. It does not provide code for extracting Redfin pages or bypassing access controls.

1. What Redfin permits

Redfin’s Terms of Use, updated September 29, 2025, say that users may not automatically crawl or query its services for any purpose—including by screen or database scraping, spiders, robots, or crawlers—without prior express written permission from the applicable Redfin company. A page being publicly viewable does not grant that permission. Browser automation, low request rates, proxy use, or a robots.txt rule do not replace written authorization. Read Redfin’s Terms of Use.

Redfin also states that MLS listing information is for personal, non-commercial use and restricts redistribution and data mining or scraping. It says MLS sources own the listing data and disclaims guarantees about its reliability, accuracy, or currency. Review the terms and any relevant listing-specific notices before using or republishing information. Redfin’s data quality information.

Redfin reports that “70% of new US listings in MLS® feeds received by Redfin will post within 5 minutes.” The cited data-quality page does not state a publication year. Treat this as Redfin’s reported figure, not a guarantee for a particular market or a service-level commitment.

2. Choose an authorized data route

Request written permission from Redfin

If you specifically need to collect information from Redfin’s service, contact the applicable Redfin company and obtain prior express written permission that covers your intended automated access. Ask the permission grant to define the allowed pages or data, purpose, volume, retention, display, and redistribution. Do not begin automated collection while the request is pending.

Ask the local MLS or a licensed provider about a feed

For a product that needs listing records, contact the MLS serving the target geography or an authorized data provider. Explain the product, users, geography, fields, and how data will be displayed or stored. Confirm whether the source can license the intended use and what credentials and technical onboarding are required.

RESO’s Web API is a standard for accessing real estate data; RESO does not provide MLS records, licenses, or credentials. Those come through the MLS or its authorized provider. After data-use policies are agreed, the MLS’s software provider or technical staff can provide access instructions. RESO Web API and RESO’s statement about data access.

MLS Grid is one possible route where the relevant MLS participates. Its materials describe a common RESO-compliant feed and licensing framework; each party accessing the data must accept applicable agreements. Participation, available fields, and permitted uses are not universal. MLS Grid.

3. Confirm rights and scope before writing code

Get the answers in writing from the MLS or provider. The agreement and provider documentation control; do not assume that access to a token grants rights beyond the license.

Question What to verify
Geography Which MLS, service areas, and property types are included? Does your target area participate?
Purpose and users Is the feed permitted for internal analysis, a consumer product, brokerage use, or another specific purpose?
Fields and media Which listing fields, photos, and status values may you access and display? Are there field-level restrictions?
Display and attribution What source attribution, disclaimers, branding, and display rules apply?
Storage and retention May you cache or retain records? For how long, and what must be deleted when a listing or agreement changes?
Updates How are changes, removals, and status transitions delivered? What freshness should your application expect?
Access and security Who must be licensed or credentialed? How are tokens issued, rotated, and restricted?
Cost and terms What setup, recurring, usage, or per-user charges apply? What are the renewal and termination terms?

There is no universal feed, coverage map, price, or field set established for every MLS by the sources cited here. Compare providers against your actual geography and license needs, and confirm current terms directly.

4. Implement the feed you are authorized to use

Once you have an agreement, credentials, and the provider’s current API documentation, follow that documentation exactly. MLS Grid’s API v2 materials show bearer-token authentication and OData-style query structure, but access requires credentials and the agreement defines what you may request and use. The sample below illustrates the documented request shape; it is not a promise that every reader has access or may query every field. Replace the host, token, resource, and filter with the values and permitted fields from your provider’s onboarding documentation.

Use a narrow filter for the geography and records your license permits. Avoid copying this illustrative query into production without confirming resource names, field rights, pagination, throttling, and required attribution with your provider. MLS Grid API documentation.

curl --fail-with-body --get "https://api.mlsgrid.com/v2/Property" \
  --header "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  --header "Accept: application/json" \
  --data-urlencode '$top=10' \
  --data-urlencode '$select=ListingKey,City,PostalCode,ListPrice,StandardStatus' \
  --data-urlencode "$filter=City eq 'Example City'"

The exact OData expression and supported fields depend on the provider’s schema and your license. Never place a production token in client-side code, a public repository, or logs.

Python example

import os
import requests

endpoint = "https://api.mlsgrid.com/v2/Property"  # Use your provider's documented endpoint.
token = os.environ["MLS_ACCESS_TOKEN"]
params = {
    "$top": "10",
    "$select": "ListingKey,City,PostalCode,ListPrice,StandardStatus",
    "$filter": "City eq 'Example City'",
}

response = requests.get(
    endpoint,
    headers={"Authorization": f"Bearer {token}", "Accept": "application/json"},
    params=params,
    timeout=(5, 30),
)
response.raise_for_status()
payload = response.json()

for listing in payload.get("value", []):
    print(listing.get("ListingKey"), listing.get("ListPrice"), listing.get("City"))

Node.js example

const endpoint = new URL("https://api.mlsgrid.com/v2/Property"); // Use your provider's documented endpoint.
endpoint.searchParams.set("$top", "10");
endpoint.searchParams.set("$select", "ListingKey,City,PostalCode,ListPrice,StandardStatus");
endpoint.searchParams.set("$filter", "City eq 'Example City'");

const response = await fetch(endpoint, {
  headers: {
    Authorization: `Bearer ${process.env.MLS_ACCESS_TOKEN}`,
    Accept: "application/json",
  },
  signal: AbortSignal.timeout(30000),
});

if (!response.ok) {
  throw new Error(`Provider request failed: ${response.status} ${await response.text()}`);
}
const payload = await response.json();
for (const listing of payload.value ?? []) {
  console.log(listing.ListingKey, listing.ListPrice, listing.City);
}

Production checklist

  • Use only authorized endpoints and fields; keep credentials in a server-side secret store.
  • Apply the provider’s pagination and rate-limit instructions. Store continuation links or cursors only as documented.
  • Validate response shapes and handle missing, null, or provider-specific values without treating them as errors.
  • Use the provider’s update mechanism and honor retention, deletion, attribution, and display terms.
  • Log request identifiers and status codes, but redact bearer tokens and avoid retaining listing data in diagnostic logs unless allowed.
  • Separate transient network failures from authorization, validation, and licensing failures. Retry only transient errors, with bounded exponential backoff and jitter; honor any retry guidance.

5. Capture a page for a permitted visual use

If your task is to document or review a page that you are authorized to access, a screenshot can record its visible appearance. A screenshot is not a substitute for permission to automate access, extract structured listing data, or redistribute MLS content. Keep capture within the written authorization and applicable terms.

cURL

curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://stripe.com -o shot.webp

Python

import requests
r = requests.get("https://api.screenshotneo.com/v1/shot", params={"access_key": "YOUR_API_KEY", "url": "https://stripe.com"}, timeout=90)
open("shot.webp", "wb").write(r.content)

Node.js

const q = new URLSearchParams({ access_key: 'YOUR_API_KEY', url: 'https://stripe.com' });
const res = await fetch(`https://api.screenshotneo.com/v1/shot?${q}`);

These examples target a general example page. For a permitted target, replace the URL and keep your key private. See the ScreenshotNeo API documentation for request options and response details.

6. Or skip the browser setup

ScreenshotNeo is a website screenshot API and MCP server. It accepts cookie and consent banners before capture and removes more than 60 known consent platforms, newsletter popups, and chat widgets; each step can be turned off. Bot checks, blank pages, failed loads, timeouts, and cache hits are not billed, and responses identify page verdict and billing status in headers. AI agents can use its MCP tools, including take_screenshot, get_page_info, and capture_pdf.

One GET request returns an image or PDF. This example uses the supplied Stripe URL; change it only to a page you are authorized to capture.

curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://stripe.com -o shot.webp

There are 1,000 screenshots per month free with no card. Paid plans start at $5 for 3,000 screenshots; every feature is on every plan. A screenshot captures appearance—it does not grant rights to scrape, store, or republish listing data. Sign up for 1,000 free screenshots a month.

7. Troubleshooting authorized integrations

Symptom Likely cause What to do
401 Unauthorized Missing, expired, malformed, or wrong-environment token. Check the provider’s token issuance instructions, environment, and Authorization header. Rotate exposed credentials.
403 Forbidden The account, party, MLS, endpoint, or requested fields are not authorized. Ask the provider to confirm participation, agreement acceptance, and field-level access. Do not try another credential to evade the restriction.
400 or 422 response Invalid OData syntax, unsupported field, or malformed parameter. Compare the query and field names with the provider schema; reduce the request to a minimal permitted query, then add filters carefully.
429 Too Many Requests Provider rate or concurrency limit reached. Follow documented retry headers and limits; reduce concurrency and use bounded backoff.
Empty results Filter mismatch, no matching records, unsupported geography, or scope restrictions. Check the exact filter syntax, allowed geography, and permitted fields with the provider. An empty result is not a reason to broaden access beyond the license.
Missing or stale listing Source update timing, local rules, feed cadence, or a data-sync issue. Check the provider’s update documentation and status process. Ask the MLS/provider about the specific record and expected update path.
Timeout or intermittent 5xx Network or provider service issue, oversized query, or excessive concurrency. Use the documented timeout and retry guidance, narrow the request, and capture request IDs for provider support.
Data appears in logs or a public bundle Token or licensed data was exposed by client-side code or diagnostics. Revoke and rotate the token, remove exposed data where possible, and follow the agreement’s incident and deletion requirements.

8. Performance, reliability, and cost

Request only the fields and geography needed for the permitted product. Smaller responses are easier to validate and reduce transfer and processing work. Follow the provider’s pagination, concurrency, and update instructions instead of assuming that repeated full downloads are acceptable.

For reliability, make update processing idempotent where the provider’s identifiers and contract permit it. Record when each authorized feed update was received, detect removals or status changes through the provider’s documented mechanism, and surface the age of data when required. Do not promise a universal refresh interval: access, update cadence, and local rules vary. Redfin’s own reported five-minute figure describes a portion of new U.S. listings in feeds it receives, not every market or a licensed feed guarantee.

Costs depend on the MLS, provider, use, credentials, and agreement. The cited research does not establish comparable provider prices. Budget for licensing and onboarding, hosting and sync operations, plus any required attribution or compliance work; obtain a quote and confirm renewal and termination terms directly.

9. Frequently asked questions

Does Redfin have a public listings API for general use?

The cited official material does not establish a general public API or a universal license path for Redfin listing data. Ask Redfin for written permission or use an authorized MLS/provider feed under its specific terms.

Can I scrape Redfin if I only make a few requests?

The cited Terms of Use require prior express written permission for automated crawling or querying. They do not state a request-volume threshold that makes scraping permitted.

Does using a screenshot API make listing scraping allowed?

No. A screenshot tool captures a page image; it does not grant permission to automate access, extract listing records, or reuse MLS data.

Does RESO provide listing data or credentials?

No. RESO provides standards. The MLS or an authorized data provider controls access, licensing, and credentials.

Sources