Mint and Burn Tokens

Increase or decrease token supply by minting and burning.

After deploying a token, you can mint new tokens to any address and burn tokens from accounts you control. Force-burn lets admins burn from any account without the holder's signature.

These operations are available from the dashboard and the API.

Prerequisites

  • A deployed token (status: active)
  • The tokens:write permission (or tokens:admin for force-burn)

Mint tokens

Execute mode

curl -X POST https://api.solana.com/v1/issuance/tokens/tok_abc123/mint \
  -H "Authorization: Bearer sk_test_..." \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: mint-001" \
  -d '{
    "mint": {
      "destination": "7xKXz...9fGh",
      "amount": "1000000",
      "memo": "Initial distribution"
    }
  }'
const response = await fetch(
  "https://api.solana.com/v1/issuance/tokens/tok_abc123/mint",
  {
    method: "POST",
    headers: {
      "Authorization": "Bearer sk_test_...",
      "Content-Type": "application/json",
      "Idempotency-Key": "mint-001",
    },
    body: JSON.stringify({
      mint: {
        destination: "7xKXz...9fGh",
        amount: "1000000",
        memo: "Initial distribution",
      },
    }),
  }
);
const { data } = await response.json();
HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://api.solana.com/v1/issuance/tokens/tok_abc123/mint"))
    .header("Authorization", "Bearer sk_test_...")
    .header("Content-Type", "application/json")
    .header("Idempotency-Key", "mint-001")
    .POST(HttpRequest.BodyPublishers.ofString("""
        {
          "mint": {
            "destination": "7xKXz...9fGh",
            "amount": "1000000",
            "memo": "Initial distribution"
          }
        }"""))
    .build();

The amount is in the smallest unit. For a token with 6 decimals, "1000000" equals 1.0 token.

Prepare mode

Add /prepare to simulate before signing:

curl -X POST https://api.solana.com/v1/issuance/tokens/tok_abc123/mint/prepare \
  -H "Authorization: Bearer sk_test_..." \
  -H "Content-Type: application/json" \
  -d '{
    "mint": {
      "destination": "7xKXz...9fGh",
      "amount": "1000000"
    },
    "options": { "simulate": true }
  }'
const response = await fetch(
  "https://api.solana.com/v1/issuance/tokens/tok_abc123/mint/prepare",
  {
    method: "POST",
    headers: {
      "Authorization": "Bearer sk_test_...",
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      mint: { destination: "7xKXz...9fGh", amount: "1000000" },
      options: { simulate: true },
    }),
  }
);
const { data } = await response.json();
// data.preparedTransaction.serialized — sign this
// data.simulation — { success, unitsConsumed, logs }
HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://api.solana.com/v1/issuance/tokens/tok_abc123/mint/prepare"))
    .header("Authorization", "Bearer sk_test_...")
    .header("Content-Type", "application/json")
    .POST(HttpRequest.BodyPublishers.ofString("""
        {
          "mint": {
            "destination": "7xKXz...9fGh",
            "amount": "1000000"
          },
          "options": { "simulate": true }
        }"""))
    .build();

Priority fees

Control transaction priority with options.priorityFee:

Values: "none", "low", "medium", "high", or a specific number in micro-lamports.

Burn tokens

Burn tokens from an account your wallet controls:

curl -X POST https://api.solana.com/v1/issuance/tokens/tok_abc123/burn \
  -H "Authorization: Bearer sk_test_..." \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: burn-001" \
  -d '{
    "burn": {
      "source": "3xYZa...2aBc",
      "amount": "500000",
      "memo": "Redemption"
    }
  }'
await fetch(
  "https://api.solana.com/v1/issuance/tokens/tok_abc123/burn",
  {
    method: "POST",
    headers: {
      "Authorization": "Bearer sk_test_...",
      "Content-Type": "application/json",
      "Idempotency-Key": "burn-001",
    },
    body: JSON.stringify({
      burn: {
        source: "3xYZa...2aBc",
        amount: "500000",
        memo: "Redemption",
      },
    }),
  }
);
HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://api.solana.com/v1/issuance/tokens/tok_abc123/burn"))
    .header("Authorization", "Bearer sk_test_...")
    .header("Content-Type", "application/json")
    .header("Idempotency-Key", "burn-001")
    .POST(HttpRequest.BodyPublishers.ofString("""
        {
          "burn": {
            "source": "3xYZa...2aBc",
            "amount": "500000",
            "memo": "Redemption"
          }
        }"""))
    .build();

The source can be the authority wallet or its token account. Use force-burn for other holder accounts.

Force-burn (admin)

Burn tokens from any account without the holder's signature. Requires tokens:admin permission:

curl -X POST https://api.solana.com/v1/issuance/tokens/tok_abc123/force-burn \
  -H "Authorization: Bearer sk_test_..." \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: force-burn-001" \
  -d '{
    "forceBurn": {
      "source": "3xYZa...2aBc",
      "amount": "500000",
      "memo": "Compliance action"
    }
  }'
await fetch(
  "https://api.solana.com/v1/issuance/tokens/tok_abc123/force-burn",
  {
    method: "POST",
    headers: {
      "Authorization": "Bearer sk_test_...",
      "Content-Type": "application/json",
      "Idempotency-Key": "force-burn-001",
    },
    body: JSON.stringify({
      forceBurn: {
        source: "3xYZa...2aBc",
        amount: "500000",
        memo: "Compliance action",
      },
    }),
  }
);
HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://api.solana.com/v1/issuance/tokens/tok_abc123/force-burn"))
    .header("Authorization", "Bearer sk_test_...")
    .header("Content-Type", "application/json")
    .header("Idempotency-Key", "force-burn-001")
    .POST(HttpRequest.BodyPublishers.ofString("""
        {
          "forceBurn": {
            "source": "3xYZa...2aBc",
            "amount": "500000",
            "memo": "Compliance action"
          }
        }"""))
    .build();

Both burn and force-burn also support /prepare endpoints for client-side signing.

Refresh supply

After minting or burning, refresh the cached supply:

curl -X POST https://api.solana.com/v1/issuance/tokens/tok_abc123/supply/refresh \
  -H "Authorization: Bearer sk_test_..."
await fetch(
  "https://api.solana.com/v1/issuance/tokens/tok_abc123/supply/refresh",
  {
    method: "POST",
    headers: { "Authorization": "Bearer sk_test_..." },
  }
);
HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://api.solana.com/v1/issuance/tokens/tok_abc123/supply/refresh"))
    .header("Authorization", "Bearer sk_test_...")
    .POST(HttpRequest.BodyPublishers.noBody())
    .build();