Skip to content

Form C: Parse Crowdfunding Offerings (Regulation CF)

Overview

Form C is an SEC filing used by companies raising capital through crowdfunding under Regulation Crowdfunding (Regulation CF). These filings provide insights into small business fundraising campaigns, including offering terms, issuer financials, and funding portal information.

The FormC class in edgartools parses Form C XML filings into structured Python objects, making it easy to track crowdfunding campaigns, analyze issuer financials, and monitor offering progress.

What Form C Covers

Form C encompasses several filing types that track the complete lifecycle of a crowdfunding offering:

  • Form C - Initial crowdfunding offering
  • Form C/A - Amendment to the offering
  • Form C-U - Progress update during the offering period
  • Form C-AR - Annual report (filed yearly after offering closes)
  • Form C-TR - Termination report (when offering is withdrawn)

Access Pattern

from edgar import get_filings

# Get recent Form C filings
filing = get_filings(form="C").head(1)[0]

# Parse into FormC object
formc = filing.obj()

# Access offering details
print(f"{formc.issuer_name}")
print(f"Target: ${formc.offering_information.target_amount:,.0f}")
print(f"Maximum: ${formc.offering_information.maximum_offering_amount:,.0f}")
print(f"Deadline: {formc.offering_information.deadline_date}")

When you call filing.obj() on a Form C filing, edgartools displays a rich formatted panel showing all filing details:

Form C Display


Core Data Structure

FormC (Top-Level Object)

Property Type Description
filer_information FilerInformation CIK, filing period, test/live flag
issuer_information IssuerInformation Company name, address, website, legal status, jurisdiction
offering_information Optional[OfferingInformation] Offering terms (present in C, C-U; absent in C-AR, C-TR)
annual_report_disclosure Optional[AnnualReportDisclosure] Financial disclosures (present in C-AR)
signature_info SignatureInfo Officer and director signatures
form str Form type (C, C/A, C-U, C-AR, C-TR)
description str Human-readable form description
issuer_name str Convenience property for issuer name
portal_name Optional[str] Funding portal name (if present)
campaign_status str Derived status (Active, Terminated, Annual Report, etc.)
days_to_deadline Optional[int] Days until offering deadline (negative if expired)
is_expired bool Whether offering deadline has passed

Computed Properties

Property Returns Description
issuer IssuerCompany Company wrapper with offering-specific methods
docs Docs Access comprehensive API documentation

Methods

Method Returns Description
get_offering() Offering Complete offering lifecycle (all related filings)
to_context(detail) str Token-efficient text representation for AI context

Offering Information

The offering_information property contains the core fundraising terms. It is present in Form C and Form C-U but not in Form C-AR or C-TR.

OfferingInformation

Property Type Description
compensation_amount str Portal fees and compensation structure
security_offered_type Optional[str] Type of security (Equity, Debt, Other)
security_offered_other_desc Optional[str] Description if type is "Other"
offering_amount Optional[float] Target offering amount in dollars
maximum_offering_amount Optional[float] Maximum offering amount (for over-subscription)
price Optional[str] Price per security (as string)
no_of_security_offered Optional[str] Number of securities offered (as string)
deadline_date Optional[date] Offering deadline
over_subscription_accepted Optional[str] "Y" or "N"
over_subscription_allocation_type Optional[str] How over-subscriptions are allocated
price_determination_method Optional[str] How price was determined

Computed Properties

Property Returns Description
security_description str Combined type and description
target_amount Optional[float] Alias for offering_amount
offering_deadline Optional[date] Alias for deadline_date
price_per_security Optional[float] Price parsed as float
number_of_securities Optional[int] Number of securities as int
percent_to_maximum Optional[float] Target as percentage of maximum

Example: Analyzing Offering Terms

from edgar import get_filings

filing = get_filings(form="C").head(1)[0]
formc = filing.obj()

