{"record":{"id":"7849b2fd79f7fd03","repo":"OpenBB-finance/OpenBB","slug":"no-ratings-data-returned","errorCode":null,"errorMessage":"No ratings data returned.","messagePattern":"No ratings data returned\\.","errorType":"exception","errorClass":"EmptyDataError","httpStatus":null,"severity":"warning","filePath":"openbb_platform/providers/benzinga/openbb_benzinga/models/analyst_search.py","lineNumber":428,"sourceCode":"    async def aextract_data(\n        query: BenzingaAnalystSearchQueryParams,\n        credentials: dict[str, str] | None,\n        **kwargs: Any,\n    ) -> list[dict]:\n        \"\"\"Extract the raw data.\"\"\"\n        # pylint: disable=import-outside-toplevel\n        from openbb_benzinga.utils.helpers import response_callback\n        from openbb_core.provider.utils.helpers import amake_request, get_querystring\n\n        token = credentials.get(\"benzinga_api_key\") if credentials else \"\"\n        querystring = get_querystring(query.model_dump(by_alias=True), [])\n        url = f\"https://api.benzinga.com/api/v2.1/calendar/ratings/analysts?{querystring}&token={token}\"\n        data = await amake_request(url, response_callback=response_callback, **kwargs)\n\n        if (isinstance(data, list) and not data) or (\n            isinstance(data, dict) and not data.get(\"analyst_ratings_analyst\")\n        ):\n            raise EmptyDataError(\"No ratings data returned.\")\n\n        if isinstance(data, dict) and \"analyst_ratings_analyst\" not in data:\n            raise OpenBBError(\n                f\"Unexpected data format. Expected 'analyst_ratings_analyst' key, got: {list(data.keys())}\"\n            )\n\n        if not isinstance(data, dict):\n            raise OpenBBError(\n                f\"Unexpected data format. Expected dict, got: {type(data).__name__}\"\n            )\n\n        return data[\"analyst_ratings_analyst\"]\n\n    @staticmethod\n    def transform_data(\n        query: BenzingaAnalystSearchQueryParams,\n        data: list[dict],\n        **kwargs: Any,","sourceCodeStart":410,"sourceCodeEnd":446,"githubUrl":"https://github.com/OpenBB-finance/OpenBB/blob/3e071fcc2cd9f891cac6040ae60296dba76dab46/openbb_platform/providers/benzinga/openbb_benzinga/models/analyst_search.py#L410-L446","documentation":"BenzingaAnalystSearchFetcher.a_fetch_data (analyst_search.py:428) calls Benzinga's /calendar/ratings/analysts endpoint; if the decoded payload is an empty list, or a dict whose 'analyst_ratings_analyst' key is missing-or-empty, it raises EmptyDataError(\"No ratings data returned.\"). This is the normal 'no rows match your filters' outcome, not a transport failure.","triggerScenarios":"Querying analyst search with filters (firm, ticker, date pages) that match no analysts in Benzinga's coverage window; the endpoint returns {} or {\"analyst_ratings_analyst\": []}.","commonSituations":"Narrow date-page/firm filters, small-cap or non-covered tickers, free-tier keys that return empty bodies, and weekend/holiday windows with no rating actions.","solutions":["Catch EmptyDataError and present an empty result for that filter set.","Widen the filters: drop firm/ticker constraints or request a larger pages value / date range.","Verify the Benzinga key works with a known-covered ticker (e.g. AAPL) to rule out auth-level emptiness.","Retry with adjusted parameters rather than the identical request."],"exampleFix":"# before\nres = obbject.stocks.ca.analyst_search(provider=\"benzinga\", firm=\"Tiny Boutique Co\")\n\n# after\nfrom openbb_core.provider.standard_models.errors import EmptyDataError\ntry:\n    res = obbject.stocks.ca.analyst_search(provider=\"benzinga\", firm=\"Tiny Boutique Co\")\nexcept EmptyDataError:\n    res = obbject.stocks.ca.analyst_search(provider=\"benzinga\")  # unfiltered","handlingStrategy":"try-catch","validationCode":"# Pre-flight with the widest filter to confirm coverage exists at all\nprobe = await obbject.stocks.ca.analyst_search(provider=\"benzinga\")\nif not probe.to_df().empty:\n    # narrow filters are safe to try\n    ...","typeGuard":null,"tryCatchPattern":"from openbb_core.provider.standard_models.errors import EmptyDataError\ntry:\n    result = await fetcher.a_fetch_data(query, credentials)\nexcept EmptyDataError:\n    result = []  # filters matched no analysts","preventionTips":["Treat EmptyDataError from Benzinga as filter-driven, not fatal.","Start wide, then narrow firm/ticker/date filters.","Verify the API key works on a covered ticker before assuming coverage gaps."],"tags":["python","openbb","benzinga","provider","empty-data"],"backgroundTag":null,"analyzedSha":"3e071fcc2cd9f891cac6040ae60296dba76dab46","analyzedAt":"2026-08-14T23:40:48.960Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}