US IPOs (Initial Public Offerings)
This guide provides a comprehensive reference for integrating U.S. IPOs into your platform.
Overview of US IPOs
Alpaca offers access to a broad range of US IPO offerings, allowing partners to buy shares at the IPO listing, before the stock becomes available on the secondary market.
The IPO API provides:
- Read-only discovery of IPO offerings
- Order placement and management via the existing Broker API
- Real-time offering updates via Server-Sent Events (SSE)
Order Management
US IPOs only accept notional (dollar amount) GTC orders. End-users are able to place one conditional order to buy (COBs) per IPO offering, once it becomes available in the API. This order can be modified/canceled until the 60 minute window ends.
Fractional shares are not supported for IPOs.
IPO Timeline
Below is an example of an IPO timeline. Please note that not all IPOs follow this timeline and they’re always subject to change.
| Step | Event | Description | Date & Time (ET) |
|---|---|---|---|
| 1 | Order Entry Window Opens | Investors begin submitting Conditional Offers to Buy (COBs). | Monday, June 9 at 9:00 AM |
| 2 | 60-Minute Notice Sent | Final withdrawal/modification window before pricing. COBs become binding after this. | Wednesday, June 11 at 3:00 PM |
| 3 | Allocation Engine Runs | Allocation algorithm executed based on demand and allocation. | Thursday, June 12 at 7:01 AM |
| 4 | Alpaca sends allocations to partner | Allocation info sent to partner via API | Thursday, June 12 at 7:30 AM |
| 5 | IPO Date | Stock starts trading on listing exchange | Thursday, June 12 at 11:00 AM |
| 6 | Allocations Settled | Shares delivered via DTC to partner clearing accounts (T+1) | Friday, June 13 |
Authentication
Authentication uses the same Alpaca OAuth 2.0 bearer token used for Broker API. No changes are required.
Example header:
Authorization: Bearer <token>| Response Code | Description |
|---|---|
401 Unauthorized | Missing, invalid, or expired token |
403 Forbidden | Valid token without sufficient scope |
For more information, see Authentication.
Attributes
| Attribute | Type | Notes |
|---|---|---|
| name | string | The official name of the offering. |
| description | string | A longer human-readable description of the offering, when available. |
| ticker_symbol | string | The ticker symbol that will be used once the security begins trading on the secondary market. |
| ipo_reference | string | The unique offering identifier used across the IPO Events Stream and /v1/ipos/{offering_reference}. Also the path parameter on the get-one endpoint, where it is named offering_reference. |
| cusip_id | string | CUSIP identifier of the offering. |
| logo_small | string | URL to a small logo asset for the issuer. |
| prospectus_url | string | URL to the prospectus document. Mirrors the prospectus_url payload of the corresponding Prospectus event on the IPO Events Stream. |
| offering_type | string | The type of offering. Currently always IPO. |
| availability | string enum | Whether the offering is currently accepting orders. One of available, not_available, closed. See Availability. |
| anticipated_shares | integer | Anticipated total share count for the offering, when known. |
| max_price | string | Upper bound of the indicated price range. |
| min_price | string | Lower bound of the indicated price range. |
| trade_date | string (date) | Anticipated first trading date on the secondary market, in YYYY-MM-DD format. |
| settlement_date | string (date) | Anticipated settlement date, in YYYY-MM-DD format. |
| no_new_orders | boolean | When true, the offering is in its 60-minute pricing window and is not accepting new orders. This mirrors the SixtyMinMail event on the IPO Events Stream. |
| underwriters | array of strings | List of underwriter names participating in the offering. |
| unit_step_size | string | The minimum increment in which order quantities can be specified. |
| min_ticket_size | string | Minimum allowed order amount. |
| max_ticket_size | string | Maximum allowed order amount. |
Endpoints
List IPO Offerings
GET /v1/ipos
Retrieves a paginated list of IPO offerings.
Parameters
| Parameter | Type | Description | Notes |
|---|---|---|---|
availability | string | IPO availability status | not_available, available, closed |
ticker | string | Filter by stock ticker | e.g., EXMP, ACME |
limit | integer | Number of results per page | Default: 50, Max: 200 |
page_token | string | Token for pagination | Used to fetch the next page |
Example Request
curl -s -H "Authorization: Bearer $TOKEN" \
"https://broker-api.alpaca.markets/v1/ipos?availability=available&limit=50"Example Response (200)
{
"data": [
{
"name": "Example Corp",
"description": "Example business description",
"ticker_symbol": "EXMP",
"ipo_reference": "OFF-123",
"cusip_id": "123456789",
"logo_small": "https://cdn.example.com/exmp.png",
"prospectus_url": "https://example.com/prospectus.pdf",
"offering_type": "IPO",
"availability": "available",
"anticipated_shares": 1000000,
"max_price": "25.00",
"min_price": "20.00",
"trade_date": "2026-02-15",
"settlement_date": "2026-02-18",
"no_new_orders": false,
"underwriters": ["Bank A", "Bank B"],
"unit_step_size": "1",
"min_ticket_size": "100",
"max_ticket_size": "10000"
}
],
"next_page_token": null
}Get IPO by ID
GET /v1/ipos/{ipo_reference}
Retrieves a single IPO offering by its reference ID.
Example Request
curl -s -H "Authorization: Bearer $TOKEN" \
"https://broker-api.alpaca.markets/v1/ipos/OFF-123"Example Response (200)
{
"data": {
"name": "Example Corp",
"description": "Example business description",
"ticker_symbol": "EXMP",
"ipo_reference": "OFF-123",
"cusip_id": "123456789",
"logo_small": "https://cdn.example.com/exmp.png",
"prospectus_url": "https://example.com/prospectus.pdf",
"offering_type": "IPO",
"availability": "available",
"anticipated_shares": 1000000,
"max_price": "25.00",
"min_price": "20.00",
"trade_date": "2026-02-15",
"settlement_date": "2026-02-18",
"no_new_orders": false,
"underwriters": ["Bank A", "Bank B"],
"unit_step_size": "1",
"min_ticket_size": "100",
"max_ticket_size": "10000"
}
}Placing IPO Orders
IPO orders are placed using the existing Broker API Create Order endpoint.
Important Notes
- Use the
ipo_reference(offering reference) as thesymbolfield in order requests - IPO orders are notional-only: provide
notional; omitqty - Only
side=buyis accepted for IPOs type:market(default)time_in_force:gtc(default) — effective only during the offering period and the 60-minute withdrawal window- Orders are validated against offering constraints (
min_ticket_size,max_ticket_size,unit_step_size)
Place an IPO Order
POST /v1/trading/accounts/{account_id}/orders
Placing new orders is only allowed before the 60-minute window starts.
Example Request
curl -s -X POST \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
"https://broker-api.alpaca.markets/v1/trading/accounts/{account_id}/orders" \
-d '{
"symbol": "OFF-123",
"side": "buy",
"type": "market",
"time_in_force": "gtc",
"notional": "1000.00",
"client_order_id": "my-unique-order-123"
}'Example Response (200)
{
"id": "b50c01d4-3d71-4295-8426-93c953c1ceb6",
"client_order_id": "my-unique-order-123",
"status": "new",
"asset_class": "ipo",
"symbol": "OFF-123",
"notional": "1000.00",
"side": "buy",
"type": "market",
"time_in_force": "gtc",
"created_at": "2026-01-19T15:30:00.000Z",
"submitted_at": "2026-01-19T15:30:00.000Z"
}Replace an IPO Order
PATCH /v1/trading/accounts/{account_id}/orders/{order_id}
Example Request
curl -s -X PATCH \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
"https://broker-api.alpaca.markets/v1/trading/accounts/{account_id}/orders/{order_id}" \
-d '{
"notional": "1500.00"
}'Possible Error
{
"code": 40320060,
"message": "modification window closed",
"details": "Order modifications are only allowed until the 60-minute withdrawal window closes."
}Cancel an IPO Order
DELETE /v1/trading/accounts/{account_id}/orders/{order_id}
Example Request
curl -s -X DELETE \
-H "Authorization: Bearer $TOKEN" \
"https://broker-api.alpaca.markets/v1/trading/accounts/{account_id}/orders/{order_id}"Get IPO Order
GET /v1/trading/accounts/{account_id}/orders/{order_id}
Retrieve the current status of an IPO order.
Example Request
curl -s -H "Authorization: Bearer $TOKEN" \
"https://broker-api.alpaca.markets/v1/trading/accounts/{account_id}/orders/{order_id}"Example Response (200)
{
"id": "b50c01d4-3d71-4295-8426-93c953c1ceb6",
"client_order_id": "my-unique-order-123",
"status": "new",
"asset_class": "ipo",
"symbol": "OFF-123",
"notional": "1000.00",
"filled_qty": "0",
"filled_avg_price": null,
"side": "buy",
"type": "market",
"time_in_force": "gtc",
"created_at": "2026-01-19T15:30:00.000Z",
"submitted_at": "2026-01-19T15:30:00.000Z",
"filled_at": null
}List IPO Orders
GET /v1/trading/accounts/{account_id}/orders
List orders for an account, optionally filtered by IPO symbol.
Parameters
| Parameter | Type | Description |
|---|---|---|
symbols | string | Filter by IPO symbol (ipo_reference) |
status | string | Filter by order status |
limit | integer | Number of results (default: 50, max: 500) |
Example Request
curl -s -H "Authorization: Bearer $TOKEN" \
"https://broker-api.alpaca.markets/v1/trading/accounts/{account_id}/orders?symbols=OFF-123"Order Status Flow
IPO orders follow a specific lifecycle:
| Status | Description |
|---|---|
pending_new | Order submitted, awaiting acknowledgment (transient) |
new | Order accepted, awaiting allocation |
filled | Shares allocated at final price |
canceled | Order canceled during withdrawal window |
rejected | Order rejected (constraints not met, offering closed, etc.) |
replaced | Order replaced |
Typical flow:
- Order placed →
pending_new(briefly) - Acceptance →
new - Allocation received →
filled(withfilled_qtyandfilled_avg_pricepopulated)
Note: Available 24/7, so orders transition from pending_new to new immediately upon acceptance. Orders remain in new status until the offering closes and allocations are distributed. The pending_new status is transient and should resolve within seconds.
Important: The statuses held, accepted, pending_cancel, and pending_replace are not part of the standard IPO order lifecycle. If you observe these statuses persisting, it may indicate an issue.
Server-Sent Events (SSE)
GET /v2/events/ipos
Stream real-time IPO updates including offering changes, availability updates, allocations, and timeline milestones.
Event Types
| Event | Description | Visibility |
|---|---|---|
offering | New IPO offering created | Broadcast |
offeringUpdate | Offering details changed | Broadcast |
offeringCancellation | Offering cancelled | Broadcast |
prospectus | Prospectus URL updated | Broadcast |
sixtyMinMail | 60-minute withdrawal window started | Broadcast |
allocation | Shares allocated to user | Per-account |
Visibility:
- Broadcast events are sent to all connected clients
- Per-account events are filtered to the specific account that received the allocation
Event Schema
All events follow a common envelope structure:
{
"verb": "offering",
"offering_reference": "FI111225",
"payload": {},
"received_at": "2026-01-14T10:30:00.000Z"
}payload contains event-specific fields for each verb.
| Field | Type | Description |
|---|---|---|
verb | string | Event type identifier |
offering_reference | string | Unique IPO offering ID |
payload | object | Event-specific data |
received_at | string (RFC3339) | Timestamp when the event was received |
Allocation Events
Allocation events include additional account-specific fields:
{
"verb": "allocation",
"offering_reference": "FI111225",
"account_number": "511768662",
"correspondent": "LPCA",
"payload": {
"cusip_id": "123456789",
"final_price": "20.00",
"allocated_shares": "100",
"allocated_amount": "2000.00",
"subject": "IPO Allocation: Example Corp"
},
"received_at": "2026-01-14T09:30:00.000Z"
}| Field | Type | Description |
|---|---|---|
account_number | string | Alpaca account number |
correspondent | string | Broker correspondent code (e.g., LPCA) |
Example Request
curl -N \
-H "Accept: text/event-stream" \
-H "Authorization: Bearer $TOKEN" \
"https://broker-api.alpaca.markets/v2/events/ipos"Example Event Payloads
Offering Created:
data: {"verb":"offering","offering_reference":"FI111225","payload":{"name":"Example Corp","ticker_symbol":"EXMP","offering_type_name":"IPO","available_to_order":1,"min_price":"18.00","max_price":"22.00"},"received_at":"2026-01-14T10:30:00.000Z"}Sixty-Minute Mail:
data: {"verb":"sixtyMinMail","offering_reference":"FI111225","payload":{"subject":"60-minute withdrawal window: Example Corp"},"received_at":"2026-01-14T08:00:00.000Z"}Allocation:
data: {"verb":"allocation","offering_reference":"FI111225","account_number":"511768662","correspondent":"LPCA","payload":{"final_price":"20.00","allocated_shares":"100","allocated_amount":"2000.00"},"received_at":"2026-01-14T09:30:00.000Z"}Response Headers
| Header | Value |
|---|---|
Content-Type | text/event-stream |
Cache-Control | no-cache |
Connection | keep-alive |
Notes
- Reconnect on connection drops; reconcile by calling
GET /v1/iposto fetch current state. - Browser note: Native
EventSourcedoes not support setting headers; use a polyfill or fetch-based SSE shim that allows passing theAuthorizationheader.
The sixtyMinMail Event
sixtyMinMail EventThis event signals the start of the 60-minute COB (Conditional Order to Buy) withdrawal/cancelation final window on the effective date:
- Investors can cancel or modify orders during this window
- It’s not allowed to place a new order after the 60-minute withdrawal window starts
- After the window ends, the COB becomes binding
- Consider offering an additional email notification for audibility
Pagination
- Use
limitandpage_tokenon list endpoints - On 200 responses,
next_page_tokenis returned if more results are available - Pass
next_page_tokenaspage_tokenin subsequent requests
Error Handling
Where errors come from
- API response (synchronous) — The server may return an HTTP error status and a JSON body with code and message.
- Trade events (SSE, asynchronous) — After an order is accepted, it may later be rejected. That rejection is delivered on the account’s event stream with event or
order.status=rejectedand areasonfield when provided.
REST API
On error the API returns:
- HTTP status: 400, 401, 403, 404, 422, 429, 500, 501, 503, 504
- JSON body:
code(number),message(string)
Example:
{ "code": 40020012, "message": "IPO orders must specify notional and omit qty" }General error codes (all APIs, including IPO)
The same error codes and HTTP statuses that apply to all Alpaca API endpoints also apply to IPO endpoints. See the main API documentation for the full list.
IPO-specific error codes
IPO order create and replace can return the following. HTTP status varies (404, 422, 500, 501, 429, 503, 504).
| HTTP Status Code | Error Code | Error Message |
|---|---|---|
| 422 | 40020010 | time_in_force must be gtc for IPO orders |
| 422 | 40020011 | type must be market for IPO orders |
| 422 | 40020012 | IPO orders must specify notional and omit qty |
| 422 | 40020013 | IPO orders must be buy side |
| 422 | 42210000 | IPO trading is not enabled for this account |
| 404 | 40410000 | IPO asset not found: <symbol> |
| 404 | 40410000 | order not found |
| 422 | 42210000 | IPO offering details not found |
| 422 | 42210000 | IPO offering is not available to order |
| 422 | 42210000 | invalid notional value: <detail> |
| 422 | 42210000 | IPO orders only support buy side |
| 422 | 42210000 | order amount <X> is below minimum ticket size <Y> |
| 422 | 42210000 | order amount <X> is above maximum ticket size <Y> |
| 422 | 42210000 | order amount <X> is not a multiple of step size <Y> |
| 422 | 42210000 | account already has an open order for offering asset <symbol> |
| 422 | 42210000 | order is not an IPO order |
| 422 | 42210000 | order is not open, status: <status> |
| 422 | 42210000 | cannot replace order in pending_cancel status |
| 422 | 42210000 | order already pending replacement |
| 422 | 42210000 | notional is required for IPO order replacement |
| 501 | 50110000 | IPO trading is not enabled |
| 500 | 50010000 | failed to route IPO order: <detail> |
| 500 | 50010000 | internal server error occurred |
| 429 | 42910000 | rate limit exceeded |
| 503 | 50310000 | service unavailable |
| 504 | 50410000 | request timed out |
Trade events (SSE)
Rejections after order acceptance are delivered on the account’s trade event stream. The payload includes event or order.status (e.g. rejected) and when provided, a reason string. Rejection reasons are free text and may vary (e.g. offering closed, eligibility, duplicate order, allocation).
Integration Checklist
- Ensure your OAuth token has the required scopes
- Implement
GET /v1/iposto discover available offerings - Use the
ipo_referenceas thesymbolwhen placing orders - Validate orders against
min_ticket_size,max_ticket_size, andunit_step_size - Use notional-only orders (omit
qty) - Handle the 60-minute withdrawal window for order modifications
- Subscribe to SSE events for real-time updates (
GET /v2/events/ipos) - Implement reconnection logic for SSE streams
Investments in initial public offerings (“IPOs”) involve significant risks and are not suitable for all investors. IPO securities have no prior public trading history, and the offering price may not reflect the market price following the offering. The market price of IPO securities may be volatile, and investors may lose part or all of their investment.
Information regarding an IPO issuer may be limited, and the issuer may have a limited operating history or may not be profitable. There can be no assurance that an active or liquid trading market will develop.
This material is provided for informational purposes only and does not constitute an offer to sell or a solicitation of an offer to buy securities. Any offer will be made solely by means of a prospectus filed with the U.S. Securities and Exchange Commission. Investors should carefully review the prospectus, including the risk factors described therein, before investing.
Updated about 2 hours ago