Known vendor shapes are free
Encompass exports land on day one with all 400 fields. No AI fee, no QC pass, no mapping drift. The work is already done.
Named vendor profiles for known LOS exports (Encompass Standardized Report lands 400 fields out of the box). AI-assisted type-aware mapping with tiered apply gates and top-K fallback for unknown shapes. MISMO 3.4 / ULAD / native JSON. Tolerant coercion for vendor format quirks. SHA-256 fingerprint idempotency.
Overview
Loan import accepts MISMO 3.4 XML, ULAD XML, RateStack native JSON, and curated vendor profiles (Encompass Standardized Report CCL ships with all 400 rows mapped). For unknown shapes, the pipeline runs a tiered apply gate over an AI-assisted type-aware mapper with top-K fallback. Tolerant coercion handles vendor format quirks (Active / Enabled / Waived → boolean, NA / null → null). SHA-256 fingerprint guarantees idempotent retries. Validation errors return 422 with RFC 7807 problem details pointing at the offending field. The borrowers[0..N] unified namespace handles multi-borrower loans with identical field shapes.
Encompass Standardized Report (CCL) ships with 400 fields mapped. Calyx, MISMO, ULAD also built-in. Custom profiles take days, not quarters.
Unknown shapes route through a type-aware mapper with tiered apply gates. Top-K fallback for ambiguous rows; below-threshold lands in QC.
TolerantCoercionModule handles boolean variants (Waived, Active, Enabled), loose BigDecimal (NA, null, locale decimals), and permissive date parsing.
Round-trip safe MISMO XML and ULAD XML. Borrower, loan, property, transaction, execution all populate from canonical containers.
borrowers[0..N] unified shape. Index 0 is the primary; the rest are co-borrowers with identical fields. URLA 2021 Tiers 1–5 complete.
40+ documentation types: FULL, BANK_STMT, DSCR, ASSET, ITIN, STREAMLINE, NO_DOC. Powers non-QM and DSCR lanes.
Imports are keyed on SHA-256 of the payload. Re-importing the same file is free and returns the same loanId.
Per-import audit trail with the mapper path used per row, fallback rows, confidence scores, and operator overrides.
How it works
Numbered steps from input to output. Each step maps to a specific subsystem you can inspect via OpenTelemetry.
Set Content-Type and pass the payload body. Profile slug as a query parameter bypasses the generic mapper when the shape is known.
Server computes SHA-256 of the body. If a prior import has the same fingerprint, the existing loan is returned — no duplicate row.
If a profile is named, the curated mapping runs first. Tolerant coercion absorbs format quirks; unmapped rows fall through to the generic mapper with provenance recorded.
Three-tier resolver: stored template → AI type-aware mapper → regex heuristic. Tiered apply gate decides which result wins; top-K fallback for ambiguous columns.
Validator runs cross-field checks (LTV consistency, occupancy/doc combinations, state-specific overlays). 422 on hard errors with field paths; warnings on soft.
Loan persists with status NEW; ImportSummary row records mapper provenance; loans.imported fires on NATS with the loanId, fingerprint, profile, and warnings.
Pass loanId to /v1/pricing — or run an immediate eligibility check if you want a fast feedback loop.
Hands on
Live cURL sample — copy, paste, ship.
# Encompass-native: pass profile=… and we bypass the generic mapper
curl -X POST "https://api.ratestack.com/v1/loans/import?\
profile=encompass-standardized-report-ccl&importedByUserId=$ME&ownerUserId=$OWNER" \
-H "X-API-Key: $RATESTACK_KEY" \
-H "Content-Type: text/csv" \
--data-binary @encompass-export.csv
# MISMO 3.4: drop the profile and let content-type select the parser
curl -X POST "https://api.ratestack.com/v1/loans/import?\
importedByUserId=$ME&ownerUserId=$OWNER" \
-H "X-API-Key: $RATESTACK_KEY" \
-H "Content-Type: application/xml" \
--data-binary @application.mismo.xml
# 200 OK — loan was created with normalized fields + profile/mapper provenance
# {
# "loanId": "loan_C1c8a4ed",
# "fingerprint": "sha256:f57a8d2c...",
# "profile": { "slug": "encompass-standardized-report-ccl", "version": "2026-05-15",
# "rowsMapped": 400, "rowsFallback": 0 },
# "warnings": [],
# "normalized": { "borrower": { ... }, "borrowers": [ ... ], "property": { ... }, ... }
# }Why this matters
Encompass exports land on day one with all 400 fields. No AI fee, no QC pass, no mapping drift. The work is already done.
When a vendor changes a column or you onboard a new LOS, the AI mapper runs with explicit confidence and QC routing — not a silent miss.
DSCR, bank statement, asset utilization, ITIN — all carry their own documentation types and relevance rules. The 1003 reflows for the lane.
Frequently asked
Send a representative export to onboarding; profiles take days. In the interim, the AI mapper handles it with explicit QC routing for low-confidence rows.
3.4 is the canonical target. We accept 3.5 documents that don't introduce breaking schema changes for the fields we read; out-of-spec extensions are ignored with warnings.
Yes. Bulk endpoints support batched payloads with per-row idempotency. Admin observability lets you see mapper paths, fallbacks, and warnings per row in one report.
borrowers[0..N]. Index 0 is the primary borrower (formerly 'Borrower'); the rest are co-borrowers (formerly 'CoBorrower') with identical field shapes. The unification eliminates aliasing across MISMO containers.
40+ types covering full-doc, bank statement, DSCR, asset utilization, ITIN, streamline, no-doc, and more. Each carries its own relevance rules in the Smart 1003.
Every import writes an ImportSummary row with the mapper path used per row, fallback row count, warnings, and any operator overrides. Audit-chained into common_audit_log.
Related capabilities
Ready to see it on your data?
We'll spin you a sandbox, load your actual ratesheets, and walk you through this capability against your top scenarios.