Embed visual investment shapes, real-time payoff calculations, and broker execution into any application with our RESTful API and SDKs.
Sub-100ms response times for payoff calculations
Built-in compliance checks and audit trails
LSE, NYSE, NASDAQ, and more exchanges
Real-time events for orders and lifecycle
Install:
npm install @novum/doris-sdkUsage:
import { DorisClient } from '@novum/doris-sdk';
const doris = new DorisClient({
apiKey: 'your-api-key',
environment: 'sandbox', // or 'production'
});
// List available shapes
const shapes = await doris.shapes.list({ category: 'balanced' });
console.log(shapes);
// Calculate a collar payoff
const payoff = await doris.calculate({
strategyType: 'collar',
underlying: 'AZN.L',
amount: 10000,
maxLoss: 10,
targetReturn: 15,
timeHorizon: 90,
});
// Render the payoff chart in your app
const chartData = payoff.payoffCurve.map(p => ({
x: p.pricePercent,
y: p.returnPercent,
}));All API requests require authentication via an API key passed in the Authorization header. Partner-level endpoints additionally require a user token for actions on behalf of end users.
Authorization: Bearer nvk_live_abc123...Authorization: Bearer nvk_live_abc123...
X-User-Token: usr_token_xyz...| Tier | Requests/min | Calculations/min | Webhooks |
|---|---|---|---|
| Basic | 60 | 30 | 5 |
| Professional | 600 | 300 | 25 |
| Enterprise | Unlimited | Unlimited | Unlimited |
/api/v1/shapes API KeyParameters
| Name | Type | Required | Description |
|---|---|---|---|
category | string | Optional | Filter by risk category: conservative, balanced, growth, aggressive |
limit | number | Optional | Max results (default: 20) |
Response
{
"shapes": [
{
"id": "collar",
"name": "Safety Net (Collar)",
"category": "conservative",
"description": "Limits both downside and upside...",
"defaultMaxLoss": 10,
"defaultTargetReturn": 15,
"payoffPoints": [...]
}
],
"total": 8
}/api/v1/calculate API KeyParameters
| Name | Type | Required | Description |
|---|---|---|---|
strategyType | string | Required | Shape type: collar, protective_put, bull_call_spread, etc. |
underlying | string | Required | Ticker symbol (e.g., AAPL, AZN.L) |
amount | number | Required | Investment amount in GBP |
maxLoss | number | Required | Maximum loss percentage (e.g., 10) |
targetReturn | number | Required | Target return percentage (e.g., 15) |
timeHorizon | number | Required | Time horizon in days |
Response
{
"payoffCurve": [
{ "pricePercent": -30, "returnPercent": -10 },
{ "pricePercent": -10, "returnPercent": -10 },
{ "pricePercent": 0, "returnPercent": -2.5 },
{ "pricePercent": 15, "returnPercent": 15 },
{ "pricePercent": 30, "returnPercent": 15 }
],
"legs": [...],
"greeks": { "delta": 0.45, "gamma": 0.02, "theta": -0.15, "vega": 0.32 },
"totalPremium": 342.50,
"netCost": 8342.50
}/api/v1/simulate API KeyParameters
| Name | Type | Required | Description |
|---|---|---|---|
strategyType | string | Required | Shape type |
scenario | string | Required | Scenario: covid_crash, gfc_2008, dot_com, custom |
amount | number | Required | Investment amount in GBP |
maxLoss | number | Optional | Max loss % |
targetReturn | number | Optional | Target return % |
Response
{
"scenario": "covid_crash",
"marketChange": -33.9,
"shapeReturn": -10.0,
"unprotectedReturn": -33.9,
"protectionBenefit": 23.9,
"timeline": [...]
}/api/v1/market/quote/:symbol API KeyParameters
| Name | Type | Required | Description |
|---|---|---|---|
symbol | string | Required | Ticker symbol (path parameter) |
Response
{
"symbol": "AZN.L",
"name": "AstraZeneca PLC",
"price": 10542.00,
"change": 156.00,
"changePercent": 1.50,
"currency": "GBp",
"exchange": "LSE",
"timestamp": "2026-03-09T14:30:00Z"
}/api/v1/orders API Key + User TokenParameters
| Name | Type | Required | Description |
|---|---|---|---|
strategyType | string | Required | Shape type |
underlying | string | Required | Ticker symbol |
amount | number | Required | Investment amount in GBP |
maxLoss | number | Required | Max loss % |
targetReturn | number | Required | Target return % |
timeHorizon | number | Required | Days |
brokerId | string | Required | Connected broker identifier |
Response
{
"orderId": "ORD-2026-ABC123",
"status": "pending_review",
"confirmationNumber": null,
"estimatedFees": 45.00,
"estimatedPremium": 342.50,
"complianceStatus": "pending",
"message": "Order submitted for compliance review"
}/api/v1/webhooks API KeyParameters
| Name | Type | Required | Description |
|---|---|---|---|
url | string | Required | Your webhook endpoint URL |
events | string[] | Required | Event types: order.filled, order.rejected, position.matured, position.alert |
secret | string | Optional | Webhook signing secret for verification |
Response
{
"webhookId": "wh_abc123",
"url": "https://your-app.com/webhooks/doris",
"events": ["order.filled", "position.matured"],
"status": "active",
"createdAt": "2026-03-09T14:30:00Z"
}Embed interactive Doris shape visualisations directly into your website or application. Customise the appearance and copy the code.
Powered by Doris / Novum
<iframe
src="https://embed.novum.io/shape/collar?theme=dark"
width="600"
height="400"
frameborder="0"
allow="clipboard-write"
style="border-radius: 12px; border: 1px solid #1e293b;"
></iframe>
<!-- Or use the JavaScript SDK -->
<div id="doris-shape"></div>
<script src="https://cdn.novum.io/embed.js"></script>
<script>
Doris.render('#doris-shape', {
shape: 'collar',
theme: 'dark',
interactive: true,
width: 600,
height: 400,
});
</script>Register for a partner account
Generate your API key from the Partner Portal
Install the SDK or use the REST API directly
Test in sandbox environment
Complete compliance review
Go live with production credentials
Receive real-time notifications when events occur in your users' investment lifecycle.
order.submittedOrder has been submitted for review
order.compliance_approvedOrder passed compliance checks
order.filledOrder has been executed by the broker
order.rejectedOrder was rejected (compliance or broker)
position.maturedInvestment has reached maturity date
position.safety_netSafety net (max loss) has been activated
position.target_reachedTarget return has been achieved
position.approaching_maturityInvestment is within 7 days of maturity
Webhook Payload Example
{
"id": "evt_abc123",
"type": "order.filled",
"timestamp": "2026-03-09T14:30:00Z",
"data": {
"orderId": "ORD-2026-ABC123",
"userId": "usr_xyz",
"underlying": "AZN.L",
"strategyType": "collar",
"amount": 10000,
"confirmationNumber": "CONF-789",
"executionPrice": 10542.00,
"fees": 45.00
},
"signature": "sha256=abc123..."
}Get started with a free sandbox account. Our team is available to help with integration, compliance, and going live.