massive 2.0.2__tar.gz → 2.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. {massive-2.0.2 → massive-2.1.0}/PKG-INFO +2 -2
  2. {massive-2.0.2 → massive-2.1.0}/massive/rest/benzinga.py +40 -0
  3. {massive-2.0.2 → massive-2.1.0}/massive/rest/economy.py +41 -0
  4. {massive-2.0.2 → massive-2.1.0}/massive/rest/financials.py +32 -0
  5. {massive-2.0.2 → massive-2.1.0}/massive/rest/futures.py +79 -91
  6. {massive-2.0.2 → massive-2.1.0}/massive/rest/models/benzinga.py +19 -0
  7. massive-2.1.0/massive/rest/models/dividends.py +54 -0
  8. {massive-2.0.2 → massive-2.1.0}/massive/rest/models/economy.py +19 -0
  9. {massive-2.0.2 → massive-2.1.0}/massive/rest/models/financials.py +59 -0
  10. {massive-2.0.2 → massive-2.1.0}/massive/rest/models/futures.py +30 -38
  11. massive-2.1.0/massive/rest/models/splits.py +39 -0
  12. {massive-2.0.2 → massive-2.1.0}/massive/rest/reference.py +158 -0
  13. {massive-2.0.2 → massive-2.1.0}/pyproject.toml +5 -5
  14. massive-2.0.2/massive/rest/models/dividends.py +0 -21
  15. massive-2.0.2/massive/rest/models/splits.py +0 -16
  16. {massive-2.0.2 → massive-2.1.0}/LICENSE +0 -0
  17. {massive-2.0.2 → massive-2.1.0}/massive/__init__.py +0 -0
  18. {massive-2.0.2 → massive-2.1.0}/massive/exceptions.py +0 -0
  19. {massive-2.0.2 → massive-2.1.0}/massive/logging.py +0 -0
  20. {massive-2.0.2 → massive-2.1.0}/massive/modelclass.py +0 -0
  21. {massive-2.0.2 → massive-2.1.0}/massive/rest/__init__.py +0 -0
  22. {massive-2.0.2 → massive-2.1.0}/massive/rest/aggs.py +0 -0
  23. {massive-2.0.2 → massive-2.1.0}/massive/rest/base.py +0 -0
  24. {massive-2.0.2 → massive-2.1.0}/massive/rest/etf_global.py +0 -0
  25. {massive-2.0.2 → massive-2.1.0}/massive/rest/indicators.py +0 -0
  26. {massive-2.0.2 → massive-2.1.0}/massive/rest/models/__init__.py +0 -0
  27. {massive-2.0.2 → massive-2.1.0}/massive/rest/models/aggs.py +0 -0
  28. {massive-2.0.2 → massive-2.1.0}/massive/rest/models/common.py +0 -0
  29. {massive-2.0.2 → massive-2.1.0}/massive/rest/models/conditions.py +0 -0
  30. {massive-2.0.2 → massive-2.1.0}/massive/rest/models/contracts.py +0 -0
  31. {massive-2.0.2 → massive-2.1.0}/massive/rest/models/etf_global.py +0 -0
  32. {massive-2.0.2 → massive-2.1.0}/massive/rest/models/exchanges.py +0 -0
  33. {massive-2.0.2 → massive-2.1.0}/massive/rest/models/indicators.py +0 -0
  34. {massive-2.0.2 → massive-2.1.0}/massive/rest/models/markets.py +0 -0
  35. {massive-2.0.2 → massive-2.1.0}/massive/rest/models/quotes.py +0 -0
  36. {massive-2.0.2 → massive-2.1.0}/massive/rest/models/request.py +0 -0
  37. {massive-2.0.2 → massive-2.1.0}/massive/rest/models/snapshot.py +0 -0
  38. {massive-2.0.2 → massive-2.1.0}/massive/rest/models/summaries.py +0 -0
  39. {massive-2.0.2 → massive-2.1.0}/massive/rest/models/tickers.py +0 -0
  40. {massive-2.0.2 → massive-2.1.0}/massive/rest/models/tmx.py +0 -0
  41. {massive-2.0.2 → massive-2.1.0}/massive/rest/models/trades.py +0 -0
  42. {massive-2.0.2 → massive-2.1.0}/massive/rest/quotes.py +0 -0
  43. {massive-2.0.2 → massive-2.1.0}/massive/rest/snapshot.py +0 -0
  44. {massive-2.0.2 → massive-2.1.0}/massive/rest/summaries.py +0 -0
  45. {massive-2.0.2 → massive-2.1.0}/massive/rest/tmx.py +0 -0
  46. {massive-2.0.2 → massive-2.1.0}/massive/rest/trades.py +0 -0
  47. {massive-2.0.2 → massive-2.1.0}/massive/rest/vX.py +0 -0
  48. {massive-2.0.2 → massive-2.1.0}/massive/websocket/__init__.py +0 -0
  49. {massive-2.0.2 → massive-2.1.0}/massive/websocket/models/__init__.py +0 -0
  50. {massive-2.0.2 → massive-2.1.0}/massive/websocket/models/common.py +0 -0
  51. {massive-2.0.2 → massive-2.1.0}/massive/websocket/models/models.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: massive
3
- Version: 2.0.2
3
+ Version: 2.1.0
4
4
  Summary: Official Massive (formerly Polygon.io) REST and Websocket client.
5
5
  License: MIT
6
6
  License-File: LICENSE
@@ -15,7 +15,7 @@ Classifier: Programming Language :: Python :: 3.11
15
15
  Classifier: Programming Language :: Python :: 3.12
16
16
  Classifier: Programming Language :: Python :: 3.13
17
17
  Classifier: Programming Language :: Python :: 3.14
18
- Requires-Dist: certifi (>=2022.5.18,<2026.0.0)
18
+ Requires-Dist: certifi (>=2022.5.18,<2027.0.0)
19
19
  Requires-Dist: urllib3 (>=1.26.9)
20
20
  Requires-Dist: websockets (>=14.0)
21
21
  Project-URL: Documentation, https://massive.com/docs
@@ -12,6 +12,7 @@ from .models.benzinga import (
12
12
  BenzingaGuidance,
13
13
  BenzingaNews,
14
14
  BenzingaRating,
15
+ BenzingaBullsBearsSay,
15
16
  )
