TrenchyToolsAPI

Vanity mint

A mint that ends in `pump` (or another short pattern): instant from our warm pool, a bounded job for other patterns, or the SDK grinder on your own CPU.

pump.fun coins conventionally end in pump, letsbonk coins in bonk. The address is the mint keypair's public key, so a pattern means grinding keypairs until one matches (a 4-character suffix averages 11 million tries). Three tiers: warm pool — we keep a few …pump and …bonk keys ready, so the common request answers at once; job — other patterns up to 4 characters are ground on our workers (up to 10 minutes); local — the SDK grinder on your own CPU, no limits, the key never exists anywhere else (the recommended default for anything custom).

A job's keypair is handed out once and never stored or logged. Use it promptly as the mint of your own create: anyone who sees the secret first could create a token at that address.
Save the keypair to disk the moment you get it (the wallets/ pattern on Wallet backups); a mint key that only lives in memory is a launch you cannot repeat.
POSThttps://api.trenchytools.lol/api/sol/vanity

Start a job

FieldTypeDescription
suffixstringBase58 characters the address must end with, e.g. pump. Case-sensitive by default.
prefixstringBase58 characters it must start with. suffix + prefix together ≤ 4 characters on our workers; longer patterns → vanity_too_long, grind locally.
caseSensitivebooleanDefault true (pump.fun shows the exact case). false matches letters in either case and is ~30 % faster per character.
curl -X POST "https://api.trenchytools.lol/api/sol/vanity?api-key=YOUR_API_KEY" \
  -H "content-type: application/json" \
  -d '{"suffix":"pump"}'
Response (202 · pooled key: status
{
  "jobId": "k3Jt…",
  "status": "running",
  "suffix": "pump",
  "caseSensitive": true,
  "expectedAttempts": 11316496,
  "limits": { "maxChars": 4, "workersPerJob": 3, "timeoutS": 600, "maxJobs": 2, "pool": { "ready": { "pump": 5, "bonk": 3 } } },
  "poll": "/api/sol/vanity/k3Jt…"
}

Poll a job

GET /api/sol/vanity/:jobId → status running (with attempts, elapsedMs), failed (with reason, e.g. the 10-minute limit), or done with publicKey and secretKey — once. pooled: true marks a key that came from the warm pool. A second read says collected: true. Results are kept 10 minutes. One running job per key; when the workers are busy you get 429 vanity_busy: retry in a minute or grind locally.

Response (done)
{
  "jobId": "k3Jt…", "status": "done", "attempts": 9412377, "elapsedMs": 171204,
  "publicKey": "7gH…pump",
  "secretKey": "<base58, shown once>",
  "warning": "Shown once; we keep nothing. Use it only as the mint of your own create, promptly."
}

Same search on your own CPU, no limits, the key never leaves the process. The SDK ships it; any example repo has the worker.

JavaScript
import { grindVanity } from '@trenchytools/sdk/vanity'

const { keypair, attempts } = await grindVanity({ suffix: 'pump', workers: 8 })   // ~1–2 min on 8 cores
// keypair.publicKey.toBase58() ends in "pump"; pass it as `mint` and sign the create with it

What each launchpad expects

LaunchpadAddress patternWho makes it
pump.fun…pump (convention, optional)You: vanity mint keypair
letsbonk (LaunchLab)…bonk (convention, optional)You: vanity mint keypair
StonkFun (LaunchLab)none—
four.meme (BNB)…4444 alwaysThe launchpad (CREATE2 salt), nothing to do
Flap (BNB)none known—
pons (Robinhood)derived from form + saltSalt search; not exposed yet

GET /api/chains carries the same address info per launchpad so an assistant knows when to grind and when not to.