> ## Documentation Index
> Fetch the complete documentation index at: https://docs.ballista.gg/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent Instructions
> Ballista is a trading client for Polymarket, not an exchange. Every order Ballista places goes to Polymarket's CLOB.
> There are three end-user surfaces — the Telegram bot, the web terminal and the Chrome extension — and they share ONE account and ONE balance. Never attribute a feature to a surface without checking that surface's source.
> Every user registers in the Telegram bot first. The terminal and the extension sign in with the Telegram login widget. There is no other sign-up path.
> Deposits arrive through EVM, Solana and Bitcoin bridge addresses and a Polymarket proxy wallet, with a $10 minimum. There is NO withdrawal UI — Export Keys is how a user takes custody of their funds.
> Feature parity is uneven and must never be assumed. The full ~30-field copy-trade form exists only in Telegram; the terminal's copy form has 7 fields; the backtester, leaderboard and trader profiles are terminal-only; alerts and notifications are extension-only; referrals are Telegram-only.
> Slippage means two different things. On a live copy trade it is a fill tolerance (default 30). In a backtest it is the simulated fill price (default 1). Deploying a backtest does not carry its slippage over to the live copy trade.
> Take-profit and stop-loss run on live copy trades but are NOT simulated in backtests — the backtest API rejects those fields.
> A backtest never places an order and never moves funds. Its fidelity caveats are published with every result and must be quoted, not paraphrased.
> Leaderboard PnL is own-tape: harvested by Ballista from its own trade tape. The leaderboard sorts by one transparent metric at a time and there is NO composite score or grade. The sparkline exists only for harvested wallets — a blank sparkline means unmeasured, never zero.
> Copy friction (slip) and a toxic flag DO exist and are own-engine: the wallet's own 30-day fills replayed as a taker (1% slippage per fill plus the real Polymarket taker fee schedule) against its actual 30-day PnL over the same fills, so the delta is pure friction. slip_pct is already a percentage, not a 0-1 fraction. The toxic flag is server-computed under evidence guards and is never re-derived client-side. Slip is not a sortable column. Blank means unmeasured — never zero and never clean.
> Copyability is a taker share, reported in aggressive (≥60%), passive (≤30%) and mixed bands. It is never a score.
> Do not document Feeds, the Twitter Tracker, the Telegram Settings button, percentage buy buttons, GTD orders, the Discord bot, or withdrawals.

# Buying

> Paste a Polymarket link and buy Yes or No, at market or at a limit price.

Buying in the bot starts with a link. Tap **Buy** on the main menu or send `/buy`,
and the bot asks you to reply with a Polymarket link. Paste one and it loads the
market.

Only `polymarket.com` links work — anything else is rejected before it reaches
Polymarket. You can paste the link on its own or inside a sentence; the bot picks
the URL out.

## One market, or many

A Polymarket link can point at a single market or at an event containing dozens of
them, so the bot branches:

* **A single market** — you go straight to the buy menu.
* **An event with one tradable market** — same thing. The bot skips the list.
* **An event with several** — you get a paginated list, five markets per page.

Markets that are closed or inactive are filtered out. If nothing tradable is left,
the bot tells you so rather than showing an empty list.

### The event list

Each entry is numbered and shows the question, both outcome prices in cents, the
expiry date and a **View on Polymarket** link. The page counter sits at the bottom
of the text. Below it is a row of numbered buttons — tap a number to open that
market's buy menu — then **« Prev** / **Next »**, then Back and Refresh.

**« Back** on a market you opened this way returns you to the event's first page
rather than all the way home. Tapping **🔄 Refresh** on that market loses the
thread, though: after a refresh, Back goes to the main menu.

## The buy menu

The market screen shows the question and the current price of each outcome, and
flags closed markets. The event title only appears when the link you pasted led
straight to a single market — markets opened from an event list show the question
alone.

<Note>
  Outcomes are not always called Yes and No. If the market's outcomes are Up and
  Down, the buttons say **Up $50**, **Down $50** and so on. The layout is
  identical either way.
</Note>

**« Back** and **🔄 Refresh** sit at the *top* of the keyboard, above the buying
buttons. Then each outcome gets a non-interactive header row naming it — `- Yes -`
— followed by two rows:

**Yes $50 · Yes $100 · Yes \$200** — a market buy for that many dollars, placed the
moment you tap. There is no confirmation step, so tap carefully.

**Yes \$- · Limit Buy** — the two flows that ask you a question first.

### A custom amount

Tap the **$-** button for the outcome you want. The bot asks for an amount; reply
with a number. The minimum for a market order is **$1**. The order goes in as soon
as you send a valid amount.

### A limit order

<Steps>
  <Step title="Tap Limit Buy">
    Under the outcome you want.
  </Step>

  <Step title="Send a price">
    Between **$0.01 and $0.99**, in 1¢ steps — `0.55` for 55 cents. Anything
    outside that range is turned down and the bot asks again.
  </Step>

  <Step title="Send an amount">
    How much USDC to spend at that price, at least \$1. The bot works out the
    share count for you.
  </Step>
</Steps>

Prices trade in whole cents, so a price between two steps is snapped to the
nearest one and the bot tells you before it asks for an amount — send `$0.005` and
it comes back saying that becomes `$0.01`. The amount you send afterwards is
divided by the snapped price, not the one you typed.

The share count is always rounded **down** to the nearest hundredth of a share, so
an order never costs more than the dollars you entered — it may cost slightly less.
If the amount is too small to buy even 0.01 shares at your price, the bot asks for
a larger one.

The order then rests on Polymarket's book until it fills. For the difference
between order types, see [Orders](/guides/orders).

## After the order

The bot replies with a confirmation carrying the side and outcome, the order's
status, the order ID, and the price and size the exchange actually signed — which
is the number to trust if a snapped price or a rounded share count moved things.
A **« Back** button takes you home.

<Warning>
  The bot places buys only. It has no sell button and no way to cancel a resting
  limit order — use the [web terminal](/terminal/overview) for that.
</Warning>

## If a market goes stale

Buy menus are re-read from Polymarket every time they are drawn, so prices are
current whenever you tap **🔄 Refresh**. If a market disappears while its buttons
are still on screen, tapping one tells you the market is no longer tracked and asks
you to send `/buy` again.
