---
title: Create a Token
description: 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](/docs/guides/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 |

<Tabs items={["Dashboard", "API"]}>
<Tab value="Dashboard">

### 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](/docs/guides/deploy-a-token).

</Tab>
<Tab value="API">

#### 1. List available templates (optional)

<Tabs items={["curl", "TypeScript", "Java"]}>
<Tab value="curl">
```bash
curl https://api.solana.com/v1/issuance/templates \
  -H "Authorization: Bearer sk_test_..."
```
</Tab>
<Tab value="TypeScript">
```typescript
const response = await fetch("https://api.solana.com/v1/issuance/templates", {
  headers: { "Authorization": "Bearer sk_test_..." },
});
const { data } = await response.json();
```
</Tab>
<Tab value="Java">
```java
HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://api.solana.com/v1/issuance/templates"))
    .header("Authorization", "Bearer sk_test_...")
    .GET()
    .build();
```
</Tab>
</Tabs>

#### 2. Create a token

<Tabs items={["curl", "TypeScript", "Java"]}>
<Tab value="curl">
```bash
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
  }'
```
</Tab>
<Tab value="TypeScript">
```typescript
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.
```
</Tab>
<Tab value="Java">
```java
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();
```
</Tab>
</Tabs>

The token is created with status `pending`. It must be [deployed](/docs/guides/deploy-a-token) 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"`.

<Tabs items={["curl", "TypeScript", "Java"]}>
<Tab value="curl">
```bash
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
  }'
```
</Tab>
<Tab value="TypeScript">
```typescript
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,
  }),
});
```
</Tab>
<Tab value="Java">
```java
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();
```
</Tab>
</Tabs>

</Tab>
</Tabs>
