Circle of Wizards All APIs on RapidAPI →

PropertySpec

Turn any messy real estate listing — a URL, raw HTML, or plain text — into one clean, normalized JSON property record.

PropertySpec is an AI extraction endpoint for real estate data. Point it at a listing page, paste in the HTML, or send the raw description text, and it returns a single structured record with address, price, beds, baths, square footage, features, and agent details. It's built for developers aggregating listings from FSBO sites, regional MLS exports, Craigslist, classifieds, and other mixed, inconsistent sources.

Endpoints

Endpoint What it returns
POST /extract A normalized PropertyRecord JSON object parsed from the supplied listing. Top-level fields: address (street, city, state, zip, country), property_type, status, price (amount, currency, per_sqft), bedrooms, bathrooms, sqft, lot_sqft, year_built, garage (type, spaces), hoa_monthly, features (string array), days_on_market, listing_agent (name, phone, agency), photos_count, mls_id, source_url, and cached.
GET /health { "status": "ok" } — liveness check, no auth required.

POST /extract request body — supply at least one of:

  • url — link to a listing page. PropertySpec fetches it and strips it to readable text for you.
  • html — raw HTML of a listing page (scripts, styles, and images are stripped automatically).
  • text — plain-text property description.
  • intent (optional)"sale" or "rental". A hint that tunes the status field when the listing doesn't state it explicitly.

Send nothing and you get a 422. Supply a url that can't be fetched and you get a 502.

Why this API

  • One schema, any source. FSBO blurbs, scraped HTML, and MLS text exports all collapse into the exact same field set, so you can stop writing a bespoke parser per site.
  • LLM-powered, not regex-brittle. Extraction runs on DeepSeek with strict JSON-mode output, so it handles free-form, unstructured listing copy that pattern-matching breaks on.
  • Computed price.per_sqft. When both price and square footage are present, per-square-foot is derived for you and rounded to two decimals — no post-processing needed.
  • Built-in URL fetching. Pass a url and PropertySpec retrieves the page, cleans the HTML to visible text, and parses it in a single call.
  • 24-hour response cache. Identical requests return instantly and are flagged with "cached": true, keeping your repeat lookups fast and cheap.

Typical use cases

  • Normalizing listings aggregated from multiple FSBO, classifieds, and regional MLS sources into one consistent database schema.
  • Backfilling structured fields (beds, baths, sqft, HOA, year built) from free-text or copy-pasted listing descriptions.
  • Powering a "paste a listing, get clean data" feature in a CRM, lead tool, or property comparison app.
  • Enriching scraped listing HTML into queryable records for analytics, search, or de-duplication pipelines.
  • Quickly extracting agent contact details (name, phone, agency) and mls_id from raw listing pages.

Good to know

  • At least one input is required. url, html, or text — omitting all three returns 422. If multiple are sent, html/text content is used for parsing while url is recorded as source_url.
  • Every field is nullable. Anything not present in the listing comes back as null (features returns an empty array []). Output quality depends entirely on what the source listing actually contains.
  • This is an AI extractor, not a property database. It does not connect to Zillow, MLS feeds, or any real-estate data provider — it only structures the content you give it. There is no address lookup or enrichment beyond the supplied text.
  • Plain HTTP fetching only. URL retrieval uses a standard HTTP client (15s timeout, redirects followed, 500 KB cap). It does not render JavaScript or use proxies, so single-page-app listings or bot-protected pages may return little usable content — pass html or text directly in those cases.
  • Responses are cached for 24 hours. A repeated identical request returns the stored record with "cached": true. The cache key is derived from the full request body, so any change to the input produces a fresh extraction.
  • bathrooms uses 0.5 increments (e.g. 2.5 for two full plus one half bath), and price.currency is returned as an ISO 4217 code such as "USD".