offering = formc.offering_information
if offering:
    print(f"Security: {offering.security_description}")
    print(f"Target: ${offering.target_amount:,.0f}")
    print(f"Maximum: ${offering.maximum_offering_amount:,.0f}")
    print(f"Target is {offering.percent_to_maximum:.0f}% of maximum")

    if offering.price_per_security and offering.number_of_securities:
        print(f"Price: ${offering.price_per_security:.2f} per unit")
        print(f"Units: {offering.number_of_securities:,}")

    # Check deadline
    days_left = formc.days_to_deadline
    if days_left is not None:
        if days_left > 0:
            print(f"Deadline: {days_left} days remaining")
        else:
            print(f"Offering expired {abs(days_left)} days ago")

Financial Disclosures

The annual_report_disclosure property contains financial statements for the current and prior fiscal year. It is present in Form C-AR (annual reports) and sometimes in Form C.

AnnualReportDisclosure

Property Type Description
current_employees int Number of employees
total_asset_most_recent_fiscal_year float Total assets (current year)
total_asset_prior_fiscal_year float Total assets (prior year)
cash_equi_most_recent_fiscal_year float Cash and equivalents (current)
cash_equi_prior_fiscal_year float Cash and equivalents (prior)
act_received_most_recent_fiscal_year float Accounts receivable (current)
act_received_prior_fiscal_year float Accounts receivable (prior)
short_term_debt_most_recent_fiscal_year float Short-term debt (current)
short_term_debt_prior_fiscal_year float Short-term debt (prior)
long_term_debt_most_recent_fiscal_year float Long-term debt (current)
long_term_debt_prior_fiscal_year float Long-term debt (prior)
revenue_most_recent_fiscal_year float Revenue (current)
revenue_prior_fiscal_year float Revenue (prior)
cost_goods_sold_most_recent_fiscal_year float Cost of goods sold (current)
cost_goods_sold_prior_fiscal_year float Cost of goods sold (prior)
tax_paid_most_recent_fiscal_year float Taxes paid (current)
tax_paid_prior_fiscal_year float Taxes paid (prior)
net_income_most_recent_fiscal_year float Net income (current)
net_income_prior_fiscal_year float Net income (prior)
offering_jurisdictions List[str] States where offering is available

Computed Financial Metrics

Property Returns Description
total_debt_most_recent float Short-term + long-term debt (current year)
total_debt_prior float Short-term + long-term debt (prior year)
debt_to_asset_ratio Optional[float] Debt-to-asset ratio as percentage
revenue_growth_yoy Optional[float] Year-over-year revenue growth percentage
asset_growth_yoy Optional[float] Year-over-year asset growth percentage
is_pre_revenue bool True if no revenue in current year
burn_rate_change Optional[float] Change in net income (shows burn rate trend)

Convenience Aliases (Most Recent Year)

For easier access to current year data:

Property Returns Maps To
total_assets float total_asset_most_recent_fiscal_year
cash_and_cash_equivalents float cash_equi_most_recent_fiscal_year
accounts_receivable float act_received_most_recent_fiscal_year
short_term_debt float short_term_debt_most_recent_fiscal_year
long_term_debt float long_term_debt_most_recent_fiscal_year
revenues float revenue_most_recent_fiscal_year
cost_of_goods_sold float cost_goods_sold_most_recent_fiscal_year
taxes_paid float tax_paid_most_recent_fiscal_year
net_income float net_income_most_recent_fiscal_year
number_of_employees int current_employees

Example: Analyzing Issuer Financials

from edgar import get_filings

# Get a Form C-AR (annual report)
filing = get_filings(form="C-AR").head(1)[0]
formc_ar = filing.obj()

financials = formc_ar.annual_report_disclosure
if financials:
    # Basic metrics
    print(f"Employees: {financials.number_of_employees}")
    print(f"Total Assets: ${financials.total_assets:,.0f}")
    print(f"Cash: ${financials.cash_and_cash_equivalents:,.0f}")

    # Revenue analysis
    if financials.is_pre_revenue:
        print("Status: Pre-revenue")
    else:
        print(f"Revenue: ${financials.revenues:,.0f}")
        if financials.revenue_growth_yoy is not None:
            print(f"Revenue Growth: {financials.revenue_growth_yoy:+.1f}% YoY")

    # Profitability
    print(f"Net Income: ${financials.net_income:,.0f}")

    # Debt analysis
    total_debt = financials.total_debt_most_recent
    if total_debt > 0:
        print(f"Total Debt: ${total_debt:,.0f}")
        if financials.debt_to_asset_ratio:
            print(f"Debt-to-Asset Ratio: {financials.debt_to_asset_ratio:.0f}%")

