Payday

Payday API

Read every Payday coin, the X accounts they pay, payouts on Peer and Payday token burns from your app, bot or terminal. Launch Payday coins for your users with the same fee settings as the site.

Free keyrequired on every call
600 / minand 250,000 a day per key
15 show fresh the data is
Keys hold nothingno key can move money; the launching wallet signs and pays for a launch

Quick start

  1. Make a key below. It takes a sign-in with X, so every key belongs to an X account. The key is free and works right away.
  2. Send it in a header on every call:
curl -H "Authorization: Bearer pd_YOUR_KEY" "https://payday.direct/api/v1/coins?status=graduated&limit=5"

curl -H "X-API-Key: pd_YOUR_KEY" https://payday.direct/api/v1/accounts/elonmusk

Base address https://payday.direct/api/v1. Everything answers JSON. A key only reads data unless you switch launching on when you make it: see Launch a coin.

Keeping your key safe

Endpoints

EndpointWhat it returns
GET/coinsPayday coins on every chain, each with chain and chain_id. Filter with chain solana or elysium, status curve or graduated, handle, pair sol or stock, since (ISO date), sort new, market_cap, volume or holders.
GET/coins/{mint}One coin, with the account it pays. A Solana mint or an EVM coin address. Every coin carries mode: account or cash_payback.
GET/accountsAccounts that earn fees. sort earned, paid or coins.
GET/accounts/{handle}One X account: fees earned and paid, next batch, its coins and recent payouts.
GET/payoutsPayout orders on Peer, newest first, with the Peer link. handle, status.
GET/paybackCash Payback: whether it is on, and its rules (the split, the DexScreener reimbursement, when rounds run, how holding time is weighted).
GET/payback/coins/{mint}One Cash Payback coin: its holders' pot, the next round, the DexScreener reimbursement and its recent rounds.
GET/payback/coins/{mint}/rounds/{n}One round: every holder paid, the amount and the transaction.
GET/payback/wallets/{owner}A wallet's share across Cash Payback coins: what it was paid and what it has building up for the next round.
GET/burnsEvery Payday token buy and burn, with transactions.
GET/statsPlatform totals: coins, volume, fees, paid out, burned, DEX reserves.
GET/fees/{mint}Who receives a token's creator fees, with the on-chain facts to check it yourself: the pump.fun fee-sharing config and the Payday payout wallet that must be its only shareholder.
POST/fees/batchThe same for up to 100 mints: body {"mints": [...]}. Each mint counts as one request.

Paging

Lists take limit (up to 200, default 50). When there is more, the response has next_cursor: pass it back as cursor.

Numbers

Dollar amounts are strings with two decimals ("12.34") and SOL amounts are strings, so nothing loses precision. Times are ISO 8601 in UTC. Tickers keep their case.

Privacy

X handles are public. Coins paying Cash App, Venmo or Zelle show the rail only, never the username, email or phone number. Accounts that opted out of Payday are left out entirely.

Example answer

The shape of one coin from /api/v1/coins?limit=1 (example values):

{
  "data": [{
    "mint": "uHMWNFjUNxbPy1q43WrdbzygmJwdeh6AiQm1NKdxPAY",
    "symbol": "PAYDAY",
    "name": "Payday",
    "created_at": "2026-11-09T18:02:11.000Z",
    "status": "graduated",
    "curve_progress_bps": 10000,
    "quote": { "mint": "So11111111111111111111111111111111111111112", "symbol": "SOL" },
    "market": { "market_cap_usd": "258000.00", "volume_24h_usd": "117255.90", "liquidity_usd": "41200.00",
                "holders": 1830, "price_change_24h_pct": 541.8, "last_trade_at": "2026-11-11T13:02:40.000Z" },
    "recipient": { "rail": "xmoney", "handle": "examplehandle" },
    "dex": null,
    "links": { "page": "https://payday.direct/explore#coin/uHMW…", "pump": "https://pump.fun/coin/uHMW…" }
  }],
  "next_cursor": "MQ",
  "total": 69,
  "meta": { "updated_at": "2026-11-11T13:03:20.991Z", "api_version": "v1" }
}

Launch a coin

A terminal or bot can launch a Payday coin for its user. The API runs the same launcher as payday.direct, so a coin launched this way has the same fee settings as one launched on the site: the same Payday token burn, the same DEX reserve and the same payouts to the account you name in fees_to.

Payday builds the transactions. The user's wallet signs them and pays for the launch. Payday never holds the wallet's key.

  1. Request a key with Allow this key to launch coins switched on, and keep it on your server.
  2. POST /launches with the coin and the wallet. The answer has the coin's address and the transactions to sign.
  3. Have the wallet sign every transaction without sending any. Do it within about 60 seconds, before they expire.
  4. POST /launches/{id}/submit with the signed transactions. Payday checks they are the ones it built, sends them and answers with the coin and its signature.
curl -X POST https://payday.direct/api/v1/launches -H "Authorization: Bearer pd_YOUR_KEY" -H "Content-Type: application/json" -d '{
  "wallet": "THE_LAUNCHING_WALLET_ADDRESS",
  "name": "Example Coin",
  "symbol": "Example",
  "description": "What the coin is about.",
  "image": "BASE64_PNG_JPEG_GIF_OR_WEBP",
  "dev_buy_sol": 0.5,
  "fees_to": "examplehandle"
}'
FieldWhat it is
walletRequired. The Solana address that signs and pays for the launch.
nameRequired. Up to 32 characters.
symbolRequired. The ticker, up to 13 characters. Its case is kept.
imageRequired. A PNG, JPEG, GIF or WebP as base64 or a data URL. Big files are fine: keep the whole request under 15 MB.
dev_buy_solRequired. The SOL the wallet spends on the first buy, above 0.
modecash_payback to launch a Cash Payback coin: its fees go to its holders, weighted by how much and how long they hold, and the launching wallet gets the $299 DexScreener cost back first. Leave out fees_to with it. Any pair in quote_mint works.
fees_toRequired unless mode is cash_payback. The X handle that gets the fees. A Cash App $cashtag, venmo:username or zelle: followed by the email or 10-digit US phone number the Zelle account is enrolled with works where Payday has them switched on. A Zelle destination can never be changed, and the email or number never appears in any response.
descriptionUp to 500 characters. Left out, it says who the coin pays, for example Fees to @rocketsnail via XMONEY using PAYDAY.
bannerA banner picture, same formats as image.
links{"x": "...", "telegram": "...", "website": "..."}. Without x, the coin links to the X account in fees_to.
hold_in_vaulttrue when the X account cannot receive X Money: its fees are held for it to claim on Payday.
quote_mintPair with a stock or another asset Payday supports. Leave out for SOL.
pay_with_solWith quote_mint: the wallet pays in SOL and a swap transaction is added. On unless you send false.

What comes back

{
  "data": {
    "id": "LAUNCH_ID",
    "status": "awaiting_signature",
    "mint": "THE_NEW_COIN_ADDRESS",
    "wallet": "THE_LAUNCHING_WALLET_ADDRESS",
    "fees_to": { "rail": "xmoney", "handle": "examplehandle" },
    "transactions": [
      { "name": "launch", "transaction": "BASE64" },
      { "name": "buy", "transaction": "BASE64" },
      { "name": "split_1", "transaction": "BASE64" }
    ],
    "sign_within_seconds": 60,
    "expires_in_seconds": 600
  }
}

Which transactions come back depends on the launch. Sign each one you get.

Signing

Each transaction is a base64 Solana versioned transaction. The launch one already carries the coin's own signature, so the wallet adds its signature and leaves the message as it is. A wallet's "sign all transactions" does exactly this. A transaction that was changed is refused with not_our_tx. Do not send them yourself: Payday sends them in the right order.

curl -X POST https://payday.direct/api/v1/launches/LAUNCH_ID/submit -H "Authorization: Bearer pd_YOUR_KEY" -H "Content-Type: application/json" -d '{
  "signed": { "launch": "BASE64", "buy": "BASE64", "split": ["BASE64"] }
}'

Send each signed transaction back under its name: launch, swap, fund, buy, and the split_ ones as the split list in order. The answer has status launched, the mint, the launch signature and the coin's links.

The fee split

The split_ transactions lock the coin's fees to the account in fees_to, in the same signing round as the launch. If fee_split.status comes back pending, the coin stays hidden on Payday until it is locked. Ask for fresh transactions with POST /launches/{id}/split, have the wallet sign and send these itself, then report their signatures to POST /launches/{id}/split/confirm.

