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.
At a glance
| Base URL | https://listingsfeed.com/v1 |
|---|---|
| MCP endpoint | https://listingsfeed.com/mcp (streamable HTTP) |
| Auth | Authorization: Bearer <key> — details |
| Formats | JSON (default), GeoJSON, CSV |
| Pagination | Opaque cursor (meta.next_cursor), stable under inserts |
| Metering | Records returned; quota in every response (meta.quota, X-Quota-*) |
| Refresh | Weekly; 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/listings | Search listings. Reference | metered |
| GET/v1/listings/{hash_id} | One listing, every field | 1 record |
| GET/v1/brokerages | Brokerages with active listings | free |
| GET/v1/brokerages/{public_id} | One brokerage | free |
| GET/v1/stats | Counts by state / type / transaction, fill rates, last refresh | free |
| GET/v1/usage | Your quota and 30-day usage | free |
| POST/mcp | MCP JSON-RPC (tools/list, tools/call). Setup | per 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_idis derived from the source listing and never changes. If two sources turn out to be the same property, one record is retired withsuperseded_bypointing 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
400rather 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.