{"record":{"id":"6b4a05682b30e9f2","repo":"OpenBB-finance/OpenBB","slug":"unexpected-data-format-expected-analyst-ratings","errorCode":null,"errorMessage":"Unexpected data format. Expected 'analyst_ratings_analyst' key, got: {list(data.keys())}","messagePattern":"Unexpected data format\\. Expected 'analyst_ratings_analyst' key, got: (.+?)","errorType":"exception","errorClass":"OpenBBError","httpStatus":null,"severity":"error","filePath":"openbb_platform/providers/benzinga/openbb_benzinga/models/analyst_search.py","lineNumber":431,"sourceCode":"        **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,\n    ) -> list[BenzingaAnalystSearchData]:\n        \"\"\"Transform the data.\"\"\"\n        results: list[BenzingaAnalystSearchData] = []","sourceCodeStart":413,"sourceCodeEnd":449,"githubUrl":"https://github.com/OpenBB-finance/OpenBB/blob/3e071fcc2cd9f891cac6040ae60296dba76dab46/openbb_platform/providers/benzinga/openbb_benzinga/models/analyst_search.py#L413-L449","documentation":"analyst_search.py:431 inspects the Benzinga ratings-analysts response shape: a dict that lacks the 'analyst_ratings_analyst' key entirely raises OpenBBError(\"Unexpected data format. Expected 'analyst_ratings_analyst' key, got: {list(data.keys())}\"). It means the endpoint answered successfully but with a schema this fetcher cannot parse — e.g. an error body or an API revision.","triggerScenarios":"Benzinga returns {\"error\": \"...\"} or an auth/limit message dict, or changes/adds wrapper keys, so 'analyst_ratings_analyst' is absent while the payload is still valid JSON dict.","commonSituations":"Expired or invalid API key producing a JSON error body, endpoint version bumps (v2.1 schema change), rate-limit responses that decode as dicts.","solutions":["Log list(data.keys()) (it's in the message) to see what Benzinga actually returned — an 'error'/'message' key points at auth or limits.","Validate/refresh the benzinga credentials (obbject.user.credentials.benzinga_api_key) and re-test.","Pin/upgrade openbb-benzinga to the release matching the current API schema.","Handle OpenBBError separately from EmptyDataError so schema problems aren't silenced as no-data."],"exampleFix":"# before\ndata = await amake_request(url, response_callback=response_callback)\n# OpenBBError: Unexpected data format. Expected 'analyst_ratings_analyst' key, got: ['error']\n\n# after\nif isinstance(data, dict) and \"error\" in data:\n    raise OpenBBError(f\"Benzinga API error: {data['error']}\")\nrows = data.get(\"analyst_ratings_analyst\") or []","handlingStrategy":"try-catch","validationCode":"# Pre-check key health with any cheap Benzinga call\nstatus = await amake_request(\"https://api.benzinga.com/api/v2.1/calendar/ratings?limit=1&token=\" + token, response_callback=response_callback)\nif isinstance(status, dict) and (\"error\" in status or \"ratings\" not in status):\n    raise RuntimeError(f\"Benzinga auth/schema problem: {list(status.keys())}\")","typeGuard":"def is_expected_payload(data) -> bool:\n    return isinstance(data, dict) and \"analyst_ratings_analyst\" in data","tryCatchPattern":"from openbb_core.app.model.abstract.error import OpenBBError\ntry:\n    rows = await fetcher.a_fetch_data(query, credentials)\nexcept OpenBBError as e:\n    if \"Unexpected data format\" in str(e):\n        logger.error(\"Benzinga schema/auth issue: %s\", e)  # inspect keys, fix creds or version\n        raise\n    raise","preventionTips":["Keep the benzinga_api_key credential current and quota-monitored.","Separate OpenBBError (schema/auth) from EmptyDataError (no rows) in error handling.","Upgrade openbb-benzinga when Benzinga revises response shapes."],"tags":["python","openbb","benzinga","provider","schema"],"backgroundTag":null,"analyzedSha":"3e071fcc2cd9f891cac6040ae60296dba76dab46","analyzedAt":"2026-08-14T23:40:48.960Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}