{"record":{"id":"db0fc9fdc93c7548","repo":"OpenBB-finance/OpenBB","slug":"dataflow-dataflow-not-found","errorCode":null,"errorMessage":"Dataflow '{dataflow}' not found.","messagePattern":"Dataflow '(.+?)' not found\\.","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"openbb_platform/providers/imf/openbb_imf/utils/query_builder.py","lineNumber":28,"sourceCode":"\nclass ImfQueryBuilder:\n    \"\"\"IMF Query Builder for constructing and executing SDMX REST queries.\"\"\"\n\n    def __init__(self):\n        \"\"\"Initialize the query builder with metadata singleton.\"\"\"\n        self.metadata = ImfMetadata()\n\n    def build_url(\n        self,\n        dataflow: str,\n        start_date: str | None = None,\n        end_date: str | None = None,\n        limit: int | None = None,\n        **kwargs,\n    ) -> str:\n        \"\"\"Build the IMF SDMX REST API URL for data retrieval.\"\"\"\n        if dataflow not in self.metadata.dataflows:\n            raise ValueError(f\"Dataflow '{dataflow}' not found.\")\n\n        df = self.metadata.dataflows[dataflow]\n        agency_id = df.get(\"agencyID\")\n        dsd_id = df.get(\"structureRef\", {}).get(\"id\")\n\n        if not dsd_id or dsd_id not in self.metadata.datastructures:\n            raise ValueError(f\"Data structure not found for dataflow '{dataflow}'.\")\n\n        dsd = self.metadata.datastructures[dsd_id]\n        all_dimensions = dsd.get(\"dimensions\", [])\n        dimension_ids = {d[\"id\"] for d in all_dimensions if d.get(\"id\")}\n        # Create a map for case-insensitive matching of dimension IDs\n        dimension_id_map = {d_id.lower(): d_id for d_id in dimension_ids}\n\n        final_kwargs: dict = {}\n\n        for key, value in kwargs.items():\n            # Try to match the key (case-insensitive) to a known dimension ID","sourceCodeStart":10,"sourceCodeEnd":46,"githubUrl":"https://github.com/OpenBB-finance/OpenBB/blob/3e071fcc2cd9f891cac6040ae60296dba76dab46/openbb_platform/providers/imf/openbb_imf/utils/query_builder.py#L10-L46","documentation":"ImfQueryBuilder.build_url raises ValueError when the requested dataflow is absent from the locally loaded IMF SDMX dataflows metadata. URL construction needs the dataflow's agencyID and structureRef, so it refuses unknown IDs immediately.","triggerScenarios":"Calling build_url('XXX') with a nonexistent/retired dataflow ID, or a valid ID while metadata failed to load fully (empty dataflows dict).","commonSituations":"Typos, retired IMF dataflows, stale metadata cache after IMF restructures its SDMX registry, or an older openbb-imf that predates a new dataflow.","solutions":["List ImfQueryBuilder().metadata.dataflows and use an exact ID.","Refresh cached IMF metadata (delete the provider's metadata cache) and retry.","Upgrade openbb-imf to pick up newly added dataflows.","Confirm the ID on the IMF SDMX data catalog if unsure."],"exampleFix":"# before\nurl = builder.build_url(dataflow='IRFCL')  # ValueError if retired/renamed\n\n# after\nids = list(builder.metadata.dataflows)\nurl = builder.build_url(dataflow=next(i for i in ids if 'IRFCL' in i or i == 'IRFCL'))","handlingStrategy":"validation","validationCode":"def assert_dataflow(qb, dataflow: str):\n    flows = qb.metadata.dataflows\n    if dataflow not in flows:\n        raise ValueError(f'Unknown dataflow {dataflow!r}; choose from {sorted(flows)}')\n\nassert_dataflow(ImfQueryBuilder(), 'BOP')","typeGuard":"def is_valid_dataflow(qb, dataflow: str) -> TypeGuard[str]:\n    return dataflow in qb.metadata.dataflows","tryCatchPattern":"try:\n    url = qb.build_url(dataflow, **kwargs)\nexcept ValueError as e:\n    if 'not found' in str(e):\n        match = difflib.get_close_matches(dataflow, qb.metadata.dataflows, n=1)\n        url = qb.build_url(match[0], **kwargs) if match else raise_\n    else:\n        raise","preventionTips":["Look up dataflow IDs from metadata.dataflows rather than documentation snippets.","Clear the metadata cache after IMF announces registry changes.","Wrap user-facing inputs with a dataflow validator before calling build_url."],"tags":["validation","imf","sdmx","dataflow","metadata"],"backgroundTag":null,"analyzedSha":"3e071fcc2cd9f891cac6040ae60296dba76dab46","analyzedAt":"2026-08-14T23:40:48.960Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}