Skip to main content

Asset Management API

This document describes the Asset Management endpoints for managing digital assets in Link Core.

Endpoints


Create Asset

Creates a new digital asset in the system.

Endpoint: POST /assets

Request Body

{
"code": "string",
"name": "string",
"decimalPlaces": number,
"address": "string",
"network": "string",
"iso20022CurrencyCode": "string",
"iso20022BankTransactionDomainCode": "string"
}
FieldTypeRequiredDescription
codestringYesUnique asset code/ticker (e.g., "BTC", "USD")
namestringYesHuman-readable asset name (e.g., "Bitcoin")
decimalPlacesnumberYesNumber of decimal places (e.g., 8 for BTC, 2 for USD)
addressstringYesBlockchain address or identifier
networkstringYesBlockchain network (e.g., "bitcoin", "ethereum", "solana")
iso20022CurrencyCodestringNoISO 20022 currency code (for fiat currencies)
iso20022BankTransactionDomainCodestringNoISO 20022 bank transaction domain code

Response

Status: 201 Created

{
"id": "123e4567-e89b-12d3-a456-426614174000",
"code": "BTC",
"name": "Bitcoin",
"decimalPlaces": 8,
"address": "native",
"network": "bitcoin",
"iso20022CurrencyCode": null,
"iso20022BankTransactionDomainCode": null,
"createdAt": "2025-11-20T10:30:00.000Z",
"updatedAt": "2025-11-20T10:30:00.000Z"
}

Examples

Create Native Cryptocurrency

curl -X POST "https://api.ledgerlink.ai/v1/assets" \
-H "Content-Type: application/json" \
-d '{
"code": "BTC",
"name": "Bitcoin",
"decimalPlaces": 8,
"address": "native",
"network": "bitcoin"
}'

Response:

{
"id": "123e4567-e89b-12d3-a456-426614174000",
"code": "BTC",
"name": "Bitcoin",
"decimalPlaces": 8,
"address": "native",
"network": "bitcoin",
"iso20022CurrencyCode": null,
"iso20022BankTransactionDomainCode": null,
"createdAt": "2025-11-20T10:30:00.000Z",
"updatedAt": "2025-11-20T10:30:00.000Z"
}

Create ERC-20 Token

curl -X POST "https://api.ledgerlink.ai/v1/assets" \
-H "Content-Type: application/json" \
-d '{
"code": "USDC",
"name": "USD Coin",
"decimalPlaces": 6,
"address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
"network": "ethereum"
}'

Response:

{
"id": "234e4567-e89b-12d3-a456-426614174001",
"code": "USDC",
"name": "USD Coin",
"decimalPlaces": 6,
"address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
"network": "ethereum",
"iso20022CurrencyCode": null,
"iso20022BankTransactionDomainCode": null,
"createdAt": "2025-11-20T10:30:00.000Z",
"updatedAt": "2025-11-20T10:30:00.000Z"
}

Error Responses

400 Bad Request

{
"statusCode": 400,
"message": ["name must be a string", "code must be a string"],
"error": "Bad Request"
}

Causes:

  • Missing required fields (name or code)
  • Invalid data types
  • Asset code already exists (must be unique)

409 Conflict

{
"statusCode": 409,
"message": "Asset with code 'BTC' already exists",
"error": "Conflict"
}

List Assets

Retrieves all assets in the system.

Endpoint: GET /assets

Response

Status: 200 OK

[
{
"id": "123e4567-e89b-12d3-a456-426614174000",
"name": "Bitcoin",
"code": "BTC",
"blockchain": "Bitcoin",
"contractAddress": null,
"decimals": 8,
"metadata": {},
"createdAt": "2025-11-20T10:30:00.000Z",
"updatedAt": "2025-11-20T10:30:00.000Z"
},
{
"id": "234e4567-e89b-12d3-a456-426614174001",
"name": "Ethereum",
"code": "ETH",
"blockchain": "Ethereum",
"contractAddress": null,
"decimals": 18,
"metadata": {},
"createdAt": "2025-11-20T10:31:00.000Z",
"updatedAt": "2025-11-20T10:31:00.000Z"
},
{
"id": "345e4567-e89b-12d3-a456-426614174002",
"name": "USD Coin",
"code": "USDC",
"blockchain": "Ethereum",
"contractAddress": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
"decimals": 6,
"metadata": {
"type": "stablecoin",
"issuer": "Circle"
},
"createdAt": "2025-11-20T10:32:00.000Z",
"updatedAt": "2025-11-20T10:32:00.000Z"
}
]

