Create a Token
Define a new token using templates or custom configuration.
Token creation defines your token's metadata, extensions, and rules. The token is saved in SDP but not yet deployed onchain — see Deploy a Token for the next step.
Templates
SDP provides templates that pre-configure extensions and defaults for common use cases:
| Template | Decimals | Key extensions | Use case |
|---|---|---|---|
| Stablecoin | 6 | Permanent delegate, pausable | USD-backed tokens |
| Tokenized Security | 8 | Permanent delegate, pausable, scaled UI amount | Regulated assets |
| Custom | 9 | None (you choose) | Full control |
1. Open the create token modal
Navigate to Issuance in the sidebar. Click Create token in the top right corner.
2. Choose a template (Step 1 of 3)
The first step shows a grid of template cards:
- Stablecoin — USD-backed stablecoins with compliance controls
- Tokenized Security — regulated assets with an allowlist requirement
- Custom — fully customizable Token-2022 configuration
Select a template and click Continue.
3. Configure token settings (Step 2 of 3)
Enter the token identity details:
- Metadata URI (required) — HTTPS URL for the token metadata JSON
- Token name (required) — e.g., "Acme Dollar"
- Symbol (required) — 1–10 uppercase alphanumeric characters, e.g., "ACME"
- Decimals — chosen from the options allowed by the selected template
Click Continue when ready.
4. Choose operational settings (Step 3 of 3)
Choose the operational settings:
- Main signer — the controlled wallet SDP should use for deploy and later token actions
- Allowlist — enabled or disabled, depending on the template's rules
For tokenized-security, allowlist is required and cannot be disabled. Click Create token to save the draft.
5. Done
A success toast confirms creation. The token is now in pending status, ready to be deployed.
1. List available templates (optional)
curl https://api.solana.com/v1/issuance/templates \
-H "Authorization: Bearer sk_test_..."const response = await fetch("https://api.solana.com/v1/issuance/templates", {
headers: { "Authorization": "Bearer sk_test_..." },
});
const { data } = await response.json();HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.solana.com/v1/issuance/templates"))
.header("Authorization", "Bearer sk_test_...")
.GET()
.build();2. Create a token
curl -X POST https://api.solana.com/v1/issuance/tokens \
-H "Authorization: Bearer sk_test_..." \
-H "Content-Type: application/json" \
-d '{
"name": "Acme Dollar",
"symbol": "ACME",
"decimals": 6,
"description": "USD-backed stablecoin",
"template": "stablecoin",
"requiresAllowlist": false,
"isMintable": true,
"isFreezable": true
}'const response = await fetch("https://api.solana.com/v1/issuance/tokens", {
method: "POST",
headers: {
"Authorization": "Bearer sk_test_...",
"Content-Type": "application/json",
},
body: JSON.stringify({
name: "Acme Dollar",
symbol: "ACME",
decimals: 6,
description: "USD-backed stablecoin",
template: "stablecoin",
requiresAllowlist: false,
isMintable: true,
isFreezable: true,
}),
});
const { data } = await response.json();
// data.token.id — use this for deploy, mint, etc.HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.solana.com/v1/issuance/tokens"))
.header("Authorization", "Bearer sk_test_...")
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString("""
{
"name": "Acme Dollar",
"symbol": "ACME",
"decimals": 6,
"description": "USD-backed stablecoin",
"template": "stablecoin",
"requiresAllowlist": false,
"isMintable": true,
"isFreezable": true
}"""))
.build();The token is created with status pending. It must be deployed before you can mint or transfer.
Custom token (no template)
Omit the template field or set it to "custom" and configure extensions via overrides.extensions. You can also pass "rwa" as a template alias for "tokenized-security".
curl -X POST https://api.solana.com/v1/issuance/tokens \
-H "Authorization: Bearer sk_test_..." \
-H "Content-Type: application/json" \
-d '{
"name": "Game Coin",
"symbol": "GAME",
"decimals": 0,
"template": "custom",
"overrides": {
"extensions": {
"pausable": {},
"transferFee": {
"basisPoints": 50,
"maxFee": "1000"
}
}
},
"isMintable": true,
"isFreezable": false
}'const response = await fetch("https://api.solana.com/v1/issuance/tokens", {
method: "POST",
headers: {
"Authorization": "Bearer sk_test_...",
"Content-Type": "application/json",
},
body: JSON.stringify({
name: "Game Coin",
symbol: "GAME",
decimals: 0,
template: "custom",
overrides: {
extensions: {
pausable: {},
transferFee: { basisPoints: 50, maxFee: "1000" },
},
},
isMintable: true,
isFreezable: false,
}),
});HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.solana.com/v1/issuance/tokens"))
.header("Authorization", "Bearer sk_test_...")
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString("""
{
"name": "Game Coin",
"symbol": "GAME",
"decimals": 0,
"template": "custom",
"overrides": {
"extensions": {
"pausable": {},
"transferFee": {
"basisPoints": 50,
"maxFee": "1000"
}
}
},
"isMintable": true,
"isFreezable": false
}"""))
.build();