{"record":{"id":"27aa3dee8a088748","repo":"OpenBB-finance/OpenBB","slug":"no-holdings-were-found-for-query-symbol-and-the","errorCode":null,"errorMessage":"No holdings were found for {query.symbol}, and the response from Intrinio was empty.","messagePattern":"No holdings were found for (.+?), and the response from Intrinio was empty\\.","errorType":"exception","errorClass":"OpenBBError","httpStatus":null,"severity":"warning","filePath":"openbb_platform/providers/intrinio/openbb_intrinio/models/etf_holdings.py","lineNumber":196,"sourceCode":"                    next_page = results[\"next_page\"]  # type: ignore\n                    next_url = f\"{URL}&next_page={next_page}\"\n                    results = await amake_request(next_url, session=session, **kwargs)\n                    if \"holdings\" in results and len(results.get(\"holdings\")) > 0:  # type: ignore\n                        data.extend(results.get(\"holdings\"))  # type: ignore\n            return data\n\n        return await amake_request(URL, response_callback=response_callback, **kwargs)  # type: ignore\n\n    @staticmethod\n    def transform_data(\n        query: IntrinioEtfHoldingsQueryParams,\n        data: list[dict],\n        **kwargs: Any,\n    ) -> list[IntrinioEtfHoldingsData]:\n        \"\"\"Transform data.\"\"\"\n        if not data or isinstance(data, dict) and data.get(\"error\"):\n            if isinstance(data, list) and data == []:\n                raise OpenBBError(\n                    str(\n                        f\"No holdings were found for {query.symbol}, and the response from Intrinio was empty.\"\n                    )\n                )\n            raise OpenBBError(str(f\"{data.get('message')} {query.symbol}: {data['error']}\"))  # type: ignore\n\n        results: list[IntrinioEtfHoldingsData] = []\n        for d in sorted(data, key=lambda x: x[\"weighting\"], reverse=True):\n            # This field is deprecated and is dupilcated in the response.\n            _ = d.pop(\"composite_figi\", None)\n            if d.get(\"coupon\"):\n                d[\"coupon\"] = d[\"coupon\"] / 100\n            results.append(IntrinioEtfHoldingsData.model_validate(d))\n\n        return results\n","sourceCodeStart":178,"sourceCodeEnd":212,"githubUrl":"https://github.com/OpenBB-finance/OpenBB/blob/3e071fcc2cd9f891cac6040ae60296dba76dab46/openbb_platform/providers/intrinio/openbb_intrinio/models/etf_holdings.py#L178-L212","documentation":"Raised in IntrinioEtfHoldingsFetcher.transform_data when data is falsy (empty list) — i.e. the holdings endpoint returned successfully but with an empty holdings array for the symbol. Note the guard: 'if not data or isinstance(data, dict) and data.get(\"error\")' then an inner check that only the empty-list case produces this friendly message.","triggerScenarios":"Requesting ETF holdings for a valid ticker that is not an ETF (a stock or index), an ETF Intrinio has no holdings data for, or a share-class/FIGI formatting issue in the URL. The endpoint answers 200 with [] rather than an error payload.","commonSituations":"Passing indices like 'SPX' or 'DJI' (not tradable ETFs); using a ticker suffix Intrinio doesn't expect; obscure/young ETFs not yet in Intrinio's holdings database; assuming every ticker works because a previous ETF did.","solutions":["Confirm the symbol is actually an ETF (e.g. SPY, QQQ) — use obb.etf.search(provider='intrinio', query='...') to find valid ETF tickers","Try the ticker without exchange suffixes/punctuation, or with Intrinio's standard formatting","Fall back to another provider that sources holdings differently (e.g. 'fmp') if the ETF is valid but missing"],"exampleFix":"# before\nholdings = obb.etf.holdings(provider=\"intrinio\", symbol=\"SPX\").to_df()\n\n# after\nholdings = obb.etf.holdings(provider=\"intrinio\", symbol=\"SPY\").to_df()","handlingStrategy":"try-catch","validationCode":"KNOWN_ETFS = {\"SPY\", \"QQQ\", \"IWM\", \"VTI\", \"EFA\"}  # seed from obb.etf.search once\n\ndef is_likely_etf(symbol: str) -> bool:\n    return symbol.upper() in KNOWN_ETFS","typeGuard":"from openbb_core.provider.abstract.error import OpenBBError\n\ndef is_empty_holdings(err: BaseException) -> bool:\n    return isinstance(err, OpenBBError) and \"response from Intrinio was empty\" in str(err)","tryCatchPattern":"from openbb_core.provider.abstract.error import OpenBBError\nfrom openbb_core.provider.utils.errors import EmptyDataError\n\ntry:\n    holdings = await obb.etf.holdings(provider=\"intrinio\", symbol=sym)\nexcept OpenBBError as e:\n    if \"response from Intrinio was empty\" in str(e):\n        holdings = await obb.etf.holdings(provider=\"fmp\", symbol=sym)  # fallback provider\n    else:\n        raise","preventionTips":["Validate symbols are ETFs via etf.search before requesting holdings","Have a second provider as fallback for holdings coverage gaps","Don't pass index tickers (SPX/DJI) to ETF endpoints"],"tags":["etf","holdings","intrinio","empty-data","invalid-symbol"],"backgroundTag":null,"analyzedSha":"3e071fcc2cd9f891cac6040ae60296dba76dab46","analyzedAt":"2026-08-14T23:40:48.960Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}