Skip to main content

lasersell-sdk (Python)

Python SDK for the LaserSell API.

Full documentation: docs.lasersell.io/api/sdk/python

Modules:

Using AI to code? Add the LaserSell MCP server to your editor so your AI assistant can search LaserSell documentation in real time.

Install

pip install lasersell-sdk

From this repository:

cd lasersell-sdk/python
python -m pip install -e .

Package layout

  • lasersell_sdk.exit_api: build unsigned buy/sell transactions.
  • lasersell_sdk.stream.client: websocket transport and command sender.
  • lasersell_sdk.stream.session: higher-level stream session with position tracking.
  • lasersell_sdk.stream.proto: protocol types and JSON encode/decode helpers.
  • lasersell_sdk.tx: sign/encode/send Solana transactions.
  • lasersell_sdk.retry: retry/backoff and timeout helpers.

Build a sell transaction

import asyncio

from lasersell_sdk.exit_api import BuildSellTxRequest, ExitApiClient, SellOutput


async def main() -> None:
    client = ExitApiClient.with_api_key("REPLACE_WITH_API_KEY")

    request = BuildSellTxRequest(
        mint="REPLACE_WITH_MINT",
        user_pubkey="REPLACE_WITH_WALLET_PUBKEY",
        amount_tokens=1_000_000,
        slippage_bps=2_000,
        output=SellOutput.SOL,
    )

    response = await client.build_sell_tx(request)
    print(response.tx)


asyncio.run(main())

Notes:

  • amount_tokens is in token atomic units (smallest unit for the mint).
  • slippage_bps is basis points (100 = 1%, 2000 = 20%).
  • Use client.with_base_url("https://api-dev.example") to target a custom base URL.

Stream + auto-sell flow

Important: Connect the stream before submitting a buy transaction. See docs.lasersell.io/api/exit-api/buy for details.

import asyncio

from solders.keypair import Keypair

from lasersell_sdk.stream.client import (
    StreamClient,
    StreamConfigure,
    strategy_config_from_optional,
)
from lasersell_sdk.stream.session import StreamSession
from lasersell_sdk.tx import SendTargetHeliusSender, send_transaction, sign_unsigned_tx


async def main() -> None:
    signer = Keypair()
    client = StreamClient("REPLACE_WITH_API_KEY")
    session = await StreamSession.connect(
        client,
        StreamConfigure(
            wallet_pubkeys=["REPLACE_WITH_WALLET_PUBKEY"],
            strategy=strategy_config_from_optional(
                target_profit_pct=50.0,
                stop_loss_pct=10.0,
            ),
            deadline_timeout_sec=45,
            send_mode="helius_sender",
            tip_lamports=1000,
        ),
    )

    while True:
        event = await session.recv()
        if event is None:
            break

        if event.type == "exit_signal_with_tx" and event.message.get("type") == "exit_signal_with_tx":
            signed_tx = sign_unsigned_tx(event.message["unsigned_tx_b64"], signer)
            signature = await send_transaction(SendTargetHeliusSender(), signed_tx)
            print(signature)


asyncio.run(main())

deadline_timeout_sec is enforced client-side by StreamSession timers and is not sent as part of wire strategy. Use session.update_strategy(...) when changing strategy so local deadline timers stay in sync (pass deadline_timeout_sec= to change local deadline timing). Use single_wallet_stream_configure_optional(...) / strategy_config_from_optional(...) to omit TP/SL fields; at least one of take profit, stop loss, trailing stop, or timeout must be enabled.

Trailing stop

Lock in profits by tracking a high-water mark. When the position's profit drops by the configured percentage of entry cost from its peak, an exit is triggered.

from lasersell_sdk.stream.client import strategy_config_from_optional

# 20% take profit, 10% stop loss, 5% trailing stop
strategy = strategy_config_from_optional(
    take_profit_pct=20.0,
    stop_loss_pct=10.0,
    trailing_stop_pct=5.0,
)

Example: with trailing_stop_pct=5.0 and an entry of 100 SOL, if profit peaks at 30 SOL, an exit triggers when profit falls below 25 SOL.

Sell on graduation

Automatically exit a position when its token graduates from a bonding curve to a full DEX (e.g. Pump.fun to PumpSwap). Enable by setting sell_on_graduation in the optional strategy config:

from lasersell_sdk.stream.client import strategy_config_from_optional

strategy = strategy_config_from_optional(
    take_profit_pct=20.0,
    stop_loss_pct=10.0,
    sell_on_graduation=True,
)

When a graduation event is detected the server sells the position on the new market and reports "graduation" as the exit reason.

Update wallets mid-session

Add or remove wallets without reconnecting:

await session.sender().update_wallets(["WALLET_1_PUBKEY", "WALLET_2_PUBKEY"])

The server diffs the new list against the current set and registers/unregisters accordingly.

Liquidity snapshots (Tier 1+)

Professional and Advanced tier subscribers receive real time liquidity snapshots alongside PnL updates. Each snapshot contains slippage bands and a liquidity trend indicator. See the full announcement. StreamSession caches the latest snapshot per position:

