🚀 Netlify Functions for Dividend Calculator

Backend API functions to enable real-time stock data

✅ Ready to Deploy!
Your Polygon API key is pre-configured: CmtxQCorT6YemvATCf70pDlRRxQJVp6I

📋 Quick Deployment Steps

  1. Create folder structure:
    netlify/
    └── functions/
        ├── stock-data.js
        ├── stock-price.js
        ├── chart-data.js
        └── dividends.js
  2. Copy each function below into its respective .js file
  3. Deploy to Netlify: Drag folder to netlify.com
  4. Get URLs: Your functions will be at https://your-site.netlify.app/.netlify/functions/
  5. Update calculator: Replace BACKEND_API_URL and set USE_BACKEND = true
🔑 Your Polygon API Key: CmtxQCorT6YemvATCf70pDlRRxQJVp6I
📄 stock-data.js
exports.handler = async (event, context) => { const { symbol } = event.queryStringParameters; const POLYGON_API_KEY = 'CmtxQCorT6YemvATCf70pDlRRxQJVp6I'; // Handle CORS preflight if (event.httpMethod === 'OPTIONS') { return { statusCode: 200, headers: { 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Headers': 'Content-Type', 'Access-Control-Allow-Methods': 'GET, POST, OPTIONS', }, body: '', }; } if (!symbol) { return { statusCode: 400, headers: { 'Access-Control-Allow-Origin': '*', }, body: JSON.stringify({ error: 'Symbol parameter is required' }), }; } try { const response = await fetch( `https://api.polygon.io/v3/reference/tickers/${symbol}?apikey=${POLYGON_API_KEY}` ); if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); } const data = await response.json(); return { statusCode: 200, headers: { 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Headers': 'Content-Type', 'Content-Type': 'application/json', }, body: JSON.stringify(data), }; } catch (error) { console.error('Error fetching stock data:', error); return { statusCode: 500, headers: { 'Access-Control-Allow-Origin': '*', }, body: JSON.stringify({ error: 'Failed to fetch stock data', message: error.message }), }; } };
💰 stock-price.js
exports.handler = async (event, context) => { const { symbol } = event.queryStringParameters; const POLYGON_API_KEY = 'CmtxQCorT6YemvATCf70pDlRRxQJVp6I'; // Handle CORS preflight if (event.httpMethod === 'OPTIONS') { return { statusCode: 200, headers: { 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Headers': 'Content-Type', 'Access-Control-Allow-Methods': 'GET, POST, OPTIONS', }, body: '', }; } if (!symbol) { return { statusCode: 400, headers: { 'Access-Control-Allow-Origin': '*', }, body: JSON.stringify({ error: 'Symbol parameter is required' }), }; } try { const response = await fetch( `https://api.polygon.io/v2/aggs/ticker/${symbol}/prev?adjusted=true&apikey=${POLYGON_API_KEY}` ); if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); } const data = await response.json(); return { statusCode: 200, headers: { 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Headers': 'Content-Type', 'Content-Type': 'application/json', }, body: JSON.stringify(data), }; } catch (error) { console.error('Error fetching stock price:', error); return { statusCode: 500, headers: { 'Access-Control-Allow-Origin': '*', }, body: JSON.stringify({ error: 'Failed to fetch stock price', message: error.message }), }; } };
📈 chart-data.js
exports.handler = async (event, context) => { const { symbol, timespan, from, to } = event.queryStringParameters; const POLYGON_API_KEY = 'CmtxQCorT6YemvATCf70pDlRRxQJVp6I'; // Handle CORS preflight if (event.httpMethod === 'OPTIONS') { return { statusCode: 200, headers: { 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Headers': 'Content-Type', 'Access-Control-Allow-Methods': 'GET, POST, OPTIONS', }, body: '', }; } if (!symbol || !timespan || !from || !to) { return { statusCode: 400, headers: { 'Access-Control-Allow-Origin': '*', }, body: JSON.stringify({ error: 'Missing required parameters: symbol, timespan, from, to' }), }; } try { const response = await fetch( `https://api.polygon.io/v2/aggs/ticker/${symbol}/range/1/${timespan}/${from}/${to}?adjusted=true&sort=asc&apikey=${POLYGON_API_KEY}` ); if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); } const data = await response.json(); return { statusCode: 200, headers: { 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Headers': 'Content-Type', 'Content-Type': 'application/json', }, body: JSON.stringify(data), }; } catch (error) { console.error('Error fetching chart data:', error); return { statusCode: 500, headers: { 'Access-Control-Allow-Origin': '*', }, body: JSON.stringify({ error: 'Failed to fetch chart data', message: error.message }), }; } };
💎 dividends.js (Bonus Feature)
exports.handler = async (event, context) => { const { symbol } = event.queryStringParameters; const POLYGON_API_KEY = 'CmtxQCorT6YemvATCf70pDlRRxQJVp6I'; // Handle CORS preflight if (event.httpMethod === 'OPTIONS') { return { statusCode: 200, headers: { 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Headers': 'Content-Type', 'Access-Control-Allow-Methods': 'GET, POST, OPTIONS', }, body: '', }; } if (!symbol) { return { statusCode: 400, headers: { 'Access-Control-Allow-Origin': '*', }, body: JSON.stringify({ error: 'Symbol parameter is required' }), }; } try { // Get dividend data from Polygon const response = await fetch( `https://api.polygon.io/v3/reference/dividends?ticker=${symbol}&limit=10&apikey=${POLYGON_API_KEY}` ); if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); } const data = await response.json(); return { statusCode: 200, headers: { 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Headers': 'Content-Type', 'Content-Type': 'application/json', }, body: JSON.stringify(data), }; } catch (error) { console.error('Error fetching dividend data:', error); return { statusCode: 500, headers: { 'Access-Control-Allow-Origin': '*', }, body: JSON.stringify({ error: 'Failed to fetch dividend data', message: error.message }), }; } };

🎯 What These Functions Do

  • stock-data.js: Gets company info and market cap
  • stock-price.js: Gets current/previous day stock prices
  • chart-data.js: Gets historical data for charts
  • dividends.js: Gets dividend payment history
⚠️ Important: After deploying, update your dividend calculator's BACKEND_API_URL variable to point to your Netlify functions URL, and set USE_BACKEND = true

🔗 Next Steps

  1. Deploy these functions to Netlify
  2. Test your endpoints at https://your-site.netlify.app/.netlify/functions/stock-data?symbol=AAPL
  3. Update your dividend calculator with the new backend URL
  4. Enjoy real-time stock data for your retiree users! 🎉