Pricing Curve Routes
The pricing curve registry route group is exposed under:
/api/v1/pricing/curves/
These routes list CurveTable registry rows through msm_pricing.api.Curve.
They do not return timestamped DiscountCurvesStorage observations or
compressed curve payloads.
List Curves
GET /api/v1/pricing/curves/?limit=25&offset=0&search=SOFR&curve_type=discount&source=example
Query parameters:
limit: maximum rows to return, default25, max500offset: zero-based row offset, default0search: optional contains search onunique_identifiercurve_type: optional exact curve type filtersource: optional exact source filter
Response:
{
"count": 1,
"next": null,
"previous": null,
"results": [
{
"uid": "curve-uid",
"unique_identifier": "USD-SOFR-3M-DISCOUNT",
"display_name": "USD SOFR 3M Discount Curve",
"curve_type": "discount",
"interpolation_method": "log_linear_discount",
"compounding": "compounded_annual",
"source": "example",
"metadata_json": {}
}
]
}
The response uses the shared v1 limit-offset envelope:
{
"count": 0,
"next": null,
"previous": null,
"results": []
}
Curve Summary
GET /api/v1/pricing/curves/{uid}/summary/
Gets the reusable detail summary card payload for one pricing curve registry
row by uid.
Response model: FrontEndDetailSummary
Response:
{
"entity": {
"id": "curve-uid",
"type": "pricing_curve",
"title": "USD SOFR 3M Discount Curve"
},
"badges": [
{
"key": "curve_type",
"label": "discount",
"tone": "info"
}
],
"inline_fields": [
{
"key": "uid",
"label": "UID",
"value": "curve-uid",
"kind": "code",
"icon": null
},
{
"key": "unique_identifier",
"label": "Identifier",
"value": "USD-SOFR-3M-DISCOUNT",
"kind": "code",
"icon": null
},
{
"key": "curve_selection_count",
"label": "Curve Selections",
"value": 2,
"kind": "number",
"icon": null,
"link_url": "/api/v1/pricing/curves/curve-uid/curve-selections/"
}
],
"highlight_fields": [
{
"key": "display_name",
"label": "Display Name",
"value": "USD SOFR 3M Discount Curve",
"kind": "text",
"icon": "database"
},
{
"key": "curve_type",
"label": "Curve Type",
"value": "discount",
"kind": "code",
"icon": "line-chart"
}
],
"stats": [],
"label_management": null,
"summary_warning": null,
"extensions": {
"curve": {
"uid": "curve-uid",
"unique_identifier": "USD-SOFR-3M-DISCOUNT",
"display_name": "USD SOFR 3M Discount Curve",
"curve_type": "discount",
"interpolation_method": "log_linear_discount",
"compounding": "compounded_annual",
"source": "example",
"metadata_json": {}
},
"curve_selection_count": 2,
"curve_selections_url": "/api/v1/pricing/curves/curve-uid/curve-selections/",
"metadata_json": {}
}
}
Returns 404 when the curve uid does not exist.
Curve Selections
GET /api/v1/pricing/curves/{uid}/curve-selections/
Returns market-data-set curve-selection bindings that point to this curve.
This is a reverse lookup over PricingMarketDataSetCurveBindingTable; it does
not imply that the curve owns the index or selector.
Response model: CurveSelectionsResponse
Response:
{
"curve": {
"uid": "curve-uid",
"unique_identifier": "USD-SOFR-OFFER-BENCHMARK",
"display_name": "USD SOFR offer benchmark",
"curve_type": "discount"
},
"count": 1,
"results": [
{
"binding_uid": "binding-uid",
"market_data_set": {
"uid": "market-data-set-uid",
"set_key": "eod",
"display_name": "End of day"
},
"role_key": "z_spread_base",
"quote_side": "offer",
"selector": {
"type": "index",
"selector_key": "index-uid",
"index_uid": "index-uid",
"index_identifier": "USD-SOFR",
"display_name": "USD SOFR"
},
"status": "ACTIVE",
"source": "example"
}
]
}
Returns 404 when the curve uid does not exist.
Delete Impact
GET /api/v1/pricing/curves/{uid}/delete-impact/?delete_values=false&delete_curve_selections=false
Previews whether one pricing curve can be deleted and which related rows would block or be affected.
Query parameters:
delete_values: whentrue, preview deletion of timestampedDiscountCurvesStorageobservations whosecurve_identifiermatches the curve.delete_curve_selections: whentrue, preview deletion ofPricingMarketDataSetCurveBindingTablerows that point to the curve.
Response model: DeleteImpactResponse
Response:
{
"resource_type": "pricing_curve",
"uid": "curve-uid",
"identifier": "USD-SOFR-3M-DISCOUNT",
"display_name": "USD SOFR 3M Discount Curve",
"can_delete": false,
"blocking_count": 12,
"affected_count": 14,
"delete_endpoint": "/api/v1/pricing/curves/curve-uid/",
"relationships": [
{
"key": "curve_building_details",
"label": "Curve building details",
"model": "CurveBuildingDetailsTable",
"column": "curve_uid",
"relationship_type": "direct",
"on_delete": "CASCADE",
"count": 1,
"effect": "cascade_delete",
"severity": "destructive",
"blocks_delete": false,
"description": "Curve-owned build details are keyed by this curve and cascade when the curve row is deleted."
},
{
"key": "pricing_curve_selections",
"label": "Pricing curve selections",
"model": "PricingMarketDataSetCurveBindingTable",
"column": "curve_uid",
"relationship_type": "direct",
"on_delete": "RESTRICT",
"count": 2,
"effect": "blocks_delete",
"severity": "blocking",
"blocks_delete": true,
"description": "Market-data-set curve-selection rows point at this curve. They must be removed or explicitly deleted before deleting the curve."
},
{
"key": "discount_curve_observations",
"label": "Discount curve observations",
"model": "DiscountCurvesStorage",
"column": "curve_identifier",
"relationship_type": "direct",
"on_delete": "RESTRICT",
"count": 10,
"effect": "blocks_delete",
"severity": "blocking",
"blocks_delete": true,
"description": "Timestamped discount-curve rows reference this curve by curve_identifier. Cleanup uses TimeIndexMetaTable.delete_after_date with a scoped curve_identifier dimension filter."
}
],
"warnings": [
"Delete is blocked while pricing curve-selection rows point at this curve.",
"Delete is blocked while discount-curve observations reference this curve.",
"Curve building details will be deleted by database cascade."
]
}
Returns 404 when the curve uid does not exist.
Delete Curve
DELETE /api/v1/pricing/curves/{uid}/?delete_values=false&delete_curve_selections=false
Deletes one pricing curve registry row.
Cleanup semantics:
CurveBuildingDetailsTablerows are deleted by the database cascade oncurve_uid.PricingMarketDataSetCurveBindingTablerows are deleted only whendelete_curve_selections=true.DiscountCurvesStorageobservations are deleted only whendelete_values=true.- Discount-curve value cleanup must remain scoped to the curve identifier:
TimeIndexMetaTable.delete_after_date(None, dimension_filters={"curve_identifier": [curve_identifier]}). PricingMarketDataSetBindingTablesource bindings are not deleted by this endpoint.
Response model: CurveDeleteResponse
Response:
{
"detail": "Pricing curve deleted.",
"uid": "curve-uid",
"curve_identifier": "USD-SOFR-3M-DISCOUNT",
"deleted_count": 1,
"deleted_values_count": 10,
"deleted_curve_selections_count": 2,
"deleted_curve_building_details_count": 1,
"delete_values": true,
"delete_curve_selections": true,
"storage_cleanups": [
{
"data_node_uid": "discount-curves-data-node-uid",
"storage_table_identifier": "DiscountCurvesStorage",
"deleted_count": 10,
"table_empty": false
}
]
}
Returns:
404when the curveuiddoes not exist.409when dependent rows still block deletion because the requested cleanup flags do not cover them.
Discount Curve Nodes
GET /api/v1/pricing/curves/{uid}/discount-curve/?market_data_set=eod&valuation_date=2026-06-01T00:00:00Z
Reads discount-curve nodes for one curve through MSDataInterface.
Query parameters:
market_data_set: required pricing market-data set selector. Accepts a set uid or set key.valuation_date: optional ISO datetime. When omitted, the endpoint returns the latest available discount-curve observation for the curve.
Response model: DiscountCurveResponse
nodes is the normalized decompressed pricing curve. key_nodes is
producer-owned construction provenance returned as decompressed JSON; the
storage column is compressed text. Consumers may display standard fields such
as maturity_date, asset_identifier, instrument_type, quote,
quote_type, quote_unit, quote_side, and yield when present, but the API
only requires the base JSON object/list contract because source producers may
enforce stricter schemas through their DataNode validation extension.
Response:
{
"curve_uid": "curve-uid",
"curve_identifier": "USD-SOFR-3M-DISCOUNT",
"curve": {
"uid": "curve-uid",
"unique_identifier": "USD-SOFR-3M-DISCOUNT",
"display_name": "USD SOFR 3M Discount Curve",
"curve_type": "discount",
"interpolation_method": "log_linear_discount",
"compounding": "compounded_annual",
"source": "example",
"metadata_json": {}
},
"market_data_set": {
"uid": "market-data-set-uid",
"set_key": "eod",
"display_name": "End of day"
},
"binding": {
"uid": "binding-uid",
"concept_key": "discount_curves",
"data_node_uid": "discount-curves-data-node-uid",
"storage_table_identifier": "DiscountCurvesStorage"
},
"valuation_date": "2026-06-01T00:00:00Z",
"effective_date": "2026-06-01T00:00:00Z",
"request_mode": "historical",
"nodes": [
{
"days_to_maturity": 28,
"zero": 0.11
},
{
"days_to_maturity": 91,
"zero": 0.105
}
],
"key_nodes": [
{
"maturity_date": "2026-06-29",
"asset_identifier": "USD_SOFR_SWAP_1M",
"instrument_type": "interest_rate_swap",
"quote": 0.11,
"quote_type": "par_rate",
"quote_unit": "decimal",
"quote_side": "mid"
}
],
"metadata_json": {
"source_snapshot": "example-2026-06-01"
}
}
When valuation_date is omitted:
{
"valuation_date": null,
"effective_date": "2026-06-02T00:00:00Z",
"request_mode": "latest",
"nodes": [],
"key_nodes": null,
"metadata_json": null
}
The endpoint returns 404 when the curve, market-data set, discount-curve
binding, or requested observation does not exist.
When the curve registry row and discount_curves binding exist but the bound
DataNode has no rows for that curve, the response reports the missing data
state explicitly:
{
"detail": "No discount-curve data has been published for curve 'VALMER_TIIE_28' in pricing market-data set 'default'. The curve registry row and discount_curves binding exist, but bound DataNode <data-node-uid> has no latest ms_markets__discountcurvests observation for this curve_identifier."
}