Skip to content

S-3 Shelf Registration: Parse SEC Filings with Python

S-3 filings are shelf registration statements that allow companies to register securities for future offering. Rather than registering each deal separately, a company files an S-3 once and then draws down from it over three years. EdgarTools parses S-3, S-3/A, S-3ASR, S-3D, S-3DPOS, and their foreign private issuer equivalents (F-3, F-3/A, F-3ASR, F-3ASR/A) into a RegistrationS3 object.

from edgar import find

filing = find("0001140361-25-024210")   # Central Pacific Financial S-3
s3 = filing.obj()                       # RegistrationS3
s3

S-3 shelf registration statement parsed with Python edgartools

You can also find S-3 filings through a company:

from edgar import Company

company = Company("CPF")                        # Central Pacific Financial
filing = company.get_filings(form="S-3")[0]
s3 = filing.obj()                               # RegistrationS3

Check the Offering Type

The offering_type property classifies what the shelf is for. This matters because resale shelves, debt shelves, and universal shelves have different data profiles.

s3.offering_type              # S3OfferingType.UNIVERSAL_SHELF
s3.offering_type.display_name # "Universal Shelf"
Value Display Name Description
UNIVERSAL_SHELF Universal Shelf Any security type (most common)
RESALE Resale Registration Selling stockholders reselling private placement shares
DEBT Debt Offering Debt securities only
AUTO_SHELF Automatic Shelf (S-3ASR) Large accelerated filers; fees deferred
UNKNOWN Unknown Classification failed
# Automatic shelf (S-3ASR) for a large accelerated filer
from edgar import find

filing = find("0001104659-25-064107")    # AeroVironment S-3ASR
s3 = filing.obj()

s3.is_auto_shelf    # True
s3.fee_deferred     # True (fees paid per takedown, not upfront)

S-3ASR automatic shelf registration for AeroVironment


Read the Fee Table

Every S-3 includes Exhibit 107 (EX-FILING FEES) listing how much the company is registering and the SEC filing fee owed. EdgarTools extracts this automatically.

s3.total_offering    # 300000000.0  (total registered amount in dollars)
s3.net_fee           # 45930.0      (SEC registration fee owed)
s3.fee_deferred      # False        (auto-shelves defer fees to takedown time)

# Per-security breakdown
for sec in s3.securities:
    print(sec.security_type, sec.security_title, sec.max_aggregate_amount)

For S-3ASR filings, fees are deferred under Rule 457(r) — the company pays at the time of each 424B takedown rather than at registration. In that case fee_deferred is True and net_fee is 0.

# Fee table object has full detail
ft = s3.fee_table                   # RegistrationFeeTable | None
ft.total_offering_amount            # 300000000.0
ft.net_fee_due                      # 45930.0
ft.has_carry_forward                # False
len(ft.securities)                  # 9 (one per security class registered)

Read the Cover Page

The cover page captures who is registering, how they're classified by the SEC, and which rules apply.

cp = s3.cover_page                          # S3CoverPage

cp.company_name                             # "CENTRAL PACIFIC FINANCIAL CORP"
cp.registration_number                      # "333-284853"
cp.state_of_incorporation                   # "Hawaii"
cp.ein                                      # "99-0212597"

# Filer category checkboxes
cp.is_large_accelerated_filer               # True / False / None
cp.is_accelerated_filer                     # True / False / None
cp.is_non_accelerated_filer                 # True / False / None
cp.is_smaller_reporting_company             # True / False / None
cp.is_emerging_growth_company               # True / False / None

# Rule checkboxes
cp.is_rule_415                              # True if Rule 415 shelf offering
cp.is_rule_462b                             # True if Rule 462(b) amendment
cp.is_rule_462e                             # True if auto-shelf (S-3ASR)

# How much of the cover page was successfully extracted
cp.confidence                               # "low", "medium", or "high"

These fields come from the checkbox grid on the S-3 cover page. The confidence score reflects how many fields were successfully parsed. You can also access the shortcut properties directly on the RegistrationS3 object:

s3.registration_number        # same as s3.cover_page.registration_number
s3.state_of_incorporation     # same as s3.cover_page.state_of_incorporation
s3.ein                        # same as s3.cover_page.ein
s3.is_amendment               # True when form contains "/A"
s3.is_auto_shelf              # True for S-3ASR

A shelf registration is the starting point. Each time the company actually sells securities, it files a 424B prospectus supplement. Use .takedowns to get all of those filings from this shelf.

takedowns = s3.takedowns        # Filings object with all 424B forms, or None
if takedowns:
    print(f"{len(takedowns)} offerings from this shelf")
    for filing in takedowns:
        print(filing.form, filing.filing_date)

# Get parsed deal data for each takedown
for filing in takedowns:
    prospectus = filing.obj()   # Prospectus424B
    deal = prospectus.deal
    print(deal.gross_proceeds, deal.offering_type)

.takedowns uses the registration file number (e.g. 333-284853) to fetch all 424B filings under this shelf. It requires a network call and is cached after first access.

To get every filing under the same file number (not just 424B forms), use .related_filings:

all_filings = s3.related_filings    # Filings: S-3, EFFECT, 424Bs, etc.

Build a Shelf Offering History

