# CoinGecko Coins API

Get live market data for cryptocurrencies listed on CoinGecko: price, market cap and rank, 24h volume, supply, all-time high and low, and 1h/24h/7d price changes, by coin id, by ticker, or as the top coins by market cap in any of 60+ currencies.

**Pricing:** $0.0015 per coin

**Endpoint:** `POST /v1/data/coingecko/coins/run`

**Auth:** `Authorization: Bearer mk_live_...`

## Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `coinIds` | array | No | CoinGecko coin ids, the last part of the coin page URL coingecko.com/en/coins/<id> (e.g. bitcoin, ethereum, jasmycoin). One row per coin found; an unknown id returns no row and is not billed. Not allowed with Tickers. |
| `symbols` | array | No | Coin tickers such as btc, eth, sol (any case). Each ticker returns its highest-ranked coin, so use Coin IDs when several coins share a ticker. Not allowed with Coin IDs. |
| `category` | string | No | CoinGecko category id, the last part of coingecko.com/en/categories/<id>, e.g. meme-token, layer-1, stablecoins. Returns the coins in that category by market cap. |
| `currency` | string | No | Currency for price, market cap, volume, highs and lows. USD by default. |
| `maxResults` | integer | No | How many coins to return in total, up to 1000. Defaults to 100; use 0 for all. |

## Example

`?wait=true` holds the request open until the run finishes (up to 60s) and returns the rows inline: one request, no polling.

```bash
curl -X POST "https://api.mindcase.co/v1/data/coingecko/coins/run?wait=true" \
  -H "Authorization: Bearer mk_live_YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"params":{}}'
```

```python
import requests

resp = requests.post(
    "https://api.mindcase.co/v1/data/coingecko/coins/run",
    params={"wait": "true"},
    headers={"Authorization": "Bearer mk_live_YOUR_API_KEY"},
    json={"params": {}},
)
rows = resp.json()["data"]
```

## Longer runs

If the run is still going at the 60s ceiling you get back `{ job_id, status: "running" }` instead of rows (same if the result is over 100 rows; those come back `truncated`). Poll with that `job_id`:

```bash
# 1) check status
curl https://api.mindcase.co/v1/jobs/JOB_ID \
  -H "Authorization: Bearer mk_live_YOUR_API_KEY"

# 2) when status == completed, fetch the rows
curl https://api.mindcase.co/v1/jobs/JOB_ID/results \
  -H "Authorization: Bearer mk_live_YOUR_API_KEY"
```

Full API reference (auth, jobs, balance, SDKs, MCP): https://mindcase.co/skills.md

## Response columns

| Field | Display name | Type |
|-------|--------------|------|
| `coinId` | Coin ID | text |
| `coinUrl` | Coin URL | url |
| `symbol` | Symbol | text |
| `name` | Name | text |
| `rank` | Rank | number |
| `price` | Price | currency |
| `currency` | Currency | text |
| `change1h` | Change 1h | percentage |
| `change24h` | Change 24h | percentage |
| `change7d` | Change 7d | percentage |
| `marketCap` | Market Cap | currency |
| `marketCapChange24h` | Market Cap Change 24h | percentage |
| `fdv` | FDV | currency |
| `volume24h` | Volume 24h | currency |
| `high24h` | High 24h | currency |
| `low24h` | Low 24h | currency |
| `circulatingSupply` | Circulating Supply | number |
| `totalSupply` | Total Supply | number |
| `maxSupply` | Max Supply | number |
| `ath` | ATH | currency |
| `athChangePct` | ATH Change Pct | percentage |
| `athDate` | ATH Date | datetime |
| `atl` | ATL | currency |
| `atlDate` | ATL Date | datetime |
| `image` | Image | image |
| `lastUpdated` | Last Updated | datetime |
