Analyze Regulation A+ offerings from Form 1-A
Summarize Reg A+ offering statements by tier, security type and size using the structured Form 1-A data in the SecFeed API.
Regulation A lets companies raise money from the public with a lighter registration process. Tier 1 offerings are capped at $20 million in 12 months and are reviewed by the states. Tier 2 offerings are capped at $75 million and preempt state review, but need audited financials and ongoing reports. The offering statement is Form 1-A, and its first part is structured XML.
/v1/reg-a returns the whole family (1-A, 1-A/A, 1-K annual reports, 1-SA semiannual reports, 1-Z exit reports) with the XML as JSON under data.
The code
import os
from collections import Counter
import requests
BASE = "https://secfeedapi.com"
HEADERS = {"Authorization": f"Bearer {os.environ['SECFEED_KEY']}"}
filings, start = [], 0
while True:
r = requests.get(f"{BASE}/v1/reg-a", headers=HEADERS, timeout=120, params={
"formType": "1-A", "startDate": "2026-04-01", "endDate": "2026-09-30", "size": 100, "from": start})
r.raise_for_status()
page = r.json()["filings"]
filings += page
if len(page) < 100:
break
start += 100
print(len(filings), "original Form 1-A offering statements, April to September 2026")
def num(x):
try:
return float(str(x).replace(",", "").replace("$", ""))
except ValueError:
return 0.0
rows = []
for f in filings:
s = f["data"]["primary_doc"]["formData"].get("summaryInfo") or {}
rows.append({
"issuer": f["companyName"],
"tier": s.get("indicateTier1Tier2Offering", ""),
"types": s.get("securitiesOfferedTypes") or [],
"price": num(s.get("pricePerSecurity")),
"total": num(s.get("totalAggregateOffering")),
"audited": s.get("financialStatementAuditStatus", ""),
"best_efforts": s.get("offeringBestEffortsFlag") == "Y",
})
print("\nBy tier:")
for tier, n in Counter(r["tier"] for r in rows).most_common():
raised = sum(r["total"] for r in rows if r["tier"] == tier)
print(f" {tier or 'not stated':10} {n:4} filings ${raised:,.0f} sought in total")
print("\nSecurities offered:")
# one string, or a list when the offering includes several kinds of securities
for kind, n in Counter(t for r in rows for t in ([r["types"]] if isinstance(r["types"], str) else r["types"])).most_common(5):
print(f" {n:4} {kind}")
print(f"\nBest efforts: {sum(r['best_efforts'] for r in rows)} of {len(rows)}")
print("\nLargest offerings by total aggregate amount:")
for r in sorted(rows, key=lambda r: -r["total"])[:8]:
print(f" ${r['total']:>14,.0f} {r['tier']:6} ${r['price']:>8,.2f} {r['issuer'][:44]}")
formData.summaryInfo holds the offering summary: the tier, whether the financials are audited, the type of securities, price per security, the issuer's aggregate offering, any amount sold by selling securityholders, and the total aggregate offering. securitiesOfferedTypes is a string when there is one kind of security and a list when there are several, so the script handles both.
Output
Run on 2026-10-13 against original 1-A filings from April through September 2026.
91 original Form 1-A offering statements, April to September 2026
By tier:
Tier2 66 filings $2,525,810,484 sought in total
Tier1 25 filings $158,022,788 sought in total
Securities offered:
83 Equity (common or preferred stock)
6 Debt
3 Option, warrant or other right to acquire another security
2 Security to be acquired upon exercise of option, warrant or other right to acquire security
2 Other(describe)
Best efforts: 79 of 91
Largest offerings by total aggregate amount:
$ 75,000,000 Tier2 $ 100.00 XChange Ventures, LLC
$ 75,000,000 Tier2 $ 15.00 GOA Therapeutics Corp
$ 75,000,000 Tier2 $ 1.25 Limitless X Holdings Inc.
$ 75,000,000 Tier2 $ 1.00 OBSIDIAN PRIME INC
$ 75,000,000 Tier2 $ 20.00 NOYACK Logistics Income REIT II, Inc.
$ 75,000,000 Tier2 $ 10.00 Tokenova Worldwide, Inc.
$ 75,000,000 Tier2 $ 1.00 SIERRA INTERNATIONAL NETWORK INC
$ 75,000,000 Tier2 $ 500.00 Connect Invest IIII, LLC
Reading the result
- Tier 2 dominates by both count and size, and eight offerings sit at the $75 million Tier 2 cap.
- Most offerings are best efforts: no underwriter commits to buy the securities.
- The totals are amounts sought in the offering statement, not money raised. Sales are reported later on Form 1-K and, for an exit, Form 1-Z.
Variations
- Qualified offerings only: the SEC qualifies a 1-A before sales begin. Search the filing index for
formType:"QUALIF"with the issuer's CIK to see when it happened. - Outcomes: fetch
formType=1-Zto see how much was actually sold when an offering ended. - Amendments: most 1-As are amended before qualification. Use
formType=1-A/Aand keep the latest per issuer.