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

# Prices and ticks

> The tick schedule, which way an off-tick order limit moves on a normal or lay betslip, combo prices, and why feed prices are never re-rounded.

Single-market prices lie on a fixed tick schedule. The tick, the smallest step between two valid prices, widens as the decimal price grows. Combo prices are the product of their legs' prices, so they sit on no schedule. They are quoted, and accepted as limits, at full precision up to the 1000 ceiling.

| Decimal price | Cents (approximate) | Tick |
| - | - | - |
| 1.01 to 2 | 99c to 50c | 0.01 |
| 2 to 3 | 50c to 33.3c | 0.02 |
| 3 to 4 | 33.3c to 25c | 0.05 |
| 4 to 6 | 25c to 16.7c | 0.10 |
| 6 to 10 | 16.7c to 10c | 0.20 |
| 10 to 20 | 10c to 5c | 0.50 |
| 20 to 30 | 5c to 3.3c | 1 |
| 30 to 50 | 3.3c to 2c | 2 |
| 50 to 100 | 2c to 1c | 5 |
| 100 to 1000 | 1c to 0.1c | 10 |

Cents are the implied probability of a price: `cents = 100 / decimal price`. Band boundaries are exact in decimal price. The cents labels are approximate, so always match a price to its band by the decimal value.

## Order prices

The price on an order is a limit. An order fills only at your price or better. Which way is better depends on the betslip type, not on the first token of `bet_type`:

| Betslip type | What the price is | Better | Off-tick limit |
| - | - | - | - |
| `normal` (default) | Decimal odds on the selection in `bet_type`. With an `against` bet type, that is odds on the outcome not happening | Higher | Moves up: 7.15 becomes 7.20 |
| `lay` | A lay price on the selection | Lower | Moves down: 2.31 becomes 2.30 |

Either way, the moved limit is never worse than the one you sent. The moved price is the one the order runs with and the one the order response reports.

## Feed prices

Every single-market price delivered on the stream, in offers and in `pmm` quotes, is already on the schedule. A price quoted straight from the feed is always valid and is never re-rounded.

## Snapping in code

```python theme={"dark"}
BANDS = [(2, 0.01), (3, 0.02), (4, 0.05), (6, 0.10), (10, 0.20),
         (20, 0.50), (30, 1), (50, 2), (100, 5), (1000, 10)]

def tick_for(price: float) -> float:
    for upper, tick in BANDS:
        if price <= upper:
            return tick
    return 10

def snap(price: float, betslip_type: str = "normal") -> float:
    # Up on a normal betslip, down on a lay betslip: never worse than the limit.
    import math
    tick = tick_for(price)
    steps = price / tick
    n = math.floor(steps + 1e-9) if betslip_type == "lay" else math.ceil(steps - 1e-9)
    return round(n * tick, 2)

snap(7.15)          # 7.2   normal betslip, for or against
snap(1.985)         # 1.99
snap(2.31, "lay")   # 2.3   lay betslip
```

The server applies the same rule. Snap first if you want to show the exact price before you send the order, and read the price the order runs with from the order response.

For how prices appear in the app, in cents and decimal, see [Prices and ticks](/platform/prices-and-ticks).


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.