Options
by Implied Volatility & Max Pain in Onchain & crypto
Implied volatility (IV) of crypto options per expiry from Deribit, Bybit and OKX: ATM IV, 25-delta skew, put/call open interest ratio, max pain and Deribit's DVOL index; with an expiry, the options chain per strike with the greeks as each venue publishes them. Volatility surface inputs for BTC and ETH options. Data only. Bad input is free; nothing is charged when no venue answers.
https://derivs.duoleads.com/v1/options- Price
- $0.003
- per call in USDC
- Uptime
- 100%
- last 30 days
- Response time
- 335 ms
- 480 ms slowest 5%
- Last check
- Passed
- 2 h ago, next any minute now
Reliability
Status and outage history · Atom feed · Watch with other listings
How to call it
GET https://derivs.duoleads.com/v1/options
Each call costs $0.003 in USDC on Base, paid with the request over x402.
Run a free test callOne unpaid request, the way an agent sends it. You see the payment challenge it gets back. Nothing is charged.
Example request
From the listing.
GET https://derivs.duoleads.com/v1/options?coin=BTCParameters
| Parameter | Type | Required | Description |
|---|---|---|---|
coin | string | Yes | Underlying coin: BTC, ETH, SOL ... (options exist mainly for BTC and ETH). |
expiry | string | No | Optional expiry date YYYY-MM-DD (UTC): only that expiry, plus its chain per strike with the venues' greeks. Default: the 6 nearest expiries, no chain. |
Example response
The provider's example. We can't check it without paying.
Example response, 152 lines
{
"as_of": "2026-10-14T23:00:00Z",
"available_expiries": [
"2026-10-15",
"2026-10-16"
],
"coin": "BTC",
"colo": null,
"disclaimer": "Data only, not investment advice, not a benchmark; not affiliated with any exchange",
"dvol": {
"as_of": "2026-10-14T23:00:00Z",
"change_24h": 0.96,
"high_24h": 39.3,
"low_24h": 37.75,
"time": "2026-10-14T22:00:00Z",
"value": 39.13,
"venue": "deribit"
},
"expiries": [
{
"days_to_expiry": 0.375,
"expiry": "2026-10-15T08:00:00Z",
"venues": [
{
"as_of": "2026-10-14T23:00:00Z",
"atm_iv": 0.390797,
"max_pain": 83500,
"oi_coins": 3102.7,
"put_call_oi_ratio": 1.42436,
"skew_25d": null,
"stale": false,
"strikes": 28,
"underlying": 81562.84,
"venue": "deribit"
},
{
"as_of": "2026-10-14T23:00:00Z",
"atm_iv": 0.390494,
"max_pain": 82500,
"oi_coins": 2832.08,
"put_call_oi_ratio": 0.765449,
"skew_25d": {
"call_delta": 0.27996,
"call_iv": 0.3866,
"put_delta": -0.274783,
"put_iv": 0.4155,
"risk_reversal": -0.0289,
"skew": 0.0289
},
"stale": false,
"strikes": 28,
"underlying": 81646.3838,
"venue": "bybit"
},
{
"as_of": "2026-10-14T23:00:00Z",
"atm_iv": 0.386518,
"max_pain": null,
"oi_coins": null,
"put_call_oi_ratio": null,
"skew_25d": {
"call_delta": 0.201432,
"call_iv": 0.392882,
"put_delta": -0.27447,
"put_iv": 0.40066,
"risk_reversal": -0.00777776,
"skew": 0.00777776
},
"stale": false,
"strikes": 27,
"underlying": 81622.81366,
"venue": "okx"
}
]
},
{
"days_to_expiry": 1.375,
"expiry": "2026-10-16T08:00:00Z",
"venues": [
{
"as_of": "2026-10-14T23:00:00Z",
"atm_iv": 0.387452,
"max_pain": 83000,
"oi_coins": 17322.2,
"put_call_oi_ratio": 1.42795,
"skew_25d": null,
"stale": false,
"strikes": 26,
"underlying": 81582.3,
"venue": "deribit"
},
{
"as_of": "2026-10-14T23:00:00Z",
"atm_iv": 0.373493,
"max_pain": 83000,
"oi_coins": 3288.83,
"put_call_oi_ratio": 1.08242,
"skew_25d": {
"call_delta": 0.235112,
"call_iv": 0.3861,
"put_delta": -0.216943,
"put_iv": 0.4091,
"risk_reversal": -0.023,
"skew": 0.023
},
"stale": false,
"strikes": 35,
"underlying": 81565.5,
"venue": "bybit"
},
{
"as_of": "2026-10-14T23:00:00Z",
"atm_iv": 0.379213,
"max_pain": null,
"oi_coins": null,
"put_call_oi_ratio": null,
"skew_25d": {
"call_delta": 0.231349,
"call_iv": 0.364241,
"put_delta": -0.222136,
"put_iv": 0.435268,
"risk_reversal": -0.0710269,
"skew": 0.0710269
},
"stale": false,
"strikes": 33,
"underlying": 81625.13401,
"venue": "okx"
}
]
}
],
"request_id": "01KEXAMPLE0000000000000000",
"see_also": {
"endpoint": "https://derivs.duoleads.com/v1/basis",
"params": [
"coin"
],
"reason": "The futures term structure (annualised basis per expiry) next to the options' implied volatility."
},
"units": {
"dvol": "Deribit volatility index, annualised percent",
"greeks": "as published by the venue (Bybit, OKX); Deribit publishes none in bulk",
"iv": "implied volatility as a fraction (0.45 = 45 %), annualised",
"max_pain": "strike (USD) where option holders' intrinsic value at expiry is smallest",
"oi_coins": "coins",
"put_call_oi_ratio": "put open interest / call open interest",
"skew": "put IV - call IV at 25 delta (fraction)",
"underlying": "USD per coin (the venue's underlying / forward price)"
},
"venues_missing": []
}Call it from code
The curl command shows the payment challenge. The JavaScript and Python versions pay and call, and never pay more than $0.003.
curl: see the payment challenge
# bash or zsh: see the payment challenge. Nothing is charged.
curl -sS -g -i 'https://derivs.duoleads.com/v1/options?coin=BTC'
# x402 v2 sends the challenge base64-encoded in the PAYMENT-REQUIRED header (v1 sends it in the body).
# To read the header:
curl -sS -g -o /dev/null -D - 'https://derivs.duoleads.com/v1/options?coin=BTC' \
| grep -i '^payment-required:' | cut -d' ' -f2 | tr -d '\r' | base64 --decodeJavaScript: pay and call
// npm i @x402/fetch @x402/evm viem
import { wrapFetchWithPayment, x402Client } from "@x402/fetch";
import { registerExactEvmScheme } from "@x402/evm/exact/client";
import { privateKeyToAccount } from "viem/accounts";
// Pays at most $0.003 per call.
const client = new x402Client().setSpendControls({ maxAmountPerPayment: "$0.003" });
registerExactEvmScheme(client, { signer: privateKeyToAccount(process.env.EVM_PRIVATE_KEY) });
const pay = wrapFetchWithPayment(fetch, client);
// Not sure it's safe to pay? ToolVet checks it first for $0.005. Pay for that from a separate
// client: this one is capped at $0.003 per payment. GET https://toolvet.app/api/v1/check?url=https%3A%2F%2Fderivs.duoleads.com%2Fv1%2Foptions
const res = await pay("https://derivs.duoleads.com/v1/options?coin=BTC");
console.log(res.status, await res.text());Python: pay and call
# pip install "x402[requests,evm]"
import os
from eth_account import Account
from x402 import x402ClientSync
from x402.http.clients import x402_requests
from x402.mechanisms.evm import EthAccountSigner
from x402.mechanisms.evm.exact.register import register_exact_evm_client
# Pays at most $0.003 per call.
client = x402ClientSync().set_spend_controls({"max_amount_per_payment": "$0.003"})
register_exact_evm_client(client, EthAccountSigner(Account.from_key(os.environ["EVM_PRIVATE_KEY"])))
with x402_requests(client) as session:
res = session.get("https://derivs.duoleads.com/v1/options?coin=BTC")
print(res.status_code, res.text)Security scan
No findings
We scan names, descriptions and tool definitions for hidden instructions and other prompt-injection patterns.
Recent checks
| When | Result | HTTP | Time | Price |
|---|---|---|---|---|
| 2 h ago | Passed | 402 | 393 ms | $0.003 |
| 7 h ago | Passed | 402 | 358 ms | $0.003 |
| 11 h ago | Passed | 402 | 335 ms | $0.003 |
| 16 h ago | Passed | 402 | 152 ms | $0.003 |
| 20 h ago | Passed | 402 | 304 ms | $0.003 |
Show 3 older checks
| 25 h ago | Passed | 402 | 402 ms | $0.003 |
| 29 h ago | Passed | 402 | 480 ms | $0.003 |
| 39 h ago | Passed | 402 | 53 ms | $0.003 |