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

Realie did not return a valuation for this property.

Error message

Realie did not return a valuation for this property.

What it means

Raised in Provider::Realie#fetch_property_valuation after a record matched the address: neither record["modelValue"] nor record["totalMarketValue"] was present AND positive. Realie deliberately returns modelValue: 0 when its AVM cannot produce an estimate, so zero counts as absent and the assessed totalMarketValue is the fallback; when both are 0/blank the provider gives up with the I18n no_valuation message.

Source

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

        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"],
        area_unit: "sqft"
      )
    end
  end

  private
    attr_reader :api_key

    # The address lookup matches on street + state only (filtering by city
    # additionally requires a county, which isn't collected), so a common
    # street name can resolve to properties in other cities. A candidate

View on GitHub (pinned to e69894adb9)

Solutions

  1. Treat as expected data absence: fall back to another valuation provider or prompt the user to enter a manual valuation.
  2. Retry after the next county assessment cycle if the property is new (no code change helps until data exists).
  3. Inspect the raw record once (log record["modelValue"], record["totalMarketValue"]) to confirm both are truly 0/blank rather than formatted oddly (e.g. '$450,000' or '450K' strings would to_d to 0 — if seen, normalize strings before the check in your own wrapper).
  4. Gate the 'estimated value' UI affordance on valuation presence so users are not promised a number the county cannot supply.

Example fix

# before
valuation = realie.fetch_property_valuation(line1:, locality:, region:, postal_code:)

# after
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_valuation")
  valuation = rentcast.fetch_property_valuation(line1:, locality:, region:, postal_code:) # alternate AVM
end
Defensive patterns

Strategy: fallback

Validate before calling

# cheap pre-check on any locally cached record copy (the live check lives in the provider)
has_value = ->(v) { v.present? && v.to_d.positive? }
# nothing to validate pre-call for a first lookup — the data lives server-side

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_valuation")
  valuation = rentcast.fetch_property_valuation(line1:, locality:, region:, postal_code:)
end

Prevention

When it happens

Trigger: A matched property whose AVM model has no estimate (0 modelValue) AND no assessed totalMarketValue in the county data (new construction, recently split parcels, counties with sparse assessment feeds); records where both fields are null strings; values returned as negative or non-numeric strings that to_d evaluates to 0.

Common situations: Newly built homes ahead of the first tax assessment; rural counties with minimal data; older records where only land value is assessed and market fields are empty; users expecting a valuation where public data simply does not have one yet.

Related errors


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