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.
https://api.listingapis.comReal-Time Streaming
Server-Sent Events (SSE)
https://api.listingapis.com/api/public/streamOne-way persistent HTTP stream. Zero libraries required — works with a plain browser EventSource. Ideal for dashboards, lightweight bots, and monitoring tools.
// 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/wsFull-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.
// 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:443Full-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.
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;
}// 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
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"
}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"
}
}SSE and WebSocket accept the same optional query parameters; gRPC takes the equivalent exchange / type fields on each SubscribeRequest:
?exchange=okxFilter to one exchange slug (e.g. okx, binance, bybit)
?type=listingFilter by event type: listing, delisting, or warning
?exchange=binance&type=listingCombine 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.
/api/public/listingsPaginated 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"
}
}/api/public/listings/:idSingle listing detail by numeric ID.
{ /* same shape as one item above */ }/api/public/exchangesAll 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
}]
}/api/public/exchanges/:slugSingle exchange detail including recent listings.
{ /* exchange object + "listings" array */ }/api/public/tickersFull 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"
}
}/api/public/tickers/:symbolSingle ticker detail including all exchange listings.
{ /* ticker object + "listings" array */ }/api/public/statsGlobal 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" }
}
}/api/public/trendsTrending 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": [...] }
}/api/public/coverageExchange coverage progress: how many exchanges are tracked vs the total CCXT universe.
{
"goal": 137, "covered": 108, "pct": 78.8,
"totalExchanges": 326, "exchanges": [...], "pending": [...]
}/api/public/coinsFull coin universe — all symbols with listing arrays. Good for large-scale search / autocomplete.
{ "coins": [{ "symbol": "BTC", "listings": [...] }] }/api/healthHealth 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=listingNeed higher rate limits, guaranteed SLAs, or private access? Contact us at [email protected].