# POST /v4/tokens/whitelist

_Merkl API_

Submit a token whitelist request for review.

## Request body

**`application/json`**
```json
{
  "type": "object",
  "properties": {
    "explainer": {
      "maxLength": 500,
      "description": "Short explanation of the token to add.",
      "type": "string"
    },
    "address": {
      "maxLength": 66,
      "description": "Token address in checksum format.",
      "type": "string"
    },
    "chainId": {
      "description": "Chain ID of the network where the token is deployed.",
      "anyOf": [
        {
          "format": "numeric",
          "default": 0,
          "type": "string"
        },
        {
          "description": "Chain ID of the network where the token is deployed.",
          "type": "number"
        }
      ]
    },
    "iconUrl": {
      "maxLength": 1024,
      "description": "Publicly accessible HTTPS URL for the token icon. Mutually exclusive with iconFile.",
      "type": "string"
    },
    "iconFile": {
      "type": "object",
      "properties": {
        "data": {
          "maxLength": 1398102,
          "description": "Base64-encoded icon file bytes (max 1 MB raw).",
          "type": "string"
        },
        "mimeType": {
          "description": "Image MIME type (e.g. image/png).",
          "type": "string"
        },
        "filename": {
          "maxLength": 255,
          "description": "Original filename (e.g. token.svg).",
          "type": "string"
        }
      },
      "required": [
        "data",
        "mimeType",
        "filename"
      ]
    },
    "protocolName": {
      "maxLength": 100,
      "description": "Name of the protocol submitting the request.",
      "type": "string"
    },
    "requesterType": {
      "description": "Whether the requester submits as an individual or a company. Required.",
      "anyOf": [
        {
          "const": "individual",
          "type": "string"
        },
        {
          "const": "company",
          "type": "string"
        }
      ]
    },
    "companyName": {
      "maxLength": 100,
      "description": "Company name — required when requesterType is 'company'.",
      "type": "string"
    },
    "telegramHandle": {
      "maxLength": 100,
      "description": "Telegram handle to notify once the token is whitelisted.",
      "type": "string"
    },
    "displaySymbol": {
      "maxLength": 50,
      "description": "Override symbol shown in the UI. Defaults to on-chain symbol.",
      "type": "string"
    },
    "coingeckoApiId": {
      "maxLength": 100,
      "description": "CoinGecko API ID for price sourcing and APR/TVL calculation.",
      "type": "string"
    },
    "tokenName": {
      "maxLength": 100,
      "description": "Token name, resolved client-side.",
      "type": "string"
    },
    "tokenSymbol": {
      "maxLength": 50,
      "description": "Token symbol, resolved client-side.",
      "type": "string"
    }
  },
  "required": [
    "explainer",
    "address",
    "chainId",
    "protocolName",
    "requesterType",
    "telegramHandle"
  ]
}
```
**`application/x-www-form-urlencoded`**
```json
{
  "type": "object",
  "properties": {
    "explainer": {
      "maxLength": 500,
      "description": "Short explanation of the token to add.",
      "type": "string"
    },
    "address": {
      "maxLength": 66,
      "description": "Token address in checksum format.",
      "type": "string"
    },
    "chainId": {
      "description": "Chain ID of the network where the token is deployed.",
      "anyOf": [
        {
          "format": "numeric",
          "default": 0,
          "type": "string"
        },
        {
          "description": "Chain ID of the network where the token is deployed.",
          "type": "number"
        }
      ]
    },
    "iconUrl": {
      "maxLength": 1024,
      "description": "Publicly accessible HTTPS URL for the token icon. Mutually exclusive with iconFile.",
      "type": "string"
    },
    "iconFile": {
      "type": "object",
      "properties": {
        "data": {
          "maxLength": 1398102,
          "description": "Base64-encoded icon file bytes (max 1 MB raw).",
          "type": "string"
        },
        "mimeType": {
          "description": "Image MIME type (e.g. image/png).",
          "type": "string"
        },
        "filename": {
          "maxLength": 255,
          "description": "Original filename (e.g. token.svg).",
          "type": "string"
        }
      },
      "required": [
        "data",
        "mimeType",
        "filename"
      ]
    },
    "protocolName": {
      "maxLength": 100,
      "description": "Name of the protocol submitting the request.",
      "type": "string"
    },
    "requesterType": {
      "description": "Whether the requester submits as an individual or a company. Required.",
      "anyOf": [
        {
          "const": "individual",
          "type": "string"
        },
        {
          "const": "company",
          "type": "string"
        }
      ]
    },
    "companyName": {
      "maxLength": 100,
      "description": "Company name — required when requesterType is 'company'.",
      "type": "string"
    },
    "telegramHandle": {
      "maxLength": 100,
      "description": "Telegram handle to notify once the token is whitelisted.",
      "type": "string"
    },
    "displaySymbol": {
      "maxLength": 50,
      "description": "Override symbol shown in the UI. Defaults to on-chain symbol.",
      "type": "string"
    },
    "coingeckoApiId": {
      "maxLength": 100,
      "description": "CoinGecko API ID for price sourcing and APR/TVL calculation.",
      "type": "string"
    },
    "tokenName": {
      "maxLength": 100,
      "description": "Token name, resolved client-side.",
      "type": "string"
    },
    "tokenSymbol": {
      "maxLength": 50,
      "description": "Token symbol, resolved client-side.",
      "type": "string"
    }
  },
  "required": [
    "explainer",
    "address",
    "chainId",
    "protocolName",
    "requesterType",
    "telegramHandle"
  ]
}
```
**`multipart/form-data`**
```json
{
  "type": "object",
  "properties": {
    "explainer": {
      "maxLength": 500,
      "description": "Short explanation of the token to add.",
      "type": "string"
    },
    "address": {
      "maxLength": 66,
      "description": "Token address in checksum format.",
      "type": "string"
    },
    "chainId": {
      "description": "Chain ID of the network where the token is deployed.",
      "anyOf": [
        {
          "format": "numeric",
          "default": 0,
          "type": "string"
        },
        {
          "description": "Chain ID of the network where the token is deployed.",
          "type": "number"
        }
      ]
    },
    "iconUrl": {
      "maxLength": 1024,
      "description": "Publicly accessible HTTPS URL for the token icon. Mutually exclusive with iconFile.",
      "type": "string"
    },
    "iconFile": {
      "type": "object",
      "properties": {
        "data": {
          "maxLength": 1398102,
          "description": "Base64-encoded icon file bytes (max 1 MB raw).",
          "type": "string"
        },
        "mimeType": {
          "description": "Image MIME type (e.g. image/png).",
          "type": "string"
        },
        "filename": {
          "maxLength": 255,
          "description": "Original filename (e.g. token.svg).",
          "type": "string"
        }
      },
      "required": [
        "data",
        "mimeType",
        "filename"
      ]
    },
    "protocolName": {
      "maxLength": 100,
      "description": "Name of the protocol submitting the request.",
      "type": "string"
    },
    "requesterType": {
      "description": "Whether the requester submits as an individual or a company. Required.",
      "anyOf": [
        {
          "const": "individual",
          "type": "string"
        },
        {
          "const": "company",
          "type": "string"
        }
      ]
    },
    "companyName": {
      "maxLength": 100,
      "description": "Company name — required when requesterType is 'company'.",
      "type": "string"
    },
    "telegramHandle": {
      "maxLength": 100,
      "description": "Telegram handle to notify once the token is whitelisted.",
      "type": "string"
    },
    "displaySymbol": {
      "maxLength": 50,
      "description": "Override symbol shown in the UI. Defaults to on-chain symbol.",
      "type": "string"
    },
    "coingeckoApiId": {
      "maxLength": 100,
      "description": "CoinGecko API ID for price sourcing and APR/TVL calculation.",
      "type": "string"
    },
    "tokenName": {
      "maxLength": 100,
      "description": "Token name, resolved client-side.",
      "type": "string"
    },
    "tokenSymbol": {
      "maxLength": 50,
      "description": "Token symbol, resolved client-side.",
      "type": "string"
    }
  },
  "required": [
    "explainer",
    "address",
    "chainId",
    "protocolName",
    "requesterType",
    "telegramHandle"
  ]
}
```

## Example request

```bash
curl -X POST "https://api.merkl.xyz//v4/tokens/whitelist" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ ... }'
```