MLS Search Errors — A Complete Index
Every error /v3/MLSSearch can return, organized by category. Each error includes an errorCode you can branch on programmatically, plus a human-readable message. As of this write-up, every 400-class error also echoes your original input in the response body so you can correlate the error against exactly what you sent.
How to read an error response
{
"statusCode": 400,
"error": "Bad Request",
"message": "...",
"input": { "...": "your original request payload" },
"errorCode": "SOME_ERROR_CODE"
}Some errors attach additional structured fields beyond message — e.g. a list of valid values, or nearby suggestions — always documented per error below.
1. Authentication & Plan Errors
These fire before your filters are even evaluated.
| Error Code | Status | Meaning |
|---|---|---|
AUTH_KEY_NOT_FOUND | 401 | The x-api-key header doesn't match a known key. |
AUTH_KEY_INACTIVE | 401 | Your key exists but is suspended. |
AUTH_SCOPE_UNAUTHORIZED | 403 | Your key doesn't carry MLS scope. |
MLS_PLAN_REQUIRED | 403 | Your account has no active MLS subscription or MLS add-on. |
MLS_SUBSCRIPTION_INACTIVE | 402 | You had an MLS plan, but billing lapsed. |
WALLET_INSUFFICIENT_BALANCE | 402 | Pay-as-you-go balance is too low. |
RATE_LIMIT_EXCEEDED | 429 | Too many requests — see Retry-After. |
DAILY_USAGE_EXCEEDED / TEST_KEY_USAGE_EXCEEDED | 429 | Daily cap hit for this endpoint or test key. |
Fix: check your plan status in the billing console, or confirm the correct key/scope is in use.
2. Request Shape Errors (Joi Validation)
Fired when the payload itself is malformed — bad types, unknown fields, missing dependencies. All validation errors are returned together in one response (not one-at-a-time), so fix everything the message lists in a single pass.
Unknown field:
{ "has_ho": true }→ "has_ho" is not allowed (did you mean "has_hoa"?) — up to 3 ranked suggestions are shown when the name is ambiguous.
Missing required dependency:
{ "mls_number": "382938" }→ mls_number requires mls_board_code or mls_board_name — MLS numbers are not unique across boards.
Wrong type / shape: standard Joi messages (e.g. "bedrooms" must be a number).
3. Catalog & Enum Value Errors
Fields backed by a fixed vocabulary (property types, feature values, statuses) validate the value against the real catalog. Casing never blocks a match — "duplex" silently resolves to "Duplex". Only a genuinely unrecognized value errors, and it always comes with a suggestion.
| Field family | Example bad input | Resulting message |
|---|---|---|
property_sub_type | "Dooplex" | "Dooplex" is not a valid property sub-type — did you mean "Duplex"? |
listing_property_type | "RESIDENSHUL" | Suggests the nearest match and lists every valid value (this catalog is small enough to spell out in full) |
Feature fields (cooling, heating, flooring, roof, fencing, security_features, electric, window_features, patio_porch_features, exterior_features, appliances, sewer, water_source, property_condition, buyer_financing, current_financing, development_status) | "Compsition" on roof | "Compsition" is not a valid roof value — did you mean "Composition"? plus the full catalog |
hoa_amenities | "Recreation" | "Recreation" is not a valid HOA amenity — did you mean "Recreation Facilities", "Recreation Room"? |
status / previous_status | "Solld" | Nearest match from the status vocabulary; note "Sold" itself is a built-in alias for the stored value "Closed" |
hoa_fee_frequency / hoa_fee_frequency2 | "anual" | 400 INVALID_FEE_FREQUENCY: "anual" is not a recognized fee frequency — did you mean "annually"? — a close typo (e.g. "Anually") auto-corrects instead, returning results with a warning rather than erroring |
Fix: use the suggested value, or check the full catalog listed in the error.
4. Name Field Validation
*_agent_name fields (listing_agent_name, selling_agent_name, colisting_agent_name, coselling_agent_name) require a first and last name — a single token like "Arlene" matches thousands of unrelated agents and is rejected outright rather than silently returning noisy results:
{ "listing_agent_name": "Arlene" }→ agent name must include at least a first and last name (e.g. "John Smith")
Office name fields (listing_office_name, etc.) don't have this restriction — single-word office names ("Compass", "Redfin") are valid.
5. Cross-Role Field Mismatch (WRONG_ROLE)
WRONG_ROLE)If a search on an email, phone, or name field returns zero results, we check whether that exact value exists under a different role before giving up silently — e.g. you searched listing_agent_email but the address is actually under selling_agent_email.
{ "listing_agent_email": "[email protected]" }→ 400 WRONG_ROLE: listing_agent_email "[email protected]" returned no results — this value exists under: selling_agent_email. Try searching with that field instead.
This covers all 8 roles (listing/selling/colisting/coselling × agent/office) across email, phone, name, and MLS code fields. If zero results are genuinely due to no match anywhere, you instead get the generic zero-results warning (see §11).
6. Ambiguous Identity — a Warning, Not an Error
Not a hard failure — searching a name or MLS code that resolves to more than one real agent/office returns your results plus a structured warning so you can narrow down:
{ "colisting_office_name": "RE/MAX Gold" }→ 200 response, with:
"warnings": [{
"warning": "AMBIGUOUS_IDENTITY",
"field": "colisting_office_name",
"value": "RE/MAX Gold",
"totalMatches": 43,
"message": "colisting_office_name \"RE/MAX Gold\" matches 43 distinct offices (different people / mls_codes). Provide mls_board_code and/or the office's mls_code to narrow down results for this name — see \"matches\".",
"matches": [{ "officeName": "...", "mlsBoardCode": "...", "mlsBoardName": "...", "listingCount": 12 }]
}]Additionally, any *_mls_code field used without mls_board_code gets a standing informational warning — even when there's no duplicate today — since MLS codes aren't guaranteed unique across boards:
listing_agent_mls_code is not guaranteed to be unique across MLS boards — include mls_board_code to ensure you target the right listing.
Fix: add mls_board_code to pin the exact board.
7. MLS Board & MLS Number Errors
| Error Code | Trigger | Message shape |
|---|---|---|
INVALID_BOARD_CODE | Unrecognized mls_board_code | Nearest-match suggestion + a full validBoards array (location-prioritized if you also sent state/city/zip) |
MLS_NUMBER_NEEDS_BOARD | mls_number with no board disambiguator, and the number exists on multiple boards | Lists the boards that carry that number, location-prioritized |
MLS_NUMBER_NOT_FOUND | mls_number doesn't exist on any board | No listing matched mls_number "..." on any board — verify the number. |
Fix: use a code from validBoards/boards for mls_board_code, or the name for mls_board_name.
8. School District Errors
school_district matches against real district names in full — never by a single word, so a bare "Houston" won't silently return every "Houston"-adjacent district.
| Scenario | Behavior |
|---|---|
| Exact match (case-insensitive) | Resolves directly, no warning |
Close typo ("Sacremento") | Auto-corrects to "Sacramento" + a warning, results still returned |
Partial / ambiguous ("Houston") | 400 SCHOOL_DISTRICT_NOT_FOUND with suggestedSchoolDistricts: the nearest real district names |
| No match at all | 400 SCHOOL_DISTRICT_NOT_FOUND with the closest fuzzy candidates |
{ "school_district": "Dallas" }→ No school district closely matches "Dallas" — did you mean one of: "Dallas ISD", "211 - Dallas", ...? District names are matched in full, not by individual words.
9. Geo & Radius Errors
| Error Code | Trigger |
|---|---|
CONFLICTING_GEO | Both polygon and multi_polygon sent, or apn combined with latitude/longitude |
INCOMPLETE_GEO | radius without both latitude and longitude, or a partial lat/lng/radius combo |
ANCHOR_NOT_FOUND | A radius anchor (assessor_id, listing_id, apn) doesn't resolve to a location |
ANCHOR_NO_LOCATION | The anchor resolved to a listing with no coordinates |
USE_MLS_DETAIL | A bare single-record lookup (assessor_id/listing_id/apn with no radius) — Search isn't the right endpoint for this; use MLS Detail, or add radius |
10. Range & Sort Errors
| Error Code | Trigger | Example |
|---|---|---|
INVALID_RANGE | A _min greater than its _max on any range filter | listing_price_min (500000) is greater than listing_price_max (200000). |
INVALID_SORT_FIELD | sort targets a field that isn't sortable | Returns a leaf-aware "did you mean" against real sortable fields |
11. Unsupported Filters & Silent Zero-Results
Unsupported filter (UNSUPPORTED_FILTER, 400): some v2-parity field names have no v3 target — these fail loudly with an actionable hint rather than silently ignoring the filter:
{ "county": "Travis" }→ Unsupported v3 MLS filter(s): county (county is public-record sourced — use public_county)
Other examples: sold_price/sold_date_* (not yet indexed on the MLS side — use public-record fields), listing_office_address/selling_office_address (not searchable — use _name/_mls_code), pets_allowed/has_spa_features/spa_features (pending pipeline population).
Silent zero-results (not an error): a well-formed query that simply matches nothing returns 200 with recordCount: 0 and a plain warning: "Your search returned 0 matches — the filters may be too restrictive." Combined with §5/§6, most silent misses on identity fields now get a more specific explanation instead.
12. Field-Selection Errors
| Trigger | Message |
|---|---|
Unknown fields path | "listingDetals.beds" is not a selectable field — did you mean: "listingDetails.beds"? See the v3 MLS field catalog in the docs. |
Unknown field_sections value | "adress" is not a valid field section — did you mean "address"? |
Redundant fields entry already covered by field_sections | Non-fatal warning, not an error |
13. Server Errors
| Error Code | Status | Meaning |
|---|---|---|
INTERNAL_ERROR | 500 | Unexpected failure. No internal detail is leaked; a requestId is included when available — include it when contacting support. |
ELASTICSEARCH_ERROR / EXTERNAL_SERVICE_ERROR | 502 | A downstream dependency failed. Safe to retry. |
Quick Reference: All Error Codes
| Code | Status |
|---|---|
AUTH_KEY_NOT_FOUND, AUTH_KEY_INACTIVE | 401 |
AUTH_SCOPE_UNAUTHORIZED, MLS_PLAN_REQUIRED, WALLET_ENDPOINT_NOT_AVAILABLE | 403 |
MLS_SUBSCRIPTION_INACTIVE, WALLET_INSUFFICIENT_BALANCE | 402 |
RATE_LIMIT_EXCEEDED, DAILY_USAGE_EXCEEDED, TEST_KEY_USAGE_EXCEEDED | 429 |
VALIDATION_FAILED, INVALID_ADDRESS, UNSUPPORTED_FILTER, INVALID_SORT_FIELD, CONFLICTING_GEO, INCOMPLETE_GEO, INVALID_RANGE, INVALID_FEE_FREQUENCY, INVALID_BOARD_CODE, MLS_NUMBER_NEEDS_BOARD, ANCHOR_NOT_FOUND, ANCHOR_NO_LOCATION, USE_MLS_DETAIL, WRONG_ROLE, SCHOOL_DISTRICT_NOT_FOUND | 400 |
MLS_NOT_FOUND, MLS_NUMBER_NOT_FOUND, SEARCH_NO_RESULTS | 404 |
ELASTICSEARCH_ERROR, EXTERNAL_SERVICE_ERROR, S3_ERROR | 502 |
INTERNAL_ERROR | 500 |