New crypto listings screener development

We design and develop full-cycle blockchain solutions: from smart contract architecture to launching DeFi protocols, NFT marketplaces and crypto exchanges. Security audits, tokenomics, integration with existing infrastructure.
Showing 1 of 1All 1306 services
New crypto listings screener development
Medium
~3-5 days
Frequently Asked Questions

Blockchain Development Services

Blockchain Development Stages

Latest works

  • image_web-applications_feedme_466_0.webp
    Development of a web application for FEEDME
    1198
  • image_ecommerce_furnoro_435_0.webp
    Development of an online store for the company FURNORO
    1122
  • image_logo-advance_0.webp
    B2B Advance company logo design
    589
  • image_crm_enviok_479_0.webp
    Development of a web application for Enviok
    859
  • image_logo-aider_0.webp
    AIDER company logo development
    788
  • image_crm_chasseurs_493_0.webp
    CRM development for Chasseurs
    906

New Crypto Listings Screener Development

A new listings screener monitors the appearance of new trading pairs on major exchanges and filters them by specified criteria. This is a tool for finding momentum opportunities: new listings often show sharp growth in the first hours due to hype and liquidity inflow. Technically, the task involves: monitoring listing sources, parsing data, real-time alerts.

Listing Data Sources

Exchange APIs

Major exchanges provide REST APIs to get trading pair lists:

import asyncio
import httpx
from datetime import datetime

class ListingMonitor:
    EXCHANGES = {
        'binance': 'https://api.binance.com/api/v3/exchangeInfo',
        'bybit': 'https://api.bybit.com/v5/market/instruments-info?category=spot',
        'okx': 'https://www.okx.com/api/v5/public/instruments?instType=SPOT',
        'kucoin': 'https://api.kucoin.com/api/v1/symbols',
    }

    def __init__(self):
        self.known_pairs: dict[str, set] = {ex: set() for ex in self.EXCHANGES}

    async def check_new_listings(self, exchange: str) -> list[str]:
        url = self.EXCHANGES[exchange]
        async with httpx.AsyncClient() as client:
            response = await client.get(url, timeout=10)
            data = response.json()

        current_pairs = self.extract_pairs(exchange, data)
        new_pairs = current_pairs - self.known_pairs[exchange]

        if self.known_pairs[exchange]:  # not first run
            for pair in new_pairs:
                await self.on_new_listing(exchange, pair)

        self.known_pairs[exchange] = current_pairs
        return list(new_pairs)

    def extract_pairs(self, exchange: str, data: dict) -> set:
        if exchange == 'binance':
            return {s['symbol'] for s in data['symbols'] if s['status'] == 'TRADING'}
        elif exchange == 'bybit':
            return {s['symbol'] for s in data['result']['list'] if s['status'] == 'Trading'}
        elif exchange == 'okx':
            return {s['instId'] for s in data['data'] if s['state'] == 'live'}
        return set()

Monitoring Official Announcements

Exchanges publish listing announcements hours before trading begins. Monitoring RSS feeds and official pages:

class AnnouncementScraper:
    ANNOUNCEMENT_FEEDS = {
        'binance': 'https://www.binance.com/en/support/announcement/new-cryptocurrency-listing',
        'bybit': 'https://announcements.bybit.com/en-US/?category=new_crypto',
    }

    async def fetch_latest_announcements(self, exchange: str) -> list[Announcement]:
        # Use RSS or scraping with rate limiting
        url = self.ANNOUNCEMENT_FEEDS[exchange]
        html = await self.fetch_page(url)
        announcements = self.parse_listings(html, exchange)

        new_ones = [a for a in announcements if a.id not in self.seen_ids]
        self.seen_ids.update(a.id for a in new_ones)

        return new_ones

Binance announcements typically appear 1-4 hours before listing. This provides time for preparation.

Listing Filtering and Scoring

Scoring Algorithm

