clodds 1.5.1 → 1.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (423) hide show
  1. package/dist/acp/identity.js +21 -13
  2. package/dist/acp/identity.js.map +1 -1
  3. package/dist/acp/persistence.js +9 -7
  4. package/dist/acp/persistence.js.map +1 -1
  5. package/dist/acp/registry.js +7 -3
  6. package/dist/acp/registry.js.map +1 -1
  7. package/dist/agents/handlers/agentbets.js.map +1 -1
  8. package/dist/agents/handlers/paper-trading.js +1 -1
  9. package/dist/agents/handlers/paper-trading.js.map +1 -1
  10. package/dist/agents/handlers/predictfun.js +4 -2
  11. package/dist/agents/handlers/predictfun.js.map +1 -1
  12. package/dist/agents/index.js +5 -1
  13. package/dist/agents/index.js.map +1 -1
  14. package/dist/alerts/index.js +5 -5
  15. package/dist/alerts/index.js.map +1 -1
  16. package/dist/alerts/realtime.js +8 -0
  17. package/dist/alerts/realtime.js.map +1 -1
  18. package/dist/api/apikeys.js +1 -1
  19. package/dist/api/compute/code.js +4 -1
  20. package/dist/api/compute/code.js.map +1 -1
  21. package/dist/api/compute/data.js +8 -2
  22. package/dist/api/compute/data.js.map +1 -1
  23. package/dist/api/compute/gateway.js +14 -9
  24. package/dist/api/compute/gateway.js.map +1 -1
  25. package/dist/api/compute/llm.js +14 -10
  26. package/dist/api/compute/llm.js.map +1 -1
  27. package/dist/api/compute/storage.js +6 -2
  28. package/dist/api/compute/storage.js.map +1 -1
  29. package/dist/api/compute/trade.js +6 -5
  30. package/dist/api/compute/trade.js.map +1 -1
  31. package/dist/api/compute/web.js +5 -0
  32. package/dist/api/compute/web.js.map +1 -1
  33. package/dist/api/fees.js +5 -1
  34. package/dist/api/fees.js.map +1 -1
  35. package/dist/api/gateway.js +35 -7
  36. package/dist/api/gateway.js.map +1 -1
  37. package/dist/api/jobs.js +15 -6
  38. package/dist/api/jobs.js.map +1 -1
  39. package/dist/api/middleware.js +12 -3
  40. package/dist/api/middleware.js.map +1 -1
  41. package/dist/api/sdk.js +1 -1
  42. package/dist/api/server.js +16 -7
  43. package/dist/api/server.js.map +1 -1
  44. package/dist/arbitrage/index.js +14 -4
  45. package/dist/arbitrage/index.js.map +1 -1
  46. package/dist/auth/copilot.js +3 -3
  47. package/dist/auth/copilot.js.map +1 -1
  48. package/dist/auth/google.js +6 -2
  49. package/dist/auth/google.js.map +1 -1
  50. package/dist/auth/oauth.js +18 -11
  51. package/dist/auth/oauth.js.map +1 -1
  52. package/dist/auth/qwen.js +4 -4
  53. package/dist/auth/qwen.js.map +1 -1
  54. package/dist/auto-reply/index.js +18 -4
  55. package/dist/auto-reply/index.js.map +1 -1
  56. package/dist/automation/cron.js +10 -3
  57. package/dist/automation/cron.js.map +1 -1
  58. package/dist/automation/webhooks.js +13 -2
  59. package/dist/automation/webhooks.js.map +1 -1
  60. package/dist/bankr/client.js +3 -3
  61. package/dist/base/provider.js +16 -2
  62. package/dist/base/provider.js.map +1 -1
  63. package/dist/bin/worker.js +4 -4
  64. package/dist/bin/worker.js.map +1 -1
  65. package/dist/bittensor/chutes.js +1 -1
  66. package/dist/bittensor/chutes.js.map +1 -1
  67. package/dist/bittensor/python-runner.js +5 -1
  68. package/dist/bittensor/python-runner.js.map +1 -1
  69. package/dist/bittensor/service.js +1 -1
  70. package/dist/bittensor/service.js.map +1 -1
  71. package/dist/browser/index.js +40 -16
  72. package/dist/browser/index.js.map +1 -1
  73. package/dist/cache/index.d.ts +2 -0
  74. package/dist/cache/index.js +30 -5
  75. package/dist/cache/index.js.map +1 -1
  76. package/dist/canvas/index.js +56 -27
  77. package/dist/canvas/index.js.map +1 -1
  78. package/dist/channels/googlechat/index.js +3 -0
  79. package/dist/channels/googlechat/index.js.map +1 -1
  80. package/dist/channels/imessage/index.js +6 -0
  81. package/dist/channels/imessage/index.js.map +1 -1
  82. package/dist/channels/index.js +7 -2
  83. package/dist/channels/index.js.map +1 -1
  84. package/dist/channels/line/index.d.ts +1 -1
  85. package/dist/channels/line/index.js +4 -2
  86. package/dist/channels/line/index.js.map +1 -1
  87. package/dist/channels/mattermost/index.js +5 -0
  88. package/dist/channels/mattermost/index.js.map +1 -1
  89. package/dist/channels/nostr/index.js +10 -2
  90. package/dist/channels/nostr/index.js.map +1 -1
  91. package/dist/channels/teams/index.js +20 -3
  92. package/dist/channels/teams/index.js.map +1 -1
  93. package/dist/channels/telegram/index.js +20 -3
  94. package/dist/channels/telegram/index.js.map +1 -1
  95. package/dist/channels/tlon/index.js +6 -1
  96. package/dist/channels/tlon/index.js.map +1 -1
  97. package/dist/channels/voice/index.js +16 -0
  98. package/dist/channels/voice/index.js.map +1 -1
  99. package/dist/channels/webchat/index.js +6 -1
  100. package/dist/channels/webchat/index.js.map +1 -1
  101. package/dist/channels/zalo/index.js +4 -2
  102. package/dist/channels/zalo/index.js.map +1 -1
  103. package/dist/cli/commands/doctor.js +2 -2
  104. package/dist/cli/commands/doctor.js.map +1 -1
  105. package/dist/cli/commands/index.js +54 -24
  106. package/dist/cli/commands/index.js.map +1 -1
  107. package/dist/cli/commands/onboard.js +12 -11
  108. package/dist/cli/commands/onboard.js.map +1 -1
  109. package/dist/cli/commands/skills.js +1 -1
  110. package/dist/cli/index.js +2 -2
  111. package/dist/cli/index.js.map +1 -1
  112. package/dist/cli/secure.js +11 -5
  113. package/dist/cli/secure.js.map +1 -1
  114. package/dist/commands/registry.js +17 -9
  115. package/dist/commands/registry.js.map +1 -1
  116. package/dist/config/index.js +42 -32
  117. package/dist/config/index.js.map +1 -1
  118. package/dist/credentials/index.js +7 -6
  119. package/dist/credentials/index.js.map +1 -1
  120. package/dist/cron/index.js +15 -1
  121. package/dist/cron/index.js.map +1 -1
  122. package/dist/db/index.d.ts +12 -4
  123. package/dist/db/index.js +8 -6
  124. package/dist/db/index.js.map +1 -1
  125. package/dist/docker/index.d.ts +0 -10
  126. package/dist/docker/index.js +52 -57
  127. package/dist/docker/index.js.map +1 -1
  128. package/dist/doctor/index.js +16 -7
  129. package/dist/doctor/index.js.map +1 -1
  130. package/dist/embeddings/index.js +42 -8
  131. package/dist/embeddings/index.js.map +1 -1
  132. package/dist/evm/contracts.js +8 -1
  133. package/dist/evm/contracts.js.map +1 -1
  134. package/dist/evm/odos.js +1 -1
  135. package/dist/evm/odos.js.map +1 -1
  136. package/dist/evm/oneinch.js +7 -4
  137. package/dist/evm/oneinch.js.map +1 -1
  138. package/dist/evm/pancakeswap.js +1 -1
  139. package/dist/evm/pancakeswap.js.map +1 -1
  140. package/dist/evm/transfers.js +10 -5
  141. package/dist/evm/transfers.js.map +1 -1
  142. package/dist/evm/uniswap.js +1 -1
  143. package/dist/evm/uniswap.js.map +1 -1
  144. package/dist/evm/virtuals.js +7 -2
  145. package/dist/evm/virtuals.js.map +1 -1
  146. package/dist/exchanges/binance-futures/index.js +24 -21
  147. package/dist/exchanges/binance-futures/index.js.map +1 -1
  148. package/dist/exchanges/bybit/index.js +17 -14
  149. package/dist/exchanges/bybit/index.js.map +1 -1
  150. package/dist/exchanges/hyperliquid/index.js +28 -20
  151. package/dist/exchanges/hyperliquid/index.js.map +1 -1
  152. package/dist/exchanges/lighter/index.js +4 -4
  153. package/dist/exchanges/mexc/index.js +15 -15
  154. package/dist/exchanges/mexc/index.js.map +1 -1
  155. package/dist/exchanges/opinion/index.js +7 -7
  156. package/dist/exchanges/opinion/index.js.map +1 -1
  157. package/dist/exchanges/predictfun/index.js +1 -1
  158. package/dist/execution/index.js +93 -87
  159. package/dist/execution/index.js.map +1 -1
  160. package/dist/extensions/copilot-proxy/index.js +13 -7
  161. package/dist/extensions/copilot-proxy/index.js.map +1 -1
  162. package/dist/extensions/diagnostics-otel/index.js +8 -0
  163. package/dist/extensions/diagnostics-otel/index.js.map +1 -1
  164. package/dist/extensions/google-auth/index.js +4 -1
  165. package/dist/extensions/google-auth/index.js.map +1 -1
  166. package/dist/extensions/llm-task/index.js +28 -10
  167. package/dist/extensions/llm-task/index.js.map +1 -1
  168. package/dist/extensions/lobster/index.js +27 -8
  169. package/dist/extensions/lobster/index.js.map +1 -1
  170. package/dist/extensions/memory-lancedb/index.js +16 -6
  171. package/dist/extensions/memory-lancedb/index.js.map +1 -1
  172. package/dist/extensions/open-prose/index.js +1 -1
  173. package/dist/extensions/task-runner/index.js +12 -5
  174. package/dist/extensions/task-runner/index.js.map +1 -1
  175. package/dist/farcaster/client.js +7 -7
  176. package/dist/feeds/agentbets/index.d.ts +1 -1
  177. package/dist/feeds/betfair/index.js +12 -6
  178. package/dist/feeds/betfair/index.js.map +1 -1
  179. package/dist/feeds/crypto/index.js +38 -30
  180. package/dist/feeds/crypto/index.js.map +1 -1
  181. package/dist/feeds/drift/trading.js +4 -4
  182. package/dist/feeds/external/index.js +3 -0
  183. package/dist/feeds/external/index.js.map +1 -1
  184. package/dist/feeds/fred/index.js.map +1 -1
  185. package/dist/feeds/hedgehog/index.js +10 -2
  186. package/dist/feeds/hedgehog/index.js.map +1 -1
  187. package/dist/feeds/manifold/index.js +1 -1
  188. package/dist/feeds/metaculus/index.js +2 -2
  189. package/dist/feeds/opinion/index.js +2 -2
  190. package/dist/feeds/polymarket/index.js +7 -1
  191. package/dist/feeds/polymarket/index.js.map +1 -1
  192. package/dist/feeds/polymarket/whale-tracker.js.map +1 -1
  193. package/dist/feeds/predictfun/index.js +2 -2
  194. package/dist/feeds/smarkets/index.js +12 -6
  195. package/dist/feeds/smarkets/index.js.map +1 -1
  196. package/dist/gateway/feeds-routes.d.ts +8 -7
  197. package/dist/gateway/feeds-routes.js.map +1 -1
  198. package/dist/gateway/index.js +28 -6
  199. package/dist/gateway/index.js.map +1 -1
  200. package/dist/history/index.js +8 -4
  201. package/dist/history/index.js.map +1 -1
  202. package/dist/hooks/index.js +14 -5
  203. package/dist/hooks/index.js.map +1 -1
  204. package/dist/i18n/index.js +2 -1
  205. package/dist/i18n/index.js.map +1 -1
  206. package/dist/identity/erc8004.js +13 -3
  207. package/dist/identity/erc8004.js.map +1 -1
  208. package/dist/index.js +3 -3
  209. package/dist/index.js.map +1 -1
  210. package/dist/infra/index.d.ts +1 -1
  211. package/dist/infra/index.js +39 -26
  212. package/dist/infra/index.js.map +1 -1
  213. package/dist/ledger/hooks.js +26 -18
  214. package/dist/ledger/hooks.js.map +1 -1
  215. package/dist/ledger/storage.js +23 -13
  216. package/dist/ledger/storage.js.map +1 -1
  217. package/dist/link-understanding/index.js +26 -2
  218. package/dist/link-understanding/index.js.map +1 -1
  219. package/dist/logging/index.js +31 -4
  220. package/dist/logging/index.js.map +1 -1
  221. package/dist/macos/index.d.ts +1 -1
  222. package/dist/macos/index.js +41 -36
  223. package/dist/macos/index.js.map +1 -1
  224. package/dist/markdown/index.js +25 -8
  225. package/dist/markdown/index.js.map +1 -1
  226. package/dist/market-index/index.js +8 -6
  227. package/dist/market-index/index.js.map +1 -1
  228. package/dist/mcp/index.js +67 -10
  229. package/dist/mcp/index.js.map +1 -1
  230. package/dist/mcp/server.js +21 -3
  231. package/dist/mcp/server.js.map +1 -1
  232. package/dist/media/index.js +17 -15
  233. package/dist/media/index.js.map +1 -1
  234. package/dist/memory/context.js +17 -9
  235. package/dist/memory/context.js.map +1 -1
  236. package/dist/memory/index.js +6 -5
  237. package/dist/memory/index.js.map +1 -1
  238. package/dist/ml-pipeline/collector.js +14 -3
  239. package/dist/ml-pipeline/collector.js.map +1 -1
  240. package/dist/ml-pipeline/trainer.js +1 -1
  241. package/dist/ml-pipeline/trainer.js.map +1 -1
  242. package/dist/monitoring/health.js +15 -3
  243. package/dist/monitoring/health.js.map +1 -1
  244. package/dist/monitoring/metrics.js +2 -2
  245. package/dist/nodes/index.js +40 -25
  246. package/dist/nodes/index.js.map +1 -1
  247. package/dist/opportunity/combinatorial.js +4 -1
  248. package/dist/opportunity/combinatorial.js.map +1 -1
  249. package/dist/opportunity/correlation.js +2 -2
  250. package/dist/opportunity/executor.js +14 -5
  251. package/dist/opportunity/executor.js.map +1 -1
  252. package/dist/opportunity/risk.js +3 -1
  253. package/dist/opportunity/risk.js.map +1 -1
  254. package/dist/opportunity/scoring.js +3 -1
  255. package/dist/opportunity/scoring.js.map +1 -1
  256. package/dist/pairing/index.js +8 -4
  257. package/dist/pairing/index.js.map +1 -1
  258. package/dist/payments/x402/evm.js +4 -4
  259. package/dist/payments/x402/index.js +26 -7
  260. package/dist/payments/x402/index.js.map +1 -1
  261. package/dist/payments/x402/solana.js +3 -3
  262. package/dist/percolator/feed.js +1 -1
  263. package/dist/percolator/feed.js.map +1 -1
  264. package/dist/permissions/index.d.ts +2 -0
  265. package/dist/permissions/index.js +22 -12
  266. package/dist/permissions/index.js.map +1 -1
  267. package/dist/plugins/index.d.ts +3 -1
  268. package/dist/plugins/index.js +18 -6
  269. package/dist/plugins/index.js.map +1 -1
  270. package/dist/portfolio/index.js +16 -15
  271. package/dist/portfolio/index.js.map +1 -1
  272. package/dist/presence/index.js +17 -5
  273. package/dist/presence/index.js.map +1 -1
  274. package/dist/process/index.js +40 -14
  275. package/dist/process/index.js.map +1 -1
  276. package/dist/providers/discovery.js +34 -28
  277. package/dist/providers/discovery.js.map +1 -1
  278. package/dist/providers/health.js +7 -4
  279. package/dist/providers/health.js.map +1 -1
  280. package/dist/providers/index.js +36 -33
  281. package/dist/providers/index.js.map +1 -1
  282. package/dist/queue/index.js +1 -1
  283. package/dist/remote/index.d.ts +0 -5
  284. package/dist/remote/index.js +41 -9
  285. package/dist/remote/index.js.map +1 -1
  286. package/dist/risk/circuit-breaker.js +13 -5
  287. package/dist/risk/circuit-breaker.js.map +1 -1
  288. package/dist/risk/engine.js +2 -2
  289. package/dist/risk/volatility.js +1 -1
  290. package/dist/risk/volatility.js.map +1 -1
  291. package/dist/routing/index.js +5 -2
  292. package/dist/routing/index.js.map +1 -1
  293. package/dist/search/index.js +7 -5
  294. package/dist/search/index.js.map +1 -1
  295. package/dist/security/address-checker.js +40 -19
  296. package/dist/security/address-checker.js.map +1 -1
  297. package/dist/security/code-scanner.js +7 -5
  298. package/dist/security/code-scanner.js.map +1 -1
  299. package/dist/security/index.d.ts +3 -0
  300. package/dist/security/index.js +19 -7
  301. package/dist/security/index.js.map +1 -1
  302. package/dist/security/tx-validator.js +2 -2
  303. package/dist/security/tx-validator.js.map +1 -1
  304. package/dist/services/feature-engineering/rolling-window.d.ts +7 -0
  305. package/dist/services/feature-engineering/rolling-window.js +23 -0
  306. package/dist/services/feature-engineering/rolling-window.js.map +1 -1
  307. package/dist/services/feature-engineering/thresholds.js +2 -2
  308. package/dist/services/feature-engineering/thresholds.js.map +1 -1
  309. package/dist/services/tick-recorder/index.js +13 -1
  310. package/dist/services/tick-recorder/index.js.map +1 -1
  311. package/dist/services/tick-recorder/queries.js +11 -7
  312. package/dist/services/tick-recorder/queries.js.map +1 -1
  313. package/dist/services/tick-streamer/index.js +6 -2
  314. package/dist/services/tick-streamer/index.js.map +1 -1
  315. package/dist/session/index.d.ts +1 -1
  316. package/dist/session/index.js +31 -6
  317. package/dist/session/index.js.map +1 -1
  318. package/dist/sessions/index.js +76 -52
  319. package/dist/sessions/index.js.map +1 -1
  320. package/dist/signal-router/router.js +8 -1
  321. package/dist/signal-router/router.js.map +1 -1
  322. package/dist/skills/bundled/agentbets/index.js.map +1 -1
  323. package/dist/skills/bundled/auto-reply/SKILL.md +19 -16
  324. package/dist/skills/bundled/automation/SKILL.md +33 -215
  325. package/dist/skills/bundled/backtest/SKILL.md +2 -1
  326. package/dist/skills/bundled/credentials/SKILL.md +2 -1
  327. package/dist/skills/bundled/edge/SKILL.md +6 -3
  328. package/dist/skills/bundled/sandbox/SKILL.md +29 -240
  329. package/dist/skills/bundled/trading-kalshi/SKILL.md +65 -586
  330. package/dist/skills/bundled/usage/SKILL.md +8 -18
  331. package/dist/skills/bundled/webhooks/SKILL.md +31 -279
  332. package/dist/skills/bundled/whale-tracking/SKILL.md +24 -22
  333. package/dist/solana/copytrade.js +5 -5
  334. package/dist/solana/drift.js +2 -2
  335. package/dist/solana/drift.js.map +1 -1
  336. package/dist/solana/meteora-dbc.d.ts +2 -2
  337. package/dist/solana/pumpapi.js +4 -0
  338. package/dist/solana/pumpapi.js.map +1 -1
  339. package/dist/solana/raydium.js +46 -10
  340. package/dist/solana/raydium.js.map +1 -1
  341. package/dist/solana/swarm-copytrade.js +2 -2
  342. package/dist/solana/wallet.js +12 -3
  343. package/dist/solana/wallet.js.map +1 -1
  344. package/dist/strategies/crypto-hft/index.js +2 -0
  345. package/dist/strategies/crypto-hft/index.js.map +1 -1
  346. package/dist/strategies/crypto-hft/positions.js +11 -3
  347. package/dist/strategies/crypto-hft/positions.js.map +1 -1
  348. package/dist/strategies/crypto-hft/presets.js +2 -1
  349. package/dist/strategies/crypto-hft/presets.js.map +1 -1
  350. package/dist/strategies/crypto-hft/strategies.js +4 -3
  351. package/dist/strategies/crypto-hft/strategies.js.map +1 -1
  352. package/dist/strategies/hft-divergence/detector.js +5 -1
  353. package/dist/strategies/hft-divergence/detector.js.map +1 -1
  354. package/dist/strategies/hft-divergence/position-manager.js +13 -1
  355. package/dist/strategies/hft-divergence/position-manager.js.map +1 -1
  356. package/dist/strategies/hft-divergence/strategy.js +3 -1
  357. package/dist/strategies/hft-divergence/strategy.js.map +1 -1
  358. package/dist/streaming/index.js +21 -5
  359. package/dist/streaming/index.js.map +1 -1
  360. package/dist/tailscale/index.d.ts +0 -4
  361. package/dist/tailscale/index.js +5 -8
  362. package/dist/tailscale/index.js.map +1 -1
  363. package/dist/telemetry/index.d.ts +1 -0
  364. package/dist/telemetry/index.js +49 -6
  365. package/dist/telemetry/index.js.map +1 -1
  366. package/dist/tools/canvas.js +32 -8
  367. package/dist/tools/canvas.js.map +1 -1
  368. package/dist/tools/exec.js +32 -2
  369. package/dist/tools/exec.js.map +1 -1
  370. package/dist/tools/image.js +19 -0
  371. package/dist/tools/image.js.map +1 -1
  372. package/dist/tools/sql.js +4 -1
  373. package/dist/tools/sql.js.map +1 -1
  374. package/dist/tools/transcription.js +13 -0
  375. package/dist/tools/transcription.js.map +1 -1
  376. package/dist/tools/web-fetch.js +14 -0
  377. package/dist/tools/web-fetch.js.map +1 -1
  378. package/dist/tools/web-search.js +14 -0
  379. package/dist/tools/web-search.js.map +1 -1
  380. package/dist/trading/backtest.js +3 -3
  381. package/dist/trading/backtest.js.map +1 -1
  382. package/dist/trading/bots/index.d.ts +9 -1
  383. package/dist/trading/bots/index.js +4 -0
  384. package/dist/trading/bots/index.js.map +1 -1
  385. package/dist/trading/devtools.js +1 -1
  386. package/dist/trading/devtools.js.map +1 -1
  387. package/dist/trading/futures/index.js +5 -5
  388. package/dist/trading/index.js +1 -1
  389. package/dist/trading/index.js.map +1 -1
  390. package/dist/trading/logger.js +27 -20
  391. package/dist/trading/logger.js.map +1 -1
  392. package/dist/trading/safety.d.ts +2 -0
  393. package/dist/trading/safety.js +12 -2
  394. package/dist/trading/safety.js.map +1 -1
  395. package/dist/trading/stream.js +1 -1
  396. package/dist/trading/stream.js.map +1 -1
  397. package/dist/trading/tracking.d.ts +1 -1
  398. package/dist/trading/tracking.js.map +1 -1
  399. package/dist/utils/config.js +4 -3
  400. package/dist/utils/config.js.map +1 -1
  401. package/dist/utils/http.js +15 -1
  402. package/dist/utils/http.js.map +1 -1
  403. package/dist/utils/kelly.js +14 -5
  404. package/dist/utils/kelly.js.map +1 -1
  405. package/dist/utils/rate-limiter.js +25 -10
  406. package/dist/utils/rate-limiter.js.map +1 -1
  407. package/dist/voice/index.d.ts +5 -1
  408. package/dist/voice/index.js +65 -25
  409. package/dist/voice/index.js.map +1 -1
  410. package/dist/weather/edge.js +4 -2
  411. package/dist/weather/edge.js.map +1 -1
  412. package/dist/weather/markets.d.ts +1 -0
  413. package/dist/weather/markets.js +17 -8
  414. package/dist/weather/markets.js.map +1 -1
  415. package/dist/weather/noaa.d.ts +2 -0
  416. package/dist/weather/noaa.js +22 -5
  417. package/dist/weather/noaa.js.map +1 -1
  418. package/dist/web/index.d.ts +3 -0
  419. package/dist/web/index.js +60 -12
  420. package/dist/web/index.js.map +1 -1
  421. package/dist/wizard/index.js +13 -14
  422. package/dist/wizard/index.js.map +1 -1
  423. package/package.json +1 -1
