LISTINGAPISby marketmaker.cc
Public API — No Auth Required

REAL-TIME
LISTING API

Track new crypto listings and delistings across the exchanges we monitor in real time via SSE or WebSocket, or query the full historical archive via REST.

Base URL: https://api.listingapis.com
No authentication required
CORS enabled for browser use
Cache-Control: 30–300 s (ISR)

Real-Time Streaming

Server-Sent Events (SSE)

https://api.listingapis.com/api/public/stream

One-way persistent HTTP stream. Zero libraries required — works with a plain browser EventSource. Ideal for dashboards, lightweight bots, and monitoring tools.

JS Example
// Connect — optional filters: ?exchange=okx&type=listing
const es = new EventSource(
  "https://api.listingapis.com/api/public/stream?type=listing"
);

// "hello" fires once on connect
es.addEventListener("hello", e => console.log(JSON.parse(e.data)));

// "listing" fires per new detected listing
es.addEventListener("listing", e => {
  const listing = JSON.parse(e.data);
  console.log(listing.exchange, listing.symbol, listing.type);
});

// Server sends ": heartbeat <ts>" comments every ~25 s
// to keep the connection alive through proxies.

WebSocket

wss://api.listingapis.com/api/public/ws

Full-duplex persistent connection. Use when you need the same stream in a Node.js process, a trading bot, or a browser app that already uses WebSockets.

JS Example
// Connect — optional filters: ?exchange=okx&type=listing
const ws = new WebSocket(
  "wss://api.listingapis.com/api/public/ws?exchange=okx"
);

ws.onopen = () => console.log("connected");

ws.onmessage = e => {
  const msg = JSON.parse(e.data);
  if (msg.type === "hello") { /* handshake confirmed */ }
  if (msg.type === "ping")  { /* ~25 s keepalive     */ }
  if (msg.type === "listing") {
    const l = msg.data;          // see payload below
    console.log(l.exchange, l.symbol);
  }
};

gRPC (Bidirectional)

grpc.listingapis.com:443

Full-duplex bidirectional stream — the client streams subscribe/filter requests while the server streams listing events back. Best for low-latency native services in Go, Rust, Node, or Python. TLS on :443.

listing_stream.proto
syntax = "proto3";
package listingapis.v1;

service ListingStream {
  // Bidirectional: send SubscribeRequests, receive ListingEvents.
  rpc Subscribe (stream SubscribeRequest) returns (stream ListingEvent);
}

// Optional filters — same as SSE/WS. Empty = no filter.
message SubscribeRequest { string exchange = 1; string type = 2; }

message ListingEvent {
  int64 id = 1; string exchange = 2; string symbol = 3; string type = 4;
  string title = 5; string url = 6; string listed_at = 7;
  int64 detected_at = 8; string source = 9;
}
JS Example
// Node — TLS on :443. exchange / type filters are optional.
const client = new proto.listingapis.v1.ListingStream(
  "grpc.listingapis.com:443",
  grpc.credentials.createSsl()
);

const call = client.Subscribe();

// Stream subscribe/filter requests to the server
call.write({ exchange: "okx", type: "listing" });

// Server streams listing events back
call.on("data", e => console.log(e.exchange, e.symbol));

Streaming Payload

SSE — event: listing

Emitted when a new listing is detected. On connect you also receive event: hello. Heartbeat comments arrive every ~25 s.

// event: hello  (on connect)
{ "type": "hello", "channel": "listings", "ts": 1748736585000 }

// event: listing  (per new listing)
{
  "id": 52456,
  "exchange": "ascendex",
  "symbol": "APR",
  "type": "Listing",
  "title": "APR listed on AscendEX",
  "url": "https://...",
  "listedAt": "2026-06-02T10:00:00.000Z",
  "detectedAt": "2026-05-31T23:00:11.308Z",
  "source": "announcement"
}
WebSocket frames

Three frame types: hello on open, ping every ~25 s, and listing per event. Full detail via GET /api/public/listings/:id.

// on open
{ "type": "hello", "channel": "listings", "ts": 1748736585000 }

// keepalive (every ~25 s)
{ "type": "ping", "ts": 1748736610000 }

// new listing
{
  "type": "listing",
  "data": {
    "id": 52456,
    "exchange": "ascendex",
    "symbol": "APR",
    "type": "Listing",
    "listedAt": "2026-06-02T10:00:00.000Z",
    "source": "announcement"
  }
}
Optional stream filters

SSE and WebSocket accept the same optional query parameters; gRPC takes the equivalent exchange / type fields on each SubscribeRequest:

