Skip to main content
Launchpad tokens go through a series of stages before they become fully tradeable on a DEX. This guide explains each stage, how to detect them with the Codex API, and which events fire along the way. This complements the Launchpads recipe which covers building a launchpad discovery UI.

The Stages

Tokens on bonding-curve launchpads (Pump.fun, Four.meme, LaunchLab, etc.) progress through these stages:
Deployed → Created → Bonding (Updated) → Completed → Migrated
StageWhat’s happeningKey fields
DeployedToken contract discovered on-chaineventType: Deployed
CreatedMetadata populated (name, symbol, image)eventType: Created
BondingTrading on bonding curve, graduationPercent rising from 0→100eventType: Updated, graduationPercent < 100
CompletedBonding curve filled — waiting for migrationcompleted: true, migrated: false
MigratedLiquidity moved to DEX pool — fully tradeablemigrated: true, migratedPoolAddress set
Completed vs Migrated: completed means the bonding curve is full. migrated means liquidity has actually moved to a DEX. For monitoring graduations via subscriptions, use Migrated events — Completed events are a legacy state and will be deprecated.
Not all launchpads have bonding curves. Protocols like Zora, Clanker, and Baseapp skip the bonding curve entirely. Tokens on these protocols go straight to “Created” without progressing through completion or migration. Fields like graduationPercent, completed, migrated, and migratedAt will be absent for these tokens. Doppler-based protocols (like Bankr) are a related case. They manage liquidity along ticks on Uniswap pools rather than progressing through a traditional bonding curve, so graduationPercent, completed, and completedAt will be null. Migration is still tracked when it occurs, but is rare in practice.

Detecting Token State

Use the launchpad field on the token query to check a token’s current lifecycle stage.
Test this query in the Explorer →
query LaunchpadState {
  token(
    input: {
      address: "9wK8yN6iz1ie5kEJkvZCTxyN1x5sTdNfx8yeMY8Ebonk"
      networkId: 1399811149
    }
  ) {
    name
    symbol
    launchpad {
      launchpadName
      launchpadProtocol
      graduationPercent
      poolAddress
      completed
      completedAt
      migrated
      migratedAt
      migratedPoolAddress
    }
  }
}
Use this logic to determine the current stage:
function getTokenStage(launchpad) {
  if (!launchpad) return 'not-a-launchpad-token'
  if (launchpad.migrated) return 'migrated'
  if (launchpad.completed) return 'completed'
  if (launchpad.graduationPercent > 0) return 'bonding'
  return 'new'
}

Filtering by Stage

Use filterTokens with launchpad filters to query tokens at each stage. These are the same filters that power the columns in the Launchpads recipe.
Test this query in the Explorer →
query BondingTokens {
  filterTokens(
    filters: {
      launchpadCompleted: false
      launchpadMigrated: false
      launchpadGraduationPercent: { gt: 0 }
    }
    rankings: { attribute: graduationPercent, direction: DESC }
    limit: 10
  ) {
    results {
      createdAt
      marketCap
      priceUSD
      token {
        name
        symbol
        address
        networkId
        launchpad {
          launchpadName
          graduationPercent
          completed
          migrated
        }
      }
    }
  }
}
Test this query in the Explorer →
query RecentlyMigrated {
  filterTokens(
    filters: { launchpadMigrated: true }
    rankings: { attribute: launchpadMigratedAt, direction: DESC }
    limit: 10
  ) {
    results {
      createdAt
      marketCap
      priceUSD
      token {
        name
        symbol
        address
        networkId
        launchpad {
          launchpadName
          graduationPercent
          migrated
          migratedAt
          migratedPoolAddress
        }
      }
    }
  }
}
Use launchpadName or launchpadProtocol to narrow down to a specific launchpad.Test this query in the Explorer →
query PumpFunTokens {
  filterTokens(
    filters: {
      launchpadName: ["Pump.fun"]
      launchpadCompleted: false
      launchpadMigrated: false
    }
    rankings: { attribute: createdAt, direction: DESC }
    limit: 10
  ) {
    results {
      createdAt
      marketCap
      priceUSD
      token {
        name
        symbol
        address
        networkId
        launchpad {
          launchpadName
          launchpadProtocol
          graduationPercent
        }
      }
    }
  }
}
For the complete list of supported launchpads with their launchpadName and protocol filter values, see Supported Launchpads.

