Use cases at a glance
Rental market data is the foundation of multi-family and single-family rental investment decisions. Knowing average rents by bedroom count, tracking month-over-month rent growth, and identifying tight vs. loose markets separates savvy investors from those relying on gut feel. Rentcast provides reliable data; your OpenClaw agent automates the tracking and reporting.
Average rent by bed count
Pull avg rent for 1BR, 2BR, 3BR units in target zip. Baseline for underwriting.
Rent growth month-over-month
Compare avg rent this month vs. 30 days ago. Spot strong or soft rental markets.
Days-on-market for rentals
Rental DOM as a proxy for vacancy. Low DOM = tight market, high DOM = soft market.
Benchmark your own units
Input your unit's rent. Compare to market avg and identify upside/downside risk.
Weekly market rent report
Automated weekly snapshot: avg rent by BR, YoY growth, market outlook.
Gross yield and cap rate tracking
Combine rent data with property values to track portfolio cap rates over time.
Rentcast API setup
Rentcast (rentcast.io) is a rental data aggregator that pulls from public listings, MLS, and proprietary sources. It offers free and paid API tiers.
Getting your API key
- Visit
rentcast.ioand sign up for a free account. - Navigate to your dashboard and generate an API key.
- Free tier: 50 API calls per month. Sufficient for light testing on 1-2 zip codes.
- Paid tiers start at ~$29/month for 500 calls/month. Recommended for tracking 5-10 zips weekly or daily.
- Store your key in
secrets.envasRENTCAST_API_KEY=your_key_here.
API keys are tied to your account; keep them secret. Do not commit to version control.
Market rent snapshot agent
The market snapshot agent pulls rental data from Rentcast for a target zip, extracts average rent by bedroom count, and stores it for historical comparison.
---
name: rental-market-snapshot
schedule: "0 8 * * 1" # Weekly Monday 8 AM
tools:
- rentcast
config:
zip_codes: ["78704", "78723"]
target_bedrooms: [1, 2, 3, 4]
storage:
type: "json_file"
path: "/data/rental_snapshots.json"
retention_days: 365
output:
channels: ["slack", "email"]
slack:
webhook_url: "${SLACK_WEBHOOK_URL}"
---
job: |
for zip in config.zip_codes:
for br in config.target_bedrooms:
data = await rentcast.avm_rent_long_term({
zip_code: zip,
bedrooms: br
})
snapshot = {
zip: zip,
bedrooms: br,
avg_rent: data.median_rent,
active_listings: data.active_listings,
days_on_market: data.avg_dom,
timestamp: now()
}
store_snapshot(snapshot, config.storage.path)
report = generate_weekly_report(snapshots)
send_slack_message(report)
The agent runs weekly (Monday 8 AM) and pulls rental data for each zip/bedroom combination. It stores snapshots with a timestamp, enabling month-over-month and year-over-year comparisons. The report is automatically formatted and sent to Slack.
Rentcast endpoints and data
| Endpoint | Data Returned | Update Frequency | Free Tier Calls |
|---|---|---|---|
/avm/rent/long-term |
Median rent, # active listings, avg DOM, min/max rent by bedroom | Weekly | Included |
/markets/statistics |
Market-level rental stats: growth rate, affordability index, median income | Monthly | Included |
/listings/rental/long-term |
Individual rental listings (address, rent, bed/bath, pet policy) | Daily | Limited (20 results per call) |
/avm/rent/short-term |
Short-term (vacation rental) market data via STR platforms | Weekly | Paid only |
For most investors, the /avm/rent/long-term endpoint is the workhorse. It provides aggregated market data without burning API calls on individual listings.
Rent growth tracking
Detect month-over-month and year-over-year rent changes by comparing historical snapshots:
current_snapshot = get_latest_snapshot(zip, bedrooms)
month_ago_snapshot = get_snapshot_from_date(zip, bedrooms, 30_days_ago)
year_ago_snapshot = get_snapshot_from_date(zip, bedrooms, 365_days_ago)
mom_growth = ((current_snapshot.avg_rent - month_ago_snapshot.avg_rent)
/ month_ago_snapshot.avg_rent * 100)
yoy_growth = ((current_snapshot.avg_rent - year_ago_snapshot.avg_rent)
/ year_ago_snapshot.avg_rent * 100)
if mom_growth > 3:
alert("Strong monthly rent growth: {zip}, {bedrooms}BR, {mom_growth:.1f}%")
if yoy_growth > 10:
alert("Strong annual rent growth: {zip}, {bedrooms}BR, {yoy_growth:.1f}%")
Set thresholds based on your expectations. 3% month-over-month is unusual and suggests tight market/investor demand. 10% year-over-year is normal in growing markets; 20%+ is exceptional and worth investigating.
Vacancy proxy alert
True vacancy rate data (percent of units occupied) is difficult to access. Rental days-on-market serves as a proxy: when rental listings sit longer on the market, it suggests oversupply (loose market). When they turn quickly, it suggests undersupply (tight market).
Agent snippet:
data = await rentcast.avm_rent_long_term({zip_code: zip, bedrooms: br})
if data.avg_dom > 30:
alert("Rental market loosening in {zip}, {br}BR units averaging {data.avg_dom} days on market")
# Interpretation: Easy for landlords to find tenants. Rental growth may slow.
# Consider holding on rent increases or offering concessions.
elif data.avg_dom < 7:
alert("Tight rental market in {zip}, {br}BR units averaging {data.avg_dom} days on market")
# Interpretation: Tenants find units quickly. Strong rental growth potential.
# Consider price increases on lease renewal.
Benchmarking your own units
Create a simple config file listing your rental units with their current rent:
my_units:
- address: "123 Oak Street, Austin, TX 78704"
bedrooms: 3
bathrooms: 2
monthly_rent: 2800
- address: "456 Elm Avenue, Austin, TX 78704"
bedrooms: 2
bathrooms: 1
monthly_rent: 1950
Agent snippet for benchmarking:
for unit in my_units:
zip = extract_zip(unit.address)
br = unit.bedrooms
market_data = await rentcast.avm_rent_long_term({zip_code: zip, bedrooms: br})
market_rent = market_data.median_rent
variance = ((unit.monthly_rent - market_rent) / market_rent) * 100
if variance > 5:
alert("Unit ABOVE market: {unit.address} renting at ${unit.monthly_rent}, market avg ${market_rent} ({variance:+.1f}%)")
elif variance < -5:
alert("Unit BELOW market: {unit.address} renting at ${unit.monthly_rent}, market avg ${market_rent} ({variance:+.1f}%)")
This alerts you if your units are significantly above or below market, helping identify opportunities to raise rents (if below) or mitigate tenant turnover risk (if above).
HEARTBEAT schedule
Weekly market snapshot: 0 8 * * 1 (Monday 8 AM). Pull rental data for all monitored zips, compare to prior week, generate report.
Monthly market statistics: 0 8 1 * * (1st of month). Archive monthly snapshot for YoY comparisons.
Unit benchmarking: 0 8 * * 1 (Weekly Monday). Compare your units against market averages, alert on outliers.
Sample report output
Here's a typical weekly rental market report:
FAQ
Is Rentcast free to use?
Rentcast has a free tier that allows up to 50 API calls per month — enough for light monitoring of a few zip codes. Paid plans start at ~$29/month for 500 calls/month, scaling up for higher volume. For monitoring 5-10 zip codes on a daily or weekly schedule, a paid plan is recommended.
How accurate are Rentcast's rental estimates?
Rentcast pulls from a combination of listing data and reported lease transactions. For dense urban markets, estimates are generally within 5-10% of actual market rents. For rural or thin markets with few comparable rentals, accuracy degrades. Always supplement with manual spot-checking in markets where you're making major decisions.
Can I track vacancy rates by neighborhood?
Rentcast provides an active listings count and average days-on-market for rentals, which serves as a proxy vacancy indicator. True vacancy rate data (occupied vs. total units) requires census data or specialized datasets. The agent uses rental listing DOM as a vacancy proxy — short DOM = low vacancy = tight market.
What's a good DOM threshold to alert on for vacation rentals?
Short-term rental (STR) markets are different from long-term. Average DOM for STRs is measured in days between bookings, not days from listing to lease. For STRs, use Rentcast's /avm/rent/short-term endpoint (paid only) or integrate with Airbnb/VRBO APIs. Monitoring occupancy rate and average daily rate (ADR) is more relevant than DOM.
How do I handle zips with no rental data?
Rural or newly-developed markets may have few rental listings in Rentcast. The API will return null or sparse data. Add error handling to your agent: if rentcast returns insufficient data (<5 listings), skip the alert. Log it and move to the next zip. You could also manually source rent comps from Craigslist or local property management companies for thin markets.
Can I compare my rental rate to single-family vs. multi-family separately?
Rentcast aggregates both SFR and MF rentals in its median. The API doesn't split by property type in the free/basic tiers. For property-type-specific benchmarking, use ATTOM Data Solutions or Zillow's rental API (if available in your region). Alternatively, manually filter Rentcast's /listings/rental results by property type before calculating medians.