Skip to main content

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, and IncomingTransaction.amount are Decimal (parsed via string to avoid float rounding).
  • Time: Account.subscription_expires_at and IncomingTransaction.occurred_at are timezone-aware datetime objects (ISO 8601 from the API). Raw strings are not kept on the models.

Error handling

  • API business errors: envelope code → typed subclasses of ShamCashAPIError (e.g. AuthInvalidError, AccountNotFoundError, RateLimitExceededError). Each carries http_status when available; rate limits may set retry_after (seconds) from the Retry-After header.
  • Transport problems → NetworkError (e.g. connection failures).
  • Timeouts (total request time) → RequestTimeoutError (code="TIMEOUT").
  • Malformed JSON or shapes that do not match the documented schemaProtocolError (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, …).

  1. Bump version in pyproject.toml and __version__ in shamcash/__init__.py (they must match the tag, without the leading v).
  2. Commit and push to your default branch (e.g. master or main).
  3. Create and push the tag: git tag v1.0.1 then git 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

shamcash-1.1.1.tar.gz (12.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

shamcash-1.1.1-py3-none-any.whl (12.7 kB view details)

Uploaded Python 3

File details

Details for the file shamcash-1.1.1.tar.gz.

File metadata

  • Download URL: shamcash-1.1.1.tar.gz
  • Upload date:
  • Size: 12.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for shamcash-1.1.1.tar.gz
Algorithm Hash digest
SHA256 24c19293bd890f9f76b16fed473c6140199f1065f42632686c533f0ed05bee66
MD5 66989ee11b84660ad8b3ca48bd249446
BLAKE2b-256 ce0b060d5976d4c15b1f4c224e90a8e4cf20def6f6f3f6f708c39619bbc8aa67

See more details on using hashes here.

File details

Details for the file shamcash-1.1.1-py3-none-any.whl.

File metadata

  • Download URL: shamcash-1.1.1-py3-none-any.whl
  • Upload date:
  • Size: 12.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for shamcash-1.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 9e5b0be264700bc3c77d189330cda4fcca473d6965914d7674ee202ee1287abd
MD5 3037cb386be4bc6644342687523ce805
BLAKE2b-256 aefc3f807d133487ef1e7fc9b567882d8ffaa7b0ed0dcc6bdf50d0a5b3a99b2d

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page