Skip to main content

A Python async wrapper for massive.com API

Project description

massive-api-client

massive-api-client is an async wrapper around parts of the official massive Python client.

It focuses on two things:

  • async access to selected Massive.com REST APIs
  • automatic sleeping and retrying when a rate limit is hit, which is especially helpful on the free tier

This package is still a work in progress, so it currently supports only a subset of endpoints. It reuses response models from massive.rest.models, which makes it easy to work alongside the official client.

Features

  • Async client built on httpx.AsyncClient
  • Reuses models from the official massive package
  • Async pagination support through async for
  • Built-in retry/sleep behavior for HTTP 429 Too Many Requests
  • Small and focused API surface

Supported APIs

Reference

  • list_tickers(...)
  • get_ticker_details(ticker, ...)
  • get_ticker_events(ticker, ...)
  • list_ticker_news(...)
  • get_ticker_types(...)
  • get_related_companies(ticker)

Aggregates

  • list_aggs(ticker, multiplier, timespan, from_, to, ...)
  • get_grouped_daily_aggs(date, ...)

Indicators

  • get_sma(ticker, ...)
  • get_ema(ticker, ...)
  • get_rsi(ticker, ...)
  • get_macd(ticker, ...)

Installation

Install from PyPI:

pip install massive-api-client

Quick Start

import asyncio

from massive_api_client import MassiveAPIClient
from massive_api_client.config import MassiveClientConfig


async def main() -> None:
    client = MassiveAPIClient(
        MassiveClientConfig(
            massive_api_key="YOUR_MASSIVE_API_KEY",
        )
    )

    try:
        details = await client.get_ticker_details("AAPL")
        print(details.name)

        sma = await client.get_sma("AAPL", timespan="day", window=10, limit=5)
        print(sma.values[0].value)

        tickers = [
            ticker
            async for ticker in client.list_tickers(search="apple", limit=5, max_num_pages=1)
        ]
        print([ticker.ticker for ticker in tickers])
    finally:
        await client.close()


asyncio.run(main())

Pagination

The following methods return async iterators:

  • list_tickers(...)
  • list_ticker_news(...)
  • list_aggs(...)

Example:

bars = [
    bar
    async for bar in client.list_aggs(
        ticker="AAPL",
        multiplier=1,
        timespan="day",
        from_="2024-01-01",
        to="2024-01-31",
        max_num_pages=1,
    )
]

max_num_pages is available as a defensive guard for paginated endpoints. It is default to 10000 pages.

Rate Limit Handling

When Massive returns HTTP 429, the client will:

  1. sleep for rate_limit_sleep_secs
  2. retry the same request
  3. repeat until rate_limit_max_retries is reached

If the request is still rate-limited after all retries, a RateLimitException is raised.

Default settings:

  • rate_limit_sleep_secs=60.0
  • rate_limit_max_retries=3

Configuration

Use MassiveClientConfig to configure the client:

from massive_api_client.config import MassiveClientConfig


config = MassiveClientConfig(
    massive_api_key="YOUR_MASSIVE_API_KEY",
    api_base_url="https://api.massive.com",
    timeout_secs=30.0,
    rate_limit_sleep_secs=60.0,
    rate_limit_max_retries=3,
)

Fields:

  • massive_api_key: required Massive API key
  • api_base_url: defaults to https://api.massive.com
  • timeout_secs: request timeout in seconds, default to 30 seconds
  • rate_limit_sleep_secs: how long to wait before retrying after HTTP 429, default to 1 minute
  • rate_limit_max_retries: maximum retry attempts after HTTP 429, default to 3 - meaning together with the initial call, it will call the API upto 4 times

Return Types

Responses are deserialized into models from the official massive package, for example:

  • Ticker
  • TickerDetails
  • TickerNews
  • TickerTypes
  • Agg
  • GroupedDailyAgg
  • SMAIndicatorResults
  • EMAIndicatorResults
  • RSIIndicatorResults
  • MACDIndicatorResults

This means you can keep using the official model types while switching to an async workflow.

Errors

  • RateLimitException: raised when rate-limit retries are exhausted
  • BadResponseException: raised when the API response is missing an expected field
  • httpx exceptions: non-rate-limit HTTP failures are surfaced by httpx

Notes

  • This project is intentionally small (focusing on author's personal requirements) and currently covers only part of the Massive API.
  • The client is not an async context manager right now, so close it explicitly with await client.close().

Development

pip install -e . pytest
pytest

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

massive_api_client-0.0.4.tar.gz (11.7 kB view details)

Uploaded Source

Built Distribution

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

massive_api_client-0.0.4-py3-none-any.whl (12.5 kB view details)

Uploaded Python 3

File details

Details for the file massive_api_client-0.0.4.tar.gz.

File metadata

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

File hashes

Hashes for massive_api_client-0.0.4.tar.gz
Algorithm Hash digest
SHA256 840ce4dce7f0624b97bb57ed5410792bf9fe4c83b9b9e167e22f5f00e034148d
MD5 030148e39c43107fbf3062b824fd3008
BLAKE2b-256 2d270429d33082924b05911b592e9a36dfa488bceea80c6eca4fccc503da47c9

See more details on using hashes here.

Provenance

The following attestation bundles were made for massive_api_client-0.0.4.tar.gz:

Publisher: publish.yml on caseyvu/massive-api-client

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

File details

Details for the file massive_api_client-0.0.4-py3-none-any.whl.

File metadata

File hashes

Hashes for massive_api_client-0.0.4-py3-none-any.whl
Algorithm Hash digest
SHA256 a26f27c692244f78b3bdb0d75239cfe271578d4d6f01984c9d010d8c79d4e06c
MD5 6d6c11d62c88530cae85c1ee70c2d768
BLAKE2b-256 a53f301d577c9dd22b7de4a8ccec51271795d97db870804fb960657f86705a25

See more details on using hashes here.

Provenance

The following attestation bundles were made for massive_api_client-0.0.4-py3-none-any.whl:

Publisher: publish.yml on caseyvu/massive-api-client

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