getRecentFilings method

  1. @override
Future<List<SecFiling>> getRecentFilings(
  1. String ticker, {
  2. List<String>? forms,
  3. int limit = 10,
})
override

Fetch recent SEC filings for a company.

forms filters by form type (e.g., ['8-K', '10-K']). limit caps the number of filings returned.

Implementation

@override
Future<List<SecFiling>> getRecentFilings(
  String ticker, {
  List<String>? forms,
  int limit = 10,
}) async {
  final cik = await getCik(ticker);
  if (cik == null) {
    throw Exception('Ticker $ticker not found.');
  }

  final cikStr = cik.toString().padLeft(10, '0');
  final url = '$_submissionsUrl/CIK$cikStr.json';

  _logger.info('Fetching filings for $ticker (CIK: $cikStr)...');
  final response = await _get(url);
  final data = json.decode(response.body) as Map<String, dynamic>;

  // Parse recent filings from the response
  final recentFilings = data['filings']?['recent'] as Map<String, dynamic>?;
  if (recentFilings == null) {
    return [];
  }

  final accessionNumbers = recentFilings['accessionNumber'] as List<dynamic>;
  final formTypes = recentFilings['form'] as List<dynamic>;
  final filingDates = recentFilings['filingDate'] as List<dynamic>;
  final primaryDocuments = recentFilings['primaryDocument'] as List<dynamic>;
  final descriptions =
      recentFilings['primaryDocDescription'] as List<dynamic>?;

  final filings = <SecFiling>[];
  for (var i = 0;
      i < accessionNumbers.length && filings.length < limit;
      i++) {
    final form = formTypes[i] as String;

    // Filter by form type if specified
    if (forms != null && !forms.contains(form)) {
      continue;
    }

    filings.add(
      SecFiling(
        accessionNumber: accessionNumbers[i] as String,
        form: form,
        filingDate: DateTime.parse(filingDates[i] as String),
        primaryDocument: primaryDocuments[i] as String,
        description: descriptions?[i] as String? ?? '',
        cik: cik,
      ),
    );
  }

  _logger.info('Found ${filings.length} filings for $ticker.');
  return filings;
}