Lockup Expirations
See when restricted shares become eligible to join the market, and how large the locked block is relative to the shares sold in the offering. Track historical and upcoming IPO and follow-on lockups, with a separate row for each release tranche and the prospectus terms behind it.
Watch the next release.
date marks expiration; shares_sellable_from identifies the first NYSE session on or after it.
Size the block against the float.
locked_to_float_ratio compares the total locked block with offering float; tranche_pct sizes each staged release.
Check what could move the date.
early_release_type and early_release_terms surface earnings, price, and staged-release conditions.
Which companies have large share lockups expiring soon? Rank them by the size of the release relative to their offering float, and explain any conditions that could let holders sell earlier.
Your agent uses get_lockup_expirations to check upcoming dates, locked blocks, tranche percentages, and early-release terms.
The release schedule behind restricted shares.
A lockup is an agreement that restricts when existing holders can sell their shares after an offering. The dataset covers operating-company IPOs and follow-on offerings by already-public issuers. A tranche is one part of a release schedule: a single expiration produces one row, while a staged release produces several rows for the same prospectus.
Each row includes:
- Issuer identity, offering type, and the prospectus accession number.
- The expiration date and first NYSE session on or after it.
- The total locked block, offering float, and tranche percentage.
- Early-release conditions and their original wording.
- Quality, publication, and update timestamps for research and monitoring.
A lockup expiration makes shares eligible for sale. It does not establish that holders will sell, how much they will sell, or which way the stock will move.
Put a date and a size on potential share supply.
Use the calendar to build an event watchlist before a release reaches the market. A large locked block relative to the offering float identifies a different supply setup from a small release, even when the two companies have similar market values.
For staged schedules, locked_shares and locked_to_float_ratio describe the whole offering's locked block. Multiply by tranche_pct divided by 100 to estimate the portion assigned to one tranche when that percentage is known. Adding the full block across rows would count the same shares repeatedly.
- Monitor upcoming releases and inspect the conditions behind the dates
- Compare release size with offering float across IPO and follow-on cohorts
- Anchor event studies to expiration or the first sellable session, with availability checks
Read from the prospectus, followed as the date approaches.
Terms come from SEC final prospectuses, Forms 424B4 and 424B1, with prospectus history from 2021. Alphanume structures the release schedule and share counts, then refreshes the calendar daily. Blank-check SPAC IPOs, de-SPAC sponsor lockups, resale-only prospectuses, and non-equity offerings are outside this release.
Expiration is calculated from the contractual anchor and the lockup's calendar-day length. The anchor is usually the prospectus date; closing- or first-trading-based language uses a different anchor. The trading-session calendar rolls expiration forward when necessary. IPO first-trade dates come from Polygon, and market-cap context comes from Alphanume's history.
Separate the total locked block from this release.
The headline fields below are a subset. Every field, with exact types and semantics, is documented in the API reference.
| Field | Type | What it tells you |
|---|---|---|
| lockup_type | string | ipo or follow_on. Operating-company IPOs and offerings by already-reporting issuers, respectively. |
| locked_shares | integer | null | Total locked block for the offering, not this tranche alone. Prospectus-stated count, otherwise outstanding shares minus offered shares. |
| float_shares_at_offering | integer | null | Offering shares plus over-allotment when its exercise is stated. An offering-float measure, not today's free float. |
| locked_to_float_ratio | number | null | Total locked block divided by offering float. 3 means 3 times the float; apply tranche_pct to size an individual release. Null for missing inputs or ratios above 200. |
| tranche_pct | number | null | Percentage of the total locked block assigned to this tranche. 100 for a single release; null when the staged percentage is unavailable. |
| date | string | Expiration date: contractual anchor plus lockup_days. Can be future-dated; date filters use this field. |
| shares_sellable_from | string | First NYSE session on or after expiration, rolling weekends and holidays forward. Does not confirm actual selling. |
| early_release_type | string | none, earnings, price, staggered, mixed, or other. For non-none values, treat date as the contractual outside date; earlier conditional dates are not computed. |
| early_release_terms | string | null | Verbatim early-release or staged-release clause. Null for a plain fixed-period lockup. |
| first_seen_at | string | First observation of the prospectus. Pre-launch backfilled rows use a synthetic filing timestamp, not observed live availability. |
| published_at | string | When the row was first published into the served table. |
Query upcoming lockups. Inspect an illustrative response.
One key works across the REST API, the hosted MCP server, and this dashboard. Every response is JSON with a { count, data } envelope.
import requests
url = "https://api.alphanume.com/v1/capital/lockup-expirations"
params = {
"upcoming": "true",
"min_locked_to_float": 2,
"api_key": "alp_abc123"
}
r = requests.get(url, params=params)
r.raise_for_status()
print(r.json())curl "https://api.alphanume.com/v1/capital/lockup-expirations?upcoming=true&min_locked_to_float=2&api_key=alp_abc123"{
"count": 1,
"has_more": false,
"next_cursor": null,
"data": [
{
"record_id": 1001,
"ticker": "EXAMPLE",
"cik": 1234567,
"company_name": "Example Industries (illustrative)",
"exchange": "Nasdaq Global Market",
"accession_no": "0001234567-26-000001",
"lockup_type": "ipo",
"offering_date": "2026-04-23",
"first_trade_date": "2026-04-24",
"shares_offered": 10000000,
"shares_outstanding_post_offering": 40000000,
"locked_shares": 30000000,
"locked_pct_of_outstanding": 75,
"float_shares_at_offering": 10000000,
"locked_to_float_ratio": 3,
"tranche_seq": 1,
"tranche_count": 1,
"tranche_pct": 100,
"lockup_days": 180,
"date": "2026-10-20",
"expiration_date": "2026-10-20",
"shares_sellable_from": "2026-10-20",
"early_release_type": "none",
"early_release_terms": null,
"status": "upcoming",
"market_cap_at_offering": null,
"confidence": 0.9,
"first_seen_at": "2026-04-24 07:00:00",
"published_at": "2026-09-12 07:25:00",
"last_updated": "2026-09-12 07:25:00"
}
]
}What this data does not claim.
- Conditional early releases can precede the displayed expiration. For non-none early_release_type values, treat date as the contractual outside date and read the terms; earlier conditional dates are not calculated.
- Offering float is not today's free float. Unconfirmed over-allotment exercise can leave it understated. Share counts can be missing; ratios above 200 are withheld as a unit-sanity check.
- New IPO tickers and first-trade dates can arrive later. Market-cap history starts in 2024 and can lag fresh listings. Missing context does not mean zero.
- Pre-launch first_seen_at values are synthetic filing timestamps. Historical rows can change with later enrichment, so expiration-date filters alone do not reconstruct what was available at a past decision time.
- The response shown here uses a fictional company and illustrative values. It is a schema example, not a live record.
Asked by researchers, answered plainly.
Can I query only IPO lockup expirations?
Yes. Set lockup_type=ipo for operating-company initial offerings or follow_on for offerings by already-reporting issuers. Leave it unset to include both.
How do I open the prospectus behind a lockup?
Use cik and accession_no to locate the filing in SEC EDGAR. All tranches from that prospectus share the accession, so you can inspect the release schedule together.
Why can an offering be absent from the calendar?
An offering with no identified lockup language produces no row. Re-filed prospectuses can also appear under separate accessions, so check the offering identity when building cohorts.
Can I use this calendar through an AI agent?
Yes. The hosted MCP server exposes get_lockup_expirations with the same date, offering-type, and release filters. Full history and the forward calendar require Pro access; there is no public row preview.
Available with Pro. Enterprise for teams.
New REST API and MCP access requires Pro or Enterprise. Public dashboard previews are separate from a subscription. Pro includes the available historical record, current updates, REST, MCP, dashboard exports, and every standard dataset as it launches. This dataset has no public row preview; the dashboard provides a field guide and illustrative response.