OpenBB-finance/OpenBB · warning · OpenBBError

No data rows found for dataflow '{dataflow}' with parameters

Error message

No data rows found for dataflow '{dataflow}' with parameters: {param_info}. The IMF constraints API reports this combination as valid, but no actual observations were returned in the data. URL -> {url}

What it means

Deep in fetch_data: the XML contained a DataSet but parsing produced zero data rows, despite the IMF constraints API earlier reporting the dimension combination valid. Raised as EmptyDataError-wrapped OpenBBError with the parameters and URL for diagnosis.

Source

Thrown at openbb_platform/providers/imf/openbb_imf/utils/query_builder.py:922

                            ].get(derivation_type, derivation_type)
                        derivation_types_in_series.add(derivation_type)

                    all_data_rows.append(obs_row)

            if indicator_code and derivation_types_in_series:
                if len(derivation_types_in_series) == 1:
                    all_series_derivation_types[indicator_code] = list(
                        derivation_types_in_series
                    )[0]
                else:
                    all_series_derivation_types[indicator_code] = "; ".join(
                        sorted(derivation_types_in_series)
                    )

        if not all_data_rows:
            # Build a more helpful error message with parameter info
            param_info = ", ".join(f"{k}={v}" for k, v in kwargs.items() if v)
            raise OpenBBError(
                EmptyDataError(
                    f"No data rows found for dataflow '{dataflow}' with parameters: "
                    + f"{param_info}. "
                    + "The IMF constraints API reports this combination as valid, "
                    + "but no actual observations were returned in the data. "
                    + f"URL -> {url}"
                )
            )

        # Create DataFrame and clean up
        df = DataFrame(all_data_rows)
        df = df.rename(columns={"value": "OBS_VALUE"})
        df["OBS_VALUE"] = to_numeric(df["OBS_VALUE"], errors="coerce")

        # Parse TIME_PERIOD into valid date format
        if "TIME_PERIOD" in df.columns:
            df["TIME_PERIOD"] = df["TIME_PERIOD"].apply(parse_time_period)

View on GitHub (pinned to 3e071fcc2c)

Solutions

  1. Open the URL from the message and confirm no Series/Obs elements exist server-side.
  2. Widen the query (wildcard a dimension) or extend the date range, then filter locally.
  3. Pick an adjacent indicator in the same hierarchy that actually has data.
  4. Handle it as expected empty data in ETL (log and continue) rather than a crash.

Example fix

# before
try:
    df = qb.fetch_data(url)
except OpenBBError:
    raise  # pipeline dies on structurally-valid-but-empty series

# after
try:
    df = qb.fetch_data(url)
except OpenBBError as e:
    if 'No data rows found' in str(e):
        df = pd.DataFrame()  # expected gap; continue
    else:
        raise
Defensive patterns

Strategy: fallback

Try / catch

try:
    df = qb.fetch_data(url)
except OpenBBError as e:
    if 'No data rows found' in str(e):
        df = pd.DataFrame()  # or widen the key / extend dates and retry once
    else:
        raise

Prevention

When it happens

Trigger: A series exists in metadata/constraints but has no observations for the requested key (e.g. discontinued indicator, country not reporting that series), or all observations were filtered out by the requested date range handled downstream.

Common situations: Exploring the SDMX catalog and picking codes that are structurally valid but never populated; requesting recent periods for slow-reporting series.

Related errors


AI-assisted analysis of OpenBB-finance/OpenBB@3e071fcc2c (2026-08-14). Data as JSON: /api/errors/7eb8bfe0a18e3422. Report an issue: GitHub.