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_1throughmbs_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
| Field | Description |
|---|---|
as_at | Timestamp of price snapshot |
mbs | MBS instrument identifier |
settlement_month | Delivery/settlement month |
month_settlement | Month settlement indicator |
notification_date | Notification date |
settlement_date | Settlement date |
bid_price | Bid price |
ask_price | Ask price |
mid_price | Mid-market price |
delta_vs_3pm | Change from 3:00 PM mark |
delta_vs_445pm | Change from 4:45 PM mark |
price_mark_at_3pm | Price at 3:00 PM |
price_mark_at_445pm | Price 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 Concept | dataQollab Field |
|---|---|
| Agency | guarantor (FNMA/FHLMC/GNMA) |
| Coupon | coupon_rate (0–15% in 0.5% steps) |
| Delivery month | settlement_month / mbs_month_1..4 |
| Price | mid_price (or bid_price/ask_price) |
| Product term | instrument_term (60–360 months) |
| Intraday movement | delta_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:
-
TBA Price Client — calls
api.mbsmkt.com/p/prices/snapshot, parses the JSON response, writes tomarket_pricingtable. Minimal code — the snapshot controller in MBS Access (snapshot_controller.py) already demonstrates the API call pattern. -
Price mapping — map dataQollab's response fields to PSX's
market_pricingschema (agency, coupon, delivery month, bid/ask/mid). -
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 endpoint —
api.mbsmkt.com/p/prices/snapshotis production, documented, and working - Authentication — API key infrastructure exists (DQ provisions keys via webhook to MBS Access)
- Data format — JSON response with
data.recordsarray, field mapping is known - Transform logic —
pss_mbs_ingesttransform engine already parses the same data for the Odoo delivery pipeline
Impact on Xigo Requirements
This discovery changes the Xigo external data priority table:
| Data | Previous Status | Updated Status |
|---|---|---|
| TBA Prices | Hard (real-time market data subscription, $500-2,000/mo) | Solved (dataQollab API, already licensed) |
| Agency LLPAs | Easy (public Excel files) | Unchanged |
| G-Fee / BUBD | Medium (public grid + private negotiated fee) | Unchanged |
| MSR / Servicing | Medium (broker feeds or model) | Unchanged |
| Treasury / SOFR | Easy (free/cheap sources) | Unchanged |
| Conforming Limits | Easy (annual, already in PSX) | Unchanged |
| Eligibility Rules | Hard (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
| Purpose | Path |
|---|---|
| Snapshot API client (reference implementation) | X:\dev\odoo\PowerSeller\custom_modules\pss_mbs_files\controllers\snapshot_controller.py |
| DQ API key webhook receiver | X:\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 specification | X:\dev\odoo\PowerSeller\docs\architecture\specifications\pss-mbs-ingest\specification.md |
| Module architecture map | X:\dev\odoo\PowerSeller\docs\architecture\PSS_MODULE_ARCHITECTURE.md |
Next Steps
- PSX SA reviews the snapshot API response format and maps to PSX's pricing schema
- Determine API key provisioning — does PSX use PowerSeller's master key, or does it get its own key from DQ?
- Build the TBA Price Client in PSX — reference
snapshot_controller.pyfor the API call pattern - Test with live data — call the snapshot API and verify the prices match what MBS Access subscribers see
- Wire into rate sheet generator — use
mid_priceas the TBA base price for Xigo calculations