The DelegatedOrderService enables partners with the delegated_signing scope to place and cancel orders on behalf of their sub-accounts. The server signs orders using the sub-account’s managed Privy wallet — no private key management is needed on the partner side.
Delegated signing requires a sub-account created with createServerWallet: true. EOA sub-accounts sign their own orders.
Recommended setup: Store your HMAC credentials (tokenId / secret) on your backend. Use this SDK server-side to sign partner-authenticated requests. Expose only your own app-specific endpoints to the frontend. Never expose HMAC secrets in browser bundles or client-side storage.
Access
import { Client } from '@limitless-exchange/sdk';
const client = new Client({
baseURL: 'https://api.limitless.exchange',
hmacCredentials: { tokenId, secret },
});
// Use client.delegatedOrders.*
Create a GTC delegated order
Builds an unsigned GTC (Good Till Cancelled) limit order locally and submits it to POST /orders with the onBehalfOf profile ID. The server signs the order via the sub-account’s managed wallet. GTC orders remain on the orderbook until filled or explicitly cancelled.
import { OrderType, Side } from '@limitless-exchange/sdk';
const response = await client.delegatedOrders.createOrder({
marketSlug: 'btc-100k',
orderType: OrderType.GTC,
onBehalfOf: partnerAccount.profileId,
args: {
tokenId: market.tokens.yes,
side: Side.BUY,
price: 0.55,
size: 10,
},
});
console.log(response.order.id);
Create a FOK delegated order
FOK (Fill or Kill) orders execute immediately at the best available price or are cancelled entirely — there are no partial fills. Instead of price and size, FOK orders use makerAmount:
- BUY:
makerAmount is the USDC amount to spend (e.g., 50 = spend $50 USDC)
- SELL:
makerAmount is the number of shares to sell (e.g., 18.64 = sell 18.64 shares)
import { OrderType, Side } from '@limitless-exchange/sdk';
// BUY FOK — spend 1 USDC at market price
const buyResponse = await client.delegatedOrders.createOrder({
marketSlug: 'btc-100k',
orderType: OrderType.FOK,
onBehalfOf: partnerAccount.profileId,
feeRateBps: 300,
args: {
tokenId: market.tokens.yes,
side: Side.BUY,
makerAmount: 1,
},
});
if (buyResponse.makerMatches?.length) {
console.log(`FOK order matched with ${buyResponse.makerMatches.length} fill(s)`);
} else {
console.log('FOK order was not matched — cancelled automatically');
}
// SELL FOK — sell 10 shares at market price
const sellResponse = await client.delegatedOrders.createOrder({
marketSlug: 'btc-100k',
orderType: OrderType.FOK,
onBehalfOf: partnerAccount.profileId,
args: {
tokenId: market.tokens.yes,
side: Side.SELL,
makerAmount: 10,
},
});
Parameters
GTC order args
| Field | Type | Description |
|---|
marketSlug | string | Market identifier |
orderType | OrderType | OrderType.GTC |
onBehalfOf | number | Profile ID of the sub-account |
args.tokenId | string | Position token ID (YES or NO) from market data |
args.side | Side | BUY (0) or SELL (1) |
args.price | number | Price between 0 and 1 |
args.size | number | Number of contracts |
feeRateBps | number | Fee rate in basis points (defaults to 300 if omitted) |
FOK order args
| Field | Type | Description |
|---|
marketSlug | string | Market identifier |
orderType | OrderType | OrderType.FOK |
onBehalfOf | number | Profile ID of the sub-account |
args.tokenId | string | Position token ID (YES or NO) from market data |
args.side | Side | BUY (0) or SELL (1) |
args.makerAmount | number | BUY: USDC to spend. SELL: shares to sell. Max 6 decimals. |
feeRateBps | number | Fee rate in basis points (defaults to 300 if omitted) |
Cancel an order
Cancel an order placed by the partner or on behalf of a sub-account.
await client.delegatedOrders.cancel(orderId);
Cancel on behalf of a sub-account
await client.delegatedOrders.cancelOnBehalfOf(orderId, partnerAccount.profileId);
Cancel all orders in a market
await client.delegatedOrders.cancelAll(marketSlug);
Cancel all on behalf of a sub-account
await client.delegatedOrders.cancelAllOnBehalfOf(marketSlug, partnerAccount.profileId);
How it works
- The SDK builds an unsigned order locally using
OrderBuilder with a zero verifying address
- For GTC orders,
price and size are used; for FOK orders, makerAmount is used (with takerAmount always set to 1)
- The order is posted to
POST /orders with onBehalfOf and ownerId set to the sub-account’s profile ID
- The server detects the
delegated_signing scope and missing signature
- The server looks up the sub-account’s server wallet, builds EIP-712 typed data, and signs via Privy
- The signed order is submitted to the CLOB engine — FOK orders fill immediately or are cancelled