# Opinion Labs Prediction Markets Scraper (`automation-lab/opinion-labs-prediction-markets-scraper`) Actor

📊 Export public Opinion prediction markets with live probabilities, buy/sell prices, volume, liquidity, rules, categories, timing, and stable IDs.

- **URL**: https://apify.com/automation-lab/opinion-labs-prediction-markets-scraper.md
- **Developed by:** [Stas Persiianenko](https://apify.com/automation-lab) (community)
- **Categories:** Other
- **Stats:** 2 total users, 1 monthly users, 85.7% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Opinion Labs Prediction Markets Scraper

Export public prediction markets from [Opinion](https://app.opinion.trade/) as clean, analysis-ready records.

Get live YES and NO probabilities, buy and sell prices, total and recent volume, liquidity, categories, rules, resolution sources, timing, and stable market IDs without a wallet or Opinion API key.

Use the Actor once for a catalog export or run it on a schedule to build an odds and volume time series.

### What does Opinion Labs Prediction Markets Scraper do?

The Actor reads Opinion's anonymous public market catalog and creates one normalized dataset row for each visible binary or categorical child market.

It can:

- 📈 extract current YES and NO probabilities;
- 💱 preserve separate buy, sell, and last market prices;
- 📊 collect total, 24-hour, and 7-day trading volume;
- 🧭 filter markets by text, category, status, and minimum volume;
- 🧾 save market rules and the primary resolution source;
- 🔗 retain question, topic, condition, and source identifiers;
- ⏱️ add an observation timestamp for scheduled snapshots.

The result is ready for JSON, CSV, Excel, XML, API delivery, or downstream automation.

### Who is it for?

#### Prediction-market traders

Screen Opinion markets by theme or volume before deeper trading research.

#### Quant and research teams

Feed structured probability snapshots into notebooks, databases, alerting systems, and forecasting models.

#### Journalists and media dashboards

Track how market expectations change around elections, economics, crypto, sports, and culture.

#### Forecasters

Compare crowd probabilities with internal forecasts and preserve rules that define what each market means.

#### AI agents

Give an agent stable structured records instead of asking it to interpret a changing website layout.

### Why use this Opinion scraper?

Opinion's public application is useful for people, but repeated analysis needs consistent fields and machine-readable exports.

This Actor provides:

- a repeatable input contract;
- normalized numeric probability and volume values;
- stable IDs for deduplication;
- filtering before records are saved;
- scheduled execution on the Apify platform;
- integrations with datasets, webhooks, cloud storage, and APIs.

No login, wallet connection, trade authorization, or private OpenAPI credential is required for this public catalog scope.

### What data can you extract?

| Field | Meaning |
|---|---|
| `title` | Full market question or outcome title |
| `titleShort` | Short title supplied by Opinion |
| `slug` | Stable URL slug |
| `questionId` | Opinion question identifier |
| `topicId` | Parent topic identifier |
| `conditionId` | Condition identifier when exposed |
| `categories` | Opinion category and topic labels |
| `status` | Normalized `active`, `upcoming`, `resolved`, or `unknown` |
| `createdAt` | Market creation time |
| `cutoffAt` | Trading or resolution cutoff time |
| `resolvedAt` | Resolution time when available |
| `rules` | Market resolution rules |
| `resolutionSource` | Primary source URL found in the rules |
| `yesBuyProbability` | Current YES buy price/probability |
| `yesSellProbability` | Current YES sell price/probability |
| `yesLastProbability` | Last/market YES probability |
| `noBuyProbability` | Current NO buy price/probability |
| `noSellProbability` | Current NO sell price/probability |
| `noLastProbability` | Last/market NO probability |
| `volume` | Total reported trading volume |
| `volume24h` | Reported volume over 24 hours |
| `volume7d` | Reported volume over seven days |
| `liquidity` | Reported liquidity capacity |
| `sourceUrl` | Direct Opinion market link |
| `scrapedAt` | UTC observation timestamp |

Missing source values are omitted rather than invented or converted to zero.

### How to scrape Opinion prediction markets

1. Open the Actor input page.
2. Enter an optional text query such as `Fed` or `Bitcoin`.
3. Add exact categories if you need a narrower feed.
4. Choose a market status.
5. Set a minimum volume and maximum result count.
6. Click **Start**.
7. Download the dataset or connect it to your workflow.

A first test with 20 records normally finishes well under two minutes.

### Input options

#### Search market text

`searchQuery` performs a case-insensitive substring match against titles and rules.

Use `Fed` to find federal-funds questions or `MLB` for baseball-related rules and titles.

#### Categories

`categories` accepts exact Opinion labels such as `Macro`, `Crypto`, `Sports`, or `Culture`.

Category matching is case-insensitive. A market passes when one of its labels matches one requested value.

#### Market status

`status` supports:

- `all` — every catalog record;
- `active` — currently active markets;
- `upcoming` — markets not yet active;
- `resolved` — markets with a completed resolution.

#### Minimum volume

`minVolume` screens out records below the requested total volume.

#### Maximum markets

`maxItems` limits saved records from 1 to 1,000.

### Input examples

#### Browse active markets

```json
{
  "status": "active",
  "maxItems": 50
}
```

#### Find macro markets

```json
{
  "categories": ["Macro"],
  "status": "all",
  "maxItems": 100
}
```

#### Monitor liquid markets

```json
{
  "status": "active",
  "minVolume": 10000,
  "maxItems": 250
}
```

### Output example

```json
{
  "title": "Fed rate hike in 2026?",
  "titleShort": "Fed rate hike",
  "slug": "fed-rate-hike-in-2026",
  "questionId": "cbc0cedabddc63f8a562388e1859c6011cbfaa93d2fb366a283373bc5796268a",
  "topicId": "17360",
  "categories": ["Macro"],
  "status": "active",
  "yesLabel": "YES",
  "noLabel": "NO",
  "yesBuyProbability": 0.63,
  "yesSellProbability": 0.57,
  "yesLastProbability": 0.531,
  "volume": 75704.0785,
  "volume24h": 58.3835,
  "volume7d": 58.3835,
  "sourceUrl": "https://app.opinion.trade/market/fed-rate-hike-in-2026",
  "scrapedAt": "2026-07-22T00:00:00.000Z"
}
```

Values change as Opinion's public market data changes. The example illustrates field shape, not a guaranteed current quote.

### How much does it cost to scrape Opinion markets?

This Actor uses pay-per-event pricing.

A run has a small start charge and then charges per market record saved. The current BRONZE per-market rate is $0.000087467, with lower unit prices on higher Apify plans and a $0.005 start event.

You are not charged an item event for records that do not pass your filters.

The Apify Console displays the exact estimate before a run. Use a low `maxItems` value for a cheap first test.

### Scheduled odds and volume monitoring

To build a time series:

1. create an Apify schedule for the Actor;
2. choose a stable filter, such as active Macro markets;
3. run hourly or daily;
4. append dataset records to your database or warehouse;
5. group observations by `questionId` and sort by `scrapedAt`.

This captures changing probabilities without claiming that the Actor itself provides historical candles.

### Integrations

#### Google Sheets and Excel

Download CSV or Excel files for reporting and manual comparison.

#### Webhooks

Trigger a webhook when a run succeeds, then load fresh market records into an alerting service.

#### Databases and warehouses

Use `questionId` as a stable key and `scrapedAt` as the snapshot time in PostgreSQL, BigQuery, Snowflake, or another store.

#### Forecasting pipelines

Join Opinion probabilities to internal forecasts, event metadata, or records from other prediction-market actors.

#### Slack and email alerts

Compare the latest observation with the previous one and notify a channel when probability or volume crosses a threshold.

### JavaScript API example

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/opinion-labs-prediction-markets-scraper').call({
    status: 'active',
    categories: ['Macro'],
    maxItems: 100,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

### Python API example

```python
from apify_client import ApifyClient

client = ApifyClient('YOUR_APIFY_TOKEN')
run = client.actor('automation-lab/opinion-labs-prediction-markets-scraper').call(
    run_input={'searchQuery': 'Fed', 'status': 'all', 'maxItems': 50}
)
items = client.dataset(run['defaultDatasetId']).list_items().items
print(items)
```

### cURL API example

```bash
curl -X POST \
  'https://api.apify.com/v2/acts/automation-lab~opinion-labs-prediction-markets-scraper/runs?token=YOUR_APIFY_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '{"status":"active","maxItems":50}'
```

Fetch dataset items using the `defaultDatasetId` returned by the run.

### Use with Apify MCP

Connect the Actor through the Apify MCP server.

#### Claude Code

```bash
claude mcp add --transport http apify "https://mcp.apify.com/?tools=automation-lab/opinion-labs-prediction-markets-scraper" \
  --header "Authorization: Bearer YOUR_APIFY_TOKEN"
```

#### Claude Desktop

Add this server to the `mcpServers` object in Claude Desktop settings:

```json
{
  "mcpServers": {
    "apify": {
      "command": "npx",
      "args": [
        "mcp-remote",
        "https://mcp.apify.com/?tools=automation-lab/opinion-labs-prediction-markets-scraper",
        "--header",
        "Authorization: Bearer YOUR_APIFY_TOKEN"
      ]
    }
  }
}
```

#### Cursor

Open **Settings → Tools & MCP**, add a remote HTTP server, and use the same MCP URL and authorization header.

#### VS Code

Add the same remote MCP endpoint to your VS Code MCP configuration and provide the bearer token as an authorization header.

Example prompts:

- “Scrape active Opinion Macro markets and rank them by 24-hour volume.”
- “Find Opinion markets whose rules mention the Federal Reserve.”
- “Export high-volume Opinion market probabilities for my dashboard.”

### Data quality and normalization

Prices are converted from source strings to numbers while preserving their original probability scale from 0 to 1.

Large identifiers remain strings to avoid precision loss.

Categorical child markets are emitted as individual records when Opinion serializes them as market objects.

Records are deduplicated by `questionId` during each run.

The Actor fails rather than returning a misleading successful empty run when the source format cannot be parsed.

### Limitations

- Coverage is the anonymous market catalog serialized by Opinion's public application.
- Opinion can change its frontend or field semantics without notice.
- The Actor does not place trades or connect to a wallet.
- It does not use the API-key-gated Opinion OpenAPI.
- It does not reconstruct historical odds before the first scheduled run.
- Some markets may omit last prices, condition IDs, liquidity, or resolution URLs.
- Text filtering is substring matching, not semantic search.

### Tips for reliable workflows

- Use stable IDs rather than titles when joining snapshots.
- Keep a `scrapedAt` column in every downstream table.
- Filter by volume when monitoring only liquid markets.
- Preserve rules because similarly titled markets can resolve differently.
- Start with a small result limit before scheduling a larger export.
- Inspect `statusCode` if Opinion introduces a source state not yet normalized.

### Troubleshooting

#### Why did my run return zero records?

Your filters may not match the current catalog. Remove `searchQuery`, categories, and minimum volume, then retry with `status: all`.

A valid no-match filter returns an empty dataset. A source extraction failure makes the run fail and records the reason in the log.

#### Why is a probability missing?

Opinion may expose buy and sell quotes without a last market price, or vice versa. Missing values are omitted instead of guessed.

#### Why is my category filter empty?

Use the exact source category label. Run once without categories, inspect the `categories` field, and copy the desired label.

#### Do I need a proxy?

No proxy setup is required from you. The Actor tries the cheapest direct route first and automatically uses an Apify residential IP in a supported region only when Opinion returns its regional-unavailability page.

### Is scraping Opinion legal?

This Actor accesses anonymous public market information and does not bypass login, wallet, or private API controls.

You are responsible for using the data lawfully and in accordance with applicable terms, database rights, financial regulations, and privacy rules.

Prediction-market probabilities are not financial advice. Verify important information at the linked source and understand each market's rules before making decisions.

### Related prediction market scrapers

Use these Automation Labs actors when you need another venue:

- [Limitless Prediction Markets Scraper](https://apify.com/automation-lab/limitless-prediction-markets-scraper) — Limitless markets, order books, and history.
- [Robinhood Prediction Markets Scraper](https://apify.com/automation-lab/robinhood-prediction-markets-scraper) — public Robinhood contracts, probabilities, volume, and rules.

Keep each venue's identifiers and rule semantics separate when comparing markets.

### FAQ

#### Does it require an Opinion account or API key?

No. V1 uses public market data available anonymously in the Opinion application.

#### Can it trade for me?

No. It is a read-only scraper and data extractor.

#### Can I monitor one subject?

Yes. Use `searchQuery`, categories, status, and minimum volume together.

#### Does it include resolved markets?

It returns resolved records visible in the public catalog when `status` is `all` or `resolved`.

#### Can I export JSON, CSV, Excel, or XML?

Yes. Apify datasets support each format.

#### Can I run it on a schedule?

Yes. Scheduling is one of the main use cases for probability and volume snapshots.

#### Are YES and NO values percentages?

They are decimal probabilities from 0 to 1. Multiply by 100 for a percentage display.

#### Is every market guaranteed to have every field?

No. Optional fields are emitted only when Opinion supplies a usable value.

### Support

If a run fails, include the run URL, input, and the relevant log excerpt when opening an issue on the Actor page.

Do not include wallet secrets, private tokens, or unrelated personal data.

Clear reproduction details help distinguish a source change from a filter that legitimately matched no current records.

# Actor input Schema

## `searchQuery` (type: `string`):

Case-insensitive text matched against market titles and rules, for example Fed, Bitcoin, or MLB.

## `categories` (type: `array`):

Only include exact Opinion category labels such as Macro, Crypto, Sports, or Culture. Matching is case-insensitive.

## `status` (type: `string`):

Return all catalog records or only active, upcoming, or resolved markets.

## `minVolume` (type: `number`):

Only save markets whose reported total trading volume is at least this amount.

## `maxItems` (type: `integer`):

Maximum number of normalized market records to save.

## Actor input object example

```json
{
  "searchQuery": "Fed",
  "categories": [],
  "status": "all",
  "minVolume": 0,
  "maxItems": 20
}
```

# Actor output Schema

## `overview` (type: `string`):

Dataset API link for normalized Opinion market records and current probability snapshots.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "searchQuery": "Fed",
    "categories": [],
    "status": "all",
    "minVolume": 0,
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation-lab/opinion-labs-prediction-markets-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "searchQuery": "Fed",
    "categories": [],
    "status": "all",
    "minVolume": 0,
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("automation-lab/opinion-labs-prediction-markets-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchQuery": "Fed",
  "categories": [],
  "status": "all",
  "minVolume": 0,
  "maxItems": 20
}' |
apify call automation-lab/opinion-labs-prediction-markets-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=automation-lab/opinion-labs-prediction-markets-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/bVCzh7WNWzvPi4IMU/builds/bpRNAc2fzLuXEjhWL/openapi.json
