Fixed Income Pricer Routes
The fixed income pricer route group is exposed under:
/api/v1/pricing/assets/
These endpoints execute registered bond pricing operations for assets that have
current pricing details attached through msm_pricing.api.AssetCurrentPricingDetails.
The route layer does not implement pricing formulas. Each operation delegates to the rebuilt instrument method:
instrument = Instrument.load_from_asset(asset)
instrument.set_valuation_date(valuation_date)
instrument.price(...)
Discovery
GET /api/v1/asset/{uid}/get_pricing_details/
Returns the current pricing details row and an additive pricing_support
section.
Response:
{
"asset_uid": "asset-uid",
"instrument_type": "FixedRateBond",
"instrument_dump": {},
"pricing_details_date": "2026-06-09T00:00:00Z",
"serialization_format": "msm_pricing.instrument.v1",
"pricing_package_version": "4.3.14",
"source": "example",
"metadata_json": {},
"pricing_support": {
"supported": true,
"instrument_type": "FixedRateBond",
"operations": [
{
"key": "price",
"label": "Price",
"method": "POST",
"url": "/api/v1/pricing/assets/asset-uid/price/",
"requires_valuation_date": true,
"supports_market_data_set": true,
"requires_market_data_set": true,
"request_model": "AssetPricingOperationRequest",
"response_model": "BondPriceResponse",
"response_contract": "provider-native-json",
"app_component": {
"output_root": "response:$",
"flat_outputs": ["price", "units"]
},
"parameters": [
{
"key": "flat_compounding",
"required": false
},
{
"key": "flat_frequency",
"required": false
},
{
"key": "with_yield",
"required": false
}
],
"response_mappings": []
}
]
}
}
Unsupported instrument response:
{
"pricing_support": {
"supported": false,
"instrument_type": "UnsupportedInstrument",
"operations": [],
"reason": "Instrument type is not registered for the fixed income pricer API."
}
}
Common Request
All operation endpoints use the same request envelope:
{
"valuation_date": "2026-06-09T00:00:00Z",
"market_data_set": "eod",
"parameters": {}
}
valuation_date is required. market_data_set accepts the pricing market-data
set selector passed to the instrument operation. Current registered fixed income
operations require market_data_set; missing or blank values return 422 before
the instrument is loaded. Unknown top-level request fields are rejected. Unknown
operation parameters are rejected by the core operation registry before dispatch.
Command Center Rendering Contracts
The pricing operation endpoints return provider-native business JSON. Their OpenAPI schemas include AppComponent binding metadata such as:
{
"x-command-center-consumer": "app-component",
"x-ui-output-root": "response:$",
"x-ui-response-mode": "provider-native-json",
"x-ui-flat-outputs": ["price", "units"]
}
These operation responses are not editable-form or notification payloads.
Those x-ui-role values are reserved for SDK models that render as
response-side editable forms or banner notifications.
For table-shaped cashflow outputs, the API also exposes direct Command Center
frame endpoints using the SDK core.tabular_frame@v1 contract:
POST /api/v1/pricing/assets/{asset_uid}/cashflows/frame/
POST /api/v1/pricing/assets/{asset_uid}/net-cashflows/frame/
The original cashflow endpoints still return provider-native pricing JSON and
carry x-response-mappings metadata for frontend/editor context. The frame
endpoints are the routes to bind directly into generic table, chart, curve,
transform, or agent-facing Command Center consumers.
Price
POST /api/v1/pricing/assets/{asset_uid}/price/
Delegates to:
instrument.price(market_data_set=market_data_set, **parameters)
Response:
{
"asset_uid": "asset-uid",
"instrument_type": "FixedRateBond",
"operation": "price",
"valuation_date": "2026-06-09T00:00:00Z",
"market_data_set": "eod",
"price": 101.25,
"units": "npv"
}
Analytics
POST /api/v1/pricing/assets/{asset_uid}/analytics/
Delegates to:
instrument.analytics(market_data_set=market_data_set, **parameters)
Response:
{
"asset_uid": "asset-uid",
"instrument_type": "FixedRateBond",
"operation": "analytics",
"valuation_date": "2026-06-09T00:00:00Z",
"market_data_set": "eod",
"analytics": {
"clean_price": 100.75,
"dirty_price": 101.25,
"accrued_amount": 0.5
}
}
Duration
POST /api/v1/pricing/assets/{asset_uid}/duration/
Delegates to:
instrument.duration(market_data_set=market_data_set, **parameters)
Response:
{
"asset_uid": "asset-uid",
"instrument_type": "FixedRateBond",
"operation": "duration",
"valuation_date": "2026-06-09T00:00:00Z",
"market_data_set": "eod",
"duration_type": "Modified",
"duration": 4.82
}
Yield
POST /api/v1/pricing/assets/{asset_uid}/yield/
Delegates to:
instrument.get_yield(**parameters)
If market_data_set is provided, the implementation first runs
instrument.analytics(market_data_set=market_data_set) so the instrument is
priced against the selected market-data set before yield is read.
Response:
{
"asset_uid": "asset-uid",
"instrument_type": "FixedRateBond",
"operation": "yield",
"valuation_date": "2026-06-09T00:00:00Z",
"market_data_set": "eod",
"yield": 0.0525
}
Z-Spread
POST /api/v1/pricing/assets/{asset_uid}/z-spread/
Delegates to:
instrument.z_spread(market_data_set=market_data_set, **parameters)
Required parameter:
{
"target_dirty_ccy": 101.25
}
Response:
{
"asset_uid": "asset-uid",
"instrument_type": "FixedRateBond",
"operation": "z-spread",
"valuation_date": "2026-06-09T00:00:00Z",
"market_data_set": "eod",
"target_dirty_ccy": 101.25,
"z_spread": 0.0042,
"units": "decimal"
}
Cashflows
POST /api/v1/pricing/assets/{asset_uid}/cashflows/
Delegates to:
instrument.get_cashflows(market_data_set=market_data_set)
Response:
{
"asset_uid": "asset-uid",
"instrument_type": "FixedRateBond",
"operation": "cashflows",
"valuation_date": "2026-06-09T00:00:00Z",
"market_data_set": "eod",
"legs": {
"fixed": [
{
"payment_date": "2026-12-09",
"rate": 0.05,
"amount": 2.5
}
],
"redemption": [
{
"payment_date": "2030-06-09",
"amount": 100.0
}
]
}
}
Canonical frame endpoint:
POST /api/v1/pricing/assets/{asset_uid}/cashflows/frame/
Frame response:
{
"status": "ready",
"error": null,
"columns": ["leg", "payment_date", "amount", "rate"],
"rows": [
{
"leg": "fixed",
"payment_date": "2026-12-09",
"amount": 2.5,
"rate": 0.05
}
],
"fields": [
{
"key": "leg",
"label": "Leg",
"description": null,
"type": "string",
"nullable": null,
"nativeType": null,
"provenance": "manual",
"reason": null,
"derivedFrom": null,
"warnings": null
}
],
"meta": null,
"source": {
"kind": "api",
"id": null,
"label": "Fixed income cashflows",
"updatedAtMs": null,
"context": {
"asset_uid": "asset-uid",
"instrument_type": "FixedRateBond",
"operation": "cashflows",
"valuation_date": "2026-06-09T00:00:00Z",
"market_data_set": "eod"
}
}
}
Net Cashflows
POST /api/v1/pricing/assets/{asset_uid}/net-cashflows/
Delegates to:
instrument.get_net_cashflows()
The API serializes the returned series-like object into rows.
Response:
{
"asset_uid": "asset-uid",
"instrument_type": "FixedRateBond",
"operation": "net-cashflows",
"valuation_date": "2026-06-09T00:00:00Z",
"market_data_set": "eod",
"cashflows": [
{
"payment_date": "2026-12-09",
"net_cashflow": 2.5
}
]
}
Canonical frame endpoint:
POST /api/v1/pricing/assets/{asset_uid}/net-cashflows/frame/
Frame response:
{
"status": "ready",
"error": null,
"columns": ["payment_date", "net_cashflow"],
"rows": [
{
"payment_date": "2026-12-09",
"net_cashflow": 2.5
}
],
"fields": [
{
"key": "payment_date",
"label": "Payment Date",
"description": null,
"type": "date",
"nullable": null,
"nativeType": null,
"provenance": "manual",
"reason": null,
"derivedFrom": null,
"warnings": null
}
],
"meta": null,
"source": {
"kind": "api",
"id": null,
"label": "Fixed income net cashflows",
"updatedAtMs": null,
"context": {
"asset_uid": "asset-uid",
"instrument_type": "FixedRateBond",
"operation": "net-cashflows",
"valuation_date": "2026-06-09T00:00:00Z",
"market_data_set": "eod"
}
}
}
Carry/Roll-Down
POST /api/v1/pricing/assets/{asset_uid}/carry-roll-down/
Delegates to:
instrument.price(market_data_set=market_data_set)
instrument.carry_roll_down(horizon_days, clean=clean)
Required parameter:
{
"horizon_days": 30
}
Response:
{
"asset_uid": "asset-uid",
"instrument_type": "FixedRateBond",
"operation": "carry-roll-down",
"valuation_date": "2026-06-09T00:00:00Z",
"market_data_set": "eod",
"horizon_days": 30,
"metrics": {
"cr_dirty": 0.35,
"roll_down_dirty": 0.2
}
}
Curve Preview
POST /api/v1/pricing/assets/{asset_uid}/curve-preview/
This endpoint is intentionally method-backed. It prices the instrument and returns pricing-engine diagnostics without reading curve storage directly from the FastAPI layer. When the instrument exposes an index-backed selected curve, the response includes a link to the existing pricing curve endpoint that returns decompressed nodes and the effective curve date.
Response:
{
"asset_uid": "asset-uid",
"instrument_type": "FixedRateBond",
"operation": "curve-preview",
"valuation_date": "2026-06-09T00:00:00Z",
"market_data_set": "eod",
"curves": [
{
"role": "discount",
"curve_uid": "curve-uid",
"curve_identifier": "USD-SOFR-DISCOUNT",
"curve_type": "discount",
"index_uid": "index-uid",
"source": "example",
"discount_curve_url": "/api/v1/pricing/curves/curve-uid/discount-curve/",
"discount_curve_query_params": {
"market_data_set": "eod",
"valuation_date": "2026-06-09T00:00:00Z"
}
}
],
"diagnostics": {
"pricing_engine_id": "engine-id"
}
}
To fetch the actual decompressed curve nodes, call:
GET /api/v1/pricing/curves/{curve_uid}/discount-curve/?market_data_set=eod&valuation_date=2026-06-09T00:00:00Z
Fixings Availability
POST /api/v1/pricing/assets/{asset_uid}/fixings-availability/
This endpoint is intentionally method-backed. It prices the instrument against the requested market-data set. Missing curve or fixing dependencies surface as typed API errors.
Response:
{
"asset_uid": "asset-uid",
"instrument_type": "FloatingRateBond",
"operation": "fixings-availability",
"valuation_date": "2026-06-09T00:00:00Z",
"market_data_set": "eod",
"status": "available",
"fixings": []
}
Errors
404: asset or pricing details were not found.400: the operation is not supported for the instrument type.422: the request shape or operation parameters are invalid.409: the instrument exists but required market-data dependencies are missing or inconsistent.