@@ -1,629 +1,108 @@
1
1
  ---
2
2
  name: trading-kalshi
3
- description: "Execute trades on Kalshi - full REST API access for markets, orders, positions, balance"
4
- emoji: "📈"
5
- gates:
6
- envs:
7
- - KALSHI_EMAIL
8
- - KALSHI_PASSWORD
3
+ description: "Kalshi trading - search markets, place orders, stream prices, advanced order types"
4
+ commands:
5
+ - /kalshi
6
+ - /trading-kalshi
9
7
  ---
10
8
 
11
- # Kalshi Trading - Complete API Reference
9
+ # Kalshi Trading
12
10
 
13
- Full access to Kalshi's CFTC-regulated prediction market via their REST API.
14
-
15
- **Docs**: https://docs.kalshi.com/welcome
16
- **Discord**: #dev channel for support
11
+ Full access to Kalshi prediction markets: search, trade, stream real-time data, and use advanced order types (TWAP, bracket, trigger).
17
12
 
18
13
  ## Required Environment Variables
19
14
 
20
15
  ```bash
21
- KALSHI_EMAIL=your@email.com
22
- KALSHI_PASSWORD=your_password
23
- ```
24
-
25
- ## Installation
26
-
27
- ```bash
28
- pip install requests
29
- # Optional: pip install kalshi-python # Official SDK
30
- ```
31
-
32
- ---
33
-
34
- ## API Base URLs
35
-
36
- ```python
37
- # Production
38
- BASE_URL = "https://trading-api.kalshi.com/trade-api/v2"
39
-
40
- # Demo/Sandbox (for testing)
41
- DEMO_URL = "https://demo-api.kalshi.co/trade-api/v2"
16
+ KALSHI_API_KEY_ID=your_api_key_id
17
+ KALSHI_PRIVATE_KEY=your_private_key_pem_contents
18
+ # OR
19
+ KALSHI_PRIVATE_KEY_PATH=/path/to/private_key.pem
42
20
  ```
