Options Trading Overview

Initial Options Offering

Supported

  • US listed equities options, all american style
  • Level 1+2 options trading
  • Fully Disclosed partner relationships
  • Automatic account approval process via the API along with SSE events
  • Ability for partners to downgrade/disable options trading
  • Ability to exercise options via the API
  • DNE (do not exercise) requests by email
  • New options specific activities
  • Access to options market data (at a cost) or referral to market data partner

Not supported

  • Omnibus partner relationships (coming soon)
  • Level 3 + options strategies (multi-leg, spreads, naked, etc)
  • LCT (local currency trading)
  • Fractional options
  • Extended hours

Options Enablement

Enabling Options Trading on a new Account

Per FINRA Rule 2360, each customer account has to be approved for options before the first options trade is made. Once options trading is enabled on a correspondent you can start requesting accounts to be approved for options trading. For existing accounts there will be a few new data points that need to be patched on the account along with a new options agreement that the customer will need to sign. Below are the new fields that will need to be provided specifically for options.

  • Annual Income
  • Net Worth
  • Liquid Net Worth
  • Liquidity Needs
  • Investment Experience
  • Investment Risk Tolerance
  • Investment Objective
  • Investment Time Horizon
  • Marital Status
  • Number of Dependents

Below is an example of a request for opening a new account with options enabled. More details on creating an account can be found here.

{
    "enabled_assets": [
        "us_equity",
        "crypto",
        "us_option"
    ],
    "contact": {
        "email_address": "[email protected]",
        "phone_number": "555-666-7788",
        "street_address": [
            "20 N San Mateo Dr"
        ],
        "unit": "Apt 1A",
        "city": "San Mateo",
        "state": "CA",
        "postal_code": "94401",
        "country": "USA"
    },
    "identity": {
        "given_name": "John",
        "middle_name": "Smith",
        "family_name": "Doe",
        "date_of_birth": "1990-01-01",
        "tax_id": "124-55-4321",
        "tax_id_type": "USA_SSN",
        "country_of_citizenship": "USA",
        "country_of_birth": "USA",
        "country_of_tax_residence": "USA",
        "funding_source": [
            "employment_income"
        ],
        
        "annual_income_min": "10000",
        "annual_income_max": "10000",
        "total_net_worth_min": "10000",
        "total_net_worth_max": "10000",
        "liquid_net_worth_min": "10000",
        "liquid_net_worth_max": "10000",
        "liquidity_needs": "does_not_matter",
        "investment_experience_with_stocks": "over_5_years",
        "investment_experience_with_options": "over_5_years",
        "risk_tolerance": "conservative",
        "investment_objective": "market_speculation",
        "investment_time_horizon": "more_than_10_years",
        "marital_status":"MARRIED",
        "number_of_dependents":5
    },
    "disclosures": {
        "is_control_person": false,
        "is_affiliated_exchange_or_finra": true,
        "is_politically_exposed": false,
        "immediate_family_exposed": false,
        "context": [
            {
                "context_type": "AFFILIATE_FIRM",
                "company_name": "Finra",
                "company_street_address": [
                    "1735 K Street, NW"
                ],
                "company_city": "Washington",
                "company_state": "DC",
                "company_country": "USA",
                "company_compliance_email": "[email protected]"
            }
        ]
    },
    "agreements": [
        {
            "agreement": "margin_agreement",
            "signed_at": "2020-09-11T18:09:33Z",
            "ip_address": "185.13.21.99",
            "revision": "16.2021.05"
        },
        {
            "agreement": "account_agreement",
            "signed_at": "2020-09-11T18:13:44Z",
            "ip_address": "185.13.21.99",
            "revision": "16.2021.05"
        },
        {
            "agreement": "customer_agreement",
            "signed_at": "2020-09-11T18:13:44Z",
            "ip_address": "185.13.21.99",
            "revision": "16.2021.05"
        },
        {
            "agreement": "crypto_agreement",
            "signed_at": "2020-09-11T18:13:44Z",
            "ip_address": "185.13.21.99",
            "revision": "04.2021.10"
        },
        {
            "agreement": "options_agreement",
            "signed_at": "2020-09-11T18:13:44Z",
            "ip_address": "185.13.21.99"
        }
    ],
    "documents": [
        {
            "document_type": "identity_verification",
            "document_sub_type": "passport",
            "content": "/9j/Cg==",
            "mime_type": "image/jpeg"
        }
    ],
    "trusted_contact": {
        "given_name": "Jane",
        "family_name": "Doe",
        "email_address": "[email protected]"
    }
}

Enabling Options Trading on an existing Account

Below are sample requests and responses for enabling options trading on an existing account, using the approval endpoint.

Example: Account with level 1 requirements requesting for level 1 options trading approval

{
  "level": 1   
}
{
    "id": "43c2f8a9-9e39-48b1-921c-e510dfeeff47",
    "account_id": "492b6297-45fc-4435-abc7-08ab15480b1c",
    "created_at": "2024-05-14T04:34:03.527165162-04:00",
    "updated_at": "2024-05-14T04:34:03.527165162-04:00",
    "requested_level": 1,
    "status": "APPROVED"
}

Example: Account with level 1 requirements requesting for level 2 options trading approval

{
  "level": 2   
}
{
    "id": "43c2f8a9-9e39-48b1-921c-e510dfeeff47",
    "account_id": "492b6297-45fc-4435-abc7-08ab15480b1c",
    "created_at": "2024-05-14T04:34:03.527165162-04:00",
    "updated_at": "2024-05-14T04:34:03.527165162-04:00",
    "requested_level": 2,
    "status": "LOWER_LEVEL_APPROVED"
}

Options Approval Statuses

StatusDescription
APPROVEDUser has been approved for requested options trading level.
LOWER_LEVEL_APPROVEDUser has been approved for a lower level than the requested options trading level.
PENDINGPending manual review
REJECTEDUser has been rejected for requested options trading level.

Approval fixtures

Options Approval API supports approval fixtures in the Sandbox environment. You can pass the desired approval level and approval status to test all different scenario of options approval flow (approved, lower_level_approved, rejected) to the same approval endpoint.

Example use cases:

  1. Requesting an APPROVED status for options trading level 1
{
  "level": 1,   
  "fixtures": {
    "status":"APPROVED"
  }
}
  1. Requesting an REJECTED status for options trading level 2
{
  "level": 2,   
  "fixtures": {
    "status":"REJECTED"
  }
}
  1. Requesting a LOWER_LEVEL_APPROVED status (simulating a flow where level 2 was requested but user is approved for level 2 instead)
{
  "level": 2,   
  "fixtures": {
    "status":"LOWER_LEVEL_APPROVED",
    "level":1
  }
}

Downgrading/disabling Options

Once an account is approved for options trading the customer has the ability to downgrade the options level or disable it altogether. This is done by setting the max_options_trading_level via the trading account configuration endpoint.

Once the max options trading level is set the options trading level on the trading account endpoint will get upgraded to the value set by the user. Note the options trading level will always be the same or lower than the options approved level. Below is an example of a user being approved for level 2 but downgrading to level 1.

{
  ...
  "options_approved_level": 2,
  "options_trading_level": 1,
  ...
}

Trading

Trading Overview

When placing orders via the orders api for options below is what is supported and what is not supported

Supported

  • Options symbol
  • Time in force of day
  • Market and limit order types
  • Ability to replace and cancel orders
  • Level 1 + 2 option strategies

Not supported

  • Extended hours
  • Fractional or notional order support

Trading Levels

Alpaca supports the below options trading levels.

LevelSupported TradesValidation
0- Options trading is disabled- NA
1- Sell a covered call

- Sell cash-secured put
- User must own sufficient underlying shares

- User must have sufficient options buying power
2- Level 1

- Buy a call
- Buy a put
- User must have sufficient options buying power

Trading Level Validation

If a user tries to trade a strategy above their level this will result in an error message. Below is an example of a user who is approved for level 1 trying to place a level 2 options trade.

{
   "code": 40310000,
   "message": "account not eligible for level2 options trading"
}

Asset Master

Similar to the asset master for securities and crypto there is an options contract endpoint which will return all the options contract for an underlying symbol. Below is a sample

{
  "id": "1fb904df-961a-4a07-a924-53a437626db2",
  "symbol": "AAPL240223C00095000",
  "name": "AAPL Feb 23 2024 95 Call",
  "status": "active",
  "tradable": true,
  "expiration_date": "2024-02-23",
  "root_symbol": "AAPL",
  "underlying_symbol": "AAPL",
  "underlying_asset_id": "b0b6dd9d-8b9b-48a9-ba46-b9d54906e415",
  "type": "call",
  "style": "american",
  "strike_price": "95",
  "size": "100",
  "open_interest": "12",
  "open_interest_date": "2024-02-22",
  "close_price": "89.35",
  "close_price_date": "2024-02-22"
 }

Order Examples

Buying a call

{  
  "symbol": "PTON240126C00000500",  
  "qty": "1",  
  "side":"buy",  
  "type": "market",  
  "time_in_force": "day"  
}

Buying a put

{  
  "symbol": "TSLA240126P00210000",  
  "qty": "1",  
  "side": "buy",  
  "type": "market",  
  "time_in_force": "day"  
}

Selling a covered call

{  
  "symbol": "AAPL240126C00050000", 
  "qty": "1", 
  "side": "sell", 
  "type": "market", 
  "time_in_force": "day"  
}

Selling a cash secured put

{  
  "symbol": "QS240126P00006500",  
  "qty": "1",  
  "side": "sell",  
  "type": "market",  
  "time_in_force": "day"  
}

Buying Power Checks

With options we introduce a new field on the trading account endpoint called options_buying_power which is evaluated when trying to open new options positions.

For both buying a call or buying a put sufficient buying power is necessary to pay for the premium of the contract otherwise an error will occur as shown below.

{
"options_buying_power": "7267.84",
"code": 40310000,
"cost_basis": "38000",
"message": "insufficient options buying power"
}

For Selling Covered Call you need to have enough stocks as collateral otherwise the order will error out as shown below.

 {
   "available_qty": "0",
   "code": 40310000,
   "message": "insufficient underlying qty available for covered call (required: 100, available: 0)",
   "required_qty": "100",
   "symbol": "AAPL240126C00050000",
   "underlying_asset_id": "b0b6dd9d-8b9b-48a9-ba46-b9d54906e415"
}

For selling cash secured put you will need enough buying power to pay for the underlying stock minus the premium that would be received otherwise the order will error out as shown below

{
  "buying_power": "9395",
  "code": 40310000,
  "message": "insufficient options buying power for cash-secured put (required: 20310, available: 9395)",
  "required_options_buying_power": "20310"
}

Positions

Option positions will show up like any other position in the positions endpoint. Below is an example of an options position.

{
  "asset_id": "fe4f43e5-60a4-4269-ba4c-3d304444d58b",
  "symbol": "PTON240126C00000500",
  "exchange": "",
  "asset_class": "us_option",
  "asset_marginable": true,
  "qty": "2",
  "avg_entry_price": "6.05",
  "side": "long",
  "market_value": "1068",
  "cost_basis": "1210",
  "unrealized_pl": "-142",
  "unrealized_plpc": "-0.1173553719008264",
  "unrealized_intraday_pl": "-142",
  "unrealized_intraday_plpc": "-0.1173553719008264",
  "current_price": "5.34",
  "lastday_price": "5.34",
  "change_today": "0",
  "qty_available": "2"
}

Post Trade

Exercising

As the buyer of an option (call or put), the holder has the right, but not the obligation, to buy or sell the option's underlying security at a specified price on or before a specified date in the future. If the holder decides to act on those rights they are choosing to exercise. An option can be exercised via the exercise endpoint and Alpaca will accept DNE(do not exercise) instructions via email to avoid exercising at expiration. Note exercise requests will be processed instantly and requests sent outside of market hours will be rejected. When exercising there will be 2 new activities per exercise which are:

  • OPEXC - removes the options position as a result of exercising
  • OPTRD - trading activity that is paired with the exercising

Exercising Call

A long call exercise results in buying the underlying stock at the strike price. Below is an example of this.

{
  "id": "20240227000000000::197118f0-afd8-4adb-b154-167f4a87b1f5",
  "account_id": "21c36b57-2304-4e5b-8364-8effbcba853e",
  "activity_type": "OPEXC",
  "date": "2024-02-27",
  "net_amount": "0",
  "description": "Option Exercise",
  "symbol": "QS240301C00006500",
  "qty": "-1",
  "status": "executed"
},

{
  "id": "20240227000000000::aa97cbc4-5163-49ab-b832-682a3a3e85bb",
  "account_id": "21c36b57-2304-4e5b-8364-8effbcba853e",
  "activity_type": "OPTRD",
  "date": "2024-02-27",
  "net_amount": "-650",
  "description": "Option Trade",
  "symbol": "QS",
  "qty": "100",
  "price": "6.5",
  "status": "executed"
}

Exercising Put

A long put exercise results in selling the underlying stock at the strike price. Below is an example of this.

{
  "id": "20240227000000000::f62ee8f5-0279-4e81-9bd1-4ef197c7b2f3",
  "account_id": "21c36b57-2304-4e5b-8364-8effbcba853e",
  "activity_type": "OPEXC",
  "date": "2024-02-27",
  "net_amount": "0",
  "description": "Option Exercise",
  "symbol": "QS240301P00006500",
  "qty": "-1",
  "status": "executed"
},

{
  "id": "20240227000000000::74e1db8e-9316-4dcf-b69c-50f51427b7c1",
  "account_id": "21c36b57-2304-4e5b-8364-8effbcba853e",
  "activity_type": "OPTRD",
  "date": "2024-02-27",
  "net_amount": "650",
  "description": "Option Trade",
  "symbol": "QS",
  "qty": "-100",
  "price": "6.5",
  "status": "executed"
}

Assignment

When selling an options contract (call or put) the user collects a premium but in turn takes on the obligation to buy or sell the stock at the agreed upon strike price if assigned. It is important to note that the OCC assigns a random account and sellers of contracts can be assigned overnight. When assigned there will be 2 new activities per assignment which are:

  • OPASN - removes the options position as a result of assignment
  • OPTRD - trading activity that is paired with the assignment

Call Assignment

For call options, the seller takes on the obligation to sell the stock at the agreed upon strike price. Below is an example of activities that result as a result of a call assignment

 {
   "id": "20240301000000000::001140db-3947-456b-aefc-253861fb65df",
   "account_id": "21c36b57-2304-4e5b-8364-8effbcba853e",
   "activity_type": "OPASN",
   "date": "2024-03-01",
   "net_amount": "0",
   "description": "",
   "symbol": "QS240301C00004500",
   "qty": "1",
   "status": "executed"
}

{
  "id": "20240301000000000::a88c089f-a8c3-4672-9b68-2f6f2d05e914",
  "account_id": "21c36b57-2304-4e5b-8364-8effbcba853e",
  "activity_type": "OPTRD",
  "date": "2024-03-01",
  "net_amount": "450",
  "description": "Option Trade",
  "symbol": "QS",
  "qty": "-100",
  "price": "4.5",
  "status": "executed"
}

Put Assignment

For put options, the seller takes on the obligation to buy the stock at the agreed upon strike price. Below is an example of activities that result as a result of a put assignment

{
  "id": "20240301000000000::fcd92e5c-46e4-4c6e-8866-d56cd7d2bde2",
  "account_id": "21c36b57-2304-4e5b-8364-8effbcba853e",
  "activity_type": "OPASN",
  "date": "2024-03-01",
  "net_amount": "0",
  "description": "",
  "symbol": "QS240301P00009000",
  "qty": "1",
  "status": "executed"
}


{
  "id": "20240301000000000::1e1c2804-ce68-4516-9fa4-62d49b14c334",
  "account_id": "21c36b57-2304-4e5b-8364-8effbcba853e",
  "activity_type": "OPTRD",
  "date": "2024-03-01",
  "net_amount": "-900",
  "description": "Option Trade",
  "symbol": "QS",
  "qty": "100",
  "price": "9",
  "status": "executed"
}

Expiration

Unlike stocks, option contracts have an expiration date. If the user does not close out their position or exercise their options (if they have the buying power to support the exercise), Alpaca will need to potentially take action on it for risk management purposes based on the criteria described below.

  • Starting at 3:00 pm EST on the date of expiration, Alpaca continuously evaluates any open positions that expire that day and stops accepting new orders to open/extend any positions.
  • If the position for a long call or put is ITM (in the money) by .01 or more, Alpaca checks if the account has enough buying power to exercise
    • If there is enough buying power Alpaca will not liquidate the options and will let the option auto-exercise.
    • If there is not enough buying power, then Alpaca will liquidate while it’s still ITM
  • If the position is for a covered call or cash secured put and ITM by .01 or more Alpaca will automatically assign after close on date of expiry
  • If the position is not ITM in other words it’s ATM (at the money) or OTM (out of the money), Alpaca may skip it and it will expire after close as shown in the examples below. (Note that positions slightly OTM may also be liquidated depending on market and underlying conditions. Alpaca will take into consideration fast moving markets and/or fast stocks that may be moving from ITM and OTM throughout the day. There may be instances where OTM positions are also closed out.)

Call Expiration

{
  "id": "20240301000000000::31ff5d4c-a608-43bb-8e59-678a96a4a42c",
  "account_id": "21c36b57-2304-4e5b-8364-8effbcba853e",
  "activity_type": "OPEXP",
  "date": "2024-03-01",
  "net_amount": "0",
  "description": "Option Expiry",
  "symbol": "QS240301C00010500",
  "qty": "-1",
  "status": "executed"
}

Put Expiration

{
  "id": "20240301000000000::4bd8c683-0b2c-489f-9df9-1243ff621648",
  "account_id": "21c36b57-2304-4e5b-8364-8effbcba853e",
  "activity_type": "OPEXP",
  "date": "2024-03-01",
  "net_amount": "0",
  "description": "Option Expiry",
  "symbol": "QS240301P00000500",
  "qty": "-1",
  "status": "executed"
}

Market Data

Alpaca provides access to options market data (at a cost) in the same user-friendly format it does for stocks and crypto. Additionally, we can refer partners to external data vendors with whom Alpaca has a close relationship if necessary.

EndpointNoteste
Latest QuotesLatest quotes. Supports multiple symbols
Latest TradesLatest trades. Supports multiple symbols
Historical TradesHistorical trades. Supports multiple symbols
SnapshotsCombine quotes and trades for multiple symbols
Option chainQuery option chain by the underlying (stock) symbols
Historical barsHistorical bars.Supports multiple symbol

Options trading is not suitable for all investors due to its inherent high risk, which can potentially result in significant losses. Please read Characteristics and Risks of Standardized Options before investing in options.