
Market Index
- 13 installs
- 610 repo stars
- Updated June 26, 2026
- alsk1992/cloddsbot
market-index is a Claude Code skill that searches, discovers and browses prediction markets across multiple platforms from a local index.
About
market-index is a Claude Code skill that searches, discovers and browses prediction markets across platforms such as Polymarket, Kalshi, Manifold and Betfair. It supports full-text search, category browsing, volume filters and trending, new and closing-soon views, backed by a refreshable local index. A developer uses it to find and compare markets before trading.
- Searches and browses indexed markets across all prediction-market platforms
- Filters by platform, category, volume and active status, with trending and closing-soon views
- Refreshes and caches a local market index with per-platform and per-category stats
Market Index by the numbers
- 13 all-time installs (skills.sh)
- Ranked #759 of 1,106 Finance & Trading skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
market-index capabilities & compatibility
- Capabilities
- market search · market discovery · market indexing · category browse
- Use cases
- research · web search · trading
- Pricing
- Free
What market-index says it does
Search, discover, and browse markets across all prediction market platforms with advanced filtering and categorization.
Standard categories across platforms:
npx skills add https://github.com/alsk1992/cloddsbot --skill market-indexAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 13 |
|---|---|
| repo stars | ★ 610 |
| Last updated | June 26, 2026 |
| Repository | alsk1992/cloddsbot ↗ |
What it does
Search, filter and browse prediction markets across Polymarket, Kalshi, Manifold and Betfair from a local index.
Who is it for?
Searching and discovering prediction markets across platforms before trading.
When should I use this skill?
You want to find markets by keyword, category, volume or recency across platforms.
What you get
A unified, filterable index of markets across platforms with trending and closing-soon discovery.
- market search results
- category and trending listings
- market index stats
By the numbers
- 4 default platforms (polymarket, kalshi, manifold, betfair)
- 9 standard categories
- 5-minute default auto-refresh
Files
Market Index - Complete API Reference
Search, discover, and browse markets across all prediction market platforms with advanced filtering and categorization.
---
Chat Commands
Search
/index search "trump" # Search all indexed markets
/index search "election" --platform poly # Search specific platform
/index search "fed rate" --category finance # Filter by category
/index search "crypto" --min-volume 10000 # Min volume filter
/index search "sports" --active-only # Active markets onlyBrowse Categories
/index categories # List all categories
/index category politics # Browse politics markets
/index category crypto # Browse crypto markets
/index category sports # Browse sports markets
/index trending # Trending marketsMarket Discovery
/index new # Newly created markets
/index new --last 24h # Last 24 hours
/index hot # High activity markets
/index closing-soon # Markets ending soonIndex Management
/index update # Refresh market index
/index update poly # Update specific platform
/index stats # Index statistics
/index status # Index health status---
TypeScript API Reference
Create Market Index
import { createMarketIndex } from 'clodds/market-index';
const index = createMarketIndex({
platforms: ['polymarket', 'kalshi', 'manifold', 'betfair'],
// Auto-refresh
autoRefresh: true,
refreshIntervalMs: 300000, // 5 minutes
// Storage
cachePath: './market-index.db',
});Search Markets
// Full-text search
const results = await index.search('trump election', {
platforms: ['polymarket', 'kalshi'],
limit: 20,
sortBy: 'volume', // 'volume' | 'relevance' | 'endDate' | 'created'
});
for (const market of results) {
console.log(`[${market.platform}] ${market.question}`);
console.log(` Category: ${market.category}`);
console.log(` Volume: $${market.volume.toLocaleString()}`);
console.log(` End: ${market.endDate}`);
}
// With filters
const filtered = await index.search('', {
category: 'politics',
minVolume: 10000,
activeOnly: true,
endsBefore: '2024-12-31',
});Browse Categories
// Get all categories
const categories = await index.getCategories();
for (const cat of categories) {
console.log(`${cat.name}: ${cat.marketCount} markets`);
}
// Get markets in category
const politics = await index.getMarketsByCategory('politics', {
limit: 50,
sortBy: 'volume',
});Market Discovery
// Get new markets
const newMarkets = await index.getNewMarkets({
since: Date.now() - 24 * 60 * 60 * 1000, // Last 24h
limit: 20,
});
// Get trending/hot markets
const trending = await index.getTrendingMarkets({
period: '24h',
limit: 10,
});
for (const market of trending) {
console.log(`${market.question}`);
console.log(` Volume 24h: $${market.volume24h.toLocaleString()}`);
console.log(` Volume change: ${market.volumeChange > 0 ? '+' : ''}${market.volumeChange}%`);
}
// Markets closing soon
const closingSoon = await index.getClosingSoon({
within: '48h',
minVolume: 1000,
});Index Management
// Update index
await index.update();
// Update specific platform
await index.update('polymarket');
// Get index stats
const stats = await index.getStats();
console.log(`Total markets: ${stats.totalMarkets}`);
console.log(`By platform:`);
for (const [platform, count] of Object.entries(stats.byPlatform)) {
console.log(` ${platform}: ${count}`);
}
console.log(`By category:`);
for (const [category, count] of Object.entries(stats.byCategory)) {
console.log(` ${category}: ${count}`);
}
console.log(`Last updated: ${stats.lastUpdated}`);
// Check status
const status = await index.getStatus();
console.log(`Status: ${status.status}`);
console.log(`Markets indexed: ${status.marketCount}`);
console.log(`Index age: ${status.ageMinutes} minutes`);Get Single Market
// Get market details
const market = await index.getMarket('polymarket', 'market-123');
console.log(`Question: ${market.question}`);
console.log(`Description: ${market.description}`);
console.log(`Category: ${market.category}`);
console.log(`Platform: ${market.platform}`);
console.log(`Volume: $${market.volume.toLocaleString()}`);
console.log(`Liquidity: $${market.liquidity.toLocaleString()}`);
console.log(`Start: ${market.startDate}`);
console.log(`End: ${market.endDate}`);
console.log(`Outcomes: ${market.outcomes.join(', ')}`);---
Categories
Standard categories across platforms:
| Category | Description |
|---|---|
| politics | Elections, policy, government |
| crypto | Cryptocurrency prices, events |
| finance | Fed rates, stocks, economy |
| sports | Games, tournaments, awards |
| entertainment | Movies, TV, celebrities |
| science | Research, space, climate |
| technology | Tech companies, products |
| world | International events |
| other | Miscellaneous |
---
Search Syntax
| Syntax | Example | Description |
|---|---|---|
| Keywords | trump election | Match any word |
| Exact phrase | "federal reserve" | Match exact phrase |
| Exclude | election -trump | Exclude word |
| Platform filter | platform:poly | Specific platform |
| Category filter | category:politics | Specific category |
---
Sorting Options
| Option | Description |
|---|---|
volume | Highest volume first |
relevance | Best match first |
endDate | Ending soonest first |
created | Newest first |
liquidity | Highest liquidity first |
---
Best Practices
1. Refresh regularly - Markets change frequently 2. Use filters - Narrow down large result sets 3. Check liquidity - Not just volume 4. Monitor new markets - Opportunities in new listings 5. Track closing dates - Don't miss resolution
/**
* Market Index CLI Skill
*
* Commands:
* /markets search <query> - Search markets
* /markets trending - Trending markets
* /markets stats - Index statistics
* /markets sync - Force sync
* /markets browse [category] - Browse by category
*/
import { logger } from '../../../utils/logger';
function helpText(): string {
return `**Market Index Commands**
/markets search <query> - Search markets across all platforms
/markets stats - Index statistics (by platform)
/markets sync [--platform X] - Force sync from platforms
/markets browse [category] - Browse by category
**Examples:**
/markets search trump 2028
/markets stats
/markets sync --platform polymarket
/markets browse politics`;
}
async function execute(args: string): Promise<string> {
const parts = args.trim().split(/\s+/);
const cmd = parts[0]?.toLowerCase() || 'help';
try {
const { createDatabase } = await import('../../../db/index');
const { createEmbeddingsService } = await import('../../../embeddings/index');
const { createMarketIndexService } = await import('../../../market-index/index');
const db = createDatabase();
const embeddings = createEmbeddingsService(db);
const indexService = createMarketIndexService(db, embeddings);
switch (cmd) {
case 'search': {
const query = parts.slice(1).join(' ');
if (!query) return 'Usage: /markets search <query>\n\nExample: /markets search trump 2028';
const results = await indexService.search({ query, limit: 10 });
if (results.length === 0) {
return `**Search: "${query}"**\n\nNo markets found. Try running \`/markets sync\` first to populate the index.`;
}
let output = `**Search: "${query}"** (${results.length} results)\n\n`;
for (const r of results) {
const score = (r.score * 100).toFixed(1);
const platform = r.item.platform;
const status = r.item.status || 'unknown';
output += `[${platform}] ${r.item.question}\n`;
output += ` Status: ${status} | Score: ${score}%`;
if (r.item.url) output += ` | ${r.item.url}`;
output += '\n\n';
}
return output;
}
case 'trending': {
// Search for high-volume recent markets
const results = await indexService.search({ query: 'trending popular', limit: 10 });
if (results.length === 0) {
return '**Trending Markets**\n\nNo markets indexed yet. Run `/markets sync` first.';
}
let output = `**Trending Markets** (${results.length})\n\n`;
for (const r of results) {
output += `[${r.item.platform}] ${r.item.question}\n`;
if (r.item.volume24h) output += ` Volume 24h: $${r.item.volume24h.toLocaleString()}`;
if (r.item.liquidity) output += ` | Liquidity: $${r.item.liquidity.toLocaleString()}`;
output += '\n\n';
}
return output;
}
case 'stats': {
const stats = indexService.stats();
let output = `**Market Index Stats**\n\n`;
output += `Total indexed: ${stats.total}\n`;
output += `By platform:\n`;
for (const [platform, count] of Object.entries(stats.byPlatform)) {
output += ` ${platform}: ${count}\n`;
}
if (stats.lastSyncAt) {
output += `\nLast sync: ${stats.lastSyncAt.toISOString()}\n`;
if (stats.lastSyncIndexed !== undefined) output += `Last sync indexed: ${stats.lastSyncIndexed}\n`;
if (stats.lastSyncDurationMs !== undefined) output += `Duration: ${stats.lastSyncDurationMs}ms\n`;
if (stats.lastPruned) output += `Pruned: ${stats.lastPruned}\n`;
} else {
output += `\nLast sync: Never (run \`/markets sync\`)`;
}
return output;
}
case 'sync': {
const platformFlag = parts.indexOf('--platform');
const platforms = platformFlag >= 0 && parts[platformFlag + 1]
? [parts[platformFlag + 1] as 'polymarket' | 'kalshi' | 'manifold' | 'metaculus']
: undefined;
const syncMsg = platforms
? `Syncing ${platforms.join(', ')}...`
: 'Syncing all platforms (polymarket, kalshi, manifold, metaculus)...';
const result = await indexService.sync({ platforms });
let output = `**Market Index Sync Complete**\n\n${syncMsg}\n\n`;
output += `Total indexed: ${result.indexed}\n`;
output += `By platform:\n`;
for (const [platform, count] of Object.entries(result.byPlatform)) {
output += ` ${platform}: ${count}\n`;
}
return output;
}
case 'browse': {
const category = parts.slice(1).join(' ') || '';
if (!category) {
return '**Browse Markets**\n\nCategories: politics, crypto, sports, economics, science, entertainment, tech, weather\n\nUsage: /markets browse <category>';
}
const results = await indexService.search({ query: category, limit: 15 });
if (results.length === 0) {
return `**Browse: ${category}**\n\nNo markets found for this category. Try syncing first with \`/markets sync\`.`;
}
let output = `**Browse: ${category}** (${results.length} results)\n\n`;
for (const r of results) {
output += `[${r.item.platform}] ${r.item.question}\n`;
if (r.item.url) output += ` ${r.item.url}\n`;
output += '\n';
}
return output;
}
default:
return helpText();
}
} catch (error) {
return `Error: ${error instanceof Error ? error.message : String(error)}`;
}
}
export default {
name: 'market-index',
description: 'Search, discover, and browse indexed markets across all platforms',
commands: ['/markets', '/market-index'],
handle: execute,
};