ListingsFeed

API documentation

ListingsFeed API

No sales call, no contract: sign in with your email, take a key, and call the API. ListingsFeed is a read-only, key-authenticated dataset of US commercial real estate listings that we collect, normalize, de-duplicate, geocode and health-check every week so you never build that pipeline. It is built for software: a REST API with predictable JSON, an MCP server for AI assistants and agents, an OpenAPI 3.1 document you can generate clients from, and CSV/GeoJSON exports for everything else.

One listings feed flowing from a warehouse and office into a map, a listing table and a chart

At a glance

Base URLhttps://listingsfeed.com/v1
MCP endpointhttps://listingsfeed.com/mcp (streamable HTTP)
AuthAuthorization: Bearer <key> — details
FormatsJSON (default), GeoJSON, CSV
PaginationOpaque cursor (meta.next_cursor), stable under inserts
MeteringRecords returned; quota in every response (meta.quota, X-Quota-*)
RefreshWeekly; every record carries first_seen, last_seen, updated_at
OpenAPI/openapi.json (3.1)
For LLMs/llms.txt · /.well-known/mcp.json

Endpoints

GET/v1/listingsSearch listings. Referencemetered
GET/v1/listings/{hash_id}One listing, every field1 record
GET/v1/brokeragesBrokerages with active listingsfree
GET/v1/brokerages/{public_id}One brokeragefree
GET/v1/statsCounts by state / type / transaction, fill rates, last refreshfree
GET/v1/usageYour quota and 30-day usagefree
POST/mcpMCP JSON-RPC (tools/list, tools/call). Setupper tool

A record

{
  "hash_id": "a91f0c3e5b2d47f1c8e0",
  "brokerage": {"public_id": "7c1d…", "name": "Example Commercial", "website": "https://…"},
  "name": "Cross-dock distribution facility",
  "address": "4120 Commerce Way", "city": "Fort Worth", "state": "TX", "zip": "76137",
  "county": null, "country": "US", "lat": 32.7912, "lng": -97.3521,
  "listing_type": "sale", "transaction_sale": true, "transaction_lease": false, "status": "active",
  "property_type": "industrial", "property_subtype": "Warehouse/Distribution",
  "sale_ask_total": 21500000.0, "sale_ask_psf": 116.85, "price_text": "$21,500,000",
  "price_upon_request": false, "cap_rate": null,
  "lease_rate_min": null, "lease_rate_max": null, "lease_type": null,
  "building_sf": 184000, "land_acres": 12.4, "year_built": 2019, "stories": 1, "units": null,
  "brokers": [{"name": "Dana Whitfield", "email": "[email protected]", "phone": "(817) 555-0100"}],
  "link": "https://…/listing", "brochure_link": "https://…/flyer.pdf",
  "date_created": "2026-08-01T00:00:00+00:00", "date_updated": null,
  "first_seen": "2026-08-02T06:14:03+00:00", "last_seen": "2026-09-21T06:02:11+00:00",
  "updated_at": "2026-09-21T06:02:11+00:00", "is_active": true, "superseded_by": null
}

Fields that are not stated by the broker are null, never guessed: a price under $1,000 in a feed is a placeholder and is returned as null; "acres" values that are really square feet are converted; anything unparseable stays empty. See the data dictionary for every field, its source and how often it is filled.

Design principles

  • Stable ids. hash_id is derived from the source listing and never changes. If two sources turn out to be the same property, one record is retired with superseded_by pointing at the survivor.
  • Additive changes only. New fields and filters may appear at any time; removals and renames are announced in the changelog at least 30 days ahead.
  • Unknown parameters fail loudly. A typo in a filter name returns 400 rather than silently returning everything.
  • Same filters everywhere. The API, the MCP tools and the web builder share one parser; a query you build in the browser is the query string you paste into code.

Next

Quickstart Get a key