Skip to main content

Documentation Index

Fetch the complete documentation index at: https://limitless-docs-ws-settlement-events.mintlify.app/llms.txt

Use this file to discover all available pages before exploring further.

The PartnerAccountService creates sub-account profiles linked to the authenticated partner. Requires HMAC authentication with the account_creation scope.

Access

from limitless_sdk import Client, HMACCredentials

client = Client(
    base_url="https://api.limitless.exchange",
    hmac_credentials=HMACCredentials(token_id=token_id, secret=secret),
)

# Use client.partner_accounts.*

Server wallet mode

Creates a managed Privy wallet for the sub-account. Enables delegated signing — the partner submits unsigned orders and the server signs them.
from limitless_sdk import CreatePartnerAccountInput

account = await client.partner_accounts.create_account(
    CreatePartnerAccountInput(
        display_name="user-alice",
        create_server_wallet=True,
    )
)

print(account.profile_id)  # numeric profile ID
print(account.account)     # wallet address
New server wallets should be checked with check_allowances() before the first delegated trade. If retryable targets are missing or failed, call retry_allowances() and poll again.

Allowance recovery

Server-wallet sub-accounts need delegated-trading approvals before they can trade. The partner allowance helpers use the Partner API only:
  • check_allowances(profile_id) calls GET /profiles/partner-accounts/:profileId/allowances
  • retry_allowances(profile_id) calls POST /profiles/partner-accounts/:profileId/allowances/retry
  • both methods require HMAC credentials with account_creation and delegated_signing
  • profile_id is the child/server-wallet profile id
from limitless_sdk import ConflictError, RateLimitError

allowances = await client.partner_accounts.check_allowances(account.profile_id)

if not allowances.ready:
    retryable_targets = [
        target
        for target in allowances.targets
        if target.retryable and target.status in {"missing", "failed"}
    ]

    if retryable_targets:
        try:
            allowances = await client.partner_accounts.retry_allowances(account.profile_id)
        except RateLimitError as error:
            print(error.response_data.get("retryAfterSeconds"))
        except ConflictError:
            print("Retry already running; poll check_allowances again shortly.")

if any(target.status == "submitted" for target in allowances.targets):
    # A sponsored tx/user operation was submitted by this retry request.
    # Poll check_allowances() again after a short delay to observe confirmed chain state.
    pass
Recommended partner flow:
  1. Poll check_allowances(profile_id).
  2. If ready is True, continue.
  3. If targets are missing or failed with retryable=True, call retry_allowances(profile_id).
  4. If retry returns submitted targets, poll check_allowances() again after a short delay.
  5. If retry returns 429, wait retryAfterSeconds.
  6. If retry returns 409, wait briefly and call check_allowances() again.

EOA mode

Creates a profile for an externally-owned address. The end user manages their own keys and signs orders themselves. EOA mode requires wallet ownership verification headers:
from limitless_sdk import CreatePartnerAccountInput, CreatePartnerAccountEOAHeaders

account = await client.partner_accounts.create_account(
    CreatePartnerAccountInput(display_name="user-bob"),
    eoa_headers=CreatePartnerAccountEOAHeaders(
        account="0x5aAeb6053F3E94C9b9A09f33669435E7Ef1BeAed",
        signing_message="0x...",
        signature="0x...",
    ),
)

Validation

  • display_name is optional, max 44 characters. Defaults to the wallet address if omitted.
  • Returns 409 Conflict if a profile already exists for the target address.
  • Cannot create a sub-account for the partner’s own address.
  • The SDK validates display_name length locally before sending the request.