MLS Listings API - Sold Prices, Comps, Agent Contacts avatar

MLS Listings API - Sold Prices, Comps, Agent Contacts

Pricing

from $12.00 / 1,000 mls listing returneds

Go to Apify Store
MLS Listings API - Sold Prices, Comps, Agent Contacts

MLS Listings API - Sold Prices, Comps, Agent Contacts

Search MLS listings across the US and Canada with sold prices and status history, pull the expanded record with listing agents, comparables and room detail, group listings by building, and compute market statistics over any filter set.

Pricing

from $12.00 / 1,000 mls listing returneds

Rating

0.0

(0)

Developer

Nabeel Hassan

Nabeel Hassan

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Share

Search MLS listings across the US and Canada, pull the expanded record with the listing agents, the full status history and the comparables, and compute market statistics over any filter set you can express.

What this actor does

  • Search live and off-market listings. Over a hundred real filters: city, area, neighbourhood, ZIP, price, sold price, bedrooms, bathrooms, square footage, lot dimensions, year built, days on market, taxes, maintenance fee, basement, heating, garage, pool, water source, sewer, amenities, exterior construction, and the board's status and last-status codes.
  • Sold prices and status history. The expanded record for one MLS number carries the complete MLS history: every previous listing of that property with its own number, status, list price, sold price and dates. That is what separates one property relisted three times at falling prices from three separate listings.
  • Listing agent contacts. Where the board publishes them, each agent's name, position, email, phone numbers, website, brokerage and office ID.
  • Comparables and room detail. The provider's own comparables with distance and prices, plus the room by room breakdown with each room's level, dimensions and features, and the open house schedule.
  • Buildings, not just listings. Building search groups every current and historical listing at one address under one record with the unit size range and the unit count, which is what a condominium directory or a pre-construction study needs.
  • Market statistics. Averages, medians, minimums, maximums, sums, standard deviations and counts of list price, sold price, price per square foot, days on market, taxes and maintenance fees, grouped by day, month, quarter or a trailing window, computed over whatever your filters select.
  • Agents, offices and locations. The reference sides of the MLS, for building pickers and directories.
  • Pay per result. You are charged for rows that carry a real record. MLS numbers your boards do not carry are free.

Bring your own key

This actor calls the provider with your own API key. Paste it into the API key field, or set it as the DATA_API_KEY secret. Nothing runs on anyone else's credentials, and a run without a key ends cleanly with an explanation rather than failing.

Your key reaches the MLS boards your own agreement covers. An MLS number on a board outside it comes back as not found rather than as an error, so a run over a mixed list tells you which ones your key can see.

Respect the display permissions

Every listing row carries the three permission fields the MLS sets per listing: displayPublic, displayAddressOnInternet and displayInternetEntireListing. They travel on the row rather than being dropped because ignoring them is the one thing that reliably gets an MLS data licence pulled. If you are publishing this data anywhere public, filter on them first.

Example output

{
"recordType": "listing",
"requested": "city in Toronto",
"found": true,
"mlsNumber": "W10440893",
"status": "A",
"lastStatus": "New",
"class": "ResidentialProperty",
"type": "Sale",
"listPrice": 1249000,
"originalPrice": 1299000,
"soldPrice": null,
"listDate": "2026-08-19T21:25:27.868Z",
"daysOnMarket": 24,
"streetNumber": "623",
"streetName": "Prosser",
"streetSuffix": "Circ",
"city": "Milton",
"neighborhood": "Harrison",
"state": "Ontario",
"latitude": 43.493111,
"longitude": -79.8736743,
"propertyType": "Townhouse",
"style": "3-Storey",
"bedrooms": 3,
"bedroomsPlus": 1,
"bedroomsTotal": 4,
"bathrooms": 2,
"sqft": "1100-1500",
"yearBuilt": "6-15",
"garageSpaces": 1,
"parkingSpaces": 2,
"annualTaxes": 4210,
"brokerageName": "Example Realty Inc.",
"displayPublic": "Y"
}

FAQ

Why are there three bedroom columns?

Because local listings quote "3+1", meaning three bedrooms plus a converted basement room, and the two numbers are recorded separately. Dropping the plus count understates the property and silently folding it in overstates it, so the output carries bedrooms, bedroomsPlus and the computed bedroomsTotal and lets you choose. The filters follow the same split.

Why is square footage text rather than a number?

Because many boards publish a band such as "1100-1500" rather than a figure, and coercing that to a number produces NaN. The field is kept exactly as the board published it. The minSqft and maxSqft filters still work, because the provider handles the band comparison on its side.

How do I get sold prices?

Filter on a sold status - the board's last status code such as Sld, or the standard status Closed - and set a sold date range. Unsold listings carry a sold price of 0 in the provider's data, which would read as "sold for nothing" in a report, so this actor writes null there instead and only reports a sold price when there is one.

How do I build a comparables set?

Two ways. Listing details mode on the subject's MLS number returns the provider's own comparables with their distances and prices. Or search directly: same neighbourhood, a sold status, a sold date within the last six months, and a bedroom and square footage band around the subject. The second gives you control over what counts as comparable; the first is faster.

Can I tell whether a property has been relisted?

Yes, and this is the main reason to use listing details rather than search. The expanded record's history array lists every previous listing of that same property with its own MLS number, status, list price and sold price. A property that has been withdrawn and relisted twice looks like fresh inventory in a plain search and does not here.

How do I run a daily delta instead of the whole market?

Filter on minRepliersUpdatedOn with yesterday's date. That is the provider's own ingestion timestamp rather than the board's, which makes it the reliable one for a delta: a board can restate a record without changing its own updated date, and the provider's timestamp still moves.

What is an address key?

The provider's identifier for a physical address, which is how it groups every listing at that address over time. It is in the address.addressKey field of a building record, and putting it into the listing search's address key filter returns the whole listing history for that one address.

How do I discover what values a filter accepts?

Use market statistics mode with the aggregates field set to the field name you are unsure about. The provider counts the distinct values it actually holds for that field within your filters, which is more reliable than guessing at a board's vocabulary - boards spell the same idea differently, and the style and property type fields are the worst for it.

Which boards and regions are covered?

The provider aggregates MLS boards across the US and Canada, and which ones your key reaches depends on your own agreement with them. Set a board ID filter when the same MLS number exists on more than one board you can see.

What does it cost?

Pricing is pay per result: 0.012 USD per listing, 0.02 USD per expanded listing with agents, history and comparables, 0.01 USD per building, 0.006 USD per market statistic, and 0.005 USD per location, agent or office, with Apify platform usage included. Rows the provider found nothing for are not charged. You also need your own account with the data provider, which bills on its own plans.

Does the actor fail if my key is wrong?

No. A missing key, a rejected key, an exhausted plan allowance or an empty input all end the run cleanly with a message saying what to change. Only a real outage or a bug fails the run.

Keyword map

MLS listings API, real estate API US Canada, MLS data feed, sold prices API, RESO Web API, property comparables API, listing agent contact data, MLS status history, days on market, real estate market statistics API, condominium building directory, pre-construction data, IDX alternative, Toronto MLS data, Ontario real estate data, property listings scraper alternative, brokerage office directory, real estate agent directory API