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.BoltzApiClientV2.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, BoltzApiClientV2 behaves exactly as before and
creates unattributed swaps.
import os
import kaleidorg_swap_sdk
client = kaleidorg_swap_sdk.BoltzApiClientV2.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 andrepr, but anything that renders frame locals —pytest --showlocals, Sentry'swith_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:
reverse.py- Lightning to Bitcoinsubmarine.py- Bitcoin to Lightningchain.py- Bitcoin to Liquid (and vice versa)
Release files for kaleidorg-swap-sdk 0.5.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| kaleidorg_swap_sdk-0.5.0.tar.gz | 234.0 kB | Details |
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| kaleidorg_swap_sdk-0.5.0-py3-none-win_amd64.whl | Python 3 | none | Windows x86-64 | Details |
| kaleidorg_swap_sdk-0.5.0-py3-none-manylinux_2_28_x86_64.whl | Python 3 | none | Linux glibc 2.28+ x86-64 | Details |
| kaleidorg_swap_sdk-0.5.0-py3-none-manylinux_2_28_aarch64.whl | Python 3 | none | Linux glibc 2.28+ ARM64 | Details |
| kaleidorg_swap_sdk-0.5.0-py3-none-macosx_11_0_arm64.whl | Python 3 | none | macOS 11.0+ ARM64 | Details |
| kaleidorg_swap_sdk-0.5.0-py3-none-macosx_10_12_x86_64.whl | Python 3 | none | macOS 10.12+ x86-64 | Details |
Total release size: 26.2 MB
Release files / kaleidorg_swap_sdk-0.5.0.tar.gz
| Download URL | kaleidorg_swap_sdk-0.5.0.tar.gz |
|---|---|
| Size | 234.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
6001a43c4be6036af8e992487b816ff5607de87ec51c824de86c73cb3141507a
|
|
BLAKE2b-256 checksum How to use checksums |
83f3a3a2193d2f4012066c76963408a0e9b2389cbf78f1c57295ea99026b173d
|
| 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.5.0-py3-none-win_amd64.whl
| Download URL | kaleidorg_swap_sdk-0.5.0-py3-none-win_amd64.whl |
|---|---|
| Size | 5.1 MB |
| Tags | Python 3 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
fed7c0b0541f81d534f6a3d9a90826fe64e761f567e10a33bc4459c8b2cb955f
|
|
BLAKE2b-256 checksum How to use checksums |
e3ab07e571d7350aac2ba250b6f1cd53db6e56ff8f0d7cbf3f6e7624a74a3e6a
|
| 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.5.0-py3-none-manylinux_2_28_x86_64.whl
| Download URL | kaleidorg_swap_sdk-0.5.0-py3-none-manylinux_2_28_x86_64.whl |
|---|---|
| Size | 5.3 MB |
| Tags | Linux glibc 2.28+ x86-64 Python 3 |
|
SHA-256 checksum How to use checksums |
c3413a6a7170db84f8118b0e91f7b30a31ebf7ae97a12333d1356f1d540f319d
|
|
BLAKE2b-256 checksum How to use checksums |
9e54c83a2e9986e10ea3f819ac7ee22d672a33c9f119ab8b6551b2b3e388cbc9
|
| 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.5.0-py3-none-manylinux_2_28_aarch64.whl
| Download URL | kaleidorg_swap_sdk-0.5.0-py3-none-manylinux_2_28_aarch64.whl |
|---|---|
| Size | 5.3 MB |
| Tags | Linux glibc 2.28+ ARM64 Python 3 |
|
SHA-256 checksum How to use checksums |
61fea9516e4ca92b2bf8d94b0d5af7d63f6af914e022ad883f7e53d3635f8a4c
|
|
BLAKE2b-256 checksum How to use checksums |
f6100a8f42dd540337b4c99ee29f16f71b7c8f01f1e84a71f55a2bc8234cc588
|
| 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.5.0-py3-none-macosx_11_0_arm64.whl
| Download URL | kaleidorg_swap_sdk-0.5.0-py3-none-macosx_11_0_arm64.whl |
|---|---|
| Size | 5.1 MB |
| Tags | Python 3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
7fa2623348ff82028ca3cc59dd19263d032fcc48995be8b647ed0602f48a5075
|
|
BLAKE2b-256 checksum How to use checksums |
01aaef7c0f85259eac76704e66a9df225c8417e029360445c8b78c767c6d52ef
|
| 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.5.0-py3-none-macosx_10_12_x86_64.whl
| Download URL | kaleidorg_swap_sdk-0.5.0-py3-none-macosx_10_12_x86_64.whl |
|---|---|
| Size | 5.2 MB |
| Tags | Python 3 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
f8ee14c2a3d676457d85a521a3e600619c1f7427a65adcef1633a261094aea11
|
|
BLAKE2b-256 checksum How to use checksums |
34181fd027faef6d0a8be58f71973aaa361ad66e7f9e4ba8828d7275ffd9358b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.14
|