Overview
Assignments are pushed, not pulled. There is no request to answer and no window in which to accept: everything you control is configured in advance.
You may receive an assignment at any time your preferences are active, including outside your own trading hours, and the position arrives already open. Size your
maxSize and maxPosition limits for a position you would be comfortable holding unattended.Joining the program
1
Accept the terms
Open Assignment Program settings on Kraken Pro and accept the Assignment Program terms and conditions. Until the account has accepted, every preference request is rejected with
assignmentProgramTermsNotAcceptedFrontend.2
Add a preference
Post one preference per scope you want to participate in — see Preference scopes.
3
Check what is live
GET /assignmentprogram/current returns every active preference with its id. GET /assignmentprogram/history returns the full change history, including deletions. Remove a preference with POST /assignmentprogram/delete?id=<id>.Preference scopes
A preference is keyed by the scope you give it, and on the multi-collateral (flex) wallet there are three, from coarsest to finest:
contract and the baseCurrency/quoteCurrency pair are mutually exclusive. Sending both is rejected with mustSpecifyAssignmentParticipantForExactlyOneOfContractOrCurrencyPair.
Single-collateral wallets have only the wallet scope — the wallet is the contract. Sending contract or a currency pair with a single-collateral contractType is rejected with cannotSpecifyAssignmentParticipantForContractOrCurrencyPair.
Wallet-wide
Covers everything the wallet settles, including contracts listed after you set it.Currency pair
One row covers the perpetual and every dated expiry on the pair, which is usually what you want for an entire curve. The quote currency must beUSD; anything else is rejected with invalidCurrencyPair.
invalidBaseCurrency or invalidQuoteCurrency for whichever is missing. Each is accepted as either the unit code or the display name.
Single contract
The finest scope, and the only one that can single out one expiry.contractType, or the request is rejected with contractNotFlexibleFutures. An unknown contract rejects with contractNotFound.
Single-collateral wallet
What a preference controls
Both limits are optional, and omitting them means no limit of that kind — only your margin and the platform caps stop you. Where they apply, both are validated on submission:
Both limits report the same code on this API — a
maxPosition breach is not distinguishable from a maxSize breach by the error alone. Check both values when you see it.maxPosition=0 is accepted, and it is the cleanest per-contract opt-out: every allocation is clamped against it, so you are never assigned that contract while it is set. maxSize=0 is rejected — use maxPosition for this.
The maxSize ceiling is a platform parameter (currently half the contract maximum) and can be retuned. On a flex contract both bounds are evaluated as notional at the contract’s current index price, so the ceiling moves with the market.
How scopes combine
An account can hold rows at all three levels at once. For a given liquidation the engine resolves one effective preference per account, merging coarse into fine:- The wallet row supplies the base values.
- The currency pair row for that contract’s pair merges over it.
- The contract row merges over that.
timeFrame. A wallet row set to WEEKDAYS supplies nothing at the weekend, and the finer rows then resolve against no base at all.
Turning assignments off
enabled=false is not a delete. Its meaning depends on the scope:
A disabled finer row wins over an enabled coarser one, so it is the way to carve one contract or one curve out of a broad enrolment without tearing the enrolment down.
To leave entirely, delete the rows (
POST /assignmentprogram/delete), or use the off-book leverage cap below as a single switch.
How an assignment is priced
The price is derived, not negotiated, from two numbers:- The mark price — the fair value the engine holds the contract at.
- The zero-equity price — the price at which closing the position would take the liquidated account’s equity to exactly zero, after the liquidation fee.
Worked through, on a long
PF_XBTUSD position with the mark at $100,000, for a participant on the default 75 bps:
The 75 and 250 bps figures are platform parameters, not published in the API, and can be changed without a release. Treat them as the current configuration rather than a contractual band, and do not hard-code them.
Minimum profitability
By default every participant sits in one group at the platform floor. SettingminimumProfitabilityPerAssignmentLongBps or …ShortBps moves you into your own group and changes two things at once.
It sets your place in the queue. Groups are walked in ascending order of minimum — the participants asking for the least edge are offered the position first, and only what they cannot absorb passes to the next group. A lower minimum means more flow.
It sets your price. Your fill is the deliverable profitability, floored at your own minimum instead of the platform default. Where the liquidated account cannot deliver that much, the difference is funded — up to your minimum, and never past the platform maximum:
The two pull against each other, and that is the whole trade: a lower minimum buys flow at a worse price, a higher one buys price at the cost of flow. Neither is strictly better, and a preference is not a floor that only ever improves your fills.
Your minimum is the price the engine targets, not a hard floor. The top-up is funded from the liquidated account’s remaining equity and the liquidity pool together. In the rare case that neither can cover it, the engine funds what it can and strikes at the best price available, which can be below your minimum.
GET /derivatives/api/v4/liquidity-pool reports the pool’s available funds, in total and per settlement currency, if you want to track the capacity behind the subsidy. It is a point-in-time figure and not a per-assignment guarantee.
The two directions are independent, and only the one matching the position you would receive is consulted — the long preference for a liquidated long, the short preference for a liquidated short.
Who is eligible for a given assignment
At the moment of the liquidation the engine filters participants down to those that can actually take the position. You are skipped, silently, if any of these is true:
Nothing is published when you are skipped. Eligibility is re-evaluated for every assignment, so a participant that took one assignment can be skipped for the next one seconds later on margin alone.
How a position is split
When several participants qualify, the position is divided in rounds rather than first-come-first-served:- Each participant is offered an equal share of what is left.
- A participant who cannot take their whole share — because of
maxSize,maxPosition, or margin — is filled as far as they can go, then dropped from later rounds. - What they could not take is redivided among the participants still standing, and the next round runs.
maxSize bounds it from above; nothing bounds it from below.
Limiting your exposure
Beyond the per-preference limits there is an account-level cap that covers all off-book fills — assignments and RFQ offer fills together. It is the only bound available to a wallet-wide flex row.
Fills that reduce your gross open-position notional always go through, even at a cap of
0 and even when you are already over the cap, so opting out never traps you in existing exposure. The cap is set per master account and applies to the whole account.
How assignments appear
There is no assignment-specific channel or state. An assignment reaches you as an ordinary fill, tagged so you can tell it apart:
You are booked as the maker side of the trade, so maker fees apply at your usual schedule.
Assignments print publicly at the assignment price, which is off the book by construction. On a quiet market this shows up in trade history and on candles as a print away from the prevailing bid and ask — up to 250 bps from the mark. It is not an erroneous trade, and no book liquidity traded at that price.
Reference
Endpoints
Errors
Things that are not true of assignments
A short list of assumptions worth discarding, because each one costs a debugging session:- You cannot decline one. There is no accept or reject step; the position is booked and the first you know of it is the fill.
- Your preference is not a quote. You cannot price an individual assignment, and you are never asked.
- A lower minimum is not a worse deal. It moves you up the queue and lowers your floor at the same time — the two pull in opposite directions.
- A higher minimum is not an off switch. An assignment will be funded up to your minimum, so an above-default preference is reachable; what it costs you is queue position, not eligibility.
- A finer row does not replace a coarser one. Scopes merge field by field, so a contract row with one field set inherits everything else from the pair and wallet rows underneath it.
maxSizeandmaxPositionon a wallet-wide flex row do nothing. They are dropped on submission — bound that scope with the off-book leverage cap.- Partial liquidations never assign. Only a full liquidation offers a position to the program.
- Assignments do not touch your orders. No fill, no cancel, no self-trade interaction.