Create asset
Deploy a new tokenized asset using the API.
Creating an asset deploys a new tokenized security on the blockchain. This guide covers how to create assets programmatically using the API.

For the web interface approach, see the user guide.
Common use cases:
- Bond issuance - Create fixed-income securities with maturity dates and coupon payments
- Equity tokenization - Issue shares with voting rights and dividend distribution
- Fund launch - Create investment fund units with NAV tracking
- Stablecoin creation - Deploy collateral-backed stable value instruments
- Deposit certificates - Tokenize bank deposits or cash equivalents
- Real estate fractionalization - Divide property ownership into tradeable fractions
Prerequisites
- Platform URL (e.g.,
https://your-platform.example.com) - API key from a user with the Token Manager role (see Getting Started)
- Token factory for your desired asset type must be deployed
- Wallet verification method enabled on your account (pincode or 2FA)
Asset types
The platform supports six asset types organized into four classes:
| Asset class | Asset types | Description |
|---|---|---|
| Fixed Income | Bond | Debt securities with maturity dates and fixed payments |
| Flexible Income | Equity, Fund | Variable return assets like shares and investment funds |
| Cash Equivalent | Stablecoin, Deposit | Stable value assets pegged to fiat currencies |
| Real World Asset | Real Estate | Tokenized physical property ownership |
Create an equity asset
Equity assets represent ownership shares in an organization, similar to traditional stock certificates.
curl -X POST "https://your-platform.example.com/api/token/create" \
-H "X-Api-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"type": "equity",
"name": "ACME Holdings Common Stock",
"symbol": "ACME",
"decimals": 0,
"cap": "1000000",
"priceCurrency": "USD",
"basePrice": "10.00",
"countryCode": "840",
"class": "COMMON_EQUITY",
"category": "VOTING_COMMON_STOCK",
"uniqueIdentifier": "US0000000001",
"complianceModules": [],
"walletVerification": {
"secretVerificationCode": "123456",
"verificationType": "PINCODE"
}
}'Request parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
type | string | Yes | Asset type: "equity", "bond", "fund", etc. |
name | string | Yes | Full name (1-255 characters) |
symbol | string | Yes | Trading symbol (1-24 characters, uppercase recommended) |
decimals | number | Yes | Decimal precision (0-18, typically 0 for whole shares) |
cap | string | No | Maximum supply (optional supply cap) |
priceCurrency | string | Yes | ISO 4217 currency code ("USD", "EUR", "GBP") |
basePrice | string | Yes | Price per unit in selected currency |
countryCode | string | Yes | ISO 3166-1 numeric country code (e.g., "840" for USA) |
class | string | No | Equity class: "COMMON_EQUITY", "PREFERRED_EQUITY" |
category | string | No | Equity category: "VOTING_COMMON_STOCK", etc. |
uniqueIdentifier | string | No | ISIN, CUSIP, or custom identifier |
complianceModules | string[] | No | Array of compliance module IDs (see below) |
walletVerification | object | Yes | Your wallet verification |
walletVerification.secretVerificationCode | string | Yes | Your 6-digit PINCODE or TOTP code |
walletVerification.verificationType | string | Yes | "PINCODE", "OTP", or "SECRET_CODES" |
Compliance modules
Enable on-chain compliance rules that are automatically enforced:
| Module | ID | Description |
|---|---|---|
| Identity verification | identityVerification | Requires verified OnchainID for all transfers. Learn how to configure → |
| Country allow list | countryAllowList | Only specified jurisdictions can hold the asset |
| Country block list | countryBlockList | Blocked jurisdictions cannot hold the asset |
| Address block list | addressBlockList | Explicitly block specific wallet addresses |
| Investor count limit | investorCountLimit | Cap maximum number of unique holders |
| Time lock | timeLock | Enforce minimum holding period |
| Transfer approval | transferApproval | Require manual approval for each transfer |
| Collateral requirement | collateralRequirement | Requires collateral backing before minting. Learn how to configure → |

Response
A successful response returns the created asset data (showing key fields):
{
"id": "0x9459D52E60edBD3178f00F9055f6C117a21b4220",
"type": "equity",
"createdAt": "2025-01-15T10:30:00.000Z",
"name": "ACME Holdings Common Stock",
"symbol": "ACME",
"decimals": 0,
"basePrice": "[\"10\",0]",
"basePriceCurrencyCode": "USD",
"totalSupply": "[\"0\",0]",
"pausable": {
"paused": true
},
"capped": {
"cap": "[\"1000000\",0]"
}
}The response includes the full asset object with additional fields like identity, accessControl, complianceModuleConfigs, userPermissions, and stats. Note that the asset starts paused by default.

After deployment
Once deployed, your asset is paused by default. To activate it for transfers and minting:
- Unpause the asset - See Pause/Unpause Assets
- Add supply managers - Grant roles for minting (see Change Asset Admin Roles)
- Mint initial supply - Issue assets to investors (see Mint Assets)
Troubleshooting
| Issue | Solution |
|---|---|
| "Token factory not found" | Deploy the factory for your asset type first |
| "Symbol already exists" | Choose a unique symbol not used by other assets |
| "Insufficient gas funds" | Ensure your wallet has enough native currency for gas |
| "Invalid country code" | Use ISO 3166-1 numeric codes (e.g., 840=USA, 276=Germany) |
| "Compliance module not found" | Check available modules with GET /api/system/compliance-modules |
Related guides
- Pause/Unpause Assets - Activate the asset via API
- Change Asset Admin Roles - Grant roles for minting
- Mint Assets - Issue assets to investors