manna

Build on Manna.

Manna API · v1

One 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. 1

    List trending coins (no key needed)

    Market data is public. Every response is {"data": …}; lists add next_cursor for the next page.

    bash
    curl "https://mannas.fun/v1/coins?sort=trending&limit=5"
  2. 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.

    bash
    curl "https://mannas.fun/v1/quote?chain=sol&token=DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263&side=buy&amount_usd=25&slippage_bps=300"
  3. 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. 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.

    bash
    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":"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/build returns unsigned transactions for the wallet you 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 ref referral. Already sent it yourself? Submit the signatures instead.
  • Works on Solana and every EVM chain Manna trades (EVM returns raw to / data / value transactions).
quote → build → sign → submit

account mode

Your one-tap account

  • POST /v1/trade/execute trades 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-Key header is required, so a retry can never trade twice.
  • Keys can never withdraw or send funds anywhere. They buy and sell, nothing else.
execute (Idempotency-Key) → webhook trade.completed

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.

bash
curl https://mannas.fun/v1/me -H "Authorization: Bearer sk-manna-…"
# or
curl https://mannas.fun/v1/me -H "X-API-Key: sk-manna-…"
Key scopes
ScopeWhat it allows
readMarket data with higher limits, and your account: positions, PnL, orders, alerts, watchlist
tradeBuild trades for any wallet, trade your one-tap account (within this key's caps), create and cancel orders
launchBuild launches for any wallet, launch from your one-tap account
aiManna 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.

  • read
    Market data, account reads, alerts, watchlist, webhooks
    No key, per IP
    30 / minute
    5 / second
    With a key
    60 / minute
    10 / second
  • quote
    GET /v1/quote
    No key, per IP
    10 / minute
    2 / second
    With a key
    60 / minute
    5 / second
  • build
    POST /v1/trade/build, /v1/trade/submit, /v1/launch/submit
    No key, per IP
    key required
    With a key
    30 / minute
    5 / second
  • trade
    POST /v1/trade/execute, order create / cancel / pause
    No key, per IP
    key required
    With a key
    30 / minute
    3 / second
  • launch
    POST /v1/launch/build, /v1/launch/execute
    No key, per IP
    key required
    With a key
    10 / hour
    3 / minute
  • No key
    2,000 credits a day

    per IP address, market data and quotes only

  • Free key
    20,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 per call
CreditsCalls
1Chains, prices, stats, live feed, leaderboards, posts, battles, profiles, launch options, /me, actions, orders list, alerts, watchlist, webhooks
2Coins, coin trades / candles / holders, any token and its candles / traders / trades, trending; order create / pause / cancel
5GET /v1/quote
5Positions, portfolio and balances (read every chain the account trades on)
10Trade and launch build / submit
10Trade 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.

Every response says where you stand
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)
Good citizens

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/coins

    Manna coins on every chain: sort by trending, new, top, volume, graduating or graduated; filter by chain, q, creator

    public
  • GET/coins/:id

    One coin: price, market cap, 24h volume and change, curve progress, fee split, pool and live battle

    public
  • GET/coins/:id/trades

    Its trades, newest first, cursor pages back in time

    public
  • GET/coins/:id/candles

    OHLCV from Manna's own trade log (tf 60 to 86400 seconds, up to 2000 candles)

    public
  • GET/coins/:id/holders

    The biggest holders Manna has indexed

    public
  • GET/trending

    Tokens with the most volume traded through Manna (24h or 7d)

    public
  • GET/stats

    Platform totals and recent payouts

    public
  • GET/live

    The latest trades and launches across every Manna coin

    public
  • GET/prices

    Dollar prices of the native coins and stablecoins Manna trades with

    public
  • GET/chains

    Where you can trade and launch, chain ids and launch fees

    public

Tokens

  • GET/tokens/:chain/:address

    Any token on any chain Manna trades: price, market cap, liquidity, pool, and its Manna coin if it is one

    public
  • GET/tokens/:chain/:address/candles

    USD candles of the token's deepest pool (range 1h, 4h, 1d, 1w, all)

    public
  • GET/tokens/:chain/:address/traders

    Manna traders' positions in the token, with PnL

    public
  • GET/tokens/:chain/:address/trades

    Manna traders' buys and sells of the token

    public

Social

  • GET/leaderboards/:board

    gainers, losers, volume, followers, creators, callers, holders over 24h, 7d, 30d or all

    public
  • GET/posts

    The feed, including thesis calls: new or hot, by coin or wallet

    public
  • GET/profiles/:wallet

    A trader's public profile, PnL and positions (private profiles stay private)

    public
  • GET/battles

    Team battles: live first, then recently finished

    public
  • GET/battles/:id

    One battle

    public