16
17
  from .models.common import Sort
17
18
  from .models.request import RequestOptionBuilder
@@ -479,3 +480,42 @@ class BenzingaClient(BaseClient):
479
480
  deserializer=BenzingaRating.from_dict,
480
481
  options=options,
481
482
  )
483
+
484
+ def list_benzinga_bulls_bears_say(
485
+ self,
486
+ ticker: Optional[str] = None,
487
+ ticker_any_of: Optional[str] = None,
488
+ ticker_gt: Optional[str] = None,
489
+ ticker_gte: Optional[str] = None,
490
+ ticker_lt: Optional[str] = None,
491
+ ticker_lte: Optional[str] = None,
492
+ benzinga_id: Optional[str] = None,
493
+ benzinga_id_any_of: Optional[str] = None,
494
+ benzinga_id_gt: Optional[str] = None,
495
+ benzinga_id_gte: Optional[str] = None,
496
+ benzinga_id_lt: Optional[str] = None,
497
+ benzinga_id_lte: Optional[str] = None,
498
+ last_updated: Optional[str] = None,
499
+ last_updated_gt: Optional[str] = None,
500
+ last_updated_gte: Optional[str] = None,
501
+ last_updated_lt: Optional[str] = None,
502
+ last_updated_lte: Optional[str] = None,
503
+ limit: Optional[int] = None,
504
+ sort: Optional[str] = None,
505
+ params: Optional[Dict[str, Any]] = None,
506
+ raw: bool = False,
507
+ options: Optional[RequestOptionBuilder] = None,
508
+ ) -> Union[Iterator[BenzingaBullsBearsSay], HTTPResponse]:
509
+ """
510
+ Endpoint: GET /benzinga/v1/bulls-bears-say
511
+
512
+ A comprehensive database of analyst bull and bear case summaries for publicly traded companies, providing concise summaries of both bullish and bearish investment arguments to help investors see both sides of the story before making investment decisions.
513
+ """
514
+ url = "/benzinga/v1/bulls-bears-say"
515
+ return self._paginate(
516
+ path=url,
517
+ params=self._get_params(self.list_benzinga_bulls_bears_say, locals()),
518
+ raw=raw,
519
+ deserializer=BenzingaBullsBearsSay.from_dict,
520
+ options=options,
521
+ )
@@ -7,6 +7,7 @@ from .models.economy import (
7
7
  FedInflation,
8
8
  TreasuryYield,
9
9
  FedInflationExpectations,
10
+ FedLaborMarket,
10
11
  )
11
12
  from .models.common import Sort, Order
12
13
  from .models.request import RequestOptionBuilder
@@ -127,3 +128,43 @@ class EconomyClient(BaseClient):
127
128
  result_key="results",
128
129
  options=options,
129
130
  )
131
+
132
+ def list_labor_market_indicators(
133
+ self,
134
+ date: Optional[str] = None,
135
+ date_any_of: Optional[str] = None,
136
+ date_gt: Optional[str] = None,
137
+ date_gte: Optional[str] = None,
138
+ date_lt: Optional[str] = None,
139
+ date_lte: Optional[str] = None,
140
+ limit: Optional[int] = None,
141
+ sort: Optional[str] = None,
142
+ params: Optional[Dict[str, Any]] = None,
143
+ raw: bool = False,
144
+ options: Optional[RequestOptionBuilder] = None,
145
+ ) -> Union[Iterator[FedLaborMarket], HTTPResponse]:
146
+ """
147
+ Labor market indicators from the Federal Reserve, including unemployment rate, labor force participation, average hourly earnings, and job openings data.
148
+
149
+ :param date: Calendar date of the observation (YYYY-MM-DD).
150
+ :param date_any_of: Filter equal to any of the values. Multiple values can be specified by using a comma separated list.
151
+ :param date_gt: Filter greater than the value.
152
+ :param date_gte: Filter greater than or equal to the value.
153
+ :param date_lt: Filter less than the value.
154
+ :param date_lte: Filter less than or equal to the value.
155
+ :param limit: Limit the maximum number of results returned. Defaults to '100' if not specified. The maximum allowed limit is '50000'.
156
+ :param sort: A comma separated list of sort columns. For each column, append '.asc' or '.desc' to specify the sort direction. The sort column defaults to 'date' if not specified. The sort order defaults to 'asc' if not specified.
157
+ :param params: Additional query parameters.
158
+ :param raw: Return raw HTTPResponse object if True, else return Iterator[FedLaborMarket].
159
+ :param options: RequestOptionBuilder for additional headers or params.
160
+ :return: An iterator of FedLaborMarket objects or HTTPResponse if raw=True.
161
+ """
162
+ url = "/fed/v1/labor-market"
163
+
164
+ return self._paginate(
165
+ path=url,
166
+ params=self._get_params(self.list_labor_market_indicators, locals()),
167
+ deserializer=FedLaborMarket.from_dict,
168
+ raw=raw,
169
+ options=options,
170
+ )
@@ -9,6 +9,7 @@ from .models.financials import (
9
9
  FinancialCashFlowStatement,
10
10
  FinancialIncomeStatement,
11
11
  FinancialRatio,
12
+ FinancialFloat,
12
13
  )
13
14
  from .models.common import Sort
14
15
  from .models.request import RequestOptionBuilder
@@ -318,3 +319,34 @@ class FinancialsClient(BaseClient):
318
319
  deserializer=FinancialRatio.from_dict,
319
320
  options=options,
320
321
  )