Issuer Information

IssuerInformation

The issuer_information property contains company details.

Property Type Description
name str Legal name of the issuing company
address Address Business address
website str Company website
co_issuer bool Whether there is a co-issuer
funding_portal Optional[FundingPortal] Crowdfunding portal intermediary
legal_status str Legal structure (Corporation, LLC, etc.)
jurisdiction str State/country of incorporation
date_of_incorporation date Date company was formed

FundingPortal

The intermediary platform facilitating the crowdfunding raise.

Property Type Description
name str Portal name (e.g., "StartEngine", "Wefunder")
cik str SEC Central Index Key for the portal
crd Optional[str] FINRA CRD number
file_number str SEC commission file number for the portal

IssuerCompany

The issuer property returns an IssuerCompany object that provides offering-specific methods:

Method Returns Description
as_company() Company Convert to full Company object
get_offerings() List[Offering] All crowdfunding offerings by this issuer
latest_offering() Optional[Offering] Most recent offering

Example: Working with Issuers

from edgar import get_filings

filing = get_filings(form="C").head(1)[0]
formc = filing.obj()

# Basic issuer info
print(f"Company: {formc.issuer_name}")
print(f"Incorporated: {formc.issuer_information.jurisdiction} "
      f"({formc.issuer_information.date_of_incorporation.year})")
print(f"Website: {formc.issuer_information.website}")

# Funding portal
if formc.portal_name:
    print(f"Portal: {formc.portal_name}")

# Get all offerings by this company
issuer = formc.issuer
offerings = issuer.get_offerings()
print(f"{issuer.name} has {len(offerings)} crowdfunding offerings")

# Convert to full Company object for more data
company = issuer.as_company()
print(f"All SEC filings: {len(company.get_filings())}")

Offering Lifecycle

Each crowdfunding campaign goes through multiple filing stages. The get_offering() method returns an Offering object that tracks the complete lifecycle.

Example: Tracking an Offering Over Time

from edgar import get_filings

# Get a Form C filing
filing = get_filings(form="C").head(1)[0]
formc = filing.obj()

# Get the complete offering lifecycle
offering = formc.get_offering()

# View all filings for this offering
print(offering.timeline())

# Access specific filing types
initial_filing = offering.initial()      # Original Form C
updates = offering.updates()             # Form C-U progress updates
annual_reports = offering.annual_reports()  # Form C-AR reports
amendments = offering.amendments()       # Form C/A amendments

Form Variants and Data Availability

Different Form C variants contain different data sections:

Form offering_information annual_report_disclosure funding_portal
C Yes Sometimes Yes
C/A Yes Sometimes Yes
C-U Limited Sometimes Yes
C-AR No Yes No
C-TR No No Usually minimal

Key patterns:

  • Form C (initial offering): Has full offering terms and portal info
  • Form C-U (progress update): May have limited offering info updates
  • Form C-AR (annual report): Has financial disclosures, no offering terms
  • Form C-TR (termination): Minimal data, indicates offering withdrawn

Always check for None before accessing offering_information or annual_report_disclosure:

if formc.offering_information:
    print(f"Target: ${formc.offering_information.target_amount:,.0f}")

if formc.annual_report_disclosure:
    print(f"Revenue: ${formc.annual_report_disclosure.revenues:,.0f}")

Signature Information

SignatureInfo

Property Type Description
issuer_signature IssuerSignature Company signature
signatures List[PersonSignature] Individual officer/director signatures
signers List[Signer] Consolidated list of unique signers

IssuerSignature

Property Type Description
issuer str Company name as signed
title str Title of signer (e.g., "Chief Executive Officer")
signature str Signature as signed

PersonSignature

Property Type Description
signature str Person's name as signed
title str Title (e.g., "Director")
date date Date signed

Common Use Cases

Finding Active Offerings

from edgar import get_filings

