Skip to main content

KaleidoSwap SDK Python Bindings

Python bindings for the KaleidoSwap SDK: atomic swaps (Boltz protocol) between Bitcoin, Lightning, and Liquid.

Installation

python -m pip install kaleidorg_swap_sdk

Python 3.10+ is supported. Prebuilt wheels cover Linux x86_64/aarch64, macOS x86_64/arm64, and Windows x86_64; other platforms build the published source distribution and need a Rust 1.88+ toolchain.

Quick Start

⚠️ WARNING: All examples are only to be used in REGTEST.

import kaleidorg_swap_sdk
import asyncio

async def main():
    # Initialize for regtest (do NOT use this example in production)
    network = kaleidorg_swap_sdk.Network.REGTEST
    boltz_api = kaleidorg_swap_sdk.SwapClient.default(network)

    # Example: Create a submarine swap (Lightning → Bitcoin)
    key_pair = kaleidorg_swap_sdk.KeyPair()
    btc_chain = kaleidorg_swap_sdk.btc_chain_from_network(network)

    invoice = "lightning-invoice-to-pay"

    request = kaleidorg_swap_sdk.CreateSubmarineRequest(
        _from=btc_chain,
        to=btc_chain,
        invoice=invoice,
        refund_public_key=key_pair.public(),
    )

    swap = await boltz_api.create_swap(request)
    print(f"Send {swap.expected_amount} sats to {swap.address}")

asyncio.run(main())

Partner attribution (organization API keys)

A partner organization can have the swaps it originates attributed to it. That needs an organization API key from the KaleidoSwap partner panel — a kld_test_… key for signet and staging, kld_live_… for mainnet and production. Without one, SwapClient behaves exactly as before and creates unattributed swaps.

import os
import kaleidorg_swap_sdk

client = kaleidorg_swap_sdk.SwapClient.kaleido_maker(
    "https://maker.signet.kaleidoswap.com/v2",
    os.environ["KALEIDOSWAP_API_KEY"],
    None,  # timeout in seconds
)

client.api_key_environment()  # "test"
client.api_key_id()           # the key id the partner panel shows

Scrub the key in error reporters that capture locals. It crosses the binding as a plain str, so it is a function argument on a stack frame for the length of the call. The SDK keeps it out of its own errors, logs and repr, but anything that renders frame locals — pytest --showlocals, Sentry's with_locals, some logging formatters — reads it off the frame regardless. Scrub it in your reporter's before-send hook.

The result is an ordinary client — every swap route works the same way — that sends the key as Authorization: Bearer … to that maker URL, and only to that maker URL. The key answers which partner organization created this swap? and nothing else: it authorizes no claim, no refund, no fund movement and no panel access. The per-swap swap_auth credential the maker returns on create stays separate and unchanged.

The URL must be https unless it is a loopback address, since a bearer credential over plain HTTP is readable by anything on the path. A value that cannot be a key is rejected here rather than reaching the maker as a 401 — which is the same answer a revoked key gets. There is no accessor for the secret half: api_key_id() and api_key_environment() are all the client will tell you, and UniFFI renders no string form of the object at all.

Keep the key in server-side configuration. It is permanent until revoked, so never ship it inside a mobile or desktop application, where every user holds it.

Swap Types

  • Submarine swaps - Lightning → On-chain Bitcoin/Liquid
  • Reverse swaps - On-chain Bitcoin/Liquid → Lightning
  • Chain swaps - Bitcoin ↔ Liquid atomic swaps

Examples

Complete working examples are available in the examples/ directory:

USDT-RGB swaps

Set rgb_contract_id on CreateSubmarineRequest or CreateReverseRequest and select Currency.USDT_RGB for the on-chain side. The pin is required before the POST and checked against the returned contract. It stays local; the maker wire request is unchanged. RGB chain swaps are unsupported. Other currencies retain the existing create defaults.

The caller's rgb-lib wallet funds submarine locks and validates reverse lock consignments. The SDK validates the HTLC, builds the claim/refund PSBT and signs its script path. RGB proof validation and wallet state remain in rgb-lib.

