/launch form on Bags. You build the URL once (with a token name, ticker, description, image, fee sharing, partner overrides, and more), share it anywhere, and the recipient lands on the launch form with everything filled in. They review and click launch.
In this guide you’ll learn how to build a launch intent URL from scratch, how to embed it as a button on your own webpage, and how to attach your partner key so every launch routed through your link earns you a share of the trading fees.
How it works
When a user opens a launch intent URL, the Bags/launch page:
- Parses every supported query param.
- Hydrates the form fields, toggles (fee sharing, tokenize equity), the admin wallet, partner overrides, and optionally fetches the image URL into the upload slot.
- Replaces the URL with
/launchso the share link stays reusable and the user sees a clean URL. - Shows a toast confirming the prefill (plus a separate warning toast if any individual field failed validation).
intent=true is the only required value. Any other param is optional, and the page ignores all params if intent=true is missing.
Prerequisites
No API key is required to build a launch intent URL — it is purely client-side.Optional — earn fees from launches via your link. If you create a partner key and include it as the
partner and partnerConfig params, every launch routed through your intent URL will credit the partner share to your key. See Create a Partner Key before continuing if you want this behaviour.Encoding rules
- Each param value must be passed through
encodeURIComponent. UsingURLSearchParamsorURL.searchParams.sethandles this for you automatically. - For complex values (arrays and objects), serialize them with
JSON.stringifyfirst, then set them on the search params. - All basis-point values use the convention
2500 = 25%,10000 = 100%. The sum ofallocationBpsacross allfeeShareentries must be<= 10000.
Supported parameters
Basic text fields
name— token name, max 32 characters.ticker— alphanumeric, max 10 characters. Auto-uppercased by the form.description— free-form token description.website— any valid URL. Automatically expands the “Social links” section on the form.twitter—https://twitter.com/...orhttps://x.com/...URL. Also auto-expands social links.
Image
image— absolutehttp://orhttps://URL to an image.- The page fetches the URL client-side, so the host must allow CORS. If CORS fails the user sees a “Could not load image from link” toast and must upload the image manually.
- The response
Content-Typeheader is used as the file mime type. A non-image mime is rejected. - The filename is derived from the URL pathname, falling back to
intent-image.<ext>.
Initial buy
initialBuy— numeric string representing a USD amount, for example"100". Negative or non-finite values are silently ignored.
Fee mode
feeMode— one of the followingMETEORA_CONFIG_TYPEkeys:DEFAULT— Founder Mode, 1% of trading volume.BPS100PRE_BPS25POST_5000_COMPOUNDING— ~0% mode.BPS1000PRE_BPS1000POST— Paper Hand Tax mode.BPS25PRE_BPS100POST_5000_COMPOUNDING— advanced.BPS1000PRE_BPS1000POST_5000_COMPOUNDING— advanced.
- Unknown keys are ignored and produce a warning toast.
Some fee modes disable fee sharing in the UI (for example
BPS100PRE_BPS25POST_5000_COMPOUNDING). If you set both feeMode and fee-sharing params, the mode wins: feeShareEnabled, feeShareType, and feeShare are dropped at parse time and a warning toast is shown.Fee sharing
feeShareEnabled—"true"toggles the fee-sharing section on. Also auto-enabled when a non-emptyfeeSharearray is provided.feeShareType—"multi"(default) or"csv". Controls which tab is shown.feeShare— JSON array. Each entry has this shape:
allocationBps: positive integer, basis points (2500 = 25%). The sum across all entries must be<= 10000. The floor of each value is applied.platform: one of the enabled platforms:twitter,tiktok,github,moltbook,solana,kick. Disabled platforms (instagram,twitch,onlyfans) are rejected.username: non-empty string. Whenplatformis"solana", this must be a base58 Solana public key.- At most 100 entries. Extras are truncated with a warning.
Admin wallet
admin— base58 Solana public key. Sets the admin wallet when fee sharing is enabled.- Invalid pubkeys are ignored with a warning.
- The admin field is only editable in the UI when fee sharing is on, but the intent still applies the value.
Tokenize equity
tokenizeEquity—"true"toggles the tokenize-equity section on. Auto-enabled ifequityis provided.equity— JSON object. Full shape:
projectName: string, required by the form at submit time.bedrockShareBasisPoint: integer bps. Defaults to2500(25%) if missing. The sum of allfounders[].shareBasisPointplusbedrockShareBasisPointmust equal exactly10000at submit time.category: one ofRWA,AI,DEFI,INFRA,DEPIN,LEGAL,GAMING,NFT,MEME, or the empty string"". Unknown values are dropped with a warning.twitterHandle: 1–15 alphanumeric/underscore characters, no@prefix. Validated at submit time.preferredCompanyNames: array of exactly 3 unique strings (the form enforces uniqueness at submit time).founders: array of founder objects. All string fields default to empty,shareBasisPointdefaults to0.
Partner override
These two params are not editable in the UI. They override the ref-code partner lookup that would otherwise come from the browser cookie.partner— base58 Solana public key.partnerConfig— base58 Solana public key.
These keys are a matched on-chain pair. If you supply one, you must supply the other — the launch uses the override pair exclusively and will not fall back to the ref-code pair for the missing half. Always emit both together, or omit both. See Create a Partner Key for how to obtain these values.
UI state
showSocial—"true"pre-expands the “Social links (optional)” collapsible. Automaticallytruewhenwebsiteortwitteris present.
Boolean values
Any param documented as boolean accepts:"true"or"1"→ true"false"or"0"→ false- missing → undefined (no change to the default)
Error handling
The launch page never fails the whole intent for a single bad field. Instead, it ignores the offending value and surfaces a warning:- Invalid JSON for
feeShareorequity→ the param is ignored, the rest of the intent still applies, warning toast. - Invalid Solana pubkey (
admin,partner,partnerConfig) → ignored, warning toast. - Unknown
feeModekey → ignored, warning toast. - Image fetch failure (CORS, 404, non-image mime) → error toast, user must upload manually.
(+N more) counter, and every warning is also logged to console.warn. Since nothing is validated server-side, your builder UI should enforce the same rules before producing the link.
Build an intent URL in TypeScript
Here is a reusable helper that serializes a typed input into a launch intent URL. Drop it into your builder UI or a server that returns share links:Always emit
partner and partnerConfig together. The helper above enforces this by only setting them when both are present.Embed a launch button on your webpage
Once you have a share URL, dropping a “Launch on Bags” button onto any webpage is straightforward. Pick whichever flavour matches your stack.Plain HTML
If your intent is static (for example, a marketing page for a single token you want to promote), paste the URL into an anchor styled as a button:Vanilla JavaScript
If the intent depends on page state (for example, a form the user is filling in), build the URL at click time:React component
If you’re already on React, wrap the builder in a component:The
image param must be a public URL. Local File uploads from a file input cannot be encoded into a URL — if you need a custom image, upload it to your CDN first and pass the resulting URL.Earn fees from launches via your link
Attaching your partner key turns every share into a revenue stream: when a user completes a launch through your intent URL, the partner share of trading fees is routed to your key instead of to the ref-code partner that would otherwise be looked up from the cookie. To enable this:- Create a partner key by following Create a Partner Key. You end up with:
- a partner wallet pubkey (your wallet) → becomes the
partnerparam - a partner config PDA → becomes the
partnerConfigparam
- a partner wallet pubkey (your wallet) → becomes the
- Pass both values to
buildLaunchIntentUrl(or whichever builder you use). - Periodically claim the accumulated fees — see Claim Partner Fees.
The
partner and partnerConfig values are a matched on-chain pair. If you set one without the other, the launch page ignores both and shows a warning toast. Always include the pair together.Notes and caveats
- No server-side validation. The launch page parses params on the client only. Your builder UI should enforce the same rules (bps sum ≤ 10000, valid Solana pubkeys, image URL reachable, exactly 3 unique
preferredCompanyNames, etc.) before producing the link so the recipient never sees warning toasts. - The URL is cleaned after hydration. Once the form is populated, the recipient’s browser replaces the URL with
/launch. Do not rely on hashes or anchors persisting. - Image files cannot be encoded. A
Fileobject from an<input type="file">cannot be put into a URL. Upload the image to a CDN first and pass the resulting public URL as theimageparam. - Keep links short. Only emit params that differ from the form defaults. For example, skip
feeMode=DEFAULTand skipshowSocialwhenwebsiteortwitteris already present (both auto-expand the social links section). - Keep your partner pair together. Emitting
partnerwithoutpartnerConfig(or vice versa) drops both values at parse time.