322
+
323
+ def list_stocks_floats(
324
+ self,
325
+ ticker: Optional[str] = None,
326
+ ticker_any_of: Optional[str] = None,
327
+ ticker_gt: Optional[str] = None,
328
+ ticker_gte: Optional[str] = None,
329
+ ticker_lt: Optional[str] = None,
330
+ ticker_lte: Optional[str] = None,
331
+ free_float_percent: Optional[float] = None,
332
+ free_float_percent_gt: Optional[float] = None,
333
+ free_float_percent_gte: Optional[float] = None,
334
+ free_float_percent_lt: Optional[float] = None,
335
+ free_float_percent_lte: Optional[float] = None,
336
+ limit: Optional[int] = None,
337
+ sort: Optional[Union[str, Sort]] = None,
338
+ params: Optional[Dict[str, Any]] = None,
339
+ raw: bool = False,
340
+ options: Optional[RequestOptionBuilder] = None,
341
+ ) -> Union[Iterator[FinancialFloat], HTTPResponse]:
342
+ """
343
+ Endpoint: GET /stocks/vX/float
344
+ """
345
+ url = "/stocks/vX/float"
346
+ return self._paginate(
347
+ path=url,
348
+ params=self._get_params(self.list_stocks_floats, locals()),
349
+ raw=raw,
350
+ deserializer=FinancialFloat.from_dict,
351
+ options=options,
352
+ )
@@ -59,14 +59,38 @@ class FuturesClient(BaseClient):
59
59
 
60
60
  def list_futures_contracts(
61
61
  self,
62
+ date: Optional[str] = None,
63
+ date_gt: Optional[str] = None,
64
+ date_gte: Optional[str] = None,
65
+ date_lt: Optional[str] = None,
66
+ date_lte: Optional[str] = None,
62
67
  product_code: Optional[str] = None,
63
- first_trade_date: Optional[Union[str, date]] = None,
64
- last_trade_date: Optional[Union[str, date]] = None,
65
- as_of: Optional[Union[str, date]] = None,
66
- active: Optional[str] = None,
68
+ product_code_any_of: Optional[str] = None,
69
+ product_code_gt: Optional[str] = None,
70
+ product_code_gte: Optional[str] = None,
71
+ product_code_lt: Optional[str] = None,
72
+ product_code_lte: Optional[str] = None,
73
+ ticker: Optional[str] = None,
74
+ ticker_any_of: Optional[str] = None,
75
+ ticker_gt: Optional[str] = None,
76
+ ticker_gte: Optional[str] = None,
77
+ ticker_lt: Optional[str] = None,
78
+ ticker_lte: Optional[str] = None,
79
+ active: Optional[bool] = None,
67
80
  type: Optional[str] = None,
81
+ type_any_of: Optional[str] = None,
82
+ first_trade_date: Optional[str] = None,
83
+ first_trade_date_gt: Optional[str] = None,
84
+ first_trade_date_gte: Optional[str] = None,
85
+ first_trade_date_lt: Optional[str] = None,
86
+ first_trade_date_lte: Optional[str] = None,
87
+ last_trade_date: Optional[str] = None,
88
+ last_trade_date_gt: Optional[str] = None,
89
+ last_trade_date_gte: Optional[str] = None,
90
+ last_trade_date_lt: Optional[str] = None,
91
+ last_trade_date_lte: Optional[str] = None,
68
92
  limit: Optional[int] = None,
69
- sort: Optional[Union[str, Sort]] = None,
93
+ sort: Optional[str] = None,
70
94
  params: Optional[Dict[str, Any]] = None,
71
95
  raw: bool = False,
72
96
  options: Optional[RequestOptionBuilder] = None,
@@ -85,43 +109,43 @@ class FuturesClient(BaseClient):
85
109
  options=options,
86
110
  )
87
111
 
88
- def get_futures_contract_details(
89
- self,
90
- ticker: str,
91
- as_of: Optional[Union[str, date]] = None,
92
- params: Optional[Dict[str, Any]] = None,
93
- raw: bool = False,
94
- options: Optional[RequestOptionBuilder] = None,
95
- ) -> Union[FuturesContract, HTTPResponse]:
96
- """
97
- Endpoint: GET /futures/vX/contracts/{ticker}
98
-
99
- Returns details for a single contract at a specified point in time.
100
- (No next_url in the response -> just a single get).
101
- """
102
- url = f"/futures/vX/contracts/{ticker}"
103
- return self._get(
104
- path=url,
105
- params=self._get_params(self.get_futures_contract_details, locals()),
106
- deserializer=FuturesContract.from_dict,
107
- raw=raw,
108
- result_key="results",
109
- options=options,
110
- )
111
-
112
112
  def list_futures_products(
113
113
  self,
114
114
  name: Optional[str] = None,
115
- name_search: Optional[str] = None,
116
- as_of: Optional[Union[str, date]] = None,
115
+ name_any_of: Optional[str] = None,
116
+ name_gt: Optional[str] = None,
117
+ name_gte: Optional[str] = None,
118
+ name_lt: Optional[str] = None,
119
+ name_lte: Optional[str] = None,
120
+ product_code: Optional[str] = None,
121
+ product_code_any_of: Optional[str] = None,
122
+ product_code_gt: Optional[str] = None,
123
+ product_code_gte: Optional[str] = None,
124
+ product_code_lt: Optional[str] = None,
125
+ product_code_lte: Optional[str] = None,
126
+ date: Optional[str] = None,
127
+ date_gt: Optional[str] = None,
128
+ date_gte: Optional[str] = None,
129
+ date_lt: Optional[str] = None,
130
+ date_lte: Optional[str] = None,
117
131
  trading_venue: Optional[str] = None,
132
+ trading_venue_any_of: Optional[str] = None,
133
+ trading_venue_gt: Optional[str] = None,
134
+ trading_venue_gte: Optional[str] = None,
135
+ trading_venue_lt: Optional[str] = None,
136
+ trading_venue_lte: Optional[str] = None,
118
137
  sector: Optional[str] = None,
138
+ sector_any_of: Optional[str] = None,
119
139
  sub_sector: Optional[str] = None,
140
+ sub_sector_any_of: Optional[str] = None,
120
141
  asset_class: Optional[str] = None,
142
+ asset_class_any_of: Optional[str] = None,
121
143
  asset_sub_class: Optional[str] = None,
144
+ asset_sub_class_any_of: Optional[str] = None,
122
145
  type: Optional[str] = None,
146
+ type_any_of: Optional[str] = None,
123
147
  limit: Optional[int] = None,
124
- sort: Optional[Union[str, Sort]] = None,
148
+ sort: Optional[str] = None,
125
149
  params: Optional[Dict[str, Any]] = None,
126
150
  raw: bool = False,
127
151
  options: Optional[RequestOptionBuilder] = None,
@@ -140,31 +164,6 @@ class FuturesClient(BaseClient):
140
164
  options=options,
141
165
  )
142
166
 
