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

providers.rentcast.errors.no_valuation

Error message

providers.rentcast.errors.no_valuation

What it means

Raised by Provider::Rentcast#fetch_property_valuation when the RentCast AVM endpoint (GET /v1/avm/value) responds 200 but the parsed price field is blank. The message comes from I18n key providers.rentcast.errors.no_valuation (rendered for users, not developers). It means RentCast matched the request but has no valuation model output for that address — a data coverage gap, not an HTTP failure.

Source

Thrown at app/models/provider/rentcast.rb:46

    @api_key = api_key # pipelock:ignore
  end

  # Fetches the value estimate and the subject property's attributes in a
  # single request — `lookupSubjectAttributes` enriches the AVM response with
  # the property record, so a separate /v1/properties call isn't needed.
  def fetch_property_valuation(line1:, locality: nil, region: nil, postal_code: nil)
    with_provider_response do
      throttle_request
      record_monthly_request!

      response = client.get("#{base_url}/v1/avm/value") do |req|
        req.params["address"] = [ line1, locality, region, postal_code ].map { |part| part.to_s.strip }.reject(&:empty?).join(", ")
        req.params["lookupSubjectAttributes"] = true
      end

      parsed = JSON.parse(response.body)
      price = parsed["price"]
      raise Error.new(I18n.t("providers.rentcast.errors.no_valuation")) if price.blank?

      subject = parsed["subjectProperty"] || {}

      PropertyValuation.new(
        valuation: BigDecimal(price.to_s),
        currency: "USD",
        property_type: PROPERTY_TYPE_MAP[subject["propertyType"]],
        year_built: subject["yearBuilt"],
        area_value: subject["squareFootage"],
        area_unit: "sqft"
      )
    end
  end

  private
    attr_reader :api_key

    def default_error_transformer(error)

View on GitHub (pinned to e69894adb9)

Solutions

  1. Verify the address parts (line1, locality, region, postal_code) are complete and correctly spelled
  2. Test the same address directly against RentCast's /v1/avm/value to confirm the coverage gap
  3. Treat as an expected 'no estimate' outcome: rescue and record the property as unvalued rather than failing the batch
  4. For US properties only — RentCast is USD/US-only; non-US addresses will never value

Example fix

# before
valuation = provider.fetch_property_valuation(line1: prop.street) # raises when AVM has no price

# after
begin
  valuation = provider.fetch_property_valuation(
    line1: prop.street, locality: prop.city, region: prop.state, postal_code: prop.zip
  )
rescue Provider::Rentcast::Error => e
  Rails.logger.info "No RentCast valuation for #{prop.id}: #{e.message}"
  valuation = nil
end
Defensive patterns

Strategy: try-catch

Validate before calling

def valuation_address_usable?(line1:, locality:, region:, postal_code:)
  !line1.to_s.strip.empty? && !locality.to_s.strip.empty? && !region.to_s.strip.empty?
end

return unless valuation_address_usable?(**address)

Type guard

def rentcast_no_valuation?(error)
  error.is_a?(Provider::Rentcast::Error) && error.message == I18n.t("providers.rentcast.errors.no_valuation")
end

Try / catch

begin
  valuation = provider.fetch_property_valuation(**address)
rescue Provider::Rentcast::Error => e
  raise unless rentcast_no_valuation?(e)
  valuation = nil # expected outcome: AVM has no estimate for this address
end

Prevention

When it happens

Trigger: Calling fetch_property_valuation with an address RentCast cannot value: outside AVM coverage, rural/non-standard property, new construction not yet in records, or address parts malformed/incomplete enough that no property match yields a price.

Common situations: Valuing properties in counties RentCast's AVM doesn't cover; user-entered addresses with typos or missing city/zip; land or unusual property types; brand-new builds with no comps.

Related errors


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