---
title: "Multi-year ISO exercise plan that minimizes lifetime AMT"
method: POST
path: "/v1/equity-comp/iso-schedule"
tags: ["Equity compensation"]
---

# Multi-year ISO exercise plan that minimizes lifetime AMT

`POST /v1/equity-comp/iso-schedule`

## Request

- Base URL: `https://api.numeratica.com`
- URL: `https://api.numeratica.com/v1/equity-comp/iso-schedule`
- Auth: one of:
  - HTTP bearer
  - API key in header `X-API-Key`

Plans a year-by-year ISO exercise schedule: each year it exercises as many shares as the AMT budget allows (default $0 = stay at the AMT crossover), accrues the AMT incurred as a §53 Minimum Tax Credit, and recovers that credit in later years when the regular tax exceeds the tentative minimum tax. Income and the share FMV vary by year (optional growth); the tax brackets are frozen at tax_year for every projected year (future brackets are not modeled). Bounded at horizon_years ≤ 40. Deterministic; not tax advice.

## Request body

- EquityCompISOScheduleRequest
  - `tax_year` integer, required: Bracket year (2025/2026), used for every projected year.
  - `filing_status` 'single' | 'mfj' | 'mfs' | 'hoh', required
  - `total_shares` number, required
  - `strike_price` number, required
  - `fmv_at_start` number, required
  - `annual_fmv_growth` number: Per-year FMV growth (default 0).
  - `annual_ordinary_income` number, required
  - `annual_income_growth` number: Per-year income growth (default 0).
  - `horizon_years` integer, required
  - `annual_amt_budget` number: AMT willing to incur per year (default 0 = stay at the crossover).

## Response `200`

ISO exercise schedule

- EquityCompISOScheduleResponse
  - `result_id` string
  - `engine_version` string
  - `inputs` EquityCompISOScheduleRequest
    - `tax_year` integer, required: Bracket year (2025/2026), used for every projected year.
    - `filing_status` 'single' | 'mfj' | 'mfs' | 'hoh', required
    - `total_shares` number, required
    - `strike_price` number, required
    - `fmv_at_start` number, required
    - `annual_fmv_growth` number: Per-year FMV growth (default 0).
    - `annual_ordinary_income` number, required
    - `annual_income_growth` number: Per-year income growth (default 0).
    - `horizon_years` integer, required
    - `annual_amt_budget` number: AMT willing to incur per year (default 0 = stay at the crossover).
  - `result` object
    - `schedule` object[]
      - `year` integer
      - `fmv` number
      - `shares_exercised` number
      - `bargain_element` number
      - `amt_incurred` number
      - `mtc_recovered` number: §53 Minimum Tax Credit recovered this year.
      - `cumulative_shares` number
    - `total_amt_paid` number
    - `total_mtc_recovered` number
    - `net_amt_cost` number: AMT paid less MTC recovered within the horizon.
    - `years_to_fully_exercise` integer: 0 if not fully exercised within the horizon.
    - `shares_unexercised` number
  - `disclaimer` string

## Other responses

- `400`: Invalid request
- `401`: Missing or invalid API key.
- `405`: Method not allowed
- `429`: The key's per-minute request budget is exceeded. Retry after the delay in the Retry-After header.
- `503`: A dependency (e.g. the key store) is temporarily unavailable, or the request exceeded its compute deadline. Retryable.

---

[API](https://skmtc.dev/numeratica/apis/numeratica-financial-planning-calculations-api.md) · [All operations](https://skmtc.dev/numeratica/apis/numeratica-financial-planning-calculations-api/llms.txt) · [OpenAPI document](https://skmtc.dev/numeratica/apis/numeratica-financial-planning-calculations-api/revisions/075bcfbd1ebf?raw)
