OptionsAhoy Hedging API

Protective put, collar, and put spread pricing

Operations 1

POST /api/v1/protective-put Protective put, zero-cost collar, and put-spread pricing #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/optionsahoy-com-hedging-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

optionsahoy-com-hedging-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: OptionsAhoy Calculator Hedging API
  summary: Deterministic equity-compensation calculator endpoints. JSON in, JSON out.
  description: Multi-year equity-compensation optimization engine.
  version: 1.10.1
  contact:
    name: AlphaLatitude Inc.
    email: andrew@alphalatitude.com
    url: https://optionsahoy.com/for-agents
  license:
    name: Proprietary. Free for non-commercial use during beta.
    url: https://optionsahoy.com/terms
servers:
- url: https://optionsahoy.com
  description: Production
tags:
- name: Hedging
  description: Protective put, collar, and put spread pricing
paths:
  /api/v1/protective-put:
    post:
      summary: Protective put, zero-cost collar, and put-spread pricing
      description: Prices a protective put, a zero-cost collar, and a put spread on a single-stock position. Reports annual cost, maximum loss, upside cap (collar), protected band (put spread), and bad-year coverage, plus which structure it recommends.
      operationId: priceProtectivePut
      tags:
      - Hedging
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ProtectivePutInput'
            example:
              positionValue: 400000
              sector: tech_software
              protectionLevel: 0.1
              tenorYears: 1
              spreadRiskLevel: 0.1
              volatility: 0.4
      responses:
        '200':
          $ref: '#/components/responses/ProtectivePutSuccess'
        '400':
          $ref: '#/components/responses/BadRequest'
        '405':
          $ref: '#/components/responses/MethodNotAllowed'