SwapScript.prepare_rgb_claim / prepare_rgb_refund take RgbPsbtParams: output_address, funding, max_fee (sats), swap_id, chain_client, boltz_api, and optional lockup_tx. Parse a lock transaction with BtcLikeTransaction.from_hex_bitcoin(hex). Use the original lock transaction for refunds. The payout address must come from an RGB wallet witness receive.

  • RgbSpendFunding.HTLC_VALUE(fee_rate_sat_vb=rate) uses the HTLC's sats. Reverse locks are sized for the advertised rgb.claim_fee_rate.
  • RgbSpendFunding.CALLER_INPUTS() requires BTC funding. Add wallet inputs/change without coloring or signing, then retain spend.fund(funded_psbt). Its template() returns the frozen PSBT and current HTLC input index.

Color that PSBT with rgb-lib's psbt_op_prepare_with_expiry, assigning the full RGB amount to the template's payment output. Return the actual RGB allocations in ColoredRgbPsbt to finalize_claim(colored, keys, preimage) or finalize_refund(colored, keys). FinalizedRgbSpend contains psbt, swap_input_index and optional transaction. Sign/finalize remaining wallet inputs while preserving the SDK's HTLC witness. Error.RgbFeeInputRequired means the HTLC cannot pay the fee while keeping the minimum payout; prepare with caller inputs instead.

Keep the rgb-lib operation ID and complete psbt_op_mark_broadcast, broadcast, psbt_op_apply and psbt_op_provide_receive_consignment. Enforce reverse lock confirmations using the chain and rgb-lib: there is no reverse transaction.confirmed event. Refunds wait for the timeout; claims must confirm before it. Asset amounts use contract units; htlc_sat and fees use sats.

Submarine BTC collateral is capped at 1000 sats by default, independently of maxFee/max_fee. The maker receives all of it on a successful claim. Choose any larger cap locally before reading the response: set rgb_max_htlc_sat on CreateSubmarineRequest. The cap is never sent to the maker. RGB spend preparation requires the actual colored lock transaction; address discovery can select unrelated BTC outputs. Before paying a reverse invoice, compare its claimFeeRate with your current fee estimates and remaining timeout; reject an inadequate quote. If fees rise, use a higher spend rate and wallet BTC inputs when needed. A maker fee quote does not guarantee confirmation before the timeout. Contract-id chunk dashes are cosmetic; pin a valid id from your trusted wallet or asset registry.

The adapter example demonstrates both spend directions. It requires an application-provided RGB wallet adapter. Actual RGB wallet validation is recorded in the native regtest example.

Metadata

Release files for kaleidorg-swap-sdk 0.11.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 kaleidorg-swap-sdk 0.11.0
File Size Uploaded Provenance Actions
kaleidorg_swap_sdk-0.11.0.tar.gz 334.1 kB Without provenance Details for kaleidorg_swap_sdk-0.11.0.tar.gz

Built distributions (wheels)

Table of built distributions (wheels) for kaleidorg-swap-sdk 0.11.0
File Actions
kaleidorg_swap_sdk-0.11.0-py3-none-win_amd64.whl Python 3 none Windows x86-64 Details for kaleidorg_swap_sdk-0.11.0-py3-none-win_amd64.whl
kaleidorg_swap_sdk-0.11.0-py3-none-manylinux_2_28_x86_64.whl Python 3 none Linux glibc 2.28+ x86-64 Details for kaleidorg_swap_sdk-0.11.0-py3-none-manylinux_2_28_x86_64.whl
kaleidorg_swap_sdk-0.11.0-py3-none-manylinux_2_28_aarch64.whl Python 3 none Linux glibc 2.28+ ARM64 Details for kaleidorg_swap_sdk-0.11.0-py3-none-manylinux_2_28_aarch64.whl
kaleidorg_swap_sdk-0.11.0-py3-none-macosx_11_0_arm64.whl Python 3 none macOS 11.0+ ARM64 Details for kaleidorg_swap_sdk-0.11.0-py3-none-macosx_11_0_arm64.whl
kaleidorg_swap_sdk-0.11.0-py3-none-macosx_10_12_x86_64.whl Python 3 none macOS 10.12+ x86-64 Details for kaleidorg_swap_sdk-0.11.0-py3-none-macosx_10_12_x86_64.whl

