# Rent Estimate API - Property Value, Rent Comps and Listings (`nabeelbaghoor/rent-estimate-api`) Actor

Get rent and value estimates with comparables for any US address, search 150M+ property records with owner and tax data, pull for-sale and rental listings with agent contacts, and read zip code market statistics for median price, median rent and days on market.

- **URL**: https://apify.com/nabeelbaghoor/rent-estimate-api.md
- **Developed by:** [Nabeel Hassan](https://apify.com/nabeelbaghoor) (community)
- **Categories:** Real estate, Business, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $8.00 / 1,000 property or listing record returneds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Rent Estimate API - Property Value, Rent Comps and Listings

Get a rent or value estimate with the comparables behind it for any US address, and search 150M+ property records, live listings and zip code market statistics from the same actor.

### What this actor does

- **Rent estimates with comps.** Paste addresses, get a long term rent estimate, its low and high range, a rent per square foot figure, and every comparable rental behind it with its distance, size and how recently it was listed.
- **Value estimates with comps.** The same for sale value: an estimate, a range, and the comparable sales the estimate is built from.
- **Search property records.** Filter 150M+ US property records by city, state, zip code or a radius around a point, then narrow by property type, beds, baths, square footage, lot size and year built. Every row carries owner names, owner type, mailing address, the owner-occupied flag and the latest tax assessment.
- **For-sale and rental listings.** Search what is on the market now, or search removed listings to study recent history. Rows carry price, days on market, MLS name and number, and the listing agent and office contact details.
- **Zip code market statistics.** Median and average price, rent, price per square foot, days on market, new listings and total listings, with the sale and rental sides kept separate and months of history included.
- **Pay per result.** You are charged for rows that carry a real record. Addresses the provider cannot value are free.

### Bring your own key

This actor calls the provider with **your own API key**. Paste it into the API key field, or set it as the `DATA_API_KEY` secret. Nothing runs on anyone else's credentials, and a run without a key ends cleanly with an explanation rather than failing.

### Example output

```json
{
  "recordType": "rent-estimate",
  "requested": "5500 Grand Lake Dr, San Antonio, TX, 78244",
  "found": true,
  "formattedAddress": "5500 Grand Lake Dr, San Antonio, TX 78244",
  "city": "San Antonio",
  "state": "TX",
  "zipCode": "78244",
  "county": "Bexar",
  "propertyType": "Single Family",
  "bedrooms": 3,
  "bathrooms": 2,
  "squareFootage": 1878,
  "yearBuilt": 1973,
  "estimate": 1670,
  "estimateRangeLow": 1600,
  "estimateRangeHigh": 1740,
  "estimatePerSquareFoot": 0.89,
  "comparableCount": 5,
  "comparables": [
    {
      "formattedAddress": "5535 Grand Lake Dr, San Antonio, TX 78244",
      "price": 1695,
      "bedrooms": 3,
      "bathrooms": 2,
      "squareFootage": 1824,
      "distance": 0.04,
      "daysOld": 22,
      "correlation": 0.98
    }
  ]
}
```

### FAQ

#### How accurate is an automated rent estimate?

Each estimate comes with a low and high range and the comparables it was built from, so you can judge it rather than trust it blindly. A tight range over five nearby, recent, similar-sized comparables is a confident estimate; a wide range built from distant or old comparables is not. Use the comparable search radius and comparable age settings to insist on closer and fresher comps, accepting that some addresses will then return no estimate at all.

#### What is the difference between a value estimate and a rent estimate?

A value estimate answers what the property would sell for and is built from comparable sales. A rent estimate answers what it would let for on a long term lease and is built from comparable rentals. They are separate modes because they use different comparables and return different numbers, and running both gives you the gross yield.

#### Can I get the property owner's name?

Yes. Property record rows carry the owner names, the owner type such as individual or organization, the owner's mailing address, and whether the property is owner occupied. A mailing address that differs from the property address is the usual signal for an absentee owner.

#### How do I find every property in a city or zip code?

Use property records mode with a city and state, or a zip code on its own. The actor pages through results automatically at 500 rows per request and stops at your maximum rows setting. A zip code is usually more precise than a city name, because city names repeat across states and cover inconsistent areas.

#### Can I search a radius around a point?

Yes. Give a latitude and longitude, or a full address, together with a radius in miles. This works for property records, for-sale listings and rental listings.

#### What do the market statistics cover?

One row per zip code, with the sale and rental sides kept separate so the same measure names do not overwrite each other. Each side carries average, median, minimum and maximum price or rent, price or rent per square foot, median square footage, median days on market, new listings and total listings, plus however many months of history you asked for.

#### What does it cost?

Pricing is pay per result: 0.008 USD per property record or listing, 0.015 USD per value or rent estimate, and 0.01 USD per zip code of market statistics, with Apify platform usage included. Rows the provider found nothing for are not charged. You also need your own account with the data provider, which bills per request on its own plans.

#### Does the actor fail if my key is wrong?

No. A missing key, a rejected key, an exhausted plan allowance or an empty input all end the run cleanly with a message saying what to change. Only a real outage or a bug fails the run.

#### How fast does it run?

The provider allows 20 requests per second on every plan. The actor paces itself well below that by default and backs off automatically if it is rate limited, so a large search runs unattended without tripping the limit.

### Keyword map

rent estimate API, rental estimate API, property value estimate API, AVM API, automated valuation model, rent comps API, rental comparables, property records API, US property data API, owner name lookup, property owner data, for sale listings API, rental listings API, MLS listing data, days on market, median rent by zip code, housing market statistics API, real estate market data API, property tax assessment data, gross rental yield, real estate investor data

# Actor input Schema

## `mode` (type: `string`):

Property records searches the nationwide record set. Value estimate and rent estimate each take a list of addresses and return the estimate with its range and comparables. Sale listings and rental listings search what is on the market now. Market statistics returns one row per zip code.

## `addresses` (type: `array`):

Value estimate and rent estimate modes. One address per line, written as Street, City, State, Zip. The provider matches on that format, so a partial address returns fewer matches.

## `zipCodes` (type: `array`):

Market statistics mode. One five digit US zip code per line. Each one returns a row with the sale and rental sides side by side.

## `city` (type: `string`):

Search modes. The city to search, used together with the state, for example Austin.

## `state` (type: `string`):

Search modes. The two letter state code, for example TX. A state on its own is a valid nationwide-scale search.

## `zipCode` (type: `string`):

Search modes. A five digit ZIP code. On its own this is usually the most precise way to search an area.

## `address` (type: `string`):

Search modes. A single full address to look up, written as Street, City, State, Zip. Combined with a radius it becomes the centre of an area search instead.

## `latitude` (type: `string`):

Search modes. The centre of a circular area search. Give a longitude and a radius with it.

## `longitude` (type: `string`):

Search modes. The centre of a circular area search. Give a latitude and a radius with it.

## `radius` (type: `string`):

Search modes. How far from the centre point or address to search, in miles.

## `propertyType` (type: `string`):

Keeps only properties of this type. Land is indexed for property records and sale listings but not for rentals or rent estimates.

## `bedrooms` (type: `string`):

An exact count such as 3, or a range such as 3-5. In estimate modes this describes the subject property rather than filtering.

## `bathrooms` (type: `string`):

An exact count such as 2, or a range such as 2-3. Half baths count as 0.5.

## `squareFootage` (type: `string`):

An exact size such as 1600, or a range such as 1200-2000.

## `lotSize` (type: `string`):

Search modes. Lot size in square feet, as an exact value or a range such as 5000-20000.

## `yearBuilt` (type: `string`):

An exact year such as 1998, or a range such as 1990-2010.

## `saleDateRange` (type: `string`):

Property records mode. Keeps only properties whose last recorded sale falls within this many days, for example 365.

## `listingStatus` (type: `string`):

Listing modes. Active returns what is on the market now. Inactive returns listings that have since been removed, which is how to study recent market history.

## `price` (type: `string`):

Listing modes. An exact price, or a range such as 250000-500000. On rental listings this is the monthly rent.

## `daysOld` (type: `string`):

Listing modes. Keeps only listings first listed within this many days, for example 7 for the past week.

## `maxRadius` (type: `integer`):

Estimate modes. How far out to look for comparable properties. Leave empty to let the provider widen the search as needed.

## `compDaysOld` (type: `integer`):

Estimate modes. Ignores comparable sales or listings older than this many days. A tighter window tracks a fast moving market more closely but finds fewer comparables.

## `compCount` (type: `integer`):

Estimate modes. How many comparable properties to return with each estimate. The provider defaults to 5.

## `lookupSubjectAttributes` (type: `boolean`):

Estimate modes. Has the provider fill in the subject property's beds, baths and square footage from its own records before valuing it. Turn this off only if you want the estimate to use exactly the attributes you supplied and nothing else.

## `marketDataType` (type: `string`):

Market statistics mode. All returns both the sale and rental sides. Pick one side to keep the rows narrower.

## `historyRange` (type: `integer`):

Market statistics mode. How many months of historical statistics to include with each zip code. The provider defaults to 6.

## `maxResults` (type: `integer`):

The most rows this run will save and charge for. This is the spending control on both sides.

## `pageSize` (type: `integer`):

Search modes. How many rows to ask for at a time, up to the provider's ceiling of 500. The provider bills per request rather than per row, so a wider page is genuinely cheaper.

## `requestsPerMinute` (type: `integer`):

How fast to call the provider. The provider's hard ceiling is 20 requests per second on every plan, which is 1200 per minute.

## `apiKey` (type: `string`):

Your own API key for the property data provider, taken from your account dashboard. This actor is bring your own key: it never uses anyone else's credentials, and the key is stored as a secret.

## Actor input object example

```json
{
  "mode": "propertyRecords",
  "listingStatus": "Active",
  "lookupSubjectAttributes": true,
  "marketDataType": "All",
  "maxResults": 1000,
  "pageSize": 500,
  "requestsPerMinute": 300
}
```

# Actor output Schema

## `records` (type: `string`):

One row per record, alongside the address, zip code or search that produced it.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {};

// Run the Actor and wait for it to finish
const run = await client.actor("nabeelbaghoor/rent-estimate-api").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {}

# Run the Actor and wait for it to finish
run = client.actor("nabeelbaghoor/rent-estimate-api").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{}' |
apify call nabeelbaghoor/rent-estimate-api --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,nabeelbaghoor/rent-estimate-api"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/BwVlbrMa5b21fCWrZ/builds/ecYz1l2XfwlAwHu7l/openapi.json