# Get recent Form C filings
active_offerings = get_filings(form="C").head(20)

for filing in active_offerings:
    formc = filing.obj()

    # Filter for non-expired offerings
    if not formc.is_expired and formc.offering_information:
        offering = formc.offering_information
        print(f"{formc.issuer_name}")
        print(f"  Target: ${offering.target_amount:,.0f}")
        print(f"  Deadline: {offering.deadline_date}")
        print(f"  Days left: {formc.days_to_deadline}")
        print()

Analyzing Issuer Financial Health

from edgar import get_filings

# Get Form C-AR annual reports
annual_reports = get_filings(form="C-AR").head(10)

for filing in annual_reports:
    formc = filing.obj()
    fin = formc.annual_report_disclosure

    if fin:
        print(f"{formc.issuer_name}")
        print(f"  Assets: ${fin.total_assets:,.0f}")
        print(f"  Cash: ${fin.cash_and_cash_equivalents:,.0f}")

        if fin.is_pre_revenue:
            print(f"  Status: Pre-revenue")
        else:
            print(f"  Revenue: ${fin.revenues:,.0f}")
            if fin.revenue_growth_yoy:
                print(f"  Growth: {fin.revenue_growth_yoy:+.1f}% YoY")

        print(f"  Net Income: ${fin.net_income:,.0f}")
        print()

Tracking a Company's Crowdfunding History

from edgar import Company

# Get a company that has done crowdfunding
company = Company("1881570")  # Example: ViiT Health

# Get all crowdfunding filings
cf_filings = company.get_filings(form=['C', 'C/A', 'C-U', 'C-AR', 'C-TR'])

# Group by offering
from edgar.offerings.formc import group_offerings_by_file_number
grouped = group_offerings_by_file_number(cf_filings)

print(f"{company.name} has {len(grouped)} crowdfunding offerings")

for file_num, offering_filings in grouped.items():
    print(f"\nOffering {file_num}:")
    for filing in offering_filings:
        print(f"  {filing.form:8} - {filing.filing_date}")

AI-Optimized Context

The to_context() method provides a token-efficient text representation optimized for AI/LLM context windows:

from edgar import get_filings

filing = get_filings(form="C").head(1)[0]
formc = filing.obj()

# Minimal detail (~100-200 tokens)
print(formc.to_context(detail='minimal'))

# Standard detail (~300-500 tokens)
print(formc.to_context(detail='standard'))

# Full detail (~600-1000 tokens)
print(formc.to_context(detail='full'))

This is useful when passing Form C data to language models or building AI-powered analysis tools.


Quick Reference

Properties Quick Lookup

Access Returns Example
formc.issuer_name str Company name
formc.portal_name Optional[str] Funding portal
formc.campaign_status str "Active", "Terminated", etc.
formc.days_to_deadline Optional[int] Days remaining (negative if expired)
formc.is_expired bool Deadline passed?
formc.offering_information Optional[OfferingInformation] Offering terms
formc.annual_report_disclosure Optional[AnnualReportDisclosure] Financial data
formc.issuer IssuerCompany Company wrapper with offering methods

Methods Quick Lookup

Method Returns Use Case
formc.get_offering() Offering Get complete offering lifecycle
formc.to_context(detail) str Token-efficient text for AI
formc.issuer.get_offerings() List[Offering] All offerings by this company
formc.issuer.as_company() Company Convert to full Company object

Things to Know

Monetary amounts are floats. All dollar amounts are parsed as floats and can be used directly in calculations.

Check for None before accessing optional sections. The offering_information and annual_report_disclosure fields may be None depending on the form type.

Deadlines can be in the past. Use days_to_deadline to check if an offering is still active. Negative values mean the deadline has passed.

Pre-revenue companies are common. Many crowdfunding issuers have zero revenue. Use is_pre_revenue to detect this.

Portal file numbers identify the portal, not the offering. To track a specific offering, use the issuer file number from filing.file_number or the Offering object.

Form C-AR has no offering information. Annual reports focus on financial disclosures and don't include the original offering terms.

State jurisdictions are abbreviated. The jurisdiction field uses state codes like "DE", "CA", "NY".