> Documentation index: https://pmdata.dev/llms.txt. Full docs in one file: https://pmdata.dev/llms-full.txt

# Markets catalog

Source: https://pmdata.dev/docs/schemas/predict-fun/markets-catalog

> A free Parquet file listing every Predict.fun market PMData has recorded, with the UTC dates it has L2 data for.

The Predict.fun markets catalog is one Parquet file that lists the Predict.fun markets PMData has recorded, and the UTC dates it has L2 data for each one. It needs no API key, uses no download quota and is updated daily.

Use it to find a market's `market_id` and dates, then download the data with the [API reference](https://pmdata.dev/docs/api-reference).

<DownloadButton href="https://public-data.pmdata.dev/v1/predict_fun/markets.parquet" label="Download markets catalog" />

`https://public-data.pmdata.dev/v1/predict_fun/markets.parquet`

## Schema

Columns are listed in file order.

| # | Field | Type | Description |
| --- | --- | --- | --- |
| 1 | `exchange` | `string` | Exchange: `predict_fun`. |
| 2 | `category_slug` | `string \| null` | Predict.fun category slug; the market's page is `predict.fun/market/{category_slug}`. One category can contain many markets. |
| 3 | `market_id` | `int64` | Predict.fun numeric market id. Use it as `{market_id}` in the API. |
| 4 | `record_start` | `timestamp (UTC)` | First UTC date PMData has L2 data for the market. |
| 5 | `record_end` | `timestamp (UTC)` | Last UTC date PMData has L2 data for the market. Updated daily while the market is still being recorded. |
| 6 | `market_created` | `timestamp (UTC) \| null` | Time Predict.fun created the market. |
| 7 | `question` | `string \| null` | Market question. |
| 8 | `title` | `string \| null` | Market title; in a category with many markets, the name of this market within it. |
| 9 | `yes_outcome` | `string \| null` | Outcome whose order book the `l2` files contain, e.g. `Up`. |
| 10 | `no_outcome` | `string \| null` | The market's other outcome, e.g. `Down`. |
| 11 | `series` | `string \| null` | Recurring Up/Down series, e.g. `btc-updown-1h`. Empty for other markets. |

Market information (columns 2 and 6–10) can be empty for a few markets.

## Dates

- `record_start` and `record_end` are UTC dates, the same dates as in the download URL `/{YYYY}/{MM}/{DD}/`.
- If a market had no events at all on a day between `record_start` and `record_end`, there is no file for that day. The API returns `404 Not Found`, which uses no download quota.

## Example

Find a market by its question, then see which dates PMData recorded:

```python

url = "https://public-data.pmdata.dev/v1/predict_fun/markets.parquet"
# Python's default User-Agent is blocked, so set one
catalog = pd.read_parquet(url, storage_options={"User-Agent": "pmdata-catalog"})

# By question text
matches = catalog[catalog["question"].str.contains("Bitcoin", case=False, na=False)]

# Or every market in one category
# matches = catalog[catalog["category_slug"] == "<category_slug>"]

print(matches[["market_id", "question", "title", "record_start", "record_end"]])
```

Then download a date in that range:

```text
https://api.pmdata.dev/v1/predict_fun/l2/{YYYY}/{MM}/{DD}/{market_id}.parquet
```

The catalog covers L2. `lifecycle` is one file per UTC day for all markets; see [Predict.fun historical data details](https://pmdata.dev/docs/historical-data-details/predict-fun).
