Real Estate

Residential Listing

/extract/json

Schema for residential real estate listings including homes, condos, and townhouses for sale.

Download the schemareal-estate/residential-listing.json

residential-listing.schema

// names marked ? are optional

address:string// Street address of the property. Commonly found in: listing page header, property details section, MLS data block.
city:string// City where the property is located. Commonly found in: listing address line, property details, breadcrumb navigation.
state:string// State or province where the property is located. Commonly found in: listing address line, property details, breadcrumb navigation.
zip_code:string// ZIP or postal code of the property. Commonly found in: listing address line, property details.
country?:string// Country where the property is located. Commonly found in: listing address line, property details.
latitude?:number// Geographic latitude coordinate of the property. Commonly found in: map embed data, JSON-LD structured data, page metadata.
longitude?:number// Geographic longitude coordinate of the property. Commonly found in: map embed data, JSON-LD structured data, page metadata.
price:number// Listing price of the property in the listed currency. Commonly found in: listing header price display, property summary box, price history section.
price_currency?:string// ISO 4217 currency code for the listing price (e.g. USD). Commonly found in: price display, property details.
price_per_sqft?:number// Price per square foot of the property. Commonly found in: property details table, listing stats section.
status:string// Current listing status of the property. Commonly found in: listing status badge, property header, MLS status field. One of: active, pending, sold, off_market, other.
bedrooms:number// Number of bedrooms. Commonly found in: property specs bar, listing summary, property details table.
bathrooms_full:number// Number of full bathrooms. Commonly found in: property specs bar, listing summary, property details table.
bathrooms_half?:number// Number of half bathrooms. Commonly found in: property details table, listing summary.
sqft?:number// Total interior square footage of the property. Commonly found in: property specs bar, listing summary, property details table.
lot_size_sqft?:number// Lot size in square feet. Commonly found in: property details table, listing stats section.
year_built?:number// Year the property was built. Commonly found in: property details table, listing overview section.
property_type:string// Type of residential property. Commonly found in: listing header, property details, breadcrumb navigation. One of: single_family, condo, townhouse, multi_family, land, other.
stories?:number// Number of stories or floors in the property. Commonly found in: property details table, listing features section.
garage_spaces?:number// Number of garage parking spaces. Commonly found in: property details table, listing features section.
hoa_fee_monthly?:number// Monthly HOA (Homeowners Association) fee amount. Commonly found in: property details table, listing financial section, HOA info block.
days_on_market?:number// Number of days the property has been listed on the market. Commonly found in: listing stats section, property details table, MLS data.
listing_date?:string// Date the property was listed. Commonly found in: listing stats section, property history, MLS data.
description?:string// Full text description of the property. Commonly found in: listing description section, property overview text block.
features?:string[]// List of property features and amenities. Commonly found in: property features section, listing amenities list, interior/exterior features.
images?:string[]// URLs of property images. Commonly found in: photo gallery, listing image carousel, media section.
agent_name?:string// Name of the listing agent. Commonly found in: agent contact card, listing agent section, sidebar.
agent_phone?:string// Phone number of the listing agent. Commonly found in: agent contact card, listing agent section.
brokerage?:string// Name of the brokerage firm representing the listing. Commonly found in: agent contact card, listing attribution, footer.
mls_id?:string// MLS (Multiple Listing Service) identifier for this listing. Commonly found in: listing details table, MLS data block, footer attribution.
open_house_dates?:string[]// Scheduled open house dates and times. Commonly found in: open house section, listing sidebar, event calendar.
tax_assessed_value?:number// Tax assessed value of the property. Commonly found in: property tax section, listing financial details, public records.
annual_tax?:number// Annual property tax amount. Commonly found in: property tax section, listing financial details, public records.
page_title?:string// Title of the source page. Tabstack auto-fills this from page metadata when left empty.
favicon?:string// Favicon URL of the source page. Tabstack auto-fills this from page metadata when left empty.

Try it live

A sample Residential Listing document, generated from the schema. Edit it, or paste a real response, and see it checked against the schema instantly. It runs in your browser, nothing is sent anywhere.

your-output.json
validation

Valid, matches Residential Listing

Every required field is present and each value matches its type. Extra fields are allowed. A field the page does not carry is not guaranteed to come back as null, so check values rather than only checking for null.

/extract/json

Copy-paste usage

The same call in TypeScript, Python, and curl. Point it at your own URL and go. The schema drives the response, so you get back the fields you asked for instead of a page to parse.

Features

  • Typed TypeScript and Python SDKs
  • One call, no parsing code and no second LLM pass
  • The same field names on every request, even when the page layout changes
residential-listing.ts
// curl -sfLO https://raw.githubusercontent.com/Mozilla-Ocho/tabstack-schemas/main/real-estate/residential-listing.json
import Tabstack from '@tabstack/sdk'
import schema from './residential-listing.json' with { type: 'json' }

const client = new Tabstack() // reads TABSTACK_API_KEY from the environment

try {
  const data = await client.extract.json({
    url: 'https://example.com/listing/123',
    json_schema: schema,
    effort: 'standard', // 'min' | 'standard' | 'max'
  })

  console.log(data)
} catch (err) {
  console.error('Extraction failed:', err)
}

Ship this schema in one call.

Pass a URL, get matching JSON back. Free to start, no extraction layer to maintain.