Python client for the ShamCash HTTP API (shamcash-api.com)
Project description
shamcash
Python client for the ShamCash HTTP API (accounts linked on shamcash-api.com).
Installation
pip install shamcash
Usage
Async
import asyncio
from shamcash import ShamCashAPI
async def main():
async with ShamCashAPI(api_token="your_token") as client:
accounts = await client.list_accounts()
acc_id = accounts[0].id
one = await client.get_account(acc_id)
balances = await client.get_balances(acc_id)
txs = await client.list_transactions(
acc_id,
start_at="2026-01-01",
end_at="2026-12-31",
coin_id=1,
limit=50,
)
single = await client.get_transaction(acc_id, 184627893)
asyncio.run(main())
Sync
from shamcash import ShamCashAPISync
with ShamCashAPISync(api_token="your_token") as client:
accounts = client.list_accounts()
balances = client.get_balances(accounts[0].id)
txs = client.list_transactions(accounts[0].id, limit=20)
Filters (GET /transactions)
Optional keyword arguments on list_transactions / list_transactions (sync):
| Parameter | Description |
|---|---|
start_at |
Inclusive lower bound (YYYY-MM-DD or datetime; Asia/Damascus if no offset) |
end_at |
Inclusive upper bound |
transaction_ids |
Comma-separated string, one int, or sequence of ids |
coin_id |
1 USD, 2 SYP, 3 EUR |
limit |
Max rows (server default 20; server may cap e.g. 200) |
Use get_transaction(account_id, transaction_id) to resolve a single incoming transfer by numeric id (uses the transaction_ids filter).
API
ShamCashAPI / ShamCashAPISync
| Method | Returns | Description |
|---|---|---|
list_accounts() |
List[Account] |
All linked accounts |
get_account(account_id) |
Account |
One account by id |
get_balances(account_id) |
BalancesResult |
Per-currency balances |
list_transactions(account_id, **filters) |
TransactionsResult |
Incoming transactions |
get_transaction(account_id, transaction_id) |
IncomingTransaction | None |
One transaction by id |
fetch_json_envelope(method, path, params=...) |
dict |
Full JSON object (status, code, message, data); no exception on status: "error" |
Models
- Money:
BalanceRow.available,BalanceRow.blocked, andIncomingTransaction.amountareDecimal(parsed via string to avoid float rounding). - Time:
Account.subscription_expires_atandIncomingTransaction.occurred_atare timezone-awaredatetimeobjects (ISO 8601 from the API). Raw strings are not kept on the models.
Error handling
- API business errors: envelope
code→ typed subclasses ofShamCashAPIError(e.g.AuthInvalidError,AccountNotFoundError,RateLimitExceededError). Each carrieshttp_statuswhen available; rate limits may setretry_after(seconds) from theRetry-Afterheader. - Transport problems →
NetworkError(e.g. connection failures). - Timeouts (total request time) →
RequestTimeoutError(code="TIMEOUT"). - Malformed JSON or shapes that do not match the documented schema →
ProtocolError(code="INVALID_PAYLOAD"). The high-level methods do not return empty lists/objects to mask server drift; they raise instead.
For debugging or custom handling, fetch_json_envelope(...) returns the parsed top-level object even when status is "error", and does not map codes to exceptions.
Rate limits
Per linked account: 6 requests per minute for GET /accounts/{id}, GET /balances, and GET /transactions (see API documentation).
Releasing (maintainers)
PyPI uploads are automated via GitHub Actions when you push a semver tag (v1.0.1, v2.0.0, …).
- Bump
versioninpyproject.tomland__version__inshamcash/__init__.py(they must match the tag, without the leadingv). - Commit and push to your default branch (e.g.
masterormain). - Create and push the tag:
git tag v1.0.1thengit push origin v1.0.1.
The workflow needs a repository secret PYPI_API_TOKEN (PyPI API token with upload scope). You can also run Actions → Publish to PyPI → Run workflow manually after configuring the secret.
License
MIT
Project details
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 shamcash-1.1.0.tar.gz.
File metadata
- Download URL: shamcash-1.1.0.tar.gz
- Upload date:
- Size: 12.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4e0a805fe91745cc542074b461e49abebcc1d56fb3fce01327e3fbcbc11c6bac
|
|
| MD5 |
8a79f6334e36c3d4366f3457249b2999
|
|
| BLAKE2b-256 |
190332d8223180380b4fe9707ceb3a964400084b577f31ce8014577683f81ec8
|
File details
Details for the file shamcash-1.1.0-py3-none-any.whl.
File metadata
- Download URL: shamcash-1.1.0-py3-none-any.whl
- Upload date:
- Size: 12.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6917de2a91075cb2860ec35439807303be675b3ee7f04efcd81f679e4f87ff06
|
|
| MD5 |
a98009ec956174987a0ef4e6e0a84a8a
|
|
| BLAKE2b-256 |
a14d715dd9fe0f9f5b9f180809938c57d932e4ef874e6f20d36a740bd8c9ea42
|