Python client for the OrcaLayer API — Polymarket whale and market analytics
Project description
orcalayer
Official Python client for the OrcaLayer API — Polymarket whale and market analytics: wallet P&L, open positions, smart-whale leaderboard, market search and real-time whale alerts.
Install
pip install orcalayer
Requires Python 3.10+. Single dependency: httpx.
Quickstart
Three lines to a first result — no API key needed for public endpoints:
from orcalayer import OrcaLayer
ol = OrcaLayer()
print(ol.leaderboard(limit=5))
Anonymous access is limited to 200 requests/min per IP, and wallet endpoints (wallet_overview, wallet_positions) additionally to 300 requests/day per IP. With a Premium API key (get one here) you get 600 req/min, no daily cap, and access to Premium endpoints such as whale alerts:
ol = OrcaLayer(api_key="sk_orca_...")
alerts = ol.whale_alerts(minutes=30, min_usd=1000)
Methods
| Method | Endpoint | Access |
|---|---|---|
leaderboard(sort, category, limit, ...) |
Smart-whale leaderboard with server-side filters | Public |
wallet_overview(address) |
Wallet profile + trading stats (accepts 0x address or nickname) | Public |
wallet_positions(address) |
Open positions — full set in one response (the API ignores limit/offset and ordering; sort client-side) |
Public |
markets(q, category, min_volume, ...) |
Market search (accepts free text or a Polymarket URL) | Public |
whale_alerts(minutes, min_usd, ...) |
Recent smart-whale trades feed | Premium |
All methods return the JSON response as a plain dict, exactly as the API sends it. Full field reference: orcalayer.com/docs.
Examples
Runnable scripts in examples/ — each is self-contained and runs against the live API:
| Script | What it does | Key |
|---|---|---|
| find_top_whales.py | Top smart-money whales in a category, via the leaderboard | No |
| track_wallet.py | A wallet's profile, stats and open positions | No |
| find_consensus_markets.py | Markets where smart whales are clustering, with filters | No |
| whale_alerts_feed.py | Recent smart-whale trades feed (shows the Premium path) | Yes |
Behavior notes
- Rate limits: on HTTP 429 the client reads
Retry-Afterand retries with exponential backoff (default 3 attempts). Disable withOrcaLayer(retry_on_rate_limit=False). ARetry-Afterbeyond 5 minutes signals the anonymous daily cap rather than a burst — the client then raisesRateLimitErrorimmediately instead of retrying. - Transient 502 responses are retried once automatically.
- Premium endpoints without a key raise
PremiumRequiredErrorwith a link to pricing — no network call is made. - A rejected key on a public endpoint (HTTP 401/403) does not fail the call: the client retries once anonymously against the public surface (lower rate limits) and logs a one-time warning. Premium-only endpoints (
whale_alerts) still raiseAuthenticationError. So a bad, expired or non-Premium key never breaks a call that works without one. - Overall retry budget:
OrcaLayer(max_total_seconds=N)caps the total time spent sleeping across a single call's retries — a back-off that would exceed the budget raises the pending typed error instead of blocking. Unset (the default) means no cap, so a worst-case 202 + 429 + 502 chain can sleep for minutes; set it when you need a bounded call. - Wallet overview freshness: responses include
as_of(data timestamp) anddegraded(heavy side-stats timed out, core stats still present). - Cold heavy wallets answer HTTP 202 while their stats are computed server-side. The client retries once automatically after the server's
Retry-Afterinterval; if the wallet is still not ready it raisesWalletComputingError(carryingretry_after) so a 202 body is never mistaken for wallet data.
Errors
All exceptions inherit from orcalayer.OrcaLayerError, so one except catches everything:
from orcalayer import OrcaLayer, OrcaLayerError, RateLimitError
ol = OrcaLayer()
try:
data = ol.wallet_overview("0x...")
except RateLimitError as e:
print(f"rate limited, retry in {e.retry_after:.0f}s")
except OrcaLayerError as e:
print(f"request failed: {e}")
| Exception | Raised on |
|---|---|
PremiumRequiredError |
Premium endpoint called without a key (no network call made) |
AuthenticationError |
Key rejected (HTTP 401/403) on a Premium-only endpoint — on public endpoints a rejected key falls back to anonymous access instead of raising |
RateLimitError |
HTTP 429 after retries, or immediately for the daily cap; carries retry_after |
WalletComputingError |
Heavy wallet still computing (HTTP 202 twice); carries retry_after |
APIError |
Unhandled 4xx (404/400/422) or a non-JSON body; carries status_code and body |
ServerError |
Unexpected 5xx |
The package ships type hints (py.typed).
License
MIT. See LICENSE.
Data is provided for informational purposes only and is not financial advice.
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 orcalayer-0.2.1.tar.gz.
File metadata
- Download URL: orcalayer-0.2.1.tar.gz
- Upload date:
- Size: 15.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.24 {"installer":{"name":"uv","version":"0.11.24","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a0d975f150a539f2270f0be7329afc76358e9b07a85dc2fc0c0cc91a475bcec0
|
|
| MD5 |
baee0d479b8ea7d662274b3a8f65e1be
|
|
| BLAKE2b-256 |
ee493ca23dd42a5890c767733c7873c81bbfd8b2059e6816aef543d4b867df47
|
File details
Details for the file orcalayer-0.2.1-py3-none-any.whl.
File metadata
- Download URL: orcalayer-0.2.1-py3-none-any.whl
- Upload date:
- Size: 11.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.24 {"installer":{"name":"uv","version":"0.11.24","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
27c43b3f6bb697278b30005eb8a6c9b2e86ac8554d80a943663d08231cf4849a
|
|
| MD5 |
51d35fee5aec90b3e0cf2089cee6e10c
|
|
| BLAKE2b-256 |
3403284dadbffe44a4f02753b356a01b97883319b8523a67160c9c162bbceb4e
|