✅ Ready to Deploy!
Your Polygon API key is pre-configured:
Your Polygon API key is pre-configured:
CmtxQCorT6YemvATCf70pDlRRxQJVp6I
📋 Quick Deployment Steps
- Create folder structure:
netlify/ └── functions/ ├── stock-data.js ├── stock-price.js ├── chart-data.js └── dividends.js - Copy each function below into its respective .js file
- Deploy to Netlify: Drag folder to netlify.com
- Get URLs: Your functions will be at
https://your-site.netlify.app/.netlify/functions/ - 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
- Deploy these functions to Netlify
- Test your endpoints at
https://your-site.netlify.app/.netlify/functions/stock-data?symbol=AAPL - Update your dividend calculator with the new backend URL
- Enjoy real-time stock data for your retiree users! 🎉