v1 API ReferenceREST
── Authentication
Generate an API key from Account → Developer. Include it in the Authorization header on every request.
Authorization: Bearer sk_strata_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxKeys 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
| ticker | path | string | required | Equity ticker symbol, e.g. AAPL |
| tickers | query | string | optional | Comma-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
| ticker | path | string | required | Equity ticker symbol |
| period | query | string | optional | 1m · 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
| ticker | path | string | required | Equity 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
| q | query | string | required | Search 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
| S | body | number | required | Spot price |
| K | body | number | required | Strike price |
| r | body | number | required | Risk-free rate (decimal, e.g. 0.05) |
| sigma | body | number | required | Volatility (decimal, e.g. 0.20) |
| T | body | number | required | Time to expiry in years |
| type | body | "call" | "put" | required | Option type |
| delta | body | number | optional | Continuous dividend yield (default 0) |
| marketPrice | body | number | optional | If 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
| faceValue | body | number | required | Face value (par), e.g. 100 or 1000 |
| couponPct | body | number | required | Annual coupon rate in percent, e.g. 5 for 5% |
| frequencyPerYear | body | number | required | Coupon payments per year: 1 (annual), 2 (semi-annual), 4 (quarterly) |
| settlementDate | body | YYYY-MM-DD | required | Settlement date |
| maturityDate | body | YYYY-MM-DD | required | Maturity date |
| ytmPct | body | number | optional | Yield to maturity in percent. Provide ytmPct or cleanPrice (not both) |
| cleanPrice | body | number | optional | Clean 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
| faceValue | body | number | required | Face value (par), e.g. 100 or 1000 |
| couponPct | body | number | required | Annual coupon rate in percent, e.g. 5 for 5% |
| frequencyPerYear | body | number | required | Coupon payments per year: 1 (annual), 2 (semi-annual), 4 (quarterly) |
| settlementDate | body | YYYY-MM-DD | required | Settlement date |
| maturityDate | body | YYYY-MM-DD | required | Maturity date |
| ytmPct | body | number | optional | Yield to maturity in percent. Provide ytmPct or cleanPrice (not both). |
| cleanPrice | body | number | optional | Clean price per 100 face. Provide cleanPrice or ytmPct (not both). |
| creditSpreadBps | body | number | optional | Credit spread in basis points added to YTM for curve construction. Default 0. |
| scenarioIds | body | string[] | optional | Filter 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
| faceValue | body | number | required | Face value (par) |
| couponPct | body | number | required | Annual coupon rate in percent |
| frequencyPerYear | body | number | required | Coupon payments per year: 1, 2, 4, 12 |
| settlementDate | body | YYYY-MM-DD | required | Settlement date |
| maturityDate | body | YYYY-MM-DD | required | Maturity date |
| cleanPrice | body | number | required | Market clean price per 100 par — the target the tree reprices to |
| curvePoints | body | {t,zeroPct}[] | required | Zero curve (continuous compounding). Minimum 2 points, maximum 60. |
| callSchedule | body | {date,price}[] | optional | Call schedule (max 30 entries). At least one of callSchedule/putSchedule is required. |
| putSchedule | body | {date,price}[] | optional | Put schedule (max 30 entries). |
| sigma | body | number | optional | Lognormal short-rate vol (decimal). Default 0.15, max 0.6. |
| steps | body | integer | optional | BDT steps. Default ceil(ttm/dt), capped at 120. |
| dt | body | number | optional | BDT 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
| faceValue | body | number | required | Face value (par) |
| couponPct | body | number | required | Annual coupon rate in percent |
| frequencyPerYear | body | number | required | Coupon payments per year: 1, 2, 4, 12 |
| settlementDate | body | YYYY-MM-DD | required | Settlement date |
| maturityDate | body | YYYY-MM-DD | required | Maturity date |
| curvePoints | body | {t,zeroPct}[] | required | Zero curve (continuous compounding). Minimum 2 points, maximum 60. |
| tenors | body | number[] | optional | Key-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
| faceValue | body | number | required | Face value (par) |
| couponPct | body | number | required | Annual coupon rate in percent (0 for zero-coupon) |
| frequencyPerYear | body | number | required | Coupon payments per year: 1, 2, 4, 12 |
| settlementDate | body | YYYY-MM-DD | required | Settlement date |
| maturityDate | body | YYYY-MM-DD | required | Maturity date |
| cleanPrice | body | number | required | Market clean price per 100 |
| curvePoints | body | {t,zeroPct}[] | required | Zero curve (continuous compounding). Minimum 2 points, maximum 60. |
| dayCountConvention | body | string | optional | 30/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
| holdings | body | array | required | Array of { ticker, value, annualizedReturn, annualizedVol } |
| correlationMatrix | body | number[][] | optional | N×N correlation matrix (defaults to identity) |
| horizonMonths | body | number | optional | Investment horizon in months (default 1) |
| numSimulations | body | number | optional | Simulation 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
| expectedReturns | body | number[] | required | Annualized expected returns per asset (2–50 assets) |
| covMatrix | body | number[][] | required | N×N annualized covariance matrix (symmetric, positive definite) |
| riskFreeRate | body | number | optional | Annualized risk-free rate for the tangency portfolio (decimal, default 0) |
| minWeight | body | number | optional | Per-asset lower bound, ≥ 0 — short-selling is not exposed (default 0) |
| maxWeight | body | number | optional | Per-asset upper bound in (0, 1] (default 1) |
| points | body | number | optional | Number 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
| S | body | number | required | Spot price of the underlying (> 0) |
| r | body | number | required | Risk-free rate (decimal, e.g. 0.05) |
| legs | body | array | required | Array (1–12) of { type: "call"|"put", position: "long"|"short", K, T, sigma, contracts, premium?, dividendYield? } |
| contractMultiplier | body | number | optional | Shares per contract (default 100) |
| spotRange | body | object | optional | { 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
| ticker | body | string | optional | Auto-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. |
| baseFCF | body | number | optional | Base-period free cash flow (TTM). Required in manual mode. |
| projectionYears | body | number | optional | Explicit forecast horizon in years (1–30, default 5). |
| stage1GrowthPct | body | number | optional | Stage-1 FCF growth rate (percent, default 5). |
| terminalGrowthPct | body | number | optional | Terminal Gordon-perpetuity growth rate (percent, default 2.5). Must be < waccPct. |
| waccPct | body | number | optional | Weighted average cost of capital (percent). Auto-derived from CAPM with Damodaran industry data when omitted. |
| sharesOutstanding | body | number | optional | Diluted shares outstanding. Required in manual mode. |
| netDebt | body | number | optional | Net debt = totalDebt − cash. Default 0. |
| currentPrice | body | number | optional | Current price per share — used for upside calc and required for reverseDCF. |
| mode | body | "dcf" | "reverseDCF" | optional | Default "dcf". "reverseDCF" solves for the growth rate that produces the current market price. |
| scenarios | body | ScenarioCase[] | optional | Up to 10 cases with stage1Growth/terminalGrowth/wacc/probability. Returns probability-weighted price. |
| sensitivity | body | { waccPct, terminalGrowthPct } | optional | 2D grid of implied prices, each axis ≤15 steps (225 cells max). |
| format | query | "csv" | optional | When 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
| ticker | body | string | optional | Auto-base mode: snapshot + Damodaran industry. Any field below overrides the auto value. (No SEC fallback here — use /compute/equity/dcf for the SEC chain.) |
| riskFreeRatePct | body | number | optional | Risk-free rate (percent). Required in manual mode. |
| betaLevered | body | number | optional | Levered equity beta. Required in manual mode. |
| equityRiskPremiumPct | body | number | optional | Equity risk premium (percent). Required in manual mode. |
| countryRiskPremiumPct | body | number | optional | Country risk premium (percent, default 0). |
| sizeRiskPremiumPct | body | number | optional | Size premium (percent, default 0). |
| interestExpense | body | number | optional | Annual 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. |
| totalDebt | body | number | optional | Total debt for the pre-tax cost of debt (default 0). |
| taxRatePct | body | number | optional | Effective tax rate (percent, 0–100). Required in manual mode. |
| marketCapEquity | body | number | optional | Equity value E = price × shares (> 0). Required in manual mode. |
| totalDebtForWeights | body | number | optional | Debt 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
| annualDividend | body | number | required | Trailing annual dividend D0 (> 0). |
| requiredReturnPct | body | number | required | Required return r (percent). Must be > longTermGrowthPct. |
| longTermGrowthPct | body | number | required | Long-run / terminal dividend growth gL (percent). |
| shortTermGrowthPct | body | number | optional | High-growth-phase dividend growth gS (percent, default = gL ⇒ H-model collapses to Gordon). gS > r is allowed. |
| highGrowthYears | body | number | optional | H-model high-growth horizon in years (default 0; H = years/2). |
| currentPrice | body | number | optional | Current 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
| kind | body | string | required | "equity" or "fx" |
| S | body | number | optional | equity: spot price (> 0) |
| r | body | number | optional | equity: risk-free rate (decimal, e.g. 0.04) |
| dividendYield | body | number | optional | equity: continuous dividend yield (decimal, default 0) |
| spot | body | number | optional | fx: spot rate, domestic units per 1 foreign (> 0) |
| rDomestic | body | number | optional | fx: domestic risk-free rate (decimal) |
| rForeign | body | number | optional | fx: foreign risk-free rate (decimal) |
| T | body | number | required | Time 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
| ticker | path | string | required | Equity ticker symbol |
| type | query | string | optional | Filter 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
| base | query | string | optional | Base 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
| base | query | string | optional | Base currency ISO code (default EUR) |
| days | query | number | optional | Number 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
| Tier | Daily Limit | Per-Minute | Price |
|---|---|---|---|
| Free | 100 requests | 10 req/min | €0 |
| Plus | 1,000 requests | 60 req/min | €15 / mo |
| Pro | 10,000 requests | 300 req/min | €39 / mo |
On 429 responses, the Retry-After header indicates seconds until the rate window resets.
── Error Codes
| Code | HTTP | Description |
|---|---|---|
| INVALID_API_KEY | 401 | API key is missing, invalid, or revoked |
| IP_PREFLIGHT_LIMIT | 429 | Pre-auth IP-level flood protection; retry after seconds in retryAfter |
| RATE_LIMIT_EXCEEDED | 429 | Per-minute API-key rate limit exceeded |
| DAILY_LIMIT_EXCEEDED | 429 | Daily request quota exhausted |
| INVALID_CONTENT_TYPE | 415 | POST body Content-Type must be application/json |
| BODY_TOO_LARGE | 413 | Request body exceeds the route's byte cap |
| ARRAY_TOO_LONG | 400 | Input array exceeds the route's length cap (e.g. curvePoints, scenarioIds, weights) |
| INVALID_BODY | 400 | Body is not valid JSON or is not a JSON object |
| MISSING_FIELDS | 400 | One or more required fields not supplied |
| INVALID_FIELDS | 400 | A field has an invalid type, range, or value |
| BAD_REQUEST | 400 | Invalid body or missing required field (legacy) |
| NOT_FOUND | 404 | Ticker not found or no data available |
| COMPUTATION_ERROR | 400 | Numerical solver failed to converge |
| INTERNAL_ERROR | 500 | Unexpected server error; safe to retry |
Strata API v1 — Wynex LabsGet API Key →