name: integrations
description: "External data sources, connectors, and custom data streams"
emoji: "๐"
Integrations - Complete API Reference
Manage external data sources, add custom connectors, and plug in new data streams for trading bots.
Chat Commands
List Data Sources
/integrations List all data sources
/integrations status Show source health
/integrations sources Available source types
Manage Sources
/integrations enable fedwatch Enable CME FedWatch
/integrations disable 538 Disable FiveThirtyEight
/integrations add webhook "my-signals" Add custom webhook source
/integrations add rest "my-api" <url> Add REST API source
/integrations remove <source-id> Remove data source
Configure Sources
/integrations config fedwatch View source config
/integrations set fedwatch interval 60 Set refresh interval
/integrations set fedwatch key <api-key> Set API key
/integrations test <source-id> Test source connection
View Data
/integrations data fedwatch Latest data from source
/integrations history <source> --hours 24 Historical data
/integrations subscribe <source> Real-time updates
TypeScript API Reference
Create Integrations Manager
import { createIntegrationsManager } from 'clodds/integrations';
const integrations = createIntegrationsManager({
// Storage
storage: 'sqlite',
dbPath: './integrations.db',
// Default refresh interval
defaultIntervalMs: 60000,
// Retry settings
maxRetries: 3,
retryDelayMs: 5000,
});
Built-in Data Sources
// Enable built-in sources
await integrations.enable('fedwatch'); // CME FedWatch
await integrations.enable('538'); // FiveThirtyEight
await integrations.enable('silver'); // Silver Bulletin
await integrations.enable('rcp'); // RealClearPolitics
await integrations.enable('odds-api'); // The Odds API
await integrations.enable('polymarket'); // Polymarket prices
await integrations.enable('kalshi'); // Kalshi prices
await integrations.enable('binance'); // Binance spot prices
await integrations.enable('crypto'); // Multi-exchange crypto
Add Custom Webhook Source
// Add webhook to receive custom signals
const source = await integrations.addWebhook({
name: 'my-signals',
description: 'Custom trading signals',
// Webhook config
path: '/webhooks/my-signals',
secret: process.env.WEBHOOK_SECRET,
// Data schema (optional validation)
schema: {
type: 'object',
properties: {
signal: { type: 'string', enum: ['BUY', 'SELL', 'HOLD'] },
symbol: { type: 'string' },
confidence: { type: 'number', min: 0, max: 1 },
},
required: ['signal', 'symbol'],
},
// Transform incoming data
transform: (payload) => ({
signal: payload.signal,
symbol: payload.symbol,
confidence: payload.confidence || 0.5,
timestamp: Date.now(),
}),
});
console.log(`Webhook URL: ${source.url}`);
// POST to: https://your-domain.com/webhooks/my-signals
Add Custom REST Source
// Add REST API data source
const source = await integrations.addRest({
name: 'my-api',
description: 'Custom price API',
// API config
url: 'https://api.example.com/prices',
method: 'GET',
headers: {
'Authorization': `Bearer ${process.env.MY_API_KEY}`,
},
// Polling interval
intervalMs: 30000,
// Transform response
transform: (response) => ({
price: response.data.price,
volume: response.data.volume,
timestamp: Date.now(),
}),
});
Add WebSocket Source
// Add WebSocket data source
const source = await integrations.addWebSocket({
name: 'live-prices',
description: 'Real-time price feed',
// WebSocket config
url: 'wss://stream.example.com/prices',
// Message handlers
onMessage: (data) => ({
type: 'price',
symbol: data.s,
price: parseFloat(data.p),
timestamp: data.t,
}),
// Subscription message
subscribe: {
method: 'SUBSCRIBE',
params: ['btcusdt@trade'],
},
// Reconnect settings
reconnect: true,
reconnectIntervalMs: 5000,
});
Subscribe to Data
// Subscribe to real-time updates
integrations.subscribe('my-signals', (data) => {
console.log(`Signal: ${data.signal} ${data.symbol}`);
console.log(`Confidence: ${data.confidence}`);
if (data.signal === 'BUY' && data.confidence > 0.8) {
// Execute trade logic
}
});
// Subscribe to multiple sources
integrations.subscribeAll(['fedwatch', 'crypto', 'my-signals'], (source, data) => {
console.log(`[${source}] ${JSON.stringify(data)}`);
});
Get Latest Data
// Get current data from source
const fedData = await integrations.getData('fedwatch');
console.log('Fed Rate Probabilities:');
for (const meeting of fedData.meetings) {
console.log(`${meeting.date}: ${meeting.probabilities}`);
}
// Get with freshness check
const data = await integrations.getData('crypto', {
maxAgeMs: 60000, // Refetch if older than 60s
});
Check Status
// Get source status
const status = await integrations.getStatus('my-api');
console.log(`Status: ${status.status}`); // 'healthy' | 'degraded' | 'error'
console.log(`Last fetch: ${status.lastFetch}`);
console.log(`Last error: ${status.lastError}`);
console.log(`Fetch count: ${status.fetchCount}`);
console.log(`Error count: ${status.errorCount}`);
// Get all statuses
const all = await integrations.getAllStatuses();
Built-in Data Sources
| Source |
Type |
Data |
Refresh |
| fedwatch |
REST |
Fed rate probabilities |
5 min |
| 538 |
REST |
Election forecasts |
1 hour |
| silver |
REST |
Silver Bulletin forecasts |
1 hour |
| rcp |
REST |
Polling averages |
15 min |
| odds-api |
REST |
Sports betting odds |
1 min |
| polymarket |
WebSocket |
Market prices |
Real-time |
| kalshi |
WebSocket |
Market prices |
Real-time |
| binance |
WebSocket |
Crypto prices |
Real-time |
Custom Source Types
| Type |
Best For |
Latency |
| webhook |
External signals pushed to you |
Instant |
| rest |
APIs you poll periodically |
Seconds |
| websocket |
Real-time streaming data |
Milliseconds |
Using Data in Bots
import { createTradingBot } from 'clodds/trading';
import { createIntegrationsManager } from 'clodds/integrations';
const integrations = createIntegrationsManager();
const bot = createTradingBot();
// Use custom signals in bot strategy
integrations.subscribe('my-signals', async (signal) => {
if (signal.signal === 'BUY' && signal.confidence > 0.9) {
await bot.execute({
platform: 'polymarket',
market: signal.symbol,
side: 'YES',
size: 100 * signal.confidence,
});
}
});
// Use Fed data for macro bets
integrations.subscribe('fedwatch', async (data) => {
const cutProb = data.meetings[0].probabilities['25bp_cut'];
if (cutProb > 0.8) {
// High probability of rate cut
await bot.execute({
platform: 'kalshi',
market: 'fed-rate-cut',
side: 'YES',
size: 500,
});
}
});
Environment Variables
# Built-in sources
CME_FEDWATCH_API_KEY=your-key
FIVETHIRTYEIGHT_API_KEY=your-key
ODDS_API_KEY=your-key
# Custom sources
MY_SIGNALS_WEBHOOK_SECRET=your-secret
MY_API_KEY=your-key
Best Practices
- Validate incoming data โ Use schemas for webhooks
- Set appropriate intervals โ Don't poll too frequently
- Handle errors gracefully โ Sources will fail sometimes
- Monitor freshness โ Alert on stale data
- Transform consistently โ Normalize data formats
- Use WebSocket for latency โ When milliseconds matter