> ## 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.

# Price alerts

> The bell sheet: what has happened, what is still watching, and how to set a new price alert.

Price alerts are an extension feature. Neither the [Telegram bot](/telegram/overview) nor
the [web terminal](/terminal/overview) has them — if you want to be told when a market
crosses a price, this is where it is set up. See [Alerts](/guides/alerts) for the concept.

## The bell

The bell sits in the popup header. A badge on it counts unread notifications, capped at
*9+*, and it keeps itself current every 30 seconds while the popup is open.

Pressing it slides open **Alerts & Notifications**, split into two sections.

## Notifications — what has happened

The top section is your unread feed, and it carries two kinds of entry.

**A price alert that fired** shows the market, an up or down arrow for the direction, a
**New** badge, and *Hit 80¢* — which is the **threshold you set**, not the price that
traded. The crossing price itself is never kept, so check the market for where it is now.

**A copy trade stopped** shows a warning triangle instead of an arrow, and reads as a
sentence rather than a price. Ballista writes one when a copy trade hits its balance
stop-loss or take-profit: the copy trade is switched off, and if one of its positions
could not be sold on the way out, the notice names the copy trade and the position — the
shares, the outcome and the entry price — and tells you it is still open and has to be
closed manually.

**Press an entry to mark it read.** It leaves the list and the bell badge drops. Entries
stay until you do — the feed is the full record, and each one is announced as a
[desktop notification](/extension/desktop-notifications) only once, when it arrives.

## Price Alerts — what is still watching

Below that are the price alerts that have not fired yet — only price alerts; the section
never lists anything else. Each shows the market, whether it is watching for **Above** or
**Below**, and the threshold in cents. The bin on the right deletes one.

Once an alert fires it moves up to Notifications and stops watching — an alert triggers
**once**, not every time the price crosses. To keep watching the same level, create it
again.

## Create an alert

Press **+ New** at the top of the Price Alerts section. The form asks for four things:

| Field       | What to enter                                                               |
| ----------- | --------------------------------------------------------------------------- |
| Market slug | A label, from the market's page URL.                                        |
| Token ID    | The identifier of the outcome — YES or NO — you want watched.               |
| Condition   | **Above** or **Below**.                                                     |
| Threshold   | A price strictly between 0 and 1. `0.8` means 80¢; `0` and `1` are refused. |

Press **Create Alert** and it joins the list below.

<Warning>
  Only the **token ID** decides what is watched. The market slug is stored as typed
  and never checked, so a mistyped one still creates a working alert — it just labels
  it wrongly in the list and in the desktop notification. On an event with several
  markets, the slug in the address bar is usually the *event*, not the market, so a
  hand-typed alert can end up named after the wrong thing.
</Warning>

<Tip>
  The [on-page panel](/extension/on-page-panel) is far easier, and safer. While you are
  reading a market on Polymarket, pick YES or NO in the panel and press **+ Add
  Alert** — it fills the market and the outcome in for you, correctly, and only asks
  for the condition and the threshold.
</Tip>

## What happens when one fires

Ballista watches the last traded price of the outcome you picked. When it crosses your
threshold, the alert triggers: it appears under Notifications, and Chrome shows you a
[desktop notification](/extension/desktop-notifications) once, even if the popup is
closed. It then waits under the bell until you read it.
