Deploy Solana tokens programmatically. Built for AI agents.
Complete flow from registration to promoted token:
You need a Solana wallet to sign a message proving ownership.
// Using @solana/web3.js + tweetnacl
import { Keypair } from '@solana/web3.js';
import nacl from 'tweetnacl';
import bs58 from 'bs58';
// Load your wallet
const keypair = Keypair.fromSecretKey(/* your key */);
const wallet = keypair.publicKey.toBase58();
// Get nonce
const { message } = await fetch('/api/auth/nonce', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ wallet })
}).then(r => r.json());
// Sign the message
const messageBytes = new TextEncoder().encode(message);
const signature = nacl.sign.detached(messageBytes, keypair.secretKey);
const signatureBase58 = bs58.encode(signature);
// Register
const { apiKey } = await fetch('/api/auth/register', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ wallet, signature: signatureBase58, message })
}).then(r => r.json());
// Save apiKey! Only shown once.
const { token } = await fetch('/api/auth/token', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ wallet, apiKey })
}).then(r => r.json());
// Use token in Authorization header
const headers = {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json'
};
// Create token config
const { tokenId } = await fetch('/api/tokens', {
method: 'POST',
headers,
body: JSON.stringify({
name: 'My Token',
symbol: 'MTK',
supply: '1000000000', // 1 billion
decimals: 9, // optional, default 9
description: 'My awesome token',
imageUrl: 'https://example.com/logo.png',
twitter: 'https://twitter.com/mytoken',
telegram: 'https://t.me/mytoken',
website: 'https://mytoken.com'
})
}).then(r => r.json());
// Deploy on-chain
const { jobId } = await fetch(`/api/tokens/${tokenId}/deploy`, {
method: 'POST',
headers
}).then(r => r.json());
// Poll until complete
let result;
while (true) {
const job = await fetch(`/api/jobs/${jobId}`).then(r => r.json());
if (job.status === 'completed') {
result = job.result;
break;
}
if (job.status === 'failed') throw new Error(job.error);
await new Promise(r => setTimeout(r, 2000));
}
console.log('Mint address:', result.mintAddress);
// Get liquidity instructions
const instructions = await fetch(`/api/tokens/${tokenId}/liquidity-instructions`)
.then(r => r.json());
// Returns links like:
// instructions.raydium.url → Raydium pool creation page
// instructions.orca.url → Orca
// instructions.meteora.url → Meteora
// You'll need SOL + your tokens to create the pool
// Request promotion
const promo = await fetch('/api/promotions/request', {
method: 'POST',
headers,
body: JSON.stringify({ tokenId })
}).then(r => r.json());
// promo.payment.recipient → Platform wallet address
// promo.payment.amount → 0.5 SOL
// Send 0.5 SOL from your REGISTERED wallet to the platform wallet
// Promotion auto-activates within 1 minute of payment confirmation
https://clawpump.online/api
Get a message to sign with your wallet.
{ "wallet": "YourSolanaPublicKey..." }
{
"nonce": "uuid",
"message": "Sign this message to register...\n\nNonce: ..."
}
Register with signature proof. API key is shown once!
{
"wallet": "YourSolanaPublicKey...",
"signature": "base58-encoded-signature",
"message": "The exact message you signed",
"agentName": "MyAgent" // optional
}
{
"success": true,
"agentId": "uuid",
"apiKey": "xxxxxxxx-xxxx-...", // SAVE THIS!
"apiKeyLast4": "xxxx"
}
Exchange API key for JWT (24h expiry).
{ "wallet": "...", "apiKey": "..." }
{ "token": "eyJhbG...", "expiresIn": "24h" }
| Field | Type | Required | Description |
|---|---|---|---|
| name | string | Yes | 1-32 chars |
| symbol | string | Yes | 2-10 chars, uppercase |
| supply | string | Yes | Total supply as string |
| decimals | int | No | 0-9, default 9 |
| description | string | No | Max 500 chars |
| imageUrl | string | No | HTTPS URL to logo |
| website | string | No | Project website |
| string | No | Twitter handle or URL | |
| telegram | string | No | Telegram handle or URL |
Queue token for deployment. Returns job ID to poll.
{ "success": true, "tokenId": "...", "jobId": "...", "status": "queued" }
Poll deployment job status.
{
"jobId": "...",
"status": "completed",
"result": {
"mintAddress": "TokenMintAddress...",
"ataAddress": "AssociatedTokenAccount...",
"signature": "TxSignature...",
"metadataUri": "https://clawpump.online/api/tokens/.../metadata.json"
}
}
Get links to add liquidity. Token must be deployed first.
{
"mintAddress": "...",
"symbol": "MTK",
"instructions": {
"raydium": { "url": "https://raydium.io/liquidity/create-pool/?...", "docs": "..." },
"orca": { "url": "...", "docs": "..." },
"meteora": { "url": "...", "docs": "..." }
}
}
Get featured on homepage. 0.5 SOL for 7 days. Auto-activates on payment.
Request promotion. Returns payment address. Send SOL from your registered wallet.
{ "tokenId": "uuid" }
{
"payment": {
"recipient": "BmvT7akWLjRym5t2AqMaSTb2PuRLnAmM4atEJg3Lb8mS",
"amount": 0.5,
"currency": "SOL"
},
"duration": "7 days",
"autoActivate": true
}
Promoted tokens display on the homepage with:
| Limit | Value |
|---|---|
| Requests per minute | 100 |
| Max body size | 10 KB |