Redfin 房屋估值与历史成交 API:用 Python 获取房价估值与 Sold 对比数据
给美国房产做定价分析时,单靠挂牌价不够:挂牌价是卖家的期望,成交价才是市场的答案,而模型估值(AVM)提供了第三种参照。无论是做海外置业平台的比价功能、投资者的翻新(flip)筛选,还是经纪人的 CMA 报告,核心都是把"估值 + 周边成交 + 本房历史"三组数据拿到手。Redfin 房屋估值与历史成交 API 用三次 HTTP 调用即可完成这条链路,无需维护爬虫和代理池。
先说明边界:这是非官方数据服务,数据来自公开内容,仅供研究与信息参考。AVM 估值是模型参考值,不是正式评估报告,不能直接用于贷款或交易定价依据。
接口链路概览
以下操作均为 GET,完整参数见 Redfin API 文档。估值类端点全部用 propertyId + listingId 成对定位,这对 ID 来自搜索结果每一行的 homeData。
| 操作 | 主要输入 | 用途 |
|---|---|---|
property-auto-complete | location | 把城市/邮编解析为地区 ID(如纽约为 6_30749)与规范地名 |
region-search-for-sold | regionId、soldWithin | 按地区拉取已成交房源,窗口从 7 天到 5 年 |
location-search-for-sold | location、soldWithin | 用城市、邮编或地址直接查成交对比 |
estimate | propertyId、listingId | 获取该房的 AVM 自动估值 |
history-info-sale-and-tax-history | propertyId、listingId | 获取本房的成交事件与税务/评估历史 |
准备工作
注册后在控制台获取 API Key,账户含测试用免费额度。Key 只放在服务端环境变量里,不要写进前端代码、仓库或日志;查询参数中的 Key 可能进入访问日志,记录请求时应脱敏。阅读本文或复制示例不会发起任何数据请求,实际调用会按次消耗额度。
第一步:解析地区 ID
把用户输入的城市名归一化为地区 ID 和规范地名:
curl --get 'https://api.opendata-api.com/api/project/redfin/property-auto-complete?key=YOUR_API_KEY' \
--data-urlencode 'location=New York'
返回的 data.rows[] 中,id 是地区标识(纽约为 6_30749),subName 是 New York, NY, USA 形式的规范地名。注意:无匹配时仍返回 HTTP 200,但带有 hasFakeResults=true 和哨兵行 id=23_null,链式调用前务必先检查这个标志,不要把哨兵 ID 传给搜索接口。
第二步:拉取 Sold 成交对比房源
用地区 ID 加成交时间窗查询,例如最近 90 天:
curl --get 'https://api.opendata-api.com/api/project/redfin/region-search-for-sold?key=YOUR_API_KEY' \
--data-urlencode 'regionId=6_30749' \
--data-urlencode 'soldWithin=90' \
--data-urlencode 'numBeds=2' \
--data-urlencode 'page=1' \
--data-urlencode 'limit=50'
soldWithin 可选 7、30、90、180、365、730、1095、1825(天)。窗口越短样本越新但越少,做估值对标常用 90-180 天。也可以用 location-search-for-sold 直接传邮编或 New York, NY, USA 形式的地点,省去解析步骤。两种搜索都支持价格、面积、地块、建造年份、学校评分等筛选;筛选参数有文档支持,接入自己的市场前请先抽样验证过滤效果。
第三步:Python 获取估值与历史
需要 Python 3 和 requests。下面的示例演示正确的状态处理顺序:先查 HTTP 状态,再查平台外层信封,最后查业务层字段——HTTP 200 不等于搜到了房源。
import os
import requests
key = os.environ["OPENDATA_API_KEY"].strip()
if not key:
raise RuntimeError("Missing API key")
base = "https://api.opendata-api.com/api/project/redfin"
def call(operation, params):
try:
resp = requests.get(
f"{base}/{operation}",
params={"key": key, **params},
timeout=30,
)
except requests.RequestException:
raise RuntimeError("Network request failed") from None
if not resp.ok:
raise RuntimeError(f"HTTP {resp.status_code}")
envelope = resp.json()
if not isinstance(envelope, dict) or str(envelope.get("code")) != "200":
raise RuntimeError("Platform rejected request; inspect a redacted response")
return envelope.get("data")
# Pull sold comps from the last 90 days
sold = call("region-search-for-sold", {
"regionId": "6_30749", "soldWithin": "90", "page": 1, "limit": 50,
})
rows = sold.get("data") if isinstance(sold, dict) else None
if not isinstance(rows, list):
raise RuntimeError("Unexpected sold-search schema")
for row in rows:
home = row.get("homeData") or {}
print(home.get("propertyId"), home.get("listingId"),
(home.get("priceInfo") or {}).get("amount"))
# Each row's propertyId/listingId pair keys the valuation endpoints
estimate = call("estimate", {
"propertyId": "PROPERTY_ID_FROM_SEARCH",
"listingId": "LISTING_ID_FROM_SEARCH",
})
history = call("history-info-sale-and-tax-history", {
"propertyId": "PROPERTY_ID_FROM_SEARCH",
"listingId": "LISTING_ID_FROM_SEARCH",
})
两个取值要点:propertyId 与 listingId 必须取自同一条搜索结果,不能跨行拼凑;estimate 与历史接口的返回结构按目标房源实测后再定型,个别辅助路由目前依据提供方契约文档接入,生产依赖前请用自己的样本验证。
响应字段速览
成交搜索的内层包含 status_code、resultsPerPage 和 data 数组,每行 homeData 的常用字段:
| 字段 | 说明与建议 |
|---|---|
propertyId / listingId | 房产身份与挂牌身份,保持字符串形式,是估值、历史、学校、气候等详情接口的钥匙 |
priceInfo.amount | 价格数值;已售行结合挂牌上下文解读,不要与要价混算 |
sqftInfo.amount、lotSize、yearBuilt | 面积、地块与房龄,用于筛选可比房源 |
addressInfo | 展示地址并核对邮编 |
daysOnMarket.listingAddedDate | 挂牌时间,不等于成交时间 |
历史接口回答的是"这套房本身发生过什么":历次成交事件与税务评估周期,可用来画增值曲线、识别短期倒卖;估值接口回答"模型认为它值多少"。三者——要价、成交价、估值——互相独立,并列展示才有意义。
典型应用场景
- 估值对标工具:AVM 估值与近 90 天 Sold 对比房源并排,标记定价明显偏离模型的挂牌。
- 投资筛选:用成交窗口和属性筛选组建可比集,结合历史接口识别一年内加价转手的 flip。
- 经纪人 CMA 报告:围绕目标地址拉成交记录,再补本房成交与税务时间线。
- 降价监控:搜索结果里的
listingId可直接喂给降价历史与热度接口,做降价提醒机器人。
常见问题
Redfin 有官方 API 吗?没有官方接口怎么获取数据?
Redfin 没有面向开发者的公开官方 API。本项目是非官方数据服务,把公开的房源、估值与成交数据整理为结构化 JSON,按次调用,无需自行维护爬虫、代理池或处理封 IP 问题。
怎么查询美国某个地址的房价估值?
先用搜索或详情接口把地址解析为 propertyId/listingId 对(v2-details 可直接接受地址或链接),再调用 estimate。估值是模型参考值,正式交易仍需专业评估。
如何获取房产的历史成交价格和税务记录?
调用 history-info-sale-and-tax-history,传入搜索行提供的 propertyId 与 listingId,返回该房的成交事件与税务/评估历史。周边邻居的成交价则用两个 sold 搜索接口。
按邮编能查成交房源吗?
可以。location-search-for-sold 的 location 直接接受邮编、城市规范名或地址,配合 soldWithin 窗口即可;要整片城区翻页则用地区 ID 版本更稳定。
查不到房源时返回什么?
搜索接口无结果时通常表现为空 data 数组;地点补全无匹配会带 hasFakeResults=true;而 v2-details 对不存在的 propertyId 目前返回裸 HTTP 500 而非结构化 404——在该路由上把 5xx 当作"未找到"信号处理,不要无限重试。
Zillow 和 Redfin 的数据哪个更全?
两者覆盖与字段侧重不同,估值模型也各自独立。实务上常见做法是同一房源取多个来源交叉验证;平台已提供多个房产数据项目,可对比后选择。
能监控小区新上房源和降价吗?
可以。在售搜索配合 timeOnRedfin、priceReduced 筛选做每日轮询,单行 listingId 再接入降价历史与浏览/收藏热度接口,即可搭建降价与热度预警。
下一步
在 Redfin 项目页在线试调,或阅读 estimate、region-search-for-sold、location-search-for-sold 与 history-info-sale-and-tax-history 参考文档。单次调用费用见定价。如需 Zillow、Realtor.com 等类似平台的数据接口,或需要私有化源码部署,可通过联系页面说明需求。