REAL MARKETING CLUB
  • What's Included
  • Join
  • Start Marketing
    • AI
    • Facebook Certification Training >
      • Page Likes
    • Video Ads
    • Lead Ads >
      • Perfect System - All
    • Facebook Ad Images
    • 1000s of Free Videos Photos Music
    • Learning Center
    • Bonus Content >
      • Free Training Videos
  • Manage My Account
  • Help
Member Only Content.  Member already?  Sign-in below if not seeing content below.

Mortgage Rate Widget Code

Copy and paste the code below into your site.
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Today's Mortgage Rates Calculator</title>
    <style>
        :root {
            --primary: #2563eb;
            --primary-dark: #1d4ed8;
            --gray: #6b7280;
            --light-gray: #f3f4f6;
            --border: #d1d5db;
            --success: #10b981;
            --white: #ffffff;
        }

        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }

        body {
            font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, sans-serif;
            background-color: var(--white);
            color: #1f2937;
            line-height: 1.6;
            padding: 20px;
        }

        .mortgage-widget {
            max-width: 600px;
            margin: 0 auto;
            background: var(--white);
            border: 1px solid var(--border);
            border-radius: 12px;
            padding: 28px;
            box-shadow: 0 10px 25px -5px rgba(0, 0, 0, 0.1);
        }

        .widget-header {
            text-align: center;
            margin-bottom: 28px;
        }

        .widget-title {
            font-size: 24px;
            font-weight: 700;
            color: #111827;
            margin-bottom: 8px;
        }

        .widget-subtitle {
            font-size: 14px;
            color: var(--gray);
        }

        .form-grid {
            display: grid;
            grid-template-columns: 1fr 1fr;
            gap: 16px;
            margin-bottom: 24px;
        }

        .form-group {
            display: flex;
            flex-direction: column;
        }

        .form-group.full-width {
            grid-column: 1 / -1;
        }

        label {
            font-size: 14px;
            font-weight: 600;
            color: #374151;
            margin-bottom: 6px;
        }

        input, select {
            padding: 10px 12px;
            border: 1px solid var(--border);
            border-radius: 8px;
            font-size: 16px;
            transition: all 0.2s;
        }

        input:focus, select:focus {
            outline: none;
            border-color: var(--primary);
            box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1);
        }

        .input-group {
            position: relative;
        }

        .input-prefix {
            position: absolute;
            left: 12px;
            top: 50%;
            transform: translateY(-50%);
            color: var(--gray);
            font-weight: 500;
            pointer-events: none;
        }

        .input-with-prefix {
            padding-left: 32px;
        }

        .btn-calculate, .btn-refresh {
            background: var(--primary);
            color: white;
            border: none;
            padding: 12px 24px;
            font-size: 16px;
            font-weight: 600;
            border-radius: 8px;
            cursor: pointer;
            transition: background 0.2s;
            margin-top: 12px;
        }

        .btn-refresh {
            background: var(--success);
            width: auto;
            margin-left: 10px;
        }

        .btn-calculate:hover {
            background: var(--primary-dark);
        }

        .btn-refresh:hover {
            background: #059669;
        }

        .results-container {
            margin-top: 28px;
            padding: 20px;
            background: var(--light-gray);
            border-radius: 10px;
            border: 1px solid var(--border);
        }

        .results-header {
            font-size: 18px;
            font-weight: 700;
            color: #111827;
            margin-bottom: 16px;
            display: flex;
            align-items: center;
            justify-content: space-between;
        }

        .update-time {
            font-size: 12px;
            color: var(--gray);
            font-weight: 400;
        }

        .rate-grid {
            display: grid;
            grid-template-columns: 1fr 1fr;
            gap: 16px;
        }

        .rate-card {
            background: white;
            padding: 16px;
            border-radius: 8px;
            border: 1px solid var(--border);
            text-align: center;
        }

        .rate-label {
            font-size: 14px;
            color: var(--gray);
            margin-bottom: 4px;
            text-transform: uppercase;
            letter-spacing: 0.5px;
        }

        .rate-value {
            font-size: 28px;
            font-weight: 700;
            color: var(--primary);
            margin-bottom: 4px;
        }

        .rate-apr {
            font-size: 13px;
            color: var(--gray);
        }

        .disclaimer {
            margin-top: 20px;
            font-size: 12px;
            color: var(--gray);
            text-align: center;
            line-height: 1.5;
        }

        .loading {
            text-align: center;
            color: var(--gray);
            font-style: italic;
        }

        @media (max-width: 640px) {
            .form-grid {
                grid-template-columns: 1fr;
            }
            
            .rate-grid {
                grid-template-columns: 1fr;
            }
            
            .mortgage-widget {
                padding: 20px;
            }
        }
    </style>