43
21
 
44
- ---
45
-
46
- ## Authentication
47
-
48
- Kalshi uses email/password login returning a bearer token valid for 30 minutes.
49
-
50
- ### Login & Token Management
51
-
52
- ```python
53
- import os
54
- import time
55
- import requests
22
+ Authentication uses RSA key-pair signing (not email/password). Generate an API key from the Kalshi dashboard.
56
23
 
57
- BASE_URL = "https://trading-api.kalshi.com/trade-api/v2"
58
-
59
- class KalshiClient:
60
- def __init__(self):
61
- self.email = os.getenv("KALSHI_EMAIL")
62
- self.password = os.getenv("KALSHI_PASSWORD")
63
- self.token = None
64
- self.token_expiry = 0
65
- self.member_id = None
66
-
67
- def _ensure_auth(self):
68
- """Refresh token if expired (30 min lifetime)"""
69
- if time.time() > self.token_expiry - 60:
70
- self._login()
71
-
72
- def _login(self):
73
- """POST /login - Get new auth token"""
74
- r = requests.post(f"{BASE_URL}/login", json={
75
- "email": self.email,
76
- "password": self.password
77
- })
78
- r.raise_for_status()
79
- data = r.json()
80
- self.token = data["token"]
81
- self.member_id = data.get("member_id")
82
- self.token_expiry = time.time() + 29 * 60 # Refresh at 29 mins
83
- return data
84
-
85
- def _headers(self):
86
- """Get auth headers for requests"""
87
- self._ensure_auth()
88
- return {
89
- "Authorization": f"Bearer {self.token}",
90
- "Content-Type": "application/json"
91
- }
92
-
93
- def logout(self):
94
- """POST /logout - Invalidate current token"""
95
- r = requests.post(f"{BASE_URL}/logout", headers=self._headers())
96
- self.token = None
97
- self.token_expiry = 0
98
- return r.status_code == 200
99
-
100
- # Initialize
101
- client = KalshiClient()
102
- ```
103
-
104
- ---
105
-
106
- ## Market Data Endpoints
107
-
108
- ### Get Markets
109
-
110
- ```python
111
- def get_markets(
112
- status: str = "open", # "open", "closed", "settled"
113
- series_ticker: str = None, # Filter by series
114
- limit: int = 100,
115
- cursor: str = None # For pagination
116
- ):
117
- """GET /markets - List markets"""
118
- params = {"status": status, "limit": limit}
119
- if series_ticker:
120
- params["series_ticker"] = series_ticker
121
- if cursor:
122
- params["cursor"] = cursor
123
-
124
- r = requests.get(f"{BASE_URL}/markets", headers=client._headers(), params=params)
125
- r.raise_for_status()
126
- data = r.json()
127
- return {
128
- "markets": data.get("markets", []),
129
- "cursor": data.get("cursor") # Use for pagination
130
- }
131
-
132
- # Examples
133
- markets = get_markets(series_ticker="INXD") # S&P 500 daily
134
- markets = get_markets(series_ticker="FED") # Fed rate decisions
135
- markets = get_markets(series_ticker="KXBTC") # Bitcoin price
136
- ```
24
+ Optional:
137
25
 
