Build on Manna.
Manna API · v1One REST API for every chain Manna trades: discover and query coins, get quotes, trade, launch, read positions and PnL, place orders and alerts, pull the feed, and get webhooks when things happen.
Quickstart
From zero to a trade in four calls
Copy, paste, run. Swap the token for any Solana mint or 0x address on a chain Manna trades.
- 1
List trending coins (no key needed)
Market data is public. Every response is {"data": …}; lists add next_cursor for the next page.
bashcurl "https://mannas.fun/v1/coins?sort=trending&limit=5" - 2
Get a quote
Price a buy or sell on any chain before you trade: amount out, minimum out, price impact and Manna's fee.
bashcurl "https://mannas.fun/v1/quote?chain=sol&token=DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263&side=buy&amount_usd=25&slippage_bps=300" - 3
Build a Solana buy, sign it, submit it
Build mode never touches your keys: Manna returns unsigned transactions, you sign them unchanged, then submit so Manna sends and confirms them and credits cashback and referrals. Solana builds expire after 60 seconds.
bash# 1. build (needs a key with the trade scope) curl -X POST https://mannas.fun/v1/trade/build \ -H "Authorization: Bearer $MANNA_API_KEY" \ -H "Content-Type: application/json" \ -d '{"chain":"sol","token":"DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263","side":"buy","amount_usd":25,"slippage_bps":300,"wallet":"<your wallet>","ref":"<referral code>"}' # 2. sign each data.transactions[i].transaction (base64) with your wallet, unchanged and in order # 3. submit curl -X POST https://mannas.fun/v1/trade/submit \ -H "Authorization: Bearer $MANNA_API_KEY" \ -H "Content-Type: application/json" \ -d '{"build_id":"bld_…","signed_transactions":["<signed base64>"]}' - 4
Account mode: buy with one call
Trades your one-tap account on the server, within the key's caps. Buys take amount_usd, sells take percent. The Idempotency-Key makes a retry safe: the same key always gets the first answer back.
bashcurl -X POST https://mannas.fun/v1/trade/execute \ -H "Authorization: Bearer $MANNA_API_KEY" \ -H "Content-Type: application/json" \ -H "Idempotency-Key: $(uuidgen)" \ -d '{"chain":"sol","token":"DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263","side":"buy","amount_usd":25,"slippage_bps":300}' # sell half of it later curl -X POST https://mannas.fun/v1/trade/execute \ -H "Authorization: Bearer $MANNA_API_KEY" \ -H "Content-Type: application/json" \ -H "Idempotency-Key: $(uuidgen)" \ -d '{"chain":"sol","token":"DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263","side":"sell","percent":50}'
Two ways to trade
Sign it yourself, or let your account do it
Both modes go through the same venues and the same fees as mannas.fun: Manna's 1% is inside every transaction it builds, never added on top.
build mode
Non-custodial
POST /v1/trade/buildreturns unsigned transactions for thewalletyou name. Your keys never leave your machine.- Sign them unchanged and in order, then
POST /v1/trade/submit. Manna checks each is exactly what it built and signed by that wallet, sends and confirms it. - Submitting through Manna is what credits cashback and the
refreferral. Already sent it yourself? Submit the signatures instead. - Works on Solana and every EVM chain Manna trades (EVM returns raw
to / data / valuetransactions).
account mode
Your one-tap account
POST /v1/trade/executetrades your one-tap account on the server: one call, no signing.- Every key that trades carries a max per trade and a rolling 24h cap that you set. Buys over either are refused.
- An
Idempotency-Keyheader is required, so a retry can never trade twice. - Keys can never withdraw or send funds anywhere. They buy and sell, nothing else.
Launches work the same way
Build: POST /v1/launch/build with your creator wallet, name, symbol and image returns the launch transactions to sign; POST /v1/launch/submit puts the coin on Manna.
Account: POST /v1/launch/execute launches from your one-tap account. The first buy and launch fee count against the key's caps, and it needs an Idempotency-Key too.
Fee splits, curves, shield settings and pairs for each chain come from GET /v1/launch/options.
Authentication
One key, scoped to what it needs
Public market data works without a key (a key raises its limits). Everything else takes a key in a header.
curl https://mannas.fun/v1/me -H "Authorization: Bearer sk-manna-…"
# or
curl https://mannas.fun/v1/me -H "X-API-Key: sk-manna-…"| Scope | What it allows |
|---|---|
| read | Market data with higher limits, and your account: positions, PnL, orders, alerts, watchlist |
| trade | Build trades for any wallet, trade your one-tap account (within this key's caps), create and cancel orders |
| launch | Build launches for any wallet, launch from your one-tap account |
| ai | Manna AI gateway (OpenAI and Anthropic compatible), paid from your AI credits |
- Shown once, stored hashed
The full key is shown when you make it and never again. Manna keeps only a SHA-256 hash.
- Least privilege
Give each key only the scopes it needs. A key without trade can't move money.
- Caps on every key that trades
Max per trade and a rolling 24h cap, checked on the server before anything is sent.
- IP allowlist
Optionally pin a key to your servers' IPv4 / IPv6 addresses or IPv4 CIDR blocks.
- Revoke any time
Revoking takes effect on the next request. A revoked key is an error, never treated as anonymous.
- Keep trade keys on a server
Never put a trade or launch key in browser or app code. Write endpoints aren't CORS-enabled, so browsers can only call GETs.
Rate limits
Generous, predictable limits
Two limits apply. Per minute: each bucket has a main window and a burst window, counted per key (or per IP without one). Per day: every call costs credits from your account's daily quota. Going over either returns 429.
- readMarket data, account reads, alerts, watchlist, webhooks
- No key, per IP
- 30 / minute5 / second
- With a key
- 60 / minute10 / second
- quoteGET /v1/quote
- No key, per IP
- 10 / minute2 / second
- With a key
- 60 / minute5 / second
- buildPOST /v1/trade/build, /v1/trade/submit, /v1/launch/submit
- No key, per IP
- key required
- With a key
- 30 / minute5 / second
- tradePOST /v1/trade/execute, order create / cancel / pause
- No key, per IP
- key required
- With a key
- 30 / minute3 / second
- launchPOST /v1/launch/build, /v1/launch/execute
- No key, per IP
- key required
- With a key
- 10 / hour3 / minute
| Bucket | Without a key (per IP) | With a key |
|---|---|---|
read Market data, account reads, alerts, watchlist, webhooks | 30 / minute 5 / second | 60 / minute 10 / second |
quote GET /v1/quote | 10 / minute 2 / second | 60 / minute 5 / second |
build POST /v1/trade/build, /v1/trade/submit, /v1/launch/submit | key required | 30 / minute 5 / second |
trade POST /v1/trade/execute, order create / cancel / pause | key required | 30 / minute 3 / second |
launch POST /v1/launch/build, /v1/launch/execute | key required | 10 / hour 3 / minute |
- No key2,000 credits a day
per IP address, market data and quotes only
- Free key20,000 credits a day
per account (all its keys share it), up to 3 API keys
- Fee-earned bonus+5,000 a day per $1
of Manna fees your API trades and launches earned in the last 30 days, up to +1,000,000 a day
| Credits | Calls |
|---|---|
| 1 | Chains, prices, stats, live feed, leaderboards, posts, battles, profiles, launch options, /me, actions, orders list, alerts, watchlist, webhooks |
| 2 | Coins, coin trades / candles / holders, any token and its candles / traders / trades, trending; order create / pause / cancel |
| 5 | GET /v1/quote |
| 5 | Positions, portfolio and balances (read every chain the account trades on) |
| 10 | Trade and launch build / submit |
| 10 | Trade and launch execute (account mode) |
Quotas reset at 00:00 UTC. Over it, calls answer 429 daily_quota_exceeded until then. On very busy days Manna may pause calls without a key, then free-tier reads and quotes (429 capacity_exceeded); trades and launches keep working. Need more? The fee-earned bonus grows with the trading you bring, and higher tiers are coming.
- X-RateLimit-Limit
- the main window's size
- X-RateLimit-Remaining
- requests left in the main window (a burst window can still answer 429 first)
- X-RateLimit-Reset
- unix seconds when the window resets
- X-Quota-Limit
- today's credits (your account's, or your IP's without a key)
- X-Quota-Remaining
- credits left today
- X-Quota-Reset
- unix seconds of the next 00:00 UTC
- X-Quota-Cost
- what this call cost
- X-Cache
- HIT when a public read or quote came from the few-second shared cache
- Retry-After
- on a 429: seconds to wait (to midnight UTC for a daily quota)
Back off on 429 for Retry-After seconds. Cache what doesn't change every second (chains, launch options, prices). Use webhooks instead of polling your actions. Market reads are shared for 10-15 seconds and quotes for 4, so polling faster only spends credits.
Every response carries an X-Request-Id; quote it if you contact us.
Reference
Endpoints
Every path is under /v1. Request and response schemas for each are in the OpenAPI spec.
Market
- GET
/coinsManna coins on every chain: sort by trending, new, top, volume, graduating or graduated; filter by chain, q, creator
public - GET
/coins/:idOne coin: price, market cap, 24h volume and change, curve progress, fee split, pool and live battle
public - GET
/coins/:id/tradesIts trades, newest first, cursor pages back in time
public - GET
/coins/:id/candlesOHLCV from Manna's own trade log (tf 60 to 86400 seconds, up to 2000 candles)
public - GET
/coins/:id/holdersThe biggest holders Manna has indexed
public - GET
/trendingTokens with the most volume traded through Manna (24h or 7d)
public - GET
/statsPlatform totals and recent payouts
public - GET
/liveThe latest trades and launches across every Manna coin
public - GET
/pricesDollar prices of the native coins and stablecoins Manna trades with
public - GET
/chainsWhere you can trade and launch, chain ids and launch fees
public
Tokens
- GET
/tokens/:chain/:addressAny token on any chain Manna trades: price, market cap, liquidity, pool, and its Manna coin if it is one
public - GET
/tokens/:chain/:address/candlesUSD candles of the token's deepest pool (range 1h, 4h, 1d, 1w, all)
public - GET
/tokens/:chain/:address/tradersManna traders' positions in the token, with PnL
public - GET
/tokens/:chain/:address/tradesManna traders' buys and sells of the token
public
Social
- GET
/leaderboards/:boardgainers, losers, volume, followers, creators, callers, holders over 24h, 7d, 30d or all
public - GET
/postsThe feed, including thesis calls: new or hot, by coin or wallet
public - GET
/profiles/:walletA trader's public profile, PnL and positions (private profiles stay private)
public - GET
/battlesTeam battles: live first, then recently finished
public - GET
/battles/:idOne battle
public
Quotes
- GET
/quotePrice a buy or sell on any chain, with Manna's fee, minimum out and price impact. No wallet needed
public
Trading
- POST
/trade/buildBuild mode: unsigned transaction(s) for your own wallet to sign
key · trade - POST
/trade/submitSend the signed transactions (or report signatures) so the trade is credited
key · trade - POST
/trade/executeAccount mode: trade your one-tap account within the key's caps (Idempotency-Key)
key · trade
Launch
- GET
/launch/optionsPairs per chain, fee-split presets, curves, shield settings and launch fees
public - POST
/launch/buildBuild mode: the launch transactions for your creator wallet to sign
key · launch - POST
/launch/submitSend them (or report signatures) and put the coin on Manna
key · launch - POST
/launch/executeAccount mode: launch from your one-tap account (Idempotency-Key)
key · launch
Account
- GET
/meThe key, its owner, caps, today's spend and whether account mode can trade
any key - GET
/account/positionsOpen and closed positions on every chain, with PnL
key · read - GET
/account/portfolioNet worth across the account's wallets and watch-only wallets
key · read - GET
/account/balancesCash on every chain (what account-mode buys spend)
key · read - GET
/account/actionsTrades and launches made with your keys, newest first
key · read - GET
/account/actions/:idOne action and its result
key · read
Orders
- GET
/account/ordersOpen orders (or history=1), by chain and token
key · read - POST
/account/ordersLimit, take profit, stop loss, limit sell, trailing stop or DCA
key · trade - PATCH
/account/orders/:idPause or resume a DCA plan
key · trade - DELETE
/account/orders/:idCancel an open order
key · trade
Alerts
- GET
/account/alertsYour price, market cap and move alerts
key · read - POST
/account/alertsCreate an alert
key · read - PATCH
/account/alerts/:idSwitch an alert on or off, or make it repeat
key · read - DELETE
/account/alerts/:idDelete an alert
key · read
Watchlist
- GET
/account/watchlistCoins and tokens you watch
key · read - POST
/account/watchlistWatch one ("sol:<mint>")
key · read - DELETE
/account/watchlist/:idStop watching it
key · read
Webhooks
- GET
/webhooksYour webhook endpoints
key · read - POST
/webhooksAdd an endpoint (the signing secret is returned once)
key · read - DELETE
/webhooks/:idRemove an endpoint
key · read
Try it
Call the API from here
Public endpoints run live against Manna. Paste a key to see your higher limits; it stays in this tab's memory and is never saved.
/v1/coins?sort=trending&limit=5Run a request to see the response here.
Your keys
API keys and webhooks
Make a key for each app or server. Keys belong to your Manna account; trading keys spend from your one-tap account within the caps you set here.
Errors
One error shape, everywhere
Non-2xx responses always carry the same envelope. Switch on code, show message, log request_id.
HTTP/1.1 403 Forbidden
X-Request-Id: req_3kQm9xY2LpVa
{
"error": {
"code": "insufficient_scope",
"message": "This key doesn't have the \"trade\" scope.",
"status": 403,
"request_id": "req_3kQm9xY2LpVa",
"details": { "required": "trade", "granted": ["read"] }
}
}- 400
bad_requestThe request doesn't make sense as sent; the message says why
- 400
validation_errorFields are missing or invalid; details lists each {path, message}
- 400
idempotency_key_requiredAccount-mode trades and launches need an Idempotency-Key header
- 401
missing_api_keyThis endpoint needs a key
- 401
invalid_api_keyThe key is malformed, unknown or revoked (never treated as anonymous)
- 403
insufficient_scopeThe key lacks the scope; details has required and granted
- 403
ip_not_allowedThe key has an IP allowlist and this address isn't on it
- 403
trade_cap_exceededOver the key's max per trade
- 403
daily_cap_exceededOver the key's rolling 24h cap
- 404
not_foundNo such endpoint, coin, order, build or webhook
- 405
method_not_allowedWrong HTTP method for this path; the Allow header lists the right ones
- 409
conflictTwo requests raced; try again
- 409
idempotency_in_progressA request with this Idempotency-Key is still running
- 409
one_tap_disabledAccount mode needs one-tap trading switched on at mannas.fun
- 422
idempotency_mismatchThat Idempotency-Key was used with a different body
- 422
unsupportedValid, but not something this mode or chain can do yet
- 422
no_routeNo venue can fill this trade right now
- 422
trade_failedThe trade didn't go through; details say whether anything may have been sent
- 422
launch_failedThe launch didn't go through; details include the steps reached
- 429
rate_limitedToo many requests; wait Retry-After seconds
- 429
daily_quota_exceededToday's credits are used up; the quota resets at 00:00 UTC (Retry-After)
- 429
capacity_exceededA very busy day: calls without a key, then free-tier reads and quotes, are paused for a while
- 500
internal_errorOur fault. Quote the request_id if you contact us
- 502
upstream_errorA data source Manna relies on failed; retry
- 503
service_unavailableBriefly unavailable (no price, a busy chain); retry shortly
Idempotency
Account-mode trades and launches need an Idempotency-Key header (1-100 characters: letters, digits and - _ . :, so a UUID works). The first request runs; a retry with the same key and body gets the first answer back with Idempotent-Replayed: true, even if it failed, so a trade is never sent twice. The same key with a different body is refused. Keys live 24 hours.
Pagination
Lists that page return next_cursor. Pass it back as ?cursor= for the next page; it is null on the last one. Cursors are opaque.
GET /v1/coins?sort=new&limit=50
{ "data": [ … ], "next_cursor": "eyJvIjo1MH0" }
GET /v1/coins?sort=new&limit=50&cursor=eyJvIjo1MH0
{ "data": [ … ], "next_cursor": null } // the last page