{
  "openapi": "3.0.1",
  "info": {
    "title": "Polymarket & Kalshi Prediction Markets Scraper",
    "description": "Export Polymarket and Kalshi prediction markets in one schema: live odds, implied probability, volume, liquidity, open interest, resolved outcomes, events with nested markets, price history and trades. Filter by keyword, category, volume or expiry. No API key, no login. $1 per 1,000 rows.",
    "version": "0.1",
    "x-build-id": "1tzaYDUR0ItmufuDt"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/cirkit~polymarket-kalshi-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-cirkit-polymarket-kalshi-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/cirkit~polymarket-kalshi-scraper/runs": {
      "post": {
        "operationId": "runs-sync-cirkit-polymarket-kalshi-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/cirkit~polymarket-kalshi-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-cirkit-polymarket-kalshi-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "properties": {
          "exchanges": {
            "title": "Exchanges",
            "minItems": 1,
            "uniqueItems": true,
            "type": "array",
            "description": "Which prediction markets to pull from. Both exchanges are returned in the same column layout, so a row from Kalshi lines up with a row from Polymarket.",
            "items": {
              "type": "string",
              "enum": [
                "polymarket",
                "kalshi"
              ],
              "enumTitles": [
                "Polymarket",
                "Kalshi"
              ]
            },
            "default": [
              "polymarket",
              "kalshi"
            ]
          },
          "resultsType": {
            "title": "What to export",
            "enum": [
              "markets",
              "events",
              "priceHistory",
              "trades"
            ],
            "type": "string",
            "description": "Markets returns one row per tradable market with its live odds. Events groups markets under their parent question, one row per event with the markets nested. Price history returns one row per time point for each selected market. Trades returns one row per executed trade for each selected market.",
            "default": "markets"
          },
          "searchTerms": {
            "title": "Keywords",
            "type": "array",
            "description": "Optional. Only keep markets whose question, event title or description mentions one of these words. Polymarket is searched server side; Kalshi titles are matched as the actor walks its market list.",
            "items": {
              "type": "string"
            }
          },
          "categories": {
            "title": "Categories",
            "uniqueItems": true,
            "type": "array",
            "description": "Optional. Restrict to these categories. Each one maps to the matching Polymarket tag and Kalshi category, so 'politics' means Polymarket's politics tag plus Kalshi's Politics category.",
            "items": {
              "type": "string",
              "enum": [
                "politics",
                "elections",
                "economics",
                "finance",
                "crypto",
                "sports",
                "tech",
                "science",
                "ai",
                "entertainment",
                "weather",
                "business",
                "world",
                "health"
              ],
              "enumTitles": [
                "Politics",
                "Elections",
                "Economics",
                "Finance and commodities",
                "Crypto",
                "Sports",
                "Tech",
                "Science",
                "AI",
                "Entertainment and pop culture",
                "Weather and climate",
                "Business and companies",
                "World and geopolitics",
                "Health"
              ]
            }
          },
          "tags": {
            "title": "Tags or series (advanced)",
            "type": "array",
            "description": "Optional. Raw Polymarket tag slugs or tag IDs (fomc, nba, 100196) and Kalshi series tickers (KXFED, KXNBA). Use this when the category list is too coarse.",
            "items": {
              "type": "string"
            }
          },
          "markets": {
            "title": "Specific markets or events",
            "type": "array",
            "description": "Optional. Exact markets to pull, which is the usual way to request price history or trades. Accepts Polymarket market or event links (https://polymarket.com/event/...), market slugs, condition IDs (0x...), Kalshi market tickers (KXFED-26SEP-T3.75) and Kalshi series tickers (KXFED).",
            "items": {
              "type": "string"
            }
          },
          "status": {
            "title": "Market status",
            "enum": [
              "active",
              "resolved",
              "all"
            ],
            "type": "string",
            "description": "Active returns markets still trading. Resolved returns markets that closed within the Resolved lookback window (default the last 24 hours) with their final outcome, which is what a backtest needs. All returns both.",
            "default": "active"
          },
          "resolvedLookback": {
            "title": "Resolved lookback",
            "enum": [
              "1d",
              "1w",
              "1m",
              "3m",
              "1y"
            ],
            "type": "string",
            "description": "Only when Market status is resolved or all. How long ago a market may have closed to be included. Kalshi settles tens of thousands of markets a day (74,000 on 2026-09-03), so a day is about 80 pages to scan and a week about 500; pick a longer window only together with a category, series or keyword.",
            "default": "1d"
          },
          "minVolume24h": {
            "title": "Minimum 24h volume (USD)",
            "minimum": 0,
            "type": "integer",
            "description": "Optional. Drop markets that traded less than this in the last 24 hours. A few hundred dollars removes most dormant markets."
          },
          "minLiquidity": {
            "title": "Minimum liquidity (USD)",
            "minimum": 0,
            "type": "integer",
            "description": "Optional. Drop markets with less than this much resting liquidity in the order book."
          },
          "minTotalVolume": {
            "title": "Minimum lifetime volume (USD)",
            "minimum": 0,
            "type": "integer",
            "description": "Optional. Drop markets whose all-time traded volume is below this."
          },
          "minPriceChangePct": {
            "title": "Minimum 24h price move (points)",
            "minimum": 0,
            "type": "number",
            "description": "Optional. Only keep markets whose yes price moved at least this many percentage points in either direction over the last 24 hours. 5 means a move of 5 points or more, for example 0.40 to 0.45."
          },
          "minMinutesUntilEnd": {
            "title": "Minimum minutes until close",
            "minimum": 0,
            "type": "integer",
            "description": "Optional. Drop markets that close sooner than this. 1440 skips everything resolving within a day."
          },
          "sortBy": {
            "title": "Sort by",
            "enum": [
              "volume24h",
              "volume",
              "liquidity",
              "endDate",
              "startDate"
            ],
            "type": "string",
            "description": "Order markets are ranked in before the cap is applied. Polymarket is sorted by its API. Kalshi has no server-side sort, so the actor scans its open markets and keeps the top rows by this key; when Max results is 0 Kalshi rows arrive in exchange order instead.",
            "default": "volume24h"
          },
          "kalshiHorizonDays": {
            "title": "Kalshi close horizon (days)",
            "minimum": 0,
            "type": "integer",
            "description": "Only scan Kalshi markets that close within this many days when browsing by sort, category, tag or keyword. Kalshi has no server-side sort, so a full scan of its 120,000 open markets takes two to three minutes; the 120-day horizon covers everything that trades actively and cuts that by about a third. Set to 0 to scan every open market, for example for 2028 election markets. Explicit tickers, series and Polymarket are never affected.",
            "default": 0
          },
          "historyRange": {
            "title": "History range",
            "enum": [
              "1d",
              "1w",
              "1m",
              "3m",
              "all"
            ],
            "type": "string",
            "description": "Only for price history and trades. How far back to go for each selected market.",
            "default": "1m"
          },
          "historyResolution": {
            "title": "History resolution",
            "enum": [
              "1m",
              "1h",
              "1d"
            ],
            "type": "string",
            "description": "Only for price history. Spacing between time points. One row is written per point, so an hourly series over 30 days is about 720 rows per market.",
            "default": "1h"
          },
          "maxMarkets": {
            "title": "Max markets for history and trades",
            "minimum": 1,
            "type": "integer",
            "description": "Only for price history and trades. How many markets to pull series for when they are chosen by keyword, category or sort rather than listed explicitly. Keeps an accidental 'top 200 markets, one-minute history' run from producing millions of rows.",
            "default": 20
          },
          "maxRowsPerMarket": {
            "title": "Max rows per market",
            "minimum": 1,
            "type": "integer",
            "description": "Only for price history and trades. Cap on time points or trades written per market. Leave empty for no per-market cap; Max results still applies."
          },
          "maxItems": {
            "title": "Max results",
            "minimum": 0,
            "type": "integer",
            "description": "Hard cap on the total rows returned. You are charged per row, so this is your budget control. Set to 0 for no limit.",
            "default": 200
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Both exchanges answer Apify's standard proxy pool without blocks, so the default works. Change it only if you have a reason to.",
            "default": {
              "useApifyProxy": true
            }
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}