143
- def get_futures_product_details(
144
- self,
145
- product_code: str,
146
- type: Optional[str] = None,
147
- as_of: Optional[Union[str, date]] = None,
148
- params: Optional[Dict[str, Any]] = None,
149
- raw: bool = False,
150
- options: Optional[RequestOptionBuilder] = None,
151
- ) -> Union[FuturesProduct, HTTPResponse]:
152
- """
153
- Endpoint: GET /futures/vX/products/{product_code}
154
-
155
- Returns the details for a single product as it was at a specific day.
156
- (No next_url -> single get).
157
- """
158
- url = f"/futures/vX/products/{product_code}"
159
- return self._get(
160
- path=url,
161
- params=self._get_params(self.get_futures_product_details, locals()),
162
- deserializer=FuturesProduct.from_dict,
163
- raw=raw,
164
- result_key="results",
165
- options=options,
166
- )
167
-
168
167
  def list_futures_quotes(
169
168
  self,
170
169
  ticker: str,
@@ -233,10 +232,26 @@ class FuturesClient(BaseClient):
233
232
 
234
233
  def list_futures_schedules(
235
234
  self,
235
+ product_code: Optional[str] = None,
236
+ product_code_any_of: Optional[str] = None,
237
+ product_code_gt: Optional[str] = None,
238
+ product_code_gte: Optional[str] = None,
239
+ product_code_lt: Optional[str] = None,
240
+ product_code_lte: Optional[str] = None,
236
241
  session_end_date: Optional[str] = None,
242
+ session_end_date_any_of: Optional[str] = None,
243
+ session_end_date_gt: Optional[str] = None,
244
+ session_end_date_gte: Optional[str] = None,
245
+ session_end_date_lt: Optional[str] = None,
246
+ session_end_date_lte: Optional[str] = None,
237
247
  trading_venue: Optional[str] = None,
248
+ trading_venue_any_of: Optional[str] = None,
249
+ trading_venue_gt: Optional[str] = None,
250
+ trading_venue_gte: Optional[str] = None,
251
+ trading_venue_lt: Optional[str] = None,
252
+ trading_venue_lte: Optional[str] = None,
238
253
  limit: Optional[int] = None,
239
- sort: Optional[Union[str, Sort]] = None,
254
+ sort: Optional[str] = None,
240
255
  params: Optional[Dict[str, Any]] = None,
241
256
  raw: bool = False,
242
257
  options: Optional[RequestOptionBuilder] = None,
@@ -256,42 +271,15 @@ class FuturesClient(BaseClient):
256
271
  options=options,
257
272
  )
258
273
 
259
- def list_futures_schedules_by_product_code(
260
- self,
261
- product_code: str,
262
- session_end_date: Optional[str] = None,
263
- session_end_date_lt: Optional[str] = None,
264
- session_end_date_lte: Optional[str] = None,
265
- session_end_date_gt: Optional[str] = None,
266
- session_end_date_gte: Optional[str] = None,
267
- limit: Optional[int] = None,
268
- sort: Optional[Union[str, Sort]] = None,
269
- params: Optional[Dict[str, Any]] = None,
270
- raw: bool = False,
271
- options: Optional[RequestOptionBuilder] = None,
272
- ) -> Union[Iterator[FuturesSchedule], HTTPResponse]:
273
- """
274
- Endpoint: GET /futures/vX/products/{product_code}/schedules
275
-
276
- Returns schedule data for a single product across (potentially) many trading dates.
277
- """
278
- url = f"/futures/vX/products/{product_code}/schedules"
279
- return self._paginate(
280
- path=url,
281
- params=self._get_params(
282
- self.list_futures_schedules_by_product_code, locals()
283
- ),
284
- raw=raw,
285
- deserializer=FuturesSchedule.from_dict,
286
- options=options,
287
- )
288
-
289
274
  def list_futures_market_statuses(
290
275
  self,
291
- product_code_any_of: Optional[str] = None,
292
276
  product_code: Optional[str] = None,
277
+ product_code_any_of: Optional[str] = None,
278
+ product_code_gt: Optional[str] = None,
279
+ product_code_gte: Optional[str] = None,
280
+ product_code_lt: Optional[str] = None,
281
+ product_code_lte: Optional[str] = None,
293
282
  limit: Optional[int] = None,
294
- sort: Optional[Union[str, Sort]] = None,
295
283
  params: Optional[Dict[str, Any]] = None,
296
284
  raw: bool = False,
297
285
  options: Optional[RequestOptionBuilder] = None,
@@ -320,7 +308,7 @@ class FuturesClient(BaseClient):
320
308
  product_code_lt: Optional[str] = None,
321
309
  product_code_lte: Optional[str] = None,
322
310
  limit: Optional[int] = None,
323
- sort: Optional[Union[str, Sort]] = None,
311
+ sort: Optional[str] = None,
324
312
  params: Optional[Dict[str, Any]] = None,
325
313
  raw: bool = False,
326
314
  options: Optional[RequestOptionBuilder] = None,
@@ -322,3 +322,22 @@ class BenzingaRating:
322
322
  ticker=d.get("ticker"),
323
323
  time=d.get("time"),
324
324
  )
325
+
326
+
327
+ @modelclass
328
+ class BenzingaBullsBearsSay:
329
+ bear_case: Optional[str] = None
330
+ benzinga_id: Optional[str] = None
331
+ bull_case: Optional[str] = None
332
+ last_updated: Optional[str] = None
333
+ ticker: Optional[str] = None
334
+
335
+ @staticmethod
336
+ def from_dict(d):
337
+ return BenzingaBullsBearsSay(
338
+ bear_case=d.get("bear_case"),
339
+ benzinga_id=d.get("benzinga_id"),
340
+ bull_case=d.get("bull_case"),
341
+ last_updated=d.get("last_updated"),
342
+ ticker=d.get("ticker"),
343
+ )
@@ -0,0 +1,54 @@
1
+ from typing import Optional
2
+ from ...modelclass import modelclass
3
+
4
+
5
+ @modelclass
6
+ class Dividend:
7
+ "Dividend contains data for a historical cash dividend, including the ticker symbol, declaration date, ex-dividend date, record date, pay date, frequency, and amount."
8
+ id: Optional[int] = None
9
+ cash_amount: Optional[float] = None
10
+ currency: Optional[str] = None
11
+ declaration_date: Optional[str] = None
12
+ dividend_type: Optional[str] = None
13
+ ex_dividend_date: Optional[str] = None
14
+ frequency: Optional[int] = None
15
+ pay_date: Optional[str] = None
16
+ record_date: Optional[str] = None
17
+ ticker: Optional[str] = None
18
+
19
+ @staticmethod
20
+ def from_dict(d):
21
+ return Dividend(**d)
22
+
23
+
24
+ @modelclass
25
+ class StockDividend:
26
+ cash_amount: Optional[float] = None
27
+ currency: Optional[str] = None
28
+ declaration_date: Optional[str] = None
29
+ distribution_type: Optional[str] = None
30
+ ex_dividend_date: Optional[str] = None
31
+ frequency: Optional[int] = None
32
+ historical_adjustment_factor: Optional[float] = None
33
+ id: Optional[str] = None
34
+ pay_date: Optional[str] = None
35
+ record_date: Optional[str] = None
36
+ split_adjusted_cash_amount: Optional[float] = None
37
+ ticker: Optional[str] = None
38
+
39
+ @staticmethod
40
+ def from_dict(d):
41
+ return StockDividend(
42
+ cash_amount=d.get("cash_amount"),
43
+ currency=d.get("currency"),
44
+ declaration_date=d.get("declaration_date"),
45
+ distribution_type=d.get("distribution_type"),
46
+ ex_dividend_date=d.get("ex_dividend_date"),
47
+ frequency=d.get("frequency"),
48
+ historical_adjustment_factor=d.get("historical_adjustment_factor"),
49
+ id=d.get("id"),
50
+ pay_date=d.get("pay_date"),
51
+ record_date=d.get("record_date"),
52
+ split_adjusted_cash_amount=d.get("split_adjusted_cash_amount"),
53
+ ticker=d.get("ticker"),
54
+ )
@@ -85,3 +85,22 @@ class FedInflationExpectations:
85
85
  model_30_year=d.get("model_30_year"),
86
86
  model_5_year=d.get("model_5_year"),
87
87
  )
