| 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: 'sqlite',
dbPath: './integrations.db',
defaultIntervalMs: 60000,
maxRetries: 3,
retryDelayMs: 5000,
});
Built-in Data Sources
await integrations.enable('fedwatch');
await integrations.enable('538');
await integrations.enable('silver');
await integrations.enable('rcp');
await integrations.enable('odds-api');
await integrations.enable('polymarket');
await integrations.enable('kalshi');
await integrations.enable('binance');
await integrations.enable('crypto');
Add Custom Webhook Source
const source = await integrations.addWebhook({
name: 'my-signals',
description: 'Custom trading signals',
path: '/webhooks/my-signals',
secret: process.env.WEBHOOK_SECRET,
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: (payload) => ({
signal: payload.signal,
symbol: payload.symbol,
confidence: payload.confidence || 0.5,
timestamp: Date.now(),
}),
});
console.log(`Webhook URL: ${source.url}`);
Add Custom REST Source
const source = await integrations.addRest({
name: 'my-api',
description: 'Custom price API',
url: 'https://api.example.com/prices',
method: 'GET',
headers: {
'Authorization': `Bearer ${process.env.MY_API_KEY}`,
},
intervalMs: 30000,
transform: (response) => ({
price: response.data.price,
volume: response.data.volume,
timestamp: Date.now(),
}),
});
Add WebSocket Source
const source = await integrations.addWebSocket({
name: 'live-prices',
description: 'Real-time price feed',
url: 'wss://stream.example.com/prices',
onMessage: (data) => ({
type: 'price',
symbol: data.s,
price: parseFloat(data.p),
timestamp: data.t,
}),
subscribe: {
method: 'SUBSCRIBE',
params: ['btcusdt@trade'],
},
reconnect: true,
reconnectIntervalMs: 5000,
});
Subscribe to Data
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) {
}
});
integrations.subscribeAll(['fedwatch', 'crypto', 'my-signals'], (source, data) => {
console.log(`[${source}] ${JSON.stringify(data)}`);
});
Get Latest Data
const fedData = await integrations.getData('fedwatch');
console.log('Fed Rate Probabilities:');
for (const meeting of fedData.meetings) {
console.log(`${meeting.date}: ${meeting.probabilities}`);
}
const data = await integrations.getData('crypto', {
maxAgeMs: 60000,
});
Check Status
const status = await integrations.getStatus('my-api');
console.log(`Status: ${status.status}`);
console.log(`Last fetch: ${status.lastFetch}`);
console.log(`Last error: ${status.lastError}`);
console.log(`Fetch count: ${status.fetchCount}`);
console.log(`Error count: ${status.errorCount}`);
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();
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,
});
}
});
integrations.subscribe('fedwatch', async (data) => {
const cutProb = data.meetings[0].probabilities['25bp_cut'];
if (cutProb > 0.8) {
await bot.execute({
platform: 'kalshi',
market: 'fed-rate-cut',
side: 'YES',
size: 500,
});
}
});
Environment Variables
CME_FEDWATCH_API_KEY=your-key
FIVETHIRTYEIGHT_API_KEY=your-key
ODDS_API_KEY=your-key
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