# Register an Asset

Add an EVM token to your tenant's assets by its contract alone: Aurea reads the contract on its chain and stores the token with the contract's own decimals — or refuses, and stores nothing.

## Overview

- `chainId`: an EVM chain id the Hub supports, mainnet or testnet — `8453` Base, `84532` Base Sepolia… ([Asset & Chain Registry](https://docs.aureahub.com/docs/guide-asset-registry.md) › The Asset Key). Solana's: `400` `ASSET_CHAIN_UNSUPPORTED` — a Solana mint is added with the token routes. Any other: `400` `ASSET_CHAIN_UNKNOWN`.
- `address`: the contract, `0x` and 40 hex digits — all lower or all upper case, or EIP-55; a mixed case with a wrong checksum is `400` `TOKEN_ADDRESS_CHECKSUM_INVALID`. Stored in its EIP-55 form.
- **The reading**, through Aurea's own node of the chain, never your tenant's blockchain configuration: the code at the address, then `decimals()`, `symbol()` and `name()`, each within 5 seconds. No code: `422` `TOKEN_ADDRESS_NOT_A_CONTRACT`. No ERC-20 `decimals()` (or one above 36): `422` `ASSET_NOT_ERC20`. The node failing, slow, or missing ([List Chains](https://docs.aureahub.com/docs/assets-chains.md)' `platformNode` `false`): `503` `ASSET_CONTRACT_UNREAD`, with `details.retryable` `true`.
- `decimals` is not stored: it is what you expect. The contract's own are stored; when you send others, `422` `ASSET_DECIMALS_MISMATCH` with `details.onChain` and `details.given`.
- `symbol` and `name`: the contract's unless you send your own; a name the contract does not answer is the symbol. No usable symbol (none, or over 20 characters) or name (over 255 characters): `400` `ASSET_METADATA_UNREADABLE` — send both.
- **One per address and one per symbol** on each chain and network, in any letter case: `409` `ASSET_EXISTS` or `409` `ASSET_SYMBOL_TAKEN` (the chain's native coin's symbol included), each with the `details.assetId` of the asset you have.
- `201` with the asset: `source` `tenant`, `registeredVia` `registry`, `contractCheck` `matched`. It is then your tenant's like any token it lists. **On a chain where your tenant listed no token of its own, the chain's token lists become your own from then on — on both networks, even with `"active": false`**: the catalogue's tokens of that chain leave them ([Asset & Chain Registry](https://docs.aureahub.com/docs/guide-asset-registry.md) › Your Token Lists). Read them first with [List Assets](https://docs.aureahub.com/docs/assets-list.md) (`source=catalogue`).
- A field the body does not have, or a value of the wrong form, answers `400` `ASSET_REQUEST_INVALID` with each problem in `details.errors`. Any refusal writes nothing.
- For `owner`, `tenantadmin`, `non_signing_admin` and `editor`, on their own tenant, with their access token. Written to your audit trail [Coming soon, upon request](https://docs.aureahub.com/docs/feature-availability.md), as `asset.registered` — the names of the metadata's keys, never a value.

## Endpoint

### `POST /v1/assets`

Authentication: bearer token required.

Registers a custom EVM token by its contract, read on its chain.

**Request body**

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `chainId` | integer | yes | The EVM chain id, mainnet or testnet |
| `address` | string | yes | The token's contract: `0x` and 40 hex digits |
| `symbol` | string | no | Its symbol in your lists, 1–20 characters; default the contract's |
| `name` | string | no | 1–255 characters; default the contract's, else the symbol |
| `decimals` | integer | no | The decimals you expect, 0–36: refused when the contract answers others |
| `logoUri` | string | no | An `https://` URL, up to 2048 characters |
| `coingeckoId` | string | no | The token's price-feed id: 1–100 of `a–z 0–9 -`, starting with a letter or a digit |
| `metadata` | object | no | Your own keys and values: at most 20 keys of 1 to 40 of `a–z 0–9 _` starting with a letter, each value a text of 1 to 200 characters with no space at either end |
| `active` | boolean | no | Default `true` |

**Responses**

`201` Created

```json
{
  "assetId": "7e5df737-88f9-4c90-8fc8-0f70429c2d17",
  "assetKey": "evm:8453:0xdbfbe194c514a645bb0fcb5230adaf85efea3fe7",
  "policyAsset": "base:0xdbfbe194c514a645bb0fcb5230adaf85efea3fe7",
  "family": "evm",
  "chain": "base",
  "chainId": 8453,
  "isTestnet": false,
  "type": "token",
  "address": "0xdBfbe194c514a645Bb0FCb5230aDaF85EFea3fe7",
  "symbol": "GBND31",
  "name": "Green Bond 2031",
  "decimals": 6,
  "logoUri": "https://cdn.example.com/tokens/gbnd31.png",
  "coingeckoId": null,
  "isActive": true,
  "source": "tenant",
  "registeredVia": "registry",
  "metadata": {
    "desk": "treasury",
    "isin": "XS2964021187"
  },
  "contractCheck": {
    "result": "matched",
    "checkedAt": "2026-10-14T09:12:40.517Z"
  },
  "createdAt": "2026-10-14T09:12:40.517Z",
  "updatedAt": "2026-10-14T09:12:40.517Z"
}
```

`400` Solana

```json
{
  "statusCode": 400,
  "error": "BadRequestError",
  "message": "Only an EVM token contract is registered here; a Solana mint is added with the tenant's token routes",
  "details": { "code": "ASSET_CHAIN_UNSUPPORTED", "chainId": 1399811149 }
}
```

`409` Exists

```json
{
  "statusCode": 409,
  "error": "ConflictError",
  "message": "The tenant lists this asset already",
  "details": { "code": "ASSET_EXISTS", "assetId": "7e5df737-88f9-4c90-8fc8-0f70429c2d17" }
}
```

`422` Decimals

```json
{
  "statusCode": 422,
  "error": "ValidationError",
  "message": "The contract's decimals are 6, not 18",
  "details": {
    "code": "ASSET_DECIMALS_MISMATCH",
    "field": "decimals",
    "chainId": 8453,
    "onChain": 6,
    "given": 18
  }
}
```

`503` Node

```json
{
  "statusCode": 503,
  "error": "ServiceUnavailableError",
  "message": "The token contract cannot be read: the node for chain 8453 did not answer",
  "details": { "code": "ASSET_CONTRACT_UNREAD", "chainId": 8453, "retryable": true }
}
```

**Example request**

```bash
curl -X POST https://api.aureahub.com/v1/assets \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "chainId": 8453,
    "address": "0xdbfbe194c514a645bb0fcb5230adaf85efea3fe7",
    "logoUri": "https://cdn.example.com/tokens/gbnd31.png",
    "metadata": { "isin": "XS2964021187", "desk": "treasury" }
  }'
```

---

Web version: https://docs.aureahub.com/#asset-register
