Skip to main content

dataQollab TBA Pricing Discovery

Summary

Investigation of the PowerSeller MBS Access project (X:\dev\odoo\PowerSeller) revealed that dataQollab already provides the TBA pricing data that PSX Xigo needs — and PowerSeller already has the API license to consume it. The "hardest data acquisition problem" for Xigo is already solved.

What dataQollab Provides

Daily/Intraday MBS Pricing Files

Delivered via SFTP → Odoo ingest pipeline (pss_mbs_ingest module):

  • 403 rows = 13 instrument lines × 31 coupon steps
  • Dimensions: security_class, guarantor (FNMA/FHLMC/GNMA), instrument_term, coupon_rate
  • Price columns: mbs_month_1 through mbs_month_4 (forward delivery months)
  • Schedule: pre-open, intraday, post-close daily files
  • Source row type: Source = 'mid' (mid-market prices)

On-Demand Snapshot API

Endpoint: https://api.mbsmkt.com/p/prices/snapshot

FieldDescription
as_atTimestamp of price snapshot
mbsMBS instrument identifier
settlement_monthDelivery/settlement month
month_settlementMonth settlement indicator
notification_dateNotification date
settlement_dateSettlement date
bid_priceBid price
ask_priceAsk price
mid_priceMid-market price
delta_vs_3pmChange from 3:00 PM mark
delta_vs_445pmChange from 4:45 PM mark
price_mark_at_3pmPrice at 3:00 PM
price_mark_at_445pmPrice at 4:45 PM

Authentication: X-API-Key header with per-subscriber key.

Source: X:\dev\odoo\PowerSeller\custom_modules\pss_mbs_files\controllers\snapshot_controller.py

This IS TBA Pricing

The data structure — agency × coupon × delivery month × bid/ask/mid — is the standard TBA (To-Be-Announced) price grid used across the mortgage industry. The codebase doesn't use the term "TBA" but the data is functionally identical:

TBA ConceptdataQollab Field
Agencyguarantor (FNMA/FHLMC/GNMA)
Couponcoupon_rate (0–15% in 0.5% steps)
Delivery monthsettlement_month / mbs_month_1..4
Pricemid_price (or bid_price/ask_price)
Product terminstrument_term (60–360 months)
Intraday movementdelta_vs_3pm, delta_vs_445pm

Licensing

PowerSeller is licensed to use the snapshot API regardless of whether WTPO has a direct subscription. No new vendor relationship, no new subscription cost, no licensing obstacle. PowerSeller can call the API on behalf of PSX.

Path to Xigo Integration

What PSX needs to build:

  1. TBA Price Client — calls api.mbsmkt.com/p/prices/snapshot, parses the JSON response, writes to market_pricing table. Minimal code — the snapshot controller in MBS Access (snapshot_controller.py) already demonstrates the API call pattern.

  2. Price mapping — map dataQollab's response fields to PSX's market_pricing schema (agency, coupon, delivery month, bid/ask/mid).

  3. Refresh schedule — call the snapshot API 1-2x daily for rate sheet generation, or on-demand when the principal requests fresh prices.

What already exists:

  • API endpointapi.mbsmkt.com/p/prices/snapshot is production, documented, and working
  • Authentication — API key infrastructure exists (DQ provisions keys via webhook to MBS Access)
  • Data format — JSON response with data.records array, field mapping is known
  • Transform logicpss_mbs_ingest transform engine already parses the same data for the Odoo delivery pipeline

Impact on Xigo Requirements

This discovery changes the Xigo external data priority table:

DataPrevious StatusUpdated Status
TBA PricesHard (real-time market data subscription, $500-2,000/mo)Solved (dataQollab API, already licensed)
Agency LLPAsEasy (public Excel files)Unchanged
G-Fee / BUBDMedium (public grid + private negotiated fee)Unchanged
MSR / ServicingMedium (broker feeds or model)Unchanged
Treasury / SOFREasy (free/cheap sources)Unchanged
Conforming LimitsEasy (annual, already in PSX)Unchanged
Eligibility RulesHard (complex, interpretive)Unchanged

The most expensive and difficult data acquisition (TBA prices) turns out to be free and already available through an existing PowerSeller relationship.

Key Files in MBS Access Repo

PurposePath
Snapshot API client (reference implementation)X:\dev\odoo\PowerSeller\custom_modules\pss_mbs_files\controllers\snapshot_controller.py
DQ API key webhook receiverX:\dev\odoo\PowerSeller\custom_modules\pss_mbs_access\controllers\dq_webhook_controller.py
File ingest API (inbound from DQ)X:\dev\odoo\PowerSeller\custom_modules\pss_mbs_ingest\controllers\ingest_api_controller.py
Transform engine (raw CSV → MBS Values)X:\dev\odoo\PowerSeller\custom_modules\pss_mbs_ingest\services\transform_engine.py
Ingest specificationX:\dev\odoo\PowerSeller\docs\architecture\specifications\pss-mbs-ingest\specification.md
Module architecture mapX:\dev\odoo\PowerSeller\docs\architecture\PSS_MODULE_ARCHITECTURE.md

Next Steps

  1. PSX SA reviews the snapshot API response format and maps to PSX's pricing schema
  2. Determine API key provisioning — does PSX use PowerSeller's master key, or does it get its own key from DQ?
  3. Build the TBA Price Client in PSX — reference snapshot_controller.py for the API call pattern
  4. Test with live data — call the snapshot API and verify the prices match what MBS Access subscribers see
  5. Wire into rate sheet generator — use mid_price as the TBA base price for Xigo calculations