Combine RegistrationS3 and Prospectus424B to see everything a company raised from a single shelf:

import pandas as pd
from edgar import Company

company = Company("CPF")
s3_filings = company.get_filings(form="S-3")

for s3_filing in s3_filings.head(3):
    s3 = s3_filing.obj()
    print(f"Shelf: {s3.total_offering:,.0f} registered ({s3.offering_type.display_name})")

    if s3.takedowns:
        rows = []
        for td in s3.takedowns:
            prospectus = td.obj()
            d = prospectus.deal.to_dict()
            d["date"] = str(td.filing_date)
            rows.append(d)
        df = pd.DataFrame(rows)
        print(df[["date", "gross_proceeds", "offering_type"]].to_string())
        print()

Get AI-Friendly Context

.to_context() returns a structured text summary for language model prompts:

print(s3.to_context())
# REGISTRATION STATEMENT: CENTRAL PACIFIC FINANCIAL CORP (S-3)
#
# Filed: 2025-06-30
# Offering Type: Universal Shelf
# Registration No.: 333-284853
# EIN: 99-0212597
# ...

print(s3.to_context(detail='full'))   # Includes available properties/actions
print(s3.to_context(detail='minimal'))  # Filing header only

Understand the Shelf Lifecycle

The relationship between S-3 and 424B filings follows a consistent pattern:

Company files S-3
    └── SEC reviews (8-40 days typical)
        └── SEC issues EFFECT notice (shelf becomes active)
            └── Company files 424B5 (takedown #1)
            └── Company files 424B5 (takedown #2)
                 ...
            └── Shelf expires 3 years from filing date

You can also navigate this in reverse -- starting from a 424B prospectus back to the S-3. See the Prospectus424B guide for prospectus.lifecycle.shelf_registration.


Supported Form Variants

Form Description
S-3 Standard shelf registration
S-3/A Amendment to a shelf registration
S-3ASR Automatic shelf (large accelerated filers; immediate effectiveness)
S-3ASR/A Amendment to an automatic shelf
S-3D Shelf for dividend reinvestment plans
S-3DPOS Post-effective amendment for DRIPs
F-3 Foreign private issuer shelf registration
F-3/A Amendment to a foreign shelf registration
F-3ASR Foreign automatic shelf registration
F-3ASR/A Amendment to a foreign automatic shelf

All variants are dispatched automatically by filing.obj(). F-3 forms are the foreign private issuer equivalent of S-3 and use the same RegistrationS3 class.


Quick Reference

RegistrationS3 Properties

Property Type Description
form str Form type ("S-3", "S-3ASR", etc.)
company str Company name from filing metadata
filing_date date Date the S-3 was filed
accession_number str SEC accession number
offering_type S3OfferingType Classification enum
cover_page S3CoverPage Extracted cover page fields
fee_table RegistrationFeeTable \| None Parsed Exhibit 107 fee table
total_offering float \| None Total registered offering amount in dollars
net_fee float \| None Net SEC registration fee owed
fee_deferred bool True for S-3ASR (fees paid at takedown)
securities list Per-security breakdowns from fee table
registration_number str \| None File number ("333-XXXXXX")
state_of_incorporation str \| None State of incorporation
ein str \| None Employer identification number
is_amendment bool True when form contains /A
is_auto_shelf bool True for S-3ASR

RegistrationS3 Methods

Method Returns Description
to_context(detail) str AI-formatted text ('minimal', 'standard', 'full')

RegistrationS3 Cached Properties

Property Type Description
takedowns Filings \| None 424B filings under this shelf (network call)
related_filings Filings \| None All filings under this file number (network call)

S3CoverPage Fields

Property Type Description
company_name str Company name
registration_number str \| None SEC file number
state_of_incorporation str \| None State of incorporation
ein str \| None EIN
is_large_accelerated_filer bool \| None Checkbox state
is_accelerated_filer bool \| None Checkbox state
is_non_accelerated_filer bool \| None Checkbox state
is_smaller_reporting_company bool \| None Checkbox state
is_emerging_growth_company bool \| None Checkbox state
is_rule_415 bool Rule 415 shelf offering
is_rule_462b bool Rule 462(b) amendment
is_rule_462e bool Automatic shelf
confidence str Extraction confidence ("low", "medium", "high")

S3OfferingType Values

Enum Value display_name When
UNIVERSAL_SHELF Universal Shelf Multiple security types; most common
RESALE Resale Registration Selling stockholders in cover text
DEBT Debt Offering Debt securities only
AUTO_SHELF Automatic Shelf (S-3ASR) S-3ASR form or deferred fees
UNKNOWN Unknown Classification failed

Things to Know

The .takedowns and .related_filings properties require a network call to the SEC. Both are cached as @cached_property so they only fetch once per object.

Cover page extraction is best-effort. The confidence property tells you how many fields were found: "high" (4+ fields), "medium" (2-3), "low" (0-1). For older filings with non-standard HTML layouts, confidence may be lower.

S-3 filings are intentionally short (typically 50-200KB). They incorporate financial disclosures by reference from the company's most recent 10-K and 10-Q rather than repeating them.

The fee table comes from Exhibit 107 (EX-FILING FEES), which SEC rules have required since 2022. Filings before 2022 may have fee_table as None.