bands = session.get_slippage_bands(position_id)
max_tokens = session.get_max_sell_at_slippage(position_id, 500)  # 5% slippage
trend = session.get_liquidity_trend(position_id)  # "growing" | "stable" | "draining"

Partial sell

Build a sell transaction for a subset of a position's tokens using the PositionHandle from any StreamEvent:

response = await client.build_partial_sell_tx(handle, amount_tokens, 500, SellOutput.SOL)

Combine with slippage bands to sell the maximum amount within your desired price impact.

Exit ladder

Sell partial amounts at multiple profit thresholds:

from lasersell_sdk.stream.client import StrategyConfigBuilder

strategy = (
    StrategyConfigBuilder()
    .stop_loss_pct(10.0)
    .take_profit_levels([
        {"profit_pct": 25, "sell_pct": 30, "trailing_stop_pct": 0},
        {"profit_pct": 50, "sell_pct": 50, "trailing_stop_pct": 3},
        {"profit_pct": 100, "sell_pct": 100, "trailing_stop_pct": 5},
    ])
    .build()
)

Liquidity guard

Prevent exits into thin liquidity:

strategy = (
    StrategyConfigBuilder()
    .target_profit_pct(50.0)
    .stop_loss_pct(10.0)
    .liquidity_guard(True)
    .build()
)

Breakeven trail

A trailing stop that activates at breakeven:

strategy = (
    StrategyConfigBuilder()
    .target_profit_pct(50.0)
    .stop_loss_pct(10.0)
    .breakeven_trail_pct(2.0)
    .build()
)

Per-position strategy override

Override the global strategy for a single position:

session.sender().update_position_strategy(position_id, {
    "target_profit_pct": 200.0,
    "stop_loss_pct": 5.0,
    "trailing_stop_pct": 10.0,
})

Wallet registration

All wallets must be registered before connecting to the Exit Intelligence Stream:

from lasersell_sdk.exit_api import prove_ownership

proof = prove_ownership(keypair)
await client.register_wallet(proof, label="My Wallet")

# Or use connect_with_wallets (registers + connects in one step)
session = await stream_client.connect_with_wallets([proof], strategy, deadline_timeout_sec=120)

Watch wallets (copy trading)

Mirror trades from external wallets:

session.sender().update_watch_wallets([
    {"pubkey": "WalletToWatch..."},
])

Notes:

  • Use client.with_endpoint("wss://stream-dev.example/v1/ws") to target a custom stream endpoint.
  • unsigned_tx_b64 from stream events can be signed with lasersell_sdk.tx.sign_unsigned_tx.

RPC endpoint

The SDK ships with the Solana public RPC as a default so you can get started immediately:

from lasersell_sdk.tx import SendTargetRpc

target = SendTargetRpc()  # uses Solana public RPC

A private RPC is highly recommended for production — the public endpoint is rate-limited and unreliable under load. Free private RPC tiers are available from Helius and Chainstack, among others:

target = SendTargetRpc(url="https://your-private-rpc.example.com")

Examples

See examples/README.md for setup and script-by-script instructions.

Quick run commands (from lasersell-sdk/python):

python examples/build_buy.py
python examples/build_sell.py
python examples/build_and_send_sell.py
python examples/auto_sell.py

Scripts:

  • build_buy.py
  • build_sell.py
  • build_and_send_sell.py
  • auto_sell.py

Metadata

Release files for lasersell-sdk 1.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for lasersell-sdk 1.1.0
File Size Uploaded
lasersell_sdk-1.1.0.tar.gz 30.8 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for lasersell-sdk 1.1.0
File Interpreter ABI Platform
lasersell_sdk-1.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 61.1 kB

Release files / lasersell_sdk-1.1.0.tar.gz

Download URL lasersell_sdk-1.1.0.tar.gz
Size 30.8 kB
Tags Source
SHA-256 checksum
How to use checksums
55293efe8977825587d27f3da4bd957474db980e2c1c59f537bc77998041bee7
BLAKE2b-256 checksum
How to use checksums
229e70e08b2dacda237aabd420df5638c0c2543bfd24a49f1f3857249a76db56
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Mar 24, 2026.

Transparency log

Release files / lasersell_sdk-1.1.0-py3-none-any.whl

Download URL lasersell_sdk-1.1.0-py3-none-any.whl
Size 30.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
c782e3e1f03670868b00f45b776f17a7fefac7f7b9e807d3bc3f76a75e06a423
BLAKE2b-256 checksum
How to use checksums
da2f2fba9a2c9816aec851f9a0909180fcda9ba9dd4a532a75002b65d86b0d0a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Mar 24, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

1.1.0 This release

2 release files

1.0.4

2 release files

1.0.3

2 release files

1.0.2

2 release files

1.0.1

2 release files

1.0.0

2 release files

0.3.1

2 release files

0.3.0

2 release files

0.2.3

2 release files

0.2.2

2 release files

0.2.1

2 release files

0.2.0

2 release files

0.1.3

2 release files

0.1.1

2 release files

0.1.0

2 release files

0.0.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page