88
+
89
+
90
+ @modelclass
91
+ class FedLaborMarket:
92
+ avg_hourly_earnings: Optional[float] = None
93
+ date: Optional[str] = None
94
+ job_openings: Optional[float] = None
95
+ labor_force_participation_rate: Optional[float] = None
96
+ unemployment_rate: Optional[float] = None
97
+
98
+ @staticmethod
99
+ def from_dict(d):
100
+ return FedLaborMarket(
101
+ avg_hourly_earnings=d.get("avg_hourly_earnings"),
102
+ date=d.get("date"),
103
+ job_openings=d.get("job_openings"),
104
+ labor_force_participation_rate=d.get("labor_force_participation_rate"),
105
+ unemployment_rate=d.get("unemployment_rate"),
106
+ )
@@ -861,3 +861,62 @@ class FinancialRatio:
861
861
  return_on_equity=d.get("return_on_equity"),
862
862
  ticker=d.get("ticker"),
863
863
  )
864
+
865
+
866
+ @modelclass
867
+ class FinancialFloat:
868
+ effective_date: Optional[str] = None
869
+ free_float: Optional[int] = None
870
+ free_float_percent: Optional[float] = None
871
+ ticker: Optional[str] = None
872
+
873
+ @staticmethod
874
+ def from_dict(d):
875
+ return FinancialFloat(
876
+ effective_date=d.get("effective_date"),
877
+ free_float=d.get("free_float"),
878
+ free_float_percent=d.get("free_float_percent"),
879
+ ticker=d.get("ticker"),
880
+ )
881
+
882
+
883
+ @modelclass
884
+ class RiskFactor:
885
+ cik: Optional[str] = None
886
+ filing_date: Optional[str] = None
887
+ primary_category: Optional[str] = None
888
+ secondary_category: Optional[str] = None
889
+ supporting_text: Optional[str] = None
890
+ tertiary_category: Optional[str] = None
891
+ ticker: Optional[str] = None
892
+
893
+ @staticmethod
894
+ def from_dict(d):
895
+ return RiskFactor(
896
+ cik=d.get("cik"),
897
+ filing_date=d.get("filing_date"),
898
+ primary_category=d.get("primary_category"),
899
+ secondary_category=d.get("secondary_category"),
900
+ supporting_text=d.get("supporting_text"),
901
+ tertiary_category=d.get("tertiary_category"),
902
+ ticker=d.get("ticker"),
903
+ )
904
+
905
+
906
+ @modelclass
907
+ class RiskFactorTaxonomy:
908
+ description: Optional[str] = None
909
+ primary_category: Optional[str] = None
910
+ secondary_category: Optional[str] = None
911
+ taxonomy: Optional[float] = None
912
+ tertiary_category: Optional[str] = None
913
+
914
+ @staticmethod
915
+ def from_dict(d):
916
+ return RiskFactorTaxonomy(
917
+ description=d.get("description"),
918
+ primary_category=d.get("primary_category"),
919
+ secondary_category=d.get("secondary_category"),
920
+ taxonomy=d.get("taxonomy"),
921
+ tertiary_category=d.get("tertiary_category"),
922
+ )
@@ -50,7 +50,7 @@ class FuturesContract:
50
50
  trading_venue: Optional[str] = None
51
51
  name: Optional[str] = None
52
52
  type: Optional[str] = None
53
- as_of: Optional[str] = None
53
+ date: Optional[str] = None
54
54
  active: Optional[bool] = None
55
55
  first_trade_date: Optional[str] = None
56
56
  last_trade_date: Optional[str] = None
@@ -61,7 +61,7 @@ class FuturesContract:
61
61
  settlement_tick_size: Optional[float] = None
62
62
  spread_tick_size: Optional[float] = None
63
63
  trade_tick_size: Optional[float] = None
64
- maturity: Optional[str] = None
64
+ group_code: Optional[str] = None
65
65
 
66
66
  @staticmethod
67
67
  def from_dict(d):
@@ -71,7 +71,7 @@ class FuturesContract:
71
71
  trading_venue=d.get("trading_venue"),
72
72
  name=d.get("name"),
73
73
  type=d.get("type"),
