Mortgage Intelligence is a mortgage decisioning API platform: six underwriting-grade engines behind one REST API, running on Cloudflare's global edge network. You send borrower data (or a photo of a paystub) — it returns qualification verdicts, affordability numbers, closing cost estimates, compliance dates, and lead scores in milliseconds.
| You are… | You use it to… |
|---|---|
| Loan officer / broker shop | Pre-qualify borrowers on the phone in real time; screen files before an official AUS run burns a credit pull. |
| Lender / credit union | Embed instant prequal into your website; run guideline pre-checks across Conventional, FHA, VA, USDA, Jumbo simultaneously. |
| PropTech / FinTech builder | Power "How much house can I afford?" features with real 2026 guideline math instead of nonsense calculators. |
| Lead aggregator | Score mortgage leads 0–100 on qualification likelihood before selling or routing them. |
<100ms typical engine response2026 loan limits verifiedAll 50 statesEdge-deployed (300+ cities)SHA-256 hashed keysNo SSN required
Visit mcknight-mortgageos.pages.dev/signup, or via API:
curl -X POST https://mcknight-mortgageos.pages.dev/api/v1/signup \
-H "Content-Type: application/json" \
-d '{"company_name": "Acme Lending", "email": "you@acmelending.com"}'
The response contains your API key once — store it securely. Sandbox includes 25 prequals, 5 AUS runs, and 10 document analyses per month, free forever.
curl -X POST https://mcknight-mortgageos.pages.dev/api/v1/prequal/submit \
-H "Authorization: Bearer mga_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"first_name": "John", "last_name": "Doe",
"income_sources": [{"income_type": "W2_SALARY", "monthly_amount": 8500}],
"credit_profile": {"fico_score": 720},
"debts": [{"debt_type": "auto", "monthly_payment": 450}],
"down_payment": 60000, "liquid_assets": 45000,
"property_state": "TX", "years_employed": 4
}'
{
"qualification": { "status": "Strong - Excellent Approval Odds", "qualification_score": 100 },
"affordability": { "max_home_price": 374791.27, "max_loan_amount": 314791.27 },
"program_eligibility": [
{ "program": "Conventional", "eligible": true, "dti_back": 22.1 },
{ "program": "FHA", "eligible": true }, { "program": "VA", "eligible": false, "reason": "..." }
],
"stored_id": "2d42e9c5-..."
}
GET /api/v1/prequal/history).The homepage at mcknight-mortgageos.pages.dev is a live console: paste your key in the key field, then use the Prequal / AUS / Closing / Compliance / Leads / Usage tabs to fire real requests without writing code. The Docs tab lists every endpoint.
All engine endpoints require your API key as a Bearer token:
Authorization: Bearer mga_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
POST /api/v1/keys./signup, /contact, /limits, /programs, /health, billing checkout.| Plan | Price | Prequals/mo | AUS/mo | Docs/mo | Daily calls | Overages |
|---|---|---|---|---|---|---|
| Sandbox | $0 forever | 25 | 5 | 10 | 250 | — |
| Starter | $299/mo · $2,990/yr | 500 | 50 | 100 | 1,000 | $0.75 prequal · $3 AUS |
| Professional | $999/mo · $9,990/yr | 5,000 | 500 | 1,000 | 10,000 | $0.40 prequal · $2 AUS |
| Enterprise | from $2,500/mo | Unlimited + SLA, white-label, custom guidelines | Contact us | |||
Annual billing = 2 months free. Upgrade self-serve at /pricing (Stripe checkout, card charged immediately, account upgraded automatically within seconds via webhook — your existing key keeps working with new quotas). Enterprise: /contact.
curl https://mcknight-mortgageos.pages.dev/api/v1/billing/usage \
-H "Authorization: Bearer mga_live_YOUR_KEY"
{ "tier": "STARTER",
"prequal": { "quota": 500, "used": 112, "remaining": 388 },
"aus": { "quota": 50, "used": 9, "remaining": 41 },
"documents": { "quota": 100, "used": 23, "remaining": 77 } }
Quotas reset monthly on your billing date (paid plans — triggered by the paid invoice) . Exceeding a quota returns HTTP 403 QUOTA_EXCEEDED.
POST/api/v1/prequal/submit
| Field | Type | Notes |
|---|---|---|
first_name, last_name | string · required | Borrower name |
income_sources[] | array · required | Each: income_type (W2_SALARY, SELF_EMPLOYED, HOURLY, COMMISSION, BONUS, OVERTIME, RENTAL, PENSION, DISABILITY, ALIMONY…), monthly_amount, optional months_history |
credit_profile | object · required | fico_score (or per-bureau scores — middle score used), late payments, bankruptcies, foreclosures, collections |
down_payment | number · required | Dollars available for down payment |
debts[] | array | Monthly obligations; set will_be_paid_off: true to exclude |
purchase_price | number | Omit to solve for max affordability instead |
property_state, occupancy, units | — | Primary / Second Home / Investment; 1–4 units |
is_veteran, is_first_time_buyer, usda_eligible_area, high_cost_area | boolean | Unlock VA / USDA / high-balance analysis |
interest_rate | number | Assumed rate for affordability (defaults to current market assumption) |
| Program | Front DTI | Back DTI (base/comp) | Min FICO | Max LTV |
|---|---|---|---|---|
| Conventional | 28% | 45% / 50% | 620 | 97% |
| FHA | 31% | 43% / 50% | 580 | 96.5% |
| VA | — | 41% / 60% | 580 | 100% |
| USDA | 29% | 41% / 44% | 640 | 100% |
| Jumbo | 28% | 38% / 43% | 700 | 90% |
Related: GET /prequal/history (last 50) · GET /limits + GET /limits/check?loan_amount=… (2026 conforming/FHA limits, public) · GET /programs
POST/api/v1/aus/submit
{
"loan_number": "L-2026-0455",
"systems": ["DU", "LP"], // run one or both simulations
"borrower": {
"first_name": "Maria", "last_name": "Santos",
"credit_score": 705, "monthly_income": 9200,
"is_self_employed": false, "years_employed": 6
},
"property": {
"state": "FL", "property_value": 450000,
"occupancy_type": "PrimaryResidence", "units": 1
},
"loan_details": {
"loan_amount": 405000, "loan_purpose": "Purchase",
"loan_term_months": 360, "interest_rate": 6.5,
"loan_type": "Conventional", "monthly_debts": 850
}
}
Submissions persist: GET /aus/submissions lists them, GET /aus/submissions/:id/findings re-fetches full findings.
| Scenario | Use |
|---|---|
| Borrower on the phone, exploring budget | Prequal — fast, program-wide, needs less data |
| File nearly complete, about to submit to DU/LPA | AUS-sim — catch findings before the official run |
| Website affordability widget | Prequal |
| Pipeline triage: which files are submit-ready? | AUS-sim in batch |
POST/api/v1/closing-costs
{
"loan_amount": 320000, "property_value": 400000, "down_payment": 80000,
"loan_type": "Conventional", "interest_rate": 6.625, "loan_term_months": 360,
"state": "TX",
"discount_points": 0.5, "seller_credit": 5000,
"property_tax_annual": 7200, "homeowners_insurance_annual": 2100,
"closing_date": "2026-09-15"
}
| Section | Contents |
|---|---|
| A — Origination | Origination fee, discount points, underwriting/processing |
| B — Cannot shop | Appraisal, credit report, flood cert, MERS, tax service |
| C — Can shop | Title services, lender's title insurance, survey, settlement |
| E — Taxes & gov fees | Recording + state-specific transfer taxes (all 50 states) |
| F — Prepaids | Per-diem interest to first payment, insurance year-1, MIP/VA funding fee where applicable |
| G — Escrow | Initial escrow deposits (months of taxes + insurance) |
| Cash to close | Down payment + costs − credits, with program-specific items (FHA UFMIP, VA funding fee incl. disabled-vet exemption, USDA guarantee fee) |
Every response includes estimated total closing costs, cash-to-close, and monthly payment (PITI + MI where LTV requires it).
is_veteran_disabled: true on VA loans to zero the funding fee — a commonly missed exemption worth thousands.TRID timing violations are expensive. These endpoints compute legally significant dates using the federal-holiday-aware business day calendar.
| Endpoint | What it answers |
|---|---|
| POST /compliance/le-timing | "Given this application date, when must the Loan Estimate be delivered?" (3 business days) — plus earliest allowable closing |
| POST /compliance/cd-timing | "Given this CD delivery date and method, when can we close?" (3-day waiting period; mailbox rule adds 3 days for non-hand delivery) |
| POST /compliance/tolerance | "Fee changed between LE and CD — is it a violation and what's the cure?" Zero / 10% aggregate / unlimited tolerance buckets with exact cure amounts |
| GET /compliance/holidays/:year | Federal holiday calendar for any year |
| GET /compliance/business-days?start=…&days=… | General-purpose TRID business-day calculator |
curl -X POST .../api/v1/compliance/cd-timing \
-H "Authorization: Bearer mga_live_YOUR_KEY" -H "Content-Type: application/json" \
-d '{"cd_delivery_date": "2026-09-08", "delivery_method": "mail"}'
{ "received_date": "2026-09-11", // +3 days mailbox rule
"earliest_closing_date": "2026-09-15",
"waiting_period_days": 3, "notes": ["Mailbox rule applied…"] }
{ "category": "zero_tolerance", "violation": true,
"cure_amount": 150.00,
"explanation": "Lender fees are zero-tolerance; any increase over LE requires a cure." }
Capture consumer mortgage leads and score them 0–100 on qualification likelihood — so your team calls the winners first (or you price lead inventory correctly).
| Endpoint | Purpose |
|---|---|
| POST /leads | Create + auto-score a lead (persists to your pipeline) |
| GET /leads | Your pipeline, sorted by score descending |
| POST /leads/score | Score without persisting (e.g., real-time bid decisions) |
Credit band, income vs. target price, down payment strength, employment stability, timeline urgency, and property/occupancy type feed a weighted 0–100 score with a hot/warm/cold classification.
curl -X POST .../api/v1/leads -H "Authorization: Bearer mga_live_YOUR_KEY" \
-H "Content-Type: application/json" -d '{
"first_name": "Dana", "last_name": "Fields", "email": "dana@example.com",
"credit_range": "700-749", "annual_income": 110000,
"down_payment_saved": 40000, "target_price": 380000,
"timeline": "0-3 months", "employment_type": "W2"
}'
→ { "lead_id": "…", "score": 84, "classification": "hot", "factors": [...] }
POST /leads → route score ≥75 to senior LOs, 50–74 to nurture campaigns, <50 to automated drip. The score factors explain every number, so LOs know the angle before dialing.POST/api/v1/documents/analyze
Upload a borrower document photo — get back the document type, every extracted field, a computed qualifying monthly income per standard agency methods, and (optionally) a full pre-qualification in the same call.
| Document | Fields extracted | Income method |
|---|---|---|
| Paystub | Pay period, frequency, gross current/YTD, net, hours, rate, OT/bonus/commission YTD | Current gross × frequency factor, YTD cross-check (conservative lower figure), OT/bonus flagged for 2-yr average |
| W-2 | Box 1/3/5 wages, withholding, year, EIN, state | Box 1 ÷ 12 (2-yr averaging note) |
| Bank statement | Balances, deposits, withdrawals, NSF count | Asset verification (not income for agency loans) |
| 1040 return | Line 9/11, Schedule C net profit, wages | Sch C ÷ 12 for self-employed (add-back note) |
| 1099 | Variant, payer, amount, year | Annual ÷ 12 (2-yr history note) |
file — JPEG, PNG, or WebP, max 4MB. PDFs: convert pages to PNG first (300 DPI recommended).{"image_base64": "...", "content_type": "image/png"}curl -X POST .../api/v1/documents/analyze \
-H "Authorization: Bearer mga_live_YOUR_KEY" \
-F "file=@paystub.png" \
-F "auto_prequal=true" \
-F 'borrower={"credit_profile":{"fico_score":720},"down_payment":60000,
"property_state":"NM","debts":[{"debt_type":"auto","monthly_payment":450}]}'
→ doc_type: PAYSTUB · qualifying income: $8,910.30/mo
→ auto_prequal: score 100 · max home price: $374,791 · stored in history
Credit score and down payment must come from you — documents can't establish them. The derived income becomes a W2_SALARY (or SELF_EMPLOYED) income source automatically.
| Endpoint | Purpose |
|---|---|
| GET /documents/history | Your last 50 analyses with doc type, confidence, derived income |
| GET /documents/:id | Full record: all fields, income analysis, OCR stats |
| DELETE /documents/:id | Permanently deletes the analysis AND the stored file — use for privacy compliance / borrower deletion requests |
confidence (0–1) and a warnings[] array flagging legibility issues or inconsistencies (e.g., current gross that doesn't reconcile with YTD).OCR_FAILED, don't consume quota, and don't store anything.| Event | What happens automatically |
|---|---|
| Subscription renews (invoice paid) | Account re-activated if needed; monthly usage counters reset to 0 |
| Payment fails | Account suspended (API returns auth errors) until payment succeeds |
| Subscription cancelled | Account closed at period end |
To cancel or change plans, email support@rjbusinesssolutions.org (self-serve portal coming). Annual plans are non-refundable except where law requires.
# Generate an additional production key (returned once)
curl -X POST .../api/v1/keys -H "Authorization: Bearer mga_live_EXISTING_KEY" \
-H "Content-Type: application/json" -d '{"key_name": "Production Server 2"}'
{ "error": { "code": "QUOTA_EXCEEDED", "message": "Monthly PREQUAL quota exceeded (500/500)…", "details": {…} } }
| HTTP | Code | Meaning / fix |
|---|---|---|
| 401 | UNAUTHORIZED | Missing/invalid key. Check the Authorization: Bearer header. |
| 401 | DEMO_KEY_DISABLED | Demo keys don't work in production — get a free key at /signup. |
| 403 | QUOTA_EXCEEDED | Monthly quota hit. Upgrade at /pricing or wait for reset. |
| 400 | INVALID_REQUEST | Missing required fields — message lists them. |
| 409 | ALREADY_REGISTERED | Signup email already has an account. |
| 413 | FILE_TOO_LARGE | Document over 4MB — compress or downscale. |
| 415 | UNSUPPORTED_TYPE | Only JPEG/PNG/WebP. Convert PDFs to PNG first. |
| 502 | OCR_FAILED | Image unreadable. Retake per the checklist in §09. No quota consumed. |
Email support@rjbusinesssolutions.org with your client_id (never your API key), the endpoint, timestamp, and the full error body. Starter: 48h response · Professional: 12h priority · Enterprise: dedicated Slack.
Full terms: mcknight-mortgageos.pages.dev/terms · Privacy: /privacy · Governing law: New Mexico, USA.
| Endpoint | Auth | Purpose |
|---|---|---|
| POST/api/v1/signup | — | Free sandbox account + instant key |
| POST/api/v1/contact | — | Demo / enterprise / partnership request |
| GET/api/v1/limits · /limits/check · /programs | — | 2026 loan limits & program catalog |
| GET/health | — | Liveness + DB status |
| POST/api/v1/prequal/submit | 🔑 | Multi-program pre-qualification |
| GET/api/v1/prequal/history | 🔑 | Last 50 prequals |
| POST/api/v1/aus/submit | 🔑 | DU/LPA-style guideline simulation |
| GET/api/v1/aus/submissions · /:id/findings | 🔑 | Submission history + findings |
| POST/api/v1/closing-costs | 🔑 | TRID LE-style cost estimate |
| POST/api/v1/compliance/le-timing · /cd-timing · /tolerance | 🔑 | TRID timing & tolerance |
| GET/api/v1/compliance/holidays/:yr · /business-days | 🔑 | Calendars |
| POST/api/v1/leads · /leads/score | 🔑 | Lead capture + scoring |
| GET/api/v1/leads | 🔑 | Scored pipeline |
| POST/api/v1/documents/analyze | 🔑 | OCR + parse + income + optional auto-prequal |
| GET/api/v1/documents/history · /:id | 🔑 | Analysis records |
| DEL/api/v1/documents/:id | 🔑 | Delete analysis + file |
| GET/api/v1/billing/usage | 🔑 | Quotas + usage |
| POST/api/v1/keys | 🔑 | Additional API key |
| POST/api/v1/billing/checkout | — | Stripe subscription checkout |
/ interactive console · /pricing plans + subscribe · /signup free key · /contact demo · /manual this guide · /terms · /privacy · /brand brand kit