# Add tokens

You can manually register tokens in Ripple Custody using the `v0_CreateTicker` intent. Tokens added via API are automatically placed in the Allowlisted state.

## How it works

When you add a token manually:

1. The token is created with `validationStatus: Validated` and `lock: Unlocked`
2. The token is immediately visible in the UI
3. The token can be used in transfer orders right away


Manually added tokens skip the Unclassified state and go directly to Allowlisted. This is different from auto-discovered tokens, which start as Unclassified.

## Prerequisites

Before adding a token, you need the following:

| Prerequisite | Additional information |
|  --- | --- |
| Token contract address | From the blockchain or token issuer |
| Ledger ID | [List ledgers](/products/custody/reference/api/openapi/ledgers/getledgers) |
| API authentication | [Authenticate API requests](/products/custody/identity-and-access/authentication/authenticate-api-requests) |
| A new intent ID in UUID format |  |


## Add a token

To add a new token, follow the steps in [Manage intents and approvals](/products/custody/governance/intents/manage-intents-and-approvals), with a payload similar to the following example.

### Payload example


```json
{
  "payload": {
    "ledgerId": "ethereum-mainnet",
    "kind": "Contract",
    "name": "USD Coin",
    "decimals": 6,
    "symbol": "USDC",
    "ledgerDetails": {
      "properties": {
        "address": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
        "type": "ERC20"
      }
    },
    "type": "v0_CreateTicker"
  }
}
```

### Payload fields

| Field | Type | Required | Description |
|  --- | --- | --- | --- |
| `ledgerId` | string | Yes | Ledger identifier (e.g., `ethereum-mainnet`) |
| `kind` | string | Yes | `Native` or `Contract` |
| `name` | string | Yes | Token display name |
| `decimals` | integer | Yes | Decimal precision (e.g., 18 for most ERC-20 tokens) |
| `symbol` | string | Yes | Token ticker symbol |
| `ledgerDetails` | object | Yes | Ledger-specific token details |
| `type` | string | Yes | Must be `v0_CreateTicker` |


### Token standards

Specify the token standard in `ledgerDetails.properties.type`:

| Standard | Value | Description |
|  --- | --- | --- |
| ERC-20 | `ERC20` | Fungible tokens |
| ERC-721 | `ERC721` | Non-fungible tokens (NFTs) |
| ERC-1155 | `ERC1155` | Multi-token standard |


The token is registered when the intent is successfully approved and executed. The token appears in the Allowlisted state and is immediately available for use.

## Verify the result

After the intent is executed, verify the token was created:


```http
GET /v1/tickers?symbol=USDC&ledgerId=ethereum-mainnet
```

See [List tickers](/products/custody/reference/api/openapi/tickers/gettickers) for the complete API reference.

## Related topics

- [Token Management concepts](/products/custody/accounts-and-assets/tokenization/token-management)
- [View tokens](/products/custody/accounts-and-assets/tokenization/token-management/api/view-tokens)
- [Allowlist tokens](/products/custody/accounts-and-assets/tokenization/token-management/api/allowlist-token)
- [Manage intents and approvals](/products/custody/governance/intents/manage-intents-and-approvals)
- [API reference: List tickers](/products/custody/reference/api/openapi/tickers/gettickers)
- [API reference: Get ticker](/products/custody/reference/api/openapi/tickers/getticker)