74
- as_of=d.get("as_of"),
74
+ date=d.get("date"),
75
75
  active=d.get("active"),
76
76
  first_trade_date=d.get("first_trade_date"),
77
77
  last_trade_date=d.get("last_trade_date"),
@@ -82,7 +82,7 @@ class FuturesContract:
82
82
  settlement_tick_size=d.get("settlement_tick_size"),
83
83
  spread_tick_size=d.get("spread_tick_size"),
84
84
  trade_tick_size=d.get("trade_tick_size"),
85
- maturity=d.get("maturity"),
85
+ group_code=d.get("group_code"),
86
86
  )
87
87
 
88
88
 
@@ -95,11 +95,10 @@ class FuturesProduct:
95
95
 
96
96
  product_code: Optional[str] = None
97
97
  name: Optional[str] = None
98
- as_of: Optional[str] = None
98
+ date: Optional[str] = None
99
99
  trading_venue: Optional[str] = None
100
100
  asset_class: Optional[str] = None
101
101
  asset_sub_class: Optional[str] = None
102
- clearing_channel: Optional[str] = None
103
102
  sector: Optional[str] = None
104
103
  sub_sector: Optional[str] = None
105
104
  type: Optional[str] = None
@@ -110,17 +109,16 @@ class FuturesProduct:
110
109
  settlement_type: Optional[str] = None
111
110
  trade_currency_code: Optional[str] = None
112
111
  unit_of_measure: Optional[str] = None
113
- unit_of_measure_quantity: Optional[float] = None
112
+ unit_of_measure_qty: Optional[float] = None
114
113
 
115
114
  @staticmethod
116
115
  def from_dict(d):
117
116
  return FuturesProduct(
118
117
  product_code=d.get("product_code"),
119
118
  name=d.get("name"),
120
- as_of=d.get("as_of"),
119
+ date=d.get("date"),
121
120
  trading_venue=d.get("trading_venue"),
122
121
  asset_class=d.get("asset_class"),
123
- clearing_channel=d.get("clearing_channel"),
124
122
  asset_sub_class=d.get("asset_sub_class"),
125
123
  sector=d.get("sector"),
126
124
  sub_sector=d.get("sub_sector"),
@@ -132,7 +130,7 @@ class FuturesProduct:
132
130
  settlement_type=d.get("settlement_type"),
133
131
  trade_currency_code=d.get("trade_currency_code"),
134
132
  unit_of_measure=d.get("unit_of_measure"),
135
- unit_of_measure_quantity=d.get("unit_of_measure_quantity"),
133
+ unit_of_measure_qty=d.get("unit_of_measure_qty"),
136
134
  )
137
135
 
138
136
 
@@ -193,62 +191,49 @@ class FuturesTrade:
193
191
 
194
192
 
195
193
  @modelclass
196
- class FuturesScheduleEvent:
194
+ class FuturesSchedule:
197
195
  """
198
- Represents a single market event for a schedule (preopen, open, closed, etc.).
196
+ Represents a single schedule event for a given session_end_date and product.
197
+ Corresponds to /futures/vX/schedules
199
198
  """
200
199
 
201
200
  event: Optional[str] = None
202
201
  timestamp: Optional[str] = None
203
-
204
- @staticmethod
205
- def from_dict(d):
206
- return FuturesScheduleEvent(
207
- event=d.get("event"),
208
- timestamp=d.get("timestamp"),
209
- )
210
-
211
-
212
- @modelclass
213
- class FuturesSchedule:
214
- """
215
- Represents a single schedule for a given session_end_date, with events.
216
- Corresponds to /futures/vX/schedules, /futures/vX/schedules/{product_code}
217
- """
218
-
219
202
  session_end_date: Optional[str] = None
220
203
  product_code: Optional[str] = None
221
204
  trading_venue: Optional[str] = None
222
205
  product_name: Optional[str] = None
223
- schedule: Optional[List[FuturesScheduleEvent]] = None
224
206
 
225
207
  @staticmethod
226
208
  def from_dict(d):
227
209
  return FuturesSchedule(
210
+ event=d.get("event"),
211
+ timestamp=d.get("timestamp"),
228
212
  session_end_date=d.get("session_end_date"),
229
213
  product_code=d.get("product_code"),
230
214
  trading_venue=d.get("trading_venue"),
231
215
  product_name=d.get("product_name"),
232
- schedule=[
233
- FuturesScheduleEvent.from_dict(ev) for ev in d.get("schedule", [])
234
- ],
235
216
  )
236
217
 
237
218
 
238
219
  @modelclass
239
220
  class FuturesMarketStatus:
240
- trading_venue: Optional[str] = None
241
- market_status: Optional[str] = (
242
- None # Enum: pre_open, open, close, pause, post_close_pre_open
243
- )
221
+ market_event: Optional[str] = None
222
+ name: Optional[str] = None
244
223
  product_code: Optional[str] = None
224
+ session_end_date: Optional[str] = None
225
+ timestamp: Optional[str] = None
226
+ trading_venue: Optional[str] = None
245
227
 
246
228
  @staticmethod
247
229
  def from_dict(d):
248
230
  return FuturesMarketStatus(
249
- trading_venue=d.get("trading_venue"),
250
- market_status=d.get("market_status"),
231
+ market_event=d.get("market_event"),
232
+ name=d.get("name"),
251
233
  product_code=d.get("product_code"),
234
+ session_end_date=d.get("session_end_date"),
235
+ timestamp=d.get("timestamp"),
236
+ trading_venue=d.get("trading_venue"),
252
237
  )
253
238
 
254
239
 
@@ -257,6 +242,13 @@ class FuturesSnapshotDetails:
257
242
  open_interest: Optional[int] = None
258
243
  settlement_date: Optional[int] = None
259
244
 
245
+ @staticmethod
246
+ def from_dict(d):
247
+ return FuturesSnapshotDetails(
248
+ open_interest=d.get("open_interest"),
249
+ settlement_date=d.get("settlement_date"),
250
+ )
251
+
260
252
 
261
253
  @modelclass
262
254
  class FuturesSnapshotMinute:
@@ -0,0 +1,39 @@
1
+ from typing import Optional
2
+ from ...modelclass import modelclass
3
+
4
+
5
+ @modelclass
6
+ class Split:
7
+ "Split contains data for a historical stock split, including the ticker symbol, the execution date, and the factors of the split ratio."
8
+ id: Optional[int] = None
9
+ execution_date: Optional[str] = None
10
+ split_from: Optional[int] = None
11
+ split_to: Optional[int] = None
12
+ ticker: Optional[str] = None
13
+
14
+ @staticmethod
15
+ def from_dict(d):
16
+ return Split(**d)
17
+
18
+
19
+ @modelclass
20
+ class StockSplit:
21
+ adjustment_type: Optional[str] = None
22
+ execution_date: Optional[str] = None
23
+ historical_adjustment_factor: Optional[float] = None
24
+ id: Optional[str] = None
25
+ split_from: Optional[float] = None
26
+ split_to: Optional[float] = None
27
+ ticker: Optional[str] = None
28
+
29
+ @staticmethod
30
+ def from_dict(d):
31
+ return StockSplit(
32
+ adjustment_type=d.get("adjustment_type"),
33
+ execution_date=d.get("execution_date"),
34
+ historical_adjustment_factor=d.get("historical_adjustment_factor"),
35
+ id=d.get("id"),
36
+ split_from=d.get("split_from"),
37
+ split_to=d.get("split_to"),
38
+ ticker=d.get("ticker"),
39
+ )
@@ -14,7 +14,9 @@ from .models import (
14
14
  AssetClass,
15
15
  Locale,
16
16
  Split,
17
+ StockSplit,
17
18
  Dividend,
19
+ StockDividend,
18
20
  DividendType,
19
21
  Frequency,
20
22
  Condition,
@@ -24,6 +26,8 @@ from .models import (
24
26
  OptionsContract,
25
27
  ShortInterest,
26
28
  ShortVolume,
29
+ RiskFactor,
30
+ RiskFactorTaxonomy,
27
31
  )
28
32
  from urllib3 import HTTPResponse
29
33
  from datetime import date
@@ -695,3 +699,157 @@ class ContractsClient(BaseClient):
695
699
  result_key="results",
696
700
  options=options,
697
701
  )
702
+
703
+ # Add these functions to financials.py in the FinancialsClient class
704
+
705
+ def list_stocks_splits(
706
+ self,
707
+ ticker: Optional[str] = None,
708
+ ticker_any_of: Optional[str] = None,
709
+ ticker_gt: Optional[str] = None,
710
+ ticker_gte: Optional[str] = None,
711
+ ticker_lt: Optional[str] = None,
712
+ ticker_lte: Optional[str] = None,
713
+ execution_date: Optional[Union[str, date]] = None,
714
+ execution_date_gt: Optional[Union[str, date]] = None,
715
+ execution_date_gte: Optional[Union[str, date]] = None,
716
+ execution_date_lt: Optional[Union[str, date]] = None,
717
+ execution_date_lte: Optional[Union[str, date]] = None,
718
+ adjustment_type: Optional[str] = None,
719
+ adjustment_type_any_of: Optional[str] = None,
720
+ limit: Optional[int] = None,
721
+ sort: Optional[Union[str, Sort]] = None,
722
+ params: Optional[Dict[str, Any]] = None,
723
+ raw: bool = False,
724
+ options: Optional[RequestOptionBuilder] = None,
725
+ ) -> Union[Iterator[StockSplit], HTTPResponse]:
726
+ """
727
+ Endpoint: GET /stocks/v1/splits
728
+ """
729
+ url = "/stocks/v1/splits"
730
+ return self._paginate(
731
+ path=url,
732
+ params=self._get_params(self.list_stocks_splits, locals()),
733
+ raw=raw,
734
+ deserializer=StockSplit.from_dict,
735
+ options=options,
736
+ )
737
+
738
+ def list_stocks_dividends(
739
+ self,
740
+ ticker: Optional[str] = None,
741
+ ticker_any_of: Optional[str] = None,
742
+ ticker_gt: Optional[str] = None,
743
+ ticker_gte: Optional[str] = None,
744
+ ticker_lt: Optional[str] = None,
745
+ ticker_lte: Optional[str] = None,
746
+ ex_dividend_date: Optional[Union[str, date]] = None,
747
+ ex_dividend_date_gt: Optional[Union[str, date]] = None,
748
+ ex_dividend_date_gte: Optional[Union[str, date]] = None,
749
+ ex_dividend_date_lt: Optional[Union[str, date]] = None,
750
+ ex_dividend_date_lte: Optional[Union[str, date]] = None,
751
+ frequency: Optional[int] = None,
752
+ frequency_gt: Optional[int] = None,
753
+ frequency_gte: Optional[int] = None,
754
+ frequency_lt: Optional[int] = None,
755
+ frequency_lte: Optional[int] = None,
756
+ distribution_type: Optional[str] = None,
757
+ distribution_type_any_of: Optional[str] = None,
758
+ limit: Optional[int] = None,
759
+ sort: Optional[Union[str, Sort]] = None,
760
+ params: Optional[Dict[str, Any]] = None,
761
+ raw: bool = False,
762
+ options: Optional[RequestOptionBuilder] = None,
763
+ ) -> Union[Iterator[StockDividend], HTTPResponse]:
764
+ """
765
+ Endpoint: GET /stocks/v1/dividends
766
+ """
767
+ url = "/stocks/v1/dividends"
768
+ return self._paginate(
769
+ path=url,
770
+ params=self._get_params(self.list_stocks_dividends, locals()),
771
+ raw=raw,
772
+ deserializer=StockDividend.from_dict,
773
+ options=options,
774
+ )
775
+
776
+ def list_stocks_filings_risk_factors(
777
+ self,
778
+ filing_date: Optional[Union[str, date]] = None,
779
+ filing_date_any_of: Optional[str] = None,
780
+ filing_date_gt: Optional[Union[str, date]] = None,
781
+ filing_date_gte: Optional[Union[str, date]] = None,
782
+ filing_date_lt: Optional[Union[str, date]] = None,
783
+ filing_date_lte: Optional[Union[str, date]] = None,
784
+ ticker: Optional[str] = None,
785
+ ticker_any_of: Optional[str] = None,
786
+ ticker_gt: Optional[str] = None,
787
+ ticker_gte: Optional[str] = None,
788
+ ticker_lt: Optional[str] = None,
789
+ ticker_lte: Optional[str] = None,
790
+ cik: Optional[str] = None,
791
+ cik_any_of: Optional[str] = None,
792
+ cik_gt: Optional[str] = None,
793
+ cik_gte: Optional[str] = None,
794
+ cik_lt: Optional[str] = None,
795
+ cik_lte: Optional[str] = None,
796
+ limit: Optional[int] = None,
797
+ sort: Optional[Union[str, Sort]] = None,
798
+ params: Optional[Dict[str, Any]] = None,
799
+ raw: bool = False,
800
+ options: Optional[RequestOptionBuilder] = None,
801
+ ) -> Union[Iterator[RiskFactor], HTTPResponse]:
802
+ """
803
+ Endpoint: GET /stocks/filings/vX/risk-factors
804
+ """
805
+ url = "/stocks/filings/vX/risk-factors"
806
+ return self._paginate(
807
+ path=url,
808
+ params=self._get_params(self.list_stocks_filings_risk_factors, locals()),
809
+ raw=raw,
810
+ deserializer=RiskFactor.from_dict,
811
+ options=options,
812
+ )
813
+
814
+ def list_stocks_taxonomies_risk_factors(
815
+ self,
816
+ taxonomy: Optional[float] = None,
817
+ taxonomy_gt: Optional[float] = None,
818
+ taxonomy_gte: Optional[float] = None,
819
+ taxonomy_lt: Optional[float] = None,
820
+ taxonomy_lte: Optional[float] = None,
821
+ primary_category: Optional[str] = None,
822
+ primary_category_any_of: Optional[str] = None,
823
+ primary_category_gt: Optional[str] = None,
824
+ primary_category_gte: Optional[str] = None,
825
+ primary_category_lt: Optional[str] = None,
826
+ primary_category_lte: Optional[str] = None,
827
+ secondary_category: Optional[str] = None,
828
+ secondary_category_any_of: Optional[str] = None,
829
+ secondary_category_gt: Optional[str] = None,
830
+ secondary_category_gte: Optional[str] = None,
831
+ secondary_category_lt: Optional[str] = None,
832
+ secondary_category_lte: Optional[str] = None,
833
+ tertiary_category: Optional[str] = None,
834
+ tertiary_category_any_of: Optional[str] = None,
835
+ tertiary_category_gt: Optional[str] = None,
836
+ tertiary_category_gte: Optional[str] = None,
837
+ tertiary_category_lt: Optional[str] = None,
838
+ tertiary_category_lte: Optional[str] = None,
839
+ limit: Optional[int] = None,
840
+ sort: Optional[Union[str, Sort]] = None,
841
+ params: Optional[Dict[str, Any]] = None,
842
+ raw: bool = False,
843
+ options: Optional[RequestOptionBuilder] = None,
844
+ ) -> Union[Iterator[RiskFactorTaxonomy], HTTPResponse]:
845
+ """
846
+ Endpoint: GET /stocks/taxonomies/vX/risk-factors
847
+ """
848
+ url = "/stocks/taxonomies/vX/risk-factors"
849
+ return self._paginate(
850
+ path=url,
851
+ params=self._get_params(self.list_stocks_taxonomies_risk_factors, locals()),
852
+ raw=raw,
853
+ deserializer=RiskFactorTaxonomy.from_dict,
854
+ options=options,
855
+ )
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "massive"
3
- version = "v2.0.2"
3
+ version = "2.1.0"
4
4
  description = "Official Massive (formerly Polygon.io) REST and Websocket client."
