Redfin Home Valuation (AVM)
Redfin valuation API
Home value estimates, comparable sales, and property specs in one JSON response
Use this endpoint after resolving a Redfin property_id to add valuation ranges, last sale context, and comparable-property data to real estate apps, underwriting tools, pricing workflows, and homeowner reports.
Get Redfin automated home valuation data for a specific US property. The endpoint is designed for AVM-style workflows where you already have a Redfin property_id from search results or a property details lookup and need a structured estimate, low/high value range, last sale context, and comparable-property signals.
What the Redfin valuation endpoint returns
The response can include the predicted home value, estimated low and high bounds, last sold price, last sold date, beds, baths, square footage, lot size, year built, and comparable sales. These fields are useful for building home equity calculators, pricing research tools, investment screening dashboards, portfolio monitoring, and homeowner-facing value estimate experiences.
How to get a property valuation
Start with Redfin Location Search when you need region IDs, then use Redfin Property Search to find candidate listings and extract the property_id. For a known property, call Redfin Property Details first when you need richer listing context before requesting this valuation endpoint.
When to use valuation instead of property search
Use property search when you need a list of homes in a city, ZIP code, county, or neighborhood. Use Redfin Home Valuation when your workflow centers on one property and needs an estimated value range, comparable sales, and property attributes for underwriting, pricing analysis, or automated real estate reports.
Run this endpoint
Endpoint
https://scrappa.co/api/redfin/valuation?property_id=194191988
https://scrappa.co/api/redfin/valuation?property_id=194191988
x-api-key
property_id
= 194191988
{
"data": {
"predictedValue": 850000,
"predictedValueLow": 800000,
"predictedValueHigh": 900000,
"lastSoldPrice": 750000,
"lastSoldDate": "2020-05-15",
"numBeds": 3,
"numBaths": 2,
"sqFt": {
"value": 1800
},
"lotSize": {
"value": 4500
...
Parameters
Start with the required fields, then add optional filters only when your use case needs them.
Runnable path
1 required parameter needed before sending a request.
1 optional filter available.
integer
Required
Redfin property ID (e.g., 194191988 from URL /home/194191988)
194191988
integer
Optional
Redfin listing ID (optional)
1234567890
Request Examples
<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://scrappa.co/api/redfin/valuation?property_id=194191988",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"x-api-key: YOUR_API_KEY_HERE"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}
<?php
use Illuminate\Support\Facades\Http;
$response = Http::timeout(30)
->withHeaders(['x-api-key' => 'YOUR_API_KEY_HERE'])
->get('https://scrappa.co/api/redfin/valuation?property_id=194191988');
if ($response->successful()) {
echo $response->body();
} else {
echo "Error: " . $response->status();
}
const options = {
method: 'GET',
headers: {
'x-api-key': 'YOUR_API_KEY_HERE'
}
};
fetch('https://scrappa.co/api/redfin/valuation?property_id=194191988', options)
.then(response => {
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
return response.text();
})
.then(data => console.log(data))
.catch(error => console.error('Error:', error));
const axios = require('axios');
const options = {
method: 'GET',
url: 'https://scrappa.co/api/redfin/valuation?property_id=194191988',
headers: {
x-api-key: 'YOUR_API_KEY_HERE',
}
};
try {
const response = await axios(options);
console.log(response.data);
} catch (error) {
console.error('Error:', error.message);
}
require 'net/http'
require 'uri'
uri = URI.parse("https://scrappa.co/api/redfin/valuation?property_id=194191988")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = uri.scheme == 'https'
request = Net::HTTP::Get.new(uri.request_uri)
request['x-api-key'] = 'YOUR_API_KEY_HERE'
begin
response = http.request(request)
puts response.body
rescue => e
puts "Error: #{e.message}"
end
import http.client
import json
conn = http.client.HTTPSConnection("scrappa.co")
headers = {
'x-api-key': 'YOUR_API_KEY_HERE',
}
try:
conn.request("GET", "/api/redfin/valuation?property_id=194191988", headers=headers)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))
except Exception as e:
print(f"Error: {e}")
finally:
conn.close()
import requests
headers = {
'x-api-key': 'YOUR_API_KEY_HERE',
}
try:
response = requests.get('https://scrappa.co/api/redfin/valuation?property_id=194191988', headers=headers)
response.raise_for_status()
print(response.text)
except requests.exceptions.RequestException as e:
print(f"Error: {e}")
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import java.io.IOException;
public class ApiExample {
public static void main(String[] args) {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://scrappa.co/api/redfin/valuation?property_id=194191988")
.addHeader("x-api-key", "YOUR_API_KEY_HERE")
.build();
try (Response response = client.newCall(request).execute()) {
if (response.isSuccessful()) {
System.out.println(response.body().string());
} else {
System.out.println("Error: " + response.code());
}
} catch (IOException e) {
System.out.println("Error: " + e.getMessage());
}
}
}
package main
import (
"fmt"
"net/http"
"io/ioutil"
)
func main() {
client := &http.Client{}
req, err := http.NewRequest("GET", "https://scrappa.co/api/redfin/valuation?property_id=194191988", nil)
if err != nil {
fmt.Println("Error creating request:", err)
return
}
req.Header.Set("x-api-key", "YOUR_API_KEY_HERE")
resp, err := client.Do(req)
if err != nil {
fmt.Println("Error making request:", err)
return
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println("Error reading response:", err)
return
}
fmt.Println(string(body))
}
#!/bin/bash
curl -X GET \
-H "x-api-key: YOUR_API_KEY_HERE" \
"https://scrappa.co/api/redfin/valuation?property_id=194191988"
using System;
using System.Net.Http;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
using var client = new HttpClient();
client.DefaultRequestHeaders.Add("x-api-key", "YOUR_API_KEY_HERE");
try
{
var response = await client.SendAsync(new HttpRequestMessage(HttpMethod.Get, "https://scrappa.co/api/redfin/valuation?property_id=194191988"));
var content = await response.Content.ReadAsStringAsync();
Console.WriteLine(content);
}
catch (Exception ex)
{
Console.WriteLine($"Error: {ex.Message}");
}
}
}
import axios from 'axios';
async function run(): Promise<void> {
try {
const response = await axios({
method: 'GET',
url: 'https://scrappa.co/api/redfin/valuation?property_id=194191988',
headers: {
'x-api-key': 'YOUR_API_KEY_HERE',
},
});
console.log(response.data);
} catch (error) {
console.error('Error:', error);
}
}
void run();
use reqwest::Client;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = Client::new();
let response = client
.get("https://scrappa.co/api/redfin/valuation?property_id=194191988")
.header("x-api-key", "YOUR_API_KEY_HERE")
.send()
.await?;
println!("{}", response.text().await?);
Ok(())
}
Response Schema
Example response fields are illustrative; inspect the JSON before integrating.
Example response fields
Scan these fields before integrating.
data
{
"data": {
"predictedValue": 850000,
"predictedValueLow": 800000,
"predictedValueHigh": 900000,
"lastSoldPrice": 750000,
"lastSoldDate": "2020-05-15",
"numBeds": 3,
"numBaths": 2,
"sqFt": {
"value": 1800
},
"lotSize": {
"value": 4500
},
"yearBuilt": 1920,
"comparables": [
{
"address": "456 Oak Ave",
"price": 875000,
"beds": 3,
"baths": 2,
"sqFt": 1850
}
]
}
}
Errors
Handle these documented responses before retrying or showing customer-facing failures.
HTTP 400
The request contains null bytes or unsupported control characters.
HTTP 422
One or more Redfin request parameters failed validation.
HTTP 404
Property not found
HTTP 500
Redfin upstream or proxy fetch attempts were exhausted.
Generate Code with AI
Copy a ready-made prompt with all the endpoint details, parameters, and example responses. Paste it into ChatGPT, Claude, or any AI assistant to instantly generate working code.
Redfin API FAQ
What do I need before calling the Redfin valuation API?
You need a Scrappa API key and a Redfin property_id. The property_id can come from Redfin Property Search results or from a property details lookup.
What valuation fields can the endpoint return?
The endpoint can return a predicted value, low and high estimate range, last sold price and date, comparable sales, beds, baths, square footage, lot size, and year built when Redfin exposes those fields for the property.
Should I use Redfin Property Search or Redfin Home Valuation?
Use Property Search to discover listings in a market. Use Home Valuation when you already have one property and need an estimated value range, comparable sales, and valuation context.