138
- ### Get Single Market
139
-
140
- ```python
141
- def get_market(ticker: str):
142
- """GET /markets/{ticker} - Single market details"""
143
- r = requests.get(f"{BASE_URL}/markets/{ticker}", headers=client._headers())
144
- r.raise_for_status()
145
- return r.json()["market"]
146
-
147
- market = get_market("INXD-24JAN10-T5805")
148
- # Returns: ticker, title, subtitle, status, yes_bid, yes_ask,
149
- # no_bid, no_ask, volume, open_interest, close_time, result
150
- ```
151
-
152
- ### Get Market Orderbook
153
-
154
- ```python
155
- def get_orderbook(ticker: str, depth: int = 10):
156
- """GET /markets/{ticker}/orderbook - Full orderbook"""
157
- r = requests.get(f"{BASE_URL}/markets/{ticker}/orderbook",
158
- headers=client._headers(),
159
- params={"depth": depth})
160
- r.raise_for_status()
161
- data = r.json()["orderbook"]
162
-
163
- # data["yes"] = list of [price, size] for YES side
164
- # data["no"] = list of [price, size] for NO side
165
- return data
166
-
167
- book = get_orderbook("INXD-24JAN10-T5805")
168
- print(f"Yes bids: {book['yes']}") # [[45, 100], [44, 200], ...]
169
- print(f"No asks: {book['no']}")
170
- ```
171
-
172
- ### Get Market History/Trades
173
-
174
- ```python
175
- def get_market_history(ticker: str, limit: int = 100):
176
- """GET /markets/{ticker}/history - Trade history"""
177
- r = requests.get(f"{BASE_URL}/markets/{ticker}/history",
178
- headers=client._headers(),
179
- params={"limit": limit})
180
- r.raise_for_status()
181
- return r.json().get("history", [])
182
-
183
- trades = get_market_history("INXD-24JAN10-T5805")
184
- for t in trades:
185
- print(f"{t['created_time']}: {t['count']} @ {t['yes_price']}¢")
186
- ```
187
-
188
- ### Get Series/Events
189
-
190
- ```python
191
- def get_series():
192
- """GET /series - List all series (categories)"""
193
- r = requests.get(f"{BASE_URL}/series", headers=client._headers())
194
- r.raise_for_status()
195
- return r.json().get("series", [])
196
-
197
- def get_events(series_ticker: str = None):
198
- """GET /events - List events"""
199
- params = {}
200
- if series_ticker:
201
- params["series_ticker"] = series_ticker
202
- r = requests.get(f"{BASE_URL}/events", headers=client._headers(), params=params)
203
- r.raise_for_status()
204
- return r.json().get("events", [])
205
-
206
- series = get_series()
207
- events = get_events("FED")
208
- ```
209
-
210
- ---
211
-
212
- ## Order Management
213
-
214
- ### Place Order
215
-
216
- ```python
217
- def place_order(
218
- ticker: str,
219
- side: str, # "yes" or "no"
220
- action: str, # "buy" or "sell"
221
- count: int, # Number of contracts
222
- price: int = None, # Price in cents (1-99), None for market
223
- order_type: str = "limit", # "limit" or "market"
224
- expiration_ts: int = None, # Optional: GTD expiration timestamp
225
- client_order_id: str = None # Optional: Your reference ID
226
- ):
227
- """POST /portfolio/orders - Place an order"""
228
- payload = {
229
- "ticker": ticker,
230
- "side": side.lower(),
231
- "action": action.lower(),
232
- "count": count,
233
- "type": order_type
234
- }
235
-
236
- if order_type == "limit" and price:
237
- # yes_price is always from YES perspective
238
- payload["yes_price"] = price if side.lower() == "yes" else (100 - price)
239
-
240
- if expiration_ts:
241
- payload["expiration_ts"] = expiration_ts
242
-
243
- if client_order_id:
244
- payload["client_order_id"] = client_order_id
245
-
246
- r = requests.post(f"{BASE_URL}/portfolio/orders",
247
- headers=client._headers(),
248
- json=payload)
249
- r.raise_for_status()
250
- return r.json()
251
-
252
- # Examples
253
- # Buy 10 YES at 45 cents
254
- result = place_order("INXD-24JAN10-T5805", "yes", "buy", 10, 45)
255
-
256
- # Sell 5 NO at 30 cents (equivalent to YES at 70 cents)
257
- result = place_order("INXD-24JAN10-T5805", "no", "sell", 5, 30)
258
-
259
- # Market order (immediate fill)
260
- result = place_order("INXD-24JAN10-T5805", "yes", "buy", 10, order_type="market")
26
+ ```bash
27
+ DRY_RUN=true # Simulate trades without executing
261
28
  ```
262
29
 
263
- ### Batch Create Orders
30
+ ## Commands
264
31
 
265
- ```python
266
- def batch_create_orders(orders: list):
267
- """POST /portfolio/orders/batched - Create multiple orders"""
268
- payload = {"orders": orders}
269
- r = requests.post(f"{BASE_URL}/portfolio/orders/batched",
270
- headers=client._headers(),
271
- json=payload)
272
- r.raise_for_status()
273
- return r.json()
32
+ ### Market Data
274
33
 
