# API: everything you can do from code

Pangea v3: every new launch, stock pairs and questions. Every launch since 2026-11-02 is a v3 launch, made by factory v3 on all five chains. This tab is everything new in v3: the factories, the fee hook, launch buys, stock pairs, the bridge price-gap fee, Solana, the security model, and plain-language questions and answers at the end. Bridging, routes and the APIs are in the V2 tab and hold for v3 except where this tab says otherwise.

Every endpoint is under `https://www.pangea.trade/api`, answers JSON (a few plain text), and needs no key or account. The general rules (errors, limits, units, names) are in [API reference →](https://www.pangea.trade/app/docs?v=2#api) Launching from code has its own section, with keys: [Launch API →](https://www.pangea.trade/app/docs?v=2#launch-api)

## By task

| To | Call | Described in |
| --- | --- | --- |
| List every coin, its pools and prices on every chain | `GET /pools` | [For integrators](https://www.pangea.trade/app/docs?v=2#integrators) |
| Follow new launches as they go live | `GET /v1/launches`, `GET /v1/launches/stream` | [API reference](https://www.pangea.trade/app/docs?v=2#api) |
| Read one coin: addresses, pair asset per chain, supply, tokenomics | `GET /coin/[id]` | [API reference](https://www.pangea.trade/app/docs?v=2#api) |
| Read a coin's name, logo and links | `GET /token/meta`, `GET /logo/[cid]/[file]` | [For integrators](https://www.pangea.trade/app/docs?v=2#integrators) |
| Trades, volume and candles | `GET /history` | [For integrators](https://www.pangea.trade/app/docs?v=2#integrators) and below |
| Holders, per chain | `GET /holders` | [API reference](https://www.pangea.trade/app/docs?v=2#api) |
| Supply for CoinGecko and CoinMarketCap | `GET /supply/[token]` and its `/total` and `/circulating` | [API reference](https://www.pangea.trade/app/docs?v=2#api) |
| Price a buy or a sale, on one chain or the cheapest route | `POST /trade/quote` | [API reference](https://www.pangea.trade/app/docs?v=2#api) |
| Price and build a bridge transfer | `POST /bridge/quote`, `POST /bridge/solana-tx`, `POST /cosign` | [Bridging from code](https://www.pangea.trade/app/docs?v=2#bridge-code) and below |
| Follow a transfer or a transaction | `GET /bridge/activity`, `POST /bridge/arrival`, `POST /chain/tx`, `GET /trade/tx-status` | [API reference](https://www.pangea.trade/app/docs?v=2#api) |
| Launch a coin | `POST /v1/launch/prepare` → `pay` → `submit` → `status` / `events` | [Launch API](https://www.pangea.trade/app/docs?v=2#launch-api) |
| Check what a launch may use before quoting | `GET /launch/factory-gen`, `/launch/pairs`, `/launch/stocks`, `/launch/open-routes` | Below |
| Launch buys: what a wallet deposited, and reclaiming it | `GET /launch/launch-buys-lines`, `GET /token/launch-buys` | [Launch buys](https://www.pangea.trade/app/docs#v3-launch-buys) and below |
| Who a coin's fees are paid to, and a change waiting | `GET /coin/[id]/fee-receivers`, `/pending` | [API reference](https://www.pangea.trade/app/docs?v=2#api) and below |
| Stock pairs: which coins, and fees in native | `GET /stock-pairs`, `GET, POST /token/fee-native` | Below |
| Tokenomics vaults, holder rewards and burns | `GET /coin/[id]/tokenomics`, `/tokenomics`, `/tokenomics/v2/*` | Below |
| Platform revenue, creator rewards and all-time volume | `GET /revenue`, `/creator-rewards`, `/alltime` | Below; the platform's own fee figures are in the API reference |
| Community takeovers | `GET /cto`, `GET /cto/burns` | [Creator rewards](https://www.pangea.trade/app/docs#v3-creator-rewards) and below |

## Platform figures

| Endpoint | Answer | Parameters, limit, cache |
| --- | --- | --- |
| `GET /revenue` | `{ status, from, to, exact, platformUsd, creatorUsd, officialUsd, missingChains, unpricedRows, chains: { <chain>: { platformUsd, creatorUsd, officialUsd, payouts, assets: [{ asset, native, kind, amount, decimals, usd, rows, unpriced }] } } }`: the platform’s and the creators’ fee payouts in the span, in US dollars at each payout’s own time. `officialUsd` is the official PANGEA coin’s creator share. `exact: false` means at least these figures: a chain in `missingChains` is not fully recorded for the span. | `from`, `to`: ISO time or unix seconds; `to` is now and `from` a day before it unless given. No limit; held 30 seconds. `400` for a span that is not one. |
| `GET /alltime` | `{ readAt, coins, since, complete, totals: { volumeUsd, trades }, chains: [{ chain, quoteSymbol, volume, volumeUsd, trades, pools, complete }], rates }`: all-time volume and trades of every listed coin, per chain. `complete: false` means at least. | No parameters. No limit; held a minute. |
| `GET /creator-rewards` | `{ status, totalUsd, officialUsd, platformUsd, payouts, complete, chains: [{ chain, asset, creator, usd, payouts, assets: [...] }], platformWindows: { "24": {...}, "168": {...} }, updatedAt }`: everything creators have been paid, all time, with stock-token payouts listed apart under `assets`. | No parameters. No limit; held a minute. |
| `GET /cto` | `{ ready, coins: [{ slug, launchId, chains: { <chain>: { from, to, tx, at } } }], readAt }`: the coins whose creator fee stream the platform moved in a community takeover. `ready: false` means it could not be read, not that there are none. | 120 a minute; held 15 seconds. |
| `GET /cto/burns` | `{ status, slug, known, totals, recent }`: the burns of a taken-over coin whose fees are bought back and burned. | `slug`. 60 a minute. `404` for a coin whose fees are not bought back and burned. |

GET /revenue (24 hours, trimmed):

```json
{
  "status": "ok",
  "from": "2026-11-02T05:10:00.000Z",
  "to": "2026-11-03T05:10:00.000Z",
  "exact": false,
  "platformUsd": 4343.05,
  "creatorUsd": 11213.81,
  "officialUsd": 4913.13,
  "chains": {
    "solana": {
      "assets": [{ "asset": "native", "native": true, "kind": "creator", "amount": "20802751835", "decimals": 9, "usd": 1919.59, "rows": 463, "unpriced": 0 }]
    }
  }
}
```

## Coins: stock pairs, fees in native, fee receivers

| Endpoint | Answer | Parameters, limit, cache |
| --- | --- | --- |
| `GET /stock-pairs` | `{ coins: { <slug>: [{ chain, quote: "native" \| { ticker, address, logo } }] }, readAt }`: every coin with at least one stock-paired chain. One coin’s pair assets are also in `GET /coin/[id]`’s `chains.<chain>.quote`. | No parameters. 120 a minute; held a minute. |
| `GET /token/fee-native` | `{ launchId, available, evm: Side, solana: Side }`, each side `{ stockPaired, chains, native, source, at, signers }`: whether that side’s stock-token creator fees are sold for the chain’s native coin when claimed. `signers` are the wallets that may switch it. | `launch`: slug, token address or launch id. 120 a minute. |
| `POST /token/fee-native` | `{ launch, kind, message: { launchId, side, native, nonce, issuedAt, expiresAt }, signature }`: switches it. On the EVM side the signer signs EIP-712 typed data (domain `{ name: "Pangea Coin Fee Payout", version: "1" }`, type `FeeNative(bytes32 launchId,string side,bool native,bytes32 nonce,uint64 issuedAt,uint64 expiresAt)`); on Solana a fixed text message. Good for 15 minutes at most, each nonce once. | 20 in ten minutes; 30 changes a coin a day. Pangea’s own pages only (another site’s `Origin` is `403`). |
| `GET /coin/[id]/fee-receivers/pending` | `{ slug, launchId, chains: { <chain>: { factory, splitter, creator, pendingCreator, adminPendingCreator } }, complete, settled }`: a change of fee receiver proposed and not yet accepted. It takes effect only when the new address accepts. | 60 a minute; held 30 seconds. |

GET /token/fee-native?launch=elon-033386:

```json
{
  "launchId": "0x0333…2564",
  "available": true,
  "evm": { "stockPaired": false, "chains": [], "native": false, "source": "default", "signers": [], "at": null },
  "solana": { "stockPaired": true, "chains": ["solana"], "native": false, "source": "default", "signers": ["6bok…k9Dg", "8WQV…6Tza"], "at": null }
}
```

## Tokenomics: vaults, holder rewards and burns

| Endpoint | Answer | Parameters, limit, cache |
| --- | --- | --- |
| `GET /coin/[id]/tokenomics` | `{ slug, launchId, launchChains, tokenomics, tokenomicsKnown, chains: { <chain>: { tokenomics } } }`: the config as the launch signed it (`version`, `vault`, `buckets`, `perChain`, `holders: { minHolderBps, select, count }`) and each chain’s vault read from the chain. | `live=0` for the config alone. 20 a minute. |
| `GET /tokenomics` | `{ chain, token, tokenomics: { vault, split, buckets, spent, totals: { receivedWei, coinBurned, coinToTreasury, gasRepaidWei, liquidityAdded }, minExecuteWei, lastSwap } }`: one chain’s vault, or `tokenomics: null` for a coin without one. | `chain`, `token` (a Pangea coin’s address or mint). 60 a minute; held a minute. |
| `GET /tokenomics/v2/holder` | `{ chain, vault, rewards: [{ index, token, symbol, decimals, entitlement, paid, claimable, voucher }] }`: what one holder is owed by a coin’s vault, per reward token, in base units. A holder may claim `claimable` themselves with `voucher`. | `chain`, `token`, `holder`. 30 a minute; never cached. On Solana, POST `{ chain: "solana", token, holder, index }` answers the unsigned claim transaction. |
| `GET /tokenomics/v2/burn` | `{ chain, vault, shareBps, totals: { held, spent, rolled }, targets: [{ index, token, symbol, decimals, bps, enabled, waiting, spent, burnt, lastBuy }], recent }`: a vault's burn tokens, the other tokens it buys to burn (tokenomics v2.2), on the EVM chains. | `chain`, `token`. 30 a minute. `404` for a coin that burns no other token. |
| `GET /tokenomics/v2/reward-route` | `{ chain, token, status: "ok" \| "none" \| "unknown", via? }`: whether a token can be bought on that chain to pay holders with, the check the launch form makes. `unknown` with `why: "busy"` means ask again. | `chain`, `token`, and `from` for a stock-paired chain’s stock. 20 a minute. |

## Bridging and trades: the rest

| Endpoint | Answer | Parameters, limit, cache |
| --- | --- | --- |
| `GET /bridge/health` | `{ ok: true, problems: [] }`, or `424` with the problems. | None. |
| `POST /cosign` | For a v3 transfer larger than one part carries: the transfer co-signed by Pangea’s delivery service, with `minCreditedLD` to send it with. A bare `503` means the service is not answering: send it in parts, as the quote’s `split` says. | `{ chain: "evm", chainId, tx, gapToleranceBps? }` (`tx` a registered v3 token’s `send`) or `{ chain: "solana", tx }`. 6 a minute, 30 in ten minutes. |
| `GET /trade/tx-status` | `{ status: "pending" \| "success" \| "failure" }` for an EVM transaction. | `chain`, `hash`. 90 a minute; past it `pending` with `429`. |

## Before you quote a launch

| Endpoint | Answer | Limit |
| --- | --- | --- |
| `GET /launch/factory-gen` | What a launch may use right now: `{ gen, marketCap: { min, max, default }, selfSolana, solana, solanaPrograms, v3: { on, launchBuys, bundleKit, minMarketCapUsd, perChain, degen } }`. `v3.perChain` is each chain’s minimum opening market cap. | Never cached. |
| `GET /launch/pairs` | The assets each chain’s pool may pair with: the Solana splitter’s allowlist and each EVM pair registry’s listed assets. | 60 in ten minutes; held a minute. |
| `GET /launch/stocks` | `{ config: { issuers, tickers, marketHours, cells: [{ chain, ticker, address, issuer, symbol, decimals, multiplier, devBuyRoute, gapRoute, lowLiqWarning, enabled }] } }`: the stock table the launch form offers, by contract address. | 60 in ten minutes. |
| `GET /launch/open-routes` | Whether Solana’s four routes can be opened at launch, and the price; read its `v3` part. | 60 in ten minutes; held a minute. |
| `GET /launch/launch-buys-lines` | A payer’s launch-buy deposits and what is left of each: `launchId`, `payer`. | 30 a minute. |
| `GET /launch/dev-buy, /launch/burn-fees, /launch/chain-select, /launch/same-address` | Whether each option is offered: `{ on }`. The dev buy answers `{ "on": false, "note": "Dev buy temporarily unavailable" }` today. | Never cached. |

GET /launch/factory-gen (2026-11-03):

```json
{
  "gen": 2,
  "marketCap": { "min": 600, "max": 500000, "default": 3000 },
  "selfSolana": true,
  "solanaPrograms": { "splitterProgramId": "Hb5uTppRbNxc3RjVRqTWqfdU3E3GiZyGYKccxYf9tUej", "oftProgramId": "SNyKyiZYU4R54SF9sYLmjCaCUsa1sC6QouNAj3x3Zzf" },
  "solana": true,
  "v3": {
    "on": true, "launchBuys": true, "bundleKit": false, "bundleKitHeld": false, "minMarketCapUsd": 600,
    "perChain": { "bsc": 600, "ethereum": 600, "robinhood": 600, "base": 600, "solana": 600 },
    "degen": { "supplyMode": 0, "marketCapUsdPerChain": 600 }
  }
}
```

## What the big reads carry besides

- `GET /pools`: each launch also has `factoryGen`, `factoryV3` (v3 coins), `supplyMode`, `supply`, `tokenomics`, `listedAt`, `chainsLive`, `launchChains` and `cheapest: { chain, usd }`; each pool also has `venue` (`uniswap-v4` or `meteora`), `priceUsd`, `depth`, `tick`, `sqrtPriceX96`, `locker`, `launchBlock`, and on a stock-paired chain `pair: { address, symbol, ticker, decimals, usd, liquidity, thin }`. A chain the coin is not on is listed with `error: "not launched on this chain"`. The whole answer is about 4 MB: read it once a minute at most.
- `GET /history`: `launch` takes a slug, launch id or token address. `interval` (seconds: 1, 15, 60, 300, 900, 3600, 14400, 86400, 604800 or 2592000) sets the candle width and lets `hours` reach 720. Trade pages: `trades=latest` or `trades=before:<next>` with `limit` 50, 100 or 200 (240 uncached in ten minutes). Chart pages: `before` and `interval` (600 uncached in ten minutes). One coin’s answer also has `chainCandles`, `flow` and `recent`; the answer for every coin does not.
- `GET /token/meta`: also `imageCid`, `discord`, `uriFrom`, `metadataAuthority`, and `edited` when the creator has changed the socials. A document that cannot be read is still a `200`, with `resolvable: false` and `image: null`.
- `GET /bridge/activity`: `token` takes a slug, launch id or token address; each transfer also has `sentTx`, `receivedTx`, `sentTs` and `receivedTs`.
- `POST /bridge/quote`: `routes` is a list, the standard lane first. A v3 transfer too large for one send has `split` (`count`, `parts`, `maxSendLD`); `retry: true` means a figure could not be read just now.

## The site’s own, not an API

These answer only Pangea’s own pages, or build a transaction from a signed ticket the page holds, and may change without notice: the launch form’s `/launch/prepare`, `/launch/submit`, `/launch/pay-solana` and `/launch/proof-check` (a program uses the `/v1/launch` routes, which run the same code), the trade card’s `/trade/boxes`, `/trade/recover`, `/trade/route-status`, `/trade/relay-status` and `/trade/solana-*`, `/chain/solana-send`, `/fees/convert-route`, `/metadata` (the launch form’s picture upload), `/profile/*` (signed in with a cookie), `/support/*` (the support chat) and `/release`. `/admin/*` is the team’s.

> **Note:** The live updates the site’s pages show come over a WebSocket, `wss://www.pangea.trade/live`, which accepts only Pangea’s own pages. It is not a public API: poll `GET /pools`, `GET /history` and `GET /bridge/activity`, or open `GET /v1/launches/stream` for new launches.

Part of the Pangea documentation, V3 (every new launch) tab: https://www.pangea.trade/app/docs.md