Real-Time Lifecycle Events

Subscribe to onLaunchpadTokenEventBatch to receive events as tokens progress through each stage. Filter by eventType to listen for specific transitions.
Test this query in the Explorer →
subscription NewLaunchpadTokens {
  onLaunchpadTokenEventBatch(input: { eventType: Created }) {
    eventType
    address
    networkId
    launchpadName
    marketCap
    price
    holders
    token {
      name
      symbol
      address
      networkId
      createdAt
      launchpad {
        graduationPercent
        poolAddress
      }
    }
  }
}
Updated events fire as tokens trade on the bonding curve. These include statistics like price, volume, and holder counts — fields that aren’t available on Created or Migrated events.Test this query in the Explorer →
subscription BondingCurveUpdates {
  onLaunchpadTokenEventBatch(input: { eventType: Updated }) {
    eventType
    address
    networkId
    launchpadName
    marketCap
    price
    holders
    volume1
    buyCount1
    sellCount1
    sniperCount
    sniperHeldPercentage
    bundlerCount
    bundlerHeldPercentage
    devHeldPercentage
    top10HoldersPercent
    token {
      name
      symbol
      launchpad {
        graduationPercent
      }
    }
  }
}
Subscribe to Migrated events to detect when a token graduates from its bonding curve and moves to a DEX pool.Test this query in the Explorer →
subscription TokenGraduations {
  onLaunchpadTokenEventBatch(input: { eventType: Migrated }) {
    eventType
    address
    networkId
    launchpadName
    marketCap
    price
    liquidity
    token {
      name
      symbol
      address
      networkId
      launchpad {
        graduationPercent
        migrated
        migratedAt
        migratedPoolAddress
      }
    }
  }
}
Use onLaunchpadTokenEvent with an address to follow a single token through all its stages.Test this query in the Explorer →
subscription TrackToken {
  onLaunchpadTokenEvent(
    input: {
      address: "9wK8yN6iz1ie5kEJkvZCTxyN1x5sTdNfx8yeMY8Ebonk"
      networkId: 1399811149
    }
  ) {
    eventType
    marketCap
    price
    holders
    token {
      name
      symbol
      launchpad {
        graduationPercent
        completed
        migrated
        migratedAt
        migratedPoolAddress
      }
    }
  }
}
Launchpad events are extremely high-frequency. You must proxy this data through your backend to serve multiple users from a single subscription. We offer a monthly flat-rate option with unlimited requests. Contact us for more information.

Event Types Reference

Event TypeWhen it firesStats available?
DeployedToken contract discovered on-chainNo
CreatedToken metadata populatedNo
UpdatedToken stats change (trades, price, holders)Yes — price, volume, holders, sniper/bundler counts
CompletedBonding curve filled (legacy — use Migrated)No
MigratedLiquidity moved to DEX poolNo
UnconfirmedDeployedToken discovered before finalizationNo
UnconfirmedMetadataMetadata processed before finalizationNo
Statistics fields (price, volume1, holders, sniperCount, etc.) are only populated on Updated events. Other event types signal a state change but don’t include these metrics.

After Migration

Once a token migrates, it behaves like any other DEX token. You can switch from launchpad subscriptions to the standard Codex endpoints:
DataEndpoint
Price & volumepairMetadata using the migratedPoolAddress
Live priceonPairMetadataUpdated
TradesgetTokenEvents
Live tradesonTokenEventsCreated
ChartgetTokenBars
Live chartonTokenBarsUpdated
See the Detailed Token Page recipe for the full post-migration data flow.

Protocols Without Bonding Curves

Some launchpad protocols don’t use bonding curves. Tokens on these protocols are created and immediately tradeable — they skip the bonding, completed, and migrated stages entirely.
ProtocolHas bonding curve?
Pump.funYes
Four.memeYes
LaunchLabYes
Meteora DBCYes
boop.funYes
ZoraNo
ClankerNo
BaseappNo
VirtualsNo
For tokens without bonding curves, the launchpad fields graduationPercent, completed, completedAt, migrated, migratedAt, and migratedPoolAddress will be absent. These tokens will only emit Created and Updated events. Check out the related endpoints and types: