MENU navbar-image

🏠 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.

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."
        ]
    }
}
 

Request      

GET v1/real-estate/autocomplete

Headers

Authorization Bearer {YOUR_AUTH_KEY}

Query Parameters

Parameter Type Description
search required string

Search term for location. Example: new york

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."
        ]
    }
}
 

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."
        ]
    }
}
 

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."
        ]
    }
}
 

Request      

GET v1/real-estate/nearby-rentals

Headers

Authorization Bearer {YOUR_AUTH_KEY}

Query Parameters

Parameter Type Description
location required string

Location name. Example: San Francisco, CA

limit optional integer

optional Number of results (default: 25, max: 100).

sort optional string

optional Sort order (default: fractal_v1.4.5_fr).

min_price optional integer

optional Minimum price filter.

max_price optional integer

optional Maximum price filter.

min_beds optional integer

optional Minimum bedrooms.

max_beds optional integer

optional Maximum bedrooms.

min_baths optional integer

optional Minimum bathrooms.

max_baths optional integer

optional Maximum bathrooms.

has_photos optional boolean

optional Only return properties with photos (default: true).

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."
        ]
    }
}
 

Request      

GET v1/real-estate/property-urgency

Headers

Authorization Bearer {YOUR_AUTH_KEY}

Query Parameters

Parameter Type Description
propertyId required string

Property ID. Example: 1874828523

listingId required string

Listing ID. Example: 2996679504

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."
        ]
    }
}
 

Request      

GET v1/real-estate/property-estimates

Headers

Authorization Bearer {YOUR_AUTH_KEY}

Query Parameters

Parameter Type Description
propertyId required string

Property ID. Example: 1874828523

historicalYearsMin optional string

optional Start date for historical values (format: YYYY-MM-DD). Example: 2021-06-01

historicalYearsMax optional string

optional End date for historical values (format: YYYY-MM-DD). Example: 2026-06-01

forecastedMonthsMax optional string

optional End date for forecasted values (format: YYYY-MM-DD). Example: 2026-09-01

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."
        ]
    }
}
 

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."
        ]
    }
}
 

Request      

GET v1/real-estate/property-tax-history

Headers

Authorization Bearer {YOUR_AUTH_KEY}

Query Parameters

Parameter Type Description
propertyId required string

Property ID. Example: 1874828523

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."
        ]
    }
}
 

Request      

GET v1/real-estate/housing-market-details

Headers

Authorization Bearer {YOUR_AUTH_KEY}

Query Parameters

Parameter Type Description
zipcode required string

Location zipcode. Example: 94131

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."
        ]
    }
}
 

Request      

GET v1/real-estate/neighborhood-amenities

Headers

Authorization Bearer {YOUR_AUTH_KEY}

Query Parameters

Parameter Type Description
propertyId required string

Property ID. Example: 1874828523

categories optional string

optional Comma-separated list of amenity categories. Available categories: LOCAL_ACTIVE_AND_OUTDOOR, LOCAL_GROCERIES, LOCAL_SHOPPING, LOCAL_ENTERTAINMENT, LOCAL_FOOD_AND_DRINK, LOCAL_CAFES, LOCAL_PRESCHOOLS Default: all categories

radius_in_miles optional integer

optional Search radius in miles (default: 5). Example: 5

category_limit optional integer

optional Max amenities per category (default: 3). Example: 3

sort optional string

optional Sort order (default: DISTANCE). Options: DISTANCE, RATING

order optional string

optional Sort direction (default: ASC). Options: ASC, DESC

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."
        ]
    }
}
 

Request      

GET v1/real-estate/environment-risk

Headers

Authorization Bearer {YOUR_AUTH_KEY}

Query Parameters

Parameter Type Description
propertyId required string

Property ID. Example: 1874828523

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."
        ]
    }
}
 

Request      

GET v1/real-estate/nearby-home-values

Headers

Authorization Bearer {YOUR_AUTH_KEY}

Query Parameters

Parameter Type Description
lat required number

Latitude. Example: 37.745222

lon required number

Longitude. Example: -122.432128

radius optional string

optional Search radius (default: 5mi). Example: 5mi

limit optional integer

optional Number of results (default: 25, max: 100). Example: 25

status optional string

optional Property status filter. Options: for_sale, off_market, sold. Default: all.

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."
        ]
    }
}
 

Request      

GET v1/real-estate/geo-details

Headers

Authorization Bearer {YOUR_AUTH_KEY}

Query Parameters

Parameter Type Description
city_state required string

Location slug ID. Example: San-Francisco_CA

limit optional integer

optional Number of results (default: 20). Example: 20

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."
        ]
    }
}
 

Request      

GET v1/real-estate/similar-homes

Headers

Authorization Bearer {YOUR_AUTH_KEY}

Query Parameters

Parameter Type Description
propertyId required string

Property ID. Example: 1874828523

limit optional integer

optional Number of results (default: 25). Example: 25

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."
        ]
    }
}
 

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."
        ]
    }
}
 

Request      

GET v1/real-estate/new-construction

Headers

Authorization Bearer {YOUR_AUTH_KEY}

Query Parameters

Parameter Type Description
propertyId required string

Property ID. Example: 7652412597

status optional string

optional Property status filter (default: for_sale). Options: for_sale, ready_to_build

limit optional integer

optional Number of results (default: 25, max: 100). Example: 25

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."
        ]
    }
}
 

Request      

GET v1/real-estate/price-histogram

Headers

Authorization Bearer {YOUR_AUTH_KEY}

Query Parameters

Parameter Type Description
location required string

Location name. Example: San Francisco, CA

status optional string[]

optional Property status (default: ["for_sale","ready_to_build"]).

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."
        ]
    }
}
 

Request      

GET v1/real-estate/mortgage-rate

Headers

Authorization Bearer {YOUR_AUTH_KEY}

Query Parameters

Parameter Type Description
state required string

State code (2 letters). Example: CA