Technical writing

SEC Form 144: The Federal Database Behind Insider Sales of Restricted and Control Stock

· 10 min read· AI Analytics
SECForm 144Insider SalesRule 144Federal Data

Form 144 is the notice an insider files before selling — the public statement of intent that a corporate affiliate must put on record with the SEC before disposing of restricted or control securities under Rule 144 of the Securities Act. Where Form 4 records the trade that already happened, Form 144 announces the trade that is about to. The dataset described here holds 1,681 such notices, each carrying the seller's name, their relationship to the issuer, the class and number of shares they propose to sell, the aggregate market value of the planned sale, the approximate date it will begin, and the broker who will execute it — a forward-looking view of insider selling pressure that, paired with the executed Form 4, lets you measure the gap between what insiders say they will sell and what they actually do.

What Form 144 Is

Form 144, formally the “Notice of Proposed Sale of Securities,” is the disclosure an affiliate of an issuer must file with the SEC when relying on Rule 144 to sell restricted or control securities into the public market. It is not a transaction report. It is a notice of intent: a filing that says, in effect, “I am an insider, I hold securities that I am not free to sell without an exemption, and I intend to sell a specified quantity over the coming period through a named broker.” The notice must be transmitted to the SEC concurrently with either placing the sell order with the broker or executing the sale directly with a market maker.

Two categories of securities pull a seller into the Form 144 regime, and the distinction matters. Restricted securities are shares acquired in an unregistered, private transaction — a private placement, an employee equity award, a Regulation D offering, an acquisition paid in stock — rather than in a registered public offering. They carry a restrictive legend and cannot be freely resold until the conditions of an exemption are met. Control securities are shares held by an affiliate of the issuer — typically an officer, director, or large shareholder with the power to influence the company — regardless of how those shares were acquired. Crucially, control securities can be restricted or unrestricted: even shares an executive bought on the open market become “control” stock in their hands, and selling them invokes Rule 144's affiliate conditions. An affiliate selling either kind of security generally files Form 144.

The word that does the work in all of this is affiliate. Rule 144 defines an affiliate as a person who directly or indirectly controls, is controlled by, or is under common control with the issuer — in practice the same population of officers, directors, and major holders that Section 16 captures, though the two definitions are not identical. A non-affiliate selling ordinary restricted securities they have held long enough faces a far lighter version of Rule 144 and, importantly, does not have to file Form 144 at all. The notice requirement is an affiliate requirement. This is why Form 144 is, almost by construction, an insider dataset: the people who file it are, by definition, the people close to the company.

Rule 144 Mechanics

Form 144 cannot be understood apart from the exemption it serves. Section 5 of the Securities Act makes it unlawful to sell a security unless a registration statement is in effect or an exemption applies. Rule 144 is the safe harbor that lets holders of restricted and control securities resell them into the public market without registration, provided a set of conditions is satisfied. The conditions differ depending on whether the seller is an affiliate, and Form 144 is the procedural artifact of the affiliate path.

Holding period. Restricted securities must be held for a minimum period before any Rule 144 resale. For securities of a reporting company — one current in its Exchange Act filings — the holding period is six months; for a non-reporting company it is one year. The clock starts when the securities were acquired and fully paid for. The holding period applies to the restricted character of the securities; it does not, on its own, cure an affiliate of the additional conditions below. A non-affiliate who clears the holding period (and, after a year, the public-information condition too) can sell freely. An affiliate never gets that clean release while they remain an affiliate.

Volume limitations. This is the condition most specific to affiliates and the one Form 144 exists to police. In any rolling three-month period, an affiliate may sell no more than the greater of (a) one percent of the total shares outstanding of the class, or (b) the average reported weekly trading volume of the class over the four calendar weeks preceding the filing of the notice. For a thinly traded small-cap, the one-percent-of-outstanding figure usually governs; for a heavily traded large-cap, the four-week average volume figure is far larger and governs instead. The units_outstanding field in the dataset is the base for the one-percent test, which is why it sits on the notice at all.

Manner of sale. Equity securities sold by an affiliate under Rule 144 must be sold in ordinary brokers' transactions, in transactions directly with a market maker, or in riskless principal transactions — not in a special selling effort or a solicited distribution. The affiliate may not pay more than a customary broker's commission and may not solicit buyers. The broker_name and exchange fields on the notice reflect this manner-of-sale framework: the sale runs through a named broker into a public market.

