btgsolutions-dataservices-python-client 4.3.0__tar.gz → 4.3.2__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 (49) hide show
  1. {btgsolutions_dataservices_python_client-4.3.0/btgsolutions_dataservices_python_client.egg-info → btgsolutions_dataservices_python_client-4.3.2}/PKG-INFO +1 -1
  2. {btgsolutions_dataservices_python_client-4.3.0 → btgsolutions_dataservices_python_client-4.3.2}/btgsolutions_dataservices/__init__.py +1 -1
  3. {btgsolutions_dataservices_python_client-4.3.0 → btgsolutions_dataservices_python_client-4.3.2}/btgsolutions_dataservices/rest/alternative_data_catalog.py +207 -39
  4. {btgsolutions_dataservices_python_client-4.3.0 → btgsolutions_dataservices_python_client-4.3.2}/btgsolutions_dataservices/rest/alternative_data_companies.py +16 -3
  5. {btgsolutions_dataservices_python_client-4.3.0 → btgsolutions_dataservices_python_client-4.3.2}/btgsolutions_dataservices/rest/alternative_data_funds.py +8 -0
  6. {btgsolutions_dataservices_python_client-4.3.0 → btgsolutions_dataservices_python_client-4.3.2}/btgsolutions_dataservices/rest/alternative_data_macro_markets.py +36 -9
  7. {btgsolutions_dataservices_python_client-4.3.0 → btgsolutions_dataservices_python_client-4.3.2}/btgsolutions_dataservices/rest/alternative_data_metadata.py +10 -4
  8. {btgsolutions_dataservices_python_client-4.3.0 → btgsolutions_dataservices_python_client-4.3.2}/btgsolutions_dataservices/rest/alternative_data_ownership.py +62 -14
  9. {btgsolutions_dataservices_python_client-4.3.0 → btgsolutions_dataservices_python_client-4.3.2/btgsolutions_dataservices_python_client.egg-info}/PKG-INFO +1 -1
  10. {btgsolutions_dataservices_python_client-4.3.0 → btgsolutions_dataservices_python_client-4.3.2}/LICENSE +0 -0
  11. {btgsolutions_dataservices_python_client-4.3.0 → btgsolutions_dataservices_python_client-4.3.2}/MANIFEST.in +0 -0
  12. {btgsolutions_dataservices_python_client-4.3.0 → btgsolutions_dataservices_python_client-4.3.2}/README.md +0 -0
  13. {btgsolutions_dataservices_python_client-4.3.0 → btgsolutions_dataservices_python_client-4.3.2}/btgsolutions_dataservices/config.py +0 -0
  14. {btgsolutions_dataservices_python_client-4.3.0 → btgsolutions_dataservices_python_client-4.3.2}/btgsolutions_dataservices/exceptions.py +0 -0
  15. {btgsolutions_dataservices_python_client-4.3.0 → btgsolutions_dataservices_python_client-4.3.2}/btgsolutions_dataservices/rest/__init__.py +0 -0
  16. {btgsolutions_dataservices_python_client-4.3.0 → btgsolutions_dataservices_python_client-4.3.2}/btgsolutions_dataservices/rest/alternative_data_people.py +0 -0
  17. {btgsolutions_dataservices_python_client-4.3.0 → btgsolutions_dataservices_python_client-4.3.2}/btgsolutions_dataservices/rest/authenticator.py +0 -0
  18. {btgsolutions_dataservices_python_client-4.3.0 → btgsolutions_dataservices_python_client-4.3.2}/btgsolutions_dataservices/rest/book_scope.py +0 -0
  19. {btgsolutions_dataservices_python_client-4.3.0 → btgsolutions_dataservices_python_client-4.3.2}/btgsolutions_dataservices/rest/broker_analytics.py +0 -0
  20. {btgsolutions_dataservices_python_client-4.3.0 → btgsolutions_dataservices_python_client-4.3.2}/btgsolutions_dataservices/rest/broker_reference.py +0 -0
  21. {btgsolutions_dataservices_python_client-4.3.0 → btgsolutions_dataservices_python_client-4.3.2}/btgsolutions_dataservices/rest/bulk_data.py +0 -0
  22. {btgsolutions_dataservices_python_client-4.3.0 → btgsolutions_dataservices_python_client-4.3.2}/btgsolutions_dataservices/rest/company_data.py +0 -0
  23. {btgsolutions_dataservices_python_client-4.3.0 → btgsolutions_dataservices_python_client-4.3.2}/btgsolutions_dataservices/rest/corporate_events.py +0 -0
  24. {btgsolutions_dataservices_python_client-4.3.0 → btgsolutions_dataservices_python_client-4.3.2}/btgsolutions_dataservices/rest/dataservices_catalog.py +0 -0
  25. {btgsolutions_dataservices_python_client-4.3.0 → btgsolutions_dataservices_python_client-4.3.2}/btgsolutions_dataservices/rest/hfn.py +0 -0
  26. {btgsolutions_dataservices_python_client-4.3.0 → btgsolutions_dataservices_python_client-4.3.2}/btgsolutions_dataservices/rest/historical_candles.py +0 -0
  27. {btgsolutions_dataservices_python_client-4.3.0 → btgsolutions_dataservices_python_client-4.3.2}/btgsolutions_dataservices/rest/historical_candles_crypto.py +0 -0
  28. {btgsolutions_dataservices_python_client-4.3.0 → btgsolutions_dataservices_python_client-4.3.2}/btgsolutions_dataservices/rest/intraday_candles.py +0 -0
  29. {btgsolutions_dataservices_python_client-4.3.0 → btgsolutions_dataservices_python_client-4.3.2}/btgsolutions_dataservices/rest/intraday_tick_data.py +0 -0
  30. {btgsolutions_dataservices_python_client-4.3.0 → btgsolutions_dataservices_python_client-4.3.2}/btgsolutions_dataservices/rest/public_sources.py +0 -0
  31. {btgsolutions_dataservices_python_client-4.3.0 → btgsolutions_dataservices_python_client-4.3.2}/btgsolutions_dataservices/rest/quotes.py +0 -0
  32. {btgsolutions_dataservices_python_client-4.3.0 → btgsolutions_dataservices_python_client-4.3.2}/btgsolutions_dataservices/rest/reference_data.py +0 -0
  33. {btgsolutions_dataservices_python_client-4.3.0 → btgsolutions_dataservices_python_client-4.3.2}/btgsolutions_dataservices/rest/stock_loan.py +0 -0
  34. {btgsolutions_dataservices_python_client-4.3.0 → btgsolutions_dataservices_python_client-4.3.2}/btgsolutions_dataservices/rest/ticker_last_event.py +0 -0
  35. {btgsolutions_dataservices_python_client-4.3.0 → btgsolutions_dataservices_python_client-4.3.2}/btgsolutions_dataservices/rest/ticker_last_event_polling.py +0 -0
  36. {btgsolutions_dataservices_python_client-4.3.0 → btgsolutions_dataservices_python_client-4.3.2}/btgsolutions_dataservices/websocket/__init__.py +0 -0
  37. {btgsolutions_dataservices_python_client-4.3.0 → btgsolutions_dataservices_python_client-4.3.2}/btgsolutions_dataservices/websocket/broker_analytics.py +0 -0
  38. {btgsolutions_dataservices_python_client-4.3.0 → btgsolutions_dataservices_python_client-4.3.2}/btgsolutions_dataservices/websocket/hfn_websocket_client.py +0 -0
  39. {btgsolutions_dataservices_python_client-4.3.0 → btgsolutions_dataservices_python_client-4.3.2}/btgsolutions_dataservices/websocket/market_data_feed.py +0 -0
  40. {btgsolutions_dataservices_python_client-4.3.0 → btgsolutions_dataservices_python_client-4.3.2}/btgsolutions_dataservices/websocket/market_data_websocket_client.py +0 -0
  41. {btgsolutions_dataservices_python_client-4.3.0 → btgsolutions_dataservices_python_client-4.3.2}/btgsolutions_dataservices/websocket/websocket_default_functions.py +0 -0
  42. {btgsolutions_dataservices_python_client-4.3.0 → btgsolutions_dataservices_python_client-4.3.2}/btgsolutions_dataservices_python_client.egg-info/SOURCES.txt +0 -0
  43. {btgsolutions_dataservices_python_client-4.3.0 → btgsolutions_dataservices_python_client-4.3.2}/btgsolutions_dataservices_python_client.egg-info/dependency_links.txt +0 -0
  44. {btgsolutions_dataservices_python_client-4.3.0 → btgsolutions_dataservices_python_client-4.3.2}/btgsolutions_dataservices_python_client.egg-info/requires.txt +0 -0
  45. {btgsolutions_dataservices_python_client-4.3.0 → btgsolutions_dataservices_python_client-4.3.2}/btgsolutions_dataservices_python_client.egg-info/top_level.txt +0 -0
  46. {btgsolutions_dataservices_python_client-4.3.0 → btgsolutions_dataservices_python_client-4.3.2}/pyproject.toml +0 -0
  47. {btgsolutions_dataservices_python_client-4.3.0 → btgsolutions_dataservices_python_client-4.3.2}/requirements.txt +0 -0
  48. {btgsolutions_dataservices_python_client-4.3.0 → btgsolutions_dataservices_python_client-4.3.2}/setup.cfg +0 -0
  49. {btgsolutions_dataservices_python_client-4.3.0 → btgsolutions_dataservices_python_client-4.3.2}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: btgsolutions_dataservices_python_client
