# Crypto and on-chain

Token details and risk flags, plus staking and lending yields.

## Token metadata

GET `/v1/tokens` 

 1 credit per instrument 2 credits with fresh=true Operation ID `crypto.tokens`

Chain, contract, decimals, supply, logo and the verified flag of tokens addressed by contract, like SOLANA:EPjF...Dt1v.

### Query parameters

- `symbols` array of strings Required  
Comma-separated identifiers, up to 100, like ASX:VAS, isin:AU000000VAS1 or ins\_...  
Up to 100 items
- `listedOn` date  
Resolves tickers as the listing that traded on this day, for tickers that have since been reused. A symbol can carry its own day instead, like ASX:CCL@2021-05-10, which overrides this
- `fresh` boolean  
Skip our cache and get the latest data. Items refreshed this way cost double
- `format` string  
Response format  
One of `json` `csv`  
Defaults to json

### Response

- `data` array of objects  

  - `asOf` timestamp  
  The point in time this data describes. For history and events it's the date of the newest record, or the end of your range when there are none. Live values give when they were observed, and reference data gives when we last confirmed it
  - `chain` string  
  A chain id from /v1/chains
  - `contract` string
  - `decimals` integer or null
  - `graduated` boolean  
  On launchpad tokens, whether the token has left its launchpad's bonding curve for a real pool
  - `instrument` object  
  What the symbol resolved to

    - `country` string
    - `currency` string
    - `id` string
    - `mic` string  
      Left out for instruments that don't trade on an exchange, like tokens
    - `name` string
    - `symbol` string
    - `ticker` string or null  
      The code it's known by, like a listing's ticker, a token's symbol or an unlisted fund's APIR code. Null when it has none
    - `type` string  
      One of `equity` `etf` `fund` `index` `fx` `crypto` `token` `rate` `future` `commodity` `bond` `nft` `option` `warrant`
  - `launchpad` string  
  Where the token launched, only on launchpad tokens
  - `logo` string or null
  - `supply` string or null  
  Total supply as a raw on-chain integer, divide by 10^decimals for whole tokens
  - `symbol` string  
  The symbol as sent
  - `verified` boolean or null
- `errors` array of objects  

  - `code` string  
  One of `invalid_symbol` `instrument_not_found` `not_supported` `data_unavailable` `data_pending` `data_failed`
  - `message` string
  - `symbol` string
- `meta` object  

  - `credits` integer  
  Credits this call cost
  - `requestId` string

### Errors

`400` Bad Request`401` Unauthorized`402` Payment Required`403` Forbidden`422` Unprocessable Entity`429` Too Many Requests`500` Internal Server Error`503` Service Unavailable