EndpointWhat it does
POST/launchesCreates a launch and returns the transactions to sign. Nothing is on chain yet.
POST/launches/{id}/submitTakes the signed transactions, checks them and sends them.
GET/launches/{id}One launch made with your account's keys: awaiting_signature, submitting, launched or expired.
POST/launches/{id}/splitFresh fee split transactions for a launch whose split is still pending.
POST/launches/{id}/split/confirmBody {"signatures": [...]}. Confirms the fee split from the chain.

Rules

Launch a coin on EVM

Payday launches on EVM too, starting with Elysium (chain id 99901) through Montra. The same key launches there when it was made with launching switched on. The difference from Solana: the wallet sends the launch transaction itself and tells Payday its hash. Payday never signs or sends anything for it.

EndpointWhat it does
GET/evm/chainsThe EVM chains Payday launches on, with their native coin and explorer.
GET/evm/configsThe pairings you can launch on (chain optional): id, label, the paired coin, the fee and any starting fee. dev_buy says whether a dev buy is possible on it.
POST/evm/quoteBody {"config_id": 0, "dev_buy": "0.5"}. What the launch costs in the native coin: gas, total, and what the dev buy brings (buy.coins, buy.percent).
POST/evm/launchesCreates a launch and returns the one transaction for the wallet to send. Nothing is on chain yet.
POST/evm/launches/{id}/submitBody {"hash": "0x..."}. The hash the wallet got when it sent the launch.
GET/evm/launches/{id}awaiting_signature, submitted, launched (with the coin's address and links), failed or expired.
curl -X POST https://payday.direct/api/v1/evm/launches -H "Authorization: Bearer pd_YOUR_KEY" -H "Content-Type: application/json" -d '{
  "chain": 99901,
  "wallet": "0xTHE_WALLET_THAT_SENDS_THE_LAUNCH",
  "name": "Blockhead",
  "symbol": "HEAD",
  "description": "",
  "image": "data:image/png;base64,iVBORw0KGgo...",
  "fees_to": "someaccount",
  "config_id": 0,
  "dev_buy": "0.5",
  "links": { "x": "https://x.com/someaccount", "website": "https://example.com" }
}'

The answer has status awaiting_signature and one transaction named launch with to, data, value (in wei) and gas. Send it from wallet on that chain exactly as it is. A changed transaction is not this launch and is never picked up. Then post its hash to /evm/launches/{id}/submit and read GET /evm/launches/{id} until it says launched. A launch sent without a submit is still found on chain within about a minute. One that is never sent expires after 15 minutes.

Rules on EVM

Errors and limits

{ "error": { "code": "rate_limited", "message": "Limit is 600 requests a minute for this key." } }
StatusCodeMeaning
400bad_status, bad_sort, bad_cursor, bad_sinceA parameter is not one the endpoint takes. The message says what is allowed.
400key_in_urlA key was put in the URL. Send it in a header, and revoke it if the link was shared.
400bad_wallet, bad_name, bad_symbol, bad_image, bad_dev_buy, handle_required, sol_or_stock, split_unsigned, not_our_txLaunches: a field is missing or wrong, or a signed transaction is missing or was changed.
401missing_key, invalid_keyNo key, or the key is wrong or revoked.
403launch_not_allowed, opted_outThe key was made without launching, or the account in fees_to opted out of Payday.
404not_foundNo such coin, account or endpoint.
409conflict, in_flightLaunches: this launch was already submitted. The error carries the mint.
410expiredLaunches: the transactions were signed too late. Create the launch again.
429rate_limited, daily_quota, too_many_bad_keys, launch_rate_limitedOver a limit. Wait the seconds in Retry-After.
504not_landedLaunches: the network did not confirm the launch in time. Check GET /launches/{id} before creating it again.
5xxinternal, unavailableOur side. Retry with a short backoff.

Every response carries X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset, plus an ETag: send it back as If-None-Match and an unchanged answer comes back as an empty 304.

Your API keys

Checking whether you are signed in…

Keys are free and belong to the X account that made them. A key is shown once, when you make it, and works right away. Revoke a key here at any time.

Versioning

v1 only gains fields; nothing in it is renamed or removed. Anything that would break a client ships as v2, announced 90 days ahead. Questions or a higher limit: [email protected].