Python SDK for the AlphaAI financial-news REST API (api.alphai.io).
Project description
alphai-sdk
Typed Python client for the AlphaAI financial-news REST API — relevance-scored, ticker-linked news and SEC Form 4 insider data, built for AI agents and trading bots.
- Sync and async clients (
Client/AsyncClient) overhttpx - Pydantic v2 response models — autocomplete, validation,
Decimalmoney - Cursor auto-pagination, automatic retry on 429/5xx, rate-limit inspection
- Typed errors and full coverage of the 9 public endpoints
API reference: https://api.alphai.io/api/schema/ · Developer guide: https://alphai.io/developers
Install
pip install alphai-sdk
Requires Python 3.10+. The import name is alphai.
Authentication
Create an API key at https://alphai.io/account/api-keys, then pass it
explicitly or via the ALPHAI_API_KEY environment variable.
from alphai import Client
# reads $ALPHAI_API_KEY when api_key is omitted
with Client(api_key="ak_live_…") as client:
page = client.news.list(symbol="NVDA")
for article in page.results:
print(article.title, "→", article.relevance_score)
Rate limits are per account and two-layer — a per-minute burst plus a per-day
volume cap: Free 20/min · 100/day · Basic 60/min · 10,000/day · Pro 150/min ·
100,000/day. News-archive depth is tiered too: Free keys page the feeds back
30 days, Basic 90, Pro the full archive (paging past your horizon returns a
403 with an upgrade hint).
Quickstart
List & filter the feed
from alphai import Client, NewsCategory
with Client() as client:
page = client.news.list(
symbol="NVDA",
category=[NewsCategory.EARNINGS, "insider"], # enum or str; OR-matched
min_relevance=7,
collapse_stories=True, # dedupe syndicated reprints
page_size=50, # 10 default; 50 needs a Pro key
)
print(page.next_cursor) # opaque cursor for the next (older) page
print(page.has_more)
Auto-paginate
iter() follows the cursor for you and flattens articles across pages:
with Client() as client:
for article in client.news.iter(category="earnings", max_items=100):
print(article.uid, article.title)
Single article, trending, related, insider
with Client() as client:
client.news.trending() # top ≤10 from the last 48h
art = client.news.get("788e477c66f3849b")
client.news.related(art.uid) # up to 6 related articles
client.news.insider(symbol="NVDA") # SEC Form 4 feed (or .insider_iter())
Symbols & rollups
from decimal import Decimal
with Client() as client:
client.symbols.list(limit=100) # active tickers (bare list)
nvda = client.symbols.get("NVDA") # detail (404 if unknown)
btc = client.symbols.get("BTC-USD") # crypto + foreign listings too
# Multi-market: .asset_type ("Stock"/"ETF"/"Crypto"), .country, .currency,
# .supports_insider (US SEC names only). Crypto is "<SYM>-USD"; foreign uses
# the Yahoo suffix (e.g. "VOD.L").
sent = client.symbols.sentiment_summary("NVDA") # 7-day AI sentiment
ins = client.symbols.insider_summary("NVDA") # 30-day Form 4 rollup
assert isinstance(ins.buy_value_usd, Decimal | None) # money is Decimal
Async
Every method mirrors the sync client with await; iter() is an async generator:
import asyncio
from alphai import AsyncClient
async def main() -> None:
async with AsyncClient() as client:
async for article in client.news.iter(symbol="NVDA", max_items=20):
print(article.title)
asyncio.run(main())
Example projects
- alphai-news-to-email — a small, deployable app that emails you a deduplicated digest of high-relevance news for your watchlist. Built entirely on this SDK.
Errors
All errors derive from AlphaAIError:
from alphai import Client, RateLimitError, NotFoundError, AuthenticationError
with Client() as client:
try:
client.symbols.get("ZZZZ")
except NotFoundError:
...
except RateLimitError as e:
print("retry after", e.retry_after, "seconds; limit", e.limit)
except AuthenticationError:
...
| Status | Exception |
|---|---|
| 400 | BadRequestError (.fields for validation errors) |
| 401 | AuthenticationError |
| 403 | PermissionDeniedError |
| 404 | NotFoundError |
| 429 | RateLimitError (.retry_after, .limit, .remaining, .reset) |
| 5xx | ServerError |
| network/timeout | APIConnectionError |
| 2xx, unparseable body | InvalidResponseError |
GET requests are automatically retried on 429 / 5xx / connection errors
(max_retries, default 2) with jittered backoff that honors Retry-After (capped
at max_retry_after, default 60s, so a bad value can't freeze your process). A
2xx with a non-JSON / empty body raises InvalidResponseError.
Rate-limit budget
Every keyed response carries the X-RateLimit-* trio. The last one seen is on
the client:
with Client() as client:
client.news.list()
rl = client.last_rate_limit
if rl:
print(f"{rl.remaining}/{rl.limit} left, resets at {rl.reset}")
Configuration
Client(
api_key=None, # else $ALPHAI_API_KEY
base_url="https://api.alphai.io", # API host
timeout=30.0,
max_retries=2, # clamped to >= 0
backoff_factor=0.5,
max_retry_after=60.0, # cap on honored Retry-After (seconds)
user_agent="alphai-sdk-python/<version>",
http_client=None, # bring your own httpx.Client (advanced)
)
The same keyword arguments apply to AsyncClient. When you pass a custom
http_client, the SDK still applies its Authorization header and base URL on
every request — your client just supplies the transport (proxies, custom
timeout, mounts). You own its lifecycle (the SDK won't close a client you passed in).
Development
uv venv && uv pip install -e ".[dev]"
ruff check . && ruff format --check .
mypy src/alphai
pytest # offline suite
pytest -m integration # live tests (needs ALPHAI_API_KEY)
License
MIT — see LICENSE. API access still requires a valid key.
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 alphai_sdk-0.2.0.tar.gz.
File metadata
- Download URL: alphai_sdk-0.2.0.tar.gz
- Upload date:
- Size: 27.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
305a0818ebad6e2c143ba6db7a0064b2e2a80e52534d7c9bc5c021622423eeb4
|
|
| MD5 |
fa44adfb707408a403bd6da749e0bd3d
|
|
| BLAKE2b-256 |
874dba1e7ac7ab5c74f5dd73db7f438b2cd44bcd1074accbe6d90782248ce38b
|
Provenance
The following attestation bundles were made for alphai_sdk-0.2.0.tar.gz:
Publisher:
release.yml on makeev/alphai-sdk
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
alphai_sdk-0.2.0.tar.gz -
Subject digest:
305a0818ebad6e2c143ba6db7a0064b2e2a80e52534d7c9bc5c021622423eeb4 - Sigstore transparency entry: 2123819463
- Sigstore integration time:
-
Permalink:
makeev/alphai-sdk@f987a190c876a491f7a2d7d431637123779f5ce4 -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/makeev
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@f987a190c876a491f7a2d7d431637123779f5ce4 -
Trigger Event:
push
-
Statement type:
File details
Details for the file alphai_sdk-0.2.0-py3-none-any.whl.
File metadata
- Download URL: alphai_sdk-0.2.0-py3-none-any.whl
- Upload date:
- Size: 24.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b4bf413ce34cf5cf61a41cb22119bef19256c2a23879309cc0c4a86d86328cdf
|
|
| MD5 |
e410247e2a913d5c4e6618d169aa3457
|
|
| BLAKE2b-256 |
a9e4f70125160e7672a3035458cf8c9ccb0bd03dd8c78b0b4dbdbb102bc48580
|
Provenance
The following attestation bundles were made for alphai_sdk-0.2.0-py3-none-any.whl:
Publisher:
release.yml on makeev/alphai-sdk
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
alphai_sdk-0.2.0-py3-none-any.whl -
Subject digest:
b4bf413ce34cf5cf61a41cb22119bef19256c2a23879309cc0c4a86d86328cdf - Sigstore transparency entry: 2123819521
- Sigstore integration time:
-
Permalink:
makeev/alphai-sdk@f987a190c876a491f7a2d7d431637123779f5ce4 -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/makeev
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@f987a190c876a491f7a2d7d431637123779f5ce4 -
Trigger Event:
push
-
Statement type: