Yes. Scavio's Redfin API gives you recently sold homes with both prices. POST /api/v1/redfin/search with "listing_status": "sold" returns the homes sold in a ZIP over the last N days with their sale price, /api/v1/redfin/property returns a home's price history with the original list price and the sale price, and /api/v1/redfin/market returns the ZIP's median sale-to-list ratio in one call. Each call costs 1 credit, and new accounts get 50 free credits with no card.
The question has sat at the top of Google for years. A user on r/RealEstate asked for a "free public API" that gives recently sold homes with list price versus sale price, for some data analysis. The thread has 131 points and 79 comments, and on October 27, 2026 it was the top Reddit result on Google for "redfin api listing data" and fourth overall for "how to get redfin listing data api". Here is how to answer it today, with responses we captured that day.
What Redfin itself offers
Redfin publishes no developer API. Its Data Center has free downloads in which each row is one region for one time period, which is useful for market trends but cannot tell you what a given house listed and sold for. Licensed MLS feeds carry both prices, but they come one MLS at a time and with membership rules. Redfin's public listing pages show the sold homes and their price history, and that is what the API returns as JSON.
Step 1: List the homes that sold
curl -s https://api.scavio.dev/api/v1/redfin/search \
-H "Authorization: Bearer $SCAVIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"location": "98103", "listing_status": "sold", "sold_within_days": 30, "limit": 350}'For Seattle's 98103 this returned 55 homes sold in the past 30 days, with a page median price of $940,000. One row, trimmed:
{
"property_id": 119043,
"mls_id": "2582667",
"status": "sold",
"price": 1726100,
"price_per_sqft": 602,
"beds": 4,
"baths": 3,
"sqft": 2865,
"address": {
"street": "3915 Sunnyside Ave N",
"city": "Seattle",
"state": "WA",
"postal_code": "98103",
"country": "US"
}
}location takes a ZIP or a redfin.com region URL, not a city name, and sold_within_days sets the lookback (90 by default). A sold row has the sale price but no sold date and no list price, so step 2 fills those in.
Step 2: Get list price and sale price for each home
curl -s https://api.scavio.dev/api/v1/redfin/property \
-H "Authorization: Bearer $SCAVIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"property_id": "119043"}'The latest listing in its price_history, trimmed:
[
{ "date": "2026-10-20T07:00:00.000Z", "event": "Sold (MLS)", "mls_status": "Closed", "price": 1726100 },
{ "date": "2026-09-22T22:22:20.398Z", "event": "Pending", "mls_status": "Pending" },
{ "date": "2026-09-17T07:00:00.000Z", "event": "Listed", "mls_status": "Active", "price": 1690000 }
]Listed at $1,690,000 on September 17, pending five days later, sold for $1,726,100 on October 20: 2.1% over asking. In the same ZIP, 2137 N 86th St listed and sold at the same $1,195,000. The history goes back further, so you also get each home's previous sale (3915 Sunnyside last sold for $1,120,000 in July 2021), and the response adds the Redfin Estimate, tax history and comparable sales. For list price versus sale price, take the last "Listed" or "Price Changed" price before the sale and divide.
Step 3: Get the ZIP's ratio in one call
If you need the market figure rather than each home, skip the per-home math:
curl -s https://api.scavio.dev/api/v1/redfin/market \
-H "Authorization: Bearer $SCAVIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"location": "98103"}'{
"median_list_price": 800000,
"median_sale_price": 950000,
"median_sale_to_list_percent": 100.4,
"avg_days_on_market": 47,
"homes_sold": 41
}That is the trends object, trimmed. The competition object added a score of 87 out of 100 and 13 median days to pending. Downtown Austin's 78701 returned a 97.1% sale-to-list and 79 median days to pending, a much slower market than Seattle's.
The limits
- Non-disclosure states: in Texas, the "Sold (MLS)" event for 1812 West Ave #404 in Austin carried a date and no price. Seattle sales carried theirs. Check your state before you rely on sale prices.
- Two calls per home: the sold search gives sale prices for a whole ZIP in one call, but list prices come from one property call per home, so 55 Seattle sales are 56 calls.
- No sold date on search rows: take it from the "Sold" event in the property call.
Comparing list to sale price for the 55 homes sold in 98103 this month costs 56 credits, which is $0.11 on the Growth plan billed yearly and slightly more than the 50 free credits. Try the Redfin API free, 50 credits, no card, or run a sold search in the playground.
Reference: Redfin API overview · search docs · property docs · market docs · how to get Redfin listing data into a pipeline · best Redfin listing data APIs
Frequently asked questions
Is there a free API for recently sold homes?
Redfin's Data Center downloads are free but hold region-level rows, not individual sales. For home-by-home sold data, Scavio's Redfin API gives 50 free credits on signup with no card; one sold search returned all 55 homes sold in Seattle's 98103 in the past 30 days for 1 credit.
How do I get the original list price of a sold home?
From its price history. The property endpoint returns dated events: Listed with the asking price, any Price Changed events, Pending or Contingent, and Sold with the sale price where the state discloses it. 3915 Sunnyside Ave N in Seattle was listed at $1,690,000 and sold for $1,726,100.
What is a sale-to-list ratio?
The sale price divided by the final list price, as a percentage. Above 100% means homes sell over asking, which usually signals multiple offers; below 100% means buyers negotiate down. On October 27, 2026 the median was 100.4% in Seattle's 98103 and 97.1% in downtown Austin's 78701.
Why are sold prices missing in some states?
Non-disclosure states, including Texas, do not make sale prices public record, so listing sites often cannot show them. In our test, the sold event for an Austin condo carried a date but no price, while Seattle sales carried their prices. Check coverage for your state before you build comps on it.