we-promise/sure · warning · Provider::Realie::Error

Realie did not return a property for this address.

Error message

Realie did not return a property for this address.

What it means

Raised in Provider::Realie#fetch_property_valuation when the address lookup (GET /api/public/property/address/ with address + state params) succeeded but returned no usable records: parsed["property"] was nil, an empty array, or contained only blank entries. The user-facing copy comes from I18n providers.realie.errors.no_property, so this is an expected 'no data' outcome, not an integration bug.

Source

Thrown at app/models/provider/realie.rb:63

  # Realie model (AVM) value, so no separate valuation request is needed.
  def fetch_property_valuation(line1:, locality: nil, region: nil, postal_code: nil)
    with_provider_response do
      throttle_request
      record_monthly_request!

      # The address lookup endpoint accepts only the street address and
      # 2-letter state code — filtering by city additionally requires a
      # county, which the property address form doesn't collect.
      response = client.get("#{base_url}/api/public/property/address/") do |req|
        req.params["address"] = line1.to_s.strip
        req.params["state"] = region.to_s.strip.upcase
      end

      parsed = JSON.parse(response.body)
      records = parsed["property"]
      records = [ records ] unless records.is_a?(Array)
      records = records.reject(&:blank?)
      raise Error.new(I18n.t("providers.realie.errors.no_property")) if records.empty?

      # A street+state query can return several candidates across different
      # cities; pick the first one consistent with the entered city/ZIP.
      record = records.find { |candidate| location_match?(candidate, locality: locality, postal_code: postal_code) }
      raise Error.new(I18n.t("providers.realie.errors.location_mismatch")) if record.nil?

      # Realie returns modelValue: 0 when it couldn't produce an AVM
      # estimate, so zero counts as absent and falls back to the assessed
      # total market value.
      valuation = [ record["modelValue"], record["totalMarketValue"] ].find { |value| value.present? && value.to_d.positive? }
      raise Error.new(I18n.t("providers.realie.errors.no_valuation")) if valuation.nil?

      PropertyValuation.new(
        valuation: BigDecimal(valuation.to_s),
        currency: "USD",
        property_type: subtype_for_use_code(record["useCode"]),
        year_built: record["yearBuilt"],
        area_value: record["buildingArea"],

View on GitHub (pinned to e69894adb9)

Solutions

  1. Normalize the inputs before calling: strip the street line, require a valid 2-letter state code, and keep the unit out of line1 if possible.
  2. Retry once with a simplified address variant (drop directional suffixes like 'Nw', remove unit designators).
  3. Fall back to another valuation provider or mark the property as manually appraisable when Realie has no coverage for the area.
  4. Check Realie docs/coverage notes for the state — if unsupported, gate the provider by state in the UI.

Example fix

# before
valuation = realie.fetch_property_valuation(
  line1: "123 Main St Nw Apt 2B", region: "Washington"
) # -> no_property

# after
line1 = address.line1.strip.sub(/\b(?:apt|unit|ste)\s*\S+\b/i, "")
region = States.abbreviation_for(address.region) # ensure 2-letter code
raise ArgumentError, "state required" if region.blank?
valuation = realie.fetch_property_valuation(line1: line1, region: region, locality: address.city, postal_code: address.zip)
Defensive patterns

Strategy: fallback

Validate before calling

line1 = line1.to_s.strip
region = region.to_s.strip.upcase
raise ArgumentError, "2-letter state required" unless region.match?(/\A[A-Z]{2}\z/)
raise ArgumentError, "street required" if line1.length < 5

Try / catch

begin
  valuation = realie.fetch_property_valuation(line1:, locality:, region:, postal_code:)
rescue Provider::Realie::Error => e
  raise unless e.message == I18n.t("providers.realie.errors.no_property")
  valuation = rentcast.fetch_property_valuation(line1:, locality:, region:, postal_code:)
end

Prevention

When it happens

Trigger: Street address not present in Realie's coverage (sparse counties, rural parcels); malformed or abbreviated street line ('123 Main St Nw Apt 2' vs normalized form); wrong 2-letter state code; newly constructed address not yet in the dataset.

Common situations: Users typing free-text addresses with typos; coverage gaps for small towns; unit numbers confusing the matcher; state code lowercase or full name passed in (the code upcases region, but a full name like 'Washington' still fails since it must be 2 letters).

Related errors


AI-assisted analysis of we-promise/sure@e69894adb9 (2026-08-21). Data as JSON: /api/errors/1350feb3d1a873d2. Report an issue: GitHub.