275
- orders = [
276
- {"ticker": "INXD-24JAN10-T5805", "side": "yes", "action": "buy", "count": 5, "type": "limit", "yes_price": 40},
277
- {"ticker": "INXD-24JAN10-T5805", "side": "yes", "action": "buy", "count": 5, "type": "limit", "yes_price": 42},
278
- ]
279
- results = batch_create_orders(orders)
280
34
  ```
281
-
282
- ### Amend Order
283
-
284
- ```python
285
- def amend_order(order_id: str, count: int = None, price: int = None):
286
- """POST /portfolio/orders/{order_id}/amend - Modify order"""
287
- payload = {}
288
- if count:
289
- payload["count"] = count
290
- if price:
291
- payload["yes_price"] = price
292
-
293
- r = requests.post(f"{BASE_URL}/portfolio/orders/{order_id}/amend",
294
- headers=client._headers(),
295
- json=payload)
296
- r.raise_for_status()
297
- return r.json()
35
+ /kalshi search <query> - Search markets
36
+ /kalshi market <ticker> - Market details
37
+ /kalshi book <ticker> - View orderbook (REST snapshot)
38
+ /kalshi events [query] - Browse events
39
+ /kalshi event <event-ticker> - Event details + markets
298
40
  ```
299
41
 
300
- ### Decrease Order Size
42
+ ### Trading
301
43
 
302
- ```python
303
- def decrease_order(order_id: str, reduce_by: int):
304
- """POST /portfolio/orders/{order_id}/decrease - Reduce order size"""
305
- r = requests.post(f"{BASE_URL}/portfolio/orders/{order_id}/decrease",
306
- headers=client._headers(),
307
- json={"reduce_by": reduce_by})
308
- r.raise_for_status()
309
- return r.json()
310
44
  ```
311
-
312
- ### Cancel Order
313
-
314
- ```python
315
- def cancel_order(order_id: str):
316
- """DELETE /portfolio/orders/{order_id} - Cancel single order"""
317
- r = requests.delete(f"{BASE_URL}/portfolio/orders/{order_id}",
318
- headers=client._headers())
319
- return r.status_code in [200, 204]
320
-
321
- def batch_cancel_orders(order_ids: list):
322
- """DELETE /portfolio/orders/batched - Cancel multiple orders"""
323
- r = requests.delete(f"{BASE_URL}/portfolio/orders/batched",
324
- headers=client._headers(),
325
- json={"order_ids": order_ids})
326
- r.raise_for_status()
327
- return r.json()
328
-
329
- # Cancel specific order
330
- cancel_order("abc123-order-id")
331
-
332
- # Cancel multiple
333
- batch_cancel_orders(["order-1", "order-2", "order-3"])
45
+ /kalshi buy <ticker> <contracts> <price> - Buy YES contracts
46
+ /kalshi sell <ticker> <contracts> <price> - Sell YES contracts
47
+ /kalshi orders - View open orders
48
+ /kalshi cancel <order-id> - Cancel an order
49
+ /kalshi cancel all - Cancel all orders
50
+ /kalshi balance - Account balance
334
51
  ```
335
52
 
336
- ### Get Orders
53
+ ### Advanced Orders
337
54
 
338
- ```python
339
- def get_orders(
340
- ticker: str = None,
341
- status: str = None, # "resting", "canceled", "executed", "pending"
342
- limit: int = 100
343
- ):
344
- """GET /portfolio/orders - List orders"""
345
- params = {"limit": limit}
346
- if ticker:
347
- params["ticker"] = ticker
348
- if status:
349
- params["status"] = status
350
-
351
- r = requests.get(f"{BASE_URL}/portfolio/orders",
352
- headers=client._headers(),
353
- params=params)
354
- r.raise_for_status()
355
- return r.json().get("orders", [])
356
-
357
- def get_order(order_id: str):
358
- """GET /portfolio/orders/{order_id} - Single order"""
359
- r = requests.get(f"{BASE_URL}/portfolio/orders/{order_id}",
360
- headers=client._headers())
361
- r.raise_for_status()
362
- return r.json()["order"]
363
-
364
- # Get all open orders
365
- orders = get_orders(status="resting")
366
- for o in orders:
367
- print(f"{o['order_id']}: {o['action']} {o['side']} {o['remaining_count']} @ {o['yes_price']}¢")
368
55
  ```
56
+ /kalshi twap <buy|sell> <ticker> <total> <price> [slices] [interval-sec]
57
+ /kalshi twap status - Active TWAP progress
58
+ /kalshi twap cancel <id> - Cancel TWAP
369
59
 
370
- ---
371
-
372
- ## Portfolio Management
373
-
374
- ### Get Balance
375
-
376
- ```python
377
- def get_balance():
378
- """GET /portfolio/balance - Account balance"""
379
- r = requests.get(f"{BASE_URL}/portfolio/balance", headers=client._headers())
380
- r.raise_for_status()
381
- data = r.json()
382
-
383
- return {
384
- "balance": data.get("balance", 0) / 100, # Available in dollars
385
- "portfolio_value": data.get("portfolio_value", 0) / 100
386
- }
60
+ /kalshi bracket <ticker> <size> <tp> <sl> - Set take-profit / stop-loss
61
+ /kalshi bracket status - Active brackets
62
+ /kalshi bracket cancel <id> - Cancel bracket
387
63
 
