Skip to main content

Official Python SDK for the Cryptohopper API

Project description

cryptohopper

PyPI PyPI downloads Python versions CI License: MIT

Official Python SDK for the Cryptohopper API.

Status: 0.4.0a1 — full coverage of all 18 public API domains: user, hoppers, exchange, strategy, backtest, market, signals, arbitrage, marketmaker, template, ai, platform, chart, subscription, social, tournaments, webhooks, app.

Deeper docs: Getting Started · Authentication · Error Handling · Rate Limits

Install

pip install cryptohopper

Requires Python 3.10+.

Quickstart

import os
from cryptohopper import CryptohopperClient

with CryptohopperClient(api_key=os.environ["CRYPTOHOPPER_TOKEN"]) as ch:
    me = ch.user.get()
    print(me["email"])

    ticker = ch.exchange.ticker(exchange="binance", market="BTC/USDT")
    print(ticker["last"])

Authentication

Cryptohopper uses OAuth2 bearer tokens. To get one:

  1. Sign in at cryptohopper.com and open the developer dashboard.
  2. Create an OAuth application — you'll receive a client_id and client_secret.
  3. Drive the OAuth consent flow (/oauth-consent?app_id=<client_id>&redirect_uri=<your_uri>&state=<csrf>) to receive a 40-character bearer token scoped to the permissions you requested.

Pass the token as api_key. Optionally pass your OAuth client_id as app_key — it's sent as the x-api-app-key header.

ch = CryptohopperClient(
    api_key=os.environ["CRYPTOHOPPER_TOKEN"],
    app_key=os.environ.get("CRYPTOHOPPER_CLIENT_ID"),  # optional
)

Resources

# User
ch.user.get()

# Hoppers
ch.hoppers.list(exchange="binance")
ch.hoppers.get(42)
ch.hoppers.create({"name": "My Bot", "exchange": "binance"})
ch.hoppers.update(42, {"name": "Renamed"})
ch.hoppers.delete(42)
ch.hoppers.positions(42)
ch.hoppers.orders(42)
ch.hoppers.buy({"hopper_id": 42, "market": "BTC/USDT", "amount": 0.001})
ch.hoppers.sell({"hopper_id": 42, "market": "BTC/USDT", "amount": 0.001})
ch.hoppers.config_get(42)
ch.hoppers.config_update(42, {"strategy_id": 99})
ch.hoppers.panic(42)

# Exchange — market data (still requires a real token; the gateway has no anonymous routes)
ch.exchange.ticker(exchange="binance", market="BTC/USDT")
ch.exchange.candles(exchange="binance", market="BTC/USDT", timeframe="1h")
ch.exchange.orderbook(exchange="binance", market="BTC/USDT")
ch.exchange.markets("binance")
ch.exchange.exchanges()

# Strategy
ch.strategy.list()
ch.strategy.get(5)
ch.strategy.create({"name": "My Strategy"})
ch.strategy.update(5, {"name": "Renamed"})
ch.strategy.delete(5)

# Backtest
ch.backtest.create({"hopper_id": 42, "from_date": "2026-01-01", "to_date": "2026-03-01"})
ch.backtest.get(1)
ch.backtest.list()
ch.backtest.cancel(1)
ch.backtest.limits()

# Marketplace — same auth requirement as everything else
ch.market.signals(type="buy")
ch.market.signal(99)
ch.market.items(type="strategy")
ch.market.homepage()

Client options

Option Default Description
api_key — (required) OAuth2 bearer token
app_key Optional OAuth client_id, sent as x-api-app-key
base_url https://api.cryptohopper.com/v1 Override for staging/dev
timeout 30.0 Per-request timeout in seconds
max_retries 3 Retries on HTTP 429 (respects Retry-After). Set to 0 to disable.
user_agent Appended after cryptohopper-sdk-python/<version>
http_client Inject a custom httpx.Client

Errors

Every non-2xx response becomes a CryptohopperError:

from cryptohopper import CryptohopperClient, CryptohopperError

try:
    ch.user.get()
except CryptohopperError as err:
    print(err.code)            # "UNAUTHORIZED" | "FORBIDDEN" | "RATE_LIMITED" | ...
    print(err.status)          # HTTP status
    print(err.server_code)     # Numeric unique error code from the server, if any
    print(err.ip_address)      # Client IP the server saw (IP-whitelist debug help)
    print(err.retry_after_ms)  # Milliseconds to wait on 429 (if server sent Retry-After)

Unknown server-side codes pass through as-is on .code.

Rate limiting

The server enforces three buckets (normal 30/min, order 8/8s, backtest 1/2s). On HTTP 429 the SDK retries with exponential backoff up to max_retries (default 3), respecting Retry-After. Pass max_retries=0 to disable auto-retry.

Development

pip install -e ".[dev]"
ruff check .
mypy src
pytest -q

Release

Push a py-v<version> git tag. The release workflow runs ruff + mypy + pytest, verifies tag-version parity, builds sdist + wheel, and publishes via PyPI Trusted Publishing (OIDC) — no long-lived API token needed. Configure the publisher at pypi.org/manage/account/publishing before the first release.

License

MIT — see LICENSE.

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

cryptohopper-0.4.0a2.tar.gz (19.7 kB view details)

Uploaded Source

Built Distribution

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

cryptohopper-0.4.0a2-py3-none-any.whl (25.0 kB view details)

Uploaded Python 3

File details

Details for the file cryptohopper-0.4.0a2.tar.gz.

File metadata

  • Download URL: cryptohopper-0.4.0a2.tar.gz
  • Upload date:
  • Size: 19.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for cryptohopper-0.4.0a2.tar.gz
Algorithm Hash digest
SHA256 6b3237e60f3874e5ad4ad49f93d9e9f0448ddded1d17ff9b8e9577fb9d7347ca
MD5 85fe2f81f61726f1252f23189e951195
BLAKE2b-256 d542d420185c7d4c2bf4f08ba223dd088804f293f5fbf278972eaeb9ac103ec0

See more details on using hashes here.

Provenance

The following attestation bundles were made for cryptohopper-0.4.0a2.tar.gz:

Publisher: release.yml on cryptohopper/cryptohopper-python-sdk

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file cryptohopper-0.4.0a2-py3-none-any.whl.

File metadata

  • Download URL: cryptohopper-0.4.0a2-py3-none-any.whl
  • Upload date:
  • Size: 25.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for cryptohopper-0.4.0a2-py3-none-any.whl
Algorithm Hash digest
SHA256 8239ab35808ff215e409267842f59e58b5a9204b242b0d9c02c40524905b9abe
MD5 892f1e9ff77ad4279381602b3646289b
BLAKE2b-256 35ec5fa92bd44dcf11634b42150b4e4c946bdbdd5a68f15964fc70d213df63d5

See more details on using hashes here.

Provenance

The following attestation bundles were made for cryptohopper-0.4.0a2-py3-none-any.whl:

Publisher: release.yml on cryptohopper/cryptohopper-python-sdk

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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