Non official, but friendly CryptoBot library for the Python language
Project description
CryptoBot Python
Unofficial but friendly Python client for the Crypto Bot API (v1.0 - stable). It provides typed models, sane defaults, and synchronous/async clients for invoices, transfers, checks, balances, exchange rates, statistics, and webhook handling.
Features
- Synchronous
httpx-based API client (CryptoBotClient) - Async
httpx-based API client (AsyncCryptoBotClient) - Dataclass models for API responses (
Invoice,Transfer,Check,Balance,ExchangeRate,Currency,AppStats) - Enum guard rails for assets, statuses, check statuses, and paid button names
- Mainnet/testnet support with configurable timeouts and retries
- Pagination iterators for invoices, transfers, and checks
- FastAPI-powered webhook listener with signature verification and optional replay protection
- Custom exception model (
CryptoBotError) with API code/name fields
Installation
CryptoBot Python supports Python >=3.10.
pip install cryptobot-python
Install webhook server dependencies only when needed:
pip install "cryptobot-python[webhook]"
Install documentation tooling extras only when needed:
pip install "cryptobot-python[docs]"
Quick Start
import os
from cryptobot import CryptoBotClient
from cryptobot.models import Asset
client = CryptoBotClient(
api_token=os.environ["CRYPTOBOT_API_TOKEN"],
is_mainnet=True,
timeout=5.0,
max_retries=2,
retry_backoff=0.5,
)
app = client.get_me()
print(app.name)
invoice = client.create_invoice(
asset=Asset.USDT,
amount=5.25,
description="Coffee order #42",
)
print(invoice.invoice_id, invoice.bot_invoice_url)
To use testnet instead of mainnet:
client = CryptoBotClient(api_token=os.environ["CRYPTOBOT_TESTNET_TOKEN"], is_mainnet=False)
Retry behavior is optional and disabled by default (max_retries=0). The default retryable status codes are
429, 500, 502, 503, 504.
client = CryptoBotClient(
api_token=os.environ["CRYPTOBOT_API_TOKEN"],
max_retries=3,
retry_backoff=0.5,
retryable_status_codes={429, 500, 502, 503, 504},
)
Async usage:
import asyncio
import os
from cryptobot import AsyncCryptoBotClient
from cryptobot.models import Asset
async def main():
async with AsyncCryptoBotClient(api_token=os.environ["CRYPTOBOT_API_TOKEN"], max_retries=2) as client:
app = await client.get_me()
print(app.name)
invoice = await client.create_invoice(asset=Asset.USDT, amount=5.25, description="Async order #42")
print(invoice.invoice_id, invoice.bot_invoice_url)
asyncio.run(main())
Core API
CryptoBotClient methods:
| Category | Methods |
|---|---|
| App | get_me() |
| Invoices | create_invoice(...), get_invoices(...), delete_invoice(...) |
| Transfers | transfer(...), get_transfers(...) |
| Checks | create_check(...), get_checks(...), delete_check(...) |
| Balance & Rates | get_balances(), get_exchange_rates(), get_currencies() |
| Statistics | get_stats(...) |
| Pagination | iter_invoice_pages(...), iter_invoices(...), iter_transfer_pages(...), iter_transfers(...), iter_check_pages(...), iter_checks(...) |
AsyncCryptoBotClient provides the same methods with await, plus async iterators for
all pagination helpers.
List methods like get_invoices(...), get_transfers(...), and get_checks(...) accept IDs as a
comma-separated string ("1,2,3") or list[int] ([1, 2, 3]).
Iterator helpers accept page_size and start_offset to support controlled pagination scans.
Transfer with idempotency
from cryptobot.errors import CryptoBotError
from cryptobot.models import Asset
try:
transfer = client.transfer(
user_id=123456789,
asset=Asset.TON,
amount=0.5,
spend_id="reward_2026_02_10_user_123456789",
comment="Cashback reward",
)
print(transfer.transfer_id, transfer.status)
except CryptoBotError as exc:
print(exc.code, exc.name)
Crypto checks
Create a check that any user (or a specific user) can activate:
from cryptobot.models import Asset
check = client.create_check(asset=Asset.USDT, amount=1.0)
print(check.check_id, check.bot_check_url)
# Pin a check to a specific user
check = client.create_check(asset=Asset.TON, amount=0.25, pin_to_user_id=123456789)
# List and delete checks
checks = client.get_checks(asset=Asset.USDT, status="active")
client.delete_check(check_id=checks[0].check_id)
App statistics
stats = client.get_stats(
start_at="2026-01-01T00:00:00Z",
end_at="2026-03-01T00:00:00Z",
)
print(stats.volume, stats.unique_users_count, stats.paid_invoice_count)
Webhooks
Use the built-in listener to validate incoming signatures and process updates:
import os
from cryptobot.webhook import InMemoryReplayKeyStore, Listener
def handle_webhook(headers, data):
if data.get("update_type") == "invoice_paid":
payload = data.get("payload", {})
print("Paid invoice:", payload.get("invoice_id"))
listener = Listener(
host="0.0.0.0",
callback=handle_webhook,
api_token=os.environ["CRYPTOBOT_API_TOKEN"],
replay_store=InMemoryReplayKeyStore(),
replay_ttl_seconds=3600,
port=2203,
url="/webhook",
log_level="info",
)
listener.listen()
Listener accepts both sync and async callback functions.
For custom dedupe behavior, pass replay_key_resolver(data, raw_body, headers) with a stable key strategy.
For custom webhook stacks, use cryptobot.webhook.check_signature(...) to verify
crypto-pay-api-signature against the raw request body.
Development
uv sync
make lint
make test
make docs
Documentation
- Docs: https://cryptobot-python.readthedocs.io/
- API reference: https://cryptobot-python.readthedocs.io/en/latest/modules.html
- Webhook security guide: https://cryptobot-python.readthedocs.io/en/latest/webhook_security.html
- Crypto Pay API: https://help.send.tg/en/articles/10279948-crypto-pay-api
Contributing
Issues and pull requests are welcome. Before opening a PR:
make lint
make test
See CONTRIBUTING.md and AGENTS.md for project workflow and coding standards.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file cryptobot_python-1.0.0.tar.gz.
File metadata
- Download URL: cryptobot_python-1.0.0.tar.gz
- Upload date:
- Size: 184.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e05585990b96f3a17d7d243d2486d089d068e8a2a82683e3065e3d9e87eaf516
|
|
| MD5 |
24a222ea206ca52e961e023af0783e14
|
|
| BLAKE2b-256 |
0af7baaf59cb0d7f3526a485396389ba6caae8cf4e766f0462da522f167f914f
|
Provenance
The following attestation bundles were made for cryptobot_python-1.0.0.tar.gz:
Publisher:
python-publish.yml on ragnarok22/cryptobot_python
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
cryptobot_python-1.0.0.tar.gz -
Subject digest:
e05585990b96f3a17d7d243d2486d089d068e8a2a82683e3065e3d9e87eaf516 - Sigstore transparency entry: 1124134370
- Sigstore integration time:
-
Permalink:
ragnarok22/cryptobot_python@6b6f0f70792b644cce2091d616c8a80a111fe242 -
Branch / Tag:
refs/tags/v1.0.0 - Owner: https://github.com/ragnarok22
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
python-publish.yml@6b6f0f70792b644cce2091d616c8a80a111fe242 -
Trigger Event:
push
-
Statement type:
File details
Details for the file cryptobot_python-1.0.0-py3-none-any.whl.
File metadata
- Download URL: cryptobot_python-1.0.0-py3-none-any.whl
- Upload date:
- Size: 22.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d855e82f27c76975ef31c2cbd6660ac54a2bc9f2755b3073bb33e48e9da31e98
|
|
| MD5 |
a5315d0f18d07c951965e2389b5804fb
|
|
| BLAKE2b-256 |
bd8987d4e4243a8cab6f2bf79389a45586f7082e0ac5b147abee6e9bfbecdc5e
|
Provenance
The following attestation bundles were made for cryptobot_python-1.0.0-py3-none-any.whl:
Publisher:
python-publish.yml on ragnarok22/cryptobot_python
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
cryptobot_python-1.0.0-py3-none-any.whl -
Subject digest:
d855e82f27c76975ef31c2cbd6660ac54a2bc9f2755b3073bb33e48e9da31e98 - Sigstore transparency entry: 1124134371
- Sigstore integration time:
-
Permalink:
ragnarok22/cryptobot_python@6b6f0f70792b644cce2091d616c8a80a111fe242 -
Branch / Tag:
refs/tags/v1.0.0 - Owner: https://github.com/ragnarok22
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
python-publish.yml@6b6f0f70792b644cce2091d616c8a80a111fe242 -
Trigger Event:
push
-
Statement type: