Option Exercise

Overview

The option exercise APIs are available since v0.4.2 and provide the following capabilities:

  • Exercise check: Estimate the underlying stock position change after exercise or waive
  • Query exercisable positions: Get the list of option positions eligible for exercise/waive requests
  • Submit exercise request: Submit an early exercise or early waive request
  • Query exercise records: Paginated query of submitted exercise request history
  • Cancel exercise request: Cancel a pending exercise request

Exercise Types (OptionExerciseType)

ValueDescription
ExerciseEarly exercise — exercise the option before expiry
ExpireEarly waive — voluntarily waive the right to exercise before expiry

Exercise Check

Request class: OptionExerciseCheckRequest

Estimates the underlying stock position change after exercise or waive. Call this before submitting to confirm the expected result.

Parameters

ParameterTypeRequiredDescription
accountstringYesTrading account
contractIdlongYesOption contract ID
typestringYesExercise type: Exercise / Expire
quantitydoubleYesExercise quantity (> 0)
executingDatestringRequired for ExerciseExecution date, format yyyy-MM-dd
isForcebooleanRequired for ExerciseWhether to force exercise
itmRateintNoITM rate threshold 0–10 (Expire only)
secretKeystringNoTrader key for institutional/Prime accounts

Returns (OptionExerciseCheckItem)

FieldTypeDescription
availableQuantitydoubleExercisable quantity
positiondoubleCurrent option position
stkPositiondoubleCurrent underlying stock position
stkPositionChangedoubleStock position change after exercise
stkPositionBeforedoubleStock position before exercise
stkPositionAfterdoubleStock position after exercise
symbolstringUnderlying stock symbol

Example

// Exercise check (Exercise type — quantity, executingDate, isForce required)
OptionExerciseCheckRequest request =
    OptionExerciseCheckRequest.buildRequest(account, contractId, OptionExerciseType.Exercise)
        .setQuantity(1.0)
        .setExecutingDate("2025-06-20")
        .setIsForce(false);
OptionExerciseCheckResponse response = client.execute(request);
if (response.isSuccess()) {
    OptionExerciseCheckItem item = response.getItem();
    System.out.println("availableQuantity=" + item.getAvailableQuantity()
        + " stkPositionBefore=" + item.getStkPositionBefore()
        + " stkPositionAfter=" + item.getStkPositionAfter());
} else {
    System.out.println("Error: " + response.getMessage());
}

// Exercise check (Expire type — quantity required, ITM rate optional)
OptionExerciseCheckRequest expireCheck =
    OptionExerciseCheckRequest.buildRequest(account, contractId, OptionExerciseType.Expire)
        .setQuantity(1.0)
        .setItmRate(5);
OptionExerciseCheckResponse expireResp = client.execute(expireCheck);

Response example

{
  "availableQuantity": 10.0,
  "position": 10.0,
  "stkPosition": 300.0,
  "stkPositionChange": -100.0,
  "stkPositionBefore": 300.0,
  "stkPositionAfter": 200.0,
  "symbol": "AAPL"
}

Query Exercisable Positions

Request class: OptionExercisePositionRequest

Returns the list of option positions eligible for exercise or waive requests.

Parameters

ParameterTypeRequiredDescription
accountstringYesTrading account
typestringYesExercise type: Exercise / Expire
secretKeystringNoTrader key for institutional/Prime accounts

Returns (OptionExercisePositionPageItem)

Pagination wrapper containing:

FieldTypeDescription
pageNumintCurrent page number
pageSizeintPage size
itemCountintTotal record count
pageCountintTotal page count
itemsList<OptionExercisePositionItem>Position list

OptionExercisePositionItem fields

FieldTypeDescription
contractIdlongOption contract ID
symbolstringOption contract symbol
stkSymbolstringUnderlying stock symbol
expireDatestringExpiry date, format yyyy-MM-dd
strikestringStrike price
callPutstringCALL / PUT
marketstringMarket
accountIdlongAccount ID
positiondoublePosition quantity
availableQuantitydoubleExercisable quantity

Example

OptionExercisePositionRequest request =
    OptionExercisePositionRequest.buildRequest(account, OptionExerciseType.Exercise);
OptionExercisePositionResponse response = client.execute(request);
if (response.isSuccess()) {
    OptionExercisePositionPageItem page = response.getItem();
    System.out.println("itemCount=" + page.getItemCount());
    for (OptionExercisePositionItem item : page.getItems()) {
        System.out.println("contractId=" + item.getContractId()
            + " symbol=" + item.getSymbol()
            + " expireDate=" + item.getExpireDate()
            + " availableQty=" + item.getAvailableQuantity());
    }
} else {
    System.out.println("Error: " + response.getMessage());
}

Response example

{
  "itemCount": 4,
  "pageNum": 1,
  "pageSize": 10,
  "pageCount": 1,
  "items": [
    {
      "contractId": 1684414425,
      "symbol": "AAPL",
      "stkSymbol": "AAPL",
      "expireDate": "2026-04-17",
      "strike": "280.0",
      "callPut": "PUT",
      "market": "US",
      "accountId": 600021133765,
      "position": 10.0,
      "availableQuantity": 10.0
    }
  ]
}

