# US Real Estate Listings (RentCast, licensed, no scraping) (`kevinserver24/rentcast-listings`) Actor

US property listings (for-sale and rental) by zip: price, status, days on market, MLS number, price history, from a licensed RentCast feed. No listing agent/office field. Covers 3 pilot zips only: 78704, 90028, 60614; more as demand appears. Billed only if address, price and status are present.

- **URL**: https://apify.com/kevinserver24/rentcast-listings.md
- **Developed by:** [Kevin](https://apify.com/kevinserver24) (community)
- **Categories:** Real estate, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$10.00 / 1,000 listing delivereds

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

## US Real Estate Listings — licensed RentCast feed, refreshed on a schedule

*An independent tool. It is not affiliated with, endorsed by, or operated by
RentCast. It resells RentCast API data under RentCast's own resale licence
(API Terms of Use, Section 1) and reports what RentCast returns.*

**No scraper.** This Actor never touches Zillow, Realtor.com or any other
listing site's HTML. Its data comes from RentCast's licensed
`/listings/sale` and `/listings/rental/long-term` endpoints, refreshed on a
schedule and bundled into this Actor at build time.

**No listing agent or office contact field is ever emitted** — not
redacted after the fact, never requested from the source in the first
place. See "Why no agent contact info" below.

***

### What you get per listing

| Field | Meaning |
|---|---|
| `listing_id` | RentCast's own listing identifier |
| `market_type` | `sale` or `rental` — `price` means different things for each |
| `formatted_address`, `address_line1`, `address_line2`, `city`, `state`, `zip_code`, `county` | Where |
| `latitude`, `longitude` | |
| `property_type`, `bedrooms`, `bathrooms`, `square_footage`, `lot_size`, `year_built` | What |
| `status`, `price`, `listing_type` | Active/pending/etc, sale price or monthly rent, standard/new-construction/etc |
| `listed_date`, `removed_date`, `created_date`, `last_seen_date`, `days_on_market` | When |
| `mls_provider`, `mls_number` | Which MLS, when RentCast supplies one |
| `hoa_fee` | When present |
| `price_change_history` | Every listing/price event RentCast has on file for this address, oldest first |
| `charged` | Whether this row cost you anything |
| `not_charged_reason` | Why it did not, in plain English |

### Why no agent contact info

RentCast API Terms Section 2(iv) forbids using the data "to send automated
queries to any website or to send any unsolicited commercial e-mail." A
customer who received a listing agent's name, phone or email and used it to
cold-contact that agent would put RentCast's own data into exactly the
conduct that clause forbids. `listing_agent_*` and `listing_office_*` are
dropped in the refresh step, before anything reaches this Actor's own
bundled data — a bug downstream cannot resurrect a field that was never
kept.

***

### The billing rule, stated plainly

One event: **listing delivered**, charged only when the cached row has an
id, an address, a price and a status. A row missing any of those is
delivered free, with `not_charged_reason` saying which.

### Coverage — read this before you rely on it

This Actor answers from a **cache refreshed on a schedule**, not a live
call per request. `SUMMARY.json` in the run's key-value store reports
`cache_refreshed_at` and `cache_markets_covered` on every run, so you can
see exactly how fresh the data you received was and which zip codes are
served at all. **A zip code outside `cache_markets_covered` returns zero
rows and costs nothing — it is not an error, and it is not this Actor
guessing at coverage it does not have.**

Coverage is capped by RentCast's own request quota (RentCast bills per
request, not per record): only a limited number of zip codes can be
refreshed on any given schedule. Ask for the zip codes you actually need
covered if yours is not yet in `cache_markets_covered`.

***

### Input

```json
{
  "markets": ["78704"]
}
```

One zip code per line, up to 200 per run.

### Output

```json
{
  "listing_id": "2505-Bluebonnet-Ave,-Unit-5,-Austin,-TX-78704",
  "market_type": "sale",
  "formatted_address": "2505 Bluebonnet Ave, Unit 5, Austin, TX 78704",
  "city": "Austin",
  "state": "TX",
  "zip_code": "78704",
  "property_type": "Townhouse",
  "bedrooms": 2,
  "bathrooms": 2.5,
  "square_footage": 1519,
  "status": "Active",
  "price": 685900,
  "listing_type": "New Construction",
  "days_on_market": 468,
  "mls_provider": "UnlockMLS",
  "mls_number": "2231134",
  "hoa_fee": 300,
  "price_change_history": [ ... ],
  "charged": true,
  "not_charged_reason": ""
}
```

A `SUMMARY.json` lands in the key-value store with the counts, a breakdown
of every reason a listing was not charged, and the cache's own freshness —
so a stale refresh looks like a stale refresh, not like a quiet drop in
your results.

# Actor input Schema

## `markets` (type: `array`):

One US zip code per line, e.g. 78704. Only markets this Actor's cache currently covers will return listings -- an uncovered zip code returns nothing and costs nothing, it is not an error. Up to 200 zip codes per run.

## Actor input object example

```json
{
  "markets": [
    "78704"
  ]
}
```

# Actor output Schema

## `results` (type: `string`):

One row per matched listing -- address, price, status, days on market, MLS number, price-change history. No listing agent or office field is ever present.

## `resultsCsv` (type: `string`):

The same rows as a spreadsheet.

## `summary` (type: `string`):

How many markets were requested, how many cached listings matched, how many were charged and free, and when the underlying cache was last refreshed.

# 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 = {
    "markets": [
        "78704"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("kevinserver24/rentcast-listings").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 = { "markets": ["78704"] }

# Run the Actor and wait for it to finish
run = client.actor("kevinserver24/rentcast-listings").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 '{
  "markets": [
    "78704"
  ]
}' |
apify call kevinserver24/rentcast-listings --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,kevinserver24/rentcast-listings"
        }
    }
}

```

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/dlrpUXr0pTW4J4Vwp/builds/NCEAWveyrU515HMHM/openapi.json
