Getting Started
DerivFabric is a derivatives pricing and risk engine delivered as an HTTP API: you send an instrument and a market, and it returns a price, Greeks, or a risk number. Every priced number comes back with a run manifest saying which pricer produced it, at what version, and how far that implementation has been validated — so a valuation can be explained months later without archaeology.
This page takes you from no access to a priced option.
1. Get access
DerivFabric is commercial software. There is no public sandbox and no self-service signup — access begins with a tenant provisioned for your organisation, and an API key issued inside it. If you do not yet have a console sign-in, talk to your DerivFabric contact first, because nothing below will work without one.
Once your tenant exists, an API key is created through the admin console, signed in as a Tenant Admin:
- Sign in to the console for your deployment.
- Select your tenant in the header — keys belong to a tenant.
- Open Platform → API Keys.
- Give the key a name that says where it will run (
risk-desk-nightly, notkey1), optionally set an expiry in days, and choose the live or test environment. - Create the key.
Copy the key immediately. The raw secret is returned once, at creation, and is not stored in recoverable form. Afterwards the list shows the key's prefix, scopes, expiry, last use and state — never the secret again.
Keys carry scopes, and endpoints declare what they require: price,
calibrate, portfolio, xva, jobs, governance, validate and admin.
admin satisfies any requirement, and there is no wildcard. The pricing call
below needs price.
Two authorisation failures are reported separately because they need different
remedies: DF-AUTH-004 is a missing scope, fixed by issuing a key that
carries it, and DF-AUTH-005 is an insufficient tier, fixed by changing
plan.
2. Set your environment
Two values drive everything that follows. DerivFabric is deployed per customer, so the base URL is yours, not a shared one.
export DERIVFABRIC_BASE_URL=https://your-deployment.example
export DERIVFABRIC_API_KEY=df_live_...
Every request authenticates with the X-API-Key header. The single
exception is /health, which needs no key.
Keep the key out of source control and out of shell history — read it from your secret manager into the environment rather than pasting it into a file.
3. Your first request
Price an at-the-money one-year call: spot 100, strike 100, 5% continuously compounded rate, 20% volatility.
curl -X POST "$DERIVFABRIC_BASE_URL/api/v1/price" \
-H "X-API-Key: $DERIVFABRIC_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"spot": 100,
"strike": 100,
"rate": 0.05,
"dividend": 0.0,
"volatility": 0.20,
"time": 1.0,
"optionType": "call"
}'
spot, strike, rate, volatility and time are required — all numbers,
with time in years and rate and volatility as decimals, not percentages.
dividend (continuous yield) defaults to 0, and optionType defaults to
"call"; the only other accepted value is "put".
The response, in full
{
"success": true,
"data": {
"price": 10.450583572185565,
"spot": 100.0,
"strike": 100.0,
"optionType": "call"
},
"meta": {
"manifest": {
"engineVersion": "0.1.0",
"runId": "019fd7c6-3b1a-7c4e-9f2d-8e5a1b0c4d7e",
"pricerId": "bs_analytical",
"pricerVersion": 1,
"pricerFingerprint": "fp:v1:blake3:11fc25828bb872dc164d06e4908a27928ed8f4851a0d953c9a7787e759fc7904",
"capabilityStatus": "ga-validated",
"marketDataAsOf": "2026-08-20"
}
},
"correlationId": "019fd7c6-3b1a-7c4e-9f2d-8e5a1b0c4d7e",
"timestamp": "2026-08-20T09:00:00Z"
}
Three things are worth understanding before you build against it.
Every response is wrapped. The documented schema for an operation
describes the payload, not the bytes on the wire; data holds it. This
matters most if you generate a client from the OpenAPI spec: a generated type
expecting price at the top level will fail, because the top level is
success. The correlation id is present on success and failure alike — quote
it in a support ticket. It is emitted under both correlationId and
correlation_id, carrying the same value.
meta.manifest says what produced the number. Here bs_analytical at
version 1, with a capabilityStatus of ga-validated — the strongest of five
statuses (roadmap, experimental, production-candidate, ga-validated,
retired). The pricerFingerprint is a deterministic BLAKE3 hash over the
pricer's identity and version; identical inputs give an identical fingerprint
on any process or binary, which makes reproducibility checkable rather than
asserted. runId always equals the envelope's correlation id, so one
identifier ties a result to its stored receipt.
A manifest may also carry a warnings array — a non-production capability
status, an unregistered pricer, or a pricer that needed a curve or surface
this deployment has not connected. Read it. It is omitted when empty, so
its presence always means something.
On failure, success is false, data is absent, and error holds a
stable machine-readable code with a human-readable message:
{
"success": false,
"error": { "code": "DF-AUTH-001", "message": "Missing X-API-Key header" },
"correlationId": "019fd7c6-3b1a-7c4e-9f2d-8e5a1b0c4d7e",
"timestamp": "2026-08-20T09:00:00Z"
}
One more thing worth knowing early: 202 Accepted is a success, not an
error. Job submission returns it with data populated. A client that treats
every status at or above 300 as failure without reading success will break
on asynchronous work.
4. The same call from an SDK
The SDKs handle the envelope for you: methods return the unwrapped data, and
the manifest is exposed as client state. They share one retry policy — 408,
429 and 5xx, two retries, exponential backoff from 500 ms — and one family of
typed errors that preserves the correlation id.
Python
Requires Python 3.10 or newer. Async, built on httpx, with pydantic
models.
pip install derivfabric
import asyncio
import os
from derivfabric import DerivFabricClient
async def main() -> None:
async with DerivFabricClient(
api_key=os.environ["DERIVFABRIC_API_KEY"],
base_url=os.environ["DERIVFABRIC_BASE_URL"],
) as client:
result = await client.pricing.price_vanilla(
spot=100.0,
strike=100.0,
rate=0.05,
volatility=0.20,
time=1.0,
option_type="call",
)
print(f"price: {result.price:.6f}")
# Provenance for the call just made. Read it immediately: it reflects
# whichever call finished last, so on a shared client with requests in
# flight it belongs to whoever got there first.
manifest = client.last_manifest
if manifest is not None:
print(f"pricer: {manifest.pricer_id} v{manifest.pricer_version}")
print(f"status: {manifest.capability_status}")
asyncio.run(main())
Every method is a coroutine, and the client is an async context manager —
async with closes the connection pool for you. An omitted keyword is omitted
from the request body rather than sent as None.
TypeScript
Requires Node 18 or newer. Ships ESM and CommonJS builds with type
declarations for both, built on standard fetch — so it also runs in Deno,
Bun and the browser, with no runtime dependencies.
npm install derivfabric
import { DerivFabricClient } from "derivfabric";
const client = new DerivFabricClient({
apiKey: process.env.DERIVFABRIC_API_KEY!,
baseUrl: process.env.DERIVFABRIC_BASE_URL,
});
const result = await client.pricing.priceVanilla({
spot: 100,
strike: 100,
rate: 0.05,
volatility: 0.2,
time: 1.0,
optionType: "call",
});
console.log(`price: ${result.price.toFixed(6)}`);
const manifest = client.lastManifest;
if (manifest) {
console.log(`pricer: ${manifest.pricerId} v${manifest.pricerVersion}`);
console.log(`status: ${manifest.capabilityStatus}`);
}
Every method returns a Promise. Requests are plain object literals, so an
optional field you leave out is simply absent. Errors are thrown rather than
returned, all descending from DerivFabricError.
Other languages
Clients for Java (com.derivfabric:derivfabric-sdk), .NET
(DerivFabric.Sdk) and Rust (derivfabric-client) offer the same namespaces
over the same routes, differing only in idiom. Python and TypeScript are the
two Maintained SDKs — published, released on a cadence, and the ones to
build on today; the others are Provisional: complete and tested, but not
yet proven against production traffic. A Go client exists but its distribution
is not yet public; ask your DerivFabric contact if you need it.
See SDK Installation for the full per-language surface, and SDK Conventions for the behaviour they share.
5. Where to go next
Learn the API
- REST API Overview — the routes, and how they are organised.
- Vanilla Pricing — pricing, Greeks and implied volatility in depth.
- Greeks — sensitivities, and the conventions they follow.
- Contract DSL — express a spread, an autocall or a bespoke payoff.
Go further
- Calibration — SABR, Heston and yield-curve bootstrapping.
- Exotic Options — barriers, Asians, lookbacks and structured products.
- Portfolio & Risk — book pricing, VaR, stress and hedge optimisation.
- XVA — CVA, DVA, FVA and related adjustments.
Operate it
- Authentication — keys, scopes, tiers and rate limits.
- OpenAPI Specification — the machine-readable contract, and how to generate a client from it.
- Webhooks — receive results instead of polling for them.
Check the evidence
- Capability Matrix — every instrument family, the pricer that serves it, its validation status, the oracles it was measured against, and its stated limitations. Read this before booking against any capability.
- Glossary — the terms this documentation uses, defined once.