</head>
<body>
    <div class="mortgage-widget">
        <div class="widget-header">
            <h2 class="widget-title">Today's Mortgage Rates</h2>
            <p class="widget-subtitle">Get personalized rate estimates based on current market conditions</p>
        </div>

        <div class="form-grid">
            <div class="form-group">
                <label for="loan-amount">Loan Amount</label>
                <div class="input-group">
                    <span class="input-prefix">$</span>
                    <input type="text" id="loan-amount" class="input-with-prefix" placeholder="250,000" value="250000">
                </div>
            </div>

            <div class="form-group">
                <label for="credit-score">Credit Score</label>
                <select id="credit-score">
                    <option value="760">760+ (Excellent)</option>
                    <option value="720">720-759 (Very Good)</option>
                    <option value="680">680-719 (Good)</option>
                    <option value="640">640-679 (Fair)</option>
                    <option value="620">620-639 (Poor)</option>
                    <option value="580" selected>Below 620</option>
                </select>
            </div>

            <div class="form-group">
                <label for="down-payment">Down Payment</label>
                <div class="input-group">
                    <span class="input-prefix">$</span>
                    <input type="text" id="down-payment" class="input-with-prefix" placeholder="50,000" value="50000">
                </div>
            </div>

            <div class="form-group">
                <label for="property-type">Property Type</label>
                <select id="property-type">
                    <option value="single">Single Family Home</option>
                    <option value="condo">Condo</option>
                    <option value="townhouse">Townhouse</option>
                    <option value="multi">Multi-Family</option>
                </select>
            </div>

            <div class="form-group">
                <label for="loan-type">Loan Type</label>
                <select id="loan-type">
                    <option value="30yr">30-Year Fixed</option>
                    <option value="15yr">15-Year Fixed</option>
                    <option value="arm">5/1 ARM</option>
                    <option value="fha">FHA Loan</option>
                    <option value="va">VA Loan</option>
                </select>
            </div>

            <div class="form-group">
                <label for="property-use">Property Use</label>
                <select id="property-use">
                    <option value="primary">Primary Residence</option>
                    <option value="secondary">Second Home</option>
                    <option value="investment">Investment Property</option>
                </select>
            </div>

            <div class="form-group full-width">
                <label for="zip-code">ZIP Code</label>
                <input type="text" id="zip-code" placeholder="Enter your ZIP code" value="90210">
            </div>
        </div>

        <div style="display: flex; justify-content: center; gap: 10px;">
            <button class="btn-calculate" onclick="calculateRates()">
                Get Personalized Rates
            </button>
            <button class="btn-refresh" onclick="fetchRates(true)">
                Refresh Rates
            </button>
        </div>

        <div class="results-container" id="results" style="display: none;">
            <div class="results-header">
                <span>Estimated Mortgage Rates</span>
                <span class="update-time" id="update-time"></span>
            </div>

            <div class="rate-grid">
                <div class="rate-card">
                    <div class="rate-label">30-Year Fixed</div>
                    <div class="rate-value" id="rate-30yr"></div>
                    <div class="rate-apr">APR: <span id="apr-30yr"></span></div>
                </div>

                <div class="rate-card">
                    <div class="rate-label">15-Year Fixed</div>
                    <div class="rate-value" id="rate-15yr"></div>
                    <div class="rate-apr">APR: <span id="apr-15yr"></span></div>
                </div>

                <div class="rate-card">
                    <div class="rate-label">5/1 ARM</div>
                    <div class="rate-value" id="rate-arm"></div>
                    <div class="rate-apr">APR: <span id="apr-arm"></span></div>
                </div>

                <div class="rate-card">
                    <div class="rate-label">FHA 30-Year</div>
                    <div class="rate-value" id="rate-fha"></div>
                    <div class="rate-apr">APR: <span id="apr-fha"></span></div>
                </div>
            </div>

            <div class="disclaimer">
                *Rates are estimates based on national averages and your inputs. Actual rates may vary. 
                Rates updated as of <span id="disclaimer-date"></span>. Not a commitment to lend.
            </div>
        </div>
    </div>

    <script>
        // Replace with your free Alpha Vantage API key (signup at alphavantage.co)
        const API_KEY = 'YOUR_API_KEY';
        let baseRates = {
            '30yr': { rate: 6.11, apr: 6.27 },  // Fallback rates (updated Nov 14, 2025)
            '15yr': { rate: 5.49, apr: 5.72 },
            'arm': { rate: 5.88, apr: 6.92 },
            'fha': { rate: 5.95, apr: 6.78 }
        };

        // Rate adjustment factors (unchanged)
        const adjustments = {
            creditScore: {
                '760': { '30yr': -0.25, '15yr': -0.20, 'arm': -0.20, 'fha': -0.15 },
                '720': { '30yr': -0.15, '15yr': -0.12, 'arm': -0.12, 'fha': -0.08 },
                '680': { '30yr': -0.05, '15yr': -0.05, 'arm': -0.05, 'fha': -0.03 },
                '640': { '30yr': 0.15, '15yr': 0.18, 'arm': 0.15, 'fha': 0.05 },
                '620': { '30yr': 0.35, '15yr': 0.40, 'arm': 0.35, 'fha': 0.15 },
                '580': { '30yr': 0.65, '15yr': 0.75, 'arm': 0.60, 'fha': 0.35 }
            },
            ltv: {
                '95+': { '30yr': 0.50, '15yr': 0.45, 'arm': 0.40, 'fha': 0.00 },
                '90-95': { '30yr': 0.25, '15yr': 0.22, 'arm': 0.20, 'fha': 0.00 },
                '80-90': { '30yr': 0.00, '15yr': 0.00, 'arm': 0.00, 'fha': 0.00 },
                '70-80': { '30yr': -0.12, '15yr': -0.10, 'arm': -0.08, 'fha': -0.05 },
                '<70': { '30yr': -0.20, '15yr': -0.18, 'arm': -0.15, 'fha': -0.10 }
            },
            propertyUse: {
                'primary': { '30yr': 0.00, '15yr': 0.00, 'arm': 0.00, 'fha': 0.00 },
                'secondary': { '30yr': 0.25, '15yr': 0.22, 'arm': 0.20, 'fha': 0.30 },
                'investment': { '30yr': 0.75, '15yr': 0.70, 'arm': 0.65, 'fha': 0.00 }
            },
            propertyType: {
                'single': { '30yr': 0.00, '15yr': 0.00, 'arm': 0.00, 'fha': 0.00 },
                'condo': { '30yr': 0.12, '15yr': 0.10, 'arm': 0.08, 'fha': 0.05 },
                'townhouse': { '30yr': 0.08, '15yr': 0.07, 'arm': 0.06, 'fha': 0.03 },
                'multi': { '30yr': 0.35, '15yr': 0.30, 'arm': 0.25, 'fha': 0.00 }
            }
        };

        function formatCurrency(value) {
            return parseFloat(value).toLocaleString('en-US');
        }

        function formatRate(value) {
            return parseFloat(value).toFixed(2) + '%';
        }

        function calculateLTV(loanAmount, homeValue) {
            const ltv = (loanAmount / homeValue) * 100;
            if (ltv >= 95) return '95+';
            if (ltv >= 90) return '90-95';
            if (ltv >= 80) return '80-90';
            if (ltv >= 70) return '70-80';
            return '<70';
        }

        async function fetchRates(force = false) {
            if (!force && !API_KEY.startsWith('demo')) return;  // Skip if no key
            try {
                document.getElementById('results').innerHTML += '<p class="loading">Fetching live rates...</p>';
                const response = await fetch(`https://www.alphavantage.co/query?function=MORTGAGE-RATES&apikey=${API_KEY}`);
                const data = await response.json();
                if (data['Mortgage Rate'] && data['Error Message'] === undefined) {
                    baseRates = {
                        '30yr': { rate: parseFloat(data['Mortgage Rate']['30 Year Fixed Rate']), apr: parseFloat(data['Mortgage Rate']['30 Year Fixed APR']) },
                        '15yr': { rate: parseFloat(data['Mortgage Rate']['15 Year Fixed Rate']), apr: parseFloat(data['Mortgage Rate']['15 Year Fixed APR']) },
                        'arm': { rate: parseFloat(data['Mortgage Rate']['5/1 ARM Rate']), apr: parseFloat(data['Mortgage Rate']['5/1 ARM APR']) },
                        'fha': { rate: parseFloat(data['Mortgage Rate']['FHA 30 Year Fixed Rate']), apr: parseFloat(data['Mortgage Rate']['FHA 30 Year Fixed APR']) }
                    };
                    console.log('Live rates fetched:', baseRates);
                }
            } catch (error) {
                console.error('API fetch failed, using fallback rates');
            }
            document.querySelector('.loading')?.remove();
            calculateRates();  // Recalculate with new rates
        }

        function calculateRates() {
            // Get input values
            const loanAmount = parseFloat(document.getElementById('loan-amount').value.replace(/,/g, '')) || 250000;
            const downPayment = parseFloat(document.getElementById('down-payment').value.replace(/,/g, '')) || 50000;
            const creditScore = document.getElementById('credit-score').value;
            const propertyType = document.getElementById('property-type').value;
            const loanType = document.getElementById('loan-type').value;
            const propertyUse = document.getElementById('property-use').value;
            const zipCode = document.getElementById('zip-code').value;

            // Calculate home value and LTV
            const homeValue = loanAmount + downPayment;
            const ltv = calculateLTV(loanAmount, homeValue);

            // Format inputs for display
            document.getElementById('loan-amount').value = formatCurrency(loanAmount);
            document.getElementById('down-payment').value = formatCurrency(downPayment);

            // Calculate personalized rates
            const personalizedRates = {};
            const loanTypes = ['30yr', '15yr', 'arm', 'fha'];

            loanTypes.forEach(type => {
                let rate = baseRates[type].rate;
                let apr = baseRates[type].apr;

                // Apply adjustments
                rate += (adjustments.creditScore[creditScore]?.[type] || 0);
                rate += (adjustments.ltv[ltv]?.[type] || 0);
                rate += (adjustments.propertyUse[propertyUse]?.[type] || 0);
                rate += (adjustments.propertyType[propertyType]?.[type] || 0);

                // Special adjustments for FHA loans
                if (type === 'fha' && propertyUse !== 'primary') {
                    rate = null; // FHA loans typically only for primary residence
                }

                // ARM adjustments (if not from API)
                if (type === 'arm' && !apr) {
                    apr = rate + 1.04; // Typical ARM APR spread
                } else if (!apr) {
                    apr = rate + 0.16; // Typical fixed APR spread
                }

                personalizedRates[type] = { rate: rate ? rate.toFixed(2) : null, apr: apr.toFixed(2) };
            });

            // Update display
            document.getElementById('rate-30yr').textContent = formatRate(personalizedRates['30yr'].rate);
            document.getElementById('apr-30yr').textContent = formatRate(personalizedRates['30yr'].apr);
            
            document.getElementById('rate-15yr').textContent = formatRate(personalizedRates['15yr'].rate);
            document.getElementById('apr-15yr').textContent = formatRate(personalizedRates['15yr'].apr);
            
            document.getElementById('rate-arm').textContent = formatRate(personalizedRates['arm'].rate);
            document.getElementById('apr-arm').textContent = formatRate(personalizedRates['arm'].apr);
            
            if (propertyUse === 'primary' && personalizedRates['fha'].rate) {
                document.getElementById('rate-fha').textContent = formatRate(personalizedRates['fha'].rate);
                document.getElementById('apr-fha').textContent = formatRate(personalizedRates['fha'].apr);
            } else {
                document.getElementById('rate-fha').textContent = 'N/A';
                document.getElementById('apr-fha').textContent = '—';
            }

            // Update timestamp
            const now = new Date();
            const timeString = now.toLocaleTimeString('en-US', { hour: 'numeric', minute: '2-digit' });
            const dateString = now.toLocaleDateString('en-US', { month: 'long', day: 'numeric', year: 'numeric' });
            
            document.getElementById('update-time').textContent = `Updated ${timeString}`;
            document.getElementById('disclaimer-date').textContent = dateString;

            // Show results
            document.getElementById('results').style.display = 'block';
        }

        // Auto-format currency inputs
        document.getElementById('loan-amount').addEventListener('blur', function() {
            const value = this.value.replace(/,/g, '');
            if (!isNaN(value) && value !== '') {
                this.value = formatCurrency(value);
            }
        });

        document.getElementById('down-payment').addEventListener('blur', function() {
            const value = this.value.replace(/,/g, '');
            if (!isNaN(value) && value !== '') {
                this.value = formatCurrency(value);
            }
        });

        // Initialize: Fetch live rates then calculate
        window.onload = async function() {
            await fetchRates();
        };
    </script>