Quotes

  • GET/quote

    Price a buy or sell on any chain, with Manna's fee, minimum out and price impact. No wallet needed

    public

Trading

  • POST/trade/build

    Build mode: unsigned transaction(s) for your own wallet to sign

    key · trade
  • POST/trade/submit

    Send the signed transactions (or report signatures) so the trade is credited

    key · trade
  • POST/trade/execute

    Account mode: trade your one-tap account within the key's caps (Idempotency-Key)

    key · trade

Launch

  • GET/launch/options

    Pairs per chain, fee-split presets, curves, shield settings and launch fees

    public
  • POST/launch/build

    Build mode: the launch transactions for your creator wallet to sign

    key · launch
  • POST/launch/submit

    Send them (or report signatures) and put the coin on Manna

    key · launch
  • POST/launch/execute

    Account mode: launch from your one-tap account (Idempotency-Key)

    key · launch

Account

  • GET/me

    The key, its owner, caps, today's spend and whether account mode can trade

    any key
  • GET/account/positions

    Open and closed positions on every chain, with PnL

    key · read
  • GET/account/portfolio

    Net worth across the account's wallets and watch-only wallets

    key · read
  • GET/account/balances

    Cash on every chain (what account-mode buys spend)

    key · read
  • GET/account/actions

    Trades and launches made with your keys, newest first

    key · read
  • GET/account/actions/:id

    One action and its result

    key · read

Orders

  • GET/account/orders

    Open orders (or history=1), by chain and token

    key · read
  • POST/account/orders

    Limit, take profit, stop loss, limit sell, trailing stop or DCA

    key · trade
  • PATCH/account/orders/:id

    Pause or resume a DCA plan

    key · trade
  • DELETE/account/orders/:id

    Cancel an open order

    key · trade

Alerts

  • GET/account/alerts

    Your price, market cap and move alerts

    key · read
  • POST/account/alerts

    Create an alert

    key · read
  • PATCH/account/alerts/:id

    Switch an alert on or off, or make it repeat

    key · read
  • DELETE/account/alerts/:id

    Delete an alert

    key · read

Watchlist

  • GET/account/watchlist

    Coins and tokens you watch

    key · read
  • POST/account/watchlist

    Watch one ("sol:<mint>")

    key · read
  • DELETE/account/watchlist/:id

    Stop watching it

    key · read

Webhooks

  • GET/webhooks

    Your webhook endpoints

    key · read
  • POST/webhooks

    Add an endpoint (the signing secret is returned once)

    key · read
  • DELETE/webhooks/:id

    Remove 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.

curl
curl "https://mannas.fun/v1/coins?sort=trending&limit=5"
GET/v1/coins?sort=trending&limit=5

Run 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.

json
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_request

    The request doesn't make sense as sent; the message says why

  • 400
    validation_error

    Fields are missing or invalid; details lists each {path, message}

  • 400
    idempotency_key_required

    Account-mode trades and launches need an Idempotency-Key header

  • 401
    missing_api_key

    This endpoint needs a key

  • 401
    invalid_api_key

    The key is malformed, unknown or revoked (never treated as anonymous)

  • 403
    insufficient_scope

    The key lacks the scope; details has required and granted

  • 403
    ip_not_allowed

    The key has an IP allowlist and this address isn't on it

  • 403
    trade_cap_exceeded

    Over the key's max per trade

  • 403
    daily_cap_exceeded

    Over the key's rolling 24h cap

  • 404
    not_found

    No such endpoint, coin, order, build or webhook

  • 405
    method_not_allowed

    Wrong HTTP method for this path; the Allow header lists the right ones

  • 409
    conflict

    Two requests raced; try again

  • 409
    idempotency_in_progress

    A request with this Idempotency-Key is still running

  • 409
    one_tap_disabled

    Account mode needs one-tap trading switched on at mannas.fun

  • 422
    idempotency_mismatch

    That Idempotency-Key was used with a different body

  • 422
    unsupported

    Valid, but not something this mode or chain can do yet

  • 422
    no_route

    No venue can fill this trade right now

  • 422
    trade_failed

    The trade didn't go through; details say whether anything may have been sent

  • 422
    launch_failed

    The launch didn't go through; details include the steps reached

  • 429
    rate_limited

    Too many requests; wait Retry-After seconds

  • 429
    daily_quota_exceeded

    Today's credits are used up; the quota resets at 00:00 UTC (Retry-After)

  • 429
    capacity_exceeded

    A very busy day: calls without a key, then free-tier reads and quotes, are paused for a while

  • 500
    internal_error

    Our fault. Quote the request_id if you contact us

  • 502
    upstream_error

    A data source Manna relies on failed; retry

  • 503
    service_unavailable

    Briefly 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.

http
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