Realtor.com via Scavio
Search Realtor.com listings for sale, pending, for rent or sold with the full filter set, read one property in full, pull housing market stats for an area, resolve a place name to a location, and find agents and read a full agent profile with every review. All endpoints return structured JSON.
When to trigger
Use this skill when the user asks to:
- Search US homes, land or rentals on Realtor.com by city, county, ZIP, neighborhood, a point and radius, or a listing agent
- Pull sold comps: recent sales in an area filtered by property type, lot size, price band and sold-within days
- Watch new listings whose description mentions a keyword (e.g.
workshop,live/work,storefront) across several cities - Look up one property by Realtor.com URL or property id: price history, tax history with assessed and market values, home value estimates, schools, flood and wildfire risk, the listing agent
- Get median listing, sold and rent prices, days on market and year-over-year change for a city, county or ZIP
- Find real estate agents in a city or ZIP, or read one agent's profile, license, sales stats and reviews
- Build a land, rental or new-construction lead list from Realtor.com
Setup
Get a free API key at scavio.dev (50 free credits to get started, no card required):
export SCAVIO_API_KEY=sk_live_your_key
If you do not have a key yet
An agent running this skill without SCAVIO_API_KEY set will get 401 on every
call below. The whole path from nothing to a working key is self-serve:
- Sign up at dashboard.scavio.dev - email or Google, no card required.
- A key is created for the account automatically at signup. It is on the dashboard under API Keys, ready to copy.
- A new account starts with 50 credits. Every endpoint in this skill costs 1 credit.
When the balance runs out the API answers 402 with a JSON body carrying
billing_url. Topping up needs no code change - the same key keeps working.
The smallest purchase is 2,500 credits for $25, and monthly plans work out
cheaper per credit if the usage is steady rather than one-off.
Every request is a POST with a JSON body and:
Authorization: Bearer $SCAVIO_API_KEY
Endpoints
Base URL: https://api.scavio.dev. Every Realtor.com endpoint costs 1 credit per call.
| Endpoint | Credits | What it returns |
|---|---|---|
POST /api/v1/realtor/search |
1 per page | Listings for sale, pending, for rent or sold, up to 200 per call: list price, sold price and date, beds, baths, sqft, lot size, year built, HOA, flags, address with county and coordinates, MLS id, listing agent and office |
POST /api/v1/realtor/property |
1 | One property in full: description and detail groups, price history, tax history, three home value estimates with ranges plus history and forecast, nearby schools with ratings, flood/wildfire/noise risk, the listing agent and office with contact details, mortgage estimate, photos |
POST /api/v1/realtor/locations |
1 | Location suggestions for a partial name: cities, counties, ZIPs, neighborhoods, schools and addresses, with the slug_id for market and the property_id for an address |
POST /api/v1/realtor/market |
1 | Market stats for a city, county or ZIP: median listing, sold and rent price, price per sqft, days on market, lot size, listing counts, year-over-year and month-over-month change, breakdown by property type |
POST /api/v1/realtor/agents |
1 per page | Agents by city, ZIP or name: rating, review and recommendation counts, active listings and price range, homes sold last year, broker, office, first year, services |
POST /api/v1/realtor/agent |
1 | One agent's profile with every review: bio, phones, website, license, MLS memberships, languages, specializations, served areas, office, social links, sales stats, and reviews with four sub-ratings and the agent's reply |
Workflow
- Search: call
/realtor/searchwithlocation(e.g."Maricopa County, AZ","Austin, TX", a ZIP) plus filters. Each row carriesproperty_idandurl. - Property: call
/realtor/propertywith aproperty_idfrom step 1, or a pastedurl. - Market: call
/realtor/locationswith a place name, take aslug_id(e.g.Austin_TX,Travis-County_TX), then call/realtor/marketwithlocation."City, ST"also works directly. - Agents: call
/realtor/agentswithlocation("Austin, TX"),postal_codeorname, then/realtor/agentwith anagent_id. A listing'sagent.agent_idalso works, and/realtor/searchwithagent_idreturns that agent's listings.
Pagination
- Search:
page(1-based) andpage_size(default 50, up to 200). The response carriestotal,countandmax_page.pagexpage_sizemay not exceed 10,000 - see Guardrails. - Agents:
page(1-based) andpage_size(default 20, up to 50). The response carriestotal. - Property, locations, market, agent: no paging.
Every page is 1 credit, so state the budget before looping.
Parameters
Search (/search)
Pass one of location, latitude + longitude + radius_miles, or agent_id.
| Parameter | Type | Default | Description |
|---|---|---|---|
location |
string | one of | City ("Austin, TX"), county ("Travis County, TX"), ZIP code, state or neighborhood |
latitude / longitude |
number | -- | Center of a radius search |
radius_miles |
number | -- | 0.1 to 50 miles around the center |
agent_id |
string | -- | Only this agent's listings |
listing_status |
string | for_sale |
for_sale (includes pending and contingent, as on the site), pending, for_rent, sold |
exclude_pending |
boolean | -- | for_sale only: leave out pending and contingent listings |
min_price / max_price |
number | -- | USD: list price, sold price on sold, monthly rent on for_rent |
beds_min / beds_max |
integer | -- | Bedrooms |
baths_min / baths_max |
number | -- | Bathrooms |
sqft_min / sqft_max |
integer | -- | Interior square feet |
lot_sqft_min / lot_sqft_max |
integer | -- | Lot size in square feet (1 acre = 43,560) |
year_built_min / year_built_max |
integer | -- | Year built, 1700-2100 |
garage_min |
integer | -- | Minimum garage spaces |
max_hoa |
number | -- | Maximum monthly HOA fee in USD; listings without an HOA fee are kept |
property_types |
string[] | -- | single_family, condos, townhomes, multi_family, land, mobile, farm |
listed_within_days |
integer | -- | Listed in the last N days, 1-3650 |
sold_within_days |
integer | -- | sold only: sold in the last N days, 1-3650 |
price_reduced_within_days |
integer | -- | Price cut in the last N days, 1-3650 |
keywords |
string[] | -- | 1-10 keywords matched against the listing text (e.g. ["workshop"]) |
new_construction |
boolean | -- | Only new construction |
foreclosure |
boolean | -- | Only foreclosures |
has_open_house |
boolean | -- | Only listings with an open house in the next 7 days |
sort |
string | relevance |
relevance, newest, price_low, price_high (sold price on sold), sold_newest (sold only), sqft_high, lot_size_high, year_built_new, recently_updated, recently_reduced |
page |
integer | 1 | Results page, 1-based |
page_size |
integer | 50 | Listings per page, 1-200 |
Property (/property)
| Parameter | Type | Default | Description |
|---|---|---|---|
property_id |
string | one of | Numeric property id from search or locations (e.g. 9564057635) |
url |
string | one of | A realtor.com property or rental URL |
Pass exactly one of property_id or url.
Locations (/locations)
| Parameter | Type | Default | Description |
|---|---|---|---|
query |
string | required | City, county, ZIP, neighborhood, school or street address, 1-200 chars |
Market (/market)
| Parameter | Type | Default | Description |
|---|---|---|---|
location |
string | required | A slug_id from locations (Austin_TX, Travis-County_TX) or "City, ST" |
Agents (/agents)
Pass exactly one of location, postal_code or name.
| Parameter | Type | Default | Description |
|---|---|---|---|
location |
string | one of | City as "City, ST" (e.g. "Austin, TX") |
postal_code |
string | one of | 5-digit ZIP code |
name |
string | one of | Agent name, 2-100 chars |
page |
integer | 1 | Results page, 1-1000 |
page_size |
integer | 20 | Agents per page, 1-50 |
Agent (/agent)
| Parameter | Type | Default | Description |
|---|---|---|---|
agent_id |
string | required | Numeric agent id from search rows (agent.agent_id) or agents (e.g. 642581) |
Examples
curl -X POST https://api.scavio.dev/api/v1/realtor/search \
-H "Authorization: Bearer $SCAVIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"location": "Maricopa County, AZ", "listing_status": "sold", "property_types": ["land"], "sold_within_days": 180, "lot_sqft_min": 5000, "page_size": 200}'
import requests
BASE = "https://api.scavio.dev"
# Your key from https://scavio.dev. Load it from your environment or secret
# store in real code - keep it out of source control.
API_KEY = "sk_your_key_here"
HEADERS = {"Authorization": f"Bearer {API_KEY}"}
def realtor(endpoint, body):
r = requests.post(f"{BASE}/api/v1/realtor/{endpoint}", headers=HEADERS, json=body)
r.raise_for_status()
return r.json()["data"]
# 1. Sold land comps in one county, up to 200 rows for 1 credit
comps = realtor("search", {"location": "Maricopa County, AZ", "listing_status": "sold",
"property_types": ["land"], "sold_within_days": 180,
"lot_sqft_min": 5000, "sort": "sold_newest", "page_size": 200})
print(comps["total"], "sales;", comps["max_page"], "pages at this size")
for row in comps["listings"]:
a = row["address"]
print(row["sold_price"], row["sold_date"], row["lot_sqft"], a["line"], a["city"], a["postal_code"])
# 2. Keyword watch: new for-sale listings mentioning "workshop"
fresh = realtor("search", {"location": "Austin, TX", "keywords": ["workshop"],
"listed_within_days": 7, "sort": "newest"})
for row in fresh["listings"]:
print(row["list_price"], row["beds"], row["sqft"], row["url"])
# 3. One property in full
home = realtor("property", {"property_id": "9564057635"})
print(home["list_price"], home["price_per_sqft"], home["hoa_fee"], home["risk"]["flood_severity"])
for event in home["property_history"]:
print(event["date"], event["event"], event["price"])
for school in home["schools"][:3]:
print(school["name"], school["rating"], school["distance_miles"])
# 4. Market stats for a city
loc = realtor("locations", {"query": "Austin"})["locations"][0] # slug_id "Austin_TX"
market = realtor("market", {"location": loc["slug_id"]})
print(market["median_listing_price"], market["median_days_on_market"], market["year_over_year_pct"])
# 5. Agents in a city, then one full profile with every review
agents = realtor("agents", {"location": "Austin, TX", "page_size": 10})
top = agents["agents"][0]
profile = realtor("agent", {"agent_id": top["agent_id"]})
print(profile["name"], profile["license"], profile["sold_total"], len(profile["reviews"]))
Response shapes
Every response uses the envelope { data, response_time, credits_used, credits_remaining }. Key data fields:
- search -
listing_status,total,count,page,page_size,max_page,listings[]. A row:property_id,listing_id,url,status,list_date,list_price,list_price_min,list_price_max,price_per_sqft,sold_price,sold_date,last_status_change_at,flags{new_listing,price_reduced,foreclosure,new_construction,pending,contingent,coming_soon},property_type,sub_type,beds,baths,baths_full,baths_half,sqft,lot_sqft,year_built,garage,stories,address{line,unit,city,state_code,postal_code,county,county_fips,lat,lng},hoa_fee,photo,photo_count,open_houses[],tags[],mls{id,listing_id},agent{agent_id,name},office{office_id,name},price_reduced_amount,estimate. - property - the search row fields plus
last_price_change_amount,last_price_change_date,days_on_market,description,features,neighborhoods[],details[]{category,parent_category,items[]},property_history[]{date,event,price,price_per_sqft,source},tax_history[]{year,tax,assessed{building,land,total},market{...}},valuations[]{source,estimate,high,low,date,is_best},valuation_history[]andvaluation_forecast[]{source,points[]{date,estimate}},schools[]{school_id,name,rating,parent_rating,distance_miles,levels[],grades[],funding,students,district},risk{flood_factor,flood_severity,fema_zone,fire_factor,fire_severity,noise_score},popularity[],listing_agent{agent_id,name,email,phone,license,office{name,email,phone}},buyer_agent,mortgage_estimate{tax_rate,insurance_rate,monthly_payment,loan_amount,down_payment},monthly_fees[],photos[],virtual_tours[],parcel{apn},mls_disclaimer. - locations -
query,count,locations[]{text,area_type,slug_id,city,state_code,postal_code,county,property_id,latitude,longitude}. - market -
location,geo_type,state_code,latitude,longitude,parents[]{geo_type,slug_id,name},median_listing_price,median_sold_price,median_rent_price,median_price_per_sqft,median_days_on_market,median_lot_sqft,listing_count,rental_listing_count,year_over_year_pct{active_listings,days_on_market,listing_price,price_per_sqft,rent},month_over_month_pct,by_property_type[]{type,median_listing_price,median_sold_price,median_price_per_sqft,median_days_on_market,median_lot_sqft}. - agents -
total,count,page,page_size,agents[]{agent_id,name,is_realtor,broker,office,photo,rating,review_count,recommendation_count,for_sale_count,for_sale_price_min,for_sale_price_max,last_listing_at,sold_last_year,first_year,services{buyer[],seller[]}}. - agent - the agents row plus
bio,phones[]{type,number},website,license{number,state},designations[],languages[],specializations[],served_areas[]{name,state_code},mls_memberships[],sold_total,last_sold_date,office_details{name,website,phones[],address},social{facebook,instagram,linkedin,x},reviews[]{review_id,rating,responsiveness,market_expertise,negotiation,professionalism,comment,reviewer,reviewer_type,location,year,date,reply}.
A sold land row, trimmed (captured, Maricopa County, AZ, listing_status: "sold", property_types: ["land"]):
{
"property_id": "1795946305",
"url": "https://www.realtor.com/realestateandhomes-detail/9155-W-Garfield-St_Tolleson_AZ_85353_M17959-46305",
"status": "sold",
"sold_price": 135000,
"sold_date": "2025-06-13",
"property_type": "land",
"lot_sqft": 6591,
"address": {
"line": "9155 W Garfield St",
"city": "Tolleson",
"state_code": "AZ",
"postal_code": "85353",
"county": "Maricopa",
"county_fips": "04013",
"lat": 33.455652,
"lng": -112.256709
}
}
A property, trimmed (captured, 9564057635, Austin, TX):
{
"data": {
"property_id": "9564057635",
"status": "for_sale",
"list_price": 535900,
"price_per_sqft": 301,
"beds": 3,
"baths": 3,
"sqft": 1778,
"lot_sqft": 5066,
"year_built": 2027,
"hoa_fee": 75,
"flags": { "new_listing": true, "new_construction": true },
"property_history": [
{ "date": "2026-10-10", "event": "Listed", "price": 535900, "source": "UnlockMLS" }
],
"schools": [
{ "name": "Newton Collins Elementary School", "rating": 7, "distance_miles": 1, "funding": "public" }
],
"risk": { "flood_factor": 1, "flood_severity": "minimal", "fema_zone": "X (unshaded)", "fire_factor": 6, "fire_severity": "Major" },
"listing_agent": { "agent_id": "100431241", "name": "Lee Jones", "phone": "(713) 948-6666", "license": "0439466" },
"mortgage_estimate": { "monthly_payment": 4218, "loan_amount": 428720, "down_payment": 107180 }
}
}
Market stats, trimmed (captured, Austin_TX):
{
"location": "Austin_TX",
"geo_type": "city",
"median_listing_price": 500000,
"median_sold_price": null,
"median_rent_price": 1949,
"median_price_per_sqft": 310,
"median_days_on_market": 81,
"listing_count": 7072,
"rental_listing_count": 7143,
"year_over_year_pct": { "active_listings": -3.46, "listing_price": -9.09, "rent": -2.31 },
"by_property_type": [
{ "type": "home", "median_listing_price": 525000, "median_sold_price": 484375, "median_days_on_market": 78 }
]
}
An agent review (captured, agent 1918615):
{
"review_id": "9f45762e-d0b0-4d9e-a28f-1376ff4a4011",
"rating": 5,
"responsiveness": 5,
"market_expertise": 5,
"negotiation": 5,
"professionalism": 5,
"reviewer": "Nick",
"reviewer_type": "BUYER",
"location": "Hutto, TX",
"date": "2026-09-11T03:03:43.157Z",
"reply": null
}
Guardrails
- 10,000 results per search.
pagexpage_sizemay not exceed 10,000; a request past that is a400. To cover a large area, slice it into separate searches by price band, property type, ZIP or radius, and de-duplicate byproperty_id. Never claim a search returned "every listing" whentotalis above 10,000. - Sold prices in non-disclosure states.
sold_priceis null in US sold-price non-disclosure states (Texas, Utah, Wyoming, Alaska, Idaho, Kansas, Louisiana, Mississippi, Montana, New Mexico, North Dakota and parts of Missouri);sold_datestill comes back. Say so when comps come back unpriced, and never estimate a missing sold price. valuations,schoolsandriskcan be null or empty for land and new construction. Some market medians are null at some geography levels (e.g.median_sold_pricefor a city).keywordsmatches the listing text, not a structured field; confirm a hit indescriptionvia/propertywhen it matters.- Public listing data only: no owner names, buyer or seller identities, or mortgage records.
- Results usually take 1-5 seconds per call; batch sequentially rather than firing many calls at once.
- Never fabricate prices, estimates, school ratings or reviews. Only return what the API returned, and surface the listing
urlso the user can verify.
Failure handling
400means an invalid or missing parameter (no location, point or agent on search; both or neither ofproperty_idandurl; more than one oflocation,postal_codeandnameon agents;pagexpage_sizeabove 10,000) - fix the body and retry.401means the API key is invalid or missing. CheckSCAVIO_API_KEY.402means the balance is out of credits. The body carriesbilling_url.404means the property, market or agent does not exist on Realtor.com; the error names what was not found, and the call is billed (1 credit).429means rate or usage limit exceeded. Wait before retrying. See rate limits.502/503mean Realtor.com data is temporarily unavailable - wait a few seconds and retry, up to a few times. These are not billed.- If a
locationstring returns nothing, resolve it with/realtor/locationsfirst and retry with the suggestion's text orslug_id. - If
SCAVIO_API_KEYis not set, prompt the user to export it before continuing.
SDKs
pip install scavio==0.20.0
from scavio import ScavioClient
client = ScavioClient() # reads SCAVIO_API_KEY
comps = client.realtor.search(location="Maricopa County, AZ", listing_status="sold",
property_types=["land"], sold_within_days=180, page_size=200)
home = client.realtor.property(property_id="9564057635")
places = client.realtor.locations("Austin")
market = client.realtor.market("Austin_TX")
agents = client.realtor.agents(location="Austin, TX", page_size=10)
profile = client.realtor.agent("1918615")
npm install scavio@0.20.0
import { Scavio } from "scavio";
const scavio = new Scavio(); // reads SCAVIO_API_KEY
const comps = await scavio.realtor.search({ location: "Maricopa County, AZ", listing_status: "sold", property_types: ["land"], page_size: 200 });
const home = await scavio.realtor.property({ property_id: "9564057635" });
const market = await scavio.realtor.market({ location: "Austin_TX" });
MCP: the Scavio MCP server exposes all 6 endpoints as tools (search_realtor, get_realtor_property, get_realtor_locations, get_realtor_market, search_realtor_agents, get_realtor_agent). Realtor.com is opt-in: add realtor to SCAVIO_PLATFORMS.
{
"mcpServers": {
"scavio": {
"command": "npx",
"args": ["-y", "@scavio/mcp-server@0.18.1"],
"env": {
"SCAVIO_API_KEY": "sk_live_your_key",
"SCAVIO_PLATFORMS": "default,realtor"
}
}
}
}
Docs
Full reference per endpoint: Realtor.com search, property, locations, market, agents, agent. Overview: Realtor.com API.
