Skip to main content
The Assignment Program lets an account volunteer to take over positions from accounts that are being liquidated, at a price better than the mark. You register standing preferences over REST; when a liquidation happens the engine books a qualifying position straight into your account.

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.
Only a full liquidation produces assignments. While an account’s equity sits in the partial-liquidation band the engine reduces its position into the order book instead, and no assignment is offered.

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.
A wallet-wide row on the flex wallet cannot carry maxSize or maxPosition. Both are dropped on submission without an error, and GET /assignmentprogram/current reads back without them. The scope has nowhere to put a per-contract limit: it spans every flex contract at once. Bound a wallet-wide enrolment with the off-book leverage cap, or set the limits on a finer row.Single-collateral wallet rows are not affected — there maxSize and maxPosition apply normally.
A wallet-wide row is the broadest enrolment available, and it is forward-looking: a contract listed tomorrow enrols you the moment it goes live, with no further action. That is usually the point, but it does mean the scope grows without you touching it — carve out anything you do not want with a disabled pair or contract row.

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 be USD; anything else is rejected with invalidCurrencyPair.
Both currencies must be sent together — sending one rejects with 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.
The contract must settle to the wallet named in contractType, or the request is rejected with contractNotFlexibleFutures. An unknown contract rejects with contractNotFound.

Single-collateral wallet

What a preference controls

maxSize and maxPosition are denominated differently per wallet. On the multi-collateral (flex) wallet both are quote-currency notional — maxSize=250000 on PF_XBTUSD means $250,000, not 250,000 contracts. On single-collateral wallets both are in contracts. Getting this wrong silently sizes your exposure orders of magnitude away from what you intended.
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:
  1. The wallet row supplies the base values.
  2. The currency pair row for that contract’s pair merges over it.
  3. The contract row merges over that.
Merging is field by field: a field a finer row leaves unset falls through to the coarser row rather than being cleared. Where two levels set the same field, the finer one wins — contract beats pair, pair beats wallet.
A row applies only inside its own 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.
The gap between them, as a fraction of the mark, is what the liquidated account can afford to give away — call it the deliverable profitability. The engine clamps it between your own minimum and the platform maximum:
Your minimum is the platform default of 75 bps unless you have set one — see Minimum profitability. For a short the signs invert: the acceptor receives the short above the mark. 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.
Because the price is struck against the mark and never touches the book, assignments do not consume order-book liquidity and your resting quotes are not involved. An assignment can arrive while you are quoting both sides, and it neither fills nor cancels those quotes.

Minimum profitability

By default every participant sits in one group at the platform floor. Setting minimumProfitabilityPerAssignmentLongBps 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.
Values are integer basis points and are validated on submission: 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:
  1. Each participant is offered an equal share of what is left.
  2. 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.
  3. What they could not take is redivided among the participants still standing, and the next round runs.
A participant that fails the margin check on its full share is offered half of it before being dropped, so a tight margin account still takes something rather than nothing. Your share therefore depends on how many other participants are eligible at that instant, and is not predictable in advance. 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.
The cap limits the effective leverage — gross open-position notional over margin equity — that off-book fills may take you to. Book orders are never affected. 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.
  • maxSize and maxPosition on 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.