# CoinMarketCap Listings (daily snapshot & new-coin alert) (`superslowsloth/coinmarketcap-listings`) Actor

CoinMarketCap's own ranking of every listed cryptocurrency: price, market cap, volume, supply, 1h-90d changes, tags, chain and listing date, in up to 10 currencies. Flags coins that are new since your last run.

- **URL**: https://apify.com/superslowsloth/coinmarketcap-listings.md
- **Developed by:** [Superslow Sloth](https://apify.com/superslowsloth) (community)
- **Categories:** Developer tools, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.70 / 1,000 coin row scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## CoinMarketCap Listings Scraper (daily snapshot & new-coin alert)

CoinMarketCap's own ranking of every listed cryptocurrency, one flat row per
coin: price, market cap, 24h volume, 1h / 24h / 7d / 30d / 60d / 90d change,
fully diluted market cap, circulating / total / max supply, CMC rank, number
of market pairs, tags, the chain a token lives on and its contract address,
auditors, and the date CMC listed it - in up to ten currencies at once.

Two jobs it is built for:

- **A daily market snapshot.** Read the top 100, the top 1,000 or the whole
  market (about 8,100 coins) in one run, sorted any of 17 ways.
- **A new-coin alert.** Sort by *Date added*, turn on *Only new coins*, and
  schedule it. Each run delivers - and charges for - only the coins that were
  not there last time. The same works for "what entered the top 500 today".

Data comes from the endpoint coinmarketcap.com's own ranking table uses
(`api.coinmarketcap.com/data-api/v3/cryptocurrency/listing`). No API key, no
CoinMarketCap account.

> We also publish **Crypto Market Data Scraper**, which reads CoinGecko. The
> two overlap on price and market cap; this one is CoinMarketCap's own
> ranking, ids and listing dates, which is what you want when you report
> against CMC or watch CMC for new listings.

### Input

| Field | Default | What it does |
|---|---|---|
| `sortBy` | `market_cap` | Which ranking to read: market cap, date added, price, volume 24h / 7d / 30d, % change 1h / 24h / 7d / 30d, fully diluted market cap, circulating / total / max supply, number of market pairs, name, symbol. Only sorts measured to return rows are offered - CoinMarketCap answers an unknown sort with an empty list rather than an error, so a typo is refused at input instead of becoming an empty run. |
| `sortDirection` | `desc` | `desc` = largest, newest or last-in-the-alphabet first. CMC's own `sortType` runs backwards for date added, name and symbol (`date_added` + `asc` is newest first on CMC); the actor corrects for it, so `desc` means the same thing for every sort. |
| `maxItems` | `100` | How many coins of the ranking to read, from the top, up to 10,000. Pages of 1,000 are fetched automatically. With `changesOnly`, this is the window that is checked. |
| `currency` | `USD` | Currency of the price, market cap, volume and %-change columns: 93 fiat currencies, gold (XAU), silver (XAG), platinum (XPT), BTC or ETH. |
| `extraCurrencies` | none | More currencies for the same coins, **at no extra charge**, under `other_quotes.<CODE>`. At most 10 currencies per run including the main one. |
| `changesOnly` | `false` | Deliver and charge only coins that are new since the previous run of the same search. See *Change tracking*. |
| `proxyConfiguration` | Apify datacenter | CoinMarketCap answered Apify datacenter exits normally when probed on 2026-10-05. A fresh address is taken before each retry. |

### Output

One row per coin, whatever number of currencies you ask for.

```
id                                CMC's numeric id (1 = Bitcoin) - stable, the de-dup key
name, symbol, slug
url                               https://coinmarketcap.com/currencies/<slug>/
cmc_rank                          CMC's market-cap rank
change                            "new" or "unchanged" since the last run of this search
quote_currency                    the currency of the columns below, e.g. "USD"
price
volume_24h
volume_change_24h                 % change of 24h volume vs the previous 24h
market_cap                        price x circulating supply
market_cap_by_total_supply        price x total supply
percent_change_1h / _24h / _7d / _30d / _60d / _90d
quote_last_updated                CMC's timestamp for this quote
fully_diluted_market_cap_usd      always USD (see below)
percent_change_1y_usd             always USD
ytd_price_change_percentage_usd   always USD
tvl_usd                           total value locked, DeFi protocols only, always USD
dominance                         % share of CMC's total crypto market cap
turnover                          24h volume / market cap
circulating_supply
self_reported_circulating_supply  the project's own, unverified claim
total_supply
max_supply
market_pair_count
is_active, is_audited
auditors                          e.g. ["CertiK", "Fairyproof"]
tags                              CMC's tags, e.g. ["defi", "ethereum-ecosystem"]
platform_name, platform_slug      the chain a token lives on; null for native coins
token_address                     the token's contract address on that chain
date_added                        when CMC listed the coin - sort on this for new coins
last_updated                      CMC's last update of the coin record
snapshot_at                       when CMC produced this response
other_quotes                      {"JPY": {price, volume_24h, market_cap, ...}, ...}
```

#### Why one row per coin, with the first currency flattened

A row per coin per currency would charge you twice for one coin and make every
join de-duplicate. So the main currency's numbers are real top-level columns -
sortable in the Apify table, one typed column each in CSV or a database - and
any extra currencies ride along in `other_quotes`, keyed by code, each holding
the same per-currency columns (`price`, `volume_24h`, `volume_change_24h`,
`market_cap`, `market_cap_by_total_supply`, `percent_change_1h` ... `_90d`,
`quote_last_updated`). Ask for one currency and `other_quotes` is `{}`.

#### Columns that are always USD

Measured on 2026-10-05: CoinMarketCap returns the **same number** for fully
diluted market cap, TVL, 1-year change and year-to-date change in every quote
currency - they are USD figures. Rather than print a USD number in a column
that claims to be JPY, those four are coin-level columns with `_usd` in the
name.

#### Nulls are real

- CoinMarketCap writes **`0`** where it has no figure for a supply, and for the
  market caps computed from one. On 2026-10-05, 3,969 of 8,124 coins had a
  circulating supply of 0 and a market cap of 0 - exactly the same coins,
  the ones CMC has not verified a supply for. A coin is not worth exactly $0,
  so those zeros are emitted as **`null`**: `circulating_supply`,
  `self_reported_circulating_supply`, `total_supply`, `max_supply`,
  `market_cap`, `market_cap_by_total_supply`, `fully_diluted_market_cap_usd`.
  Screening for "market cap under $1M" would otherwise pick up thousands of
  coins whose market cap is simply unknown.
- `max_supply` is null both for uncapped coins (Ethereum, Tether) and for
  coins CMC has no figure for. The source does not tell those two apart, so
  neither does the actor.
- `tvl_usd` is null except for the DeFi protocols CMC tracks it for;
  `turnover` is absent from the source for some coins and is null there.
- Volume, percent changes, TVL, dominance and turnover zeros are **passed
  through**: a coin really can trade nothing in 24 hours, and a share of the
  total market really can round to 0.0000.
- `dominance` is rounded by CMC to four decimals, so most small coins read
  0; it also reads 0 for wrapped and staked tokens, which CMC keeps out of its
  total.
- Wrapped and staked tokens are ranked at the bottom by CMC itself whatever
  their size - stETH was worth ~$26.6B and sat at rank 7,931 on 2026-10-05.
  `cmc_rank` is CMC's number, unchanged.

CMC's badge codes and its internal wrapped/staked rank are not emitted: they
are undocumented numbers with nothing a buyer could read them as.

### Change tracking

Every row carries `change`:

- `new` - this coin (by CMC id) was not in any previous run of the same search.
- `unchanged` - it was.

A "search" is the sort, the direction and `maxItems` - not the currency, which
changes the numbers but not which coins come back. Prices are deliberately
**not** compared: a market snapshot moves every run, so a price label would
mark every coin and bury the alert.

The memory lives in a named key-value store, `coinmarketcap-listings-watch`,
on **your** Apify account - nobody else can see it. **The first run has no
memory, so it labels every coin `new`** and, with `changesOnly`, delivers all
of them. From the second run on, `changesOnly` delivers only what is new.
Coins that drop out of the window and come back are not reported as new
again.

Recipes:

- *New listings:* `sortBy: date_added`, `sortDirection: desc`, `maxItems: 200`,
  `changesOnly: true`, scheduled daily.
- *Entered the top 500:* `sortBy: market_cap`, `maxItems: 500`,
  `changesOnly: true`.

### Pricing

Pay per event:

- **$0.0007 per coin** delivered (`quote-scraped`), charged after the row is
  written. Extra currencies are included in that one charge.
- **$0.002 per run** (`actor-start`), so a run that legitimately finds nothing
  new still covers its fixed cost.

The whole market in one currency is about $5.69 + $0.002. With `changesOnly`
you pay only for the new coins - a daily new-listings watch is typically a few
cents. Coins are de-duplicated by id before charging, so a coin CMC repeats
across a page boundary is paid for once. A run that fails on its own input
(an unknown sort or currency) is not charged at all.

### How it behaves

- Pages are fetched by absolute offset (`start`), 1,000 coins at a time;
  `limit` was measured honoured up to the whole market on 2026-10-05. The run
  stops at the first empty or short page or at CMC's own `totalCount`.
- HTTP 403, 429, 202 and 5xx, and an HTML challenge page served with 200, are
  treated as a refusal of the exit address: the request is retried from a
  fresh address (a new proxy session) with backoff. 400 / 404 and CMC's own
  "Invalid value" answers are permanent and not retried. A run refused on
  every attempt before reading a single coin ends as FAILED, not as an empty
  success.
- A single coin row that cannot be parsed is skipped, logged and never
  charged; the rest of the page and the run carry on.
- Every row carries CMC's `quote_last_updated` and the response's
  `snapshot_at`, unmodified - reason about freshness from those, not from
  the run's start time. CMC aggregates across exchanges; this is a research
  and monitoring feed, not an execution feed.

### Source

`https://api.coinmarketcap.com/data-api/v3/cryptocurrency/listing` - the
endpoint behind coinmarketcap.com's ranking table, verified unauthenticated
from an Apify datacenter exit and from a plain server on 2026-10-05.

# Actor input Schema

## `sortBy` (type: `string`):

Which CoinMarketCap ranking to read, before it is paged. Market cap gives the familiar top-coins table; Date added with direction Descending lists the newest listings first, which is what a new-coin watch wants. Only sorts measured to return rows are offered: CoinMarketCap answers an unknown sort with an empty list, not an error.

## `sortDirection` (type: `string`):

Descending = largest, newest, or last in the alphabet first. CoinMarketCap's own sortType runs backwards for date added, name and symbol; the actor corrects that, so Descending means the same thing for every sort.

## `maxItems` (type: `integer`):

How many coins of the ranking to read, from the top. The whole market is about 8,100 coins; pages of 1000 are fetched automatically. With 'Only new coins' on, this is the window that is checked - only the new coins in it are delivered and charged.

## `currency` (type: `string`):

The currency of the price, market cap, volume and percent-change columns. Fiat, gold (XAU), silver (XAG), platinum (XPT), BTC or ETH. Fully diluted market cap, TVL, 1-year and year-to-date change are always in USD - CoinMarketCap returns them in USD whatever currency is asked for - and their column names say so.

## `extraCurrencies` (type: `array`):

Optional. More currencies for the same coins, at no extra charge: each one appears under other_quotes.<CODE> with its own price, market cap, volume and percent changes. At most 10 currencies in total, including the main one.

## `changesOnly` (type: `boolean`):

Deliver and charge only coins that were not in the previous run of the same search (same sort, direction and max coins). The memory is kept in a named key-value store on your account. The FIRST run has no memory, so it labels every coin new and delivers them all; schedule it daily and later runs deliver just the coins that are new.

## `proxyConfiguration` (type: `object`):

Apify datacenter proxy by default, which CoinMarketCap answered normally when probed from Apify on 2026-10-05. A fresh address is taken before each retry.

## Actor input object example

```json
{
  "sortBy": "market_cap",
  "sortDirection": "desc",
  "maxItems": 100,
  "currency": "USD",
  "extraCurrencies": [],
  "changesOnly": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `coins` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "maxItems": 100,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("superslowsloth/coinmarketcap-listings").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "maxItems": 100,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("superslowsloth/coinmarketcap-listings").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "maxItems": 100,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call superslowsloth/coinmarketcap-listings --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,superslowsloth/coinmarketcap-listings"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/qAEsi0bwvl6rI7B90/builds/yvzB9yXQ74Iu0VUWJ/openapi.json
