{"record":{"id":"58ec287a8de56a48","repo":"OpenBB-finance/OpenBB","slug":"invalid-factor-factor-for-region-region","errorCode":null,"errorMessage":"Invalid factor: '{factor}' for region: '{region}'. Valid factors are: {\", \".join(regional_factors.get(\"factors\", {}).keys())}","messagePattern":"Invalid factor: '(.+?)' for region: '(.+?)'\\. Valid factors are: (.+?)\\)\\.keys\\(\\)\\)\\}","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"openbb_platform/providers/famafrench/openbb_famafrench/models/factors.py","lineNumber":136,"sourceCode":"        factor = factors_dict.get(values.get(\"factor\", \"3_factors\"), \"\")\n        frequency = values.get(\"frequency\", \"\")\n\n        if factor and factor in [\"st_reversal\", \"lt_reversal\"] and region != \"america\":\n            raise ValueError(\n                f\"Invalid region, '{region}', for factor '{factor}'. Only 'america' is supported.\"\n            )\n\n        if region and region not in list(FACTOR_REGION_MAP):\n            raise ValueError(\n                f\"Invalid region: '{region}'. \"\n                + \"Valid regions are: \"\n                + \", \".join(FACTOR_REGION_MAP.keys())\n            )\n\n        regional_factors = FACTOR_REGION_MAP[region]\n\n        if factor not in regional_factors.get(\"factors\", {}):\n            raise ValueError(\n                f\"Invalid factor: '{factor}' for region: '{region}'. \"\n                + \"Valid factors are: \"\n                + \", \".join(regional_factors.get(\"factors\", {}).keys())\n            )\n\n        if frequency:\n            intervals = regional_factors.get(\"intervals\", {}).get(factor, {})\n            if frequency not in list(intervals):\n                raise ValueError(\n                    f\"Invalid frequency: '{frequency}' for factor: '{factor}'\"\n                    + f\" in region: '{region}'. \"\n                    + \"Valid frequencies are: \"\n                    + \", \".join(intervals.keys())\n                )\n\n        return values\n\n","sourceCodeStart":118,"sourceCodeEnd":154,"githubUrl":"https://github.com/OpenBB-finance/OpenBB/blob/3e071fcc2cd9f891cac6040ae60296dba76dab46/openbb_platform/providers/famafrench/openbb_famafrench/models/factors.py#L118-L154","documentation":"Fama-French factors query-model validator: after the region resolves, the requested factor must appear in FACTOR_REGION_MAP[region]['factors']. Regions carry different factor sets (e.g. some regional datasets lack momentum or the 5-factor model), so a globally valid factor name can still be invalid for the chosen region.","triggerScenarios":"factor='5_factors' with a region that only publishes 3_factors; factor='momentum' for a regional dataset without momentum files; any factor string not a key of the region's factors dict.","commonSituations":"Reusing a working (factor, region) pair with a new region; UIs offering a flat factor list; dataset coverage differences between North America, Europe, Japan, Asia-Pacific.","solutions":["Pick a factor from the region's list given in the error message (FACTOR_REGION_MAP[region]['factors'].keys()).","Drive choices dynamically from FACTOR_REGION_MAP when region is user-selected.","For the classic 3/5-factor models, 'america' has the widest coverage — switch region if you need a specific factor."],"exampleFix":"# before\nquery = {'region': 'japan', 'factor': 'momentum'}\n\n# after\nfrom openbb_famafrench.models.factors import FACTOR_REGION_MAP\nvalid = list(FACTOR_REGION_MAP['japan']['factors'])\nquery = {'region': 'japan', 'factor': valid[0]}","handlingStrategy":"validation","validationCode":"from openbb_famafrench.models.factors import FACTOR_REGION_MAP\n\nfactors_for = lambda region: list(FACTOR_REGION_MAP.get(region, {}).get('factors', {}))\n\ndef factor_ok(region: str, factor: str) -> bool:\n    return factor in factors_for(region)","typeGuard":null,"tryCatchPattern":"try:\n    res = await obb.economy.famafrench.factors(factor=f, region=r, provider='famafrench')\nexcept ValueError as e:\n    if 'Valid factors are' in str(e):\n        f = factors_for(r)[0]\n        res = await obb.economy.famafrench.factors(factor=f, region=r, provider='famafrench')\n    else:\n        raise","preventionTips":["Derive factor choices from the selected region via FACTOR_REGION_MAP","Never assume factor availability is uniform across regions"],"tags":["famafrench","factors","validation","region"],"backgroundTag":null,"analyzedSha":"3e071fcc2cd9f891cac6040ae60296dba76dab46","analyzedAt":"2026-08-14T23:40:48.960Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}