---
title: "Lock-up expiration calendar: when insider and pre-offering shares become"
method: GET
path: "/v1/capital/lockup-expirations"
---

# Lock-up expiration calendar: when insider and pre-offering shares become

`GET /v1/capital/lockup-expirations`

## Request

- Base URL: `https://api.alphanume.com`
- URL: `https://api.alphanume.com/v1/capital/lockup-expirations`
- Auth: one of:
  - API key in header `X-API-Key`
  - HTTP bearer

Lock-up expiration calendar: when insider and pre-offering shares become
eligible for sale after a US IPO or follow-on offering, past and UPCOMING,
with the size of the locked block versus the offering float.

One row per lock-up tranche per offering, sourced from the final prospectus
(SEC Form 424B4 / 424B1) filed the day after pricing. `date` (also served as
expiration_date) = the lock-up anchor (normally the prospectus date) plus the
lock-up length in calendar days; shares_sellable_from is the first NYSE session
on or after it. A plain 180-day lock-up is one row (tranche_seq 1 of 1); a
staggered release is several rows sharing accession_no with tranche_pct.
lockup_type separates operating-company IPOs (typically 180 days) from
follow-on offerings by already-public issuers (typically 60-90 days).
Blank-check (SPAC) IPOs are excluded. History from 2021.

Sizing: locked_shares is the prospectus-stated locked count where given,
otherwise shares outstanding after the offering minus shares offered.
float_shares_at_offering = shares sold in the offering (plus the
over-allotment when its exercise is stated); locked_to_float_ratio = locked /
float, so 3.0 means three times the offering float unlocks on `date`.
locked_pct_of_outstanding is the same block as a share of total shares
outstanding.

Requires an Alphanume Pro API key. There is no date clamp on this route: a Pro
key sees full history and the forward calendar.

Honest limits, stated plainly. Early-release clauses are common in recent
IPOs (a release tied to the first earnings announcement, a price-based
release, or staged tranches); the row carries early_release_type and the
verbatim early_release_terms, but v1 does not compute the earlier date --
treat `date` as the contractual outside date when early_release_type is not
'none'. The over-allotment exercise is unknown at prospectus time, so the
float can be understated by up to 15%. ticker may be NULL for a few days on a
brand-new IPO; first_trade_date is IPO-only (NULL on follow-ons);
market_cap_at_offering is NULL until the cap history covers the ticker; rows
are never dropped for missing enrichment. confidence (0-1) is a per-row
quality signal for the extracted terms; 0.9 means every term was resolved by
the deterministic parser. first_seen_at is when our pull first observed the
prospectus (synthetic = filing time for rows backfilled before launch).

Default order: upcoming expirations first, nearest to today first, then
already-expired rows most recent first -- so the first page is the calendar
of what happens next.

Pagination: results are capped at 50,000 rows per request; when the response
has has_more=true, pass next_cursor's cursor_date, cursor_ticker and cursor_id
back to fetch the next page.

## Query parameters

- `ticker` string
- `date` string
- `date_gte` string
- `date_lte` string
- `date_gt` string
- `date_lt` string
- `upcoming` string
- `lockup_type` 'ipo' | 'follow_on'
- `status` 'upcoming' | 'expired'
- `early_release` string
- `min_locked_to_float` number
- `min_confidence` number
- `updated_since` string
- `cursor_date` string
- `cursor_ticker` string
- `cursor_id` integer

## Response `200`

Matching rows.

- PaginatedEnvelope
  - `count` integer, required
  - `data` object[], required
  - `has_more` boolean, required
  - `next_cursor` object, nullable, required: Keyset cursor: pass its fields back as the cursor_* query parameters to fetch the next page.

## Other responses

- `400`: Invalid or conflicting query parameters.
- `401`: Missing or unrecognized API key.
- `403`: PRO_SUBSCRIPTION_REQUIRED: the key's plan does not include API access (every endpoint requires an active Pro subscription), or this Pro-only dataset is not covered by the key. No choice of dates makes the request succeed. The data is not missing.
- `429`: Rate limit exceeded (600/min); the body carries retry_after_seconds.

---

[API](https://skmtc.dev/alphanume/apis/alphanume-api.md) · [All operations](https://skmtc.dev/alphanume/apis/alphanume-api/llms.txt) · [OpenAPI document](https://skmtc.dev/alphanume/apis/alphanume-api/revisions/2cb83f10bba4?raw)