Current public information. Adequate current information about the issuer must be publicly available — satisfied, for a reporting company, by the company being current in its periodic Exchange Act reports. A seller cannot use Rule 144 to dump shares of a company that has gone dark on its filings.

The filing threshold. Not every Rule 144 affiliate sale triggers a Form 144. The notice is required only when, during any three-month period, the sale involves more than 5,000 shares or an aggregate sale price greater than $50,000. Sales below both thresholds are exempt from the notice requirement (though still subject to the other Rule 144 conditions). This de minimis threshold is the reason the Form 144 corpus skews toward larger, more economically meaningful insider sales: the small ones never have to surface. The units_to_sell and aggregate_market_value fields are precisely the two quantities measured against this threshold.

The Schema

Each row is one Form 144 notice: a single affiliate's declared intent to sell a single class of one issuer's securities. The schema is compact because the form itself is compact — it identifies the seller and their tie to the company, sizes the proposed sale and tests it against the volume base, and records when and through whom the sale will occur. The dataset holds 1,681 such notices.

-- sec_form144_notices: 1,681 notice-of-proposed-sale rows
-- One row per Form 144 filing: an intent to sell, not an executed trade.

accession_number       TEXT     -- EDGAR accession, e.g. "0001234567-27-000123"
filing_date            DATE      -- date the notice was filed on EDGAR
issuer_cik             INTEGER   -- CIK of the company whose stock is being sold
issuer_name            TEXT      -- issuer name as reported on the notice
seller_name            TEXT      -- the affiliate / insider proposing the sale
relationship           TEXT      -- seller's relationship to the issuer (Officer, Director, ...)
securities_class       TEXT      -- class of securities, e.g. "Common Stock"
units_to_sell          NUMERIC   -- number of shares the seller proposes to sell
aggregate_market_value NUMERIC   -- proposed aggregate market value of the sale, in USD
approx_sale_date       DATE      -- the approximate date the sale is expected to begin
units_outstanding      NUMERIC   -- shares outstanding of the class (the 1% volume base)
exchange               TEXT      -- exchange or market where the sale will occur
broker_name            TEXT      -- the broker-dealer executing the sale

The fields fall into three natural groups. The identity group — issuer_cik, issuer_name, seller_name, and relationship — answers who is selling and what their standing at the company is. The issuer_cik is the join key to every other EDGAR filing by the company, and the relationship field (Officer, Director, ten-percent owner, or a free-text variant) is what makes a notice an insider signal rather than ordinary float changing hands. The sizing group — securities_class, units_to_sell, aggregate_market_value, and units_outstanding — quantifies the proposed sale and carries the one-percent-of-outstanding base needed to read it against the Rule 144 volume cap. The execution group — approx_sale_date, exchange, and broker_name — records the forward-looking timing and the manner-of-sale plumbing: when the selling is expected to begin and through which broker and market it will flow. The approx_sale_date is the field that gives the dataset its predictive character; it is a date in the near future, not a record of the past.

Form 144 Versus Form 4: Intent Versus Execution

The single most important thing to understand about Form 144 is how it relates to Form 4, because the two forms describe adjacent moments in the same event and pairing them is where most of the analytical value lives. Form 144 is filed before the sale, as a notice of intent; Form 4 is filed after the sale, within two business days, as a record of what was executed. One is a plan; the other is a fact.

DimensionForm 144 (notice of proposed sale)Form 4 (statement of changes)
What it reportsIntent to sell — a planned transactionAn executed transaction that already occurred
Timing relative to tradeFiled before / concurrent with placing the sell orderFiled within two business days after the trade
Legal basisRule 144 under the Securities Act of 1933Section 16(a) of the Exchange Act of 1934
Who filesAffiliates selling restricted or control securitiesOfficers, directors, ten-percent owners (Section 16 insiders)
Directional contentSales only — there is no Form 144 for buyingBoth buys (P) and sells (S), plus grants, exercises, gifts
CertaintyProposed quantity — the sale may shrink or not happenActual quantity, price, and post-transaction holdings

The two forms are not redundant; they bracket the transaction. A Form 144 establishes a ceiling and a calendar — up to this many shares, beginning around this date — and the later Form 4 reveals what was actually done within that envelope. Because they are filed by the same person about the same intended sale, they can be joined on the reporting person and the issuer and read as a before-and-after pair. That join is what surfaces the most interesting patterns in insider selling:

The 2022 Move to Mandatory Electronic Filing

For most of its history, Form 144 was a backwater of the disclosure system precisely because of how it was filed. The form long permitted submission on paper, mailed to the SEC, and a very large share of affiliates — or their brokers, who often filed on their behalf — used the paper route. Paper Form 144s were not part of the structured EDGAR corpus. They were not machine-readable, not full-text searchable, and not joinable to the rest of a company's filings in any automated way. An analyst who wanted to know what insiders were proposing to sell had to contend with a disclosure that existed, technically, in the public record but was, in practice, nearly invisible to systematic analysis.

That changed in 2022. The SEC adopted amendments mandating the electronic filing of Form 144 on EDGAR, eliminating the paper option for the form (alongside a broader push to electronify several residual paper filings). With a phase-in through 2022 and into 2023, Form 144 notices began landing on EDGAR as structured submissions for the first time. The practical consequence for data work is hard to overstate: only after this transition does Form 144 become a dataset at all in the modern sense. The 1,681 notices described here, and the fielded schema above, are a direct product of the electronic-filing mandate — the form's structured fields (seller, relationship, units, aggregate value, broker, sale date) became reliably extractable only once filings arrived as XML on EDGAR rather than as paper in a mailroom.

This is also why any historical analysis of Form 144 has a hard floor. The pre-2022 corpus is thin, paper-bound, and not comparable to the post-mandate record; the dataset effectively begins when the electronic filings begin. The flip side is that, from the mandate forward, Form 144 finally takes its place alongside Form 4 and the Schedule 13 filings as a first-class, machine-readable insider disclosure — which is the development that makes the analyses in the next section possible.

What You Can Do With It

Form 144 answers a question Form 4 cannot: not “what did insiders just sell?” but “what are insiders about to sell?” That forward orientation, combined with the threshold that filters out trivial sales, makes the dataset a focused lens on intended insider selling pressure. The analyses it supports most directly:

Python: Ranking Issuers by Proposed Sale Value, Then Joining to Form 4

The script below runs the full Form 144 workflow against the live EDGAR system. It queries the full-text search index for Form 144 filings over a date range, pulls the structured XML notice for each hit, parses the seller, relationship, units, and aggregate market value, and ranks issuers by the total proposed sale value queued against them. It then sketches the join back to Form 4 — checking, for a given seller, whether an executed Form 4 sale followed the notice — which is how planned selling is separated from completed selling. The same parser scales to the full post-2022 corpus by widening the date range and walking the search pagination.

import time
import requests
from collections import defaultdict

# ---------------------------------------------------------------------------
# SEC EDGAR Form 144 (notice of proposed sale) screen
# Sources:
#   Full-text search:  https://efts.sec.gov/LATEST/search-index?forms=144
#   Submissions API:   https://data.sec.gov/submissions/CIK{cik:010d}.json
#   Filing archive:    https://www.sec.gov/Archives/edgar/data/{cik}/{accession}/
#
# Strategy:
#   1. Query EDGAR full-text search for recent Form 144 filings (e-filed only).
#   2. For each hit, pull the structured XML notice from the filing folder.
#   3. Parse seller, relationship, units, and aggregate market value.
#   4. Rank issuers by total proposed sale value, then join each notice to the
#      later Form 4 to measure follow-through (planned vs. executed).
# ---------------------------------------------------------------------------

HEADERS = {"User-Agent": "research@example.com (form144 research project)"}
EFTS     = "https://efts.sec.gov/LATEST/search-index"
BASE     = "https://www.sec.gov"
DATA_API = "https://data.sec.gov"


# -- 1. Enumerate recent Form 144 filings via full-text search ----------------

def search_form144(date_from, date_to, size=100):
    """Return EDGAR full-text-search hits for Form 144 over a date range."""
    params = {
        "forms":     "144",
        "dateRange": "custom",
        "startdt":   date_from,   # "2027-01-01"
        "enddt":     date_to,     # "2027-03-31"
        "from":      0,
    }
    hits = []
    while True:
        resp = requests.get(EFTS, headers=HEADERS, params=params, timeout=30)
        resp.raise_for_status()
        data = resp.json()
        batch = data.get("hits", {}).get("hits", [])
        if not batch:
            break
        for h in batch:
            src = h.get("_source", {})
            # _id is "accession:primary_doc"; CIK list is in the source.
            acc_doc = h.get("_id", "")
            ciks = src.get("ciks", [])
            hits.append({
                "accession":   acc_doc.split(":", 1)[0],
                "primary_doc": acc_doc.split(":", 1)[1] if ":" in acc_doc else "",
                "filed":       src.get("file_date", ""),
                "ciks":        ciks,
            })
        params["from"] += len(batch)
        if params["from"] >= size:
            break
        time.sleep(0.2)   # respect SEC fair-access rate limits
    return hits