</body>
</html>
### Setup & Tips:
- **Get API Key**: Free at [alphavantage.co/support/#api-key](https://www.alphavantage.co/support/#api-key). Replace `YOUR_API_KEY`.
- **How It Updates**: On page load, it fetches fresh data. Click "Refresh" for manual pulls. Rates update daily via the API.
- **Fallback**: If no key or API down, uses hardcoded rates (I updated them to match today's averages).
- **Limitations**: Free tier has call limits; for production, consider paid APIs like Freddie Mac or Mortgage News Daily.
- **Customization**: Add ZIP-based adjustments? Let me know—I can tweak for local rates via another endpoint.

This makes it **truly dynamic**! Test it out and ping if you hit snags.

The Real Marketing Club is a product brought to you by Get 100 Listings.


Member?

Log-In Here

Need Help?

Get Help Here

Want to Sign-Up?

Join the club here
Copyright 2025 -- Get 100 Listings, owners of the Real Marketing Club
Terms of Use  |  Privacy Policy
  • What's Included
  • Join
  • Start Marketing
    • AI
    • Facebook Certification Training >
      • Page Likes
    • Video Ads
    • Lead Ads >
      • Perfect System - All
    • Facebook Ad Images
    • 1000s of Free Videos Photos Music
    • Learning Center
    • Bonus Content >
      • Free Training Videos
  • Manage My Account
  • Help