Skip to content

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.

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.

PriceCurve factorExample weight (on $100 fill at 5 BPS)
0.501.00$0.050
0.30 / 0.700.84$0.042
0.10 / 0.900.36$0.018
0.01 / 0.990.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.

// Resting buy: 1,000 shares @ 0.45 USDC
Shares filled1,000
Price0.45 USDC
Trade value450.00 USDC
Maker rebate (5 BPS)+0.225 USDC
Effective cost449.775 USDC

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.

1,000 shares filled at 0.45 USDC. Maker rebate rate = 5 BPS (default). Curve = ON. Floor = 1.00 USDC.
Linear weight (rate ร— value)0.225 USDC
Curve factor (p ร— (1โˆ’p) ร— 4 at p = 0.45)ร— 0.99
Accrued weight0.222 USDC
Daily payout (if above floor)+0.222 USDC

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

Every rebate appears as its own ledger entry tagged maker_rebate (per-fill mode) or lp_rebate_distributed (pooled mode). Reconcile against /wallet/transactions rather than computing rebates client-side.