MENU navbar-image

🏠 Real Estate

Real estate API for property listings, sales, and rentals.

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': '3000170336',
}
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' => '3000170336',
        ],
    ]
);
$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": "3000170336",
};
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=3000170336" \
    --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: 3000170336

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