# Crypto Exchange Spread Scanner (`parselab/crypto-exchange-spread-scanner`) Actor

Compare crypto prices across 12 exchanges and find the best spreads. Uses real bid and ask prices, so each result shows where to buy and sell, the gross and fee-adjusted spread, order size at the top of the book and 24 hour volume. Filter by coin, exchange, volume and size. Export to CSV or Excel.

- **URL**: https://apify.com/parselab/crypto-exchange-spread-scanner.md
- **Developed by:** [ParseLab](https://apify.com/parselab) (community)
- **Categories:** Business, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $15.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## Crypto Exchange Spread Scanner

This crypto scanner compares prices for the same coin across 12 exchanges: Binance, Coinbase, Kraken, Bitstamp, OKX, KuCoin, Gate, MEXC, Bitget, HTX, Bitfinex and Crypto.com. It works with real bid and ask prices, not last trade prices, so every spread it reports is one you could actually see on the order book: you buy at the lowest ask on one exchange and sell at the highest bid on another.

Each result shows where to buy, where to sell, the gross spread, the spread after taker fees on both sides, the order size available at the top of the book, the estimated profit at that size and the 24 hour volume on both exchanges. Rows with a suspiciously large spread are flagged so you can check the quotes before you trust them.

Traders, market makers, analysts, researchers and bot builders use it to watch price differences between exchanges and to build price dashboards.

### What can you do with this crypto spread scanner?

- Find the biggest price differences for a coin across exchanges
- See where Bitcoin is cheapest to buy and most expensive to sell right now
- Rank spreads after fees, not before
- Filter out thin markets with a minimum 24 hour volume
- Filter out spreads you cannot trade with a minimum order size
- Compare the price of one coin on all 12 exchanges in a single row
- Get every ticker of every exchange with bid, ask, spread and volume
- Use your own fee tier for each exchange
- Watch USDT, USDC and USD pairs as one market
- Export crypto prices to CSV or Excel

### What data can you extract from the exchanges?

| Mode | One row is | Highlights |
|---|---|---|
| Best spreads | One coin | Buy exchange and pair, ask price and size, sell exchange and pair, bid price and size, gross spread, fees, net spread, tradable size, estimated profit, volume on both sides, venues compared, check flag |
| Price comparison | One coin | Prices on every exchange (bid, ask, last, volume), best bid and ask and where, average, lowest and highest mid price, dispersion, total volume |
| All tickers | One exchange and pair | Bid, ask, sizes, last price, spread, base and quote volume, 24 hour volume in USD, taker fee |

### How to scan crypto exchanges

1. Choose **Best spreads between exchanges**, **Price comparison** or **All tickers**.
2. Optionally enter coins such as BTC, ETH and SOL. Leave it empty to scan every coin.
3. Optionally choose exchanges, minimum volume and minimum order size.
4. Set **Max Items** and click **Start**.
5. Export the dataset as CSV, Excel or from the Apify console.

### Input example

```json
{
  "mode": "arbitrage",
  "coins": ["BTC", "ETH", "SOL"],
  "minVolumeUsd": 500000,
  "minNetSpreadPct": 0.05,
  "feeOverridesPct": { "binance": 0.075 },
  "maxItems": 50
}
```

### Best spreads output example

```json
{
  "base": "EGLD",
  "quote": "USD",
  "buyExchange": "mexc",
  "buyPair": "EGLDUSDT",
  "buyPrice": 3.738,
  "sellExchange": "okx",
  "sellPair": "EGLD-USDT",
  "sellPrice": 4.162,
  "sellSizeUsd": 376.42,
  "grossSpreadPct": 11.34,
  "buyFeePct": 0.05,
  "sellFeePct": 0.1,
  "netSpreadPct": 11.18,
  "maxTradeUsdAtTopOfBook": 376.42,
  "estimatedNetProfitUsdAtTopOfBook": 42.07,
  "buyVolumeUsd24h": 257392,
  "sellVolumeUsd24h": 152790,
  "venuesCompared": 6,
  "suspicious": true
}
```

Rows with a gross spread above 5 percent are marked as suspicious. Big spreads are usually stale quotes, thin markets, paused deposits or different assets under the same symbol.

### Price comparison output example

```json
{
  "base": "BTC",
  "quote": "USD",
  "venues": 12,
  "averageMid": 81336.81,
  "dispersionPct": 0.27,
  "bestBid": 81365,
  "bestBidExchange": "mexc",
  "bestAsk": 81305.84,
  "bestAskExchange": "htx",
  "totalVolumeUsd24h": 4863381471
}
```

### How much does it cost to scan crypto exchanges?

You pay per result: $20 per 1,000 rows plus a tiny start fee. The free plan returns up to 10 rows per run. With the default filters, one run of best spreads for all coins returns a few dozen rows. Loosen the filters to see more.

### Tips for better results

- Start with a minimum 24 hour volume of 100,000 dollars and a minimum order size of 100 dollars. Without them the top of the list is mostly thin markets.
- The spread you see is a snapshot. Prices move in seconds, so schedule the Actor often and read the timestamp on each row.
- Fees are the standard taker fee of a regular account. Enter your own tier in the fee overrides.
- Some exchanges do not publish order sizes in their public data. Their size fields are empty and they are not filtered by size.
- To compare only identical quote currencies, turn off the option that treats stablecoins as US dollars.

### Who uses exchange price data?

- **Traders** spot price gaps and liquidity differences.
- **Market makers** monitor where quotes are out of line.
- **Analysts** study how fast exchanges converge.
- **Developers** feed dashboards, alerts and bots.

### Automate and connect

Schedule the Actor every few minutes with the same settings and store each run to build a spread history. Send finished datasets to Google Sheets, Zapier, Make or n8n, or trigger a webhook when a run ends.

### FAQ

**Do I need an exchange account?**
No. The Actor reads public price data only.

**Does it trade for me?**
No. It only reads prices.

**Does the net spread include withdrawal and network fees?**
No. It includes only the trading fees on both exchanges. Moving coins between exchanges costs time and fees, and prices can change during the transfer. Trading on both sides needs balances on both exchanges.

**Why are some exchanges missing in a run?**
Some exchanges limit access from certain regions. Bybit is one of them, so it is not included by default. You can still ask for it by name and it is used when it answers. The Actor skips an exchange that does not answer and lists the status of every exchange in the run storage under EXCHANGE\_STATUS.

**Which coins are covered?**
All coins that trade against USDT, USDC or USD on at least two of the selected exchanges. Add other quote currencies such as EUR to compare them.

### Legal note

This Actor collects information that is publicly visible on the website. Check the source site's terms and your local rules before using the data. Nothing here is financial advice, and crypto trading carries a high risk of loss.

### Support

Missing a field or found a bug? Open an issue from the Actor page.

# Actor input Schema

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

Free users: Limited to 10 items (preview). Paid users: Optional, max 1,000,000.

## `mode` (type: `string`):

Spreads returns one row per coin with the best place to buy and the best place to sell. Price comparison returns one row per coin with the price on every exchange. All tickers returns one row per exchange and trading pair.

## `exchanges` (type: `array`):

Exchanges to compare. Leave empty for the 12 defaults: binance, coinbase, kraken, bitstamp, okx, kucoin, gate, mexc, bitget, htx, bitfinex, cryptocom. Bybit can be added by name but often refuses cloud connections.

## `coins` (type: `array`):

Coin symbols to compare, for example BTC, ETH, SOL. Leave empty to scan every coin listed on at least two exchanges.

## `quotes` (type: `array`):

Currencies the coins are priced in, for example USDT, USDC, USD, EUR. Pairs are compared only within the same group.

## `treatStablecoinsAsUsd` (type: `boolean`):

Compare USDT, USDC, USD, FDUSD and BUSD pairs as one group. Turn it off to compare only identical quote currencies.

## `minNetSpreadPct` (type: `number`):

Only show spreads that stay above this level after taker fees on both exchanges.

## `maxSpreadPct` (type: `number`):

Hide spreads above this level. Very large spreads are usually stale quotes, delisted coins or different assets.

## `minVolumeUsd` (type: `number`):

Skip exchanges where the pair traded less than this in the last 24 hours. Low volume pairs often have quotes you cannot really trade.

## `minTradeSizeUsd` (type: `number`):

Skip spreads where the order size shown at the best bid or ask is smaller than this. Exchanges that do not publish sizes are not filtered.

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

Net spread sorts by percentage after fees. Estimated profit sorts by the profit at the size available at the top of the book.

## `feeOverridesPct` (type: `object`):

Your own taker fee in percent for an exchange, for example {"binance": 0.075, "kraken": 0.26}. Exchanges not listed use the standard account fee.

## Actor input object example

```json
{
  "maxItems": 10,
  "mode": "arbitrage",
  "coins": [
    "BTC",
    "ETH",
    "SOL"
  ],
  "quotes": [
    "USDT",
    "USDC",
    "USD"
  ],
  "treatStablecoinsAsUsd": true,
  "minNetSpreadPct": 0,
  "maxSpreadPct": 30,
  "minVolumeUsd": 100000,
  "minTradeSizeUsd": 100,
  "sortBy": "netSpread"
}
```

# Actor output Schema

## `overview` (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": 10,
    "coins": [
        "BTC",
        "ETH",
        "SOL"
    ],
    "quotes": [
        "USDT",
        "USDC",
        "USD"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("parselab/crypto-exchange-spread-scanner").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": 10,
    "coins": [
        "BTC",
        "ETH",
        "SOL",
    ],
    "quotes": [
        "USDT",
        "USDC",
        "USD",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("parselab/crypto-exchange-spread-scanner").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": 10,
  "coins": [
    "BTC",
    "ETH",
    "SOL"
  ],
  "quotes": [
    "USDT",
    "USDC",
    "USD"
  ]
}' |
apify call parselab/crypto-exchange-spread-scanner --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,parselab/crypto-exchange-spread-scanner"
        }
    }
}
```

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/OKhmbCT6UdGftnfGL/builds/uREhetGdRK1e1oUcy/openapi.json
