← Back to App|STRATA
v1 API ReferenceREST
STRATA / DEVELOPER / API REFERENCE

Strata API v1

Programmatic access to equity analytics, bond pricing, options Greeks, portfolio Value at Risk, and SEC filings. Data is served from Strata's cache — upstream provider rate limits are not consumed per API call.

Base URL: https://project-strata.wynexlabs.studioAuth: Bearer tokenFormat: JSON12 endpoints
── Authentication

Generate an API key from Account → Developer. Include it in the Authorization header on every request.

Authorization: Bearer sk_strata_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Keys are tier-scoped. Free: 100 req/day · Plus: 1,000/day · Pro: 10,000/day. Rate-limit headers (X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Daily-Remaining) are returned on every response.

── Response Envelope

Every endpoint returns the same wrapper. On success error is null and data holds the payload. On error data is null and error carries a structured code + message. Check one branch; the other is always null.

// Success (HTTP 200)
{
  "data":  { ... },              // endpoint-specific payload
  "meta": {
    "asOf":   "YYYY-MM-DD",
    "source": "data source identifier",
    "cached": true | false       // present on market-data routes
  },
  "error": null
}

// Error (HTTP 4xx / 5xx)
{
  "data":  null,
  "meta":  null,
  "error": {
    "code":       "ERROR_CODE",
    "message":    "Human-readable description",
    "retryAfter": 30             // seconds, present on 429 responses
  }
}
── Quick Start
Python (requests)
import requests

API_KEY = "sk_strata_live_your_key_here"
BASE    = "https://project-strata.wynexlabs.studio/api/v1"
headers = {"Authorization": f"Bearer {API_KEY}"}

# Equity snapshot
snap = requests.get(f"{BASE}/equities/AAPL/snapshot", headers=headers).json()["data"]
print(f"AAPL  {snap['price']}  P/E {snap.get('pe', 'N/A')}")

# BSM call option
bsm = requests.post(f"{BASE}/compute/bsm", headers=headers, json={
    "S": 150, "K": 155, "r": 0.05, "sigma": 0.28, "T": 0.25, "type": "call"
}).json()["data"]
print(f"Call  {bsm['price']:.4f}  Delta {bsm['greeks']['delta']:.4f}")
JavaScript / TypeScript (fetch)
const API_KEY = "sk_strata_live_your_key_here";
const BASE    = "https://project-strata.wynexlabs.studio/api/v1";
const auth    = { Authorization: `Bearer ${API_KEY}` };

// FX rates
const { data: fx } = await fetch(`${BASE}/fx/rates?base=USD`, { headers: auth })
  .then(r => r.json());
console.log("EUR/USD:", fx.EUR);

