Ever wanted to add stock price monitoring to your app? Maybe you're building a dashboard, a portfolio tracker, or just want to get notified when Tesla does something crazy again?
Here's how to add real-time stock monitoring to ANY JavaScript application using the StockAlert.pro API.
Installation
npm install @stockalert/sdk # or yarn add @stockalert/sdk
The 7-Line Version (I Wasn't Kidding)
import { StockAlertClient } from '@stockalert/sdk'; const client = new StockAlertClient({ apiKey: 'your-free-api-key' }); // Get notified when Apple hits $150 await client.alerts.create({ symbol: 'AAPL', condition: 'price_above', threshold: 150 });
That's it. You'll get an email when Apple hits $150. But let's build something more useful...
Real-World Example: Portfolio Dashboard
Let's build a portfolio monitoring system that tracks multiple stocks and sends you notifications when it's time to take profits or cut losses.
import { StockAlertClient } from '@stockalert/sdk'; const client = new StockAlertClient({ apiKey: process.env.STOCKALERT_API_KEY }); // Your portfolio const portfolio = [ { symbol: 'AAPL', shares: 100, buyPrice: 145 }, { symbol: 'GOOGL', shares: 50, buyPrice: 2800 }, { symbol: 'MSFT', shares: 75, buyPrice: 380 } ]; // Set up price alerts for your portfolio async function monitorPortfolio() { for (const position of portfolio) { // Alert when profit hits 10% await client.alerts.create({ symbol: position.symbol, condition: 'price_change_up', threshold: 10 // 10% gain }); // Alert when loss hits 5% (stop loss) await client.alerts.create({ symbol: position.symbol, condition: 'price_change_down', threshold: 5 // 5% loss }); console.log(`π Monitoring ${position.symbol}:`); console.log(` Alert when up 10% from current price`); console.log(` Alert when down 5% from current price`); } console.log('\nβ
All alerts created! You\'ll get emails when targets are hit.'); } // Start monitoring monitorPortfolio();
Working with Webhooks
Want to receive events in your app? Here's how to properly set up webhooks:
Pro tip: You can view and test all your webhooks at https://stockalert.pro/dashboard/settings
import crypto from 'crypto'; // Step 1: Register your webhook endpoint const webhook = await client.webhooks.create({ url: 'https://your-app.com/stockalert-webhook', events: ['alert.triggered'] }); console.log('Webhook secret:', webhook.secret); // Save this for verification! // Step 2: Create alerts (they'll send emails/SMS by default) const alert = await client.alerts.create({ symbol: 'AAPL', condition: 'price_above', threshold: 150 }); // Step 3: Handle webhook events when alerts trigger app.post('/stockalert-webhook', (req, res) => { const { event, timestamp, data } = req.body; // Verify webhook signature (recommended) const signature = req.headers['x-stockalert-signature']; const expectedSignature = crypto .createHmac('sha256', webhook.secret) .update(JSON.stringify(req.body)) .digest('hex'); if (signature !== expectedSignature) { return res.status(401).send('Invalid signature'); } if (event === 'alert.triggered') { console.log(`π¨ Alert triggered at ${timestamp}`); console.log(`Symbol: ${data.symbol}`); console.log(`Condition: ${data.condition} (threshold: ${data.threshold})`); console.log(`Current value: $${data.current_value}`); // Your custom logic here: update database, send Slack message, etc. } res.json({ received: true }); });
Building a Price Monitoring Slack Bot
Here's a Slack bot that lets your team monitor stocks:
import { StockAlertClient } from '@stockalert/sdk'; import { WebClient } from '@slack/web-api'; const stockAlert = new StockAlertClient({ apiKey: process.env.STOCKALERT_API_KEY }); const slack = new WebClient(process.env.SLACK_TOKEN); // Slack slash command: /watch AAPL above 150 app.post('/slack/commands', async (req, res) => { const { text, user_id, channel_id } = req.body; const [symbol, condition, value] = text.split(' '); // Create the alert const alert = await stockAlert.alerts.create({ symbol: symbol.toUpperCase(), condition: `price_${condition}`, threshold: parseFloat(value) }); // Store metadata in your database for webhook handling await saveAlertMetadata(alert.id, { channel_id, user_id }); res.json({ response_type: 'in_channel', text: `β
Watching ${symbol.toUpperCase()} to go ${condition} $${value}` }); }); // Handle the alert app.post('/slack-webhook', async (req, res) => { const { symbol, price, condition, metadata } = req.body; await slack.chat.postMessage({ channel: metadata.channel_id, text: `π¨ Alert: ${symbol} is now at $${price}!`, blocks: [{ type: 'section', text: { type: 'mrkdwn', text: `*${symbol}* hit your target price!\nCurrent: *$${price}*\nAlert by: <@${metadata.user_id}>` } }] }); res.json({ received: true }); });
Email Digest for Your Users
Building a fintech app? Here's how to use daily reminders to keep users informed:
import { StockAlertClient } from '@stockalert/sdk'; const client = new StockAlertClient({ apiKey: process.env.STOCKALERT_API_KEY }); // Set up daily reminders for user's watchlist async function setupDailyDigest(userEmail, watchlist) { for (const symbol of watchlist) { await client.alerts.create({ symbol: symbol, condition: 'daily_reminder' // Sends every market day at open with current price }); } } // Example: Set up for a user watching tech stocks await setupDailyDigest('user@example.com', ['AAPL', 'GOOGL', 'MSFT']);
What the user receives every market day:
Subject: Daily Reminder for AAPL: +1.24% Stock Alert: Daily Reminder for AAPL Daily Reminder: Apple Inc. Your daily market open summary for Apple Inc. (AAPL). Current price is $175.23. Alert Details Here is your daily update for Apple Inc. (AAPL), as of U.S. market open: βββββββββββββββββββββββββββ¬βββββββββββββββ β Current Price β $175.23 β β Previous Day's Close β $173.08 β β Change β +1.24% β β 52-Week High β $199.62 β β 52-Week Low β $164.08 β β Volume β 52,341,200 β βββββββββββββββββββββββββββ΄βββββββββββββββ --- Sent by StockAlert.pro
Each stock gets its own email with:
- Current price at market open
- Previous day's closing price
- Percentage change (color-coded: green/red)
- 52-week high and low
- Trading volume
- Proper currency formatting based on user location
Pro tip: For a consolidated digest, use webhooks to collect all alerts and send one combined email:
// Collect daily alerts via webhook const dailyAlerts = new Map(); app.post('/webhook', async (req, res) => { const { event, data } = req.body; if (event === 'alert.triggered' && data.condition === 'daily_reminder') { // Group by user (you'd need to track this in your DB) const userId = await getUserIdByAlertId(data.alert_id); if (!dailyAlerts.has(userId)) { dailyAlerts.set(userId, []); } dailyAlerts.get(userId).push({ symbol: data.symbol, price: data.current_value, timestamp: data.triggered_at }); // Send digest after collecting all morning alerts setTimeout(() => sendConsolidatedDigest(userId), 30000); } res.json({ received: true }); });
Advanced: Technical Indicators
Monitor RSI, Moving Averages, and more:
// Get notified when a stock becomes oversold await client.alerts.create({ symbol: 'TSLA', condition: 'rsi_limit', threshold: 30, // RSI below 30 = oversold parameters: { direction: 'below' // 'below' or 'above' } }); // Golden Cross alert (50-day MA crosses above 200-day MA) await client.alerts.create({ symbol: 'SPY', condition: 'ma_crossover_golden' }); // Price touches moving average await client.alerts.create({ symbol: 'AAPL', condition: 'ma_touch_above', parameters: { period: 50 // 50-day or 200-day moving average } });
Error Handling & Best Practices
class StockMonitor { constructor(apiKey) { this.client = new StockAlertClient({ apiKey }); this.alerts = new Map(); } async createAlert(config) { try { const alert = await this.client.alerts.create(config); this.alerts.set(alert.id, alert); console.log(`β
Alert created: ${alert.id}`); return alert; } catch (error) { if (error.code === 'RATE_LIMIT') { console.error('Rate limit hit, retrying in 60s...'); await sleep(60000); return this.createAlert(config); } if (error.code === 'INVALID_SYMBOL') { console.error(`Invalid symbol: ${config.symbol}`); return null; } throw error; } } async cleanup() { // Delete all alerts on shutdown for (const [id, alert] of this.alerts) { try { await this.client.alerts.delete(id); } catch (error) { console.error(`Failed to delete alert ${id}:`, error); } } } } // Graceful shutdown process.on('SIGTERM', async () => { await monitor.cleanup(); process.exit(0); });
Testing Your Integration
// Mock webhook endpoint for testing if (process.env.NODE_ENV === 'development') { app.post('/test-webhook', (req, res) => { console.log('Webhook received:', JSON.stringify(req.body, null, 2)); res.json({ received: true }); }); // Create a test alert await client.alerts.create({ symbol: 'AAPL', condition: 'price_above', threshold: 1 // Will trigger immediately }); // For webhook testing, first create a webhook endpoint: // const webhook = await client.webhooks.create({ // url: 'http://localhost:3000/test-webhook', // events: ['alert.triggered'] // }); }
Pricing
Free Plan includes:
- Monitor up to 50 stocks parallel
- Unlimited email alerts
- All 21 alert types
- 1 API key per user
- 100 API requests/hour
Premium Plan ($14.99/month or $149.99/year):
- Unlimited stocks
- 50 SMS/WhatsApp messages per month
- 10,000 API requests/hour
- Unlimited API keys
- Unlimited alerts via API
- Priority support
Perfect for testing with the free plan, then scale up when you need more power!
What Will You Build?
I've seen developers use this API to build:
- Portfolio tracking apps
- Discord/Slack bots
- Personal dashboards
- Trading journals
- News aggregators that react to price movements
- Chrome extensions for price monitoring
What are you planning to build? Drop a comment below!
Resources
- π Full API Documentation
- π§ npm Package
- π Python SDK
- π€ n8n Integration
- π¬ GitHub Discussions
Get your free API key at stockalert.pro - No credit card required
Top comments (0)