Submit Exercise Request

Request class: OptionExerciseSubmitRequest

Submits an early exercise or early waive request.

⚠️

Note

  • Call the exercise check API first to confirm the position impact before submitting
  • executingDate and isForce are only applicable to Exercise type
  • itmRate is only applicable to Expire type
  • To cancel after a successful submission, use the cancel exercise request API

Parameters (Exercise type)

ParameterTypeRequiredDescription
accountstringYesTrading account
contractIdlongYesOption contract ID
quantitydoubleYesExercise quantity
executingDatestringYesExecution date, format yyyy-MM-dd
isForcebooleanYesWhether to force exercise
secretKeystringNoTrader key for institutional/Prime accounts

Parameters (Expire type)

ParameterTypeRequiredDescription
accountstringYesTrading account
contractIdlongYesOption contract ID
quantitydoubleYesWaive quantity
itmRateintNoITM rate threshold 0–10
secretKeystringNoTrader key for institutional/Prime accounts

Example

// Early exercise
OptionExerciseSubmitRequest exerciseRequest =
    OptionExerciseSubmitRequest.buildExerciseRequest(
        account, contractId, 1.0, "2025-06-20", false);
OptionExerciseSubmitResponse exerciseResp = client.execute(exerciseRequest);
System.out.println(exerciseResp.isSuccess() ? "Submitted successfully" : "Error: " + exerciseResp.getMessage());

// Early waive
OptionExerciseSubmitRequest expireRequest =
    OptionExerciseSubmitRequest.buildExpireRequest(account, contractId, 1.0, null);
OptionExerciseSubmitResponse expireResp = client.execute(expireRequest);
System.out.println(expireResp.isSuccess() ? "Submitted successfully" : "Error: " + expireResp.getMessage());

Query Exercise Records

Request class: OptionExerciseRecordRequest

Returns paginated exercise/waive request records.

Parameters

ParameterTypeRequiredDescription
accountstringYesTrading account
pageintYesPage number, starts from 1
sizeintYesPage size, 1–100
statusstringNoStatus filter: New / Cancel / Success / Fail
typestringNoType filter: Exercise / Expire
symbolstringNoUnderlying symbol filter
orderBystringNoSort field: symbol / expire_date / strike / is_call
secretKeystringNoTrader key for institutional/Prime accounts

Returns (OptionExerciseRecordPageItem)

Pagination wrapper; items is List<OptionExerciseRecordItem>.

OptionExerciseRecordItem fields

FieldTypeDescription
idlongExercise record ID
contractIdlongOption contract ID
symbolstringOption contract symbol
stkSymbolstringUnderlying stock symbol
expireDatestringExpiry date
strikestringStrike price
callPutstringCALL / PUT
typestringExercise / Expire
requestQuantitydoubleRequested quantity
quantitydoubleActual exercised quantity
statusstringRequest status: New / Cancel / Success / Fail
executingDatestringExecution date
itmRateintITM rate
isForcebooleanForce exercise flag
reasonstringRejection reason (if any)
accountIdlongAccount ID

Example

// Basic query
OptionExerciseRecordRequest request =
    OptionExerciseRecordRequest.buildRequest(account, 1, 20);
OptionExerciseRecordResponse response = client.execute(request);
if (response.isSuccess()) {
    OptionExerciseRecordPageItem page = response.getItem();
    System.out.println("itemCount=" + page.getItemCount() + " pageCount=" + page.getPageCount());
    for (OptionExerciseRecordItem item : page.getItems()) {
        System.out.println("id=" + item.getId() + " type=" + item.getType()
            + " status=" + item.getStatus());
    }
}

// With filters
OptionExerciseRecordRequest filtered =
    OptionExerciseRecordRequest.buildRequest(account, 1, 20)
        .setType(OptionExerciseType.Exercise.name())
        .setOrderBy("symbol");

Response example

{
  "itemCount": 19,
  "pageNum": 1,
  "pageSize": 10,
  "pageCount": 2,
  "items": [
    {
      "id": 315,
      "contractId": 2701923713,
      "symbol": "AAPL",
      "stkSymbol": "AAPL",
      "expireDate": "2026-06-05",
      "strike": "305.0",
      "callPut": "PUT",
      "type": "Exercise",
      "requestQuantity": 1.0,
      "quantity": 0.0,
      "status": "Cancel",
      "executingDate": "2026-06-01",
      "itmRate": 0,
      "isForce": false,
      "reason": "Cancelled by manual",
      "accountId": 600021133765
    }
  ]
}

Cancel Exercise Request

Request class: OptionExerciseCancelRequest

Cancels a pending exercise request.

Parameters

ParameterTypeRequiredDescription
accountstringYesTrading account
idlongYesExercise record ID (from OptionExerciseRecordRequest)
secretKeystringNoTrader key for institutional/Prime accounts

Example

OptionExerciseCancelRequest request =
    OptionExerciseCancelRequest.buildRequest(account, recordId);
OptionExerciseCancelResponse response = client.execute(request);
System.out.println(response.isSuccess() ? "Cancelled successfully" : "Error: " + response.getMessage());