388
- bal = get_balance()
389
- print(f"Available: ${bal['balance']:.2f}")
390
- print(f"Portfolio: ${bal['portfolio_value']:.2f}")
64
+ /kalshi trigger buy <ticker> <size> <price> [limit] - Buy when price drops
65
+ /kalshi trigger sell <ticker> <size> <price> [limit] - Sell when price rises
66
+ /kalshi trigger list - Active triggers
67
+ /kalshi trigger cancel <id> - Cancel trigger
391
68
  ```
392
69
 
393
- ### Get Positions
70
+ ### Real-Time Streaming (WebSocket)
394
71
 
395
- ```python
396
- def get_positions(limit: int = 100):
397
- """GET /portfolio/positions - Current positions"""
398
- r = requests.get(f"{BASE_URL}/portfolio/positions",
399
- headers=client._headers(),
400
- params={"limit": limit})
401
- r.raise_for_status()
402
- return r.json().get("market_positions", [])
403
-
404
- positions = get_positions()
405
- for p in positions:
406
- if p.get("position", 0) != 0:
407
- print(f"{p['ticker']}: {p['position']} contracts @ avg {p['average_price']}¢")
408
- print(f" Realized P&L: ${p.get('realized_pnl', 0) / 100:.2f}")
409
72
  ```
410
-
411
- ### Get Fills (Trade History)
412
-
413
- ```python
414
- def get_fills(
415
- ticker: str = None,
416
- limit: int = 100,
417
- cursor: str = None
418
- ):
419
- """GET /portfolio/fills - Executed trades"""
420
- params = {"limit": limit}
421
- if ticker:
422
- params["ticker"] = ticker
423
- if cursor:
424
- params["cursor"] = cursor
425
-
426
- r = requests.get(f"{BASE_URL}/portfolio/fills",
427
- headers=client._headers(),
428
- params=params)
429
- r.raise_for_status()
430
- data = r.json()
431
- return {
432
- "fills": data.get("fills", []),
433
- "cursor": data.get("cursor")
434
- }
435
-
436
- fills = get_fills()
437
- for f in fills["fills"]:
438
- print(f"{f['created_time']}: {f['action']} {f['side']} {f['count']} @ {f['price']}¢")
73
+ /kalshi stream <ticker> [channels] - Start streaming (ticker,trade,orderbook)
74
+ /kalshi stream-fills - Stream your order fills
75
+ /kalshi streams - List active streams
76
+ /kalshi unstream <ticker> - Stop streaming a market
77
+ /kalshi unstream-fills - Stop fill notifications
78
+ /kalshi realtime-book <ticker> - Get real-time orderbook from stream
439
79
  ```
440
80
 
441
- ### Get Settlements
442
-
443
- ```python
444
- def get_settlements(limit: int = 100):
445
- """GET /portfolio/settlements - Settlement history"""
446
- r = requests.get(f"{BASE_URL}/portfolio/settlements",
447
- headers=client._headers(),
448
- params={"limit": limit})
449
- r.raise_for_status()
450
- return r.json().get("settlements", [])
81
+ ### Cross-Platform
451
82
 