5
5
  authors = ["massive.com"]
6
6
  license = "MIT"
@@ -27,20 +27,20 @@ packages = [
27
27
  python = "^3.9"
28
28
  urllib3 = ">=1.26.9"
29
29
  websockets = ">=14.0"
30
- certifi = ">=2022.5.18,<2026.0.0"
30
+ certifi = ">=2022.5.18,<2027.0.0"
31
31
 
32
32
  [tool.poetry.dev-dependencies]
33
33
  black = "^24.8.0"
34
- mypy = "^1.18"
34
+ mypy = "^1.19"
35
35
  types-urllib3 = "^1.26.25"
36
36
  Sphinx = "^7.4.7"
37
- sphinx-rtd-theme = "^3.0.2"
37
+ sphinx-rtd-theme = "^3.1.0"
38
38
  # keep this in sync with docs/requirements.txt for readthedocs.org
39
39
  sphinx-autodoc-typehints = "^2.3.0"
40
40
  types-certifi = "^2021.10.8"
41
41
  types-setuptools = "^80.9.0"
42
42
  pook = "^2.1.4"
43
- orjson = "^3.11.4"
43
+ orjson = "^3.11.5"
44
44
 
45
45
  [build-system]
46
46
  requires = ["poetry-core>=1.0.0"]
@@ -1,21 +0,0 @@
1
- from typing import Optional
2
- from ...modelclass import modelclass
3
-
4
-
5
- @modelclass
6
- class Dividend:
7
- "Dividend contains data for a historical cash dividend, including the ticker symbol, declaration date, ex-dividend date, record date, pay date, frequency, and amount."
8
- id: Optional[int] = None
9
- cash_amount: Optional[float] = None
10
- currency: Optional[str] = None
11
- declaration_date: Optional[str] = None
12
- dividend_type: Optional[str] = None
13
- ex_dividend_date: Optional[str] = None
14
- frequency: Optional[int] = None
15
- pay_date: Optional[str] = None
16
- record_date: Optional[str] = None
17
- ticker: Optional[str] = None
18
-
19
- @staticmethod
20
- def from_dict(d):
21
- return Dividend(**d)
@@ -1,16 +0,0 @@
1
- from typing import Optional
2
- from ...modelclass import modelclass
3
-
4
-
5
- @modelclass
6
- class Split:
7
- "Split contains data for a historical stock split, including the ticker symbol, the execution date, and the factors of the split ratio."
8
- id: Optional[int] = None
9
- execution_date: Optional[str] = None
10
- split_from: Optional[int] = None
11
- split_to: Optional[int] = None
12
- ticker: Optional[str] = None
13
-
14
- @staticmethod
15
- def from_dict(d):
16
- return Split(**d)
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes