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.
Troubleshooting
Wallet must support signAllTransactions
Wallet must support signAllTransactions
WALLET_SIGN_ALL_TRANSACTIONS_REQUIRED, switch to a wallet adapter that
supports signAllTransactions, or wrap your existing one before calling
blank.launch.create(). Same fix for WALLET_SIGN_TRANSACTION_REQUIRED on
a single-transaction build — the adapter is missing signTransaction.EMPTY_BUNDLE thrown by SDK
EMPTY_BUNDLE thrown by SDK
blank.launch.create() again to
rebuild. If it keeps happening, grab the X-Request-Id from the failing build
response and report it.Payload expired
Payload expired
LAUNCH_BUILD_PAYLOAD_MODIFIED or API_SUBMISSION_PAYLOAD_MODIFIED (400)
LAUNCH_BUILD_PAYLOAD_MODIFIED or API_SUBMISSION_PAYLOAD_MODIFIED (400)
Metadata URI too long
Metadata URI too long
metadataUri under 72 bytes. Use canonical ipfs://... or ar://...
URIs — gateway URLs are rejected. The 72-byte cap applies even when the launch
bundle uses two transactions.LAUNCH_BUILD_METADATA_URI_PROTOCOL (400) — gateway URL rejected
LAUNCH_BUILD_METADATA_URI_PROTOCOL (400) — gateway URL rejected
gateway.pinata.cloud, dweb.link,
nftstorage.link, cloudflare-ipfs.com, arweave.net, etc.) because
gateways can disappear, redirect, or rate-limit. Use the canonical
ipfs://<cid>/... or ar://<txid> form.LAUNCH_BUILD_TRANSACTION_TOO_LARGE (400)
LAUNCH_BUILD_TRANSACTION_TOO_LARGE (400)
name, symbol, metadataUri, and creatorFeeSplit.
Shorten the name, shorten the symbol, switch to a compact ipfs:// or ar://
URI, or reduce the number of fee-split entries.LAUNCH_BUILD_METADATA_UNRESOLVABLE or LAUNCH_BUILD_METADATA_IMAGE_REQUIRED (400)
LAUNCH_BUILD_METADATA_UNRESOLVABLE or LAUNCH_BUILD_METADATA_IMAGE_REQUIRED (400)
image URI. Upload the
image and metadata first, then poll a public gateway until the metadata
returns HTTP 200 JSON with the expected image. Pass the canonical
ipfs://... or ar://... URI to Blank, not the gateway URL, then rebuild.LAUNCH_ACTIVATION_PENDING (503)
LAUNCH_ACTIVATION_PENDING (503)
LAUNCH_BUILD_CREATOR_IS_LAUNCH_SIGNER (400)
LAUNCH_BUILD_CREATOR_IS_LAUNCH_SIGNER (400)
creator wallet you passed equals Blank’s own launch signer. Usually
happens when an example wallet address gets copied into a bot config. Pass the
bot/controller wallet you actually own, or omit creator so it defaults to
the wallet that signs.LAUNCH_BUILD_STAKING_SHARE_INVALID (400)
LAUNCH_BUILD_STAKING_SHARE_INVALID (400)
creatorFeeSplit must total exactly 10,000 bps
creatorFeeSplit must total exactly 10,000 bps
creatorFeeSplit has
to sum to exactly 10_000 across one to five unique wallets. A 7_000 / 3_000 split is 70% / 30%; 7_000 / 2_900 gets rejected by schema validation
as LAUNCH_BUILD_INVALID_REQUEST.Staking enable returns success without a transaction
Staking enable returns success without a transaction
Staking top-up returns 404
Staking top-up returns 404
blank.launch.create({ staking: { shareBps } }); for existing tokens, call blank.staking.enable() and wait
for that transaction to confirm before topping up.Staking top-up returns "at least one active staker"
Staking top-up returns "at least one active staker"
Fees show zero
Fees show zero
total_staking_earned is zero, check staking_enabled first — staking
rewards only start accruing once blank.staking.enable() has been called and
the pool is active. The fee endpoint is public, so this is never an auth
problem.API_KEY_REQUIRED or API_KEY_INVALID (401)
API_KEY_REQUIRED or API_KEY_INVALID (401)
Authorization: Bearer sk_blank_... (or x-blank-api-key).
API_KEY_INVALID also covers revoked, expired, or malformed keys — rotate in
Settings → API Keys. If you don’t have a key yet, see
Authentication.API_KEY_USERNAME_REQUIRED (403/409)
API_KEY_USERNAME_REQUIRED (403/409)
API_KEY_LIMIT_REACHED (409)
API_KEY_LIMIT_REACHED (409)
API_KEY_INTENT_MISMATCH (403)
API_KEY_INTENT_MISMATCH (403)
REQUIRED_SIGNER_SIGNATURE_INVALID (403)
REQUIRED_SIGNER_SIGNATURE_INVALID (403)
requiredUserSigner, then submit.SUBMISSION_INTENT_REQUIRED_SIGNER_MISSING (409)
SUBMISSION_INTENT_REQUIRED_SIGNER_MISSING (409)
blank.launch.create() (or the matching staking call) to produce a fresh
intent.IDEMPOTENCY_KEY_IN_FLIGHT (409)
IDEMPOTENCY_KEY_IN_FLIGHT (409)
Idempotency-Key is still being processed. Wait
for it to settle and check the result. If the original ended up failing, the
lock is released automatically and your next retry goes through normally.TOO_MANY_ACTIVE_RESERVATIONS (429)
TOO_MANY_ACTIVE_RESERVATIONS (429)
CREATOR_RATE_LIMITED (429)
CREATOR_RATE_LIMITED (429)
LAUNCH_SIGNER_RATE_LIMIT (503)
LAUNCH_SIGNER_RATE_LIMIT (503)
Retry-After response header and retry.VANITY_POOL_EXHAUSTED or VANITY_POOL_CONTAMINATED (503)
VANITY_POOL_EXHAUSTED or VANITY_POOL_CONTAMINATED (503)
503s; an exponential backoff with a small cap is enough.LAUNCH_BASIC_TRANSPORT_AUTO_DISALLOWED or LAUNCH_BASIC_BUNDLE_ONLY_REQUIRED (400)
LAUNCH_BASIC_TRANSPORT_AUTO_DISALLOWED or LAUNCH_BASIC_BUNDLE_ONLY_REQUIRED (400)
bundleOnly: true. The SDK does this for you. If you’re hitting the HTTP submit endpoint
directly, send both transport: "jito" and bundleOnly: true — leaving
either off triggers one of these two errors. On devnet, use transport: "rpc".LaunchSubmissionFailedError thrown by SDK
LaunchSubmissionFailedError thrown by SDK
LAUNCH_SUBMISSION_UNKNOWN_ERROR thrown by SDK
LAUNCH_SUBMISSION_UNKNOWN_ERROR thrown by SDK
X-Request-Id
from the response and call
blank.launch.retrySubmit({ submissionIntentId, signedTransactions }) if the
error exposed those fields. If it didn’t, rebuild and sign again.