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.

Metadata URI Rules

The metadata URI you pass to blank.launch.create() has a few strict rules. They exist to keep transaction sizes predictable and to make sure the URI you launched with stays valid forever.

URI limits

  • Max 72 bytes. That’s the hard cap on metadataUri.
  • Use canonical, compact URIs. Specifically ipfs://... or ar://....
  • No gateway URLs. Anything that points through a gateway is rejected — including gateway.pinata.cloud, dweb.link, nftstorage.link, cloudflare-ipfs.com, arweave.net, and similar. Gateways can disappear, redirect, or rate-limit; the underlying content hash should not.
The 72-byte limit applies even when the launch bundle uses two transactions. We keep it tight so the SDK, worker, and on-chain limits all stay aligned.

Required launch sequence

Metadata must be publicly readable before you call blank.launch.create(). For bots and other automated launchers:
  1. Upload the image.
  2. Upload metadata JSON that points to that image.
  3. Fetch the metadata through a public gateway until it returns HTTP 200 JSON.
  4. Confirm the JSON has an image URI.
  5. Pass the canonical ipfs://... or ar://... URI to Blank.
Do not treat an upload response from Pinata, Arweave, or another provider as proof that the public gateway is ready. Propagation can lag. Blank performs the same public-read check during build, so launching too early returns LAUNCH_BUILD_METADATA_UNRESOLVABLE.

Metadata JSON

The worker fetches and resolves your metadata at build time so it can populate the token’s row in our database. At minimum, your JSON should look like this:
{
  "name": "Example Token",
  "symbol": "EXAMPLE",
  "description": "Short public description.",
  "image": "ipfs://bafy.../image.png"
}
These optional fields are picked up if you include them: website, twitter, telegram, github.
Keep name and symbol consistent between your launch input and the metadata JSON. They should be the same in both places.
If the metadata can’t be resolved, or if the JSON has no image, Blank rejects the build. Upload your image and metadata first, verify the canonical URI resolves through a public gateway, and only then call blank.launch.create().