Portal Guide
The Quantra Portal is a web application for managing market data, building yield curves, and pricing instruments — all from your browser.
Quick start (price in 2 minutes)
- Open the Portal at app.quantra.io and sign in.
- Go to Settings → click Load Example (No Market Data).
- Then click Load Market Data to load quotes and the quote book.
- Go to Products → open any instrument (Fixed Rate Bond, Floating Rate Bond, IR Swap, Swaption) → click Price.
Overview
The Portal is available at app.quantra.io. Sign in with your Google account to access the Dashboard. From there, you can manage your API keys, set up market data, build curves, and price instruments.
Under the hood, the Portal sends exactly the same JSON requests as the API. Every action you perform in the Portal can be replicated via a direct API call — the Portal just provides a visual interface on top.
| Section | Description |
|---|---|
| Dashboard | API key management, quick start guide, and a pricing playground for raw JSON requests |
| Market Data → Quotes | Enter and manage market quotes (rates, spreads, prices). Quotes are tagged as Curve or Volatility. |
| Market Data → Quote Book | Time-series quotes with as-of resolution and import/export. Use it for both curve and volatility quotes. |
| Market Data → Indices | Define IBOR and overnight indices (Euribor, SOFR, ESTR, etc.) with their conventions |
| Curve Sets | Combine indices, quotes, and bootstrap settings into reusable curve configurations |
| Vol Surfaces | Build swaption volatility surfaces from a manual grid or from the Quote Book |
| Products | Price fixed rate bonds, floating rate bonds, and IR swaps |
| Settings | Data overview, export/import, load examples, and clear-all |
Dashboard
API Keys
The API Keys panel lets you create, toggle, copy, and delete API keys. Keys are used to authenticate programmatic API requests (via the X-API-Key header). The free tier allows up to 3 keys.
When you create a key, the full key is shown once. Copy it immediately — for security, the Portal only stores a masked version after that.
Pricing Playground
The Pricing Playground on the Dashboard lets you send raw JSON requests to any endpoint. This is useful for testing and debugging — you can select a product type, edit the JSON, and see the response alongside timing information.
Market Data
The Market Data section is where you define the building blocks that curves and instruments need.
Quotes
Quotes represent market observables: deposit rates, swap rates, FRA rates, futures prices, FX spots, and spreads. Each quote has an id, a kind (Rate, Spread, Price, etc.), and a value.
Every quote is tagged with a Quote Type: Curve (used by curve helpers and pricing quotes) or Volatility (used by volatility surfaces).
Quotes can be referenced by curve helpers via quote_id, which means you can update market data in one place and have all curves that depend on it automatically use the new values.
Indices
Indices represent floating rate references like Euribor 6M, SOFR, or ESTR. An index definition includes the tenor, fixing days, calendar, day counter, and business day convention — everything QuantLib needs to construct the index object.
Indices are stored in your browser (local storage). Use Import/Export in Settings to back them up or move them between machines.
Quantra supports two index types:
- Ibor: Term-rate indices like Euribor, LIBOR, TIBOR (with a tenor > 0)
- Overnight: Overnight rate indices like SOFR, ESTR, SONIA (tenor = 0)
Index Fixings (Past Rates)
Each index can store a time-series of past fixings. These are used for seasoned instruments (e.g., floating rate bonds) and are included in the API payload under pricing.indices[*].fixings.
Quote Book
The Quote Book stores time-series values per quote (date → value). It resolves a value for the current as-of date using either Previous (last value ≤ date) or Exact mode.
Use the calendar heatmap to see completeness, edit values by date directly in the table, and export/import the quote book JSON when needed. Volatility quotes live here too — just set Quote Type to Volatility.
Volatility Surfaces
Vol Surfaces are configured separately (top-level menu). Each surface stores an expiry × tenor grid plus metadata (calendar, day count, volatility type).
There are two ways to fill the grid:
- Manual grid: type values directly into the grid.
- Quote Book grid: link each cell to a Quote Book entry (Quote Type = Volatility) and resolve by as-of date.
Vol Surfaces screen: field-by-field
- Surface ID: unique identifier for the surface.
- Volatility Type: Normal / Lognormal / Shifted Lognormal.
- Fallback Constant Vol: used when the grid is empty or a cell cannot be resolved.
- Quote Source: choose Manual grid or Quote Book (Volatility).
- Open Quote Book: jumps to Quote Book filtered to Volatility quotes.
- Quote ID Template: pattern used to generate one quote id per grid cell.
- Generate Quote IDs: creates the id matrix using the template.
- Resolve Grid @ As‑Of: pulls values from Quote Book using the global as‑of date and the selected resolution mode (Previous/Exact).
- Calendar / Day Counter / Convention: QuantLib conventions stored with the surface.
- Expiries / Tenors: define the grid dimensions (rows × columns). Inputs are Periods (number + unit like 6M, 2Y).
- Quote ID Grid: editable per cell, used to map each point to a Quote Book entry.
- Heatmap / Surface plot: visualizations of the current grid values (manual or resolved).
To link the Quote Book, set Quote Source = Quote Book and provide a Quote ID template. The template is a pattern that expands into quote ids for every grid cell. Example:
Template: SWAPTION_{exp}Y_{ten}Y
Expiries: 1, 2, 3, 5
Tenors: 1, 2, 5, 10
Generated IDs:
SWAPTION_1Y_1Y, SWAPTION_1Y_2Y, SWAPTION_1Y_5Y, SWAPTION_1Y_10Y
SWAPTION_2Y_1Y, SWAPTION_2Y_2Y, SWAPTION_2Y_5Y, SWAPTION_2Y_10Y
...
When you click Resolve Grid @ As‑Of, the Portal looks up those ids in the Quote Book and fills the grid with the matching volatility values. The plots always reflect the current grid values.
The heatmap and 3D plot always show the current grid values. If you are using Quote Book, those values come from the last Resolve Grid @ As‑Of action and depend on the global as‑of date in the header.
Curve Sets
A Curve Set is a reusable configuration that combines everything needed to build one or more yield curves: which indices to use, which curve helpers (deposits, swaps, OIS, etc.), and the bootstrap settings (interpolation, day counter, trait).
When you price an instrument in the Portal, you select a Curve Set. The Portal resolves all the references, builds the pricing.curves block, and sends it to the API.
Curve Sets are the core abstraction in the Portal. Once you've set up your market data and built a Curve Set, pricing any instrument is just a matter of filling in the instrument details and clicking Price.
Products
The Products section provides form-based interfaces for pricing instruments. Currently supported in the Portal:
Fixed Rate Bond
Enter the bond details (face amount, coupon rate, schedule, day count conventions) and select a Curve Set for discounting. The Portal builds the full API request and returns NPV, clean/dirty price, yield, duration, convexity, and optionally cash flows.
Bonds can be saved for later — give them a name and they'll appear in the Fixed Rate Bond list for quick re-pricing with updated market data.
Floating Rate Bond
Similar to fixed rate bonds, but with an index reference, spread, and fixing days. The Portal automatically includes the required index definition in the API request.
IR Swap
Create and price vanilla interest rate swaps. The list page supports import/export/new, and the editor builds an API-compliant request including curves, indices, and optional cash flows.
Swaption
Price swaptions with a selected volatility surface and an IR pricing model. The editor includes the underlying swap terms, exercise date/type, and model selection.
For a detailed comparison of Bloomberg SWPM-OV vs. QuantLib and how Quantra makes assumptions explicit, see Bloomberg Swaption Comparison.
Settings
Settings provides data overview counts, export/import backup tools, example loaders (no market data vs. market data), and a clear-all option.
As-Of Date
The Portal has a global as-of date selector in the header. This sets the valuation date for all pricing operations. When you change the as-of date, all instruments will be re-priced relative to that date.
This maps directly to the pricing.as_of_date field in the API — it sets QuantLib's Settings::evaluationDate().
Portal vs. API: what's the same?
The Portal is a frontend for the same API. Here's what that means in practice:
- Every Portal pricing operation sends a standard JSON request to
api.quantra.io - The Portal authenticates with Firebase tokens; the API accepts API keys. Same backend, different auth.
- Any request you build in the Portal can be exported as JSON and sent via curl or your own code
- The Pricing Playground on the Dashboard lets you see and edit the raw JSON for any request
Example: Portal pricing request
When you price a fixed rate bond in the Portal, it sends something like this:
{
"pricing": {
"as_of_date": "2025-06-15",
"settlement_date": "2025-06-17",
"indices": [
{
"id": "EUR_6M",
"name": "Euribor",
"index_type": "Ibor",
"tenor_number": 6,
"tenor_time_unit": "Months",
"fixing_days": 2,
"calendar": "TARGET",
"business_day_convention": "ModifiedFollowing",
"day_counter": "Actual360",
"end_of_month": false,
"currency": "EUR"
}
],
"curves": [{
"id": "EUR_DISC",
"day_counter": "Actual365Fixed",
"interpolator": "LogLinear",
"bootstrap_trait": "Discount",
"reference_date": "2025-06-15",
"points": [
/* ... deposit, swap, OIS helpers from the Curve Set ... */
]
}]
},
"bonds": [{
"fixed_rate_bond": {
"settlement_days": 2,
"face_amount": 100,
"rate": 0.05,
"accrual_day_counter": "ActualActualBond",
"payment_convention": "ModifiedFollowing",
"redemption": 100.0,
"issue_date": "2025-01-15",
"schedule": {
"calendar": "TARGET",
"effective_date": "2025-01-15",
"termination_date": "2030-01-15",
"frequency": "Semiannual",
"convention": "ModifiedFollowing",
"termination_date_convention": "ModifiedFollowing",
"date_generation_rule": "Backward"
}
},
"discounting_curve": "EUR_DISC"
}]
}
This is identical to what you'd send via curl or Python — the Portal just helps you build it visually.