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
- Verify the address parts (line1, locality, region, postal_code) are complete and correctly spelled
- Test the same address directly against RentCast's /v1/avm/value to confirm the coverage gap
- Treat as an expected 'no estimate' outcome: rescue and record the property as unvalued rather than failing the batch
- 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
- Require at least line1 + locality + region before calling the AVM
- Normalize user-entered addresses (strip, spell-check USPS) before valuation
- Treat 'no valuation' as a data state, not an exception path — log it and move on
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
- Realie matched a property in a different city or ZIP code. P
- Realie did not return a valuation for this property.
- No prices found for security #{symbol} on date #{date}
- No prices found for security #{symbol} on date #{date}
- No T-Invest price for #{symbol} on #{date}
AI-assisted analysis of we-promise/sure@e69894adb9 (2026-08-21).
Data as JSON: /api/errors/74226e61860397b3.
Report an issue: GitHub.