Agent API

HTTP API for bots and AI agents: read coins, quote, build trades, prepare launches.

The Agent API is a public HTTP API for bots and AI agents. It lists coins, quotes trades, builds unsigned trade transactions and prepares launches with exactly the same rules and fees as the Pairity website. The server never signs anything for you and never holds your funds.

Basics#

Base URLhttps://pairity.wtf/api/agent/v1
AuthNone. No API key, no account. Limits are per IP address.
FormatJSON in and out. CORS is open to every origin.
ErrorsA 4xx or 5xx status with { "error": "…" }
AmountsBase units as strings: lamports for SOL (1 SOL = 1000000000), raw coin units for coins (6 decimals)
OpenAPI 3.1https://pairity.wtf/api/agent/v1/openapi.json

Note

Trading and launching (build-trade, prepare-launch) are refused with HTTP 403 from restricted jurisdictions. See Risks & disclaimers.

Rate limits#

Requests per minute, per IP. The same buckets are shared with the MCP server. Going over returns HTTP 429.

BucketLimitEndpoints
read60tokens, token, trades, skills, launch-config, openapi.json
quote30quote
build10build-trade
tx60tx status
launch3prepare-launch

Endpoints#

MethodPathWhat it does
GET/tokensList or search coins
GET/token/{mint}One coin in detail
GET/token/{mint}/tradesRecent trades, newest first
GET/quoteQuote a buy or sell
POST/build-tradeUnsigned trade transaction(s)
GET/tx/{signature}Transaction status
GET/skillsAI skills catalog
GET/launch-configFee split rules, pair types and limits
POST/prepare-launchUnsigned launch transactions
GET/openapi.jsonThe OpenAPI document

GET /tokens

QueryTypeDefaultNotes
sortnew | trending | graduatingnewtrending = 24h volume; graduating = 50%+ of the curve, closest first
qstring, max 50—Name, symbol, paired account or exact mint
limit1–5020
offset0–10000
Request
curl -s 'https://pairity.wtf/api/agent/v1/tokens?sort=trending&limit=1'
Response (example values)
{
  "sort": "trending",
  "count": 1,
  "offset": 0,
  "tokens": [
    {
      "mint": "8sWQd7Yk3nVb2LmP9rTfXc4hJzGqA1eKuNoR6pump",
      "name": "Moon Cat",
      "symbol": "MCAT",
      "imageUrl": "https://pairity.wtf/api/files/mcat.webp",
      "creator": "5GmKx2pQv7rT9wLzN3cHdYb8sJfE4aRuV6kMnBqPt1Xy",
      "pair": { "type": "x", "key": "x:mooncat", "display": "@mooncat" },
      "venue": "pump",
      "status": "live",
      "graduated": false,
      "quote": { "mint": "So11111111111111111111111111111111111111112", "symbol": "SOL", "decimals": 9 },
      "price": 4.12e-8,
      "marketCap": 41.2,
      "progress": 0.12,
      "volume24h": "18250000000",
      "tradeCount": 342,
      "createdAt": "2026-10-18T09:12:44.000Z",
      "lastTradeAt": "2026-10-19T07:58:02.000Z",
      "url": "https://pairity.wtf/token/8sWQd7Yk3nVb2LmP9rTfXc4hJzGqA1eKuNoR6pump"
    }
  ]
}

price and marketCap are in the coin's quote token (SOL for most coins). volume24h is in quote base units.

GET /token/{mint}

Everything from the list above, plus description, links, the on-chain split, splitStatus (unchecked | ok | violation), splitLocked, lockMode, traders, holders and holdersAt (from the latest holder snapshot, or null), urls and the full public token record.

Response (extra fields, example values)
{
  "description": "The cat that went to the moon.",
  "links": { "website": null, "twitter": "https://x.com/mooncat", "telegram": null },
  "split": [
    { "kind": "creator", "address": "5GmKx2pQv7rT9wLzN3cHdYb8sJfE4aRuV6kMnBqPt1Xy", "bps": 5600 },
    { "kind": "paired", "address": "Esc4oWv1nH8rQ2mL7tBzY5kD3fGjP9aXcN6uR1sTqVe", "bps": 2400 },
    { "kind": "platform", "address": "PfVa7tK2mQ9wR4nB8xL3cH6dJ1sY5gZuE2oN7pT4rMk", "bps": 2000 }
  ],
  "splitStatus": "ok",
  "splitLocked": true,
  "lockMode": "ephemeral",
  "traders": 118,
  "holders": null,
  "holdersAt": null,
  "urls": {
    "page": "https://pairity.wtf/token/8sWQd7Yk3nVb2LmP9rTfXc4hJzGqA1eKuNoR6pump",
    "blink": "https://dial.to/?action=solana-action%3Ahttps%3A%2F%2Fpairity.wtf%2Fapi%2Factions%2Ftrade%2F8sWQd7Yk3nVb2LmP9rTfXc4hJzGqA1eKuNoR6pump",
    "action": "https://pairity.wtf/api/actions/trade/8sWQd7Yk3nVb2LmP9rTfXc4hJzGqA1eKuNoR6pump"
  }
}

GET /token/{mint}/trades

Query: limit 1–100, default 50.

