Redfin
Redfin Search API
Search Redfin listings for sale, sold or for rent: price, price per sqft, beds, baths, living area, lot size, year built, coordinates, listing remarks and full photo galleries, as JSON. Up to 350 listings per page. Costs 1 credit per request.
Authorizations
AuthorizationstringheaderrequiredBearer authentication header of the form Bearer <token>, where <token> is your Scavio API key (e.g. Bearer sk_live_your_key).
Body
application/jsonlocationstringA redfin.com region URL (/city/, /neighborhood/, /county/ or /zipcode/) or a bare 5-digit ZIP, 1-500 characters. CITY NAMES ARE NOT ACCEPTED - "Austin, TX" will not resolve. Redfin's own name lookup is the one path its edge blocks us from, so pass a region URL, a ZIP, or region_id + region_type. Required unless region_id AND region_type are both given.
Example: https://www.redfin.com/city/30818/TX/Austin
region_idintegerRedfin's internal region id (>= 1), sent together with region_type. NOT a ZIP code: the two are different number spaces, and a ZIP passed here resolves to some other city instead of failing. Read it out of a redfin.com region URL, or off `region.id` in a previous response.
Example: 30818
region_typeenum<integer>What region_id refers to. Must be sent TOGETHER with region_id - with only one half present, both are ignored and the request falls back to location.
1— Neighborhood.2— ZIP code.5— County.6— City.
listing_statusenum<string>default:for_saleWhich market to search.
for_sale— Active for-sale listings (default).sold— Recently sold homes; see sold_within_days.for_rent— Rentals. min_price / max_price become MONTHLY RENT.
sold_within_daysintegerdefault:90Sold within the last N days (>= 1). REJECTED with a 400 unless listing_status is "sold" - it only widens what listing_status already chose. The default of 90 applies there.
Example: 30
pageintegerResults page, 1-based. No upper bound; the page size is whatever limit is set to.
Example: 2
limitintegerdefault:100Listings per page, 1-350.
Example: 350
sortenum<string>default:recommendedResult ordering.
recommended— Redfin's own ranking (default).price_low— Cheapest first.price_high— Most expensive first.newest— Most recently listed first.oldest— Longest-listed first.sqft_low— Smallest living area first.sqft_high— Largest living area first.price_per_sqft_low— Lowest price per sqft first.price_per_sqft_high— Highest price per sqft first.
min_pricenumberMinimum price, inclusive (>= 0). This is MONTHLY RENT, not sale price, when listing_status is "for_rent".
Example: 400000
max_pricenumberMaximum price, inclusive (>= 0). Monthly rent when listing_status is "for_rent".
Example: 900000
beds_minintegerMinimum bedrooms. Whole numbers only - every numeric filter is truncated into Redfin's query, so fractional bounds are rejected rather than silently floored.
Example: 3
beds_maxintegerMaximum bedrooms. Whole numbers only.
Example: 5
baths_minintegerMinimum bathrooms. WHOLE BATHS ONLY - 1.5 is rejected, not rounded down to 1. There is no baths_max.
Example: 2
sqft_minintegerMinimum living area in square feet. Whole numbers only.
Example: 1500
sqft_maxintegerMaximum living area in square feet. Whole numbers only.
Example: 3000
lot_size_minintegerMinimum lot size in square feet. Whole numbers only. There is no lot_size_max.
Example: 5000
year_built_minintegerEarliest year built. Whole numbers only.
Example: 1990
year_built_maxintegerLatest year built. Whole numbers only.
Example: 2024
max_hoanumberMaximum monthly HOA fee in dollars (>= 0).
Example: 300
property_typeenum<string>Restrict to one property class. Redfin's uipt code 7 is deliberately not exposed here: its meaning could not be confirmed, and guessing would silently search a different class.
house— Single-family house.condo— Condominium.townhouse— Townhouse.multi_family— Multi-family building.land— Vacant land.other— Everything Redfin folds into its residual class.co_op— Co-operative.
has_poolbooleanOnly return listings with a pool.
Example: true
max_days_on_marketintegerListed at most N days ago. CANNOT be combined with min_days_on_market - Redfin expresses both bounds through one parameter, so sending both is a 400 rather than a request that quietly drops the minimum.
Example: 14
min_days_on_marketintegerListed at least N days ago. Cannot be combined with max_days_on_market.
Example: 60
Request
from scavio import ScavioClient
client = ScavioClient(api_key="sk_live_your_key")
results = client.redfin.search(
location="https://www.redfin.com/city/30818/TX/Austin",
min_price=400000,
beds_min=3,
limit=100,
)
print(results)Response