class ListingScorer:
    def score(self, listing: NewListing) -> ListingScore:
        score = 0
        signals = []

        # Exchange — larger platforms have higher pump potential
        exchange_weights = {'binance': 10, 'okx': 7, 'bybit': 7, 'kucoin': 5}
        score += exchange_weights.get(listing.exchange, 3)

        # Token category
        if listing.category in ['defi', 'ai', 'rwa']:
            score += 5
            signals.append(f"Trending sector: {listing.category}")

        # Multiple simultaneous listings
        if listing.simultaneous_exchanges >= 2:
            score += 8
            signals.append(f"Multi-exchange listing: {listing.simultaneous_exchanges} exchanges")

        # Futures pairs (usually listed after spot — institutional interest signal)
        if listing.has_futures:
            score += 5
            signals.append("Futures listing included")

        # Social activity (Twitter mentions in last 24h)
        if listing.twitter_mentions_24h > 10000:
            score += 4
            signals.append(f"High social activity: {listing.twitter_mentions_24h} mentions")

        # Market cap (if already trading on other exchanges)
        if listing.market_cap_usd:
            if listing.market_cap_usd < 50_000_000:
                score += 3  # small cap = higher growth potential
                signals.append("Small cap token")

        return ListingScore(
            listing=listing,
            score=score,
            signals=signals,
            grade='A' if score >= 20 else 'B' if score >= 12 else 'C'
        )

User Filters

interface ListingFilters {
  exchanges: string[];           // ['binance', 'bybit', 'okx']
  minScore: number;              // minimum score for alert
  categories: string[];          // ['defi', 'ai', 'gaming']
  minMarketCapUsd?: number;
  maxMarketCapUsd?: number;
  requireFutures: boolean;       // only if futures listing
  minSocialMentions?: number;
}

Real-time Alerts

class ListingAlertSystem:
    async def dispatch_alert(self, listing: NewListing, score: ListingScore, users: list):
        for user in users:
            if not self.matches_filters(listing, score, user.filters):
                continue

            # Telegram
            if user.telegram_enabled:
                message = self.format_telegram_message(listing, score)
                await self.telegram.send(user.telegram_chat_id, message)

            # Push notification
            if user.push_enabled:
                await self.push.send(user.push_token, {
                    'title': f"New listing: {listing.symbol}",
                    'body': f"{listing.exchange.upper()} • Score: {score.score} • {', '.join(score.signals[:2])}"
                })

    def format_telegram_message(self, listing: NewListing, score: ListingScore) -> str:
        grade_emoji = {'A': '🔥', 'B': '⚡', 'C': 'ℹ️'}.get(score.grade, '')
        return (
            f"{grade_emoji} **New listing: {listing.symbol}**\n\n"
            f"📊 Exchange: {listing.exchange.upper()}\n"
            f"⏰ Trading starts: {listing.trading_start.strftime('%H:%M UTC')}\n"
            f"💯 Score: {score.score}/30 (Grade {score.grade})\n\n"
            f"**Signals:**\n" + '\n'.join(f"• {s}" for s in score.signals) +
            f"\n\n[Trade]({listing.trading_url})"
        )

Frontend Listings Table

const ListingsTable: React.FC = () => {
  const [listings, setListings] = useState<Listing[]>([]);

  return (
    <table className="w-full">
      <thead>
        <tr>
          <th>Symbol</th>
          <th>Exchange</th>
          <th>Trading Starts</th>
          <th>Score</th>
          <th>Signals</th>
          <th>Action</th>
        </tr>
      </thead>
      <tbody>
        {listings.map(l => (
          <tr key={`${l.exchange}-${l.symbol}`}>
            <td className="font-bold">{l.symbol}</td>
            <td>{l.exchange.toUpperCase()}</td>
            <td>{formatDistanceToNow(l.tradingStart, {addSuffix: true})}</td>
            <td>
              <span className={`badge ${l.grade === 'A' ? 'bg-green-100 text-green-800' : 'bg-gray-100'}`}>
                {l.score}
              </span>
            </td>
            <td className="text-sm text-gray-600">{l.signals.slice(0,2).join(', ')}</td>
            <td>
              <a href={l.url} target="_blank" className="btn btn-sm">Open</a>
            </td>
          </tr>
        ))}
      </tbody>
    </table>
  );
};

A listings screener is competitive advantage for active traders. It's important to monitor not just spot, but futures listings, as well as DEX listings (via Uniswap/PancakeSwap event monitoring) — opportunities appear there even earlier, before tokens reach centralized exchanges.