452
- settlements = get_settlements()
453
- for s in settlements:
454
- print(f"{s['ticker']}: Settled at {s['settlement_value']}¢, P&L: ${s['revenue'] / 100:.2f}")
455
83
  ```
456
-
457
- ---
458
-
459
- ## Exchange Status
460
-
461
- ```python
462
- def get_exchange_status():
463
- """GET /exchange/status - Exchange operational status"""
464
- r = requests.get(f"{BASE_URL}/exchange/status", headers=client._headers())
465
- r.raise_for_status()
466
- return r.json()
467
-
468
- status = get_exchange_status()
469
- print(f"Trading: {status.get('trading_active')}")
470
- print(f"Exchange open: {status.get('exchange_active')}")
84
+ /kalshi route <ticker> <buy|sell> <size> - Compare prices across platforms
85
+ /kalshi circuit - Circuit breaker status
471
86
  ```
472
87
 
473
- ---
474
-
475
- ## WebSocket (Real-time Data)
476
-
477
- For real-time updates, use WebSocket after REST authentication:
478
-
479
- ```python
480
- import websocket
481
- import json
88
+ ## Examples
482
89
 
483
- def on_message(ws, message):
484
- data = json.loads(message)
485
- print(f"Update: {data}")
486
-
487
- def on_open(ws):
488
- # Subscribe to orderbook updates
489
- ws.send(json.dumps({
490
- "type": "subscribe",
491
- "channel": "orderbook",
492
- "ticker": "INXD-24JAN10-T5805"
493
- }))
494
-
495
- # Connect with auth token
496
- ws = websocket.WebSocketApp(
497
- f"wss://trading-api.kalshi.com/trade-api/ws/v2?token={client.token}",
498
- on_message=on_message,
499
- on_open=on_open
500
- )
501
- ws.run_forever()
502
90
  ```
503
-
504
- ---
505
-
506
- ## Complete Trading Bot
507
-
508
- ```python
509
- #!/usr/bin/env python3
510
- """
511
- Production Kalshi trading bot
512
- """
513
-
514
- import os
515
- import time
516
- import requests
517
-
518
- BASE_URL = "https://trading-api.kalshi.com/trade-api/v2"
519
-
520
- class KalshiBot:
521
- def __init__(self):
522
- self.email = os.getenv("KALSHI_EMAIL")
523
- self.password = os.getenv("KALSHI_PASSWORD")
524
- self.token = None
525
- self.token_expiry = 0
526
-
527
- def _auth(self):
528
- if time.time() > self.token_expiry - 60:
529
- r = requests.post(f"{BASE_URL}/login", json={
530
- "email": self.email, "password": self.password
531
- })
532
- r.raise_for_status()
533
- self.token = r.json()["token"]
534
- self.token_expiry = time.time() + 29 * 60
535
-
536
- def _h(self):
537
- self._auth()
538
- return {"Authorization": f"Bearer {self.token}", "Content-Type": "application/json"}
539
-
540
- def get_market(self, ticker):
541
- r = requests.get(f"{BASE_URL}/markets/{ticker}", headers=self._h())
542
- r.raise_for_status()
543
- return r.json()["market"]
544
-
545
- def get_positions(self):
546
- r = requests.get(f"{BASE_URL}/portfolio/positions", headers=self._h())
547
- r.raise_for_status()
548
- return {p["ticker"]: p for p in r.json().get("market_positions", [])}
549
-
550
- def get_balance(self):
551
- r = requests.get(f"{BASE_URL}/portfolio/balance", headers=self._h())
552
- r.raise_for_status()
553
- return r.json().get("balance", 0) / 100
554
-
555
- def buy(self, ticker, side, count, price):
556
- payload = {
557
- "ticker": ticker, "side": side, "action": "buy",
558
- "count": count, "type": "limit",
559
- "yes_price": price if side == "yes" else (100 - price)
560
- }
561
- r = requests.post(f"{BASE_URL}/portfolio/orders", headers=self._h(), json=payload)
562
- return r.json() if r.status_code == 200 else {"error": r.text}
563
-
564
- def sell(self, ticker, side, count, price):
565
- payload = {
566
- "ticker": ticker, "side": side, "action": "sell",
567
- "count": count, "type": "limit",
568
- "yes_price": price if side == "yes" else (100 - price)
569
- }
570
- r = requests.post(f"{BASE_URL}/portfolio/orders", headers=self._h(), json=payload)
571
- return r.json() if r.status_code == 200 else {"error": r.text}
572
-
573
- # Run
574
- bot = KalshiBot()
575
- TICKER = "INXD-24JAN10-T5805"
576
-
577
- while True:
578
- try:
579
- market = bot.get_market(TICKER)
580
- positions = bot.get_positions()
581
- balance = bot.get_balance()
582
-
583
- yes_bid = market["yes_bid"]
584
- yes_ask = market["yes_ask"]
585
- pos = positions.get(TICKER, {}).get("position", 0)
586
-
587
- print(f"Balance: ${balance:.2f}, Position: {pos}, Price: {yes_bid}/{yes_ask}")
588
-
589
- # Trading logic
590
- if yes_ask < 40 and pos < 10 and balance > 5:
591
- print(f"BUYING at {yes_ask}")
592
- bot.buy(TICKER, "yes", 5, yes_ask)
593
- elif yes_bid > 60 and pos > 0:
594
- print(f"SELLING at {yes_bid}")
595
- bot.sell(TICKER, "yes", pos, yes_bid)
596
-
597
- time.sleep(10)
598
-
599
- except Exception as e:
600
- print(f"Error: {e}")
601
- time.sleep(30)
91
+ /kalshi search bitcoin
92
+ /kalshi market KXBTC-24JAN01
93
+ /kalshi book KXBTC-24JAN01
94
+ /kalshi buy KXBTC-24JAN01 10 0.65
95
+ /kalshi sell KXBTC-24JAN01 5 0.70
96
+ /kalshi stream KXBTC-24JAN01 ticker,trade
97
+ /kalshi twap buy KXBTC-24JAN01 50 0.60 10 30
98
+ /kalshi bracket KXBTC-24JAN01 10 0.80 0.40
99
+ /kalshi trigger buy KXBTC-24JAN01 10 45
602
100
  ```
603
101
 
604
- ---
605
-
606
- ## Popular Market Series
607
-
608
- | Series | Description | Example Ticker |
609
- |--------|-------------|----------------|
610
- | FED | Fed rate decisions | FED-24MAR-T525 |
611
- | INXD | S&P 500 daily close | INXD-24JAN10-T5805 |
612
- | KXBTC | Bitcoin price brackets | KXBTC-24JAN-T45000 |
613
- | KXETH | Ethereum price | KXETH-24JAN-T2500 |
614
- | CPI | Inflation data | CPI-24JAN-T3.5 |
615
- | GDP | GDP growth | GDP-24Q1-T2.0 |
616
- | NFP | Non-farm payrolls | NFP-24JAN-T200K |
617
-
618
- ---
619
-
620
- ## Key Notes
621
-
622
- 1. **Prices in CENTS** - 45 means $0.45 per contract
623
- 2. **Contracts pay $1 if correct** - Cost is the price, profit is $1 - price
624
- 3. **No trading fees** - Only spread matters
625
- 4. **Token expires in 30 min** - Auto-refresh before expiry
626
- 5. **US residents only** - KYC verification required
627
- 6. **Rate limits exist** - Implement exponential backoff on 429 errors
628
- 7. **Max position limits** - Varies by market, check market details
102
+ ## Notes
629
103
 
104
+ - Prices are in decimal format for commands (0.65 = 65 cents)
105
+ - Trigger prices are in cents (45 = 45 cents)
106
+ - Contracts pay $1 if correct; cost is the price
107
+ - Circuit breaker integration blocks trades when risk limits are hit
108
+ - Trigger orders poll every 5 seconds