{
  "openapi": "3.0.1",
  "info": {
    "title": "Kalshi Scraper [Just 💰$0.80/1k] — Odds, Weather & Order Book",
    "description": "Kalshi Scraper pulls prediction-market odds from kalshi.com: implied probability, yes/no bid and ask, spread, volume, open interest and settlement results. Covers all ~103,000 tradable markets including weather, plus order book, trades and OHLC candles on request.",
    "version": "0.1",
    "x-build-id": "THmtfpjGdFovWBn54"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/blackfalcondata~kalshi-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-blackfalcondata-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/blackfalcondata~kalshi-scraper/runs": {
      "post": {
        "operationId": "runs-sync-blackfalcondata-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/blackfalcondata~kalshi-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-blackfalcondata-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": {
          "query": {
            "title": "🔍 Search Label",
            "type": "string",
            "description": "Keyword to match against the market question, both outcome subtitles and the tickers (case-insensitive substring). Leave empty to browse every open market, or combine with Series ticker to browse one series."
          },
          "seriesTicker": {
            "title": "🎯 Series Ticker",
            "type": "string",
            "description": "Return only markets from one series, e.g. `KXFED` (Fed funds rate), `KXNFLGAME` (NFL games), `KXBIGGESTQUAKE` (daily earthquakes). Leave empty to return the whole open-market feed. For several series at once, paste a JSON array: [\"KXFED\",\"KXNFLGAME\"]."
          },
          "category": {
            "title": "🏷️ Category",
            "enum": [
              "",
              "Sports",
              "Entertainment",
              "Politics",
              "Elections",
              "Financials",
              "Economics",
              "Mentions",
              "Climate and Weather",
              "Science and Technology",
              "Crypto",
              "Companies",
              "World",
              "Health",
              "Commodities",
              "Social",
              "Transportation",
              "Exotics",
              "AI",
              "Education"
            ],
            "type": "string",
            "description": "Return only markets in this category. The exchange indexes its series by category, so the actor asks it for that category's series and fetches only those — it does not scan the whole feed and discard the rest. Typing a close variant works too (\"weather\" finds Climate and Weather); an unrecognised one stops the run and lists the valid names rather than returning nothing.",
            "default": ""
          },
          "status": {
            "title": "📊 Market status",
            "enum": [
              "open",
              "closed",
              "settled",
              "unopened",
              "any"
            ],
            "type": "string",
            "description": "Which markets to return. Was previously fixed to \"open\", which put closed and settled markets — the whole historical and settlement use case — out of reach.",
            "default": "open"
          },
          "excludeMultivariate": {
            "title": "🧹 Exclude auto-generated combination markets",
            "type": "boolean",
            "description": "Kalshi auto-generates enormous numbers of multi-leg parlay markets (KXMVECROSSCATEGORY…). Measured on the live feed they are 98.6% of all open markets and almost none of them trade. On by default so a run returns markets a person recognises.",
            "default": true
          },
          "minVolume24h": {
            "title": "📈 Min 24h volume",
            "minimum": 0,
            "type": "integer",
            "description": "Drop markets that traded fewer than this many contracts in the last 24h. Use 1 to keep only markets that traded at all today."
          },
          "minVolume": {
            "title": "📊 Min lifetime volume",
            "minimum": 0,
            "type": "integer",
            "description": "Drop markets with less total volume than this."
          },
          "minOpenInterest": {
            "title": "🔓 Min open interest",
            "minimum": 0,
            "type": "integer",
            "description": "Outstanding contracts. A better liveness signal than volume — it says money is still at risk, not merely that a trade once happened."
          },
          "minLiquidity": {
            "title": "💧 Min liquidity (USD)",
            "minimum": 0,
            "type": "integer",
            "description": "Resting order-book depth in dollars. Note: the open-markets feed reports 0 here for most markets, so a non-zero value filters hard."
          },
          "maxResults": {
            "title": "💯 Max Results",
            "minimum": 0,
            "maximum": 200000,
            "type": "integer",
            "description": "Maximum number of markets to return. The exchange carries about 103,000 tradable markets and 0 returns all of them, which is a long run — a measured run delivered 30,000 in 55 minutes, and how long a full sweep takes varies a great deal from run to run. Most of the exchange is auto-generated combination markets, which are excluded by default, so narrowing by Category or Series Ticker is what makes a large run quick.",
            "default": 200
          },
          "includeOrderBook": {
            "title": "📖 Include order book",
            "type": "boolean",
            "description": "Resting bids on both sides, with best price and total depth. COSTS ONE EXTRA REQUEST PER MARKET returned — a 1,000-row run is 1,000 extra requests.",
            "default": false
          },
          "orderBookDepth": {
            "title": "📖 Order book depth",
            "minimum": 1,
            "maximum": 100,
            "type": "integer",
            "description": "Price levels per side. Only used when the order book is on.",
            "default": 10
          },
          "includeTrades": {
            "title": "🧾 Include recent trades",
            "type": "boolean",
            "description": "The public trade tape for each market: time, side, size, price, and whether it was a block trade. No trader identity exists in this data — Kalshi publishes none. COSTS ONE EXTRA REQUEST PER MARKET.",
            "default": false
          },
          "tradesLimit": {
            "title": "🧾 Trades per market",
            "minimum": 1,
            "maximum": 200,
            "type": "integer",
            "description": "Newest trades to keep per market. Only used when trades are on.",
            "default": 20
          },
          "includeCandles": {
            "title": "📈 Include price history (candles)",
            "type": "boolean",
            "description": "OHLC candles with open interest and volume per period. COSTS ONE EXTRA REQUEST PER MARKET.",
            "default": false
          },
          "candleLookbackHours": {
            "title": "📈 Candle lookback (hours)",
            "minimum": 1,
            "maximum": 2160,
            "type": "integer",
            "description": "How far back to fetch OHLC candles, in hours. Long windows at fine periods are split into several requests per market and fetched in sequence, so they work but they take time: 24 hours of hourly candles is one request, while 90 days of 1-minute candles is 26 requests and about 5 seconds for a single market.",
            "default": 24
          },
          "candlePeriodMinutes": {
            "title": "📈 Candle period (minutes)",
            "enum": [
              "1",
              "60",
              "1440"
            ],
            "type": "string",
            "description": "Candle size. The exchange supports exactly three: 1 minute, 1 hour and 1 day — anything else is rejected outright. Finer candles over a long lookback mean more requests per market; see Candle Lookback Hours.",
            "default": "60"
          },
          "startUrls": {
            "title": "🔗 Paste / Direct URLs",
            "type": "array",
            "description": "One or more direct search or listing detail URLs to process. When set, other search filters are ignored.",
            "items": {
              "type": "string"
            }
          },
          "compact": {
            "title": "📦 Compact Output",
            "type": "boolean",
            "description": "Core fields only — ticker, title, status, quote, volume and dates (for AI-agent/MCP workflows).",
            "default": false
          },
          "excludeEmptyFields": {
            "title": "Exclude empty fields from output",
            "type": "boolean",
            "description": "Drop null, empty-string, and empty-array fields from each record before push. Smaller payloads for AI agents and dashboards.",
            "default": false
          },
          "incrementalMode": {
            "title": "♻️ Incremental Mode",
            "type": "boolean",
            "description": "Compare against the previous run and report what is new, what moved, and what closed. stateKey is optional — it defaults to a value derived from the series you are tracking, so different series never share state.",
            "default": false
          },
          "stateKey": {
            "title": "🔑 State Key",
            "type": "string",
            "description": "Optional. Stable identifier for the tracked set of markets. Leave empty to auto-generate it from the series you selected."
          },
          "telegramToken": {
            "title": "🔑 Telegram Bot Token",
            "type": "string",
            "description": "Telegram bot token (from @BotFather). Required for Telegram notifications."
          },
          "telegramChatId": {
            "title": "💬 Telegram Chat ID",
            "type": "string",
            "description": "Telegram chat or channel ID (e.g. \"-100123456789\"). Required when telegramToken is set."
          },
          "discordWebhookUrl": {
            "title": "🎮 Discord Webhook URL",
            "type": "string",
            "description": "Discord incoming webhook URL. Server Settings → Integrations → Webhooks → New Webhook."
          },
          "slackWebhookUrl": {
            "title": "💼 Slack Webhook URL",
            "type": "string",
            "description": "Slack incoming webhook URL. api.slack.com/messaging/webhooks."
          },
          "notificationLimit": {
            "title": "📊 Max Markets Per Notification",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "Maximum number of markets included in each notification message (1–20).",
            "default": 5
          },
          "notifyOnlyChanges": {
            "title": "🔄 Notify Only New/Updated",
            "type": "boolean",
            "description": "When Incremental Mode is on, only send notifications for NEW and UPDATED markets. Has no effect outside incremental mode.",
            "default": false
          },
          "whatsappAccessToken": {
            "title": "📱 WhatsApp Access Token",
            "type": "string",
            "description": "WhatsApp Cloud API permanent access token (System User token from Meta Business). Recipient must have messaged the business number within the last 24h (service-conversation window — free since Nov 2024)."
          },
          "whatsappPhoneNumberId": {
            "title": "📞 WhatsApp Phone Number ID",
            "type": "string",
            "description": "Your WhatsApp Business phone-number ID (numeric, from Meta dashboard). Required when whatsappAccessToken is set."
          },
          "whatsappTo": {
            "title": "📲 WhatsApp Recipient",
            "type": "string",
            "description": "Recipient phone in E.164 format without + (e.g. \"436641234567\"). Recipient must have messaged your business number within last 24h."
          },
          "webhookUrl": {
            "title": "🪝 Generic Webhook URL",
            "type": "string",
            "description": "Receives a JSON POST with {metadata, items} after each run. Universal escape hatch for n8n / Make / Zapier / custom backends."
          },
          "webhookHeaders": {
            "title": "📋 Webhook Headers",
            "type": "object",
            "description": "Optional JSON object of custom headers (e.g. {\"Authorization\":\"Bearer ...\"})."
          },
          "appConnector": {
            "title": "Send results to a connected app",
            "type": "string",
            "description": "Optional. Pick a connected app under Settings → API & Integrations to receive your results. Best-effort across MCP connectors as Apify expands its catalog."
          },
          "mcpIssueTeam": {
            "title": "Issue tracker team",
            "type": "string",
            "description": "Only when the connected app is an issue tracker: the team (name or ID) the summary issue is created under, if that app requires one."
          },
          "descriptionFormat": {
            "title": "📝 Description Format",
            "enum": [
              "all",
              "text",
              "html",
              "markdown"
            ],
            "type": "string",
            "description": "Choose which representation of the listing description to include. `all` keeps every variant; the others keep only the selected one.",
            "default": "all"
          },
          "emitUnchanged": {
            "title": "🔄 Emit Unchanged Listings",
            "type": "boolean",
            "description": "When incremental mode is on, also emit listings whose content has not changed since the last run. Markets that vanish from the exchange are marked inactive in state but are not emitted as rows.",
            "default": false
          },
          "emitExpired": {
            "title": "⚰️ Emit Expired Markets",
            "type": "boolean",
            "description": "Also return a row for markets that were in a previous run but are gone now. The row carries the market ticker, when it disappeared and your state key — not a price, because the market is no longer there to have one. Requires Incremental Mode and a run that saw the whole set.",
            "default": false
          },
          "skipReposts": {
            "title": "🚫 Skip Reposts",
            "type": "boolean",
            "description": "In incremental mode, skip listings that appear to be reposts of a previously-seen expired listing with matching details.",
            "default": false
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}