# Polymarket Markets — Odds, Bid/Ask, Volume, One Row Each (`jpmarketdata/polymarket-markets`) Actor

Type a topic like "fed rate" and get the open Polymarket markets on it, one row per market, up to 200 a run by default. Returns question, outcomes and prices, best bid and ask, 24h volume, liquidity and close date. $0.0025 per market returned; no results = no charge. Unofficial.

- **URL**: https://apify.com/jpmarketdata/polymarket-markets.md
- **Developed by:** [h ichi](https://apify.com/jpmarketdata) (community)
- **Categories:** Automation, Developer tools, News
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$2.50 / 1,000 market returneds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#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

## Polymarket Markets — Odds, Bid/Ask, Volume, One Row Each

**What it does:** Lists the open Polymarket markets that match your topics, one row each, with their current prices and volume.

**You enter:** One or more topics, e.g. `fed rate`; leave empty to get the busiest open markets.

**You get:** One row per market: question and event title, outcomes and their prices, best bid and ask, 24h volume, liquidity, open interest (its event's, when the market has none), close date, link. Up to 200 a run by default; open-but-paused ones are returned, flagged.

**Price:** $0.0025 per market returned. No results = no charge.

> Unofficial — not affiliated with Polymarket. Reads public pages only.

### Price

**$0.0025 per market returned.** You pay per market row, not per run: a run that returns 200 markets costs $0.50. The same price applies on every plan, and there is no monthly fee.

You are charged only for markets actually returned. A run that matches nothing costs nothing.

### What you get, one record per market

| field | meaning |
|---|---|
| `question` | the market's own question |
| `eventTitle` | the event it belongs to |
| `outcomes` / `outcomePrices` | outcome names and their current prices, same order |
| `bestBid` / `bestAsk` | top of book — `null` when that side has no live quote |
| `lastTradePrice` | last executed price |
| `priceChange24h` | price move over 24 hours, in dollars of a $1 contract |
| `volume24hrUsd` / `liquidityUsd` | 24h traded volume and resting book liquidity |
| `openInterestUsd` + `openInterestScope` | open interest, and whether it is the market's own figure or its event's |
| `endDate` | scheduled close |
| `acceptingOrders` | **`false` means open but paused** |
| `closed`, `negRisk`, `conditionId`, `url` | whether it resolved, whether it belongs to a group of Yes/No markets that can't all happen (`negRisk`), on-chain id, link |

### Two things this feed does not hide

**Paused markets are returned, flagged.** A market can be open and still stop accepting orders — on 2026-08-10, 106 of the 436 markets on the front page were in that state. They are delivered with `acceptingOrders: false` rather than filtered out, because a feed that quietly omits the untradable half of an event reads as complete when it is not.

**Off-topic matches are dropped, and counted.** Polymarket's search matches whole *events*, so a search for "fed rate" also returns every unrelated market inside a matching event. Markets are re-checked against your topic and the number dropped is printed in the run log, so the totals reconcile.

**A topic that returns nothing still leaves a row.** It is a free `type: "search_summary"` row carrying `topic`, `eventsSeen`, `droppedOffTopic`, `droppedClosed`, `pushed: 0`, and a `keywordStatus` (`not_found` — no event matched at all; `off_topic_only` — events matched but every market in them was about something else; `closed_only` — every match is already closed) with a one-line `hint`. Search is English only: `bitcoin` returns 200 markets and `ビットコイン` returns none (measured 2026-08-18). The row is never charged — you pay per market row, and this is not one.

The run log also reports any market whose best bid is above its best ask, or whose price falls outside 0–1. Nothing is removed on that basis — you get what Polymarket's public data returned, plus a warning when that data is impossible.

### What one row looks like

Measured on 2026-08-09 (real run)

```json
{
  "type": "market",
  "question": "Will there be no change in Fed interest rates after the September 2026 meeting?",
  "eventTitle": "Fed Decision in September?",
  "conditionId": "0xa3b36b2d6104d34af4e6c6215fc818e43352e78a748fbfb0b85e3a35f71dec9a",
  "outcomes": ["Yes", "No"],
  "outcomePrices": [0.625, 0.375],
  "bestBid": 0.62,
  "bestAsk": 0.63,
  "lastTradePrice": 0.62,
  "priceChange24h": null,
  "volume24hrUsd": 259874.84251399979,
  "liquidityUsd": 621648.5084,
  "openInterestUsd": 5897366.804893,
  "openInterestScope": "event",
  "endDate": "2026-09-16",
  "acceptingOrders": true,
  "closed": false,
  "negRisk": true,
  "url": "https://polymarket.com/event/fed-decision-in-september-762",
  "scrapedAt": "2026-08-09T19:50:14.659723+00:00"
}
```

### Input

```json
{
  "topics": ["fed rate"],
  "maxMarkets": 200,
  "openOnly": true
}
```

Leave `topics` empty to take the busiest open markets instead of searching. `maxMarkets` caps the whole run, not each topic.

### Notes

Reads Polymarket's public data only, no login, no browser, requests spaced out. Nothing is kept between runs — every run re-reads the live prices. If Polymarket cannot be reached, the run fails loudly rather than finishing with an empty result.

Looking for arbitrage across a whole event rather than a market list? That is a different product: **Polymarket Arbitrage Scanner**.

### If something goes wrong

- **Wrong number or a failed run?** Open a ticket on the **Issues** tab. I read every one and reply within 2 business days (Japan time).
- **You never get a fake "empty" result.** If the site can't be read, the run fails and says so.
- **No results = no charge.** You only pay for results you actually get.
- **Checked every week.** An automatic test runs this tool weekly; if the site changes, I fix it.
- **Public pages only.** No login, no personal data, and it goes easy on the site.

### More tools by the same author

- [Polymarket Odds, Volume & Top Markets by Topic](https://apify.com/jpmarketdata/polymarket-market-stats)
- [Polymarket Arbitrage Finder — Groups Priced Under $1](https://apify.com/jpmarketdata/polymarket-odds-arbitrage)
- [Kalshi Arbitrage Finder — Groups Priced Against $1](https://apify.com/jpmarketdata/kalshi-odds-arbitrage)
- [Polymarket vs Kalshi Arbitrage — Same Question, Two Prices](https://apify.com/jpmarketdata/prediction-market-arbitrage)

All tools (Japan marketplaces, real estate, jobs, racing, prediction markets): <https://apify.com/jpmarketdata>

### Disclaimer

Unofficial, independent tool — **not affiliated with, endorsed by, or sponsored by Polymarket**. Product names and logos belong to their owners and only say where the data comes from. Data is read from public pages, for market research; check before you act on it.

# Actor input Schema

## `topics` (type: `array`):

Search terms, e.g. "fed rate". Leave empty to take the most active markets.

## `maxMarkets` (type: `integer`):

How many markets to return in total.

## `openOnly` (type: `boolean`):

Exclude markets that have closed. Markets that are open but no longer accepting orders are always returned, flagged.

## Actor input object example

```json
{
  "topics": [
    "fed rate"
  ],
  "maxMarkets": 200,
  "openOnly": true
}
```

# 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 = {
    "topics": [
        "fed rate"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("jpmarketdata/polymarket-markets").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 = { "topics": ["fed rate"] }

# Run the Actor and wait for it to finish
run = client.actor("jpmarketdata/polymarket-markets").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "topics": [
    "fed rate"
  ]
}' |
apify call jpmarketdata/polymarket-markets --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,jpmarketdata/polymarket-markets"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/mnJef8jB4wbfdbVNF/builds/7B96oOYVu1k0PHVh0/openapi.json
