we-promise/sure · error · Provider::YahooFinance::Error

No security info found for #{symbol}

Error message

No security info found for #{symbol}

What it means

Provider::YahooFinance::Error raised in fetch_security_info when the quoteSummary response contains no result entry — the API answered successfully (auth passed) but returned an empty/absent quoteSummary.result array for the normalized symbol.

Source

Thrown at app/models/provider/yahoo_finance.rb:265

      # Check for auth errors in response body
      if data.dig("quoteSummary", "error", "code") == "Unauthorized"
        # Clear cached crumb and retry once
        clear_crumb_cache
        cookie, crumb = fetch_cookie_and_crumb
        response = authenticated_client(cookie).get("#{base_url}/v10/finance/quoteSummary/#{symbol}") do |req|
          req.params["modules"] = "assetProfile,price,quoteType"
          req.params["crumb"] = crumb
        end
        data = JSON.parse(response.body)
        if data.dig("quoteSummary", "error", "code") == "Unauthorized"
          raise AuthenticationError, "Yahoo Finance authentication failed after crumb refresh"
        end
      end

      result = data.dig("quoteSummary", "result", 0)

      raise Error, "No security info found for #{symbol}" unless result

      asset_profile = result["assetProfile"] || {}
      price_info = result["price"] || {}
      quote_type = result["quoteType"] || {}

      security_info = SecurityInfo.new(
        symbol: symbol,
        name: price_info["longName"] || price_info["shortName"] || quote_type["longName"] || quote_type["shortName"],
        links: asset_profile["website"],
        logo_url: nil, # Yahoo doesn't provide reliable logo URLs
        description: asset_profile["longBusinessSummary"],
        kind: map_security_type(quote_type["quoteType"]),
        exchange_operating_mic: exchange_operating_mic
      )

      security_info
    rescue JSON::ParserError => e
      raise Error, "Invalid response format: #{e.message}"

View on GitHub (pinned to e69894adb9)

Solutions

  1. Search the symbol via search_securities to see Yahoo's canonical form and use that exact symbol
  2. Confirm the ticker still exists on finance.yahoo.com — delisted symbols return empty results
  3. Check normalize_symbol behavior for the given mic — pass the correct exchange_operating_mic so suffixes are applied properly
  4. Rescue this error and mark the security as 'info unavailable' instead of failing the whole sync

Example fix

// before
info = provider.fetch_security_info(symbol: symbol, exchange_operating_mic: mic)

// after
begin
  info = provider.fetch_security_info(symbol: symbol, exchange_operating_mic: mic)
rescue Provider::YahooFinance::Error => e
  raise unless e.message.include?("No security info found")
  matches = provider.search_securities(symbol)
  canonical = matches.first
  info = canonical ? provider.fetch_security_info(symbol: canonical.symbol, exchange_operating_mic: canonical.exchange_operating_mic) : nil
end
Defensive patterns

Strategy: try-catch

Try / catch

begin
  provider.fetch_security_info(symbol:, exchange_operating_mic:)
rescue Provider::YahooFinance::Error => e
  raise unless e.message.include?("No security info found")
  match = provider.search_securities(symbol).first
  match ? provider.fetch_security_info(symbol: match.symbol, exchange_operating_mic: match.exchange_operating_mic) : nil
end

Prevention

When it happens

Trigger: Requesting info for an unknown, delisted, or renamed symbol; a symbol valid on one exchange but normalized to a Yahoo form that has no quoteSummary (suffix/prefix mismatches like 'ASML.AS' vs 'ASML'); symbols for asset types the endpoint doesn't summarize.

Common situations: Stored security symbols going stale after delisting/rename; symbols imported from another provider (Trading 212, Twelve Data) not matching Yahoo's format; OTC or thinly-traded tickers lacking quoteSummary modules.

Related errors


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