Troubleshooting Errors with Agents

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 CodeStatusMeaning
AUTH_KEY_NOT_FOUND401The x-api-key header doesn't match a known key.
AUTH_KEY_INACTIVE401Your key exists but is suspended.
AUTH_SCOPE_UNAUTHORIZED403Your key doesn't carry MLS scope.
MLS_PLAN_REQUIRED403Your account has no active MLS subscription or MLS add-on.
MLS_SUBSCRIPTION_INACTIVE402You had an MLS plan, but billing lapsed.
WALLET_INSUFFICIENT_BALANCE402Pay-as-you-go balance is too low.
RATE_LIMIT_EXCEEDED429Too many requests — see Retry-After.
DAILY_USAGE_EXCEEDED / TEST_KEY_USAGE_EXCEEDED429Daily 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 familyExample bad inputResulting 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)

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 CodeTriggerMessage shape
INVALID_BOARD_CODEUnrecognized mls_board_codeNearest-match suggestion + a full validBoards array (location-prioritized if you also sent state/city/zip)
MLS_NUMBER_NEEDS_BOARDmls_number with no board disambiguator, and the number exists on multiple boardsLists the boards that carry that number, location-prioritized
MLS_NUMBER_NOT_FOUNDmls_number doesn't exist on any boardNo 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.

ScenarioBehavior
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 all400 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 CodeTrigger
CONFLICTING_GEOBoth polygon and multi_polygon sent, or apn combined with latitude/longitude
INCOMPLETE_GEOradius without both latitude and longitude, or a partial lat/lng/radius combo
ANCHOR_NOT_FOUNDA radius anchor (assessor_id, listing_id, apn) doesn't resolve to a location
ANCHOR_NO_LOCATIONThe anchor resolved to a listing with no coordinates
USE_MLS_DETAILA 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 CodeTriggerExample
INVALID_RANGEA _min greater than its _max on any range filterlisting_price_min (500000) is greater than listing_price_max (200000).
INVALID_SORT_FIELDsort targets a field that isn't sortableReturns 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

TriggerMessage
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_sectionsNon-fatal warning, not an error

13. Server Errors

Error CodeStatusMeaning
INTERNAL_ERROR500Unexpected failure. No internal detail is leaked; a requestId is included when available — include it when contacting support.
ELASTICSEARCH_ERROR / EXTERNAL_SERVICE_ERROR502A downstream dependency failed. Safe to retry.

Quick Reference: All Error Codes

CodeStatus
AUTH_KEY_NOT_FOUND, AUTH_KEY_INACTIVE401
AUTH_SCOPE_UNAUTHORIZED, MLS_PLAN_REQUIRED, WALLET_ENDPOINT_NOT_AVAILABLE403
MLS_SUBSCRIPTION_INACTIVE, WALLET_INSUFFICIENT_BALANCE402
RATE_LIMIT_EXCEEDED, DAILY_USAGE_EXCEEDED, TEST_KEY_USAGE_EXCEEDED429
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_FOUND400
MLS_NOT_FOUND, MLS_NUMBER_NOT_FOUND, SEARCH_NO_RESULTS404
ELASTICSEARCH_ERROR, EXTERNAL_SERVICE_ERROR, S3_ERROR502
INTERNAL_ERROR500