@@ -49,6 +49,46 @@ def get_filing_metadata(
4949 return result [0 ]
5050
5151
52+ def get_filing_metadatas_for_accession_numbers (
53+ * ,
54+ ticker_or_cik : str ,
55+ accession_numbers : list [str ],
56+ user_agent : str ,
57+ ticker_to_cik_mapping : dict [str , str ],
58+ include_amends : bool = False ,
59+ ) -> list [FilingMetadata ]:
60+ """
61+ Get metadata for multiple accession numbers efficiently.
62+ All accession numbers must belong to the same company (ticker_or_cik).
63+ """
64+ if not accession_numbers :
65+ return []
66+
67+ # Normalize accession numbers
68+ normalized_accession_numbers = []
69+ for accession_number in accession_numbers :
70+ if len (accession_number ) == 18 :
71+ accession_number = (
72+ f"{ accession_number [:10 ]} -{ accession_number [10 :12 ]} -{ accession_number [12 :]} "
73+ )
74+ if not accession_number_re .match (accession_number ):
75+ raise ValueError (f"Invalid Accession Number: { accession_number } " )
76+ normalized_accession_numbers .append (accession_number )
77+
78+ cik = validate_and_convert_ticker_or_cik (ticker_or_cik , ticker_to_cik_mapping )
79+
80+ # Get metadata for all accession numbers in bulk
81+ result = _get_metadatas (
82+ cik = cik ,
83+ user_agent = user_agent ,
84+ limit = len (normalized_accession_numbers ),
85+ accession_numbers = normalized_accession_numbers ,
86+ include_amends = include_amends ,
87+ )
88+
89+ return result
90+
91+
5292def get_latest_filings_metadata (
5393 * ,
5494 requested : RequestedFilings ,
@@ -94,13 +134,14 @@ def _get_metadatas(
94134 limit : int ,
95135 ticker_or_cik : Optional [str ] = None ,
96136 accession_number : Optional [str ] = None ,
137+ accession_numbers : Optional [list [str ]] = None ,
97138 form_type : Optional [str ] = None ,
98139 include_amends : bool = False ,
99140) -> list [FilingMetadata ]:
100141 assert (
101142 ticker_or_cik and form_type
102- ) or accession_number , (
103- "Either ticker or CIK and form type or accession number must be provided"
143+ ) or accession_number or accession_numbers , (
144+ "Either ticker or CIK and form type or accession number(s) must be provided"
104145 )
105146
106147 submissions_uri = URL_SUBMISSIONS .format (
@@ -151,7 +192,7 @@ def _get_metadatas(
151192 this_form_type ,
152193 items ,
153194 ) in zip (
154- accession_numbers ,
195+ filings_json [ "accessionNumber" ] ,
155196 primary_document_urls ,
156197 filing_dates ,
157198 report_dates ,
@@ -164,6 +205,7 @@ def _get_metadatas(
164205 if (
165206 (form_type and form_type != this_form_type )
166207 or (accession_number and accession_number != this_accession_number )
208+ or (accession_numbers and this_accession_number not in accession_numbers )
167209 or (is_amend and not include_amends )
168210 ):
169211 continue
@@ -195,7 +237,11 @@ def _get_metadatas(
195237 submissions_uri = URL_SUBMISSIONS .format (submission = next_page )
196238
197239 requested_form = f" of type { form_type } " if form_type else ""
198- error_context = f"{ accession_number or ticker_or_cik } { requested_form } "
240+ if accession_numbers :
241+ error_context = f"{ ticker_or_cik } with accession numbers { accession_numbers } "
242+ else :
243+ error_context = f"{ accession_number or ticker_or_cik } { requested_form } "
244+
199245 if not found_metadatas :
200246 msg = f"Could not find any filings: { error_context } "
201247 raise ValueError (msg )
0 commit comments