Skip to main content

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) over httpx
  • Pydantic v2 response models — autocomplete, validation, Decimal money
  • 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, per hour: Free 100 · Basic 1,000 · Pro 10,000.

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
    )
    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)
    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())

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

alphai_sdk-0.1.0.tar.gz (25.3 kB view details)

Uploaded Source

Built Distribution

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

alphai_sdk-0.1.0-py3-none-any.whl (23.5 kB view details)

Uploaded Python 3

File details

Details for the file alphai_sdk-0.1.0.tar.gz.

File metadata

  • Download URL: alphai_sdk-0.1.0.tar.gz
  • Upload date:
  • Size: 25.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for alphai_sdk-0.1.0.tar.gz
Algorithm Hash digest
SHA256 c9125e3cf529e0b537795fcbd50ed3c0da4a4f23849d0672f18e5a2121532024
MD5 46827b4aafef7b64035fa16824cb2ed6
BLAKE2b-256 750874fb01fe9d99454307287071e122bba4cae6975bf59d7f188bc4185f17d0

See more details on using hashes here.

Provenance

The following attestation bundles were made for alphai_sdk-0.1.0.tar.gz:

Publisher: release.yml on makeev/alphai-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 alphai_sdk-0.1.0-py3-none-any.whl.

File metadata

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

File hashes

Hashes for alphai_sdk-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 0c43b8252be9d013494164d2b2616dd50aea4030efa4aa6cb7daa9475bfcf3f6
MD5 7de8f6699aebd02f617f5015d3b1a645
BLAKE2b-256 08301ea741618f4bc4b4014a778f7c7712155eabe774e10ef1cac7fe65731808

See more details on using hashes here.

Provenance

The following attestation bundles were made for alphai_sdk-0.1.0-py3-none-any.whl:

Publisher: release.yml on makeev/alphai-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