Why this matters
/v3/MLSDetailBulk fetches up to 1,000 full listing records in one call, in the same shape as MLS Detail. Results come back in the same order you sent the IDs. If one ID misses, you get an error object in that spot instead of a failed request.
Use it whenever you already have a list of listings to fetch. Running one large MLS Search that returns full records page by page is slower. It's also easier to break: if anything changes mid-job, the pages can shift under you. Collecting IDs first, then fetching records in batches of 1,000, is faster and safer and in cases where you're calling for more than 5 "field_sections" or 50 total "fields" in the v3/MLSSearch, it is enforced to call the Bulk endpoint to enrich with that much data
Common use cases
- Second step of a search job. Collect listing IDs with MLS Search, then fetch the full records here.
- Daily or hourly sync. Find what changed since your last run, then refresh only those listings.
- Watchlist or portfolio refresh. Re-pull the listings a user is tracking to catch price and status changes.
- Add MLS data to a public-record property list. Send RealEstateAPI property IDs (
public_ids) and get each property's MLS listing back. - Lead lists and daily alerts. Fetch full records for today's new listings, then send "new in your area" emails.
Workflow 1: Search for IDs, then fetch records
Step 1. Collect IDs with MLS Search in listing_ids_only mode. Repeat with resultIndex until you have every page:
{
"mls_board_code": "txaustin",
"status": "Active",
"listing_date_min": "2026-09-30",
"listing_ids_only": true,
"size": 250
}Step 2. Send the IDs here, up to 1,000 per call:
{
"listing_ids": [10678958569, 10678958504, 10678958464],
"field_sections": ["ROOT", "address", "listingDetails", "media"]
}See "listing_ids_only" Mode for Bulk MLS Data Enrichment Jobs for the full pattern, including running several searches and deduping the IDs before you fetch.
Workflow 2: Incremental sync
Keep your copy of the data current without re-pulling everything.
Step 1. Ask MLS Search for listings modified since your last run:
{
"mls_board_code": "txaustin",
"modification_timestamp_min": "2026-09-30",
"listing_ids_only": true,
"size": 250
}Step 2. Fetch those IDs here in batches of 1,000, and update your records.
Use modification_timestamp_min for this, since it's set reliably on every board. The status-change and price-change dates aren't recorded consistently across all boards yet, so they can miss recent changes.
Workflow 3: Add MLS data to a property list
If you already have RealEstateAPI property IDs, for example from Property Search, send them as public_ids:
{ "public_ids": [325961565], "field_sections": ["ROOT", "listingAgent"] }You'll get each property's current MLS listing. Send either listing_ids or public_ids, not both.
Reading the response
Results keep your order. A miss is an error object in the same position, so you can match results to inputs by index:
{
"data": [
{ "listingId": 10678958569, "currentStatus": "Active", "...": "..." },
{ "id": 999999999999, "match": false, "error": true, "errorCode": "MLS_NOT_FOUND", "errorMessage": "No listing found for this listing ID." },
{ "listingId": 10678958504, "currentStatus": "Active", "...": "..." }
],
"recordCount": 2,
"statusCode": 200
}recordCountcounts only the records that were found.- If every ID misses,
statusCodein the body is404, but the HTTP status is still200. Check the body. - Add
verbose: trueto get adetailobject on each miss with a hint, which is handy while debugging:
{ "detail": { "lookupField": "listingId", "value": 999999999999, "hint": "Verify the listing ID, or use MLSSearch with listing_ids_only to discover valid IDs." } }Tips
| Tip | Why |
|---|---|
| Batch at 1,000 IDs | That's the per-call maximum |
| Ask only for the sections you store | Large batches with every section are slow to transfer |
| Handle misses separately | A miss means no listing matched that ID. Rerun your search to pick up current IDs rather than retrying the same one |
| Process new and recently changed listings first | Active listings change the most, so refresh them before older closed records |