Every error body is problem+json with a stable `code`. See [errors](https://quova.io/docs/index.md#errors).

```shell
curl "https://api.quova.io/v1/tokens?symbols=SOLANA:EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v,ETHEREUM:0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48" \
  -H "Authorization: Bearer $QUOVA_API_KEY"
```

Response 

 200 OK 

```json
{
  "data": [
    {
      "symbol": "SOLANA:EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
      "instrument": {
        "id": "ins_34VNCBvAgkz8ftf185Xn1",
        "symbol": "SOLANA:EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
        "name": "USD Coin",
        "type": "token",
        "currency": "USD"
      },
      "asOf": "2026-09-26T09:51:36.528443Z",
      "chain": "solana",
      "contract": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
      "decimals": 6,
      "supply": "8522580004981827",
      "logo": "https://api.quova.io/v1/logos?id=ins_34VNCBvAgkz8ftf185Xn1&v=1a25a22679",
      "verified": true
    },
    {
      "symbol": "ETHEREUM:0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
      "instrument": {
        "id": "ins_34VNCBttukTl0QVoIjG8T",
        "symbol": "ETHEREUM:0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
        "name": "USDC",
        "type": "token",
        "currency": "USD"
      },
      "asOf": "2026-09-26T06:36:38.043098Z",
      "chain": "ethereum",
      "contract": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
      "decimals": 6,
      "supply": "50213707119443759",
      "logo": "https://api.quova.io/v1/logos?id=ins_34VNCBttukTl0QVoIjG8T&v=1a25a22679",
      "verified": true
    }
  ],
  "errors": [],
  "meta": {
    "credits": 2,
    "requestId": "req_34VoxwoNZywCB7yTGTDSS"
  }
}
```

## Token risk flags

GET `/v1/tokens/risk` 

 5 credits per instrument 10 credits with fresh=true Operation ID `crypto.risk`

Spam and scam flags on tokens, each with the reason behind it, and a score from 0 for no known risk to 100 for a certain scam. Flag codes never change meaning, so they're safe to filter on.

### Query parameters

- `symbols` array of strings Required  
Comma-separated identifiers, up to 100, like ASX:VAS, isin:AU000000VAS1 or ins\_...  
Up to 100 items
- `listedOn` date  
Resolves tickers as the listing that traded on this day, for tickers that have since been reused. A symbol can carry its own day instead, like ASX:CCL@2021-05-10, which overrides this
- `fresh` boolean  
Skip our cache and get the latest data. Items refreshed this way cost double
- `format` string  
Response format  
One of `json` `csv`  
Defaults to json

### Response

- `data` array of objects  

  - `asOf` timestamp  
  The point in time this data describes. For history and events it's the date of the newest record, or the end of your range when there are none. Live values give when they were observed, and reference data gives when we last confirmed it
  - `assessedAt` timestamp
  - `flags` array of objects  

    - `flag` string  
      One of `honeypot` `mintable` `freezable` `blacklist` `pausable` `upgradeable` `owner_control` `high_tax` `low_liquidity` `unlocked_liquidity` `concentrated_holders` `closed_source` `impersonator` `spam`
    - `reason` string
  - `instrument` object  
  What the symbol resolved to

    - `country` string
    - `currency` string
    - `id` string
    - `mic` string  
      Left out for instruments that don't trade on an exchange, like tokens
    - `name` string
    - `symbol` string
    - `ticker` string or null  
      The code it's known by, like a listing's ticker, a token's symbol or an unlisted fund's APIR code. Null when it has none
    - `type` string  
      One of `equity` `etf` `fund` `index` `fx` `crypto` `token` `rate` `future` `commodity` `bond` `nft` `option` `warrant`
  - `score` number  
  0 for no known risk up to 100 for a certain scam
  - `symbol` string  
  The symbol as sent
- `errors` array of objects  

  - `code` string  
  One of `invalid_symbol` `instrument_not_found` `not_supported` `data_unavailable` `data_pending` `data_failed`
  - `message` string
  - `symbol` string
- `meta` object  

  - `credits` integer  
  Credits this call cost
  - `requestId` string

### Errors

`400` Bad Request`401` Unauthorized`402` Payment Required`403` Forbidden`422` Unprocessable Entity`429` Too Many Requests`500` Internal Server Error`503` Service Unavailable

Every error body is problem+json with a stable `code`. See [errors](https://quova.io/docs/index.md#errors).

```shell
curl "https://api.quova.io/v1/tokens/risk?symbols=SOLANA:EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v,ETHEREUM:0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48" \
  -H "Authorization: Bearer $QUOVA_API_KEY"
```

Response 

 200 OK 

```json
{
  "data": [
    {
      "symbol": "SOLANA:EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
      "instrument": {
        "id": "ins_34VNCBvAgkz8ftf185Xn1",
        "symbol": "SOLANA:EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
        "name": "USD Coin",
        "type": "token",
        "currency": "USD"
      },
      "asOf": "2026-09-27T00:29:59.025837Z",
      "score": 1,
      "flags": [],
      "assessedAt": "2026-09-27T00:29:59.025837Z"
    },
    {
      "symbol": "ETHEREUM:0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
      "instrument": {
        "id": "ins_34VNCBttukTl0QVoIjG8T",
        "symbol": "ETHEREUM:0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
        "name": "USDC",
        "type": "token",
        "currency": "USD"
      },
      "asOf": "2026-09-27T01:13:58.027343Z",
      "score": 1,
      "flags": [
        {
          "flag": "upgradeable",
          "reason": "The contract is a proxy whose code can be replaced"
        }
      ],
      "assessedAt": "2026-09-27T01:13:58.027343Z"
    }
  ],
  "errors": [],
  "meta": {
    "credits": 10,
    "requestId": "req_34VoxwolxEVKdYMpMiKSQ"
  }
}
```

## Yield pools

GET `/v1/yields` 

 1 credit per page 2 credits with fresh=true Operation ID `yields.pools`

Staking, lending and liquidity pools with their size and yield, largest first. APYs are percentages, 3.2 for 3.2%.

### Query parameters

- `chain` string  
A chain id or alias from /v1/chains  
Up to 32 characters
- `protocol` string  
A protocol slug  
Up to 64 characters
- `asset` string  
A token in the pool's symbol like ETH, or an underlying token contract  
Up to 128 characters
- `cursor` string  
From meta.nextCursor of the previous page  
Up to 512 characters
- `limit` integer  
Page size  
From 1 to 1000\. Defaults to 100
- `fresh` boolean  
Skip our cache and get the latest data. Items refreshed this way cost double
- `format` string  
Response format  
One of `json` `csv`  
Defaults to json

### Response

- `data` array of objects  

  - `apy` number or null  
  Total yearly yield, the sum of apyBase and apyReward when both are known
  - `apyBase` number or null  
  Yield from the pool's own activity, like fees or interest
  - `apyReward` number  
  Yield paid in incentive tokens, only on pools that pay them
  - `chain` string
  - `currency` string  
  Currency of tvl
  - `id` string  
  Chain, protocol and the pool's own reference, for /v1/yields/history
  - `protocol` string
  - `symbol` string
  - `tvl` number or null  
  Total value locked
  - `underlying` array of strings  
  Contracts of the tokens the pool holds
- `meta` object  

  - `credits` integer  
  Credits this call cost
  - `nextCursor` string or null  
  Pass as cursor to get the next page, null on the last page
  - `requestId` string

### Errors

`400` Bad Request`401` Unauthorized`402` Payment Required`403` Forbidden`422` Unprocessable Entity`429` Too Many Requests`500` Internal Server Error`503` Service Unavailable

Every error body is problem+json with a stable `code`. See [errors](https://quova.io/docs/index.md#errors).

```shell
curl "https://api.quova.io/v1/yields?chain=ethereum&protocol=lido" \
  -H "Authorization: Bearer $QUOVA_API_KEY"
```

Response 

 200 OK 

```json
{
  "data": [
    {
      "id": "ethereum:lido:STETH-41172a39006e",
      "chain": "ethereum",
      "protocol": "lido",
      "symbol": "STETH",
      "underlying": [
        "0x0000000000000000000000000000000000000000"
      ],
      "currency": "USD",
      "tvl": 26382770167,
      "apy": 2.2,
      "apyBase": 2.2
    }
  ],
  "meta": {
    "credits": 1,
    "requestId": "req_34Voy3xKRVDRIDztEO1wJ",
    "nextCursor": null
  }
}
```

## Pool yield history

GET `/v1/yields/history` 

 1 credit per pool 2 credits with fresh=true Operation ID `yields.history`

Each pool's daily size and yield, as of the end of each UTC day. History length doesn't change the price.

### Query parameters

- `pool` array of strings Required  
Comma-separated pool ids from /v1/yields, up to 100  
Up to 100 items
- `from` date  
First day, YYYY-MM-DD
- `to` date  
Last day, YYYY-MM-DD
- `fresh` boolean  
Skip our cache and get the latest data. Items refreshed this way cost double
- `format` string  
Response format  
One of `json` `csv`  
Defaults to json

### Response

- `data` array of objects  

  - `asOf` timestamp  
  The point in time this data describes. For history and events it's the date of the newest record, or the end of your range when there are none. Live values give when they were observed, and reference data gives when we last confirmed it
  - `currency` string  
  Currency of tvl
  - `points` array of objects  

    - `apy` number or null  
      Total yearly yield, the sum of apyBase and apyReward when both are known
    - `apyBase` number or null  
      Yield from the pool's own activity, like fees or interest
    - `apyReward` number  
      Yield paid in incentive tokens, only on pools that pay them
    - `date` date
    - `tvl` number or null  
      Total value locked
  - `pool` string  
  The pool id as sent
- `errors` array of objects  

  - `code` string  
  One of `invalid_symbol` `instrument_not_found` `not_supported` `data_unavailable` `data_pending` `data_failed`
  - `message` string
  - `pool` string
- `meta` object  

  - `credits` integer  
  Credits this call cost
  - `requestId` string

### Errors

`400` Bad Request`401` Unauthorized`402` Payment Required`403` Forbidden`422` Unprocessable Entity`429` Too Many Requests`500` Internal Server Error`503` Service Unavailable

Every error body is problem+json with a stable `code`. See [errors](https://quova.io/docs/index.md#errors).

```shell
curl "https://api.quova.io/v1/yields/history?pool=ethereum:lido:STETH-41172a39006e,ethereum:sky-lending:SUSDS-7265a2c2a78f&from=2026-06-01&to=2026-06-30" \
  -H "Authorization: Bearer $QUOVA_API_KEY"
```

Response 

 200 OK 

```json
{
  "data": [
    {
      "pool": "ethereum:lido:STETH-41172a39006e",
      "asOf": "2026-06-30T00:00:00Z",
      "currency": "USD",
      "points": [
        {
          "date": "2026-06-01",
          "tvl": 17762577659,
          "apy": 2.388,
          "apyBase": 2.388
        },
        {
          "date": "2026-06-02",
          "tvl": 16478199646,
          "apy": 2.412,
          "apyBase": 2.412
        },
        {
          "date": "2026-06-03",
          "tvl": 16202195170,
          "apy": 2.513,
          "apyBase": 2.513
        },
        {
          "date": "2026-06-04",
          "tvl": 15626514880,
          "apy": 2.562,
          "apyBase": 2.562
        },
        {
          "date": "2026-06-05",
          "tvl": 14206498779,
          "apy": 2.719,
          "apyBase": 2.719
        },
        {
          "date": "2026-06-06",
          "tvl": 13823135498,
          "apy": 3.115,
          "apyBase": 3.115
        },
        {
          "date": "2026-06-07",
          "tvl": 14956602045,
          "apy": 2.377,
          "apyBase": 2.377
        },
        {
          "date": "2026-06-08",
          "tvl": 15130075813,
          "apy": 2.584,
          "apyBase": 2.584
        },
        {
          "date": "2026-06-09",
          "tvl": 14677139953,
          "apy": 2.569,
          "apyBase": 2.569
        },
        {
          "date": "2026-06-10",
          "tvl": 14432532129,
          "apy": 2.394,
          "apyBase": 2.394
        },
        {
          "date": "2026-06-11",
          "tvl": 14970106508,
          "apy": 2.408,
          "apyBase": 2.408
        },
        {
          "date": "2026-06-12",
          "tvl": 14807286475,
          "apy": 2.378,
          "apyBase": 2.378
        },
        {
          "date": "2026-06-13",
          "tvl": 15015494570,
          "apy": 2.35,
          "apyBase": 2.35
        },
        {
          "date": "2026-06-14",
          "tvl": 15505224123,
          "apy": 2.313,
          "apyBase": 2.313
        },
        {
          "date": "2026-06-15",
          "tvl": 16113899327,
          "apy": 2.337,
          "apyBase": 2.337
        },
        {
          "date": "2026-06-16",
          "tvl": 16117261752,
          "apy": 2.39,
          "apyBase": 2.39
        },
        {
          "date": "2026-06-17",
          "tvl": 15667047206,
          "apy": 2.386,
          "apyBase": 2.386
        },
        {
          "date": "2026-06-18",
          "tvl": 15305730965,
          "apy": 2.386,
          "apyBase": 2.386
        },
        {
          "date": "2026-06-19",
          "tvl": 15338029118,
          "apy": 2.387,
          "apyBase": 2.387
        },
        {
          "date": "2026-06-20",
          "tvl": 15701531712,
          "apy": 2.303,
          "apyBase": 2.303
        },
        {
          "date": "2026-06-21",
          "tvl": 15487931957,
          "apy": 2.284,
          "apyBase": 2.284
        },
        {
          "date": "2026-06-22",
          "tvl": 15527664061,
          "apy": 2.327,
          "apyBase": 2.327
        },
        {
          "date": "2026-06-23",
          "tvl": 15077100756,
          "apy": 2.373,
          "apyBase": 2.373
        },
        {
          "date": "2026-06-24",
          "tvl": 14730562437,
          "apy": 2.283,
          "apyBase": 2.283
        },
        {
          "date": "2026-06-25",
          "tvl": 14196961284,
          "apy": 2.379,
          "apyBase": 2.379
        },
        {
          "date": "2026-06-26",
          "tvl": 14274469752,
          "apy": 2.634,
          "apyBase": 2.634
        },
        {
          "date": "2026-06-27",
          "tvl": 14205871643,
          "apy": 2.321,
          "apyBase": 2.321
        },
        {
          "date": "2026-06-28",
          "tvl": 14203219609,
          "apy": 2.238,
          "apyBase": 2.238
        },
        {
          "date": "2026-06-29",
          "tvl": 14717062801,
          "apy": 2.261,
          "apyBase": 2.261
        },
        {
          "date": "2026-06-30",
          "tvl": 14345735997,
          "apy": 2.317,
          "apyBase": 2.317
        }
      ]
    },
    {
      "pool": "ethereum:sky-lending:SUSDS-7265a2c2a78f",
      "asOf": "2026-06-30T00:00:00Z",
      "currency": "USD",
      "points": [
        {
          "date": "2026-06-01",
          "tvl": 6151999721,
          "apy": 3.6,
          "apyBase": 3.6
        },
        {
          "date": "2026-06-02",
          "tvl": 6106660395,
          "apy": 3.6,
          "apyBase": 3.6
        },
        {
          "date": "2026-06-03",
          "tvl": 6130901941,
          "apy": 3.6,
          "apyBase": 3.6
        },
        {
          "date": "2026-06-04",
          "tvl": 6327684750,
          "apy": 3.6,
          "apyBase": 3.6
        },
        {
          "date": "2026-06-05",
          "tvl": 6295338331,
          "apy": 3.6,
          "apyBase": 3.6
        },
        {
          "date": "2026-06-06",
          "tvl": 6301015428,
          "apy": 3.6,
          "apyBase": 3.6
        },
        {
          "date": "2026-06-07",
          "tvl": 6259741221,
          "apy": 3.6,
          "apyBase": 3.6
        },
        {
          "date": "2026-06-08",
          "tvl": 6204759279,
          "apy": 3.6,
          "apyBase": 3.6
        },
        {
          "date": "2026-06-09",
          "tvl": 6185164902,
          "apy": 3.6,
          "apyBase": 3.6
        },
        {
          "date": "2026-06-10",
          "tvl": 6163353686,
          "apy": 3.6,
          "apyBase": 3.6
        },
        {
          "date": "2026-06-11",
          "tvl": 6116285262,
          "apy": 3.6,
          "apyBase": 3.6
        },
        {
          "date": "2026-06-12",
          "tvl": 6189998863,
          "apy": 3.6,
          "apyBase": 3.6
        },
        {
          "date": "2026-06-13",
          "tvl": 6163951286,
          "apy": 3.6,
          "apyBase": 3.6
        },
        {
          "date": "2026-06-14",
          "tvl": 6175223705,
          "apy": 3.6,
          "apyBase": 3.6
        },
        {
          "date": "2026-06-15",
          "tvl": 6174547989,
          "apy": 3.6,
          "apyBase": 3.6
        },
        {
          "date": "2026-06-16",
          "tvl": 5900460360,
          "apy": 3.6,
          "apyBase": 3.6
        },
        {
          "date": "2026-06-17",
          "tvl": 5882368792,
          "apy": 3.6,
          "apyBase": 3.6
        },
        {
          "date": "2026-06-18",
          "tvl": 5876845720,
          "apy": 3.6,
          "apyBase": 3.6
        },
        {
          "date": "2026-06-19",
          "tvl": 5897568289,
          "apy": 3.6,
          "apyBase": 3.6
        },
        {
          "date": "2026-06-20",
          "tvl": 5905551088,
          "apy": 3.6,
          "apyBase": 3.6
        },
        {
          "date": "2026-06-21",
          "tvl": 5900459149,
          "apy": 3.6,
          "apyBase": 3.6
        },
        {
          "date": "2026-06-22",
          "tvl": 5901117741,
          "apy": 3.6,
          "apyBase": 3.6
        },
        {
          "date": "2026-06-23",
          "tvl": 5886868152,
          "apy": 3.6,
          "apyBase": 3.6
        },
        {
          "date": "2026-06-24",
          "tvl": 5892694126,
          "apy": 3.6,
          "apyBase": 3.6
        },
        {
          "date": "2026-06-25",
          "tvl": 5886974983,
          "apy": 3.6,
          "apyBase": 3.6
        },
        {
          "date": "2026-06-26",
          "tvl": 5850786211,
          "apy": 3.6,
          "apyBase": 3.6
        },
        {
          "date": "2026-06-27",
          "tvl": 5857836381,
          "apy": 3.6,
          "apyBase": 3.6
        },
        {
          "date": "2026-06-28",
          "tvl": 5850267507,
          "apy": 3.6,
          "apyBase": 3.6
        },
        {
          "date": "2026-06-29",
          "tvl": 5836203321,
          "apy": 3.6,
          "apyBase": 3.6
        },
        {
          "date": "2026-06-30",
          "tvl": 5526603489,
          "apy": 3.6,
          "apyBase": 3.6
        }
      ]
    }
  ],
  "errors": [],
  "meta": {
    "credits": 2,
    "requestId": "req_34Voy3xWjolFntQvwZbU2"
  }
}
```