Example

curl -X GET "https://api.ledgerlink.ai/v1/assets"

Notes

  • Returns all assets in the system
  • No pagination (for now)
  • Assets are returned in creation order by default

Get Asset

Retrieves a specific asset by ID.

Endpoint: GET /assets/:id

Path Parameters

ParameterTypeRequiredDescription
idstring (UUID)YesAsset UUID

Response

Status: 200 OK

{
"id": "123e4567-e89b-12d3-a456-426614174000",
"name": "Bitcoin",
"code": "BTC",
"blockchain": "Bitcoin",
"contractAddress": null,
"decimals": 8,
"metadata": {},
"createdAt": "2025-11-20T10:30:00.000Z",
"updatedAt": "2025-11-20T10:30:00.000Z"
}

Example

curl -X GET "https://api.ledgerlink.ai/v1/assets/123e4567-e89b-12d3-a456-426614174000"

Error Responses

404 Not Found

{
"statusCode": 404,
"message": "Asset not found",
"error": "Not Found"
}

Update Asset

Updates an existing asset's details.

Endpoint: PATCH /assets/:id

Path Parameters

ParameterTypeRequiredDescription
idstring (UUID)YesAsset UUID

Request Body

{
"name": "string",
"code": "string",
"blockchain": "string",
"contractAddress": "string",
"decimals": number,
"metadata": {}
}

All fields are optional. Only provided fields will be updated.

Response

Status: 200 OK

{
"id": "123e4567-e89b-12d3-a456-426614174000",
"name": "Bitcoin (Updated)",
"code": "BTC",
"blockchain": "Bitcoin",
"contractAddress": null,
"decimals": 8,
"metadata": {
"network": "mainnet",
"explorer": "https://blockstream.info"
},
"createdAt": "2025-11-20T10:30:00.000Z",
"updatedAt": "2025-11-20T15:45:00.000Z"
}

Examples

Update Asset Name

curl -X PATCH "https://api.ledgerlink.ai/v1/assets/123e4567-e89b-12d3-a456-426614174000" \
-H "Content-Type: application/json" \
-d '{
"name": "Bitcoin (BTC)"
}'

Update Metadata

curl -X PATCH "https://api.ledgerlink.ai/v1/assets/123e4567-e89b-12d3-a456-426614174000" \
-H "Content-Type: application/json" \
-d '{
"metadata": {
"network": "mainnet",
"explorer": "https://blockstream.info",
"website": "https://bitcoin.org"
}
}'

Error Responses

404 Not Found

{
"statusCode": 404,
"message": "Asset not found",
"error": "Not Found"
}

400 Bad Request

{
"statusCode": 400,
"message": "Invalid input data",
"error": "Bad Request"
}

Causes:

  • Invalid data types
  • Code conflict (if changing code to existing one)

Delete Asset

Soft deletes an asset from the system.

Endpoint: DELETE /assets/:id

Path Parameters

ParameterTypeRequiredDescription
idstring (UUID)YesAsset UUID

Response

Status: 200 OK

{
"success": true,
"message": "Asset successfully deleted"
}

Example

curl -X DELETE "https://api.ledgerlink.ai/v1/assets/123e4567-e89b-12d3-a456-426614174000"

Error Responses

404 Not Found

{
"statusCode": 404,
"message": "Asset not found",
"error": "Not Found"
}

400 Bad Request

{
"statusCode": 400,
"message": "Cannot delete asset with existing balances or transactions",
"error": "Bad Request"
}

Causes:

  • Asset has existing customer balances
  • Asset has historical transactions
  • Asset is referenced by other entities

Notes

  • This is a soft delete - the asset is marked as deleted but remains in the database
  • Deleted assets are excluded from list queries
  • Assets with active balances or transaction history cannot be deleted (integrity protection)

Asset Fields Reference

