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

# Tick and lot size

<div className="api-reference-page" aria-hidden="true" />

Order prices (`p`) and sizes (`s`) must follow the market's permitted increments. Send them as
decimal strings, such as `"0.52"` and `"10"`, without scientific notation. Choose the final price
and size before signing.

## Hyperliquid

### Prices

Hyperliquid prices follow two precision limits:

* Non-integer prices have at most five significant figures. Leading zeroes do not count.
* Decimal places are limited by the market's size precision (`szDecimals`):

| Market | Maximum price decimal places |
| - | - |
| Perpetuals, including HIP-3 | `6 - szDecimals` |
| Spot | `8 - szDecimals` |
| Hyperliquid outcomes on Notional | `8` (`szDecimals = 0`) |

Both limits apply. Integer prices are allowed regardless of their number of significant figures.
The permitted price increment can therefore change with the price's magnitude. These are
[Hyperliquid's tick and lot size rules](https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/tick-and-lot-size).

| Market | `szDecimals` | Price | Precision |
| - | - | - | - |
| Perpetual | `3` | `"1234.5"` | Valid: five significant figures, one decimal place |
| Perpetual | `3` | `"1234.56"` | Invalid: six significant figures |
| Perpetual | `1` | `"0.01234"` | Valid: within both limits |
| Perpetual | `1` | `"0.012345"` | Invalid: six decimal places; maximum is five |
| Perpetual | `3` | `"123456"` | Valid: integer price |
| Spot | `2` | `"0.0001234"` | Invalid: seven decimal places; maximum is six |

Trigger prices (`triggerPx`) follow the same price limits as the order's market.

### Sizes

Sizes have at most `szDecimals` decimal places, giving a lot size of `10^(-szDecimals)`.
For example, with `szDecimals = 3`, the lot size is `0.001`: `"1.001"` is valid and `"1.0001"`
has excess precision.

Read the precision from Notional metadata:

| Market | Where to read `szDecimals` |
| - | - |
| Perpetuals, including HIP-3 | `perpMeta.perpMarkets[assetId].marketConfig.szDecimals` |
| Spot | `spotMeta.assets[baseAssetId].szDecimals`, using `spotMeta.spotPairs[pairId].tokens[0]` as the base Asset ID |
| Hyperliquid outcomes | Notional currently accepts whole-share order sizes (`szDecimals = 0`) |

These are responses to `POST /info` with `type: "perpMeta"` or `type: "spotMeta"`.
Spot order precision uses the **base** token's `szDecimals`; `weiDecimals` describes transfer
precision. A valid lot size does not by itself satisfy minimum order value or account limits.

## Polymarket

On Notional, `p` is the pUSD price per share and `s` is the number of shares for both buys and sells.

### Market constraints

Find the selected Polymarket side's `tokenId` in the `outcomeMarkets` returned by
`POST /info` with `type: "predictionMeta"`. Read its current constraints from the
[public Polymarket order book](https://docs.polymarket.com/market-data/prices-order-books#fetch-an-order-book):

```text theme={null}
GET https://clob.polymarket.com/book?token_id=<tokenId>
```

The response includes:

```json theme={null}
{
  "tick_size": "0.01",
  "min_order_size": "5"
}
```

`tick_size` is the price increment; `min_order_size` is the minimum number of shares for an ordinary
venue order. Use the decimal `tokenId` for this lookup and the side's Notional `assetId` in your
order. Notional's prediction metadata does not include these two constraints. Tick sizes can change;
refresh cached constraints when Polymarket reports a `tick_size_change`.

### Prices and sizes

* `p` must be an exact multiple of `tick_size`, between `tick_size` and `1 - tick_size`, inclusive.
  Notional accepts at most eight price decimal places.
* Ordinary submitted share sizes have at most **two decimal places** and must meet `min_order_size`.
  Balances and settlement amounts can have six decimal places.
* An eligible sub-minimum full-holding sell on a market advertising `minimumCloseEnabled: true`
  can use the exact holding quantity, with up to six decimal places. Follow the
  [full-holding sell rules](/api-reference/exchange-endpoints/order#token-id-outcome-validation).
* For ordinary venue orders, the quote amount (`p × s`) must be exactly representable with at most
  six decimal places.
* Immediate buys (`FrontendMarket`, `Ioc`, `Fak`, or `Fok`) also require `p × s` to be at least
  `1` pUSD and a whole-cent amount. Resting buys and sells do not have this whole-cent restriction.

Polymarket's [order precision guidance](https://docs.polymarket.com/trading/place-orders#calculate-the-order-amounts)
uses two decimal places for share sizes. Tick alignment still matters: with a tick of `0.0025`,
`"0.4225"` is aligned and `"0.423"` is not.

For an ordinary order with `tick_size = "0.01"` and `min_order_size = "5"`:

| Price (`p`) | Size (`s`) | Result |
| - | - | - |
| `"0.52"` | `"10.25"` | Valid precision and minimums; quote amount is `5.33` pUSD |
| `"0.521"` | `"10"` | Invalid: price is off the tick grid |
| `"1"` | `"10"` | Invalid: maximum price is `0.99` |
| `"0.52"` | `"4"` | Invalid: below the five-share venue minimum |
| `"0.52"` | `"10.251"` | Invalid for venue submission: more than two size decimal places |
| `"0.52"` | `"10.01"` | Valid for a resting buy; invalid for an immediate buy because `5.2052` pUSD is not a whole-cent amount |

## Signing

Remove trailing fractional zeroes before signing: use `"1.23"` instead of `"1.2300"`, and `"10"`
instead of `"10.0"`. Keep prices and sizes as strings. Notional's exchange action hashing normalizes
decimal strings, so your signed payload must use the same normalization.

Apply any rounding before signing and submit the final values. Excess precision can cause rejection;
do not rely on the server to round your order.


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