?exchange=okx

Filter to one exchange slug (e.g. okx, binance, bybit)

?type=listing

Filter by event type: listing, delisting, or warning

?exchange=binance&type=listing

Combine both filters (case-insensitive)

REST Endpoints

All responses are JSON, CORS-enabled, and carry a Cache-Control header (30–300 s). No API key needed.

GET/api/public/listings

Paginated listing feed. Query: page, limit (≤200), exchange, symbol, type (Listing|New Pair), search, date_from, date_to.

{
  "listings": [{
    "id": 52456,
    "exchange_slug": "ascendex",
    "exchange_name": "ascendex",
    "ticker_symbol": "APR",
    "listing_date": "2026-06-02T10:00:00.000Z",
    "pairs": [{"pair":"APR/USDT","url":""}],
    "type": "Listing",
    "status": "active"
  }],
  "total": 38630,
  "page": 1,
  "limit": 1,
  "totalPages": 38630,
  "metadata": {
    "total_listings": 38630,
    "listings_last_7_days": 672,
    "listings_last_30_days": 1920,
    "last_updated": "2026-06-01T22:29:45.249Z"
  }
}
GET/api/public/listings/:id

Single listing detail by numeric ID.

{ /* same shape as one item above */ }
GET/api/public/exchanges

All tracked exchanges with pair / ticker counts and 30-day listing activity.

{
  "metadata": {
    "total_pairs": 31279,
    "total_tickers": 8823,
    "total_exchanges": 326,
    "last_updated": "2026-06-01T16:00:00.430Z"
  },
  "exchanges": [{
    "id": 4,
    "name": "mexc",
    "slug": "mexc",
    "website": "",
    "logo_url": "",
    "pairs_count": 4702,
    "tickers_count": 3307,
    "listings_last_30_days": 186
  }]
}
GET/api/public/exchanges/:slug

Single exchange detail including recent listings.

{ /* exchange object + "listings" array */ }
GET/api/public/tickers

Full ticker universe sorted by listing frequency.

{
  "tickers": [{
    "symbol": "SOL",
    "full_name": "SOL",
    "logo_url": null,
    "listings_count": 87,
    "exchanges_count": 27,
    "last_listing_date": "2026-04-30T09:45:23.000Z",
    "first_listing_date": "2020-07-08T07:00:00.000Z"
  }],
  "metadata": {
    "total_tickers": 8823,
    "last_updated": "2026-06-01T16:00:00.490Z"
  }
}
GET/api/public/tickers/:symbol

Single ticker detail including all exchange listings.

{ /* ticker object + "listings" array */ }
GET/api/public/stats

Global pair/ticker/listing counts + activity windows (24h, 7d, 30d) + top active tickers and exchanges.

{
  "global_stats": {
    "total_pairs": 31279,
    "total_tickers": 8823,
    "total_listings": 38751,
    "total_exchanges": 326,
    "last_updated": "..."
  },
  "activity_stats": {
    "last_24_hours": { "new_listings": 228, "top_exchange": "WEEX" },
    "last_7_days":   { "new_listings": 531, "top_exchange": "WEEX" },
    "last_30_days":  { "new_listings": 1879, "top_exchange": "Ourbit" }
  }
}
GET/api/public/trends

Trending tickers and exchanges ranked by listing velocity (7d and 30d windows).

{
  "trending_tickers": { "last_7_days": [...], "last_30_days": [...] },
  "trending_exchanges": { "last_7_days": [...], "last_30_days": [...] }
}
GET/api/public/coverage

Exchange coverage progress: how many exchanges are tracked vs the total CCXT universe.

{
  "goal": 137, "covered": 108, "pct": 78.8,
  "totalExchanges": 326, "exchanges": [...], "pending": [...]
}
GET/api/public/coins

Full coin universe — all symbols with listing arrays. Good for large-scale search / autocomplete.

{ "coins": [{ "symbol": "BTC", "listings": [...] }] }
GET/api/health

Health check.

{ "status": "ok" }

Access

The public API at api.listingapis.com requires no API key and no registration. Just call the endpoints directly. Rate-limiting may apply to high-frequency polling — use the real-time stream endpoints instead for continuous monitoring.

# REST — no auth header needed

curl https://api.listingapis.com/api/public/listings?limit=10

# SSE — EventSource in browser or curl

curl -N https://api.listingapis.com/api/public/stream?type=listing

Need higher rate limits, guaranteed SLAs, or private access? Contact us at [email protected].