components:
  responses:
    MethodNotAllowed:
      description: Endpoint accepts only POST (and OPTIONS for CORS preflight).
      content:
        application/json:
          schema:
            type: object
            required:
            - error
            properties:
              error:
                type: string
    BadRequest:
      description: Invalid input or calculation failure. The `error` string names the specific field or condition.
      content:
        application/json:
          schema:
            type: object
            required:
            - error
            properties:
              error:
                type: string
    ProtectivePutSuccess:
      description: Successful protective_put_price result.
      content:
        application/json:
          schema:
            type: object
            required:
            - ok
            - result
            properties:
              ok:
                type: boolean
                const: true
              result:
                $ref: '#/components/schemas/ProtectivePutResult'
              next_steps:
                type: object
                description: 'Constant per endpoint: the free interactive version of this calculator, related endpoints worth running next, and the OptionsAhoy beta for integrated multi-position optimization.'
                properties:
                  web_tool:
                    type: string
                  also_run:
                    type: array
                    items:
                      type: string
                  beta:
                    type: string
          example:
            ok: true
            result:
              inputs:
                positionValue: 400000
                sector: tech_software
                volatility: 0.4
                volatilitySource: explicit
                pricingMode: flat
                protectionLevel: 0.1
                tenorYears: 1
                spreadRiskLevel: 0.1
              riskFreeRate: 0.045
              realWorldDrift: 0.12
              barePut:
                strike: 360000
                premium: 35115.97292661169
                annualCost: 35115.97292661169
                annualCostPct: 0.08778993231652923
                maxLoss: 75115.97292661169
                badYearPrice: 249346.60609481626
                badYearDropPct: 0.3766334847629593
                coveredLossAtBadYear: 110653.39390518374
                premiumToCoveredRatio: 0.3173510697439767
                expectedProfit: 48000
                premiumToExpectedProfitRatio: 0.7315827693044102
              collar:
                putStrike: 360000
                callStrike: 508923.33984375
                netPremium: 0
                annualCost: 0
                annualCostPct: 0
                maxLoss: 40000
                upsideCap: 108923.33984375
                upsideCapPct: 0.272308349609375
                isZeroCost: true
                capProbability: 0.30780487520408406
              putSpread:
                available: true
                unavailableReason: null
                longStrike: 360000
                longPremium: 35115.97292661169
                shortStrike: 249346.60609481626
                shortPremium: 5616.845397865807
                shortSigma: 0.4
                netPremium: 29499.127528745885
                annualCost: 29499.127528745885
                annualCostPct: 0.07374781882186471
                maxLossInBand: 69499.12752874588
                bandWidth: 110653.39390518374
                shortStrikeDropPct: 0.3766334847629593
                breachProbability: 0.10000006859614752
                riskLevel: 0.1
                savingsPct: 0.15995129651125892
                coveredLossAtBadYear: 110653.39390518374
              payoffTable:
              - drawdownPct: -0.6
                barePutPnl: -75115.97292661169
                collarPnl: -40000
                spreadPnl: -158845.73362356215
                unhedgedPnl: -240000
              - drawdownPct: -0.5
                barePutPnl: -75115.97292661169
                collarPnl: -40000
                spreadPnl: -118845.73362356215
                unhedgedPnl: -200000
              - drawdownPct: -0.4
                barePutPnl: -75115.97292661169
                collarPnl: -40000
                spreadPnl: -78845.73362356215
                unhedgedPnl: -160000
              - drawdownPct: -0.3
                barePutPnl: -75115.97292661169
                collarPnl: -40000
                spreadPnl: -69499.12752874588
                unhedgedPnl: -120000
              - drawdownPct: -0.2
                barePutPnl: -75115.97292661169
                collarPnl: -40000
                spreadPnl: -69499.12752874588
                unhedgedPnl: -80000
              - drawdownPct: -0.1
                barePutPnl: -75115.97292661169
                collarPnl: -40000
                spreadPnl: -69499.12752874588
                unhedgedPnl: -40000
              - drawdownPct: 0
                barePutPnl: -35115.97292661169
                collarPnl: 0
                spreadPnl: -29499.127528745885
                unhedgedPnl: 0
              - drawdownPct: 0.1
                barePutPnl: 4884.027073388308
                collarPnl: 40000
                spreadPnl: 10500.872471254115
                unhedgedPnl: 40000
              - drawdownPct: 0.2
                barePutPnl: 44884.02707338831
                collarPnl: 80000
                spreadPnl: 50500.872471254115
                unhedgedPnl: 80000
              - drawdownPct: 0.3
                barePutPnl: 84884.02707338831
                collarPnl: 108923.33984375
                spreadPnl: 90500.87247125412
                unhedgedPnl: 120000
              - drawdownPct: 0.4
                barePutPnl: 124884.02707338831
                collarPnl: 108923.33984375
                spreadPnl: 130500.87247125412
                unhedgedPnl: 160000
              - drawdownPct: 0.5
                barePutPnl: 164884.0270733883
                collarPnl: 108923.33984375
                spreadPnl: 170500.87247125412
                unhedgedPnl: 200000
              payoffRange:
                lowerPct: -0.6
                upperPct: 0.5
              recommended: none
  schemas:
    SectorKey:
      type: string
      enum:
      - tech_software
      - semiconductors
      - consumer_cyclical
      - consumer_defensive
      - financials
      - healthcare_biotech
      - energy
      - industrials
      - communication
      - broad_market
    ProtectivePutResult:
      type: object
      description: Protective put, zero-cost collar, and put-spread pricing on a single-stock position. All dollar amounts are USD.
      properties:
        inputs:
          type: object
          description: 'Echo of the resolved inputs actually priced: positionValue, sector, volatility (the sigma priced), volatilitySource (where that sigma came from) and pricingMode (how the legs were priced), protectionLevel, tenorYears, plus expectedReturn, spreadRiskLevel, and tickerLabel when supplied.'
          properties:
            positionValue:
              type: number
              description: Position value priced, in dollars.
            sector:
              type: string
              description: Sector tag used for defaults.
            volatility:
              type: number
              description: Annualized sigma actually used in pricing, as a decimal.
            volatilitySource:
              type: string
              enum:
              - explicit
              - ticker
              - sector-default
              - chain
              description: 'Which source produced the sigma actually priced: "explicit" (caller-supplied), "chain" (interpolated from the stock''s live option chain at the strike being priced), "ticker" (the stock''s published at-the-money implied vol as of the last close), or "sector-default" (feed unavailable or ticker uncovered; a sector-typical estimate - tell the user the price is not stock-specific).'
            pricingMode:
              type: string
              enum:
              - chain-skew
              - flat
              description: 'How the legs were priced. "chain-skew": each leg is priced at the implied volatility of its own strike, read off the live chain, so the floor put carries the market''s downside skew and the put spread''s short leg carries its own. "flat": every leg is priced at the single `volatility` above, which understates what out-of-the-money protection costs and overstates the rebate the spread''s short leg earns - the quote is an estimate of this structure''s cost, not a strike-aware one. Reached whenever no live chain applies: an explicit `volatility`, no `ticker`, or a chain that could not be fetched or was not current.'
            protectionLevel:
              type: number
              description: Protection level as a fraction below spot (0.10 = 10% OTM put).
            tenorYears:
              type: number
              description: Option tenor in years.
            expectedReturn:
              type: number
              description: Caller-supplied annual expected return used for probability metrics. Omitted when not supplied.
            spreadRiskLevel:
              type: number
              description: Put spread floor breach risk echoed from the request (snapped to a supported preset). Omitted when not supplied.
            tickerLabel:
              type: string
              description: Display label echoed from the request (ticker or tickerLabel). Omitted when not supplied.
          required:
          - positionValue
          - sector
          - volatility
          - volatilitySource
          - pricingMode
          - protectionLevel
          - tenorYears
        riskFreeRate:
          type: number
          description: Annualized risk-free rate used in option pricing, looked up for the tenor, as a decimal.
        realWorldDrift:
          type: number
          description: 'Annual real-world drift used for the probability metrics: expectedReturn when supplied, else the sector long-run return. Does not affect premium math.'
        barePut:
          type: object
          description: 'Bare protective put: pay premium for a hard floor.'
          properties:
            strike:
              type: number
              description: 'Put strike in dollars: (1 - protectionLevel) x position value.'
            premium:
              type: number
              description: Put premium in dollars for the full tenor.
            annualCost:
              type: number
              description: Premium annualized, in dollars per year.
            annualCostPct:
              type: number
              description: Annualized premium as a fraction of position value.
            maxLoss:
              type: number
              description: 'Worst-case loss in dollars with the put in place: position - strike + premium.'
            badYearPrice:
              type: number
              description: Position value in dollars at the 10th-percentile (1-in-10 bad year) outcome under real-world drift.
            badYearDropPct:
              type: number
              description: Bad-year drawdown as a fraction of position value (always >= 0).
            coveredLossAtBadYear:
              type: number
              description: Dollars the put pays at the bad-year price; 0 when the bad-year drop never reaches the protection floor.
            premiumToCoveredRatio:
              type:
              - number
              - 'null'
              description: Premium per dollar of bad-year coverage. null (serialized from Infinity) when the put covers nothing at the bad-year price; above ~0.40 the floor is set too deep.
            expectedProfit:
              type: number
              description: Expected position profit in dollars over the tenor under real-world drift.
            premiumToExpectedProfitRatio:
              type:
              - number
              - 'null'
              description: Fraction of typical-period expected profit consumed by the premium. null (serialized from Infinity) when expected profit is zero or negative; above ~0.50 the hedge eats most of the upside.
          required:
          - strike
          - premium
          - annualCost
          - annualCostPct
          - maxLoss
          - badYearPrice
          - badYearDropPct
          - coveredLossAtBadYear
          - premiumToCoveredRatio
          - expectedProfit
          - premiumToExpectedProfitRatio
        collar:
          type: object
          description: 'Put financed by a short call: lower or zero net premium in exchange for capped upside.'
          properties:
            putStrike:
              type: number
              description: Long put strike in dollars (same floor as the bare put).
            callStrike:
              type: number
              description: Short call strike in dollars (the upside cap level).
            netPremium:
              type: number
              description: 'Net premium in dollars: put premium - call premium, floored at 0.'
            annualCost:
              type: number
              description: Net premium annualized, in dollars per year.
            annualCostPct:
              type: number
              description: Annualized net premium as a fraction of position value.
            maxLoss:
              type: number
              description: Worst-case loss in dollars with the collar in place.
            upsideCap:
              type: number
              description: 'Maximum upside in dollars before the short call caps gains: callStrike - position value.'
            upsideCapPct:
              type: number
              description: Maximum upside as a fraction of position value.
            isZeroCost:
              type: boolean
              description: True when the solved call strike makes the collar effectively zero net premium.
            capProbability:
              type: number
              description: Real-world probability (0..1) the stock finishes above the call strike at expiration, i.e. the upside cap binds.
          required:
          - putStrike
          - callStrike
          - netPremium
          - annualCost
          - annualCostPct
          - maxLoss
          - upsideCap
          - upsideCapPct
          - isZeroCost
          - capProbability
        putSpread:
          type: object
          description: 'Put debit spread: long put at the protection floor financed by a short put at a lower strike. Cheaper than the bare put and needs no short call (so it works on unexercised employee options a collar cannot cover), but protection stops at the short strike and losses resume below it. The short strike is solved so the real-world probability the stock ENDS below it equals spreadRiskLevel.'
          properties:
            available:
              type: boolean
              description: 'False when no useful spread exists at these inputs: the 1-in-N short strike lands at/above the floor (floor already deep for this risk level) or the short leg does not reduce cost. When false, the numeric fields of this block are null and unavailableReason carries the explanation in their place.'
            unavailableReason:
              type:
              - string
              - 'null'
              enum:
              - floor
              - no-rebate
              - null
              description: Why the spread is unavailable; null when available. 'floor' = the solved short strike sits at/above the protection floor (or within 1% of position of it). 'no-rebate' = the short leg does not strictly reduce cost.
            longStrike:
              type: number
              description: Long put strike in dollars (same floor as the bare put).
            longPremium:
              type: number
              description: Long put premium in dollars for the full tenor (same as barePut.premium).
            shortStrike:
              type: number
              description: Short put strike in dollars, solved so P(end below it) = spreadRiskLevel.
            shortPremium:
              type: number
              description: Short put premium in dollars received for the full tenor.
            shortSigma:
              type: number
              description: Annualized sigma used to price the short leg, as a decimal (equals volatility in flat-sigma mode).
            netPremium:
              type: number
              description: 'Net debit in dollars: long premium - short premium, floored at 0.'
            annualCost:
              type: number
              description: Net premium annualized, in dollars per year.
            annualCostPct:
              type: number
              description: Annualized net premium as a fraction of position value.
            maxLossInBand:
              type: number
              description: 'Loss in dollars if the stock ends anywhere inside the protected band (floor holds): position - longStrike + netPremium. Below the short strike, losses resume dollar-for-dollar on top of this.'
            bandWidth:
              type: number
              description: 'Width of the protected band in dollars: longStrike - shortStrike (the spread max payout).'
            shortStrikeDropPct:
              type: number
              description: Short strike as a drawdown from spot, as a fraction of position value.
            breachProbability:
              type: number
              description: Achieved real-world probability (0..1) the stock ends below the short strike; approximately spreadRiskLevel after the solve.
            riskLevel:
              type: number
              description: The spreadRiskLevel preset the solve targeted (0.20 / 0.10 / 0.05 / 0.01), after snapping.
            savingsPct:
              type: number
              description: 'Fraction of the bare put premium rebated by the short leg: shortPremium / longPremium.'
            coveredLossAtBadYear:
              type: number
              description: Dollars the spread pays at the bad-year price, capped at bandWidth; 0 when the bad-year drop never reaches the floor.
          required:
          - available
          - unavailableReason
          - longStrike
          - longPremium
          - shortStrike
          - shortPremium
          - shortSigma
          - netPremium
          - annualCost
          - annualCostPct
          - maxLossInBand
          - bandWidth
          - shortStrikeDropPct
          - breachProbability
          - riskLevel
          - savingsPct
          - coveredLossAtBadYear
        payoffTable:
          type: array
          description: Terminal P&L in dollars at each 10%-step drawdown across payoffRange, for the bare put, the collar, the put spread, and the unhedged position.
          items:
            type: object
            properties:
              drawdownPct:
                type: number
                description: Price move as a fraction of spot (-0.30 = down 30%, 0.2 = up 20%).
              barePutPnl:
                type: number
                description: Position + put P&L in dollars at this move.
              collarPnl:
                type: number
                description: Position + collar P&L in dollars at this move.
              spreadPnl:
                type:
                - number
                - 'null'
                description: Position + put-spread P&L in dollars at this move. null (serialized from NaN) when putSpread.available is false.
              unhedgedPnl:
                type: number
                description: Unhedged position P&L in dollars at this move.
            required:
            - drawdownPct
            - barePutPnl
            - collarPnl
            - spreadPnl
            - unhedgedPnl
        payoffRange:
          type: object
          description: Price-move range covered by payoffTable, extended at least 15% beyond each collar arm and at least +/-50%.
          properties:
            lowerPct:
              type: number
              description: Lower bound of the modeled price move, as a fraction of spot (negative).
            upperPct:
              type: number
              description: Upper bound of the modeled price move, as a fraction of spot.
          required:
          - lowerPct
          - upperPct
        recommended:
          type: string
          enum:
          - collar
          - protective-put
          - put-spread
          - none
          description: 'Suggested structure, in triage order: collar unless its cap binds too often (>20% probability); then protective-put unless the put is expensive; then put-spread when one is available and cleanly priced (cheaper by construction); none when nothing is clean. The recommended structure is the one whose card carries no warning.'
      required:
      - inputs
      - riskFreeRate
      - realWorldDrift
      - barePut
      - collar
      - putSpread
      - payoffTable
      - payoffRange
      - recommended
    ProtectivePutInput:
      type: object
      required:
      - positionValue
      - sector
      - protectionLevel
      - tenorYears
      properties:
        positionValue:
          type: number
          minimum: 0
        sector:
          $ref: '#/components/schemas/SectorKey'
        volatility:
          type: number
          minimum: 0
          description: Annualized implied volatility (σ). Defaults to a sector-typical implied volatility when omitted.
          maximum: 5
        protectionLevel:
          type: number
          minimum: 0.05
          maximum: 0.5
          description: Drawdown the put protects against, as a fraction (e.g. 0.20 = 20% below current).
        tenorYears:
          type: number
          minimum: 0.25
          description: Option tenor in years.
        expectedReturn:
          type: number
          description: Override sector long-run drift μ.
        spreadRiskLevel:
          type: number
          minimum: 0.01
          maximum: 0.2
          description: 'Put spread floor breach risk: target probability the stock ends below the spread''s short strike. Presets 0.20 / 0.10 / 0.05 / 0.01; off-preset values snap to the nearest. Affects only the putSpread block. Default 0.10.'
        tickerLabel:
          type: string
          description: Optional ticker for warning copy (e.g. "AAPL").
        ticker:
          type: string
          description: Optional public-stock symbol to derive implied volatility (e.g. "AAPL").
externalDocs:
  description: Integration surface, citation guidance, and roadmap
  url: https://optionsahoy.com/for-agents