Skip to main content

Documentation Index

Fetch the complete documentation index at: https://blank.build/docs/llms.txt

Use this file to discover all available pages before exploring further.

Quickstart

You’ll need:
  • Node.js 20 or newer for any server-side code.
  • A Blank account with a username and an API key from Settings → API Keys.
  • A funded Solana wallet to sign as the creator.
  • A canonical ipfs://... or ar://... metadata URI that already resolves to public JSON with an image field.

Install the SDK

npm install @blankdotbuild/sdk @solana/web3.js

Create a client

Create an API key in Settings → API Keys, then put it in your server environment:
BLANK_API_KEY=sk_blank_...
SOLANA_SECRET_KEY=[12,34,...]   # JSON array from your keypair file
Now create the client and a wallet to sign with:
import { Keypair } from "@solana/web3.js";
import {
  createBlankClient,
  createBlankKeypairWallet,
} from "@blankdotbuild/sdk";

const blank = createBlankClient({
  baseUrl: "https://api.blank.build",
  apiKey: process.env.BLANK_API_KEY,
  defaultSubmitTransport: "auto",
});

const secretKey = Uint8Array.from(JSON.parse(process.env.SOLANA_SECRET_KEY!));
const wallet = createBlankKeypairWallet(Keypair.fromSecretKey(secretKey));
If you’re plugging in a browser wallet adapter instead of a keypair, you can pass any object that exposes publicKey and Solana signing methods. Just make sure it supports signAllTransactions — launches sometimes need more than one transaction signed in one go.

Launch a token

Upload your image and metadata before launching. If you use IPFS, wait until a public gateway can fetch the metadata JSON; a Pinata upload response can arrive before every gateway is ready.
const result = await blank.launch.create(
  {
    name: "Example Token",
    symbol: "EXAMPLE",
    metadataUri: "ipfs://bafy.../metadata.json",
    antiSnipeEnabled: true,
    staking: {
      shareBps: 2_000, // optional: 20% of creator fees goes to stakers
    },
    creatorFeeSplit: [
      { walletAddress: creatorWallet, bps: 7_000 }, // 70%
      { walletAddress: partnerWallet, bps: 3_000 }, // 30%
    ],
  },
  wallet
);

console.log(result.mintAddress, result.submission.signature);
A few things to know:
  • metadataUri must be ready before launch. Blank resolves it during build and rejects metadata that is not public JSON or has no image. See Metadata URI Rules.
  • creatorFeeSplit uses basis points. 100 bps = 1%, so the splits in any single launch must add up to 10,000 bps (100%). You can have one to five recipient wallets.
  • staking.shareBps is optional. Include it when you want staking enabled as part of launch.
  • antiSnipeEnabled: true turns on the short launch-protection window that makes large early sniper buys progressively more expensive. Most launches want this on.
  • Some wallets show one approval, others show several. That’s fine — your code still calls blank.launch.create() exactly once.

What you get back

A successful launch returns:
  • launchId — Blank’s record of the launch
  • mintAddress — the token’s mint
  • poolAddress — the bonding curve pool
  • feeCollector — the on-chain account that gathers fees
  • stakingPoolAddress — the staking pool address, or null if staking was not enabled at launch
  • submission.signature and submission.signatures — the on-chain transaction signatures
  • submission.kind — either "jito" or "rpc" depending on how it was submitted
That’s it. The token is now a normal Blank token: it shows up on the discovery feed, has a token page, and trades on the bonding curve like any other.