Response (example values)
{
  "mint": "8sWQd7Yk3nVb2LmP9rTfXc4hJzGqA1eKuNoR6pump",
  "quote": { "mint": "So11111111111111111111111111111111111111112", "symbol": "SOL", "decimals": 9 },
  "trades": [
    {
      "signature": "4hXq9…",
      "side": "buy",
      "trader": "5GmKx2pQv7rT9wLzN3cHdYb8sJfE4aRuV6kMnBqPt1Xy",
      "quoteAmount": "250000000",
      "tokenAmount": "6012345678901",
      "price": 4.158e-8,
      "ts": "2026-10-19T07:58:02.000Z"
    }
  ]
}

GET /quote

QueryTypeNotes
mintaddressRequired
sidebuy | sellRequired
amountwhole-number stringLamports for buys, raw coin units for sells
slippageBps10–5000Default 100 (1%)
Request: buy for 0.25 SOL
curl -s 'https://pairity.wtf/api/agent/v1/quote?mint=8sWQd7Yk3nVb2LmP9rTfXc4hJzGqA1eKuNoR6pump&side=buy&amount=250000000&slippageBps=100'
Response (example values)
{
  "mint": "8sWQd7Yk3nVb2LmP9rTfXc4hJzGqA1eKuNoR6pump",
  "side": "buy",
  "slippageBps": 100,
  "venue": "curve",
  "amountIn": "250000000",
  "amountOut": "6012345678901",
  "minimumAmountOut": "5952222232112",
  "feeLamports": "0",
  "creatorExtraFeeBps": 0,
  "creatorExtraFeeLamports": "0",
  "priceImpactPct": 0.61,
  "price": 4.158e-8,
  "marketCap": 41.58,
  "progress": 0.121,
  "isGraduated": false,
  "units": { "amountIn": "lamports", "amountOut": "coin base units (6 decimals)" }
}

feeLamports is the site trade fee (0 by default). A quote has no wallet, so it shows the fee before any platform-token discount.

POST /build-trade

Body: mint, side, amount, slippageBps (optional) and user, the wallet that signs and pays. The response is one or more unsigned base64 v0 transactions. The user wallet is the fee payer and the only signer.

Request
curl -s https://pairity.wtf/api/agent/v1/build-trade \
  -H 'content-type: application/json' \
  -d '{"mint":"8sWQd7Yk3nVb2LmP9rTfXc4hJzGqA1eKuNoR6pump","side":"buy","amount":"250000000","slippageBps":100,"user":"5GmKx2pQv7rT9wLzN3cHdYb8sJfE4aRuV6kMnBqPt1Xy"}'
Response (example values)
{
  "mint": "8sWQd7Yk3nVb2LmP9rTfXc4hJzGqA1eKuNoR6pump",
  "side": "buy",
  "user": "5GmKx2pQv7rT9wLzN3cHdYb8sJfE4aRuV6kMnBqPt1Xy",
  "encoding": "base64",
  "version": "v0",
  "transaction": "AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA…",
  "transactions": ["AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA…"],
  "venue": "curve",
  "amountOut": "6012345678901",
  "minimumAmountOut": "5952222232112",
  "feeLamports": "0",
  "next": {
    "sign": "Sign each transaction with the user wallet (it is the only signer and the fee payer). The blockhash expires in about a minute.",
    "send": { "method": "POST", "url": "https://pairity.wtf/api/send", "body": { "tx": "<signed transaction, base64>" }, "returns": "{ signature, lastValidBlockHeight }" },
    "status": "https://pairity.wtf/api/agent/v1/tx/<signature>?lvbh=<lastValidBlockHeight>"
  }
}
  1. Sign every transaction in transactions, in order. Coins paired with another token may need two.
  2. POST each signed transaction to https://pairity.wtf/api/send as { "tx": "<base64>" }. It returns signature and lastValidBlockHeight.
  3. Poll the status endpoint until it is no longer pending.

Important

The blockhash expires in about a minute: build, sign and send right away. Always decode and check a transaction before your wallet signs it.

GET /tx/{signature}

Optional query lvbh: the lastValidBlockHeight from /api/send. Without it a lost transaction stays “pending” instead of “expired”.

Response
{ "signature": "4hXq9…", "state": "confirmed", "err": null, "slot": 371204551 }

state is one of confirmed, failed, expired or pending.

GET /skills and GET /launch-config

  • /skills returns count, maxEnabledPerCoin, categories and the public skills list (no model instructions).
  • /launch-config returns the live launch rules: platform share, default split, minimum shares, the AI coin split, lock mode, site trade fee, pair types, field limits, rate limits and the launch flow. Read it before preparing a launch. In the AI coin split, aiCreditsBps is the AI vault's share; the creditCapUsd field is left over from the old credits system and no longer does anything.

POST /prepare-launch

Same body and rules as the website's Launch page: creator, name (max 32), symbol (max 10), imageUrl (upload first with POST /api/upload, field file; other hosts are refused), pairType, pairHandle, and optional description, website, twitter, telegram, initialBuySol, split (basis points; ignored for AI coins), mindPersona, mindObjective, mindMode (darkroom | build) and referrer.

Request
curl -s https://pairity.wtf/api/agent/v1/prepare-launch \
  -H 'content-type: application/json' \
  -d '{"creator":"5GmKx2pQv7rT9wLzN3cHdYb8sJfE4aRuV6kMnBqPt1Xy","name":"Moon Cat","symbol":"MCAT","imageUrl":"https://pairity.wtf/api/files/mcat.webp","pairType":"x","pairHandle":"mooncat"}'

The response contains txs (a list of { label, tx }, unsigned), a sealedToken, the new mint, the final split, referral and more. The creator signs every transaction without changing it and POSTs { "txs": [signed base64, same order], "sealedToken": "…" } to /api/launch/submit within 90 seconds.