Market makers
Maker rebates
Every fill on a resting limit order pays the maker a small rebate. This page covers why the program exists, where the rebate USDC comes from, which markets qualify, the rate schedule, eligibility rules, and how to verify rebates landed in your balance.
Why maker rebates
Resting limit orders are what make a market tradeable. The deeper and tighter the book, the smaller the spread a taker pays โ which makes more people willing to trade. We pay rebates to compensate market makers for the inventory risk and adverse-selection cost of providing that depth, so the book stays usable through resolution.
- Better books mean lower effective costs for takers โ which drives volume back to the same market makers.
- Rebates flow only to liquidity that was actually taken โ fills, not just resting interest โ so the program rewards depth that's in the path of real flow.
- Rates and the rebate curve are set at the platform's discretion and may change with notice โ they are a tool to shape liquidity, not a guaranteed yield.
Two payout modes
The rebate program runs in one of two modes at any given time. The mode is admin-controlled at the platform level โ individual makers cannot self-elect a mode. Your /rewards page sums both kinds of ledger entries, so the total you see is always correct regardless of which mode is active.
- Per-fill: Rebate credits to your cash account the moment your resting limit order fills. Default mode. You see the credit immediately in /portfolio.
- Pooled: Rebates accrue per fill and pay out once per day from the shared pool. The daily cycle lets the platform apply a minimum payout floor and (optionally) the p(1-p) curve described below.
Fee schedule
Takers pay the trading fee. Makers receive the rebate. The numbers below are the current platform defaults; markets can override them.
| Role | Rate | BPS | Direction |
|---|---|---|---|
| Maker (standard) | 0.05% | 5 BPS | Credited to maker |
| Maker (PAT / API-key) | 0.10% | 10 BPS | Credited to maker |
| Taker | 1.5% | 150 BPS | Deducted from taker |
Maker (standard)
0.05%- BPS:
- 5 BPS
- Direction:
- Credited to maker
Maker (PAT / API-key)
0.10%- BPS:
- 10 BPS
- Direction:
- Credited to maker
Taker
1.5%- BPS:
- 150 BPS
- Direction:
- Deducted from taker
PAT (Personal Access Token) holders receive an enhanced 10 BPS (0.10%) maker rebate instead of the default 5 BPS โ see /docs/trading/authentication for how to generate a key. Read the effective program-wide default from GET /api/v1/admin/settings/business-rules (field: maker_rebate_bps); per-category overrides are visible at GET /api/v1/admin/rebate-program/config (admin access required).
Where the rebate comes from
The rebate is paid out of the taker fee. There is no separate platform-funded incentive bucket โ the 1.5% the taker pays on each fill is the source. In per-fill mode the rebate is settled at match time; in pooled mode the same fee dollars accrue to a daily distribution pool and are paid out the next 00:00 UTC cycle.
- Per-fill mode: maker rebate is debited from `platform.fee` and credited to `user.cash` at the time the fill posts โ see the trade ledger entries.
- Pooled mode: accruals land in `lp_rebate_accruals` and pay out daily; the pool is capped at 95% of `platform.fee` balance at cutoff to prevent draining the fee account.
- Pooled mode payouts have a $1 USDC floor per cycle โ below that, your accrual rolls over to the next cycle. Nothing is forfeited from rounding.
Per-category rates
The 5 BPS standard rate above is the program-wide default. Admin can configure higher or lower rates per market category โ for example, 20 BPS on Crypto or 0 BPS on Geopolitics. Your rate at fill time is the category override when present, otherwise the default.
The rate at the moment of your fill is snapshotted onto your accrual row, so an admin rate change between accrual and the next daily payout does not retroactively re-price what you already earned.
Optional p(1-p) curve (pooled mode)
When the curve is on, each fill's weight in the daily distribution pool is `fill_notional ร p ร (1โp) ร 4`, where `p` is the fill price as a probability (so `p = 0.45` means a 45-cent fill). The `p ร (1โp) ร 4` factor is 1.0 at the midpoint (`p = 0.5`) and shrinks toward the edges; `fill_notional` keeps larger fills weighted proportionally to their size. Quoting at uncertain prices earns more than quoting at near-resolved prices.
| Price | Curve factor | Example weight (on $100 fill at 5 BPS) |
|---|---|---|
| 0.50 | 1.00 | $0.050 |
| 0.30 / 0.70 | 0.84 | $0.042 |
| 0.10 / 0.90 | 0.36 | $0.018 |
| 0.01 / 0.99 | 0.04 | $0.002 |
Curve weights are symmetric around p = 0.5 โ quoting yes at 0.30 and no at 0.70 earn the same factor (0.84). The toggle is admin-controlled; check /admin/rebate-program/config to see whether it is currently active in your environment.
Distribution schedule (pooled mode)
Pooled mode runs one distribution per day. The scheduler aggregates every open accrual, divides the pool by your share of the total weight, and credits your cash account in a single transaction.
- Default cycle: 24 hours (00:00 UTC). Staging may run on a 5-minute cycle for faster bot iteration.
- Minimum payout floor: $1.00 USDC per cycle. Earnings below the floor roll over to the next cycle so you do not get nickel-and-dimed by partial payouts.
- Pool cap: the daily payout never exceeds 95% of the platform fee account balance. The remainder rolls into the next cycle untouched.
Which markets are eligible
Every active market is eligible for the maker rebate by default. Admins can override the rate per market category (for example, set Sports or Politics to a different BPS, or zero the rebate on a specific category) via `PUT /admin/rebate-program/config`. The override applies to fills posted after the change.
- Resolved markets stop accruing rebates the moment trading halts for resolution.
- Cancelled or settled markets are not eligible โ there are no fills to earn against.
- Seed liquidity orders placed by the platform MM account do not earn rebates; they are excluded at the ledger level.
- Specific markets can be excluded from rebates by admin configuration โ check GET /api/v1/admin/rebate-program/config (field: excluded_market_ids) to verify a market's eligibility before quoting.
Eligibility rules
Not every fill earns a rebate. The rules below are aimed at honest liquidity provision; gaming detection logic excludes patterns that look like fee farming.
- Order must rest in the book before being matched โ submit-and-immediately-fill orders earn no rebate.
- Self-trades earn no rebate โ the engine blocks them outright.
- [Planned] Builder-code tagging (X-Builder-Code header) is not yet implemented; this eligibility rule is reserved for a future release.
- Wash-trading patterns are excluded from rebate accrual after detection.
- If you are in a jurisdiction the platform has paused for rebates, your accruals are skipped silently; the /rewards page banner explains the reason.
Worked example
Suppose your resting buy order at 0.45 USDC for 1,000 shares is filled by a taker. You are the maker on this trade.
You paid 450.00 USDC for shares and were credited 0.225 USDC, so your true cost basis is 449.775 USDC.
Worked example โ pooled mode with curve
Same fill as above, run through the pooled engine with the curve enabled. The curve applies at accrual time; the floor and the next-cycle credit happen at distribution.
Your accrual stays open until the next daily cycle. If your total accrued weight across all fills in the cycle is below 1.00 USDC, the balance rolls to the next day and is paid out when it crosses the floor.
Reconcile against the ledger