# -- 2. Build the archive URL for a filing's primary document -----------------

def filing_doc_url(cik, accession, primary_doc):
    acc_nodash = accession.replace("-", "")
    return (BASE + "/Archives/edgar/data/" + str(int(cik)) + "/"
            + acc_nodash + "/" + primary_doc)


# -- 3. Parse a single Form 144 XML notice -----------------------------------

def parse_form144(xml_text):
    """Parse the structured fields from an e-filed Form 144 XML document."""
    import xml.etree.ElementTree as ET
    # Strip the default namespace to keep XPath expressions simple.
    root = ET.fromstring(xml_text)
    for el in root.iter():
        if "}" in el.tag:
            el.tag = el.tag.split("}", 1)[1]

    def text(tag):
        return (root.findtext(".//" + tag) or "").strip()

    def num(tag):
        raw = text(tag).replace(",", "").replace("$", "")
        try:
            return float(raw)
        except ValueError:
            return 0.0

    # Field names follow the SEC Form 144 XML technical specification; element
    # paths vary slightly by version, so prefer tolerant lookups in production.
    return {
        "issuer_name":            text("issuerName"),
        "issuer_cik":             text("issuerCik"),
        "seller_name":            text("personName") or text("nameOfPersonForWhoseAccount"),
        "relationship":           text("relationshipToIssuer") or text("natureOfOwnership"),
        "securities_class":       text("securitiesClassTitle") or text("titleOfSecuritiesClass"),
        "units_to_sell":          num("noOfUnitsSold") or num("numberOfUnitsToBeSold"),
        "aggregate_market_value": num("aggregateMarketValue"),
        "approx_sale_date":       text("approxSaleDate"),
        "units_outstanding":      num("noOfUnitsOutstanding"),
        "exchange":               text("nameOfExchange") or text("securitiesExchangeName"),
        "broker_name":            text("brokerName") or text("nameOfBroker"),
    }


# -- 4. Aggregate proposed sale value by issuer ------------------------------

def rank_issuers(notices):
    """Sum proposed aggregate market value by issuer and rank descending."""
    by_issuer = defaultdict(lambda: {"value": 0.0, "units": 0.0, "filings": 0})
    for n in notices:
        key = n["issuer_name"] or n["issuer_cik"] or "(unknown)"
        by_issuer[key]["value"]   += n["aggregate_market_value"]
        by_issuer[key]["units"]   += n["units_to_sell"]
        by_issuer[key]["filings"] += 1
    return sorted(by_issuer.items(), key=lambda kv: -kv[1]["value"])


# -- 5. Join a Form 144 notice to the later Form 4 (follow-through) -----------

def form4_follow_through(seller_cik10, after_date, window_days=90):
    """Did the seller actually file a Form 4 sale after the notice?

    Returns the count of S-coded Form 4 filings by this reporting person within
    window_days of the notice. Zero means the proposed sale was not (yet) executed.
    """
    url  = DATA_API + "/submissions/CIK" + seller_cik10 + ".json"
    data = requests.get(url, headers=HEADERS, timeout=30).json()
    recent = data.get("filings", {}).get("recent", {})
    forms  = recent.get("form", [])
    filed  = recent.get("filingDate", [])
    count = 0
    for form, fdate in zip(forms, filed):
        if form == "4" and fdate >= after_date:
            count += 1   # transaction-level S/P parsing omitted for brevity
    return count


# -- Main --------------------------------------------------------------------

print("Searching EDGAR for Form 144 notices ...")
hits = search_form144("2027-01-01", "2027-03-31", size=60)
print("  Found " + str(len(hits)) + " Form 144 filings")