// Bond pricing
const { data: bond } = await fetch(`${BASE}/compute/bond`, {
  method: "POST",
  headers: { ...auth, "Content-Type": "application/json" },
  body: JSON.stringify({
    faceValue: 1000, couponPct: 4.5, frequencyPerYear: 2,
    settlementDate: "2026-04-21", maturityDate: "2031-04-21", ytmPct: 4.5
  }),
}).then(r => r.json());
console.log("ModDur:", bond.risk.modifiedDuration, "DV01:", bond.risk.dv01);
── Endpoint Reference
Market Data
GET/api/v1/equities/{ticker}/snapshot
Latest price, fundamentals, and key metrics for an equity. Add ?tickers=AAPL,MSFT,NVDA for batch fetch (up to 10 symbols).
Parameters
tickerpathstringrequiredEquity ticker symbol, e.g. AAPL
tickersquerystringoptionalComma-separated list of up to 10 tickers. When provided, the path ticker is ignored.
Response
{
  "data": {
    "ticker": "AAPL",
    "price": 189.42,
    "change": 1.23,
    "changePct": 0.65,
    "marketCap": 2950000000000,
    "pe": 28.4,
    "eps": 6.67
  },
  "meta": { "asOf": "2026-04-21T14:32:00Z", "source": "fmp", "cached": true },
  "error": null
}
GET/api/v1/equities/{ticker}/history
Daily OHLCV price history. Served from 24-hour cache.
Parameters
tickerpathstringrequiredEquity ticker symbol
periodquerystringoptional1m · 3m · 6m · 1y · 2y · 5y (default 1y)
Response
{
  "data": [
    { "date": "2026-04-18", "open": 186.1, "high": 191.5,
      "low": 185.9, "close": 189.42, "volume": 52431200 }
  ],
  "meta": { "asOf": "2026-04-21T14:32:00Z", "source": "alphavantage", "cached": true },
  "error": null
}
GET/api/v1/equities/{ticker}/financials
SEC XBRL financial statements: income statement, balance sheet, cash flow — up to 20 years of history. Cached 7 days.
Parameters
tickerpathstringrequiredEquity ticker symbol
Response
{
  "data": {
    "revenue":       [{ "year": 2025, "value": 394328000000 }, "..."],
    "netIncome":     [{ "year": 2025, "value": 93736000000  }, "..."],
    "totalAssets":   [{ "year": 2025, "value": 364980000000 }, "..."],
    "freeCashFlow":  [{ "year": 2025, "value": 108807000000 }, "..."]
  },
  "meta": { "asOf": "2026-04-21T14:32:00Z", "source": "sec-xbrl", "cached": true },
  "error": null
}
GET/api/v1/equities/search
Search equities by company name or ticker prefix.
Parameters
qquerystringrequiredSearch query — company name or ticker prefix
Response
{
  "data": [
    { "ticker": "AAPL", "name": "Apple Inc.", "exchange": "NASDAQ" }
  ],
  "meta": { "asOf": "2026-04-21T14:32:00Z", "source": "fmp" },
  "error": null
}
Compute
POST/api/v1/compute/bsm
Black-Scholes-Merton European option pricing with full Greeks (delta, gamma, vega, theta, rho). Optionally solves implied volatility from a market price.
Parameters
SbodynumberrequiredSpot price
KbodynumberrequiredStrike price
rbodynumberrequiredRisk-free rate (decimal, e.g. 0.05)
sigmabodynumberrequiredVolatility (decimal, e.g. 0.20)
TbodynumberrequiredTime to expiry in years
typebody"call" | "put"requiredOption type
deltabodynumberoptionalContinuous dividend yield (default 0)
marketPricebodynumberoptionalIf provided, also returns implied volatility (Newton-Raphson)
Request Body
{
  "S": 100, "K": 100, "r": 0.05,
  "sigma": 0.20, "T": 1.0, "type": "call"
}
Response
{
  "data": {
    "price": 10.4506,
    "greeks": {
      "delta": 0.6368, "gamma": 0.01876,
      "vega": 0.3752, "theta": -0.0175, "rho": 0.5323
    },
    "inputs": { "S": 100, "K": 100, "r": 0.05, "sigma": 0.2,
                "T": 1.0, "type": "call", "delta": 0 }
  },
  "meta": { "asOf": "2026-04-21T14:32:00Z", "source": "strata-compute" },
  "error": null
}
POST/api/v1/compute/bond
Bond pricing and risk metrics: dirty price, YTM, modified duration, Macaulay duration, convexity, DV01. Accepts either YTM or clean price as input.
Parameters
faceValuebodynumberrequiredFace value (par), e.g. 100 or 1000
couponPctbodynumberrequiredAnnual coupon rate in percent, e.g. 5 for 5%
frequencyPerYearbodynumberrequiredCoupon payments per year: 1 (annual), 2 (semi-annual), 4 (quarterly)
settlementDatebodyYYYY-MM-DDrequiredSettlement date
maturityDatebodyYYYY-MM-DDrequiredMaturity date
ytmPctbodynumberoptionalYield to maturity in percent. Provide ytmPct or cleanPrice (not both)
cleanPricebodynumberoptionalClean price. Provide ytmPct or cleanPrice (not both)
Request Body
{
  "faceValue": 100, "couponPct": 5,
  "frequencyPerYear": 2,
  "settlementDate": "2024-06-15",
  "maturityDate": "2029-06-15",
  "ytmPct": 5
}
Response
{
  "data": {
    "price": 100.0, "ytmPct": 5.0,
    "risk": {
      "modifiedDuration": 4.33, "macaulayDuration": 4.55,
      "convexity": 24.1, "dv01": 0.04330
    }
  },
  "meta": { "asOf": "2026-04-21T14:32:00Z", "source": "strata-compute" },
  "error": null
}
POST/api/v1/compute/bond/scenarios
Run a bond through all named historical stress scenarios and non-parallel curve shifts in one call. No yield curve required — supply ytmPct or cleanPrice and the endpoint synthesises a flat zero curve internally. Returns base pricing plus per-scenario newPrice, priceChangePct, newYtm, deltaModDur, and pnl. Note: priceChangePct uses a flat-zero baseline — scenario rankings are reliable, but absolute values carry a small model-mixing bias for non-par bonds.
Parameters
faceValuebodynumberrequiredFace value (par), e.g. 100 or 1000
couponPctbodynumberrequiredAnnual coupon rate in percent, e.g. 5 for 5%
frequencyPerYearbodynumberrequiredCoupon payments per year: 1 (annual), 2 (semi-annual), 4 (quarterly)
settlementDatebodyYYYY-MM-DDrequiredSettlement date
maturityDatebodyYYYY-MM-DDrequiredMaturity date
ytmPctbodynumberoptionalYield to maturity in percent. Provide ytmPct or cleanPrice (not both).
cleanPricebodynumberoptionalClean price per 100 face. Provide cleanPrice or ytmPct (not both).
creditSpreadBpsbodynumberoptionalCredit spread in basis points added to YTM for curve construction. Default 0.
scenarioIdsbodystring[]optionalFilter to a subset. Known IDs: covid-mar-2020, taper-tantrum-2013, fed-hike-cycle-2022, lehman-2008, bull-steepener, bear-steepener, bull-flattener, bear-flattener, positive-butterfly, negative-butterfly. Omit to run all 10.
Request Body
{
  "faceValue": 100, "couponPct": 5,
  "frequencyPerYear": 2,
  "settlementDate": "2024-06-15",
  "maturityDate": "2029-06-15",
  "ytmPct": 5
}
Response
{
  "data": {
    "base": {
      "dirtyPrice": 100.0, "cleanPrice": 100.0,
      "ytmPct": 5.0, "modifiedDuration": 4.33, "accrued": 0.0
    },
    "scenarios": [
      { "id": "fed-hike-cycle-2022", "label": "Fed hike cycle 2022",
        "rateShockBps": 425, "newPrice": 83.21,
        "priceChangePct": -16.79, "newYtm": 9.25,
        "deltaModDur": -0.42, "pnl": -16.79, "pctNotional": -16.79 }
    ],
    "modelNote": "Flat-zero baseline — scenario rankings are reliable; absolute ΔPrice carries a small model-mixing bias for non-par bonds."
  },
  "meta": { "asOf": "2026-04-21T14:32:00Z", "source": "strata-compute" },
  "error": null
}
POST/api/v1/compute/bond/oas
Option-Adjusted Spread (OAS), option-adjusted duration (OAD) and convexity (OAC) for callable / putable bonds. Uses a Black-Derman-Toy lognormal binomial tree calibrated to the supplied zero curve. OAS is solved by bisection so the tree reprices to the market clean price; OAD/OAC are ±25bp finite differences with the tree rebuilt at each bump. At least one of callSchedule / putSchedule is required — for option-free bullets use the /spreads or /bond endpoints instead.
Parameters
faceValuebodynumberrequiredFace value (par)
couponPctbodynumberrequiredAnnual coupon rate in percent
frequencyPerYearbodynumberrequiredCoupon payments per year: 1, 2, 4, 12
settlementDatebodyYYYY-MM-DDrequiredSettlement date
maturityDatebodyYYYY-MM-DDrequiredMaturity date
cleanPricebodynumberrequiredMarket clean price per 100 par — the target the tree reprices to
curvePointsbody{t,zeroPct}[]requiredZero curve (continuous compounding). Minimum 2 points, maximum 60.
callSchedulebody{date,price}[]optionalCall schedule (max 30 entries). At least one of callSchedule/putSchedule is required.
putSchedulebody{date,price}[]optionalPut schedule (max 30 entries).
sigmabodynumberoptionalLognormal short-rate vol (decimal). Default 0.15, max 0.6.
stepsbodyintegeroptionalBDT steps. Default ceil(ttm/dt), capped at 120.
dtbodynumberoptionalBDT step length in years. Default 0.5.
Request Body
{
  "faceValue": 100, "couponPct": 5,
  "frequencyPerYear": 2,
  "settlementDate": "2024-01-15",
  "maturityDate": "2029-01-15",
  "cleanPrice": 99,
  "curvePoints": [
    { "t": 1, "zeroPct": 5 }, { "t": 5, "zeroPct": 5 }, { "t": 10, "zeroPct": 5 }
  ],
  "callSchedule": [{ "date": "2026-01-15", "price": 100 }]
}
Response
{
  "data": {
    "oasBp": 47.5,
    "oadDuration": 4.21,
    "oacConvexity": 22.8,
    "optionFreeDirtyPrice": 100.45,
    "optionAdjDirtyPrice": 99.00,
    "optionValuePct": 1.45,
    "modelInputs": { "sigma": 0.15, "steps": 10, "dt": 0.5 }
  },
  "meta": { "asOf": "2026-05-13", "source": "Bond OAS" },
  "error": null
}
POST/api/v1/compute/bond/krd
Key-Rate Durations (KRD) across the zero curve. Bumps each key tenor by 1bp using a triangular kernel, reprices the bond, and reports a partial duration per bucket. Returns krdSum and effectiveDuration so the caller can sanity-check that the buckets partition the curve correctly (sum should sit within ±10% of parallel-shift effective duration for option-free bullets on smooth curves).
Parameters
faceValuebodynumberrequiredFace value (par)
couponPctbodynumberrequiredAnnual coupon rate in percent
frequencyPerYearbodynumberrequiredCoupon payments per year: 1, 2, 4, 12
settlementDatebodyYYYY-MM-DDrequiredSettlement date
maturityDatebodyYYYY-MM-DDrequiredMaturity date
curvePointsbody{t,zeroPct}[]requiredZero curve (continuous compounding). Minimum 2 points, maximum 60.
tenorsbodynumber[]optionalKey-rate maturities in years. Default [0.5, 2, 5, 10, 30]; max 12.
Request Body
{
  "faceValue": 100, "couponPct": 5,
  "frequencyPerYear": 2,
  "settlementDate": "2024-06-15",
  "maturityDate": "2034-06-15",
  "curvePoints": [
    { "t": 0.5, "zeroPct": 4 }, { "t": 2, "zeroPct": 4 },
    { "t": 5, "zeroPct": 4 }, { "t": 10, "zeroPct": 4 }, { "t": 30, "zeroPct": 4 }
  ]
}
Response
{
  "data": {
    "keyRateDurations": [
      { "tenor": "0.5Y", "tenorYears": 0.5, "krd": 0.04, "dv01": 0.4 },
      { "tenor": "2Y",   "tenorYears": 2,   "krd": 0.65, "dv01": 6.5 },
      { "tenor": "5Y",   "tenorYears": 5,   "krd": 2.10, "dv01": 21.0 },
      { "tenor": "10Y",  "tenorYears": 10,  "krd": 4.91, "dv01": 49.1 },
      { "tenor": "30Y",  "tenorYears": 30,  "krd": 0.05, "dv01": 0.5 }
    ],
    "krdSum": 7.75,
    "effectiveDuration": 7.78
  },
  "meta": { "asOf": "2026-05-13", "source": "Bond KRD" },
  "error": null
}
POST/api/v1/compute/bond/zspread
Zero-volatility spread (Z-spread): the constant continuous spread added to the ENTIRE supplied zero curve so the discounted cashflows reprice the bond to its market clean price. Solved by bisection. Unlike a single-point G-spread, the Z-spread accounts for the full term structure. Returns zSpreadBp, accrued, dirtyPrice, and curveDirtyPrice (the zero-spread curve-implied price, for context).
Parameters
faceValuebodynumberrequiredFace value (par)
couponPctbodynumberrequiredAnnual coupon rate in percent (0 for zero-coupon)
frequencyPerYearbodynumberrequiredCoupon payments per year: 1, 2, 4, 12
settlementDatebodyYYYY-MM-DDrequiredSettlement date
maturityDatebodyYYYY-MM-DDrequiredMaturity date
cleanPricebodynumberrequiredMarket clean price per 100
curvePointsbody{t,zeroPct}[]requiredZero curve (continuous compounding). Minimum 2 points, maximum 60.
dayCountConventionbodystringoptional30/360 (default), ACT/ACT, ACT/360, ACT/365F
Request Body
{
  "faceValue": 100, "couponPct": 6,
  "frequencyPerYear": 2,
  "settlementDate": "2025-01-15",
  "maturityDate": "2030-01-15",
  "cleanPrice": 105,
  "curvePoints": [
    { "t": 0.25, "zeroPct": 4 }, { "t": 30, "zeroPct": 4 }
  ]
}
Response
{
  "data": {
    "zSpreadBp": 80.34,
    "accrued": 0,
    "dirtyPrice": 105,
    "curveDirtyPrice": 108.79,
    "ttmYears": 5
  },
  "meta": { "asOf": "2026-05-26", "source": "Z-spread" },
  "error": null
}
POST/api/v1/compute/var
Monte Carlo portfolio Value at Risk (VaR 95%/99%, CVaR, probability of loss). Up to 5,000 simulations. Uses Cholesky-correlated log-normal GBM.
Parameters
holdingsbodyarrayrequiredArray of { ticker, value, annualizedReturn, annualizedVol }
correlationMatrixbodynumber[][]optionalN×N correlation matrix (defaults to identity)
horizonMonthsbodynumberoptionalInvestment horizon in months (default 1)
numSimulationsbodynumberoptionalSimulation count, capped at 5,000 (default 1,000)
Request Body
{
  "holdings": [
    { "ticker": "AAPL", "value": 50000,
      "annualizedReturn": 0.12, "annualizedVol": 0.25 },
    { "ticker": "MSFT", "value": 30000,
      "annualizedReturn": 0.11, "annualizedVol": 0.22 }
  ],
  "horizonMonths": 1,
  "numSimulations": 1000
}
Response
{
  "data": {
    "var95": -0.0342, "var99": -0.0521,
    "cvar95": -0.0443, "cvar99": -0.0612,
    "probLoss": 0.38, "medianReturn": 0.0082,
    "initialValue": 80000, "horizonMonths": 1
  },
  "meta": { "asOf": "...", "source": "strata-compute", "numSimulations": 1000 },
  "error": null
}
POST/api/v1/compute/frontier
Long-only box-constrained mean-variance efficient frontier. Solves the exact convex QP (primal active-set, not a grid-search approximation): the global minimum-variance (GMV) portfolio, the maximum-Sharpe (tangency) portfolio, and the efficient arc swept over `points` target returns. Weights are decimals summing to 1; returns/vols are annualized decimals. The covariance matrix must be symmetric positive definite.
Parameters
expectedReturnsbodynumber[]requiredAnnualized expected returns per asset (2–50 assets)
covMatrixbodynumber[][]requiredN×N annualized covariance matrix (symmetric, positive definite)
riskFreeRatebodynumberoptionalAnnualized risk-free rate for the tangency portfolio (decimal, default 0)
minWeightbodynumberoptionalPer-asset lower bound, ≥ 0 — short-selling is not exposed (default 0)
maxWeightbodynumberoptionalPer-asset upper bound in (0, 1] (default 1)
pointsbodynumberoptionalNumber of target-return samples along the frontier, 2–100 (default 25)
Request Body
{
  "expectedReturns": [0.06, 0.09, 0.14],
  "covMatrix": [
    [0.04,  0.006, 0.004],
    [0.006, 0.0225, 0.005],
    [0.004, 0.005, 0.09]
  ],
  "riskFreeRate": 0.03,
  "points": 25
}
Response
{
  "data": {
    "gmv": { "weights": [0.2877, 0.5851, 0.1272], "expectedReturn": 0.0877, "volatility": 0.1246, "sharpeRatio": 0.4601 },
    "tangency": { "weights": [0.0779, 0.6319, 0.2901], "expectedReturn": 0.1022, "volatility": 0.1393, "sharpeRatio": 0.5180 },
    "frontier": [ { "expectedReturn": 0.0877, "volatility": 0.1246, "sharpeRatio": ..., "weights": [...] }, ... ],
    "inputs": { "numAssets": 3, "riskFreeRate": 0.03, "minWeight": 0, "maxWeight": 1, "points": 25 }
  },
  "meta": { "asOf": "...", "source": "Long-only box-constrained mean-variance QP (Markowitz; primal active-set, verified)" },
  "error": null
}
POST/api/v1/compute/strategy
Multi-leg option strategy aggregation: net debit/credit, position Greeks, exact (kink-based) max profit/loss, breakevens, and the P&L-at-expiry curve. Per-leg premiums default to Black-Scholes; pass `premium` to use a market price. Unbounded payoffs return null maxPnL/minPnL with unboundedUpside/unboundedDownside flags.
Parameters
SbodynumberrequiredSpot price of the underlying (> 0)
rbodynumberrequiredRisk-free rate (decimal, e.g. 0.05)
legsbodyarrayrequiredArray (1–12) of { type: "call"|"put", position: "long"|"short", K, T, sigma, contracts, premium?, dividendYield? }
contractMultiplierbodynumberoptionalShares per contract (default 100)
spotRangebodyobjectoptional{ min, max, steps } for the P&L curve grid (steps 2–500)
Request Body
{
  "S": 100, "r": 0.05,
  "legs": [
    { "type": "call", "position": "long",  "K": 90,  "T": 1, "sigma": 0.20, "contracts": 1 },
    { "type": "call", "position": "short", "K": 100, "T": 1, "sigma": 0.20, "contracts": 2 },
    { "type": "call", "position": "long",  "K": 110, "T": 1, "sigma": 0.20, "contracts": 1 }
  ]
}
Response
{
  "data": {
    "netDebit": 183.84, "maxPnL": 816.16, "minPnL": -183.84,
    "unboundedUpside": false, "unboundedDownside": false,
    "breakevens": [91.84, 108.16],
    "positionGreeks": { "delta": ..., "gamma": ..., "theta": ..., "vega": ..., "rho": ... },
    "combinedPnL": [ { "S": 50, "pnl": -183.84 }, ... ],
    "contractMultiplier": 100
  },
  "meta": { "asOf": "...", "source": "Strategy aggregation (Black-Scholes-Merton legs)" },
  "error": null
}
POST/api/v1/compute/equity/dcf
2-stage FCFF DCF valuation. Two modes: auto-base (pass `ticker`, endpoint pulls FCF/debt/cash from FMP ⊕ SEC ⊕ ESEF, derives WACC from CAPM with Damodaran industry data) or manual (pass all inputs explicitly). Optional add-ons: scenarios (bull/base/bear with probability-weighted price), 2D sensitivity grid, reverseDCF mode (solves for implied growth at current price). Banks/insurers correctly route to a 'use FCFE' diagnostic. Add `?format=csv` for spreadsheet-ready output.
Parameters
tickerbodystringoptionalAuto-base mode: any field below overrides the auto-derived value. US tickers + UK/EU industrials with canonical XBRL tagging produce real DCFs end-to-end.
baseFCFbodynumberoptionalBase-period free cash flow (TTM). Required in manual mode.
projectionYearsbodynumberoptionalExplicit forecast horizon in years (1–30, default 5).
stage1GrowthPctbodynumberoptionalStage-1 FCF growth rate (percent, default 5).
terminalGrowthPctbodynumberoptionalTerminal Gordon-perpetuity growth rate (percent, default 2.5). Must be < waccPct.
waccPctbodynumberoptionalWeighted average cost of capital (percent). Auto-derived from CAPM with Damodaran industry data when omitted.
sharesOutstandingbodynumberoptionalDiluted shares outstanding. Required in manual mode.
netDebtbodynumberoptionalNet debt = totalDebt − cash. Default 0.
currentPricebodynumberoptionalCurrent price per share — used for upside calc and required for reverseDCF.
modebody"dcf" | "reverseDCF"optionalDefault "dcf". "reverseDCF" solves for the growth rate that produces the current market price.
scenariosbodyScenarioCase[]optionalUp to 10 cases with stage1Growth/terminalGrowth/wacc/probability. Returns probability-weighted price.
sensitivitybody{ waccPct, terminalGrowthPct }optional2D grid of implied prices, each axis ≤15 steps (225 cells max).
formatquery"csv"optionalWhen set to csv (or Accept: text/csv), returns sectioned CSV download instead of JSON.
Request Body
{
  "ticker": "AAPL",
  "scenarios": [
    { "label": "Bull", "stage1GrowthPct": 12,
      "terminalGrowthPct": 3, "waccPct": 9, "probabilityPct": 30 },
    { "label": "Base", "stage1GrowthPct": 8,
      "terminalGrowthPct": 2.5, "waccPct": 9, "probabilityPct": 50 },
    { "label": "Bear", "stage1GrowthPct": 4,
      "terminalGrowthPct": 2, "waccPct": 9, "probabilityPct": 20 }
  ]
}
Response
{
  "data": {
    "impliedPrice": 110.52,
    "currentPrice": 175.0,
    "upside": -0.369,
    "enterpriseValue": 1.68e12,
    "equityValue": 1.62e12,
    "sumPVProjectedFCFs": 4.39e11,
    "terminalValue": 1.92e12,
    "pvTerminalValue": 1.24e12,
    "netDebt": 5.47e10,
    "projectedYears": [
      { "year": 1, "fcf": 103.7e9, "pvFCF": 95.0e9 },
      ...
    ],
    "scenarios": {
      "cases": [
        { "label": "Bull", "impliedPrice": 168.2, ... },
        { "label": "Base", "impliedPrice": 110.5, ... },
        { "label": "Bear", "impliedPrice": 70.1,  ... }
      ],
      "weightedPrice": 113.4, "weightedUpside": -0.352
    },
    "inputs": { "ticker": "AAPL", "baseFCF": 9.88e10, ... }
  },
  "meta": {
    "asOf": "2026-04-27", "mode": "dcf",
    "source": "DCF 2-Stage (auto-base, SEC FY2025, Damodaran Computers/Peripherals)",
    "provenance": {
      "baseFCF": "auto-sec",
      "waccPct": "auto-damodaran",
      "sharesOutstanding": "auto-snapshot"
    },
    "secAsOf": "2025-09-27"
  },
  "error": null
}
POST/api/v1/compute/equity/wacc
Weighted Average Cost of Capital via the CAPM build-up. CoE = rf + β·ERP + CRP + size; CoD(after-tax) = (interest/debt)·(1−tax); WACC = wE·CoE + wD·CoD. Two modes: manual (pass the inputs) or auto-base (pass `ticker`, the endpoint pulls β / market cap / debt / interest from the FMP snapshot and β/ERP/tax from Damodaran industry data; any field overrides the auto value). All rates in percent. Returns the full decomposition (every scalar independently verified).
Parameters
tickerbodystringoptionalAuto-base mode: snapshot + Damodaran industry. Any field below overrides the auto value. (No SEC fallback here — use /compute/equity/dcf for the SEC chain.)
riskFreeRatePctbodynumberoptionalRisk-free rate (percent). Required in manual mode.
betaLeveredbodynumberoptionalLevered equity beta. Required in manual mode.
equityRiskPremiumPctbodynumberoptionalEquity risk premium (percent). Required in manual mode.
countryRiskPremiumPctbodynumberoptionalCountry risk premium (percent, default 0).
sizeRiskPremiumPctbodynumberoptionalSize premium (percent, default 0).
interestExpensebodynumberoptionalAnnual interest expense. Required whenever totalDebt > 0 (manual mode, or auto-base when the snapshot reports debt but no interest) — otherwise the endpoint 422s rather than return a cost of debt of silently 0.
totalDebtbodynumberoptionalTotal debt for the pre-tax cost of debt (default 0).
taxRatePctbodynumberoptionalEffective tax rate (percent, 0–100). Required in manual mode.
marketCapEquitybodynumberoptionalEquity value E = price × shares (> 0). Required in manual mode.
totalDebtForWeightsbodynumberoptionalDebt D for the capital-structure weights (defaults to totalDebt).
Request Body
{
  "riskFreeRatePct": 4,
  "betaLevered": 1,
  "equityRiskPremiumPct": 5,
  "interestExpense": 20,
  "totalDebt": 400,
  "taxRatePct": 25,
  "marketCapEquity": 600,
  "totalDebtForWeights": 400
}
Response
{
  "data": {
    "waccPct": 6.9,
    "costOfEquityPct": 9,
    "costOfDebtPreTaxPct": 5,
    "costOfDebtAfterTaxPct": 3.75,
    "weightEquityPct": 60,
    "weightDebtPct": 40,
    "taxRatePct": 25,
    "components": { "riskFreeRatePct": 4, "betaLevered": 1, "equityRiskPremiumPct": 5,
                   "countryRiskPremiumPct": 0, "sizeRiskPremiumPct": 0 },
    "inputs": { "ticker": null, ... }
  },
  "meta": {
    "asOf": "2026-05-27",
    "source": "WACC CAPM build-up (manual)",
    "provenance": { "betaLevered": "user", "marketCapEquity": "user", ... }
  },
  "error": null
}
POST/api/v1/compute/equity/ddm
Dividend Discount Model — Gordon Growth + H-Model. Gordon P = D0·(1+gL)/(r−gL); H-Model adds the linear-decay high-growth term D0·H·(gS−gL)/(r−gL) with H = highGrowthYears/2. Returns both model values, the implied (trailing) dividend yields, and upside vs currentPrice. Manual-only (forward growth assumptions are analyst judgment). requiredReturnPct must exceed longTermGrowthPct (a 400 otherwise). All rates in percent.
Parameters
annualDividendbodynumberrequiredTrailing annual dividend D0 (> 0).
requiredReturnPctbodynumberrequiredRequired return r (percent). Must be > longTermGrowthPct.
longTermGrowthPctbodynumberrequiredLong-run / terminal dividend growth gL (percent).
shortTermGrowthPctbodynumberoptionalHigh-growth-phase dividend growth gS (percent, default = gL ⇒ H-model collapses to Gordon). gS > r is allowed.
highGrowthYearsbodynumberoptionalH-model high-growth horizon in years (default 0; H = years/2).
currentPricebodynumberoptionalCurrent price per share (> 0) — when supplied, returns gordon/hModel upside; otherwise upside is null.
Request Body
{
  "annualDividend": 2,
  "requiredReturnPct": 10,
  "shortTermGrowthPct": 8,
  "longTermGrowthPct": 4,
  "highGrowthYears": 10,
  "currentPrice": 30
}
Response
{
  "data": {
    "gordonValue": 34.6667,
    "hModelValue": 41.3333,
    "gordonImpliedYield": 5.7692,
    "hModelImpliedYield": 4.8387,
    "gordonUpside": 0.1556,
    "hModelUpside": 0.3778,
    "inputs": { "annualDividend": 2, "requiredReturnPct": 10, "shortTermGrowthPct": 8,
                "longTermGrowthPct": 4, "highGrowthYears": 10, "currentPrice": 30 }
  },
  "meta": {
    "asOf": "2026-05-27",
    "source": "Dividend Discount Model — Gordon Growth + H-Model (manual)"
  },
  "error": null
}
POST/api/v1/compute/forward
No-arbitrage forward pricing. kind "equity": continuous cost-of-carry F₀ = S·e^{(r−q)T}, returned with the financing-cost / dividend-income / net-carry decomposition. kind "fx": covered interest-rate parity F = S·e^{(r_d−r_f)T}, returned with forward points and % premium (negative when r_d < r_f). Single-sourced from the verified forwards engine.
Parameters
kindbodystringrequired"equity" or "fx"
Sbodynumberoptionalequity: spot price (> 0)
rbodynumberoptionalequity: risk-free rate (decimal, e.g. 0.04)
dividendYieldbodynumberoptionalequity: continuous dividend yield (decimal, default 0)
spotbodynumberoptionalfx: spot rate, domestic units per 1 foreign (> 0)
rDomesticbodynumberoptionalfx: domestic risk-free rate (decimal)
rForeignbodynumberoptionalfx: foreign risk-free rate (decimal)
TbodynumberrequiredTime to maturity in years (≥ 0)
Request Body
{ "kind": "fx", "spot": 1.10, "rDomestic": 0.04, "rForeign": 0.02, "T": 1 }
Response
{
  "data": {
    "kind": "fx",
    "forwardRate": 1.1222214740294314,
    "forwardPoints": 222.21,
    "pctPremium": 2.02,
    "inputs": { "spot": 1.1, "rDomestic": 0.04, "rForeign": 0.02, "T": 1 }
  },
  "meta": { "asOf": "...", "source": "Covered interest-rate parity FX forward (continuous compounding)" },
  "error": null
}
SEC Filings
GET/api/v1/filings/{ticker}
SEC EDGAR filing index for a company: 10-K, 10-Q, 8-K, DEF 14A, Form 4, and more. Cached 7 days.
Parameters
tickerpathstringrequiredEquity ticker symbol
typequerystringoptionalFilter by form type, e.g. 10-K
Response
{
  "data": {
    "cik": "0000320193",
    "filings": [
      {
        "accessionNumber": "0000320193-25-000012",
        "form": "10-K",
        "filingDate": "2025-11-01",
        "reportDate": "2025-09-27",
        "primaryDocument": "aapl20250927.htm"
      }
    ]
  },
  "meta": { "asOf": "2026-04-21T14:32:00Z", "source": "sec-edgar", "cached": true },
  "error": null
}
FX & Rates
GET/api/v1/fx/rates
Latest exchange rates for 12 currencies (EUR, USD, GBP, JPY, CHF, CAD, AUD, SEK, NOK, DKK, HKD, SGD). ECB as primary source.
Parameters
basequerystringoptionalBase currency ISO code (default EUR)
Response
{
  "data": { "EUR": 1, "USD": 1.0892, "GBP": 0.8543, "JPY": 163.4 },
  "meta": { "asOf": "2026-04-21T14:32:00Z", "source": "ecb" },
  "error": null
}
GET/api/v1/fx/history
Historical daily FX rates.
Parameters
basequerystringoptionalBase currency ISO code (default EUR)
daysquerynumberoptionalNumber of calendar days of history (default 90)
Response
{
  "data": [
    { "date": "2026-04-18", "USD": 1.0892, "GBP": 0.8543 }
  ],
  "meta": { "asOf": "2026-04-21T14:32:00Z", "source": "ecb" },
  "error": null
}
GET/api/v1/rates/curves
USD Treasury zero curve (treasury.gov) and EUR AAA government bond curve (ECB SDW).
Response
{
  "data": {
    "ust": [{ "tenor": "1M", "rate": 0.0532 }, { "tenor": "2Y", "rate": 0.0487 }],
    "eur": [{ "tenor": "1Y", "rate": 0.0261 }, { "tenor": "10Y", "rate": 0.0342 }]
  },
  "meta": { "asOf": "2026-04-21T14:32:00Z", "source": "treasury.gov + ecb" },
  "error": null
}
GET/api/v1/rates/macro
Key macro rates: Fed Funds, SOFR, 2Y/5Y/10Y/30Y Treasury yields, HY and IG OAS spreads (FRED).
Response
{
  "data": {
    "indicators": {
      "fedFunds":   { "value": 4.33,  "date": "2026-04-21", "label": "Fed Funds Rate",               "unit": "%" },
      "sofr":       { "value": 4.30,  "date": "2026-04-21", "label": "Secured Overnight Financing Rate", "unit": "%" },
      "dgs2":       { "value": 4.81,  "date": "2026-04-21", "label": "2-Year Treasury Yield",        "unit": "%" },
      "dgs5":       { "value": 4.65,  "date": "2026-04-21", "label": "5-Year Treasury Yield",        "unit": "%" },
      "dgs10":      { "value": 4.52,  "date": "2026-04-21", "label": "10-Year Treasury Yield",       "unit": "%" },
      "dgs30":      { "value": 4.71,  "date": "2026-04-21", "label": "30-Year Treasury Yield",       "unit": "%" },
      "igOas":      { "value": 0.98,  "date": "2026-04-21", "label": "US IG Credit Spread (OAS)",    "unit": "bps" },
      "hySpread":   { "value": 3.12,  "date": "2026-04-21", "label": "US HY Credit Spread (OAS)",    "unit": "bps" }
    }
  },
  "meta": { "asOf": "2026-04-21", "source": "FRED", "cached": false },
  "error": null
}
── Rate Limits
TierDaily LimitPer-MinutePrice
Free100 requests10 req/min€0
Plus1,000 requests60 req/min€15 / mo
Pro10,000 requests300 req/min€39 / mo

On 429 responses, the Retry-After header indicates seconds until the rate window resets.

── Error Codes
CodeHTTPDescription
INVALID_API_KEY401API key is missing, invalid, or revoked
IP_PREFLIGHT_LIMIT429Pre-auth IP-level flood protection; retry after seconds in retryAfter
RATE_LIMIT_EXCEEDED429Per-minute API-key rate limit exceeded
DAILY_LIMIT_EXCEEDED429Daily request quota exhausted
INVALID_CONTENT_TYPE415POST body Content-Type must be application/json
BODY_TOO_LARGE413Request body exceeds the route's byte cap
ARRAY_TOO_LONG400Input array exceeds the route's length cap (e.g. curvePoints, scenarioIds, weights)
INVALID_BODY400Body is not valid JSON or is not a JSON object
MISSING_FIELDS400One or more required fields not supplied
INVALID_FIELDS400A field has an invalid type, range, or value
BAD_REQUEST400Invalid body or missing required field (legacy)
NOT_FOUND404Ticker not found or no data available
COMPUTATION_ERROR400Numerical solver failed to converge
INTERNAL_ERROR500Unexpected server error; safe to retry
Strata API v1 — Wynex LabsGet API Key →