BTC 15-min Up/Down Arbitrage (Polymarket x Kalshi) avatar

BTC 15-min Up/Down Arbitrage (Polymarket x Kalshi)

Pricing

from $0.01 / actor start

Go to Apify Store
BTC 15-min Up/Down Arbitrage (Polymarket x Kalshi)

BTC 15-min Up/Down Arbitrage (Polymarket x Kalshi)

Find executable Bitcoin 15-minute up/down arbitrage between Polymarket and Kalshi. Matches their BTC 15-min markets by close time, pulls live order-book depth, applies both platforms' documented fees, and returns only mismatches still profitable at the supported size.

Pricing

from $0.01 / actor start

Rating

0.0

(0)

Developer

Dmitry Melikhov

Dmitry Melikhov

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

11 minutes ago

Last modified

Categories

Share

BTC Up/Down 15-Minute Arbitrage — Polymarket x Kalshi

The same 15-minute BTC window, priced on two venues. Polymarket and Kalshi both run a recurring "will BTC be higher than it was 15 minutes ago?" binary market that resets every 15 minutes. This Actor matches those windows across the two venues by close time, walks both order books, applies each platform's documented trading fee, and reports the spread on every matched window — flagging the (rare) cases where that spread is wide enough to be a real arbitrage.

Be honest about what you're getting: these two venues are both liquid, so a genuine cross-venue arbitrage is rare and short-lived — most runs return isArbitrage: false. The Actor's job is to watch the spread always, so that when a gap does open you see it immediately, and to tell you exactly what it saw on every run (never an empty dataset you can't distinguish from a crash).

Because both venues run the same 15-minute window on the same asset, a window on one can be matched to the other by close time alone — no fuzzy text matching. One cheap, exact call per window, so a run is fast and repeatable on a schedule.

Use cases

  • Cross-venue arb scanning — watch Polymarket x Kalshi 15-minute BTC up/down markets for the rare price gaps worth trading.
  • Spread monitoring — every run reports the live spread (gross/net) on each matched window, so you can see the market even when there's nothing to trade.
  • Executable sizing, not notional — order books are walked to your orderSizeUsd; sizeContracts is the size both books can actually fill, and each leg is marked with where its depth came from (sizeSource).
  • Fees and net edge per row — gross profit, each venue's fee, and net profit are computed on every row, so a gap that dies after fees never shows as an opportunity.
  • Threshold filtering — set minNetProfitUsd; only rows clearing it are flagged isArbitrage: true.
  • Continuous monitoring — run on a schedule; each run re-scans the window that is currently open.

Output

Every run emits at least one row (one per matched window × combo, plus a status row when a window can't be matched). isArbitrage is true only when net profit clears minNetProfitUsd; you are charged only for those rows.

{
"status": "ok",
"isArbitrage": false,
"fetchedAt": "2026-10-16T19:32:12+00:00",
"windowCloseKalshi": "2026-10-16T19:30:00Z",
"windowClosePolymarket": "2026-10-16T19:30:00Z",
"kalshiTicker": "KXBTC15M-26OCT161530-30",
"polymarketSlug": "btc-updown-15m-1792178100",
"combo": "Kalshi YES + Polymarket DOWN",
"sizeContracts": 288.0,
"kalshiAvgPrice": 0.31,
"polymarketAvgPrice": 0.6945,
"kalshiSizeSource": "implied",
"polymarketSizeSource": "book",
"grossProfitUsd": -5.65,
"estimatedFeesUsd": 0.0,
"netProfitUsd": -5.65,
"netProfitPct": -1.962,
"oracleRiskNote": "Polymarket settles on Chainlink's BTC/USD TWAP stream; Kalshi settles on CF Benchmarks' BRTI. ..."
}
FieldMeaning
statusok (matched + priced), no_polymarket_match, tokens_unavailable, no_liquidity, no_open_markets, or error.
isArbitragetrue only when net profit after fees clears minNetProfitUsd. The pay-per-event is charged only for these rows.
fetchedAtUTC timestamp when the books were read.
kalshiTicker / polymarketSlugExact identifiers on each venue.
comboKalshi YES + Polymarket DOWN or Kalshi NO + Polymarket UP.
sizeContractsContracts fillable on both legs at orderSizeUsd (smaller side caps it).
kalshiAvgPrice / polymarketAvgPriceVolume-weighted average fill price after walking the depth.
kalshiSizeSource / polymarketSizeSourceimplied vs book. Polymarket returns real asks (book); Kalshi exposes only bids, so its ask is implied from the opposite side and its size is discounted by kalshiImpliedSizeFactor.
grossProfitUsdsizeContracts x (1 - kalshiAvgPrice - polymarketAvgPrice) — before fees.
estimatedFeesUsdSum of both venues' fees at those average prices.
netProfitUsdgrossProfitUsd - estimatedFeesUsd.
netProfitPctNet profit as a percentage of the pair's $1-per-contract payout.
oracleRiskNoteBasis-risk disclosure, on every row.

The example values above are a real (non-arbitrage) row shape from a live run, not a promise of profit.

Input

FieldTypeDefaultNotes
orderSizeUsdinteger200Capital simulated per leg. Each book is walked to this budget; reported size/profit is capped by whichever side runs out of depth first.
minNetProfitUsdnumber0.5Only rows whose net profit after both venues' fees clears this are flagged isArbitrage=true. All matched windows are still reported.
timeToleranceMinutesinteger2How close the two venues' close times must be to count as the same real-world window. 0-10.
maxResultsinteger20Stop after this many isArbitrage=true rows (spread/status rows are always emitted).
kalshiFeeRatenumber0.07Kalshi fee coefficient: rate x contracts x price x (1 - price), rounded up to the cent.
polymarketFeeRatenumber0.0025Polymarket crypto taker-fee coefficient.
polymarketFeeExponentnumber2Exponent in Polymarket's fee formula.
kalshiImpliedSizeFactornumber0.5Kalshi asks are implied from opposite bids (it exposes bids only); this factor discounts the implied size to stay conservative about executable depth.

Fees used

  • Kalshi — documented general trading fee: 0.07 x contracts x price x (1 - price), rounded up to the next cent (exact decimal arithmetic).
  • Polymarket — documented crypto-category taker fee: size x price x 0.0025 x (price x (1 - price))^2.

Both are applied to the average fill price after walking the depth, on the taker side. The rates are input-tunable so you can update them if the venues change their schedules.

What this Actor is not

  • Not a guaranteed-profit machine. Cross-venue arbitrage on two liquid venues is rare and transient. Most rows will be isArbitrage: false. This Actor shows you the spread honestly so you can act when a real gap appears.
  • Not risk-free. The two venues settle against different oracles — Polymarket on Chainlink's BTC/USD TWAP stream, Kalshi on CF Benchmarks' BRTI. They normally track each other closely, but a real arbitrage here carries small basis risk from that divergence, disclosed on every row as oracleRiskNote.
  • It does not place trades. This Actor only reports opportunities; execution is yours.
  • BTC only. Kalshi also runs ETH/SOL/XRP/DOGE/BNB at 15 minutes, but Polymarket's equivalents are hourly or 4-hour, so there is no true same-horizon pair — hence BTC only.
  • Kalshi depth is implied, not a real ask book. Kalshi's API exposes only bids; the ask side is synthesized from the opposite side and discounted. Real executable size on the Kalshi leg may differ. This is marked kalshiSizeSource: "implied" on every row.
  • A matched pair is a snapshot. Order books move; a row is the state of the books when it was read (fetchedAt), not a guaranteed fill.