notices = []
for h in hits:
    if not h["ciks"] or not h["primary_doc"].endswith(".xml"):
        continue
    cik = h["ciks"][0]
    url = filing_doc_url(cik, h["accession"], h["primary_doc"])
    try:
        xml_text = requests.get(url, headers=HEADERS, timeout=30).text
        rec = parse_form144(xml_text)
        rec["accession"]   = h["accession"]
        rec["filing_date"] = h["filed"]
        notices.append(rec)
    except Exception as e:
        print("  skip " + h["accession"] + " -- " + str(e))
    time.sleep(0.15)

print("\nParsed " + str(len(notices)) + " structured notices")

ranked = rank_issuers(notices)
print("\nTop issuers by proposed aggregate sale value:")
for name, agg in ranked[:10]:
    val = format(agg["value"], ",.0f")
    print("  " + name[:34].ljust(36) + "$" + val.rjust(14)
          + "   (" + str(agg["filings"]) + " notices)")

# Total proposed insider selling pressure in the window
total = sum(n["aggregate_market_value"] for n in notices)
print("\nTotal proposed sale value across all notices: $" + format(total, ",.0f"))

A few implementation notes. The full-text search endpoint returns only e-filed documents, which is exactly the post-2022 Form 144 universe; pre-mandate paper notices will not appear, and that is the expected behavior, not a gap to work around. Form 144 XML uses a default namespace and its element names have shifted across versions of the technical specification, so the parser strips the namespace and uses tolerant field lookups — production code should consult the current Form 144 XML specification and add fallbacks for the fields that matter most. The Form 4 join shown here is deliberately schematic: a rigorous follow-through measure parses the Form 4 transaction tables for S-coded (sale) transactions, matches the security class and approximate dates, and divides shares executed by shares proposed. As with all EDGAR access, the SEC's fair-access policy requires a descriptive User-Agent header carrying a contact email and a request rate no higher than ten per second; the time.sleep calls keep the script inside that limit.

Caveats

A notice is intent, not execution. This is the defining limitation and it bears repeating. A Form 144 records what an affiliate proposed to sell, not what they sold. The seller may sell the full amount, a fraction, or nothing at all; the notice sets a ceiling and a rough start date, and nothing more. The units_to_sell and aggregate_market_value fields are proposals, and treating them as realized sales will systematically overstate insider selling. The only way to know what actually happened is to join to the executed Form 4 — which is why that join is central rather than optional.

The pre-2022 set is small and not comparable. Because mandatory electronic filing arrived only in 2022, the structured Form 144 record effectively begins then. Any attempt to build a long historical time series will run into a thin, paper-era floor that is not consistent with the modern e-filed data. Cross-period comparisons that straddle the mandate are comparing a near-complete record against a fragmentary one, and conclusions about “trends” across that boundary are unreliable.

Amendments and superseded notices. Form 144 notices can be amended, and a seller may file multiple overlapping notices as a selling program rolls forward across successive three-month windows. Naively summing every notice for an issuer can double-count the same intended shares when an amendment revises an earlier filing or when sequential notices cover a continuing plan. De-duplicating on the reporting person, security class, and overlapping date ranges — and treating amendments as replacements rather than additions — is necessary before aggregating proposed sale value, or the insider-pressure figures will be inflated.

Threshold blindness and broker filing. Sales below the 5,000-share and $50,000 thresholds never generate a notice, so the dataset is structurally blind to smaller affiliate sales; it captures the large, economically meaningful liquidations and misses the long tail. And because brokers frequently file Form 144 on the seller's behalf, the broker_name and the precise field formatting can vary with the filer's own conventions, which is one more reason to prefer the structured CIK-based identity of the issuer over free-text name matching when joining the notice to the rest of the EDGAR record.


Related writing

For the executed counterpart to the Form 144 notice — the two-business-day record of what insiders actually bought and sold, and the form you join to in order to measure follow-through — see SEC Form 4 Insider Trading: The Federal Database Behind Corporate Insider Stock Transactions.

For the other major insider-and-ownership disclosure regime — the threshold filing that activist investors and large holders must make when building a controlling stake — see SEC Schedule 13D Filings: The Federal Database Behind Activist Investor Stakes.

For the fund-level holdings disclosure that exposes restricted (Rule 144 and 144A) securities inside registered fund portfolios — the same restricted-stock category Form 144 governs at the seller level — see SEC N-PORT Mutual Fund Holdings: The Federal Database Behind Every Fund Portfolio Position.