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.
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.
Authorization or X-API-Key header. A key in a URL is refused, because URLs end up in logs and browser history.| Endpoint | What it returns |
|---|---|
| GET/coins | Payday 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/accounts | Accounts 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/payouts | Payout orders on Peer, newest first, with the Peer link. handle, status. |
| GET/payback | Cash 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/burns | Every Payday token buy and burn, with transactions. |
| GET/stats | Platform 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/batch | The same for up to 100 mints: body {"mints": [...]}. Each mint counts as one request. |
Lists take limit (up to 200, default 50). When there is more, the response has next_cursor: pass it back as cursor.
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.
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.
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" }
}
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.
POST /launches with the coin and the wallet. The answer has the coin's address and the transactions to sign.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"
}'
| Field | What it is |
|---|---|
| wallet | Required. The Solana address that signs and pays for the launch. |
| name | Required. Up to 32 characters. |
| symbol | Required. The ticker, up to 13 characters. Its case is kept. |
| image | Required. 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_sol | Required. The SOL the wallet spends on the first buy, above 0. |
| mode | cash_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_to | Required 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. |
| description | Up to 500 characters. Left out, it says who the coin pays, for example Fees to @rocketsnail via XMONEY using PAYDAY. |
| banner | A banner picture, same formats as image. |
| links | {"x": "...", "telegram": "...", "website": "..."}. Without x, the coin links to the X account in fees_to. |
| hold_in_vault | true when the X account cannot receive X Money: its fees are held for it to claim on Payday. |
| quote_mint | Pair with a stock or another asset Payday supports. Leave out for SOL. |
| pay_with_sol | With quote_mint: the wallet pays in SOL and a swap transaction is added. On unless you send false. |
{
"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.
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 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.
| Endpoint | What it does |
|---|---|
| POST/launches | Creates a launch and returns the transactions to sign. Nothing is on chain yet. |
| POST/launches/{id}/submit | Takes 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}/split | Fresh fee split transactions for a launch whose split is still pending. |
| POST/launches/{id}/split/confirm | Body {"signatures": [...]}. Confirms the fee split from the chain. |
fees_to.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.
| Endpoint | What it does |
|---|---|
| GET/evm/chains | The EVM chains Payday launches on, with their native coin and explorer. |
| GET/evm/configs | The 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/quote | Body {"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/launches | Creates a launch and returns the one transaction for the wallet to send. Nothing is on chain yet. |
| POST/evm/launches/{id}/submit | Body {"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.
dev_buy is true. On other pairings, launch without one.{ "error": { "code": "rate_limited", "message": "Limit is 600 requests a minute for this key." } }
| Status | Code | Meaning |
|---|---|---|
| 400 | bad_status, bad_sort, bad_cursor, bad_since | A parameter is not one the endpoint takes. The message says what is allowed. |
| 400 | key_in_url | A key was put in the URL. Send it in a header, and revoke it if the link was shared. |
| 400 | bad_wallet, bad_name, bad_symbol, bad_image, bad_dev_buy, handle_required, sol_or_stock, split_unsigned, not_our_tx | Launches: a field is missing or wrong, or a signed transaction is missing or was changed. |
| 401 | missing_key, invalid_key | No key, or the key is wrong or revoked. |
| 403 | launch_not_allowed, opted_out | The key was made without launching, or the account in fees_to opted out of Payday. |
| 404 | not_found | No such coin, account or endpoint. |
| 409 | conflict, in_flight | Launches: this launch was already submitted. The error carries the mint. |
| 410 | expired | Launches: the transactions were signed too late. Create the launch again. |
| 429 | rate_limited, daily_quota, too_many_bad_keys, launch_rate_limited | Over a limit. Wait the seconds in Retry-After. |
| 504 | not_landed | Launches: the network did not confirm the launch in time. Check GET /launches/{id} before creating it again. |
| 5xx | internal, unavailable | Our 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.
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.
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].