FieldTypeDescription
idstring (UUID)Unique asset identifier
codestringUnique asset code/ticker symbol (e.g., "BTC", "USD")
namestringHuman-readable asset name
decimalPlacesnumberNumber of decimal places for precision
addressstringBlockchain address or "native" for native assets
networkstringBlockchain network name (e.g., "bitcoin", "ethereum")
iso20022CurrencyCodestring or nullISO 20022 currency code (for fiat)
iso20022BankTransactionDomainCodestring or nullISO 20022 bank transaction domain code
createdAtstring (ISO 8601)Creation timestamp
updatedAtstring (ISO 8601)Last update timestamp

Asset Types

Native Cryptocurrencies

Native blockchain currencies (no contract address):

{
"name": "Bitcoin",
"code": "BTC",
"blockchain": "Bitcoin",
"contractAddress": null,
"decimals": 8
}

Examples:

  • Bitcoin (BTC)
  • Ethereum (ETH)
  • Solana (SOL)

ERC-20 Tokens

Ethereum-based tokens (ERC-20 standard):

{
"name": "USD Coin",
"code": "USDC",
"blockchain": "Ethereum",
"contractAddress": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
"decimals": 6
}

Examples:

  • USDC
  • USDT
  • DAI
  • UNI
  • AAVE

SPL Tokens

Solana-based tokens (SPL standard):

{
"name": "USD Coin",
"code": "USDC",
"blockchain": "Solana",
"contractAddress": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
"decimals": 6
}

Multi-Chain Assets

Same asset on different blockchains (separate asset records):

// USDC on Ethereum
{
"name": "USD Coin (Ethereum)",
"code": "USDC-ETH",
"blockchain": "Ethereum",
"contractAddress": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"
}

// USDC on Solana
{
"name": "USD Coin (Solana)",
"code": "USDC-SOL",
"blockchain": "Solana",
"contractAddress": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"
}

Decimal Precision

The decimals field defines the smallest divisible unit:

AssetDecimalsSmallest UnitExample
BTC80.000000011 satoshi
ETH180.0000000000000000011 wei
USDC60.0000011 micro-dollar

Important: Always store and process amounts as integers in the smallest unit, then convert for display:

// Store as integer (satoshis)
const amountSatoshis = 150000000; // 1.5 BTC

// Display as decimal
const amountBTC = amountSatoshis / Math.pow(10, 8); // 1.5

Metadata Usage

The metadata field stores additional asset information:

Common Metadata Fields

{
"metadata": {
"type": "stablecoin",
"issuer": "Circle",
"network": "mainnet",
"explorer": "https://etherscan.io/token/0xA0b8...",
"website": "https://www.circle.com/usdc",
"logo": "https://cdn.example.com/usdc.png",
"description": "Fully-backed USD stablecoin",
"isTestnet": false
}
}

Use Cases

  • Display asset logos in UI
  • Link to block explorers
  • Show asset descriptions
  • Flag testnet vs mainnet assets
  • Track issuer information
  • Store additional configuration

Integration with Other Services

Assets created in Link Core can be used with Link Quote for pricing:

  1. Create asset in Link Core
  2. Create matching asset in Link Quote (with same code)
  3. Configure providers in Link Quote
  4. Fetch rates using asset code

Wallet Manager Integration

Assets must be configured in both Link Core and Wallet Manager:

  • Link Core tracks balances and transactions
  • Wallet Manager handles blockchain interactions
  • Asset codes must match between services

Best Practices

1. Use Descriptive Names

Include blockchain or network in name for clarity:

{
"name": "USD Coin (Ethereum)",
"code": "USDC-ETH"
}

2. Unique Codes for Multi-Chain

Use different codes for same asset on different chains:

// Good
{ "code": "USDC-ETH", "blockchain": "Ethereum" }
{ "code": "USDC-SOL", "blockchain": "Solana" }

// Bad (duplicate codes)
{ "code": "USDC", "blockchain": "Ethereum" }
{ "code": "USDC", "blockchain": "Solana" }

3. Verify Contract Addresses

Always double-check contract addresses before creating tokens:

# Verify on blockchain explorer
# Ethereum: https://etherscan.io
# Solana: https://explorer.solana.com

4. Set Correct Decimals

Use standard decimals for known assets:

  • BTC: 8
  • ETH: 18
  • USDC/USDT: 6

5. Store Rich Metadata

Include all relevant information in metadata:

{
"metadata": {
"explorer": "https://etherscan.io/token/0x...",
"website": "https://...",
"logo": "https://...",
"isTestnet": false
}
}

Need Help? Contact helpdesk@ledgerlink.ai for assistance.