{"record":{"id":"62537228a0a18e0c","repo":"OpenBB-finance/OpenBB","slug":"error-error-message-625372","errorCode":null,"errorMessage":"Error: {error} -> {message}","messagePattern":"Error: (.+?) -> (.+?)","errorType":"exception","errorClass":"OpenBBError","httpStatus":null,"severity":"error","filePath":"openbb_platform/providers/intrinio/openbb_intrinio/models/forward_eps_estimates.py","lineNumber":173,"sourceCode":"                new_data = data.get(\"estimates\")  # type: ignore\n                if new_data:\n                    results.extend(new_data)\n\n        if symbols:\n            await asyncio.gather(*[get_one(symbol) for symbol in symbols])\n            return results\n\n        async def fetch_callback(response, session):\n            \"\"\"Use callback for pagination.\"\"\"\n            data = await response.json()\n            error = data.get(\"error\", None)\n            if error:\n                message = data.get(\"message\", \"\")\n                if \"api key\" in message.lower():\n                    raise UnauthorizedError(\n                        f\"Unauthorized Intrinio request -> {message}\"\n                    )\n                raise OpenBBError(f\"Error: {error} -> {message}\")\n\n            if data.get(\"estimates\") and len(data.get(\"estimates\")) > 0:  # type: ignore\n                results.extend(data.get(\"estimates\"))  # type: ignore\n                while data.get(\"next_page\"):  # type: ignore\n                    next_page = data[\"next_page\"]  # type: ignore\n                    next_url = f\"{url}&next_page={next_page}\"\n                    data = await amake_request(next_url, session=session, **kwargs)\n                    if \"estimates\" in data and len(data.get(\"estimates\")) > 0:  # type: ignore\n                        results.extend(data.get(\"estimates\"))  # type: ignore\n            return results\n\n        url = f\"{BASE_URL}&{query_str}&api_key={api_key}\"\n\n        results = await amake_request(url, response_callback=fetch_callback, **kwargs)  # type: ignore\n\n        if not results:\n            raise EmptyDataError(\"The request was successful but was returned empty.\")\n","sourceCodeStart":155,"sourceCodeEnd":191,"githubUrl":"https://github.com/OpenBB-finance/OpenBB/blob/3e071fcc2cd9f891cac6040ae60296dba76dab46/openbb_platform/providers/intrinio/openbb_intrinio/models/forward_eps_estimates.py#L155-L191","documentation":"Generic OpenBBError raised in the forward EPS estimates fetch callback when Intrinio returns a JSON body with a non-null 'error' key whose message does not mention 'api key'. It wraps the raw Intrinio error code and message, e.g. 'Error: 404 -> Not Found', covering anything the API reports besides authorization failures.","triggerScenarios":"equity/estimates/forward_eps with provider=intrinio where the API responds with an error payload: unknown/invalid symbol, disallowed query parameter combination, rate limit (429) message returned in the body, or a malformed request URL built from the query string.","commonSituations":"Delisted or misspelled ticker passed in symbol; hitting Intrinio per-minute/per-day call limits; using parameters the endpoint no longer accepts after an Intrinio API change.","solutions":["Read the embedded '{error} -> {message}' text - it is the verbatim Intrinio response and names the real cause.","Validate the symbol exists (e.g. obb.equity.price.quote(symbol=..., provider='intrinio')).","If rate-limited, throttle request frequency or raise your Intrinio plan tier.","Retry once after correcting parameters; if the error persists, test the equivalent URL directly against api-v2.intrinio.com."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":"import re\n# validate tickers before batching\ndef is_plausible_ticker(s: str) -> bool:\n    return bool(re.fullmatch(r'[A-Z.\\-]{1,8}', s.strip().upper()))","typeGuard":null,"tryCatchPattern":"from openbb_core.provider.exceptions import OpenBBError\ntry:\n    res = obb.equity.estimates.forward_eps(symbol=sym, provider='intrinio')\nexcept OpenBBError as e:\n    msg = str(e)\n    if 'api key' in msg.lower():\n        fix_credentials()\n    elif '429' in msg or 'limit' in msg.lower():\n        backoff_and_retry()\n    else:\n        raise","preventionTips":["Read the embedded Intrinio error text before guessing","Validate ticker format before requests","Throttle requests to stay under rate limits","Pin provider package versions against API drift"],"tags":["intrinio","api-error","estimates","wrapper"],"backgroundTag":null,"analyzedSha":"3e071fcc2cd9f891cac6040ae60296dba76dab46","analyzedAt":"2026-08-14T23:40:48.960Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}