🏠 Real Estate
The real estate API offers comprehensive data for various properties, including sales, rentals, and general property information. Users can access details related to property availability, pricing, locations, and specific features through the API. Whether users are looking to buy, rent, or simply gather information about properties, the API provides essential data to facilitate informed decision-making in the real estate market.
Properties & Search
Search and autocomplete locations, cities, and addresses with fast, real-time results.
GET /v1/autocomplete
requires authentication
Location autocomplete suggestions using Realtor.com API.
Example request:
import requests
import json
url = 'https://api.steadyapi.com/v1/real-estate/autocomplete'
params = {
'search': 'new york',
}
headers = {
'Authorization': 'Bearer {YOUR_AUTH_KEY}'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()$client = new \GuzzleHttp\Client();
$url = 'https://api.steadyapi.com/v1/real-estate/autocomplete';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
],
'query' => [
'search' => 'new york',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://api.steadyapi.com/v1/real-estate/autocomplete"
);
const params = {
"search": "new york",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());curl --request GET \
--get "https://api.steadyapi.com/v1/real-estate/autocomplete?search=new+york" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}"Example response (200, Success):
{
"meta": {
"version": "v1.0",
"status": 200,
"copywrite": "https://steadyapi.com",
"query": "okla",
"total": 10
},
"body": [
{
"text": "Oklahoma",
"geo": {
"_id": "state:ok",
"_score": 22.782896,
"area_type": "state",
"state": "Oklahoma",
"state_code": "OK",
"country": "USA",
"centroid": {
"lon": -97.5082383803584,
"lat": 35.5834672253606
},
"slug_id": "Oklahoma",
"geo_id": "6aef7aa0-c8b9-54bc-aecc-6d97b7c1602a",
"lat": 35.5834672253606,
"lon": -97.5082383803584
}
},
{ ... }
]
}
Example response (401, Unauthenticated):
{
"message": "Unauthenticated."
}
Example response (404, Not Found):
{
"success": false,
"message": "Resource Not Found"
}
Example response (422, Error Validations):
{
"message": "The ticker field is required.",
"errors": {
"ticker": [
"The ticker field is required."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
GET /v2/search
requires authentication
Search for properties using GraphQL API with advanced filters
Example request:
import requests
import json
url = 'https://api.steadyapi.com/v1/real-estate/search'
params = {
'location': 'Oklahoma-City_OK',
'beds': '3',
'baths': '2',
'min_price': '100000',
'max_price': '800000',
'property_type': 'single_family',
'days_since_reduced': '30',
'offset': '0',
'sort_type': 'relevant',
}
headers = {
'Authorization': 'Bearer {YOUR_AUTH_KEY}'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()$client = new \GuzzleHttp\Client();
$url = 'https://api.steadyapi.com/v1/real-estate/search';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
],
'query' => [
'location' => 'Oklahoma-City_OK',
'beds' => '3',
'baths' => '2',
'min_price' => '100000',
'max_price' => '800000',
'property_type' => 'single_family',
'days_since_reduced' => '30',
'offset' => '0',
'sort_type' => 'relevant',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://api.steadyapi.com/v1/real-estate/search"
);
const params = {
"location": "Oklahoma-City_OK",
"beds": "3",
"baths": "2",
"min_price": "100000",
"max_price": "800000",
"property_type": "single_family",
"days_since_reduced": "30",
"offset": "0",
"sort_type": "relevant",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());curl --request GET \
--get "https://api.steadyapi.com/v1/real-estate/search?location=Oklahoma-City_OK&beds=3&baths=2&min_price=100000&max_price=800000&property_type=single_family&days_since_reduced=30&offset=0&sort_type=relevant" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}"Example response (200, Success):
{
"meta": {
"version": "v1.0",
"status": 200,
"copywrite": "https://steadyapi.com",
"location": "Oklahoma-City_OK",
"total": 6022,
"returned": 200,
"limit": 200,
"offset": 0,
"sort_type": "relevant",
"beds": null,
"baths": null,
"min_price": null,
"max_price": null,
"show_price_reduced": false,
"new_construction": false,
"property_type": null
},
"body": [
{
"property_id": "7757741161",
"price": {
"amount": 549000,
"reduced_amount": null,
"display": "$549,000"
},
"status": "for_sale",
"permalink": "https://www.realtor.com/realestateandhomes-detail/5604-Creekmore-Dr_Oklahoma-City_OK_73179_M77577-41161",
"photo_url": "https://ap.rdcpix.com/21b681a8472b7de82fbb403dd8a87bc9l-m122785432s-w480_h360_x2.webp",
"source_type": "mls",
"description": {
"beds": 4,
"beds_display": "4 beds",
"sqft": 3590,
"sqft_display": "3,590 sqft",
"lot_sqft": 11683,
"lot_sqft_display": "11,683 sqft"
},
"location": {
"lat": 35.410226,
"lon": -97.665053,
"street_view_url": "https://maps.googleapis.com/maps/api/streetview?channel=rdc-streetview&key=AIzaSyAP_xs30yS0J4xp8O1ZKUrUttIXKklrwaM&location=5604%20Creekmore%20Dr%2C%20Oklahoma%20City%2C%20OK%2073179&size=640x480&source=outdoor&signature=F-ZMSYUlfkgyLtUC1bdsNEAxMyc=",
"county_fips": "40109"
},
"flags": {
"is_new_listing": false,
"is_price_reduced": false,
"is_new_construction": false,
"is_coming_soon": false,
"is_contingent": false,
"is_pending": false,
"is_foreclosure": false,
"is_plan": false,
"has_promotion": false
},
"open_houses": []
},
{ ... }
]
}
Example response (401, Unauthenticated):
{
"message": "Unauthenticated."
}
Example response (404, Not Found):
{
"success": false,
"message": "Resource Not Found"
}
Example response (422, Error Validations):
{
"message": "The ticker field is required.",
"errors": {
"ticker": [
"The ticker field is required."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
GET /v1/rentals-search
requires authentication
Search rental properties using Realtor.com
Example request:
import requests
import json
url = 'https://api.steadyapi.com/v1/real-estate/rentals-search'
params = {
'location': 'San Francisco, CA',
'offset': '0',
}
headers = {
'Authorization': 'Bearer {YOUR_AUTH_KEY}'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()$client = new \GuzzleHttp\Client();
$url = 'https://api.steadyapi.com/v1/real-estate/rentals-search';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
],
'query' => [
'location' => 'San Francisco, CA',
'offset' => '0',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://api.steadyapi.com/v1/real-estate/rentals-search"
);
const params = {
"location": "San Francisco, CA",
"offset": "0",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());curl --request GET \
--get "https://api.steadyapi.com/v1/real-estate/rentals-search?location=San+Francisco%2C+CA&offset=0" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}"Example response (200, Success):
{
"meta": {
"version": "v1.0",
"status": 200,
"copywrite": "https://steadyapi.com",
"location": "San Francisco, CA",
"total": 678,
"returned": 20,
"limit": 20,
"offset": 0,
"sort": "fractal_v1.4.5_fr"
},
"body": [
{
"property_id": "2473364190",
"price": {
"min": 1495,
"max": 1895,
"display": "$1,495 - $1,895"
},
"permalink": "765-Geary-St_San-Francisco_CA_94109_M24733-64190",
"photo_url": "https://ar.rdcpix.com/c92212e8a911e8047941a7cb15527f4bc-f2593420090s-w480_h360_x2.webp",
"has_specials": false,
"promotions": null,
"description": {
"name": "765 Geary",
"type": "apartment",
"beds": {
"min": 0,
"max": 0,
"display": "Studio"
},
"baths": {
"min": 1,
"max": 1,
"display": "1 bath"
},
"sqft": {
"min": 239,
"max": 448,
"display": "239 sqft"
}
},
"address": {
"line": "765 Geary St",
"city": "San Francisco",
"state": "CA",
"zip": "94109",
"full": "765 Geary St, San Francisco, CA, 94109"
}
},
{ ... }
]
}
Example response (401, Unauthenticated):
{
"message": "Unauthenticated."
}
Example response (404, Not Found):
{
"success": false,
"message": "Resource Not Found"
}
Example response (422, Error Validations):
{
"message": "The ticker field is required.",
"errors": {
"ticker": [
"The ticker field is required."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
GET /v1/nearby-rentals
requires authentication
Get nearby rental properties using Realtor.com
Example request:
import requests
import json
url = 'https://api.steadyapi.com/v1/real-estate/nearby-rentals'
params = {
'location': 'San Francisco, CA',
}
headers = {
'Authorization': 'Bearer {YOUR_AUTH_KEY}'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()$client = new \GuzzleHttp\Client();
$url = 'https://api.steadyapi.com/v1/real-estate/nearby-rentals';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
],
'query' => [
'location' => 'San Francisco, CA',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://api.steadyapi.com/v1/real-estate/nearby-rentals"
);
const params = {
"location": "San Francisco, CA",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());curl --request GET \
--get "https://api.steadyapi.com/v1/real-estate/nearby-rentals?location=San+Francisco%2C+CA" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}"Example response (200, Success):
{
"meta": {
"version": "v1.0",
"status": 200,
"copywrite": "https://steadyapi.com",
"location": "San Francisco, CA",
"total": 25,
"returned": 25,
"limit": 25
},
"body": [
{
"property_id": "9705763472",
"listing_id": "2991166869",
"primary": true,
"status": "for_rent",
"list_price": null,
"list_price_max": 1255,
"list_price_min": 1255,
"href": "https://www.realtor.com/rentals/details/1190-Howard-St_San-Francisco_CA_94103_M97057-63472",
"permalink": "1190-Howard-St_San-Francisco_CA_94103_M97057-63472",
"flags": {
"is_contingent": null,
"is_new_construction": null,
"is_pending": null,
"is_foreclosure": null,
"is_new_listing": false
},
"primary_photo": {
"href": "https://ar.rdcpix.com/4a0f557709cadad23e8ba7c36d80546bc-f4031694126s-w480_h360_x2.webp"
},
"description": {
"type": "apartment",
"baths": null,
"baths_full": null,
"baths_half": null,
"beds": null,
"sqft": null,
"baths_min": 1,
"baths_max": 1,
"beds_min": 0,
"beds_max": 0,
"sqft_min": null,
"sqft_max": null
},
"location": {
"address": {
"city": "San Francisco",
"country": "USA",
"line": "1190 Howard St",
"state": "California",
"state_code": "CA",
"postal_code": "94103"
}
}
},
{ ... }
]
}
Example response (401, Unauthenticated):
{
"message": "Unauthenticated."
}
Example response (404, Not Found):
{
"success": false,
"message": "Resource Not Found"
}
Example response (422, Error Validations):
{
"message": "The ticker field is required.",
"errors": {
"ticker": [
"The ticker field is required."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Property Details
Get property popularity metrics including views, saves, and LDP views for different time periods.
GET /v1/property-urgency
requires authentication
Get property urgency data including views and saves metrics
Example request:
import requests
import json
url = 'https://api.steadyapi.com/v1/real-estate/property-urgency'
params = {
'propertyId': '1874828523',
'listingId': '2996679504',
}
headers = {
'Authorization': 'Bearer {YOUR_AUTH_KEY}'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()$client = new \GuzzleHttp\Client();
$url = 'https://api.steadyapi.com/v1/real-estate/property-urgency';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
],
'query' => [
'propertyId' => '1874828523',
'listingId' => '2996679504',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://api.steadyapi.com/v1/real-estate/property-urgency"
);
const params = {
"propertyId": "1874828523",
"listingId": "2996679504",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());curl --request GET \
--get "https://api.steadyapi.com/v1/real-estate/property-urgency?propertyId=1874828523&listingId=2996679504" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}"Example response (200, Success):
{
"meta": {
"version": "v1.0",
"status": 200,
"copywrite": "https://steadyapi.com",
"property_id": "1874828523",
"listing_id": "2996679504",
"total_periods": 6,
"generated_at": "2026-06-22 21:43:49"
},
"body": {
"summary": {
"total_views": 32969,
"total_saves": 39,
"total_ldp_views": 347,
"average_views": 5495,
"average_saves": 7,
"average_ldp_views": 58
},
"periods": [
{
"last_n_days": 1,
"saves_total": 0,
"views_total": 331,
"ldp_views_total": 0
},
{ ... }
]
}
}
Example response (401, Unauthenticated):
{
"message": "Unauthenticated."
}
Example response (404, Not Found):
{
"success": false,
"message": "Resource Not Found"
}
Example response (422, Error Validations):
{
"message": "The ticker field is required.",
"errors": {
"ticker": [
"The ticker field is required."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
GET /v1/property-estimates
requires authentication
Get property value estimates including historical and forecasted values
Example request:
import requests
import json
url = 'https://api.steadyapi.com/v1/real-estate/property-estimates'
params = {
'propertyId': '1874828523',
'historicalYearsMin': '2021-06-01',
'historicalYearsMax': '2026-06-01',
'forecastedMonthsMax': '2026-09-01',
}
headers = {
'Authorization': 'Bearer {YOUR_AUTH_KEY}'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()$client = new \GuzzleHttp\Client();
$url = 'https://api.steadyapi.com/v1/real-estate/property-estimates';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
],
'query' => [
'propertyId' => '1874828523',
'historicalYearsMin' => '2021-06-01',
'historicalYearsMax' => '2026-06-01',
'forecastedMonthsMax' => '2026-09-01',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://api.steadyapi.com/v1/real-estate/property-estimates"
);
const params = {
"propertyId": "1874828523",
"historicalYearsMin": "2021-06-01",
"historicalYearsMax": "2026-06-01",
"forecastedMonthsMax": "2026-09-01",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());curl --request GET \
--get "https://api.steadyapi.com/v1/real-estate/property-estimates?propertyId=1874828523&historicalYearsMin=2021-06-01&historicalYearsMax=2026-06-01&forecastedMonthsMax=2026-09-01" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}"Example response (200, Success):
{
"meta": {
"version": "v1.0",
"status": 200,
"copywrite": "https://steadyapi.com",
"property_id": "1874828523",
"historical_years_min": null,
"historical_years_max": null,
"forecasted_months_max": null,
"total_historical_estimates": 182,
"forecast_sources": 2,
"generated_at": "2026-06-22 21:50:43"
},
"body": {
"current_value": 2373569,
"latest_historical_value": 2353229,
"latest_historical_date": "2026-06-17",
"historical_values": [
{
"source": {
"name": "Quantarium",
"type": "quantarium"
},
"estimates": [
{
"value": 2353229,
"date": "2026-06-17"
},
{ ... }
]
},
{
"source": {
"name": "Cotality™",
"type": "corelogic"
},
"estimates": [
{
"value": 2704700,
"date": "2026-06-08"
},
{ ... }
]
},
{
"source": {
"name": "Collateral Analytics",
"type": "collateral"
},
"estimates": [
{
"value": 3057000,
"date": "2026-05-15"
},
{ ... }
]
}
],
"forecast_values": [
{
"source": {
"name": "Cotality™",
"type": "corelogic"
},
"estimates": [
{
"value": 2722194,
"date": "2026-07-01"
},
{ ... }
]
},
{
"source": {
"name": "Quantarium",
"type": "quantarium"
},
"estimates": [
{
"value": 2336712,
"date": "2026-07-01"
},
{ ... }
]
}
]
}
}
Example response (401, Unauthenticated):
{
"message": "Unauthenticated."
}
Example response (404, Not Found):
{
"success": false,
"message": "Resource Not Found"
}
Example response (422, Error Validations):
{
"message": "The ticker field is required.",
"errors": {
"ticker": [
"The ticker field is required."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
GET /v1/neighborhood-market-trends
requires authentication
Get neighborhood market trends including median prices, days on market, and price per sqft
Example request:
import requests
import json
url = 'https://api.steadyapi.com/v1/real-estate/neighborhood-market-trends'
params = {
'propertyId': '1874828523',
}
headers = {
'Authorization': 'Bearer {YOUR_AUTH_KEY}'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()$client = new \GuzzleHttp\Client();
$url = 'https://api.steadyapi.com/v1/real-estate/neighborhood-market-trends';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
],
'query' => [
'propertyId' => '1874828523',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://api.steadyapi.com/v1/real-estate/neighborhood-market-trends"
);
const params = {
"propertyId": "1874828523",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());curl --request GET \
--get "https://api.steadyapi.com/v1/real-estate/neighborhood-market-trends?propertyId=1874828523" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}"Example response (200, Success):
{
"meta": {
"version": "v1.0",
"status": 200,
"copywrite": "https://steadyapi.com",
"property_id": "1874828523",
"state": "California",
"city": "San Francisco",
"county": "San Francisco",
"neighborhood_count": 2
},
"body": {
"state": {
"name": "California"
},
"city": {
"name": "San Francisco",
"state_code": "CA",
"county": "San Francisco",
"slug_id": "San-Francisco_CA",
"geo_type": "city",
"market_metrics": {
"median_listing_price": 1195000,
"median_sold_price": 1700000,
"median_days_on_market": 50,
"median_price_per_sqft": 975
}
},
"county": {
"name": "San Francisco",
"state_code": "CA",
"slug_id": "San-Francisco-County_CA",
"geo_type": "county",
"market_metrics": {
"median_listing_price": 1195000,
"median_sold_price": 1700000,
"median_days_on_market": 50,
"median_price_per_sqft": 975
}
},
"neighborhoods": [
{
"name": "Southwest San Francisco",
"city": "San Francisco",
"state_code": "CA",
"slug_id": "Southwest-San-Francisco_San-Francisco_CA",
"geo_type": "neighborhood",
"level": "macro_neighborhood",
"market_metrics": {
"median_listing_price": 1449944,
"median_sold_price": 1970000,
"median_days_on_market": 39,
"median_price_per_sqft": 936
}
},
{
"name": "Noe Valley",
"city": "San Francisco",
"state_code": "CA",
"slug_id": "Noe-Valley_San-Francisco_CA",
"geo_type": "neighborhood",
"level": "neighborhood",
"market_metrics": {
"median_listing_price": 1595000,
"median_sold_price": 2250000,
"median_days_on_market": 55,
"median_price_per_sqft": 1152
}
}
],
"neighborhood_averages": {
"avg_median_listing_price": 1522472,
"avg_median_sold_price": 2110000,
"avg_median_days_on_market": 47,
"avg_median_price_per_sqft": 1044
}
}
}
Example response (401, Unauthenticated):
{
"message": "Unauthenticated."
}
Example response (404, Not Found):
{
"success": false,
"message": "Resource Not Found"
}
Example response (422, Error Validations):
{
"message": "The ticker field is required.",
"errors": {
"ticker": [
"The ticker field is required."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
GET /v1/property-tax-history
requires authentication
Get comprehensive property history including tax records, transaction history, and building permits
Example request:
import requests
import json
url = 'https://api.steadyapi.com/v1/real-estate/property-tax-history'
params = {
'propertyId': '1874828523',
}
headers = {
'Authorization': 'Bearer {YOUR_AUTH_KEY}'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()$client = new \GuzzleHttp\Client();
$url = 'https://api.steadyapi.com/v1/real-estate/property-tax-history';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
],
'query' => [
'propertyId' => '1874828523',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://api.steadyapi.com/v1/real-estate/property-tax-history"
);
const params = {
"propertyId": "1874828523",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());curl --request GET \
--get "https://api.steadyapi.com/v1/real-estate/property-tax-history?propertyId=1874828523" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}"Example response (200, Success):
{
"meta": {
"version": "v1.0",
"status": 200,
"copywrite": "https://steadyapi.com",
"property_id": "1874828523",
"current_status": "for_sale",
"total_transactions": 7,
"total_tax_years": 18,
"total_permits": 8,
"avg_annual_tax": 15576,
"latest_tax_year": 2025,
"latest_tax_amount": 22800,
"tax_trend": "increasing",
"price_appreciation": "2069.57%"
},
"body": {
"status": "for_sale",
"property_history": [
{
"date": "2026-06-05",
"event_name": "Listed",
"price": 2495000,
"price_change": 0,
"price_sqft": 1077.75377969762,
"price_change_percentage": "+60.97%",
"days_after_listed": null,
"source_name": "SanFrancisco",
"listing": {
"listing_id": "2996679504",
"list_price": 2495000,
"status": "for_sale",
"list_date": "2026-06-05T23:13:52Z",
"last_status_change_date": "2026-06-05T23:13:52Z",
"last_update_date": "2026-06-18T15:59:09Z"
}
},
{ ... }
],
"tax_history": [
{
"year": 2025,
"tax_amount": 22800,
"assessment": {
"total": 1862846,
"building": 558849,
"land": 1303997
},
"market_value": null
},
{ ... }
],
"building_permits": [
{
"project_name": null,
"permit_type": "plumbing",
"project_type_1": "Bathroom remodel",
"project_type_2": "Plumbing",
"project_type_3": null,
"effective_date": "Mar 31, 2026",
"status": "Issued"
},
{ ... }
],
"statistics": {
"tax": {
"total_years": 18,
"total_tax_paid": 280373,
"average_annual_tax": 15576,
"latest_tax_year": 2025,
"latest_tax_amount": 22800,
"trend": "increasing"
},
"transactions": {
"total": 7,
"sales_count": 3,
"listings_count": 3,
"current_price": 2495000,
"first_price": 115000,
"price_appreciation_percentage": 2069.57
},
"permits": {
"total": 8,
"recent": [
{
"project_name": null,
"permit_type": "plumbing",
"project_type_1": "Bathroom remodel",
"project_type_2": "Plumbing",
"project_type_3": null,
"effective_date": "Mar 31, 2026",
"status": "Issued"
},
{ ... }
]
}
}
}
}
Example response (401, Unauthenticated):
{
"message": "Unauthenticated."
}
Example response (404, Not Found):
{
"success": false,
"message": "Resource Not Found"
}
Example response (422, Error Validations):
{
"message": "The ticker field is required.",
"errors": {
"ticker": [
"The ticker field is required."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
GET /v1/housing-market-details
requires authentication
Get comprehensive housing market details including median prices, market temperature, and hotness scores
Example request:
import requests
import json
url = 'https://api.steadyapi.com/v1/real-estate/housing-market-details'
params = {
'zipcode': '94131',
}
headers = {
'Authorization': 'Bearer {YOUR_AUTH_KEY}'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()$client = new \GuzzleHttp\Client();
$url = 'https://api.steadyapi.com/v1/real-estate/housing-market-details';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
],
'query' => [
'zipcode' => '94131',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://api.steadyapi.com/v1/real-estate/housing-market-details"
);
const params = {
"zipcode": "94131",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());curl --request GET \
--get "https://api.steadyapi.com/v1/real-estate/housing-market-details?zipcode=94131" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}"Example response (200, Success):
{
"meta": {
"version": "v1.0",
"status": 200,
"copywrite": "https://steadyapi.com",
"slug_id": "94131",
"market_strength": "hot",
"is_competitive": false
},
"body": {
"market_metrics": {
"median_sold_price": 2150000,
"median_listing_price": 1595000,
"median_rent_price": 4500,
"median_days_on_market": 53,
"median_price_per_sqft": 995
},
"market_temperature": {
"local_hotness_score": 61.111111111,
"national_hotness_score": 61.13481548,
"local_temperature": "hot",
"national_temperature": "hot",
"hot_market_badge": "Other",
"hot_market_rank": 4473
},
"market_comparison": {
"ratio_of_days_on_market_vs_typical_property_in_county": -8,
"ratio_of_ldp_views_vs_typical_property_in_county": 1.131870924019,
"ratio_of_days_on_market_vs_typical_property_in_us": -10,
"ratio_of_ldp_views_vs_typical_property_in_us": 1.120227011338
},
"derived_metrics": {
"list_to_sold_ratio_percentage": 134.8,
"sold_to_rent_ratio": 39.81,
"market_strength": "hot",
"is_competitive_market": false
}
}
}
Example response (401, Unauthenticated):
{
"message": "Unauthenticated."
}
Example response (404, Not Found):
{
"success": false,
"message": "Resource Not Found"
}
Example response (422, Error Validations):
{
"message": "The ticker field is required.",
"errors": {
"ticker": [
"The ticker field is required."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
GET /v1/neighborhood-amenities
requires authentication
Get comprehensive neighborhood data including amenities, schools, location scores, and neighborhood boundaries
Example request:
import requests
import json
url = 'https://api.steadyapi.com/v1/real-estate/neighborhood-amenities'
params = {
'propertyId': '1874828523',
'radius_in_miles': '5',
'category_limit': '3',
}
headers = {
'Authorization': 'Bearer {YOUR_AUTH_KEY}'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()$client = new \GuzzleHttp\Client();
$url = 'https://api.steadyapi.com/v1/real-estate/neighborhood-amenities';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
],
'query' => [
'propertyId' => '1874828523',
'radius_in_miles' => '5',
'category_limit' => '3',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://api.steadyapi.com/v1/real-estate/neighborhood-amenities"
);
const params = {
"propertyId": "1874828523",
"radius_in_miles": "5",
"category_limit": "3",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());curl --request GET \
--get "https://api.steadyapi.com/v1/real-estate/neighborhood-amenities?propertyId=1874828523&radius_in_miles=5&category_limit=3" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}"Example response (200, Success):
{
"meta": {
"version": "v1.0",
"status": 200,
"copywrite": "https://steadyapi.com",
"property_id": "1874828523",
"neighborhood_count": 2,
"amenities_count": 3,
"schools_count": 12,
"score_groups": [
"nearby",
"transportation",
"lifestyle"
],
"search_radius": 5,
"categories": [
"LOCAL_PRESCHOOLS"
]
},
"body": {
"neighborhoods": [
{
"id": "d43fceaa-4e97-5593-aca3-7c733672e549",
"name": "Southwest San Francisco",
"city": "San Francisco",
"state_code": "CA",
"slug_id": "Southwest-San-Francisco_San-Francisco_CA",
"geo_type": "neighborhood",
"level": "macro_neighborhood",
"centroid": {
"lat": 37.73763,
"lon": -122.467139
},
"boundary": {
"type": "Polygon",
"coordinates": [
[
[-122.42864, 37.77144],
[-122.42823, 37.76965],
[-122.42234, 37.76989]
]
]
}
},
{
"id": "a71b212d-a1b8-5e15-b7d0-7e648f9061fe",
"name": "Noe Valley",
"city": "San Francisco",
"state_code": "CA",
"slug_id": "Noe-Valley_San-Francisco_CA",
"geo_type": "neighborhood",
"level": "neighborhood",
"centroid": {
"lat": 37.747613,
"lon": -122.431771
},
"boundary": {
"type": "Polygon",
"coordinates": [
[
[-122.43219, 37.75468],
[-122.432, 37.75309],
[-122.42756, 37.75333]
]
]
}
}
],
"location_scores": [
{
"label": "Walking",
"value": 8,
"text": "Most day-to-day needs are within a few minutes' walk",
"icon_url": "https://static.rdc.moveaws.com/images/local/neighbourhood-score/walk_solid.svg",
"groups": [
"transportation"
]
},
{ ... }
],
"schools": {
"summary": {
"total": 12,
"public": 9,
"private": 3,
"elementary": 8,
"middle": 5,
"high": 3,
"avg_rating": 5.1,
"assigned_schools": [
"Lick (James) Middle School",
"Alvarado Elementary School"
]
},
"list": [
{
"id": "078662731",
"name": "Lick (James) Middle School",
"slug_id": "Lick-(James)-Middle-School-078662731",
"education_levels": [
"middle"
],
"grades": [
"6",
"7",
"8"
],
"funding_type": "public",
"rating": 2,
"parent_rating": 4,
"student_count": 479,
"student_teacher_ratio": 13.7,
"review_count": 10,
"distance_in_miles": 0.3,
"assigned": true,
"coordinate": {
"lat": 37.749406,
"lon": -122.432015
}
},
{ ... }
]
},
"amenities": {
"by_category": {
"preschools": [
{
"name": "Mi Cunita de Noe Valley Nursery",
"phone": "+14152795202",
"rating": 0,
"reviews_count": 0,
"categories": [
"preschools",
"childcare",
"local_preschools"
],
"display_tags": [
"Preschools",
"Child Care & Day Care"
],
"icon_url": "https://static.rdc.moveaws.com/images/map/amenity-2023-1/40x40/preschools.svg",
"photo_url": "https://s3-media0.fl.yelpcdn.com/bphoto/Yds3OIiDIxX6O65FHmVqDA/o.jpg",
"yelp_url": "https://www.yelp.com/biz/mi-cunita-de-noe-valley-nursery-san-francisco-2?adjust_creative=realtor&utm_campaign=yelp_feed&utm_medium=feed_v2&utm_source=realtor",
"business_url": "https://www.wonderschool.com",
"reviews_url": null,
"address": {
"line_one": "440 29th St",
"line_two": null,
"city": "San Francisco",
"state_code": "CA",
"postal_code": "94131",
"lat": 37.74375,
"lon": -122.42989,
"distance_from_property": 0.16
}
},
{ ... }
],
"childcare": [
{
"name": "Mi Cunita de Noe Valley Nursery",
"phone": "+14152795202",
"rating": 0,
"reviews_count": 0,
"categories": [
"preschools",
"childcare",
"local_preschools"
],
"display_tags": [
"Preschools",
"Child Care & Day Care"
],
"icon_url": "https://static.rdc.moveaws.com/images/map/amenity-2023-1/40x40/preschools.svg",
"photo_url": "https://s3-media0.fl.yelpcdn.com/bphoto/Yds3OIiDIxX6O65FHmVqDA/o.jpg",
"yelp_url": "https://www.yelp.com/biz/mi-cunita-de-noe-valley-nursery-san-francisco-2?adjust_creative=realtor&utm_campaign=yelp_feed&utm_medium=feed_v2&utm_source=realtor",
"business_url": "https://www.wonderschool.com",
"reviews_url": null,
"address": {
"line_one": "440 29th St",
"line_two": null,
"city": "San Francisco",
"state_code": "CA",
"postal_code": "94131",
"lat": 37.74375,
"lon": -122.42989,
"distance_from_property": 0.16
}
},
{ ... }
],
"local_preschools": [
{
"name": "Mi Cunita de Noe Valley Nursery",
"phone": "+14152795202",
"rating": 0,
"reviews_count": 0,
"categories": [
"preschools",
"childcare",
"local_preschools"
],
"display_tags": [
"Preschools",
"Child Care & Day Care"
],
"icon_url": "https://static.rdc.moveaws.com/images/map/amenity-2023-1/40x40/preschools.svg",
"photo_url": "https://s3-media0.fl.yelpcdn.com/bphoto/Yds3OIiDIxX6O65FHmVqDA/o.jpg",
"yelp_url": "https://www.yelp.com/biz/mi-cunita-de-noe-valley-nursery-san-francisco-2?adjust_creative=realtor&utm_campaign=yelp_feed&utm_medium=feed_v2&utm_source=realtor",
"business_url": "https://www.wonderschool.com",
"reviews_url": null,
"address": {
"line_one": "440 29th St",
"line_two": null,
"city": "San Francisco",
"state_code": "CA",
"postal_code": "94131",
"lat": 37.74375,
"lon": -122.42989,
"distance_from_property": 0.16
}
},
{ ... }
]
},
"all": [
{
"name": "Mi Cunita de Noe Valley Nursery",
"phone": "+14152795202",
"rating": 0,
"reviews_count": 0,
"categories": [
"preschools",
"childcare",
"local_preschools"
],
"display_tags": [
"Preschools",
"Child Care & Day Care"
],
"icon_url": "https://static.rdc.moveaws.com/images/map/amenity-2023-1/40x40/preschools.svg",
"photo_url": "https://s3-media0.fl.yelpcdn.com/bphoto/Yds3OIiDIxX6O65FHmVqDA/o.jpg",
"yelp_url": "https://www.yelp.com/biz/mi-cunita-de-noe-valley-nursery-san-francisco-2?adjust_creative=realtor&utm_campaign=yelp_feed&utm_medium=feed_v2&utm_source=realtor",
"business_url": "https://www.wonderschool.com",
"reviews_url": null,
"address": {
"line_one": "440 29th St",
"line_two": null,
"city": "San Francisco",
"state_code": "CA",
"postal_code": "94131",
"lat": 37.74375,
"lon": -122.42989,
"distance_from_property": 0.16
}
},
{ ... }
]
}
}
}
Example response (401, Unauthenticated):
{
"message": "Unauthenticated."
}
Example response (404, Not Found):
{
"success": false,
"message": "Resource Not Found"
}
Example response (422, Error Validations):
{
"message": "The ticker field is required.",
"errors": {
"ticker": [
"The ticker field is required."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
GET /v1/environment-risk
requires authentication
Get environmental risk data including flood, wildfire, heat, wind, and air quality risks
Example request:
import requests
import json
url = 'https://api.steadyapi.com/v1/real-estate/environment-risk'
params = {
'propertyId': '1874828523',
}
headers = {
'Authorization': 'Bearer {YOUR_AUTH_KEY}'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()$client = new \GuzzleHttp\Client();
$url = 'https://api.steadyapi.com/v1/real-estate/environment-risk';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
],
'query' => [
'propertyId' => '1874828523',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://api.steadyapi.com/v1/real-estate/environment-risk"
);
const params = {
"propertyId": "1874828523",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());curl --request GET \
--get "https://api.steadyapi.com/v1/real-estate/environment-risk?propertyId=1874828523" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}"Example response (200, Success):
{
"meta": {
"version": "v1.0",
"status": 200,
"copywrite": "https://steadyapi.com",
"property_id": "1874828523",
"average_risk_score": 2.4,
"overall_risk_level": "Moderate",
},
"body": {
"flood": {
"score": 1,
"severity": "minimal",
"trend": "This property’s flood risk is not changing."
},
"wildfire": {
"score": 1,
"severity": "Minimal",
"trend": "This property’s wildfire risk is not changing."
},
"heat": {
"score": 2,
"severity": "Minor",
"trend": "8 days above 78°F this year"
},
"wind": {
"score": 1,
"severity": "Minimal",
"trend": "Minimal risk of severe winds over next 30 years"
},
"air": {
"score": 7,
"severity": "Severe",
"trend": "Risk of poor air quality is not changing"
},
"summary": {
"severity_counts": {
"Minimal": 2,
"Minor": 1,
"Moderate": 0,
"High": 0,
"Severe": 1,
"Extreme": 0
},
"total_risk_factors": 5,
"highest_severity": "Minimal"
}
}
}
Example response (401, Unauthenticated):
{
"message": "Unauthenticated."
}
Example response (404, Not Found):
{
"success": false,
"message": "Resource Not Found"
}
Example response (422, Error Validations):
{
"message": "The ticker field is required.",
"errors": {
"ticker": [
"The ticker field is required."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
GET /v1/nearby-home-values
requires authentication
Get nearby home values and property data within a specified radius
Example request:
import requests
import json
url = 'https://api.steadyapi.com/v1/real-estate/nearby-home-values'
params = {
'lat': '37.745222',
'lon': '-122.432128',
'radius': '5mi',
'limit': '25',
}
headers = {
'Authorization': 'Bearer {YOUR_AUTH_KEY}'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()$client = new \GuzzleHttp\Client();
$url = 'https://api.steadyapi.com/v1/real-estate/nearby-home-values';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
],
'query' => [
'lat' => '37.745222',
'lon' => '-122.432128',
'radius' => '5mi',
'limit' => '25',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://api.steadyapi.com/v1/real-estate/nearby-home-values"
);
const params = {
"lat": "37.745222",
"lon": "-122.432128",
"radius": "5mi",
"limit": "25",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());curl --request GET \
--get "https://api.steadyapi.com/v1/real-estate/nearby-home-values?lat=37.745222&lon=-122.432128&radius=5mi&limit=25" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}"Example response (200, Success):
{
"meta": {
"version": "v1.0",
"status": 200,
"copywrite": "https://steadyapi.com",
"latitude": 37.745222,
"longitude": -122.432128,
"radius": "5mi",
"total_results": 25,
"returned_results": 25,
"status_filters": [
"for_sale",
"off_market",
"sold"
]
},
"body": {
"statistics": {
"list_price": {
"min": 749000,
"max": 3895000,
"avg": 1795000,
"median": 1599000
},
"estimated_value": {
"min": 745600,
"max": 5640600,
"avg": 2478271,
"median": 2500500
},
"status_counts": {
"for_sale": 1,
"sold": 24
}
},
"properties": [
{
"property_id": "1874828523",
"listing_id": "2996679504",
"status": "for_sale",
"list_price": 2495000,
"href": "https://www.realtor.com/realestateandhomes-detail/424-28th-St_San-Francisco_CA_94131_M18748-28523",
"permalink": "424-28th-St_San-Francisco_CA_94131_M18748-28523",
"address": {
"line": "424 28th St",
"city": "San Francisco",
"state_code": "CA",
"postal_code": "94131"
},
"description": {
"beds": 3,
"baths": "2.5",
"sqft": 2315,
"lot_sqft": 2849
},
"estimates": {
"best": {
"value": 2704700,
"date": "2026-06-08"
},
"all": [
{
"value": 2704700,
"date": "2026-06-08"
},
{
"value": 3057000,
"date": "2026-05-15"
},
{
"value": 2353229,
"date": "2026-06-17"
}
]
}
},
{ ... }
]
}
}
Example response (401, Unauthenticated):
{
"message": "Unauthenticated."
}
Example response (404, Not Found):
{
"success": false,
"message": "Resource Not Found"
}
Example response (422, Error Validations):
{
"message": "The ticker field is required.",
"errors": {
"ticker": [
"The ticker field is required."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
GET /v1/geo-details
requires authentication
Get recommended geographic locations including cities, ZIP codes, and neighborhoods with their market data
Example request:
import requests
import json
url = 'https://api.steadyapi.com/v1/real-estate/geo-details'
params = {
'city_state': 'San-Francisco_CA',
'limit': '20',
}
headers = {
'Authorization': 'Bearer {YOUR_AUTH_KEY}'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()$client = new \GuzzleHttp\Client();
$url = 'https://api.steadyapi.com/v1/real-estate/geo-details';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
],
'query' => [
'city_state' => 'San-Francisco_CA',
'limit' => '20',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://api.steadyapi.com/v1/real-estate/geo-details"
);
const params = {
"city_state": "San-Francisco_CA",
"limit": "20",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());curl --request GET \
--get "https://api.steadyapi.com/v1/real-estate/geo-details?city_state=San-Francisco_CA&limit=20" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}"Example response (200, Success):
{
"meta": {
"version": "v1.0",
"status": 200,
"copywrite": "https://steadyapi.com",
"slug_id": "san-francisco_CA",
"limit": 20,
"cities_found": 20,
"zip_codes_found": 20,
"neighborhoods_found": 20,
"avg_neighborhood_price": 1496025,
"price_range": {
"min": 609000,
"max": 2750000
}
},
"body": {
"cities": [
{
"slug_id": "Oakland_CA",
"geo_type": "city"
},
{ ... }
],
"zip_codes": [
{
"slug_id": "94115",
"geo_type": "postal_code"
},
{ ... }
],
"neighborhoods": [
{
"slug_id": "South-Beach_San-Francisco_CA",
"geo_type": "neighborhood",
"centroid": {
"lat": 37.784436,
"lon": -122.396782
},
"market_data": {
"median_listing_price": 1100000,
"listing_count": 199,
"median_price_by_type": 1159000
}
},
{ ... }
]
}
}
Example response (401, Unauthenticated):
{
"message": "Unauthenticated."
}
Example response (404, Not Found):
{
"success": false,
"message": "Resource Not Found"
}
Example response (422, Error Validations):
{
"message": "The ticker field is required.",
"errors": {
"ticker": [
"The ticker field is required."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
GET /v1/similar-homes
requires authentication
Get similar homes based on property ID
Example request:
import requests
import json
url = 'https://api.steadyapi.com/v1/real-estate/similar-homes'
params = {
'propertyId': '1874828523',
'limit': '25',
}
headers = {
'Authorization': 'Bearer {YOUR_AUTH_KEY}'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()$client = new \GuzzleHttp\Client();
$url = 'https://api.steadyapi.com/v1/real-estate/similar-homes';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
],
'query' => [
'propertyId' => '1874828523',
'limit' => '25',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://api.steadyapi.com/v1/real-estate/similar-homes"
);
const params = {
"propertyId": "1874828523",
"limit": "25",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());curl --request GET \
--get "https://api.steadyapi.com/v1/real-estate/similar-homes?propertyId=1874828523&limit=25" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}"Example response (200, Success):
{
"meta": {
"version": "v1.0",
"status": 200,
"copywrite": "https://steadyapi.com",
"property_id": "1874828523",
"limit": 25,
"total_results": 18
},
"body": [
{
"property_id": "1771393124",
"description": {
"baths_max": null,
"baths_min": null,
"beds_max": null,
"beds_min": null,
"beds": 4,
"baths_full": 3,
"baths_half": 1,
"sqft": 2190,
"lot_sqft": 1873,
"name": null
},
"rentals_application_eligibility": {
"estimated_status": "BLOCKED"
},
"community": null,
"location": {
"address": {
"coordinate": {
"lat": 37.747117,
"lon": -122.414484
},
"line": "264 Precita Ave",
"city": "San Francisco",
"state_code": "CA",
"postal_code": "94110"
}
},
"estimate": {
"estimate": 2804400,
"date": "2026-06-08"
},
"list_price": 2495000,
"available_date_change_timestamp": null,
"list_price_max": null,
"list_price_min": null,
"permalink": "264-Precita-Ave_San-Francisco_CA_94110_M17713-93124",
"status": "for_sale",
"listing_id": "2997450618",
"flags": {
"is_coming_soon": null,
"is_contingent": null,
"is_new_construction": null,
"is_pending": null,
"is_foreclosure": null,
"is_for_rent": null,
"is_plan": null,
"is_price_reduced": null,
"is_new_listing": true,
"is_sales_builder": null,
"has_new_availability": null
},
"primary_photo": {
"href": "https://ap.rdcpix.com/4cdaf2f9be9cdb608c08ca872fe48d20l-m899192800xd-w300_h300_q80.jpg"
},
"source": {
"type": "mls",
"id": "SFCA"
}
},
{ ... }
]
}
Example response (401, Unauthenticated):
{
"message": "Unauthenticated."
}
Example response (404, Not Found):
{
"success": false,
"message": "Resource Not Found"
}
Example response (422, Error Validations):
{
"message": "The ticker field is required.",
"errors": {
"ticker": [
"The ticker field is required."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
GET /v1/gallery-similar-homes
requires authentication
Get gallery of similar homes with photos and property details
Example request:
import requests
import json
url = 'https://api.steadyapi.com/v1/real-estate/gallery-similar-homes'
params = {
'propertyId': '1874828523',
'listingId': '2996679504',
'lat': '37.745222',
'lon': '-122.432128',
'state_code': 'CA',
'list_price_min': '1746500',
'list_price_max': '3243500',
}
headers = {
'Authorization': 'Bearer {YOUR_AUTH_KEY}'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()$client = new \GuzzleHttp\Client();
$url = 'https://api.steadyapi.com/v1/real-estate/gallery-similar-homes';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
],
'query' => [
'propertyId' => '1874828523',
'listingId' => '2996679504',
'lat' => '37.745222',
'lon' => '-122.432128',
'state_code' => 'CA',
'list_price_min' => '1746500',
'list_price_max' => '3243500',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://api.steadyapi.com/v1/real-estate/gallery-similar-homes"
);
const params = {
"propertyId": "1874828523",
"listingId": "2996679504",
"lat": "37.745222",
"lon": "-122.432128",
"state_code": "CA",
"list_price_min": "1746500",
"list_price_max": "3243500",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());curl --request GET \
--get "https://api.steadyapi.com/v1/real-estate/gallery-similar-homes?propertyId=1874828523&listingId=2996679504&lat=37.745222&lon=-122.432128&state_code=CA&list_price_min=1746500&list_price_max=3243500" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}"Example response (200, Success):
{
"meta": {
"version": "v1.0",
"status": 200,
"copywrite": "https://steadyapi.com",
"property_id": "1874828523",
"listing_id": "2996679504",
"location": {
"lat": 0,
"lon": 0,
"state_code": null,
"postal_code": null,
"radius": "20mi"
},
"limit": 25,
"total_results": 5
},
"body": [
{
"listing_id": "2979805670",
"list_price": 2400000,
"last_price_change_amount": -350000,
"property_id": "2022197411",
"status": "for_sale",
"flags": {
"is_coming_soon": null,
"is_deal_available": null,
"is_for_rent": null,
"is_garage_present": null,
"is_new_construction": null,
"is_price_excludes_land": null,
"is_senior_community": null,
"is_short_sale": null,
"is_subdivision": null,
"is_price_reduced": false,
"is_new_listing": false
},
"description": {
"beds": 5,
"beds_min": null,
"beds_max": null,
"baths_min": null,
"baths_max": null,
"baths_full": 5,
"baths_half": 1,
"sqft": 6494,
"sqft_min": null,
"sqft_max": null,
"lot_sqft": 1663121,
"baths_consolidated": "5.5"
},
"location": {
"address": {
"city": "Saint Helena",
"line": "4040 Spring Mountain Rd",
"postal_code": "94574",
"state_code": "CA",
"country": "USA"
}
},
"open_houses": null,
"permalink": "4040-Spring-Mountain-Rd_Saint-Helena_CA_94574_M20221-97411",
"primary_photo": {
"href": "https://ap.rdcpix.com/e37dc54808afdf6d9271c8dcb3ed029cl-m1526553986s-w480_h360_x2.webp"
},
"photos": [
{
"href": "https://ap.rdcpix.com/e37dc54808afdf6d9271c8dcb3ed029cl-m1526553986s-w480_h360_x2.webp",
"tags": [
{
"label": "balcony"
},
{
"label": "patio"
},
{
"label": "porch"
}
]
},
{ ... }
]
},
{ ... }
]
}
Example response (401, Unauthenticated):
{
"message": "Unauthenticated."
}
Example response (404, Not Found):
{
"success": false,
"message": "Resource Not Found"
}
Example response (422, Error Validations):
{
"message": "The ticker field is required.",
"errors": {
"ticker": [
"The ticker field is required."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
GET /v1/new-construction
requires authentication
Get new construction similar homes with community details and pricing
Example request:
import requests
import json
url = 'https://api.steadyapi.com/v1/real-estate/new-construction'
params = {
'propertyId': '7652412597',
'limit': '25',
}
headers = {
'Authorization': 'Bearer {YOUR_AUTH_KEY}'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()$client = new \GuzzleHttp\Client();
$url = 'https://api.steadyapi.com/v1/real-estate/new-construction';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
],
'query' => [
'propertyId' => '7652412597',
'limit' => '25',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://api.steadyapi.com/v1/real-estate/new-construction"
);
const params = {
"propertyId": "7652412597",
"limit": "25",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());curl --request GET \
--get "https://api.steadyapi.com/v1/real-estate/new-construction?propertyId=7652412597&limit=25" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}"Example response (200, Success):
{
"meta": {
"version": "v1.0",
"status": 200,
"copywrite": "https://steadyapi.com",
"property_id": "7652412597",
"status_filter": "for_sale",
"limit": 25,
"total_count": 25,
"returned_results": 25,
"price_range": {
"min": 216900,
"max": 252999,
"avg": 235873
},
"status_counts": {
"ready_to_build": 15,
"for_sale": 10
},
"community_count": 4,
"generated_at": "2026-06-22 23:51:39"
},
"body": {
"summary": {
"total": 25,
"price_statistics": {
"min": 216900,
"max": 252999,
"avg": 235873
},
"status_breakdown": {
"ready_to_build": 15,
"for_sale": 10
},
"top_communities": {
"Bellflower - Watermill Collection": 5,
"Montage": 11,
"Morgan Glen": 8,
"Fireside Creek": 1
}
},
"results": [
{
"property_id": "417000989193",
"description": {
"baths_max": null,
"baths_min": null,
"beds_max": null,
"beds_min": null,
"beds": 3,
"baths_full": 2,
"baths_half": null,
"sqft": 1302,
"lot_sqft": null,
"name": "Beckman"
},
"community": {
"description": {
"name": "Bellflower - Watermill Collection"
}
},
"location": {
"address": {
"coordinate": {
"lat": 35.4445,
"lon": -97.6722
},
"line": "9000 SW 18th St",
"city": "Oklahoma City",
"state_code": "OK",
"postal_code": "73128"
}
},
"list_price": 229900,
"list_price_max": null,
"list_price_min": null,
"permalink": "Beckman_Bellflower-Watermill-Collection_9000-SW-18th-St_Oklahoma-City_OK_73128_P417000989193",
"status": "ready_to_build",
"listing_id": null,
"flags": {
"is_coming_soon": null,
"is_contingent": null,
"is_garage_present": true,
"is_new_construction": true,
"is_pending": null,
"is_short_sale": null,
"is_foreclosure": null,
"is_senior_community": null,
"is_for_rent": null,
"is_deal_available": null,
"is_price_excludes_land": null,
"is_subdivision": null,
"is_plan": true,
"is_price_reduced": null,
"is_new_listing": false,
"is_sales_builder": null
},
"primary_photo": {
"href": "https://nh.rdcpix.com/c0fcfeed2fe7cd558598acdb51162740e-f1667560399xd-w300_h300_q80-w480_h360_x2.webp"
},
"source": {
"type": "new_home"
}
},
{ ... }
]
}
}
Example response (401, Unauthenticated):
{
"message": "Unauthenticated."
}
Example response (404, Not Found):
{
"success": false,
"message": "Resource Not Found"
}
Example response (422, Error Validations):
{
"message": "The ticker field is required.",
"errors": {
"ticker": [
"The ticker field is required."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Properties & Market Data
Analyze price distribution, market trends, and property value ranges for real estate listings.
GET /v1/price-histogram
requires authentication
Get price distribution histogram for properties in a location using Realtor.com.
Example request:
import requests
import json
url = 'https://api.steadyapi.com/v1/real-estate/price-histogram'
params = {
'location': 'San Francisco, CA',
'status': '',
}
headers = {
'Authorization': 'Bearer {YOUR_AUTH_KEY}'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()$client = new \GuzzleHttp\Client();
$url = 'https://api.steadyapi.com/v1/real-estate/price-histogram';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
],
'query' => [
'location' => 'San Francisco, CA',
'status' => '',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://api.steadyapi.com/v1/real-estate/price-histogram"
);
const params = {
"location": "San Francisco, CA",
"status": "",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());curl --request GET \
--get "https://api.steadyapi.com/v1/real-estate/price-histogram?location=San+Francisco%2C+CA&status=" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}"Example response (200, Success):
{
"meta": {
"version": "v1.0",
"status": [
"for_sale",
"ready_to_build"
],
"copywrite": "https://steadyapi.com",
"location": "San Francisco, CA",
"total_listings": 1424,
"price_ranges": 40
},
"body": [
{
"range": "0.0-50000.0",
"min_price": 0,
"max_price": 50000,
"count": 3
},
{
"range": "50000.0-100000.0",
"min_price": 50000,
"max_price": 100000,
"count": 6
},
{ ... }
]
}
Example response (401, Unauthenticated):
{
"message": "Unauthenticated."
}
Example response (404, Not Found):
{
"success": false,
"message": "Resource Not Found"
}
Example response (422, Error Validations):
{
"message": "The ticker field is required.",
"errors": {
"ticker": [
"The ticker field is required."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
GET /v1/mortgage-rate
requires authentication
Get mortgage rate trends by state using Realtor.com.
Example request:
import requests
import json
url = 'https://api.steadyapi.com/v1/real-estate/mortgage-rate'
params = {
'state': 'CA',
}
headers = {
'Authorization': 'Bearer {YOUR_AUTH_KEY}'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()$client = new \GuzzleHttp\Client();
$url = 'https://api.steadyapi.com/v1/real-estate/mortgage-rate';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
],
'query' => [
'state' => 'CA',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://api.steadyapi.com/v1/real-estate/mortgage-rate"
);
const params = {
"state": "CA",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());curl --request GET \
--get "https://api.steadyapi.com/v1/real-estate/mortgage-rate?state=CA" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}"Example response (200, Success):
{
"meta": {
"version": "v1.0",
"status": 200,
"copywrite": "https://steadyapi.com",
"state": "CA",
"total": 30
},
"body": [
{
"year": 2026,
"month": 5,
"day": 16,
"thirty_year_fix": 6.607
},
{
"year": 2026,
"month": 5,
"day": 17,
"thirty_year_fix": 6.607
},
{ ... }
]
}
Example response (401, Unauthenticated):
{
"message": "Unauthenticated."
}
Example response (404, Not Found):
{
"success": false,
"message": "Resource Not Found"
}
Example response (422, Error Validations):
{
"message": "The ticker field is required.",
"errors": {
"ticker": [
"The ticker field is required."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.