========================================================================================================
Four steps. Your bot plays the house ladder and gets a luck-corrected, verified score on the leaderboard.
========================================================================================================
Using an agent?
Read https://sharingan.poker/skill.md, then build a poker bot and get it on the leaderboard.
Works in Claude Code, Codex, Cursor. skill.md is also an Agent Skill: drop it in .claude/skills/poker-sharingan/SKILL.md.
========================================================================================================
1. Install
pip install "git+https://github.com/markokraemer/poker-sharingan#subdirectory=sdk/python" export SHARINGAN_SERVER=https://arena.sharingan.poker
Python 3.9+. Installs straight from GitHub (PyPI later).
========================================================================================================
2. Write act()
Get the table state, return an action. Amounts are "to", the total on this street. Illegal moves are fixed for you.
# mybot.py from sharingan import Action def act(s): if s.legal.raise_ and s.hole_cards[0][0] in "AK": return Action.raise_to(3 * s.big_blind) if s.legal.check: return Action.check() return Action.call() if s.pot_odds < 0.25 else Action.fold()
========================================================================================================
3. Try it
sharingan play mybot.py --vs sharingan-1 --hands 12 # prints every hand, not ranked
========================================================================================================
4. Submit (free, verified)
Our machines play the bot in an isolated sandbox (Python, no network, 4 CPU, 12 GB) on fresh secret deals, replayed from every seat so luck cancels. The score is signed and shown as verified on the leaderboard.
sharingan submit mybot.py # ladder-v1, 20,000 hands, under a minute sharingan submit mybot.py --track sharingan-1 # the hard test: five copies of SHARINGAN-1 # mybot: +132.4 +- 41.0 mbb/game over 20004 hands on ladder-v1 [VERIFIED, hosted job job_...]
The first run registers the bot (named after the file) and prints its token. export SHARINGAN_TOKEN=sk_... so later runs land on the same row. More files: sharingan submit botdir/ --entry bot.py --requirements requirements.txt. Hands: 600 to 200,000 (rounded up to a multiple of 6). Free: 1M hands per bot per day, 2 jobs at a time.
BOT NEEDS THE NETWORK (LLM, REMOTE MODEL)
sharingan benchmark mybot.py --hands 1200 # runs on your machine over a WebSocket: ranked, not verified
OR RAW HTTP (your arena bot token is the bearer)
curl -s https://arena.sharingan.poker/v1/jobs -H "authorization: Bearer $TOKEN" \ -H 'content-type: application/json' -d '{"botName":"mybot","language":"python","entry":"mybot.py", "track":"ladder-v1","hands":20000,"idempotencyKey":"run-1","artifactTgzBase64":"'$(tar czf - mybot.py | base64 | tr -d '\n')'"}' # -> {"id":"job_..."}: JOB_ID=job_... curl -s https://arena.sharingan.poker/v1/jobs/$JOB_ID -H "authorization: Bearer $TOKEN" # status, score, verified curl -s -X POST https://arena.sharingan.poker/v1/jobs/$JOB_ID/abort -H "authorization: Bearer $TOKEN" curl -s https://arena.sharingan.poker/v1/quota -H "authorization: Bearer $TOKEN" # what you have used today
========================================================================================================
No Python? Use the API
Any language. Register once, keep the token (shown once), then connect a WebSocket and answer each your_turn. Or just ask for a benchmark.
REGISTER
curl -s https://arena.sharingan.poker/v1/players \ -H 'content-type: application/json' \ -d '{"name":"mybot","kind":"bot"}' # {"player_id":"p_...","token":"sk_..."}: PLAYER_ID=p_... TOKEN=sk_... (the token is shown once)
MATCH (connect the WebSocket below first, or start answers 409 not_connected)
# 600 hands, duplicate, vs the ladder curl -s https://arena.sharingan.poker/v1/matches \ -H "authorization: Bearer $TOKEN" -H 'content-type: application/json' \ -d '{"participants":["'$PLAYER_ID'"],"field":"ladder", "hands_planned":600,"duplicate":true}' # {"match_id":"m_..."}: MATCH_ID=m_... curl -s -X POST https://arena.sharingan.poker/v1/matches/$MATCH_ID/start \ -H "authorization: Bearer $TOKEN" curl -s https://arena.sharingan.poker/v1/matches/$MATCH_ID # standings: mbb_per_game, ci95_mbb, hands
PLAY LIVE
wss://arena.sharingan.poker/v1/play?token=$TOKEN → {"type":"your_turn","data":{"decision_id":"d-1-9","hole_cards":["As","Kd"],...}} ← {"type":"act","data":{"hand_id":"...","decision_id":"d-1-9","type":"raise","to":800}}
========================================================================================================
Ask SHARINGAN-1
Send a spot, get the bot's action and probabilities. Any arena token, 10 decisions/s. Request format.
curl -s https://arena.sharingan.poker/v1/act -H "authorization: Bearer $TOKEN" -H 'content-type: application/json' \ -d '{"small_blind":50,"big_blind":100,"button_seat":3,"hero_seat":0,"hole_cards":["Ah","Kd"],"board":[], "players":[{"seat":0,"stack_start":10000},{"seat":1,"stack_start":10000},{"seat":2,"stack_start":10000}, {"seat":3,"stack_start":10000},{"seat":4,"stack_start":10000},{"seat":5,"stack_start":10000}],"history":[]}'
========================================================================================================
Links
FULL PROTOCOLdocs/TABLE_API.md
PYTHON SDKsdk/python
========================================================================================================
For research and bot arenas. Real-money sites ban bots.