LIX & Economy
LIX is HELIX's hard currency. The wallet, in-world purchases, the marketplace, and the rules that keep value stable — all server-authoritative.
HELIX has a real, platform-wide economy. Two currencies:
- Coins — soft currency, earned and spent across worlds.
- LIX — hard currency, bought with real money. 100 LIX ≈ $1 (bundles can discount).
LIX pays for premium items, collectibles, platform services, and in-world purchases. Creator earnings land in the creator's withdrawable LIX balance; a cash-out flow is not part of the public API today.
LIX Credits
LIX Credits are a restricted kind of LIX, for example the one-time open-alpha starter grant. They
pay for platform services (Dreamer, publish and mint fees, hosting, storage) but never for another
creator's item or product, and they can't be transferred or cashed out. A purchase that would pay a
creator only counts your other LIX, so a player holding only Credits gets InsufficientFunds.
The economy is server-authoritative — always
Every LIX-affecting action is settled on the server. Clients request purchases; they never grant currency or items. All in-world purchase charges deduct LIX server-side. Treat any client-reported balance or grant as untrusted.
The wallet
Helix.wallet reads balances. Purchases go through Helix.marketplace (below).
Prop
Type
const { lix, coins } = await Helix.wallet.getBalance();In-world purchases (IWP)
To sell something, the client requests and the server authorizes and settles. The SDK persists an idempotency key per attempt so a retry can't double-charge, and the shell owns the Buy / Claim confirmation.
// client: request a purchase of a product your world registered with key "golden-key"
const result = await Helix.marketplace.purchaseProduct('golden-key');
if (result.completed) {
// Granted, Claimed or AlreadyOwned: charged and fulfilled server-side
}result.status is one of Pending, Granted, Claimed, AlreadyOwned, InsufficientFunds,
MaxPerUserReached, ProductInactive, ProductNotFound, NotInWorld, Unauthorized,
RateLimited, Cancelled, Failed, Timeout, NotFound or PriceChanged. completed is the
success convenience. After a reload or a dropped response, recover with
Helix.marketplace.getPurchase(idempotencyKey, ref).
World code never grants or charges anything itself. A consumable is a world product with a currency
grant that the world later spends with the server-atomic Helix.purchases.consume. See the
Inventory execution tiers and the
Sell an item for LIX guide.
What a world can sell
A purchase names exactly one server-owned route. An item definition on its own is not a purchase
reference: the server rejects item:<id> refs and the SDK rejects raw item UUIDs.
| Route | World call | Ref on the wire | Price and limits come from |
|---|---|---|---|
| World product your world registered | purchaseProduct(productKey) | pkey:<key> | the product |
| Distribution registered for this world | purchaseDistributionKey(key) | dkey:<key> | the distribution |
| Any creator's active public distribution | purchaseDistribution(distributionId) | distribution:<id> | the distribution |
| One collectible listing (a single serial, secondary sale) | purchaseListing(listingId) | listing:<id> | the seller's listing |
A distribution is how a creator sells a universal item: a primary offer with its own price (LIX
or Coins), per-player cap, claim cap and optional start/end window. A distribution or product priced 0
is a free Claim (still tracked and idempotent). quantity can be 1 to 100, except listings, which are
always 1.
| You want to… | Calls |
|---|---|
| Run a brand store: products on pedestals, walk up and Buy | purchaseDistributionKey or purchaseDistribution on interact |
| Hand out free souvenirs | a distribution priced 0; the popup shows Claim |
| Sell a world-defined product (a "Golden Key" that unlocks a door) | purchaseProduct → gate on the pass in purchases.getEntitlements() |
| Grant VIP / backstage access, even across other creators' worlds | inventory.hasItem(vipPassItemId) |
| Sell a consumable (extra life, refill) and spend it later | purchaseProduct with a currency grant → purchases.consume(code, amount) |
| Feature a resale collectible | marketplace.getListings → purchaseListing(listingId) |
| Build your own confirm UI | marketplace.getPurchaseContext(ref) |
| Show a LIX-aware UI (disable Buy when short) | wallet.getBalance + onBalanceChanged |
Universal items are physical things
Items players own are placeable, tradeable, equippable things — home décor, wearables,
collectibles. They are sold through a distribution, never a world product. Pure gameplay effects
(an extra life, a speed boost, a VIP pass for this world) are world product purchases — they are
not universal items. Players list and trade on the Marketplace; a world can feature one listing with
purchaseListing.
World products
A world product is a purchasable a world registers — the Roblox "developer product" analog — for
world-local effects: passes, named currency balances and consumables. It can't hand over a universal
item: the server rejects a product with an itemId or an item grant and points you at a
distribution instead. The price lives on the product server-side; world code names the product by
its key (purchaseProduct('golden-key') sends pkey:golden-key), never by a price or a UUID.
Register a product before prompting it (see Sell an item for LIX).
Prop
Type
Fulfilment is recorded as the player's entitlements in this world, which Helix.purchases reads
and spends:
Prop
Type
Limits per world: 512 products, 16 currency codes and 16 pass keys.
Distribution vs world product — when to use which
Both settle through the same charge→grant core and return the same PurchaseResult. A
distribution sells an existing universal item
at the distribution's price and pays the item's creator. A world product is registered by
your world, pays the world's creator, and is the only option for passes, world currencies and
pure gameplay consumables.
Managing products over HTTP
Registering and managing products is a creator / server action — there's no world-runtime SDK call for it (worlds only prompt purchases). Call these with the creator's session; only a world's owner may manage its products.
| Method · path | Body | Returns |
|---|---|---|
POST /api/v1/iwp/products | { worldId, key?, title, description?, priceLix, grants?, type?, maxPerUser? } | the created product |
PATCH /api/v1/iwp/products/:id | { title?, description?, priceLix?, maxPerUser?, active? } | the updated product |
POST /api/v1/iwp/products/:id/active | { active: boolean } | the product |
GET /api/v1/iwp/products/:id | — | the product |
GET /api/v1/iwp/creator/worlds/:worldId/products | — | your world's products |
curl -X POST "$API/api/v1/iwp/products" \
-H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
-d '{"worldId":"…","key":"golden-key","title":"Golden Key","priceLix":250,"grants":[{"kind":"pass","passKey":"golden-key"}]}'The purchase surface is shell-mediated (worlds call the SDK; the platform shell settles), but the endpoints exist for completeness — all require the player's session:
| Method · path | Purpose |
|---|---|
GET /api/v1/iwp/context?ref=&worldId=&quantity= | product/listing + live balance + eligibility (for the popup) |
POST /api/v1/iwp/purchase | { ref, worldId?, idempotencyKey, quantity? } → a PurchaseResult |
GET /api/v1/iwp/purchase/:idempotencyKey | status of a purchase (resume after a dropped connection) |
ref is pkey:<key>, dkey:<key>, distribution:<id> or listing:<id>; anything else is
ProductNotFound. The server always resolves price + payee itself — a client-supplied price is never
trusted. A player is limited to 20 purchase attempts a minute.
The marketplace
Helix.marketplace browses listings and initiates every in-world purchase. Rare collectibles trade
peer-to-peer for LIX on the Marketplace; a world can feature a single listing with
purchaseListing.
In-world purchases vs the Marketplace — two different things
These are distinct concepts that today share the Helix.marketplace namespace:
- In-world purchases (
purchaseProduct,purchaseDistributionKey,purchaseDistribution) are a creator selling to a player — a store/checkout. The analog is iOS StoreKit or Android Play Billing (and Roblox developer products): billing, not a storefront you browse. - The Marketplace (
getListings,purchaseListing) is the platform-wide, peer-to-peer exchange for collectibles — players trading with players.
Prop
Type
options is { quantity?, idempotencyKey? } (or a bare quantity number). Omit idempotencyKey and
the SDK persists one for you. Outside the shell, purchases resolve { status: 'Unauthorized', completed: false } and reads resolve empty or null.
Fees & payouts (platform policy)
- Collectible resales carry a seller fee of 10% by default (5% on Plus, 2.5% on Gold, 0% on Diamond) plus a 5% royalty to the original creator when the seller isn't the creator. The buyer pays no surcharge. Rates are platform-owned, snapshotted on each trade, and creators can't override them.
- Publishing an item can cost a one-off, non-refundable LIX fee by kind, unless the platform
has free uploads switched on. Read the live state from
GET /api/v1/universal-items/publish-configrather than assuming it. - LIX Credits can't pay a creator, and nothing in the public API cashes LIX out today.
These are platform-enforced — you don't implement them. The figures are the backend's defaults and can be changed by platform configuration.
Don't expose the provider
Payment processors and ledger internals are never part of the public SDK. You call Helix.wallet
and Helix.marketplace; HELIX handles settlement.
Reference
- Web SDK →
Helix.wallet/Helix.marketplace/Helix.purchases - Guide → Sell an item for LIX