3
- Version: 4.3.0
3
+ Version: 4.3.2
4
4
  Summary: Python package containing several classes and data for extracting and manipulating market and trading data.
5
5
  Home-page: https://github.com/BTG-Pactual-Solutions/btgsolutions-dataservices-python-client
6
6
  Author: BTG Solutions Data Services powered by BTG Pactual Solutions
@@ -1,4 +1,4 @@
1
- __version__ = "4.3.0"
1
+ __version__ = "4.3.2"
2
2
 
3
3
  from .websocket import *
4
4
  from .rest import *
@@ -33,10 +33,103 @@ PUBLIC_SOURCES_CONVENTIONS: dict[str, str] = {
33
33
 
34
34
 
35
35
  PUBLIC_SOURCES_DATA_GAPS: dict[str, str] = {
36
+ "get_macro_indicators": (
37
+ "Macro-indicator rows are heterogeneous across sources. Inspect the "
38
+ "returned indicator, source, type/subseries, unit and date fields before "
39
+ "aggregating or comparing values. The metadata endpoint is discovery "
40
+ "help, but accepted aggregate aliases such as ipca can still return "
41
+ "valid rows even when a related granular code such as "
42
+ "ipca_contributions is also listed. Use the returned row fields to "
43
+ "separate aggregate IPCA/Selic observations from contribution or "
44
+ "category rows."
45
+ ),
46
+ "sector_taxonomy_labels": (
47
+ "B3 sector, subsector and segment labels are upstream taxonomy labels. "
48
+ "Use the exact strings returned by get_taxonomy or get_company_sector "
49
+ "when calling get_sector_companies; punctuation and spelling variations "
50
+ "can change matches."
51
+ ),
52
+ "get_company_board": (
53
+ "For Brazilian companies, body='board' can include Conselho Fiscal rows "
54
+ "alongside Conselho de Administracao rows depending on the filing. For "
55
+ "a board-of-directors answer, filter returned rows by governance_body "
56
+ "or role to keep Conselho de Administracao only. Committee responses "
57
+ "can include broad aggregates such as Outros Comites; do not infer "
58
+ "granular committee names unless they are present in returned fields."
59
+ ),
60
+ "get_financial_statements": (
61
+ "company_id may be omitted only for universe-level screens or rankings. "
62
+ "There is no dedicated latest-quarter discovery field; when a requested "
63
+ "quarter returns zero rows, back off to the latest filed quarter and "
64
+ "state which quarter was used. statement_type is a presentation/filter "
65
+ "such as consolidated or individual when supported; DFP/ITR are filing "
66
+ "source concepts and can appear in returned fields, but they are not "
67
+ "the right filter for cross-company consolidated rankings."
68
+ ),
69
+ "get_fund_exposures": (
70
+ "Fund exposure dimensions are source-dependent. For Brazilian ETFs, "
71
+ "issuer exposure can be based on ticker-like issuer labels and country "
72
+ "exposure can be empty when the source does not classify country. Use "
73
+ "holdings for constituent-level economic exposure and exposures for "
74
+ "aggregate context."
75
+ ),
76
+ "get_fund_lookthrough": (
77
+ "Look-through is useful when a fund holds other funds that can be "
78
+ "expanded. For direct-equity ETFs, look-through can return opaque "
79
+ "asset_key values or zero lookthrough_weight when nested weights cannot "
80
+ "be resolved. In those cases, use get_fund_holdings and "
81
+ "get_fund_exposures for the defensible exposure analysis."
82
+ ),
36
83
  "get_top_shareholders": (
37
- "Shareholder snapshots can be empty for listed companies. Prefer "
38
- "get_ownership_current, get_control_group or get_free_float for current "
39
- "ownership context when this endpoint returns no rows."
84
+ "Top-shareholder snapshots come from the normalized ownership_snapshot "
85
+ "layer. For Brazilian listed companies, CVM/FRE rows are periodic "
86
+ "filing snapshots, often annual or quarterly reference dates. When "
87
+ "reference_date is omitted, the endpoint uses the latest loaded "
88
+ "snapshot per ownership_category; when reference_date is provided, it "
89
+ "must match an exact loaded snapshot date. For Brazilian ownership context, "
90
+ "prefer get_ownership_current, get_ownership_control_group, "
91
+ "get_ownership_free_float and get_ownership_official_notices when this "
92
+ "endpoint returns no rows. "
93
+ "This endpoint does not synthesize top holders from current ownership "
94
+ "or free-float tables. Some responses can include multiple rows for "
95
+ "the same holder across share classes, ownership categories, filings "
96
+ "or source protocols; inspect category, class, protocol/source and "
97
+ "reference date before aggregating percentages."
98
+ ),
99
+ "ownership_reporting_dates": (
100
+ "Brazilian ownership and free-float reference_date fields often come "
101
+ "from CVM/FRE reporting periods, fiscal-year bases or parsed IR "
102
+ "structures. They are reporting/reference dates, not necessarily the "
103
+ "calendar date when the data was loaded or a strict as-of timestamp; a "
104
+ "reference_date can be after the current calendar date when it denotes "
105
+ "a filing year/base period."
106
+ ),
107
+ "get_ownership_history": (
108
+ "Ownership history uses the same normalized ownership_snapshot layer as "
109
+ "top-shareholders and returns only loaded snapshot reference dates. "
110
+ "For Brazilian listed companies, CVM/FRE snapshots are periodic filing "
111
+ "dates rather than guaranteed calendar month-ends. It can return an "
112
+ "empty snapshots list when the snapshot layer has no rows for the "
113
+ "selected company/date/category filter. Use get_ownership_change_events "
114
+ "and get_ownership_official_notices for event/document timelines when "
115
+ "snapshots are empty; this endpoint does not synthesize history from "
116
+ "notice or current-ownership tables."
117
+ ),
118
+ "get_ownership_official_notices": (
119
+ "The response has multiple evidence blocks: official_notices, "
120
+ "ir_page_sources and ir_structures. start_date/end_date filter the "
121
+ "official_notices block; IR page/source metadata or parsed IR "
122
+ "structures can still be returned when that official-notice range is "
123
+ "empty. Use official_notices download_url values with "
124
+ "get_notice_summary; use ir_page_sources/ir_structures as discovery or "
125
+ "parser-status evidence, not as filed notice documents."
126
+ ),
127
+ "get_maximum_theoretical_margin": (
128
+ "discount_margin is the B3 haircut/desagio percentage value from the "
129
+ "maximum-theoretical-margin reference file, not a decimal fraction. "
130
+ "base_value is the B3 reference/base value in that file and should not "
131
+ "be treated as a live quote or a credit decision value. Use quotes and "
132
+ "liquidity endpoints separately when contextualizing the margin data."
40
133
  ),
41
134
  "get_beneficial_ownership": (
42
135
  "Coverage is UK/US oriented: UK Companies House PSC and US SEC proxy "
@@ -45,8 +138,13 @@ PUBLIC_SOURCES_DATA_GAPS: dict[str, str] = {
45
138
  "and free-float endpoints for Brazilian ownership context."
46
139
  ),
47
140
  "get_asset_institutional_holders": (
48
- "Institutional-holder coverage can be sparse. get_asset_fund_holders "
49
- "often has richer data for B3-listed assets."
141
+ "Institutional-holder coverage can be sparse for B3-listed assets and "
142
+ "can return zero rows for tickers that still have fund-holder or ETF "
143
+ "holder coverage. This endpoint reads the precomputed asset-holder "
144
+ "layer and ownership_snapshot fund_holder fallback; it does not run the "
145
+ "live fund-portfolio/ETF holding lookup used by get_asset_fund_holders. "
146
+ "Use get_asset_fund_holders for Brazilian assets when this endpoint is "
147
+ "empty."
50
148
  ),
51
149
  "get_disclosure_documents_repurchase": (
52
150
  "Share-repurchase disclosure coverage can be thin for many companies. "
@@ -62,7 +160,20 @@ PUBLIC_SOURCES_DATA_GAPS: dict[str, str] = {
62
160
  "get_dpmfi": (
63
161
  "DPMFi can be slow when queried without a snapshot or reference-month "
64
162
  "filter. Prefer snapshot_date for reproducibility and start_date/end_date "
65
- "in YYYY-MM when a narrow period is known."
163
+ "in YYYY-MM when a narrow period is known. When snapshot_date is omitted "
164
+ "the latest available snapshot is used; to discover that snapshot for a "
165
+ "reproducible follow-up call, make a narrow latest query and inspect "
166
+ "the returned snapshot/partition date fields."
167
+ ),
168
+ "get_dpmfi_composition": (
169
+ "DPMFi PAF composition is a forward projection table. The latest "
170
+ "snapshot usually covers only the two reference months after the latest "
171
+ "official DPMFi stock observation; older or outside-window "
172
+ "start_date/end_date filters can return zero rows. bond_type uses PAF "
173
+ "categories Prefixado, IPCA, Selic or Total, not security acronyms such "
174
+ "as LTN, LFT, NTN-B or NTN-F. Use get_dpmfi for official stock by "
175
+ "security acronym/status and get_dpmfi_composition for PAF projection "
176
+ "composition; do not join bond_type values one-to-one across the two."
66
177
  ),
67
178
  }
68
179
 
@@ -86,7 +197,8 @@ PUBLIC_SOURCES_ENDPOINT_RELATIONSHIPS: dict[str, str] = {
86
197
  "macro_indicator_discovery": (
87
198
  "Use AlternativeDataMetadata.get_available_indicators before "
88
199
  "AlternativeDataMacroMarkets.get_macro_indicators when the requested "
89
- "macro series code is uncertain."
200
+ "macro series code is uncertain, then inspect the returned rows because "
201
+ "macro endpoints can expose both aggregate and granular series."
90
202
  ),
91
203
  "asset_discovery": (
92
204
  "Use AlternativeDataMetadata.get_available_assets to discover asset or "
@@ -101,7 +213,8 @@ PUBLIC_SOURCES_ENDPOINT_RELATIONSHIPS: dict[str, str] = {
101
213
  "Use get_taxonomy or get_sectors_summary to understand available B3/CNAE "
102
214
  "classification values, get_company_sector to classify one company, and "
103
215
  "get_sector_companies to retrieve the peer set for a sector, subsector "
104
- "or segment."
216
+ "or segment. Pass the exact returned taxonomy labels into "
217
+ "get_sector_companies rather than normalized or guessed strings."
105
218
  ),
106
219
  "document_summary": (
107
220
  "Use AlternativeDataCompanies.get_assemblies or "
@@ -296,13 +409,15 @@ PUBLIC_SOURCES_ENDPOINTS: dict[str, dict[str, Any]] = {
296
409
  "description": (
297
410
  "Get the complete sector/classification taxonomy for B3 or CNAE. "
298
411
  "Use B3 for exchange sector, subsector and segment hierarchy; use "
299
- "CNAE for Brazilian economic activity codes."
412
+ "CNAE for Brazilian economic activity codes. Reuse returned labels "
413
+ "exactly when filtering peer companies."
300
414
  ),
301
415
  "parameters": {
302
416
  "system": "Classification system, usually 'b3' or 'cnae'.",
303
417
  "limit": "Maximum number of taxonomy rows.",
304
418
  },
305
419
  "relationships": ["sector_peer_set", "sector_market_peer_bridge"],
420
+ "caveats": [PUBLIC_SOURCES_DATA_GAPS["sector_taxonomy_labels"]],
306
421
  },
307
422
  "AlternativeDataMetadata.get_cnae": {
308
423
  "category": "metadata",
@@ -324,13 +439,15 @@ PUBLIC_SOURCES_ENDPOINTS: dict[str, dict[str, Any]] = {
324
439
  "description": (
325
440
  "Get sector classification for a company or listed asset. Rows "
326
441
  "include B3 sector, subsector and segment plus registered "
327
- "headquarters state and municipality when available."
442
+ "headquarters state and municipality when available. Reuse returned "
443
+ "sector labels exactly when building peer sets."
328
444
  ),
329
445
  "parameters": {"identifier": "Ticker, CNPJ, CVM code, ISIN or company name."},
330
446
  "relationships": [
331
447
  "sector_peer_set", "company_resolution",
332
448
  "company_trading_bridge", "sector_market_peer_bridge",
333
449
  ],
450
+ "caveats": [PUBLIC_SOURCES_DATA_GAPS["sector_taxonomy_labels"]],
334
451
  },
335
452
  "AlternativeDataMetadata.get_sector_companies": {
336
453
  "category": "metadata",
@@ -339,7 +456,9 @@ PUBLIC_SOURCES_ENDPOINTS: dict[str, dict[str, Any]] = {
339
456
  "client": "AlternativeDataMetadata",
340
457
  "description": (
341
458
  "List companies classified in a B3 sector, optionally filtered by "
342
- "subsector and segment. Use active_only to restrict to active companies."
459
+ "subsector and segment. Use active_only to restrict to active "
460
+ "companies. For reliable matches, pass exact labels returned by "
461
+ "get_taxonomy or get_company_sector."
343
462
  ),
344
463
  "parameters": {
345
464
  "sector": "B3 sector name.",
@@ -349,6 +468,7 @@ PUBLIC_SOURCES_ENDPOINTS: dict[str, dict[str, Any]] = {
349
468
  "limit": "Maximum number of companies.",
350
469
  },
351
470
  "relationships": ["sector_peer_set", "sector_market_peer_bridge"],
471
+ "caveats": [PUBLIC_SOURCES_DATA_GAPS["sector_taxonomy_labels"]],
352
472
  },
353
473
  "AlternativeDataMetadata.get_sectors_summary": {
354
474
  "category": "metadata",
@@ -371,7 +491,9 @@ PUBLIC_SOURCES_ENDPOINTS: dict[str, dict[str, Any]] = {
371
491
  "description": (
372
492
  "Get Brazilian macroeconomic or public fiscal time-series observations. "
373
493
  "Indicator values include selic, ipca, ipca_contributions, "
374
- "ipca_categories, copom, pim, pmc, pms, pnad, gdp, comexstat and rreo."
494
+ "ipca_categories, copom, pim, pmc, pms, pnad, gdp, comexstat and "
495
+ "rreo. Returned units, date grains and row fields vary by indicator "
496
+ "and source."
375
497
  ),
376
498
  "parameters": {
377
499
  "indicator": "Macro indicator code.",
@@ -388,6 +510,7 @@ PUBLIC_SOURCES_ENDPOINTS: dict[str, dict[str, Any]] = {
388
510
  "offset": "Pagination offset.",
389
511
  },
390
512
  "relationships": ["macro_indicator_discovery", "macro_market_bridge"],
513
+ "caveats": [PUBLIC_SOURCES_DATA_GAPS["get_macro_indicators"]],
391
514
  },
392
515
  "AlternativeDataMacroMarkets.get_maximum_theoretical_margin": {
393
516
  "category": "market_data_reference",
@@ -406,13 +529,16 @@ PUBLIC_SOURCES_ENDPOINTS: dict[str, dict[str, Any]] = {
406
529
  "origin": "Optional origin market filter.",
407
530
  "start_date": "Start date in YYYY-MM-DD.",
408
531
  "end_date": "End date in YYYY-MM-DD.",
409
- "min_margin": "Lower bound for discount_margin.",
410
- "max_margin": "Upper bound for discount_margin.",
532
+ "min_margin": "Lower bound for discount_margin percentage value.",
533
+ "max_margin": "Upper bound for discount_margin percentage value.",
411
534
  "limit": "Maximum number of rows.",
412
535
  "offset": "Pagination offset.",
413
536
  },
414
537
  "relationships": ["asset_discovery", "company_trading_bridge"],
415
- "caveats": [PUBLIC_SOURCES_EXCLUDED_ENDPOINTS["market-data/investor-categories"]],
538
+ "caveats": [
539
+ PUBLIC_SOURCES_DATA_GAPS["get_maximum_theoretical_margin"],
540
+ PUBLIC_SOURCES_EXCLUDED_ENDPOINTS["market-data/investor-categories"],
541
+ ],
416
542
  },
417
543
  "AlternativeDataMacroMarkets.get_dpmfi": {
418
544
  "category": "macro",
@@ -421,7 +547,9 @@ PUBLIC_SOURCES_ENDPOINTS: dict[str, dict[str, Any]] = {
421
547
  "client": "AlternativeDataMacroMarkets",
422
548
  "description": (
423
549
  "Get monthly stock of DPMFi, Brazilian federal domestic public debt, "
424
- "by indexer such as LTN, LFT, NTN-B, NTN-F and Demais."
550
+ "by security acronym/indexer such as LTN, LFT, NTN-B, NTN-F and "
551
+ "Demais. This is the official/projection/estimated stock series, "
552
+ "not the PAF composition projection."
425
553
  ),
426
554
  "parameters": {
427
555
  "start_date": "Reference month start in YYYY-MM.",
@@ -439,8 +567,11 @@ PUBLIC_SOURCES_ENDPOINTS: dict[str, dict[str, Any]] = {
439
567
  "method": "GET",
440
568
  "client": "AlternativeDataMacroMarkets",
441
569
  "description": (
442
- "Get DPMFi PAF composition projections: issuances, maturities and "
443
- "final stock by bond type for months after the latest official data."
570
+ "Get DPMFi PAF composition projections: new issuances, "
571
+ "end-of-month outstanding stock and share of total DPMFi debt by "
572
+ "bond category for the forward months available in the selected "
573
+ "snapshot. Returned row fields are reference_date, bond_type, "
574
+ "emissoes, estoque_final and perc_divida."
444
575
  ),
445
576
  "parameters": {
446
577
  "start_date": "Reference month start in YYYY-MM.",
@@ -450,6 +581,7 @@ PUBLIC_SOURCES_ENDPOINTS: dict[str, dict[str, Any]] = {
450
581
  "limit": "Maximum number of rows.",
451
582
  "offset": "Pagination offset.",
452
583
  },
584
+ "caveats": [PUBLIC_SOURCES_DATA_GAPS["get_dpmfi_composition"]],
453
585
  },
454
586
  "AlternativeDataCompanies.get_board": {
455
587
  "category": "companies",
@@ -459,7 +591,9 @@ PUBLIC_SOURCES_ENDPOINTS: dict[str, dict[str, Any]] = {
459
591
  "description": (
460
592
  "Get members of a company's governance body. body can be board, "
461
593
  "executive or committee; committee filters a specific committee when "
462
- "body='committee'."
594
+ "body='committee'. For Brazilian filings, body='board' can include "
595
+ "Conselho Fiscal rows; filter governance_body/role for Conselho de "
596
+ "Administracao when answering board-of-directors questions."
463
597
  ),
464
598
  "parameters": {
465
599
  "company_id": PUBLIC_SOURCES_CONVENTIONS["company_id"],
@@ -471,6 +605,7 @@ PUBLIC_SOURCES_ENDPOINTS: dict[str, dict[str, Any]] = {
471
605
  "offset": "Pagination offset.",
472
606
  },
473
607
  "relationships": ["company_resolution", "company_trading_bridge"],
608
+ "caveats": [PUBLIC_SOURCES_DATA_GAPS["get_company_board"]],
474
609
  },
475
610
  "AlternativeDataCompanies.get_governance_summary": {
476
611
  "category": "companies",
@@ -656,14 +791,18 @@ PUBLIC_SOURCES_ENDPOINTS: dict[str, dict[str, Any]] = {
656
791
  "description": (
657
792
  "Get company financial-statement line items from CVM filings. "
658
793
  "statement can be income_statement, balance_sheet or cash_flow; "
659
- "use account_code to retrieve a specific account."
794
+ "use account_code to retrieve a specific account. Omit company_id "
795
+ "only for universe-level screens or rankings."
660
796
  ),
661
797
  "parameters": {
662
- "company_id": PUBLIC_SOURCES_CONVENTIONS["company_id"],
798
+ "company_id": (
799
+ PUBLIC_SOURCES_CONVENTIONS["company_id"]
800
+ + " Omit only for universe-level screens or rankings."
801
+ ),
663
802
  "statement": "Statement type or alias, for example income_statement, balance_sheet or cash_flow.",
664
803
  "quarter": "Brazilian quarter code such as 1T24 or 4T24.",
665
804
  "reference_date": "Reference date in YYYY-MM-DD.",
666
- "statement_type": "Optional filing type filter such as DFP or ITR.",
805
+ "statement_type": "Optional presentation/filter such as consolidated or individual when supported.",
667
806
  "account_code": "Optional account code filter.",
668
807
  "limit": "Maximum number of line items.",
669
808
  "offset": "Pagination offset.",
@@ -673,6 +812,7 @@ PUBLIC_SOURCES_ENDPOINTS: dict[str, dict[str, Any]] = {
673
812
  "company_trading_bridge", "sector_market_peer_bridge",
674
813
  "macro_market_bridge",
675
814
  ],
815
+ "caveats": [PUBLIC_SOURCES_DATA_GAPS["get_financial_statements"]],
676
816
  },
677
817
  "AlternativeDataCompanies.get_financial_notes": {
678
818
  "category": "companies",
@@ -811,7 +951,8 @@ PUBLIC_SOURCES_ENDPOINTS: dict[str, dict[str, Any]] = {
811
951
  "description": (
812
952
  "Get aggregate exposures for a fund or ETF by dimension. "
813
953
  "exposure_type can be all, asset_class, issuer, sector, indexer, "
814
- "maturity or country."
954
+ "maturity or country. Use holdings for constituent-level exposure "
955
+ "when a dimension is sparse or source-dependent."
815
956
  ),
816
957
  "parameters": {
817
958
  "fund_id": PUBLIC_SOURCES_CONVENTIONS["fund_id"],
@@ -822,6 +963,7 @@ PUBLIC_SOURCES_ENDPOINTS: dict[str, dict[str, Any]] = {
822
963
  "fund_company_bridge", "sector_peer_set",
823
964
  "fund_market_exposure_bridge", "sector_market_peer_bridge",
824
965
  ],
966
+ "caveats": [PUBLIC_SOURCES_DATA_GAPS["get_fund_exposures"]],
825
967
  },
826
968
  "AlternativeDataFunds.get_history": {
827
969
  "category": "funds",
@@ -851,7 +993,8 @@ PUBLIC_SOURCES_ENDPOINTS: dict[str, dict[str, Any]] = {
851
993
  "client": "AlternativeDataFunds",
852
994
  "description": (
853
995
  "Get recursive look-through exposure for a fund or ETF. Use this to "
854
- "expand nested fund holdings into underlying assets when available."
996
+ "expand nested fund holdings into underlying assets when available; "
997
+ "for direct-equity ETFs, holdings and exposures can be more useful."
855
998
  ),
856
999
  "parameters": {
857
1000
  "fund_id": PUBLIC_SOURCES_CONVENTIONS["fund_id"],
@@ -859,6 +1002,7 @@ PUBLIC_SOURCES_ENDPOINTS: dict[str, dict[str, Any]] = {
859
1002
  "limit": "Maximum number of look-through rows.",
860
1003
  },
861
1004
  "relationships": ["fund_company_bridge", "fund_market_exposure_bridge"],
1005
+ "caveats": [PUBLIC_SOURCES_DATA_GAPS["get_fund_lookthrough"]],
862
1006
  },
863
1007
  "AlternativeDataFunds.get_manager_aggregate_holdings": {
864
1008
  "category": "funds",
@@ -885,12 +1029,17 @@ PUBLIC_SOURCES_ENDPOINTS: dict[str, dict[str, Any]] = {
885
1029
  "method": "GET",
886
1030
  "client": "AlternativeDataOwnership",
887
1031
  "description": (
888
- "Get top shareholders for a listed company when shareholder snapshots "
889
- "are loaded."
1032
+ "Get top shareholders for a company from the normalized "
1033
+ "ownership_snapshot layer when shareholder-level snapshots are "
1034
+ "available. Brazilian CVM/FRE rows are periodic filing snapshots."
890
1035
  ),
891
1036
  "parameters": {
892
1037
  "company_id": PUBLIC_SOURCES_CONVENTIONS["company_id"],
893
- "reference_date": "Reference date in YYYY-MM-DD; omitted means latest snapshot.",
1038
+ "reference_date": (
1039
+ "Reference date in YYYY-MM-DD; omitted means latest loaded "
1040
+ "snapshot per ownership_category. Provided values are exact "
1041
+ "loaded snapshot dates, not as-of lookups."
1042
+ ),
894
1043
  "ownership_category": "Ownership category filter when supported.",
895
1044
  "limit": "Maximum number of shareholders.",
896
1045
  },
@@ -898,7 +1047,10 @@ PUBLIC_SOURCES_ENDPOINTS: dict[str, dict[str, Any]] = {
898
1047
  "company_resolution", "ownership_fallback",
899
1048
  "ownership_liquidity_bridge",
900
1049
  ],
901
- "caveats": [PUBLIC_SOURCES_DATA_GAPS["get_top_shareholders"]],
1050
+ "caveats": [
1051
+ PUBLIC_SOURCES_DATA_GAPS["get_top_shareholders"],
1052
+ PUBLIC_SOURCES_DATA_GAPS["ownership_reporting_dates"],
1053
+ ],
902
1054
  },
903
1055
  "AlternativeDataOwnership.get_ownership_current": {
904
1056
  "category": "ownership",
@@ -914,6 +1066,7 @@ PUBLIC_SOURCES_ENDPOINTS: dict[str, dict[str, Any]] = {
914
1066
  "company_resolution", "ownership_fallback",
915
1067
  "ownership_liquidity_bridge",
916
1068
  ],
1069
+ "caveats": [PUBLIC_SOURCES_DATA_GAPS["ownership_reporting_dates"]],
917
1070
  },
918
1071
  "AlternativeDataOwnership.get_ownership_history": {
919
1072
  "category": "ownership",
@@ -921,21 +1074,26 @@ PUBLIC_SOURCES_ENDPOINTS: dict[str, dict[str, Any]] = {
921
1074
  "method": "GET",
922
1075
  "client": "AlternativeDataOwnership",
923
1076
  "description": (
924
- "Get historical ownership snapshots for a company. Use "
925
- "ownership_category to filter ordinary, preferred or total categories "
926
- "when supported."
1077
+ "Get historical ownership snapshots for a company from the "
1078
+ "normalized ownership_snapshot layer. Brazilian CVM/FRE snapshots "
1079
+ "are periodic filing dates, not guaranteed month-end series. Use "
1080
+ "ownership_category to filter holder categories when supported."
927
1081
  ),
928
1082
  "parameters": {
929
1083
  "company_id": PUBLIC_SOURCES_CONVENTIONS["company_id"],
930
1084
  "start_date": "Start date in YYYY-MM-DD.",
931
1085
  "end_date": "End date in YYYY-MM-DD.",
932
1086
  "ownership_category": "Ownership category filter when supported.",
933
- "limit": "Maximum number of snapshots.",
1087
+ "limit": "Maximum number of snapshot reference dates.",
934
1088
  },
935
1089
  "relationships": [
936
1090
  "company_resolution", "ownership_fallback",
937
1091
  "ownership_liquidity_bridge",
938
1092
  ],
1093
+ "caveats": [
1094
+ PUBLIC_SOURCES_DATA_GAPS["get_ownership_history"],
1095
+ PUBLIC_SOURCES_DATA_GAPS["ownership_reporting_dates"],
1096
+ ],
939
1097
  },
940
1098
  "AlternativeDataOwnership.get_ownership_change_events": {
941
1099
  "category": "ownership",
@@ -958,6 +1116,7 @@ PUBLIC_SOURCES_ENDPOINTS: dict[str, dict[str, Any]] = {
958
1116
  "company_resolution", "ownership_fallback", "document_summary",
959
1117
  "ownership_liquidity_bridge", "document_market_event_bridge",
960
1118
  ],
1119
+ "caveats": [PUBLIC_SOURCES_DATA_GAPS["ownership_reporting_dates"]],
961
1120
  },
962
1121
  "AlternativeDataOwnership.get_ownership_official_notices": {
963
1122
  "category": "ownership",
@@ -965,9 +1124,10 @@ PUBLIC_SOURCES_ENDPOINTS: dict[str, dict[str, Any]] = {
965
1124
  "method": "GET",
966
1125
  "client": "AlternativeDataOwnership",
967
1126
  "description": (
968
- "Get official CVM/IPE ownership participation notices for a company. "
969
- "Use this to find filed documents and download URLs about shareholder "
970
- "participation changes."
1127
+ "Get official ownership notices and related IR evidence for a "
1128
+ "company. The response can contain official_notices, ir_page_sources "
1129
+ "and ir_structures; use official_notices download_url values for "
1130
+ "document summaries."
971
1131
  ),
972
1132
  "parameters": {
973
1133
  "company_id": PUBLIC_SOURCES_CONVENTIONS["company_id"],
@@ -980,6 +1140,10 @@ PUBLIC_SOURCES_ENDPOINTS: dict[str, dict[str, Any]] = {
980
1140
  "company_resolution", "ownership_fallback", "document_summary",
981
1141
  "ownership_liquidity_bridge", "document_market_event_bridge",
982
1142
  ],
1143
+ "caveats": [
1144
+ PUBLIC_SOURCES_DATA_GAPS["get_ownership_official_notices"],
1145
+ PUBLIC_SOURCES_DATA_GAPS["ownership_reporting_dates"],
1146
+ ],
983
1147
  },
984
1148
  "AlternativeDataOwnership.get_notice_summary": {
985
1149
  "category": "ownership",
@@ -1011,6 +1175,7 @@ PUBLIC_SOURCES_ENDPOINTS: dict[str, dict[str, Any]] = {
1011
1175
  "company_resolution", "ownership_fallback",
1012
1176
  "ownership_liquidity_bridge",
1013
1177
  ],
1178
+ "caveats": [PUBLIC_SOURCES_DATA_GAPS["ownership_reporting_dates"]],
1014
1179
  },
1015
1180
  "AlternativeDataOwnership.get_ownership_free_float": {
1016
1181
  "category": "ownership",
@@ -1029,6 +1194,7 @@ PUBLIC_SOURCES_ENDPOINTS: dict[str, dict[str, Any]] = {
1029
1194
  "company_resolution", "ownership_fallback",
1030
1195
  "ownership_liquidity_bridge",
1031
1196
  ],
1197
+ "caveats": [PUBLIC_SOURCES_DATA_GAPS["ownership_reporting_dates"]],
1032
1198
  },
1033
1199
  "AlternativeDataOwnership.get_shareholder_holdings": {
1034
1200
  "category": "ownership",
@@ -1055,8 +1221,9 @@ PUBLIC_SOURCES_ENDPOINTS: dict[str, dict[str, Any]] = {
1055
1221
  "method": "GET",
1056
1222
  "client": "AlternativeDataOwnership",
1057
1223
  "description": (
1058
- "Get institutional holders of an asset. identifier defaults to a B3 "
1059
- "ticker when identifier_type='b3_ticker'."
1224
+ "Get institutional holders of an asset from the precomputed "
1225
+ "asset-holder layer. identifier defaults to a B3 ticker when "
1226
+ "identifier_type='b3_ticker'."
1060
1227
  ),
1061
1228
  "parameters": {
1062
1229
  "identifier": PUBLIC_SOURCES_CONVENTIONS["asset_identifier"],
@@ -1073,8 +1240,9 @@ PUBLIC_SOURCES_ENDPOINTS: dict[str, dict[str, Any]] = {
1073
1240
  "method": "GET",
1074
1241
  "client": "AlternativeDataOwnership",
1075
1242
  "description": (
1076
- "Get investment funds holding a given asset. identifier defaults to "
1077
- "a B3 ticker when identifier_type='b3_ticker'."
1243
+ "Get investment funds or ETFs holding a given asset using fund "
1244
+ "portfolio and ETF holding snapshots. identifier defaults to a B3 "
1245
+ "ticker when identifier_type='b3_ticker'."
1078
1246
  ),
1079
1247
  "parameters": {
1080
1248
  "identifier": PUBLIC_SOURCES_CONVENTIONS["asset_identifier"],
@@ -103,6 +103,13 @@ class AlternativeDataCompanies:
103
103
  Use get_board_changes() for appointment/departure events and
104
104
  get_governance_history() for historical snapshot series.
105
105
 
106
+ For Brazilian filings, ``body='board'`` can include Conselho Fiscal
107
+ rows alongside Conselho de Administracao rows. For a board-of-directors
108
+ answer, filter returned rows by governance_body or role. Committee
109
+ responses can include broad aggregate groups such as Outros Comites; do
110
+ not infer granular committee names unless they are present in returned
111
+ fields.
112
+
106
113
  Parameters
107
114
  ----------------
108
115
  company_id: str
@@ -475,7 +482,7 @@ class AlternativeDataCompanies:
475
482
 
476
483
  def get_financial_statements(
477
484
  self,
478
- company_id: str,
485
+ company_id: Optional[str] = None,
479
486
  statement: str = "income_statement",
480
487
  quarter: Optional[str] = None,
481
488
  reference_date: Optional[str] = None,
@@ -490,11 +497,15 @@ class AlternativeDataCompanies:
490
497
  statement name or alias is uncertain. Quarter filters use Brazilian
491
498
  quarter codes such as 1T24 and 4T24.
492
499
 
500
+ Omit ``company_id`` only for universe-level screens or rankings; in
501
+ that mode, paginate with ``limit``/``offset`` and deduplicate repeated
502
+ filings by company and source document version before ranking.
503
+
493
504
  Parameters
494
505
  ----------------
495
506
  company_id: str
496
507
  Company identifier (CNPJ, CVM code, or B3 ticker).
497
- Field is required. Example: 'PETR4'.
508
+ Field is not required for universe-level screens. Example: 'PETR4'.
498
509
  statement: str
499
510
  Statement type (e.g. 'income_statement', 'balance_sheet', 'cash_flow').
500
511
  Field is not required. Default: 'income_statement'.
@@ -505,7 +516,9 @@ class AlternativeDataCompanies:
505
516
  Reference date in YYYY-MM-DD format.
506
517
  Field is not required.
507
518
  statement_type: str
508
- Statement type filter (e.g. 'DFP', 'ITR').
519
+ Statement presentation/filter when supported by the endpoint, such
520
+ as 'consolidated' or 'individual'. Some payloads also expose filing
521
+ source fields such as DFP/ITR separately; inspect returned columns.
509
522
  Field is not required.
510
523
  account_code: str
511
524
  Specific account code filter.
@@ -160,6 +160,10 @@ class AlternativeDataFunds:
160
160
  issuer, sector, indexer, maturity, country).
161
161
  Use sector exposure with company sector endpoints when comparing fund
162
162
  exposure with B3 company peer groups.
163
+ Exposure dimensions are source-dependent: for Brazilian ETFs, issuer
164
+ exposure can use ticker-like labels and country exposure can be empty
165
+ when not classified by the source. Use holdings for constituent-level
166
+ economic exposure when a dimension is sparse.
163
167
 
164
168
  Parameters
165
169
  ----------------
@@ -228,6 +232,10 @@ class AlternativeDataFunds:
228
232
  positions to underlying assets when available).
229
233
  Use this after holdings when nested fund positions need to be expanded
230
234
  into underlying assets.
235
+ For direct-equity ETFs, look-through can return opaque asset_key values
236
+ or zero lookthrough_weight when nested weights cannot be resolved. In
237
+ those cases, use get_holdings() and get_exposures() for exposure
238
+ analysis.
231
239
 
232
240
  Parameters
233
241
  ----------------
@@ -76,17 +76,25 @@ class AlternativeDataMacroMarkets:
76
76
  Use AlternativeDataMetadata.get_available_indicators() first when the
77
77
  indicator code is uncertain.
78
78
 
79
+ Macro rows are heterogeneous across sources. Inspect returned indicator,
80
+ source, type/subseries, unit and date fields before aggregating values.
81
+ Aggregate aliases such as ``ipca`` can return valid aggregate rows even
82
+ when related granular series such as ``ipca_contributions`` are listed
83
+ separately in metadata.
84
+
79
85
  Parameters
80
86
  ----------------
81
87
  indicator: str
82
88
  Macro indicator code.
83
89
  Field is required. Example: 'selic'.
84
90
  start_date: str
85
- Start of the query period in YYYY-MM format.
86
- Field is not required. Example: '2024-01'.
91
+ Start of the query period in YYYY-MM-DD format when supported by
92
+ the indicator.
93
+ Field is not required. Example: '2024-01-01'.
87
94
  end_date: str
88
- End of the query period in YYYY-MM format.
89
- Field is not required. Example: '2024-12'.
95
+ End of the query period in YYYY-MM-DD format when supported by the
96
+ indicator.
97
+ Field is not required. Example: '2024-12-31'.
90
98
  year: str
91
99
  Four-digit year filter (ComexStat and RREO).
92
100
  Field is not required.
@@ -148,6 +156,10 @@ class AlternativeDataMacroMarkets:
148
156
  Use AlternativeDataMetadata.get_available_assets() first when asset or
149
157
  instrument coverage is uncertain. This is a margin reference endpoint,
150
158
  not a quote/trade feed and not the investor-categories endpoint.
159
+ ``discount_margin`` is returned as a percentage value from the B3
160
+ reference file, not as a decimal fraction. ``base_value`` is the B3
161
+ file's reference/base value and should not be treated as a live quote
162
+ or a credit decision value.
151
163
 
152
164
  Parameters
153
165
  ----------------
@@ -170,10 +182,10 @@ class AlternativeDataMacroMarkets:
170
182
  End date of the query period in YYYY-MM-DD format.
171
183
  Field is not required.
172
184
  min_margin: float
173
- Lower bound filter on the discount_margin (haircut) value.
185
+ Lower bound filter on the discount_margin (haircut) percentage value.
174
186
  Field is not required.
175
187
  max_margin: float
176
- Upper bound filter on the discount_margin (haircut) value.
188
+ Upper bound filter on the discount_margin (haircut) percentage value.
177
189
  Field is not required.
178
190
  limit: int
179
191
  Maximum number of results to return.
@@ -207,6 +219,13 @@ class AlternativeDataMacroMarkets:
207
219
  """
208
220
  Monthly time-series of DPMFi (domestic federal public debt) outstanding
209
221
  stock broken down by bond type (NTN-B, LFT, NTN-F, LTN, Demais).
222
+ This endpoint returns official/projection/estimated stock series by
223
+ security acronym or indexer. Use get_dpmfi_composition() for PAF
224
+ composition projections by broad bond category.
225
+
226
+ When ``snapshot_date`` is omitted, the latest available snapshot is
227
+ used. To make a reproducible follow-up call, run a narrow latest query
228
+ and inspect the returned snapshot/partition date fields.
210
229
 
211
230
  Parameters
212
231
  ----------------
@@ -250,9 +269,17 @@ class AlternativeDataMacroMarkets:
250
269
  offset: int = 0,
251
270
  ) -> dict:
252
271
  """
253
- Monthly PAF composition by bond type: new issuances, end-of-month
254
- outstanding stock, and share of total DPMFi debt (Prefixado, IPCA,
255
- Selic, Total).
272
+ Monthly PAF composition by bond category: new issuances (``emissoes``),
273
+ end-of-month outstanding stock (``estoque_final``), and share of total
274
+ DPMFi debt (``perc_divida``) for Prefixado, IPCA, Selic and Total.
275
+
276
+ This endpoint covers the forward PAF projection months available in the
277
+ selected snapshot, usually the two months after the latest official
278
+ DPMFi stock observation. Filters outside the available reference-month
279
+ window return an empty but valid result. ``bond_type`` uses PAF
280
+ categories (Prefixado, IPCA, Selic, Total), not security acronyms such
281
+ as LTN, LFT, NTN-B or NTN-F. Do not join ``bond_type`` values one-to-one
282
+ with the security-acronym rows returned by get_dpmfi().
256
283
 
257
284
  Parameters
258
285
  ----------------
@@ -102,7 +102,9 @@ class AlternativeDataMetadata:
102
102
  List the available macro indicator codes for use with
103
103
  AlternativeDataMacroMarkets.get_macro_indicators().
104
104
  Use this metadata endpoint when the requested macro series code is
105
- uncertain before querying observations.
105
+ uncertain before querying observations. Treat this as discovery help,
106
+ then inspect returned macro rows because aggregate aliases such as
107
+ ipca and related granular series such as ipca_contributions can coexist.
106
108
  """
107
109
  return self._get("available-indicators", {})
108
110
 
@@ -242,7 +244,9 @@ class AlternativeDataMetadata:
242
244
  """
243
245
  Full sector taxonomy tree (B3 or CNAE classification system).
244
246
  Use this with get_company_sector(), get_sector_companies() and
245
- get_sectors_summary() to discover sector hierarchy and peer sets.
247
+ get_sectors_summary() to discover sector hierarchy and peer sets. B3
248
+ labels are upstream taxonomy labels; pass exact returned sector,
249
+ subsector and segment strings to get_sector_companies().
246
250
 
247
251
  Parameters
248
252
  ----------------
@@ -271,7 +275,8 @@ class AlternativeDataMetadata:
271
275
  """
272
276
  Sector classification for a company.
273
277
  Use get_sector_companies() with the returned sector/subsector/segment
274
- values to retrieve peers in the same B3 classification.
278
+ values to retrieve peers in the same B3 classification. Reuse the exact
279
+ returned labels, including punctuation and spelling.
275
280
 
276
281
  Parameters
277
282
  ----------------
@@ -292,7 +297,8 @@ class AlternativeDataMetadata:
292
297
  """
293
298
  Companies belonging to a given sector, subsector, or segment.
294
299
  Use get_taxonomy(), get_sectors_summary(), or get_company_sector() first
295
- to discover valid B3 sector/subsector/segment values.
300
+ to discover valid B3 sector/subsector/segment values. Filters should
301
+ use exact upstream labels; normalized or guessed strings can miss rows.
296
302
 
297
303
  Parameters
298
304
  ----------------
@@ -60,10 +60,23 @@ class AlternativeDataOwnership:
60
60
  limit: int = 20,
61
61
  ) -> dict:
62
62
  """
63
- Top shareholders for a company.
64
- Snapshot coverage can be empty. For current listed-company ownership
65
- context, prefer get_ownership_current(), get_ownership_control_group()
66
- or get_ownership_free_float() when this endpoint returns no rows.
63
+ Top shareholders for a company from the normalized ownership_snapshot
64
+ layer. For Brazilian listed companies, CVM/FRE rows are periodic filing
65
+ snapshots, often annual or quarterly reference dates. When
66
+ ``reference_date`` is omitted, the endpoint uses the latest loaded
67
+ snapshot per ownership_category; when ``reference_date`` is provided,
68
+ it must match a loaded snapshot date.
69
+
70
+ This endpoint does not synthesize current ownership from control/free
71
+ float tables; ``total=0`` means no matching rows were found in the
72
+ normalized snapshot layer for the selected company/date/category
73
+ filter. For Brazilian ownership questions, call get_ownership_current(),
74
+ get_ownership_control_group(), get_ownership_free_float() and
75
+ get_ownership_official_notices() when this endpoint returns no rows.
76
+ Some responses can include multiple rows for the same holder across
77
+ share classes, ownership categories, filings or source protocols;
78
+ inspect category, class, protocol/source and reference date before
79
+ aggregating percentages.
67
80
 
68
81
  Parameters
69
82
  ----------------
@@ -71,7 +84,9 @@ class AlternativeDataOwnership:
71
84
  Company identifier.
72
85
  Field is required. Example: 'VALE3'.
73
86
  reference_date: str
74
- Reference date in YYYY-MM-DD format. Defaults to the most recent snapshot.
87
+ Reference date in YYYY-MM-DD format. Defaults to the latest loaded
88
+ snapshot per ownership_category. When provided, it is an exact
89
+ loaded snapshot date, not an as-of lookup.
75
90
  Field is not required.
76
91
  ownership_category: str
77
92
  Ownership category filter.
@@ -92,6 +107,8 @@ class AlternativeDataOwnership:
92
107
  Current ownership structure snapshot for a company.
93
108
  Use this as the primary current ownership summary when top-shareholder
94
109
  snapshots are empty or when a compact ownership object is sufficient.
110
+ Reference dates usually come from CVM/FRE reporting periods or parsed
111
+ IR structures and are not necessarily strict as-of timestamps.
95
112
 
96
113
  Parameters
97
114
  ----------------
@@ -110,13 +127,23 @@ class AlternativeDataOwnership:
110
127
  limit: int = 12,
111
128
  ) -> dict:
112
129
  """
113
- Monthly ownership history snapshots for a company.
130
+ Historical ownership snapshots for a company from the same normalized
131
+ ownership_snapshot layer used by get_top_shareholders(). For Brazilian
132
+ listed companies, CVM/FRE snapshots are periodic filing dates rather
133
+ than guaranteed calendar month-ends. This endpoint does not synthesize
134
+ history from current ownership or notice tables. For Brazilian ownership
135
+ timelines, use get_ownership_change_events() and
136
+ get_ownership_official_notices() as the event/document sources when
137
+ snapshots are empty, and get_ownership_current(),
138
+ get_ownership_control_group() or get_ownership_free_float() for current
139
+ context. Reference dates usually come from reporting periods and can
140
+ denote a filing year/base period rather than the load date.
114
141
 
115
142
  Parameters
116
143
  ----------------
117
144
  company_id: str
118
145
  Company identifier.
119
- Field is required. Example: 'VALE3'.
146
+ Field is required. Example: 'PETR4'.
120
147
  start_date: str
121
148
  Start date in YYYY-MM-DD format.
122
149
  Field is not required.
@@ -127,7 +154,7 @@ class AlternativeDataOwnership:
127
154
  Ownership category filter.
128
155
  Field is not required. Default: 'all'.
129
156
  limit: int
130
- Maximum number of snapshots to return.
157
+ Maximum number of snapshot reference dates to return.
131
158
  Field is not required. Default: 12.
132
159
  """
133
160
  return self._get("companies/ownership-history", {
@@ -186,9 +213,18 @@ class AlternativeDataOwnership:
186
213
  limit: int = 100,
187
214
  ) -> dict:
188
215
  """
189
- Official ownership notices (CVM IPE, SEC 13D/13G/13F, IR page structures).
190
- Returned CVM RAD download URLs can be passed to get_notice_summary() for
191
- an AI-generated document summary.
216
+ Official ownership notices and related IR evidence for a company.
217
+
218
+ The response can contain three list blocks:
219
+ ``official_notices`` (CVM/IPE ownership-related disclosures and SEC
220
+ 13D/13G/13F summaries), ``ir_page_sources`` (candidate investor-relations
221
+ pages), and ``ir_structures`` (parsed IR ownership/free-float/control
222
+ structures, filterable by parser_status). start_date/end_date filter
223
+ the ``official_notices`` block; IR page/source metadata and parsed IR
224
+ structures are discovery/parser evidence and can still be returned when
225
+ the requested official-notice date range is empty. Returned CVM RAD
226
+ download URLs can be passed to get_notice_summary() for an AI-generated
227
+ document summary.
192
228
 
193
229
  Parameters
194
230
  ----------------
@@ -254,6 +290,8 @@ class AlternativeDataOwnership:
254
290
  Control group composition for a Brazilian company (CVM FRE).
255
291
  Use this for who controls the company; use get_shareholder_holdings()
256
292
  for a reverse lookup of one holder across companies.
293
+ Reference dates usually come from CVM/FRE reporting periods and can
294
+ denote a filing year/base period rather than the load date.
257
295
 
258
296
  Parameters
259
297
  ----------------
@@ -266,6 +304,9 @@ class AlternativeDataOwnership:
266
304
  def get_ownership_free_float(self, company_id: str, limit: int = 20) -> dict:
267
305
  """
268
306
  Free float breakdown for a company.
307
+ Reference dates usually come from CVM/FRE reporting periods or parsed
308
+ IR structures and can denote a filing year/base period rather than the
309
+ load date.
269
310
 
270
311
  Parameters
271
312
  ----------------
@@ -331,7 +372,13 @@ class AlternativeDataOwnership:
331
372
  limit: int = 50,
332
373
  ) -> dict:
333
374
  """
334
- Institutional holders of a specific asset.
375
+ Institutional holders of a specific asset from the precomputed
376
+ asset-holder layer. Coverage can be sparse for B3 tickers. This
377
+ endpoint does not run the live fund-portfolio/ETF holding lookup used
378
+ by get_fund_holders(); when this endpoint returns no holders,
379
+ get_fund_holders() is often the richer inverse relationship for
380
+ Brazilian assets because it uses fund portfolio and ETF holding
381
+ snapshots.
335
382
 
336
383
  Parameters
337
384
  ----------------
@@ -363,9 +410,10 @@ class AlternativeDataOwnership:
363
410
  limit: int = 50,
364
411
  ) -> dict:
365
412
  """
366
- Funds that hold a specific asset.
413
+ Funds or ETFs that hold a specific asset.
367
414
  This is the inverse relationship of fund holdings for a B3 asset and is
368
- often richer than institutional-holder coverage.
415
+ often richer than institutional-holder coverage because it uses fund
416
+ portfolio and ETF holding snapshots.
369
417
 
370
418
  Parameters
371
419
  ----------------
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: btgsolutions_dataservices_python_client
3
- Version: 4.3.0
3
+ Version: 4.3.2
4
4
  Summary: Python package containing several classes and data for extracting and manipulating market and trading data.
5
5
  Home-page: https://github.com/BTG-Pactual-Solutions/btgsolutions-dataservices-python-client
6
6
  Author: BTG Solutions Data Services powered by BTG Pactual Solutions