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)