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.

StepEventDescriptionDate & Time (ET)
1Order Entry Window OpensInvestors begin submitting Conditional Offers to Buy (COBs).Monday, June 9 at 9:00 AM
260-Minute Notice SentFinal withdrawal/modification window before pricing. COBs become binding after this.Wednesday, June 11 at 3:00 PM
3Allocation Engine RunsAllocation algorithm executed based on demand and allocation.Thursday, June 12 at 7:01 AM
4Alpaca sends allocations to partnerAllocation info sent to partner via APIThursday, June 12 at 7:30 AM
5IPO DateStock starts trading on listing exchangeThursday, June 12 at 11:00 AM
6Allocations SettledShares 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 CodeDescription
401 UnauthorizedMissing, invalid, or expired token
403 ForbiddenValid token without sufficient scope

For more information, see Authentication.


Attributes

AttributeTypeNotes
namestringThe official name of the offering.
descriptionstringA longer human-readable description of the offering, when available.
ticker_symbolstringThe ticker symbol that will be used once the security begins trading on the secondary market.
ipo_referencestringThe 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_idstringCUSIP identifier of the offering.
logo_smallstringURL to a small logo asset for the issuer.
prospectus_urlstringURL to the prospectus document. Mirrors the prospectus_url payload of the corresponding Prospectus event on the IPO Events Stream.
offering_typestringThe type of offering. Currently always IPO.
availabilitystring enumWhether the offering is currently accepting orders. One of available, not_available, closed. See Availability.
anticipated_sharesintegerAnticipated total share count for the offering, when known.
max_pricestringUpper bound of the indicated price range.
min_pricestringLower bound of the indicated price range.
trade_datestring (date)Anticipated first trading date on the secondary market, in YYYY-MM-DD format.
settlement_datestring (date)Anticipated settlement date, in YYYY-MM-DD format.
no_new_ordersbooleanWhen 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.
underwritersarray of stringsList of underwriter names participating in the offering.
unit_step_sizestringThe minimum increment in which order quantities can be specified.
min_ticket_sizestringMinimum allowed order amount.
max_ticket_sizestringMaximum allowed order amount.

Endpoints

List IPO Offerings

GET /v1/ipos

Retrieves a paginated list of IPO offerings.

Parameters

ParameterTypeDescriptionNotes
availabilitystringIPO availability statusnot_available, available, closed
tickerstringFilter by stock tickere.g., EXMP, ACME
limitintegerNumber of results per pageDefault: 50, Max: 200
page_tokenstringToken for paginationUsed 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 the symbol field in order requests
  • IPO orders are notional-only: provide notional; omit qty
  • Only side=buy is 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

Replace order for account

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 order for account

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

ParameterTypeDescription
symbolsstringFilter by IPO symbol (ipo_reference)
statusstringFilter by order status
limitintegerNumber 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:

StatusDescription
pending_newOrder submitted, awaiting acknowledgment (transient)
newOrder accepted, awaiting allocation
filledShares allocated at final price
canceledOrder canceled during withdrawal window
rejectedOrder rejected (constraints not met, offering closed, etc.)
replacedOrder replaced

Typical flow:

  1. Order placed → pending_new (briefly)
  2. Acceptance → new
  3. Allocation received → filled (with filled_qty and filled_avg_price populated)

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

EventDescriptionVisibility
offeringNew IPO offering createdBroadcast
offeringUpdateOffering details changedBroadcast
offeringCancellationOffering cancelledBroadcast
prospectusProspectus URL updatedBroadcast
sixtyMinMail60-minute withdrawal window startedBroadcast
allocationShares allocated to userPer-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.

FieldTypeDescription
verbstringEvent type identifier
offering_referencestringUnique IPO offering ID
payloadobjectEvent-specific data
received_atstring (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"
}
FieldTypeDescription
account_numberstringAlpaca account number
correspondentstringBroker 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

HeaderValue
Content-Typetext/event-stream
Cache-Controlno-cache
Connectionkeep-alive

Notes

  • Reconnect on connection drops; reconcile by calling GET /v1/ipos to fetch current state.
  • Browser note: Native EventSource does not support setting headers; use a polyfill or fetch-based SSE shim that allows passing the Authorization header.

The sixtyMinMail Event

This 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 limit and page_token on list endpoints
  • On 200 responses, next_page_token is returned if more results are available
  • Pass next_page_token as page_token in subsequent requests

Error Handling

Where errors come from

  1. API response (synchronous) — The server may return an HTTP error status and a JSON body with code and message.
  2. 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 = rejected and a reason field 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 CodeError CodeError Message
42240020010time_in_force must be gtc for IPO orders
42240020011type must be market for IPO orders
42240020012IPO orders must specify notional and omit qty
42240020013IPO orders must be buy side
42242210000IPO trading is not enabled for this account
40440410000IPO asset not found: <symbol>
40440410000order not found
42242210000IPO offering details not found
42242210000IPO offering is not available to order
42242210000invalid notional value: <detail>
42242210000IPO orders only support buy side
42242210000order amount <X> is below minimum ticket size <Y>
42242210000order amount <X> is above maximum ticket size <Y>
42242210000order amount <X> is not a multiple of step size <Y>
42242210000account already has an open order for offering asset <symbol>
42242210000order is not an IPO order
42242210000order is not open, status: <status>
42242210000cannot replace order in pending_cancel status
42242210000order already pending replacement
42242210000notional is required for IPO order replacement
50150110000IPO trading is not enabled
50050010000failed to route IPO order: <detail>
50050010000internal server error occurred
42942910000rate limit exceeded
50350310000service unavailable
50450410000request 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

  1. Ensure your OAuth token has the required scopes
  2. Implement GET /v1/ipos to discover available offerings
  3. Use the ipo_reference as the symbol when placing orders
  4. Validate orders against min_ticket_size, max_ticket_size, and unit_step_size
  5. Use notional-only orders (omit qty)
  6. Handle the 60-minute withdrawal window for order modifications
  7. Subscribe to SSE events for real-time updates (GET /v2/events/ipos)
  8. 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.