pjmarshall1 / laravel-massive
A Laravel-native client for the Massive REST API.
v1.0.0
2026-07-01 12:44 UTC
Requires
- php: ^8.3
- illuminate/http: ^13.0
- illuminate/support: ^13.0
README
A Laravel-native client for the Massive REST API.
This package intentionally uses Laravel's built-in HTTP client instead of Massive's PHP SDK.
Installation
Require the package with Composer:
composer require pjmarshall1/laravel-massive
Laravel will auto-discover the package service provider and facade.
Configuration
Publish the config file:
php artisan vendor:publish --tag=massive-config
Add your Massive API key to .env:
MASSIVE_API_KEY=your-api-key
Optional environment variables:
MASSIVE_BASE_URL=https://api.massive.com MASSIVE_TIMEOUT=10 MASSIVE_CONNECT_TIMEOUT=3
Usage
Resolve the client from Laravel's container:
use Pjmarshall1\Massive\Massive; $massive = app(Massive::class); $overview = $massive->stocks()->tickers()->overview('AAPL');
Or use the facade:
use Pjmarshall1\Massive\Facades\Massive; $details = Massive::tickerDetails('AAPL');
Available Methods
Generic GET Requests
Use get for any REST endpoint that is not wrapped yet:
$response = Massive::get('/v3/reference/tickers', [ 'ticker' => 'AAPL', ]);
Stock Tickers
$tickers = Massive::stocks()->tickers()->allTickers([ 'market' => 'stocks', 'active' => 'true', ]); $allTickers = Massive::stocks()->tickers()->allTickers([ 'market' => 'stocks', 'active' => 'true', ], allPages: true); $overview = Massive::stocks()->tickers()->overview('AAPL'); $types = Massive::stocks()->tickers()->types(); $related = Massive::stocks()->tickers()->related('AAPL');
Stock Aggregates
$bars = Massive::stocks()->aggregates()->customBars( ticker: 'AAPL', multiplier: 1, timespan: 'day', from: '2024-01-01', to: '2024-01-31', query: ['adjusted' => true], ); $allBars = Massive::stocks()->aggregates()->customBars( ticker: 'AAPL', multiplier: 1, timespan: 'day', from: '2024-01-01', to: '2024-01-31', query: ['limit' => 5000], allPages: true, ); $grouped = Massive::stocks()->aggregates()->groupedDaily('2024-01-31', [ 'adjusted' => true, ]); $openClose = Massive::stocks()->aggregates()->dailyOpenClose('AAPL', '2024-01-31', [ 'adjusted' => true, ]); $previousClose = Massive::stocks()->aggregates()->previousClose('AAPL', [ 'adjusted' => true, ]);
Stock Snapshots
$singleTicker = Massive::stocks()->snapshots()->singleTicker('AAPL'); $fullMarket = Massive::stocks()->snapshots()->fullMarket(); $unified = Massive::stocks()->snapshots()->unified([ 'ticker.any_of' => 'AAPL,MSFT', ]); $gainers = Massive::stocks()->snapshots()->topMarketMovers('gainers'); $losers = Massive::stocks()->snapshots()->topMarketMovers('losers');
Trades
$trades = Massive::stocks()->trades()->historical('AAPL', [ 'timestamp.gte' => '2024-01-31', ]); $allTrades = Massive::stocks()->trades()->historical('AAPL', [ 'limit' => 5000, ], allPages: true); $latestTrade = Massive::stocks()->trades()->latest('AAPL');
Quotes
$quotes = Massive::stocks()->quotes()->historical('AAPL', [ 'timestamp.gte' => '2024-01-31', ]); $allQuotes = Massive::stocks()->quotes()->historical('AAPL', [ 'limit' => 5000, ], allPages: true); $latestQuote = Massive::stocks()->quotes()->latest('AAPL');
Indicators
$sma = Massive::stocks()->indicators()->sma('AAPL', [ 'timespan' => 'day', ]); $ema = Massive::stocks()->indicators()->ema('AAPL', [ 'timespan' => 'day', ]); $macd = Massive::stocks()->indicators()->macd('AAPL', [ 'timespan' => 'day', ]); $rsi = Massive::stocks()->indicators()->rsi('AAPL', [ 'timespan' => 'day', ]);
Market Operations
$exchanges = Massive::stocks()->marketOperations()->exchanges([ 'asset_class' => 'stocks', ]); $marketHolidays = Massive::stocks()->marketOperations()->marketHolidays(); $marketStatus = Massive::stocks()->marketOperations()->marketStatus(); $conditionCodes = Massive::stocks()->marketOperations()->conditionCodes([ 'asset_class' => 'stocks', ]);
Corporate Actions
$ipos = Massive::stocks()->corporateActions()->ipos([ 'ipo_status' => 'new', ]); $splits = Massive::stocks()->corporateActions()->splits([ 'ticker' => 'AAPL', ]); $dividends = Massive::stocks()->corporateActions()->dividends([ 'ticker' => 'AAPL', ]); $tickerEvents = Massive::stocks()->corporateActions()->tickerEvents('AAPL', [ 'types' => 'ticker_change', ]);
Fundamentals
$balanceSheets = Massive::stocks()->fundamentals()->balanceSheets([ 'ticker' => 'AAPL', ]); $cashFlowStatements = Massive::stocks()->fundamentals()->cashFlowStatements([ 'ticker' => 'AAPL', ]); $incomeStatements = Massive::stocks()->fundamentals()->incomeStatements([ 'ticker' => 'AAPL', ]); $ratios = Massive::stocks()->fundamentals()->ratios([ 'ticker' => 'AAPL', ]); $shortInterest = Massive::stocks()->fundamentals()->shortInterest([ 'ticker' => 'AAPL', ]); $shortVolume = Massive::stocks()->fundamentals()->shortVolume([ 'ticker' => 'AAPL', ]); $freeFloat = Massive::stocks()->fundamentals()->freeFloat([ 'ticker' => 'AAPL', ]);
Filings
$edgarIndex = Massive::stocks()->filings()->edgarIndex([ 'ticker' => 'AAPL', ]); $tenKSections = Massive::stocks()->filings()->tenKSections([ 'ticker' => 'AAPL', ]); $eightKText = Massive::stocks()->filings()->eightKText([ 'ticker' => 'AAPL', ]); $thirteenF = Massive::stocks()->filings()->thirteenF([ 'cik' => '0001067983', ]); $riskFactors = Massive::stocks()->filings()->riskFactors([ 'ticker' => 'AAPL', ]); $riskCategories = Massive::stocks()->filings()->riskCategories(); $form3 = Massive::stocks()->filings()->form3([ 'ticker' => 'AAPL', ]); $form4 = Massive::stocks()->filings()->form4([ 'ticker' => 'AAPL', ]);
News
$news = Massive::stocks()->news()->articles([ 'ticker' => 'AAPL', ]); $allNews = Massive::stocks()->news()->articles([ 'ticker' => 'AAPL', 'limit' => 100, ], allPages: true);
Options Contracts
$contracts = Massive::options()->contracts()->allContracts([ 'underlying_ticker' => 'AAPL', 'contract_type' => 'call', ]); $allContracts = Massive::options()->contracts()->allContracts([ 'underlying_ticker' => 'AAPL', 'limit' => 1000, ], allPages: true); $overview = Massive::options()->contracts()->overview('O:AAPL240119C00150000');
Options Aggregates
$bars = Massive::options()->aggregates()->customBars( optionsTicker: 'O:AAPL240119C00150000', multiplier: 1, timespan: 'day', from: '2024-01-01', to: '2024-01-31', query: ['adjusted' => true], ); $allBars = Massive::options()->aggregates()->customBars( optionsTicker: 'O:AAPL240119C00150000', multiplier: 1, timespan: 'day', from: '2024-01-01', to: '2024-01-31', query: ['limit' => 5000], allPages: true, );
Options Snapshots
$unified = Massive::options()->snapshots()->unified([ 'type' => 'options', 'ticker.any_of' => 'O:AAPL240119C00150000,O:AAPL240119P00150000', ]); $allUnified = Massive::options()->snapshots()->unified([ 'type' => 'options', 'limit' => 250, ], allPages: true); $chain = Massive::options()->snapshots()->chain('AAPL', [ 'expiration_date' => '2024-01-19', 'contract_type' => 'call', ]); $allChain = Massive::options()->snapshots()->chain('AAPL', [ 'limit' => 250, ], allPages: true); $contract = Massive::options()->snapshots()->contract('AAPL', 'O:AAPL240119C00150000');
The original flat stock methods remain available as convenience proxies:
$details = Massive::tickerDetails('AAPL'); $dividends = Massive::dividends(['ticker' => 'AAPL']); $bars = Massive::customBars('AAPL', 1, 'day', '2024-01-01', '2024-01-31'); $grouped = Massive::groupedDaily('2024-01-31'); $openClose = Massive::dailyOpenClose('AAPL', '2024-01-31'); $previousClose = Massive::previousClose('AAPL'); $singleTicker = Massive::singleTickerSnapshot('AAPL'); $fullMarket = Massive::fullMarketSnapshot(); $unified = Massive::unifiedSnapshot(['ticker.any_of' => 'AAPL,MSFT']); $gainers = Massive::topMarketMovers('gainers'); $trades = Massive::historicalTrades('AAPL'); $latestTrade = Massive::latestTrade('AAPL'); $quotes = Massive::historicalQuotes('AAPL'); $latestQuote = Massive::latestQuote('AAPL'); $sma = Massive::sma('AAPL'); $ema = Massive::ema('AAPL'); $macd = Massive::macd('AAPL'); $rsi = Massive::rsi('AAPL'); $exchanges = Massive::exchanges(['asset_class' => 'stocks']); $marketHolidays = Massive::marketHolidays(); $marketStatus = Massive::marketStatus(); $conditionCodes = Massive::conditionCodes(['asset_class' => 'stocks']); $ipos = Massive::ipos(['ipo_status' => 'new']); $splits = Massive::splits(['ticker' => 'AAPL']); $tickerEvents = Massive::tickerEvents('AAPL'); $balanceSheets = Massive::balanceSheets(['ticker' => 'AAPL']); $cashFlowStatements = Massive::cashFlowStatements(['ticker' => 'AAPL']); $incomeStatements = Massive::incomeStatements(['ticker' => 'AAPL']); $ratios = Massive::ratios(['ticker' => 'AAPL']); $shortInterest = Massive::shortInterest(['ticker' => 'AAPL']); $shortVolume = Massive::shortVolume(['ticker' => 'AAPL']); $freeFloat = Massive::freeFloat(['ticker' => 'AAPL']); $edgarIndex = Massive::edgarIndex(['ticker' => 'AAPL']); $tenKSections = Massive::tenKSections(['ticker' => 'AAPL']); $eightKText = Massive::eightKText(['ticker' => 'AAPL']); $thirteenF = Massive::thirteenF(['cik' => '0001067983']); $riskFactors = Massive::riskFactors(['ticker' => 'AAPL']); $riskCategories = Massive::riskCategories(); $form3 = Massive::form3(['ticker' => 'AAPL']); $form4 = Massive::form4(['ticker' => 'AAPL']); $news = Massive::news(['ticker' => 'AAPL']); $contracts = Massive::optionsContracts(['underlying_ticker' => 'AAPL']); $overview = Massive::optionsContractOverview('O:AAPL240119C00150000'); $optionBars = Massive::optionsCustomBars('O:AAPL240119C00150000', 1, 'day', '2024-01-01', '2024-01-31'); $optionsUnified = Massive::optionsUnifiedSnapshot(['type' => 'options']); $optionsChain = Massive::optionsChainSnapshot('AAPL'); $optionsContract = Massive::optionsContractSnapshot('AAPL', 'O:AAPL240119C00150000');
Error Handling
Failed HTTP responses throw Laravel's Illuminate\Http\Client\RequestException via throw().
use Illuminate\Http\Client\RequestException; use Pjmarshall1\Massive\Facades\Massive; try { $details = Massive::tickerDetails('AAPL'); } catch (RequestException $exception) { report($exception); }
Testing
Use Laravel HTTP fakes in your application tests:
use Illuminate\Support\Facades\Http; use Pjmarshall1\Massive\Facades\Massive; Http::preventStrayRequests(); Http::fake([ 'api.massive.com/v3/reference/tickers/AAPL*' => Http::response([ 'status' => 'OK', 'results' => [ 'ticker' => 'AAPL', ], ]), ]); $details = Massive::tickerDetails('AAPL');