Skip to content

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.