Total release size: 27.8 MB

Release files / kaleidorg_swap_sdk-0.11.0.tar.gz

Download URL kaleidorg_swap_sdk-0.11.0.tar.gz
Size 334.1 kB
Tags Source
SHA-256 checksum
How to use checksums
c42fc25636109d2c79b94f2499c83dcbefe24c14fc2319d6f05d0bf85a41a29a
BLAKE2b-256 checksum
How to use checksums
0ecfa2121303cb4efc372d8461053d37da485ab9aa94c7be4e70ed00c30313e6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.13.14

Release files / kaleidorg_swap_sdk-0.11.0-py3-none-win_amd64.whl

Download URL kaleidorg_swap_sdk-0.11.0-py3-none-win_amd64.whl
Size 5.4 MB
Tags Python 3 Windows x86-64
SHA-256 checksum
How to use checksums
e88ef7225a977ffaca0c32db6adcc2b4e44f044e64337ac3c87af5c30308f6d7
BLAKE2b-256 checksum
How to use checksums
170ba0c4ce53bac9f0aa6d6c0417eac131cf2ff64d4ba8d6e06c89437ee130f8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.13.14

Release files / kaleidorg_swap_sdk-0.11.0-py3-none-manylinux_2_28_x86_64.whl

Download URL kaleidorg_swap_sdk-0.11.0-py3-none-manylinux_2_28_x86_64.whl
Size 5.6 MB
Tags Linux glibc 2.28+ x86-64 Python 3
SHA-256 checksum
How to use checksums
aaf3e41d1bff3263fbc2947427fe00bbec66173e305862e00c3dda74ed57754e
BLAKE2b-256 checksum
How to use checksums
958d4d3ad8926449c03c059c3545164e63659afaee4ace99b7c1175a03d539c9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.13.14

Release files / kaleidorg_swap_sdk-0.11.0-py3-none-manylinux_2_28_aarch64.whl

Download URL kaleidorg_swap_sdk-0.11.0-py3-none-manylinux_2_28_aarch64.whl
Size 5.6 MB
Tags Linux glibc 2.28+ ARM64 Python 3
SHA-256 checksum
How to use checksums
4381e9987327b398c7f12f273ca1fc0c5a8b12b9364c6196352ea05fc3f02921
BLAKE2b-256 checksum
How to use checksums
9548d4504da2d070ade83c7371a3ef5e68cfe7dfbfcbc496a46d40c11ce85c41
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.13.14

Release files / kaleidorg_swap_sdk-0.11.0-py3-none-macosx_11_0_arm64.whl

Download URL kaleidorg_swap_sdk-0.11.0-py3-none-macosx_11_0_arm64.whl
Size 5.4 MB
Tags Python 3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
a0ae464f5cd57abb8d50571d5af635550363c0c89d35f3ed76b47a033a3e7978
BLAKE2b-256 checksum
How to use checksums
1e6d946439fa9d02b7a98c45988bcfaf9d42d99192679d5cd216c71449523159
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.13.14

Release files / kaleidorg_swap_sdk-0.11.0-py3-none-macosx_10_12_x86_64.whl

Download URL kaleidorg_swap_sdk-0.11.0-py3-none-macosx_10_12_x86_64.whl
Size 5.5 MB
Tags Python 3 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
245ef1911966b84f70b11ad063066c253b520b93a4cb3ceb7afbb5a8a4c5bbeb
BLAKE2b-256 checksum
How to use checksums
66a35a983e00753140c0e26d4689840908b292f463f1d723a413d0e61d9a4563
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.13.14

Security for kaleidorg-swap-sdk 0.11.0

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.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

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