Live real estate data
Listings from every portal, ready to model.
Point /extract at a listing and get back price, beds, baths, square footage, and status, matched to your schema and normalized across every portal. Build a property search, a valuation model, or a market feed from the live web with no scraper to maintain. The extraction happens inside the call.
import Tabstack, { APIError } from '@tabstack/sdk'
const client = new Tabstack()
// Listing in, property record out.
try {
const listing = await client.extract.json({
url: 'https://realty.example.com/homes/123',
json_schema: {
type: 'object',
properties: {
address: { type: 'string' },
price: { type: 'number' },
currency: { type: 'string' },
status: { type: 'string' },
beds: { type: 'number' },
baths: { type: 'number' },
sqft: { type: 'number' },
lot_size: { type: 'string' },
year_built: { type: 'number' },
property_type: { type: 'string' },
},
},
effort: 'standard',
})
console.log(listing) // normalized
} catch (err) {
if (!(err instanceof APIError)) throw err
console.error(err.status, err.message)
}The old way
Every portal structures listings differently.
Listings live across national portals, brokerage sites, and MLS front-ends, each with its own layout and its own fields. A DIY scraper needs a parser per portal, a headless browser for map-and-photo-heavy pages, and normalization glue on top, and it breaks the week a portal ships a redesign.
A parser per portal
- Every portal and brokerage site laid out differently
- Headless browsers for map- and photo-heavy pages
Constant repair
- Normalization glue to reconcile fields across sources
- Breaks on every redesign or anti-bot wall
/extract/json
One schema across every portal and brokerage site.
Define the property shape once (price, beds, baths, sqft, lot, year, status) and point /extract at any listing. The same call normalizes fields across portals with no per-site parser, JS- and map-heavy pages included. Run it across a URL list to build a search index or feed a valuation model.
Features
- ✓One schema across every portal layout
- ✓Price, beds, baths, sqft, and status in one call
- ✓Clean output from map- and photo-heavy pages
- ✓Run across a URL list to build an index
import Tabstack, { APIError } from '@tabstack/sdk'
const client = new Tabstack()
// Listing in, property record out.
try {
const listing = await client.extract.json({
url: 'https://realty.example.com/homes/123',
json_schema: {
type: 'object',
properties: {
address: { type: 'string' },
price: { type: 'number' },
currency: { type: 'string' },
status: { type: 'string' },
beds: { type: 'number' },
baths: { type: 'number' },
sqft: { type: 'number' },
lot_size: { type: 'string' },
year_built: { type: 'number' },
property_type: { type: 'string' },
},
},
effort: 'standard',
})
console.log(listing) // normalized
} catch (err) {
if (!(err instanceof APIError)) throw err
console.error(err.status, err.message)
}import Tabstack, { APIError } from '@tabstack/sdk'
const client = new Tabstack()
// store and notify are your own storage and alerting.
try {
// Snapshot a listing, diff for changes.
const page = await client.extract.markdown({
url: 'https://realty.example.com/homes/123',
effort: 'standard',
})
const prev = await store.get('listing-123')
if (page.content !== prev) {
await store.set('listing-123', page.content)
await notify('Listing changed')
}
} catch (err) {
if (!(err instanceof APIError)) throw err
console.error(err.status, err.message)
}/extract/markdown
Snapshot listings to catch price cuts and status changes.
Structured records capture the listing; a full-page snapshot captures the move. Grab a listing as clean markdown on a schedule, diff it against the last snapshot, and catch a price cut or a status change from for-sale to pending the day it happens, the signal that drives a deal.
Features
- ✓Clean full-page markdown for change tracking
- ✓Diff over time to catch price cuts and status changes
- ✓Run on a schedule and alert on change
- ✓The signal that drives a deal
Try it live
Extract a live property record.
Paste a listing URL and get a structured property record back from a real /extract/json call. The result is cached in your browser.
Runs a live /extract/json call and returns a structured property record.
Own it vs. buy it
Own the pipeline instead of licensing a property feed.
A licensed property feed covers the portals the vendor indexes and lags the listings on the actual pages. Build the extraction step on a handful of calls, pull exactly the markets you care about, refresh whenever you want, and own the pipeline.
Property feed vendor
- Only the portals and markets the vendor covers
- Listings that lag the live page
- A pipeline you cannot inspect or extend
Licensed feed
Build on Tabstack
owned- Usage-based credits across five endpoints
- Pull exactly the markets you need, refresh anytime
- Open every source and verify the listing yourself
Who builds on this
Teams that build property data without a portal license.
Proptech engineers
One schema across every portal, no parser to fix.
Investors & analysts
Market and valuation data straight to the warehouse.
Brokerages & agents
A price cut or status change the day it happens.
Agents
A live property lookup inside a workflow.
Mozilla-backed
Privacy, Transparency, and Control
When you build on /research, your users' questions and the data behind every answer stay yours. Tabstack is a Mozilla-backed platform, and we handle live-web research responsibly, so you can ship features your users actually trust.
Private by default.Queries and retrieved pages are used to build your answer and support you, then purged. Never sold, never used to train models.
Verifiable by design.Every answer returns source URLs and inline citations, so you and your users can confirm exactly where each claim came from.
Yours to control.You set the mode, scope, and depth of every call. No retained corpus, no lock-in, just clean, cited data you own.
See exactly how we source and handle data in the documentation.
Mozilla ManifestoPricing & Plans
All prices in USD.
Starter
100,000 credits included
For tinkerers & hobbyists who want to simply connect their systems to the internet.
Get StartedTeam
500,000 credits included
Low-latency, predictable cost automation so you can focus on your core product.
Get StartedPro
3,000,000 credits included
For teams deploying and managing production workloads efficiently at scale.
Get StartedEnterprise Plan
Need Custom Pricing?
Custom API quotas, dedicated support, and SLAs for high-volume teams.
Cost per action
Every endpoint bills in credits. Extract and Generate are a single action per call. Automate and Research run a variable number of actions per task, so cost scales with the work they do.
- Extract (Markdown)10 credits
- Extract (JSON)50 credits
- Generate100 credits
- Automate100 credits
- Research (Fast)250 credits
- Research (Balanced)350 credits
Add a portal without writing a parser.
Start with 10,000 free credits, no card.