# Payday API > Read Payday coins, the accounts they pay, holder rewards and burns, and launch Payday coins, from any app, bot or terminal. Base URL: https://payday.direct/api/v1. OpenAPI: https://payday.direct/api/v1/openapi.json. ## Get started - [Introduction](https://payday.direct/developers/index.md): Read Payday coins, the accounts they pay, holder rewards and burns, and launch Payday coins, from any app, bot or terminal. - [Quickstart](https://payday.direct/developers/quickstart.md): Make a key, call the API and read your first coin. - [Authentication](https://payday.direct/developers/authentication.md): Every call carries an API key in a header. - [API keys](https://payday.direct/developers/api-keys.md): Make, list and revoke your keys. ## Principles - [Base URL and versioning](https://payday.direct/developers/principles/versioning.md): One base URL; v1 only gains fields. - [Responses and numbers](https://payday.direct/developers/principles/responses.md): The envelope, money as strings, times in UTC. - [Pagination](https://payday.direct/developers/principles/pagination.md): Cursors for lists; the registry follows its own cursor. - [Freshness and caching](https://payday.direct/developers/principles/caching.md): A 15 second snapshot, ETags and 304s. - [Errors](https://payday.direct/developers/principles/errors.md): One error shape, stable codes, what to retry. - [Rate limits](https://payday.direct/developers/principles/rate-limits.md): Per key, per day, per address and per launch. - [Privacy and opt-outs](https://payday.direct/developers/principles/privacy.md): What the API shows about people, and what it never shows. ## Guides - [Which coins are Payday's](https://payday.direct/developers/guides/registry.md): Follow the registry and check mints in bulk. - [Show who gets a coin's fees](https://payday.direct/developers/guides/fee-recipient.md): For trading terminals: the fee recipient of any token, verifiable on chain. - [Track an account's payouts](https://payday.direct/developers/guides/accounts.md): What an X account earned, was paid, and what is on the way. - [Read Cash Payback rounds](https://payday.direct/developers/guides/cash-payback.md): A coin's pot and rounds, one round's payments, and a wallet's rewards. - [Launch a coin on Solana](https://payday.direct/developers/guides/launch-solana.md): Build, sign and submit a Payday launch from your app. - [Launch a Cash Payback or basket coin](https://payday.direct/developers/guides/launch-cash-payback.md): Fees to the coin's holders, in the pairing or a basket of assets. - [Launch a coin on EVM](https://payday.direct/developers/guides/launch-evm.md): Elysium through Montra: your wallet sends the launch itself. ## API reference - [GET /coins: List coins](https://payday.direct/developers/api-reference/coins/list-coins.md) - [GET /coins/{mint}: Get a coin](https://payday.direct/developers/api-reference/coins/get-a-coin.md) - [GET /registry: Follow the registry](https://payday.direct/developers/api-reference/registry/follow-the-registry.md) - [GET /registry/{mint}: Check one mint](https://payday.direct/developers/api-reference/registry/check-one-mint.md) - [POST /coins/check: Check mints in bulk](https://payday.direct/developers/api-reference/registry/check-mints-in-bulk.md) - [GET /fees/{mint}: Get a fee recipient](https://payday.direct/developers/api-reference/fee-recipients/get-a-fee-recipient.md) - [POST /fees/batch: Get fee recipients in bulk](https://payday.direct/developers/api-reference/fee-recipients/get-fee-recipients-in-bulk.md) - [GET /accounts: List accounts](https://payday.direct/developers/api-reference/accounts-and-payouts/list-accounts.md) - [GET /accounts/{handle}: Get an account](https://payday.direct/developers/api-reference/accounts-and-payouts/get-an-account.md) - [GET /payouts: List payouts](https://payday.direct/developers/api-reference/accounts-and-payouts/list-payouts.md) - [GET /payback: Get the rules](https://payday.direct/developers/api-reference/cash-payback/get-the-rules.md) - [GET /payback/coins/{mint}: Get a Cash Payback coin](https://payday.direct/developers/api-reference/cash-payback/get-a-cash-payback-coin.md) - [GET /payback/coins/{mint}/rounds/{n}: Get a round](https://payday.direct/developers/api-reference/cash-payback/get-a-round.md) - [GET /payback/wallets/{owner}: Get a wallet's rewards](https://payday.direct/developers/api-reference/cash-payback/get-a-wallets-rewards.md) - [GET /rewards: Get holder rewards](https://payday.direct/developers/api-reference/holder-rewards/get-holder-rewards.md) - [GET /rewards/assets: List basket assets](https://payday.direct/developers/api-reference/holder-rewards/list-basket-assets.md) - [GET /burns: List Payday token burns](https://payday.direct/developers/api-reference/platform/list-payday-token-burns.md) - [GET /stats: Get platform totals](https://payday.direct/developers/api-reference/platform/get-platform-totals.md) - [POST /launches: Create a launch](https://payday.direct/developers/api-reference/launch-on-solana/create-a-launch.md) - [GET /launches/{id}: Get a launch](https://payday.direct/developers/api-reference/launch-on-solana/get-a-launch.md) - [POST /launches/{id}/submit: Submit a launch](https://payday.direct/developers/api-reference/launch-on-solana/submit-a-launch.md) - [POST /launches/{id}/split: Get fresh fee split transactions](https://payday.direct/developers/api-reference/launch-on-solana/get-fresh-fee-split-transactions.md) - [POST /launches/{id}/split/confirm: Confirm the fee split](https://payday.direct/developers/api-reference/launch-on-solana/confirm-the-fee-split.md) - [GET /evm/chains: List EVM chains](https://payday.direct/developers/api-reference/launch-on-evm/list-evm-chains.md) - [GET /evm/configs: List pairings](https://payday.direct/developers/api-reference/launch-on-evm/list-pairings.md) - [POST /evm/quote: Quote a launch](https://payday.direct/developers/api-reference/launch-on-evm/quote-a-launch.md) - [POST /evm/launches: Create an EVM launch](https://payday.direct/developers/api-reference/launch-on-evm/create-an-evm-launch.md) - [POST /evm/launches/{id}/submit: Submit an EVM launch](https://payday.direct/developers/api-reference/launch-on-evm/submit-an-evm-launch.md) - [GET /evm/launches/{id}: Get an EVM launch](https://payday.direct/developers/api-reference/launch-on-evm/get-an-evm-launch.md) - [GET /keys: List your keys](https://payday.direct/developers/api-reference/keys/list-your-keys.md) - [POST /keys: Create a key](https://payday.direct/developers/api-reference/keys/create-a-key.md) - [DELETE /keys/self: Revoke this key](https://payday.direct/developers/api-reference/keys/revoke-this-key.md) - [DELETE /keys/{id}: Revoke a key by id](https://payday.direct/developers/api-reference/keys/revoke-a-key-by-id.md) - [GET /openapi.json: Get the OpenAPI spec](https://payday.direct/developers/api-reference/keys/get-the-openapi-spec.md) ## Changelog - [Changelog](https://payday.direct/developers/changelog.md): Every change to the API, newest first. ## FAQ - [FAQ](https://payday.direct/developers/faq.md): Short answers to common questions. --- # Introduction Source: https://payday.direct/developers The Payday API gives your app the same data payday.direct runs on, and the same launcher. - **Read** every Payday coin on Solana and EVM, the X accounts they pay, payouts on Peer, Cash Payback rounds and basket dividends, and every Payday token burn. - **Tell Payday coins apart** from every other pump.fun coin with the registry, built for terminals that see thousands of new coins an hour. - **Launch** Payday coins for your users with the same fee settings as the site. The user's wallet signs and pays; Payday never holds a key.
QuickstartMake a key and read your first coin in two minutes. API referenceEvery endpoint, its parameters, examples and a console to try it. Which coins are Payday'sFollow the registry and check thousands of mints a minute. Launch a coinBuild, sign and submit a launch from your own app. ChangelogEvery change to the API, newest first. Get a keyFree. A key that reads data needs no sign-in.
## At a glance | | | |---|---| | Base URL | `https://payday.direct/api/v1` | | Format | JSON over HTTPS | | Auth | An API key in `Authorization: Bearer` or `X-API-Key` | | Limits | 600 requests a minute and 250,000 a day per key | | Freshness | Answers come from a 15 second snapshot; new coins reach the registry in about 3 seconds | | Spec | [OpenAPI 3.1](https://payday.direct/api/v1/openapi.json) | | For AI tools | [llms.txt](/developers/llms.txt) and every page as Markdown (add `.md` to its address) | ## What a Payday coin is A Payday coin is a pump.fun coin whose creator fees go to Payday's payout wallet, as the only shareholder in the coin's pump.fun fee sharing config. Payday then pays those fees out one of two ways: - **Account coins** pay an X account (or a Cash App, Venmo or Zelle account where those are on) in dollars, through Peer. 10% of the fees buys and burns the Payday token. - **Cash Payback coins** pay the people holding the coin, in rounds, weighted by how much and how long they hold. While the coin's $299 DexScreener reimbursement fills, the split is 10% buy and burn, 5% treasury, 70% DEX and 15% holders; after it is paid, holders get 85%. A basket coin pays its holders in a basket of assets instead of the pairing. --- # Quickstart Source: https://payday.direct/developers/quickstart ## 1. Make a key Open [API keys](/developers/api-keys) and press **Create key**. A key that reads data needs no sign-in and works right away. It is shown once, so copy it. ## 2. Call the API Send the key in a header on every call. Everything answers JSON. ```bash cURL curl -H "Authorization: Bearer pd_YOUR_KEY" "https://payday.direct/api/v1/coins?status=graduated&limit=5" ``` ```javascript JavaScript const res = await fetch("https://payday.direct/api/v1/coins?status=graduated&limit=5", { headers: { Authorization: "Bearer " + process.env.PAYDAY_KEY }, }); const { data, next_cursor } = await res.json(); console.log(data.map((c) => c.symbol), next_cursor); ``` ```python Python import os, requests r = requests.get("https://payday.direct/api/v1/coins", params={"status": "graduated", "limit": 5}, headers={"Authorization": "Bearer " + os.environ["PAYDAY_KEY"]}) r.raise_for_status() print([c["symbol"] for c in r.json()["data"]]) ``` ## 3. Read one coin and the account it pays ```bash curl -H "X-API-Key: pd_YOUR_KEY" https://payday.direct/api/v1/coins/MINT_ADDRESS curl -H "X-API-Key: pd_YOUR_KEY" https://payday.direct/api/v1/accounts/examplehandle ``` ## Next - [Which coins are Payday's](/developers/guides/registry): follow the registry instead of polling `/coins`. - [Errors](/developers/principles/errors) and [rate limits](/developers/principles/rate-limits): what to retry and when. - [Launch a coin](/developers/guides/launch-solana): needs a key made while signed in, with launching switched on. --- # Authentication Source: https://payday.direct/developers/authentication Every endpoint except [the OpenAPI spec](https://payday.direct/api/v1/openapi.json) needs a key. Send it one of two ways: ```bash curl -H "Authorization: Bearer pd_YOUR_KEY" https://payday.direct/api/v1/stats curl -H "X-API-Key: pd_YOUR_KEY" https://payday.direct/api/v1/stats ``` > Warning: A key in the URL (`?key=`, `?api_key=`, `?token=`) is refused with `400 key_in_url`, because URLs end up in logs, browser history and Referer headers. If you ever put one in a link, revoke it. ## Keeping a key safe - Call the API from your server or bot. Anything a browser loads, its user can read. - Payday keeps only a SHA-256 fingerprint of each key, so nobody at Payday can read it back. It is shown to you once. - Revoke a key the moment it may have leaked, from [API keys](/developers/api-keys) when signed in, or from anywhere by sending the key itself: ```bash curl -X DELETE -H "Authorization: Bearer pd_YOUR_KEY" https://payday.direct/api/v1/keys/self ``` A revoked key stops working everywhere within 15 seconds. ## Two kinds of key | | Read key | Launch key | |---|---|---| | Sign-in | None | Signed in with X | | Reads data | Yes | Yes | | Launches coins | No | Yes, when made with launching switched on | | How many | 3 new a day per address | 5 active, 10 new a day per account | | Shared allowance | All keys from one address share 1,200 requests a minute | 600 a minute each | | Expires | After 90 days unused | No | | Listed on API keys | No, keep it safe | Yes, with usage and Revoke | Launching cannot be switched on later. Make a new key instead. --- # API keys Source: https://payday.direct/developers/api-keys Keys are free. A key is shown once, when you make it, and works right away. Without a sign-in a key reads data only and is not listed here later, so keep it somewhere safe. Sign in to see and revoke your keys here, and to make a key that can launch coins.
Questions, or a higher limit: `team@payday.direct`. --- # Base URL and versioning Source: https://payday.direct/developers/principles/versioning ``` https://payday.direct/api/v1 ``` All endpoints live under `/api/v1` on payday.direct, over HTTPS only. ## What can change in v1 - **Added:** new endpoints, new fields in a response, new optional parameters and new values in a `status` or `type` field. Write clients that ignore fields they do not know. - **Never in v1:** a field renamed or removed, a type changed, or a parameter made required. Anything that would break a client ships as v2, announced in the [changelog](/developers/changelog) 90 days ahead, with v1 kept running alongside. ## Which version is live The spec's `info.version` carries the server release, for example `v1 (0.1.265)`, and every answer's `meta.api_version` is `v1`. --- # Responses and numbers Source: https://payday.direct/developers/principles/responses ## The envelope Lists answer `{ data: [...], next_cursor, total, meta }` and single items `{ data: {...}, meta }`. `meta` says when the snapshot behind the answer was taken: ```json { "data": { "mint": "..." }, "meta": { "updated_at": "2026-11-15T20:03:20.991Z", "api_version": "v1" } } ``` ## Numbers - **Dollars** are strings with two decimals: `"12.34"`. - **Token and SOL amounts** are strings, so nothing loses precision. `raw` fields are the integer amount in the token's smallest unit. - **Percents** are numbers (`70` means 70%); basis points are named `_bps` (`7000`). - **Dollar values of past payments** are the value recorded when each was paid, never repriced. ## Times and names - Times are ISO 8601 in UTC: `2026-11-15T20:03:20.991Z`. - Tickers keep the case they were launched with: `eCat` stays `eCat`. - Solana addresses are base58; EVM addresses are lower-case `0x` hex. --- # Pagination Source: https://payday.direct/developers/principles/pagination Lists take `limit` (1 to 200, default 50). When there is more, the answer has `next_cursor`: pass it back as `cursor` for the next page. On the last page `next_cursor` is `null`. ```bash curl -H "X-API-Key: pd_YOUR_KEY" "https://payday.direct/api/v1/coins?limit=200" curl -H "X-API-Key: pd_YOUR_KEY" "https://payday.direct/api/v1/coins?limit=200&cursor=MjAw" ``` `total` is the size of the whole filtered list. ## Exceptions - **The registry** pages up to 1,000 a call and always returns a `next_cursor`, even when nothing is new, so a follower just keeps passing it. See [Which coins are Payday's](/developers/guides/registry). - **`/rewards`** pages newest first up to 100 a call and returns `next_cursor` for older payouts. - **`/payback/coins/{mint}/rounds/{n}`** pages the wallets paid in one round. --- # Freshness and caching Source: https://payday.direct/developers/principles/caching Read answers come from a snapshot of Payday's books rebuilt every 15 seconds, so asking more often than that returns the same answer. The registry looks for new coins every 3 seconds. ## ETags Every read answer carries an `ETag`. Send it back as `If-None-Match` and an unchanged answer comes back as an empty `304 Not Modified`, which still counts toward your limit but costs no bandwidth. ```bash curl -i -H "X-API-Key: pd_YOUR_KEY" -H 'If-None-Match: "aB3dE..."' https://payday.direct/api/v1/stats ``` ## Cache headers Keyed answers carry `Cache-Control: private`, so no shared cache stores them. Keep your own copy for as long as `max-age` says. --- # Errors Source: https://payday.direct/developers/principles/errors Every error has the same shape. `code` is stable and safe to branch on; `message` is for people and may change. ```json { "error": { "code": "rate_limited", "message": "Limit is 600 requests a minute for this key." } } ``` | Status | Code | Meaning | Retry? | |---|---|---|---| | 400 | `bad_status`, `bad_sort`, `bad_cursor`, `bad_since`, `bad_mints`, `bad_mint`, `bad_json`, `bad_chain`, `basket_type` | A parameter is not one the endpoint takes. The message says what is allowed. | Fix the request | | 400 | `key_in_url` | A key was put in the URL. | Send it in a header, and revoke it | | 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. | Fix the request | | 400 | `basket_size`, `basket_weights`, `basket_asset_not_allowed`, `basket_payback_not_allowed` | Launches: the basket was refused. `error.rejected` gives one reason per asset. | Fix the basket | | 401 | `missing_key`, `invalid_key` | No key, or the key is wrong or revoked. | No | | 403 | `signin_required`, `launch_not_allowed`, `opted_out` | A launch key was asked for without a sign-in, the key cannot launch, or the account in `fees_to` opted out. | No | | 404 | `not_found` | No such coin, account, launch or endpoint. | No | | 409 | `conflict`, `in_flight` | Launches: already submitted. The error carries the `mint`. | No | | 410 | `expired` | Launches: signed too late. | Create the launch again | | 413, 415 | `too_large`, `json_required` | The body is too large, or a key request without a sign-in was not JSON. | Fix the request | | 429 | `rate_limited`, `daily_quota`, `too_many_bad_keys`, `too_many_new_keys`, `launch_rate_limited` | Over a limit. | After `Retry-After` seconds | | 503 | `unavailable` | Starting up, or a part that is switched off here. | Yes, with backoff | | 504 | `unconfirmed` | Launches: sent, not confirmed yet. Never create it again: submit the same launch again or read `GET /launches/{id}`. | Yes, the same launch | | 504, 410 | `not_landed` | Launches: the network ruled the launch out, so no coin was made. | Create the launch again | | 500 | `internal` | Our side. | Yes, with backoff | ## A sensible retry Retry 429, 500, 503 and 504 `unconfirmed` with exponential backoff starting at one second, and always honour `Retry-After`. Never retry a 4xx other than 429 without changing the request. --- # Rate limits Source: https://payday.direct/developers/principles/rate-limits | Limit | Value | |---|---| | Requests per key | 600 a minute | | Requests per key per day | 250,000 | | Keys made without a sign-in | Share 1,200 a minute per address | | Wrong keys | 20 a minute per address | | Launches | 8 per wallet and 30 per key every 10 minutes, 500 per key a day | | Bulk calls | `POST /coins/check` (up to 500 mints) counts as one request; `POST /fees/batch` as one plus one per Payday coin in it | ## Headers Every keyed answer carries: ``` X-RateLimit-Limit: 600 X-RateLimit-Remaining: 587 X-RateLimit-Reset: 1763237040 ``` `X-RateLimit-Reset` is a Unix time in seconds. Over a limit, the answer is `429` with `Retry-After` in seconds. ## Staying under - Use the [registry](/developers/guides/registry) cursor instead of re-reading `/coins`. - Send `If-None-Match` (see [Freshness and caching](/developers/principles/caching)). - Batch: one `/coins/check` call answers for 500 mints. Need more? Write to `team@payday.direct` with your key's id and what you are building. --- # Privacy and opt-outs Source: https://payday.direct/developers/principles/privacy - **X handles are public.** A coin that pays an X account shows the handle. - **Cash App, Venmo and Zelle** show the rail only (`{ "rail": "zelle" }`), never the username, email or phone number. - **Accounts that opted out** of Payday are left out entirely: their coins leave `/coins` and the registry, and `/accounts/{handle}` answers 404. A coin that leaves the registry is not announced; see [the registry guide](/developers/guides/registry) for how to notice. - **Wallets** are public chain data. Holder lists in Cash Payback rounds show the wallets paid and what each was sent. --- # Which coins are Payday's Source: https://payday.direct/developers/guides/registry A Payday coin is a pump.fun coin. Its address ends in `pump` like every other and nothing in the address marks it. The registry is how you tell them apart: every Payday coin on Solana in the order it was registered, each with a number (`seq`) that only grows. ## Follow it 1. Read it once from the start, 1,000 coins a page, until `has_more` is false. Keep the last `next_cursor`. 2. Every few seconds, call it again with that cursor. You get only the coins registered since, and a new cursor. With nothing new the list is empty and the cursor is the same. ```javascript JavaScript const KEY = process.env.PAYDAY_KEY, BASE = "https://payday.direct/api/v1"; let cursor = null; const seen = new Map(); async function follow() { for (;;) { const url = BASE + "/registry?limit=1000" + (cursor ? "&cursor=" + cursor : ""); const r = await fetch(url, { headers: { Authorization: "Bearer " + KEY } }); if (r.status === 429) { await sleep(1000 * Number(r.headers.get("Retry-After") || 1)); continue; } const j = await r.json(); for (const c of j.data) seen.set(c.mint, c); cursor = j.next_cursor; if (!j.has_more) break; } } const sleep = (ms) => new Promise((ok) => setTimeout(ok, ms)); await follow(); setInterval(follow, 3000); ``` ```python Python import os, time, requests KEY, BASE = os.environ["PAYDAY_KEY"], "https://payday.direct/api/v1" cursor, seen = None, {} def follow(): global cursor while True: p = {"limit": 1000, **({"cursor": cursor} if cursor else {})} r = requests.get(BASE + "/registry", params=p, headers={"Authorization": "Bearer " + KEY}) if r.status_code == 429: time.sleep(int(r.headers.get("Retry-After", 1))); continue j = r.json() for c in j["data"]: seen[c["mint"]] = c cursor = j["next_cursor"] if not j["has_more"]: return while True: follow(); time.sleep(3) ``` ## Check mints you meet elsewhere Up to 500 mints in one call, which counts as one request: ```bash curl -X POST -H "Authorization: Bearer pd_YOUR_KEY" -H "Content-Type: application/json" \ -d '{"mints":["MINT_ONE","MINT_TWO"]}' https://payday.direct/api/v1/coins/check ``` `payday` has the registry entry of each Payday coin and `not_payday` the rest. For one mint, `GET /registry/{mint}` answers 200 or 404. ## Things to know - A coin is registered once its launch is confirmed and recorded, usually within a few seconds. If a seconds-old coin reads as not Payday's, ask again shortly before you settle on that. - `source` is `launched` (launched on Payday) or `routed` (an existing coin whose fees were pointed at Payday later). `mode` says whether the fees go to an account or to holders. - **Check it without trusting us:** `fee_config` is the coin's pump.fun fee sharing config. Read it on chain; [`GET /fees/{mint}`](/developers/api-reference/fee-recipients/get-fee-recipient) gives the wallet that must be its only shareholder. - A coin can leave the registry (its account opted out). Leaving is not announced: when `total` differs from your own count, read from the start again. A coin that comes back gets a new, higher `seq`. - Answers come from memory, so asking about every new pump.fun coin is fine. The registry covers Solana; EVM coins are in `/coins?chain=elysium`. --- # Show who gets a coin's fees Source: https://payday.direct/developers/guides/fee-recipient Trading terminals show who receives a token's creator fees. For a Payday coin that is an X account, or the coin's holders for a Cash Payback coin. ```bash curl -H "X-API-Key: pd_YOUR_KEY" https://payday.direct/api/v1/fees/MINT_ADDRESS ``` ```json { "mint": "MINT_ADDRESS", "feedrop": true, "feeRecipient": { "type": "x_account", "handle": "examplehandle", "profile": "https://x.com/examplehandle", "paidOn": "xmoney", "since": "2026-11-12T10:04:00.000Z", "how": "launched for this account" }, "payouts": { "paidUsd": 1240.5, "openOrdersUsdc": 120, "lastPaidAt": "2026-11-15T18:22:41.000Z" }, "onchain": { "feeSharingConfig": "CONFIG_ADDRESS", "shareholders": [{ "address": "PAYOUT_WALLET", "shareBps": 10000 }], "adminRevoked": true, "payoutWallet": "PAYOUT_WALLET", "verified": true }, "page": "https://payday.direct/x/examplehandle" } ``` - `feedrop: false` means the token is not a Payday coin. These answers come from the registry in memory, so ask about every token you list. - `onchain.verified` is true when pump.fun pays 100% of the coin's creator fee to Payday's payout wallet. Read `feeSharingConfig` yourself to check it. - A Cash Payback coin answers `feeRecipient.type: "holders"` with a link to its rounds. - For a page of tokens, `POST /fees/batch` takes up to 100 mints and costs one request plus one per Payday coin in it. > Note: The fee endpoints keep the field names they launched with (camelCase, `feedrop`), so integrations built on them never break. --- # Track an account's payouts Source: https://payday.direct/developers/guides/accounts ```bash curl -H "X-API-Key: pd_YOUR_KEY" https://payday.direct/api/v1/accounts/examplehandle ``` The answer has the account's fees (`earned_usd`, `paid_usd`, `on_the_way_usd`), the progress of its next payout (`next_batch`), its coins and its last 20 payouts. ## How a payout happens 1. Every coin naming the account collects creator fees on pump.fun. 2. Once the account's share reaches the payout threshold, Payday lists a payout order on Peer, a peer-to-peer marketplace on Base. `next_batch.progress_usd` and `threshold_usd` show how close it is. 3. A Peer buyer pays the account on X Money (or Cash App, Venmo or Zelle) and receives the USDC. The order moves through `listed`, `matched`, `partially_paid` and `paid`. `/payouts?handle=examplehandle&status=paid` lists every paid order with its Peer link. ## Every account `/accounts?sort=earned` (or `paid`, `coins`) lists every account that earns fees, 200 a page. --- # Read Cash Payback rounds Source: https://payday.direct/developers/guides/cash-payback A Cash Payback coin pays its holders in rounds. Each holder's share is tokens held times time held since the last round, times a hold multiplier that grows from their first buy. ## The rules `GET /payback` has the split, when rounds run and how holding is weighted. Read it instead of hardcoding numbers: they are set by Payday and can change. Right now, while a coin's $299 DexScreener reimbursement fills: 10% buy and burn, 5% treasury, 70% DEX, 15% holders; then 85% holders. ## One coin ```bash curl -H "X-API-Key: pd_YOUR_KEY" https://payday.direct/api/v1/payback/coins/MINT_ADDRESS ``` - `pot` and `pot_usd`: what is waiting for the next round. - `next_round`: the line it pays at (`pays_at_usd`), progress, and when the daily round is due. - `dex`: the DexScreener reimbursement, `filling` until it is sent to the launch wallet. - `rounds`: the latest rounds, each with what it paid and to how many wallets. - `rewards`: everything paid, in dollars and by asset. - A basket coin adds `basket` (its type, assets and weights), `holdings`, `fund` and its last `dividends`. ## One round `/payback/coins/{mint}/rounds/{n}` lists every wallet paid in round `n`: the amount, the delivery cost taken from its share, days held, the multiplier and the transaction. ## One wallet `/payback/wallets/{owner}` gives a wallet's share across every Cash Payback coin: what it was paid, an estimate of what it has building for the next round, and `earned_by_asset`. ## Across every coin `/rewards` has the totals (all time, 24 hours, 7 days), dollars per asset, the top 25 coins and recent payouts newest first. A basket dividend is one row with every asset it paid. --- # Launch a coin on Solana Source: https://payday.direct/developers/guides/launch-solana A terminal or bot can launch a Payday coin for its user. The API runs the same launcher as payday.direct, so the coin gets the same fee settings: the same Payday token burn, the same DEX reimbursement and the same payouts. Payday builds the transactions. The user's wallet signs them and pays for the launch. Payday never holds the wallet's key. ## Before you start You need a **launch key**: sign in on [API keys](/developers/api-keys) and make a key with **Allow this key to launch coins** switched on. Keep it on your server. ## 1. Create the launch ```bash 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" }' ``` The answer has the new coin's `mint`, a launch `id` and the transactions to sign. Nothing is on chain yet. [Every field](/developers/api-reference/launch-on-solana/create-launch). ## 2. Sign, without sending Have the wallet sign every transaction within about 60 seconds. Each 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. ```javascript JavaScript import { VersionedTransaction } from "@solana/web3.js"; const txs = launch.transactions.map((t) => VersionedTransaction.deserialize(Buffer.from(t.transaction, "base64"))); const signed = await wallet.signAllTransactions(txs); // Phantom, Solflare, or your own signer const out = {}; const split = []; launch.transactions.forEach((t, i) => { const b64 = Buffer.from(signed[i].serialize()).toString("base64"); if (t.name.startsWith("split_")) split.push(b64); else out[t.name] = b64; }); if (split.length) out.split = split; ``` > Warning: Do not send them yourself. Payday checks they are the ones it built and sends them in the right order. A changed transaction is refused with `not_our_tx`. ## 3. Submit ```bash 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"] } }' ``` The answer has `status: "launched"`, the `mint`, the launch `signature` and the coin's links. ## When the network is slow `504 unconfirmed` means the launch was sent and is not confirmed yet. **Never create it again.** Submit the same launch again, or read `GET /launches/{id}`, which stays `submitting` until it turns `launched` or `expired`. `not_landed` means the network ruled it out and no coin was made: create a new launch. ## The fee split The `split_` transactions lock the coin's fees to the account in `fees_to` in the same signing round. 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`. ## Rules - The launching wallet pays the network fees and its first buy. The DEX reimbursement goes to the wallet that signed the launch. - Launches made with your key are recorded under the X account that owns the key. - 8 launches per wallet and 30 per key every 10 minutes, 500 per key a day. - An account that opted out of Payday cannot be named in `fees_to`. --- # Launch a Cash Payback or basket coin Source: https://payday.direct/developers/guides/launch-cash-payback Send `mode: "cash_payback"` and leave out `fees_to`. The coin's fees go to its holders; the launching wallet gets the $299 DexScreener cost back first. ```json { "wallet": "...", "name": "Example", "symbol": "EXM", "image": "...", "dev_buy_sol": 0.5, "mode": "cash_payback" } ``` Any pair in `quote_mint` works for a plain Cash Payback coin. ## Baskets A basket coin pays holders in up to 15 assets instead of the pairing. Read `GET /payback` (`baskets`) and `GET /rewards/assets` first: they list the types, the size limits and every asset a basket may hold. ```json { "mode": "cash_payback", "basket": { "type": "payout", "legs": [ { "mint": "So11111111111111111111111111111111111111112", "weight": 5000 }, { "mint": "XsDoVfqeBukxuZHWhdvWHBhgEHjGNst4MLodqsJHzoB", "weight": 5000 } ] } } ``` - **Payout basket:** the holders' part buys the basket and every asset is sent to holders each dividend. Nothing is held. - **Fund basket:** the holders' part buys the basket and the coin keeps it. Holders are paid each asset's gain above what it cost. A Fund basket takes stocks, pre-stocks, majors and big memes, never USDC. `payback` adds one asset that part of the holders' share buys and pays every round. - `weight` is in basis points adding up to 10000. Leave out every weight for an even split. - Each asset is checked before anything is built: at most a 5% transfer fee, no transfer hook, not frozen, and a swap route from the pairing. A refusal answers 400 with `error.rejected`, one reason per asset. - The basket is locked at launch. Baskets need a SOL pair. --- # Launch a coin on EVM Source: https://payday.direct/developers/guides/launch-evm Payday launches on EVM too, starting with Elysium (chain id 99901) through Montra. The same launch key works there. The difference from Solana: the wallet sends the launch transaction itself and tells Payday its hash. Payday never signs or sends anything for it. ## Steps 1. `GET /evm/configs?chain=99901`: pick a pairing. `dev_buy` says whether a dev buy is possible on it. 2. `POST /evm/quote` with `{"config_id": 0, "dev_buy": "0.5"}`: what it costs in the native coin. 3. `POST /evm/launches`: the one transaction to send. 4. Send it from `wallet` exactly as it is, then `POST /evm/launches/{id}/submit` with `{"hash": "0x..."}`. 5. Read `GET /evm/launches/{id}` until it says `launched`. ```bash 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", "image": "data:image/png;base64,iVBORw0KGgo...", "fees_to": "someaccount", "config_id": 0, "dev_buy": "0.5" }' ``` ```javascript JavaScript (viem) const { data } = await (await fetch(BASE + "/evm/launches", { method: "POST", headers, body: JSON.stringify(req) })).json(); const tx = data.transactions[0]; // { name: "launch", to, data, value, gas } const hash = await walletClient.sendTransaction({ to: tx.to, data: tx.data, value: BigInt(tx.value), gas: BigInt(tx.gas) }); await fetch(BASE + "/evm/launches/" + data.id + "/submit", { method: "POST", headers, body: JSON.stringify({ hash }) }); ``` ## Rules on EVM - The wallet pays gas and its dev buy in the chain's native coin (HYPE on Elysium) and must hold enough before the launch is created. - Tickers are up to 10 characters with no spaces, names up to 32. Links must be https. - The DEX reimbursement goes to the wallet that sent the launch, in USDC on the same chain. - A launch sent without a submit is still found on chain within about a minute. One never sent expires after 15 minutes. --- # FAQ Source: https://payday.direct/developers/faq ## Is the API free? Yes. Keys are free, with 600 requests a minute and 250,000 a day each. Write to `team@payday.direct` for more. ## Do I need to sign in? Not to read data. Sign in with X to list and revoke your keys, and to make a key that launches coins. ## Do I need a wallet? Not to read. To launch, the user's wallet signs (Solana) or sends (EVM) the launch and pays for it. ## Can a key move money? No. No key can move funds or sign anything. A launch key only builds transactions for a wallet to sign. ## How fresh is the data? A 15 second snapshot; the registry finds new coins in about 3 seconds. ## Why is a coin I know missing? It may be seconds old (ask again shortly), hidden until its fee split confirms, or its account opted out of Payday. ## Can I call it from a web page? The API answers any origin (CORS), but a key in a web page can be read by anyone who opens it. Call it from your server. ## Is there an SDK? Not yet. The [OpenAPI spec](https://payday.direct/api/v1/openapi.json) generates a typed client in most languages (openapi-generator, openapi-typescript, oapi-codegen). --- # Changelog Source: https://payday.direct/developers/changelog v1 only gains fields. Anything that would break a client ships as v2, announced here 90 days ahead. The server release is in each entry; `GET /api/version` and the spec's `info.version` show the one that is live.
November 2026
## A full documentation site
0.1.265November 15
The developer docs are now a full site, and the OpenAPI spec describes every endpoint.
Added
- Guides, principles, this changelog and an FAQ at [/developers](/developers), with search. - An API reference page for every endpoint: parameters, request bodies, response codes, examples in cURL, JavaScript and Python, and a console to try read endpoints with your key. - [llms.txt](/developers/llms.txt), [llms-full.txt](/developers/llms-full.txt) and every page as Markdown: add `.md` to its address. - OpenAPI: tags, operation ids, descriptions and response examples on every operation, plus the key and fee recipient endpoints (`/keys`, `/keys/self`, `/keys/{id}`, `/fees/{mint}`, `/fees/batch`) that were missing from the spec. ## Cash Payback DEX share is 70%
0.1.263November 15
Changed
- The Cash Payback split while a reimbursement fills is now 10% burn, 5% treasury, 70% DEX and 15% holders (was 65% and 20%). `GET /payback` and every coin's `split` carry the new numbers; holders still get 85% once the reimbursement is paid. ## Launches that land late
0.1.251November 15
Added
- `504 unconfirmed`: a launch that was sent but is not confirmed yet. Submit the same launch again or read `GET /launches/{id}`; never create it again.
Changed
- `GET /launches/{id}` stays `submitting` while a sent launch is unconfirmed and carries its signature, and turns `expired` once the chain rules it out. ## Wallet shares run to the present
0.1.249November 15
Changed
- `/payback/wallets/{owner}` adds each bag's time since the last holder count, so the share estimate, hold time and multiplier are current. ## The registry, open read keys and faster answers
0.1.247November 15
Tell Payday coins apart from every other pump.fun coin, at volume.
Added
- `GET /registry`, `GET /registry/{mint}` and `POST /coins/check` (500 mints in one request). See [Which coins are Payday's](/developers/guides/registry). - Read keys without a sign-in: 3 a day per address, sharing 1,200 requests a minute, switched off after 90 days unused. - `DELETE /keys/self`: whoever holds a key can switch it off. - `ETag` on every read answer; `If-None-Match` gives an empty 304.
Changed
- The fee recipient endpoints use the same keys, limits and error shape as the rest of the API, and answer non-Payday mints from memory. `POST /fees/batch` costs one request plus one per Payday coin. - `/coins?sort=` accepts only `new`, `market_cap`, `volume` and `holders`. ## Baskets of up to 15 assets
0.1.240November 15
Changed
- Basket launches take up to 15 assets (was 10). A launch with too many is refused with `basket_size` instead of being trimmed. ## Fees being collected on basket coins
0.1.238November 15
Added
- `fund.being_collected_usd` on basket coins: the holders' share of fees still being collected on pump.fun. ## Baskets of up to 10 assets
0.1.232November 15
Changed
- Basket launches take up to 10 assets (was 5); `GET /payback` reports `max_assets`. ## Baskets on production
0.1.226November 14
Added
- Basket fields on coins (`cash_payback.basket`), `/coins?basket=`, `GET /rewards`, `GET /rewards/assets` and the `basket` launch field are live. ## Cash Payback baskets
0.1.225November 14
Added
- Payout and Fund baskets: `basket` on `POST /launches`, basket details on `/payback/coins/{mint}` (`basket`, `holdings`, `fund`, `dividends`), and the reward list. ## No launcher share on Cash Payback
0.1.195November 13
Removed
- `dev_share_pct` on `POST /launches`. The launcher is only reimbursed for DEX. ## Cash Payback endpoints
0.1.193November 13
Added
- `GET /payback`, `/payback/coins/{mint}`, `/payback/coins/{mint}/rounds/{n}` and `/payback/wallets/{owner}`. - `mode` on every coin (`account` or `cash_payback`), and `mode: "cash_payback"` on `POST /launches`. ## EVM coins and launches
0.1.188November 13
Added
- Elysium coins in `/coins` and `/coins/{mint}`, with `chain` and `chain_id`, and a `chain` filter. - Keyed EVM launches: `/evm/chains`, `/evm/configs`, `/evm/quote`, `/evm/launches`, submit and status. ## Keys work right away
0.1.157November 12
Changed
- A key made after an X sign-in works as soon as it is made, launch keys included. No approval step; `key_pending` no longer happens for new keys. ## Default descriptions
0.1.134November 11
Changed
- A launch without a description says who the coin pays, for example `Fees to @example via XMONEY using PAYDAY.` ## Zelle as a fee destination
0.1.128November 11
Added
- `fees_to: "zelle:"` where Zelle is on. The email or number never appears in any response. ## The launch API
0.1.127November 11
Added
- `POST /launches`, `POST /launches/{id}/submit`, `GET /launches/{id}` and the fee split endpoints, for keys made with launching switched on. ## Keys on every call
0.1.121November 11
Changed
- Every data call needs a key in a header; keys in URLs are refused. 600 a minute and 250,000 a day per key. ## API v1
0.1.120November 11
Added
- `/api/v1`: coins, accounts, payouts, burns, stats and the OpenAPI spec. ## Fee recipient API
0.1.0November 7
Added
- `GET /fees/{mint}` and `POST /fees/batch` for trading terminals: who receives a token's creator fees, with the on-chain facts to verify it. --- # API reference Source: https://payday.direct/developers/api-reference Every endpoint, grouped as in the sidebar. Each page has its parameters, responses, examples in cURL, JavaScript and Python, and a console for read endpoints. The whole API is also [an OpenAPI 3.1 spec](https://payday.direct/api/v1/openapi.json). ## Coins
GET/coinsList coins GET/coins/{mint}Get a coin
## Registry
GET/registryFollow the registry GET/registry/{mint}Check one mint POST/coins/checkCheck mints in bulk
## Fee recipients
GET/fees/{mint}Get a fee recipient POST/fees/batchGet fee recipients in bulk
## Accounts and payouts
GET/accountsList accounts GET/accounts/{handle}Get an account GET/payoutsList payouts
## Cash Payback
GET/paybackGet the rules GET/payback/coins/{mint}Get a Cash Payback coin GET/payback/coins/{mint}/rounds/{n}Get a round GET/payback/wallets/{owner}Get a wallet's rewards
## Holder rewards
GET/rewardsGet holder rewards GET/rewards/assetsList basket assets
## Platform
GET/burnsList Payday token burns GET/statsGet platform totals
## Launch on Solana
POST/launchesCreate a launch GET/launches/{id}Get a launch POST/launches/{id}/submitSubmit a launch POST/launches/{id}/splitGet fresh fee split transactions POST/launches/{id}/split/confirmConfirm the fee split
## Launch on EVM
GET/evm/chainsList EVM chains GET/evm/configsList pairings POST/evm/quoteQuote a launch POST/evm/launchesCreate an EVM launch POST/evm/launches/{id}/submitSubmit an EVM launch GET/evm/launches/{id}Get an EVM launch
## Keys
GET/keysList your keys POST/keysCreate a key DELETE/keys/selfRevoke this key DELETE/keys/{id}Revoke a key by id GET/openapi.jsonGet the OpenAPI spec
--- # List coins Source: https://payday.direct/developers/api-reference/coins/list-coins `GET https://payday.direct/api/v1/coins` Payday coins on every chain, newest first by default. Filter by chain, status, account, pairing or basket, and sort by market cap, volume or holders. ## Parameters - `limit` (query, integer) - `cursor` (query, string): next_cursor from the previous page - `status` (query, "curve" | "graduated") - `handle` (query, string): X handle the coin pays - `pair` (query, "sol" | "stock") - `basket` (query, "any" | "payout" | "fund"): basket coins only: any (mixed included) or one type; each coin carries cash_payback.basket { type, icon, legs, payback, rules } - `chain` (query, "solana" | "elysium") - `since` (query, string): created after - `sort` (query, "new" | "market_cap" | "volume" | "holders") ## Responses - 200: OK - 401: Missing or invalid key - 429: Over the limit. Retry-After says when to try again. ```json { "data": [ { "mint": "3unDHbPUsLqQtoHgvuCsRSArnuhVjhsn11vRht5Xpump", "symbol": "Example", "name": "Example Coin", "image": "https://payday.direct/img/example.png", "created_at": "2026-11-14T18:02:11.000Z", "status": "curve", "curve_progress_bps": 6423, "quote": { "mint": "So11111111111111111111111111111111111111112", "symbol": "SOL" }, "market": { "market_cap_usd": "11282.45", "volume_24h_usd": "102734.54", "liquidity_usd": "3019.00", "holders": 164, "price_change_24h_pct": 244.5, "last_trade_at": "2026-11-15T19:35:36.000Z" }, "recipient": { "rail": "xmoney", "handle": "examplehandle" }, "mode": "account", "cash_payback": null, "dex": { "status": "filling", "reserved_usd": "199.55", "target_usd": "299.00", "sent_tx": null, "sent_at": null }, "chain": "solana", "chain_id": null, "links": { "page": "https://payday.direct/explore#coin/3unDHbPUsLqQtoHgvuCsRSArnuhVjhsn11vRht5Xpump", "pump": "https://pump.fun/coin/3unDHbPUsLqQtoHgvuCsRSArnuhVjhsn11vRht5Xpump", "website": null, "x": "https://x.com/examplehandle", "telegram": null } } ], "next_cursor": "MQ", "total": 412, "meta": { "updated_at": "2026-11-15T20:03:20.991Z", "api_version": "v1" } } ``` ## Example ```bash curl "https://payday.direct/api/v1/coins" \ -H "Authorization: Bearer pd_YOUR_KEY" ``` --- # Get a coin Source: https://payday.direct/developers/api-reference/coins/get-a-coin `GET https://payday.direct/api/v1/coins/{mint}` One coin by its Solana mint or EVM address, with the account it pays (`recipient_account`). ## Parameters - `mint` (path, string, required) ## Responses - 200: OK - 401: Missing or invalid key - 404: Not found - 429: Over the limit. Retry-After says when to try again. ```json { "data": { "mint": "3unDHbPUsLqQtoHgvuCsRSArnuhVjhsn11vRht5Xpump", "symbol": "Example", "name": "Example Coin", "image": "https://payday.direct/img/example.png", "created_at": "2026-11-14T18:02:11.000Z", "status": "curve", "curve_progress_bps": 6423, "quote": { "mint": "So11111111111111111111111111111111111111112", "symbol": "SOL" }, "market": { "market_cap_usd": "11282.45", "volume_24h_usd": "102734.54", "liquidity_usd": "3019.00", "holders": 164, "price_change_24h_pct": 244.5, "last_trade_at": "2026-11-15T19:35:36.000Z" }, "recipient": { "rail": "xmoney", "handle": "examplehandle" }, "mode": "account", "cash_payback": null, "dex": { "status": "filling", "reserved_usd": "199.55", "target_usd": "299.00", "sent_tx": null, "sent_at": null }, "chain": "solana", "chain_id": null, "links": { "page": "https://payday.direct/explore#coin/3unDHbPUsLqQtoHgvuCsRSArnuhVjhsn11vRht5Xpump", "pump": "https://pump.fun/coin/3unDHbPUsLqQtoHgvuCsRSArnuhVjhsn11vRht5Xpump", "website": null, "x": "https://x.com/examplehandle", "telegram": null }, "recipient_account": { "handle": "examplehandle", "rail": "xmoney", "coins": 3, "fees": { "earned_usd": "1520.40", "earned_sol": "6.48", "paid_usd": "1240.50", "on_the_way_usd": "120.00", "bonus_usd": "0.00" }, "payouts": 9, "next_batch": { "progress_usd": "64.10", "threshold_usd": "120.00" }, "last_paid_at": "2026-11-15T18:22:41.000Z" } }, "meta": { "updated_at": "2026-11-15T20:03:20.991Z", "api_version": "v1" } } ``` ## Example ```bash curl "https://payday.direct/api/v1/coins/MINT_ADDRESS" \ -H "Authorization: Bearer pd_YOUR_KEY" ``` --- # Follow the registry Source: https://payday.direct/developers/api-reference/registry/follow-the-registry `GET https://payday.direct/api/v1/registry` Every Payday coin on Solana in the order it was registered. Read it once from the start, then call again with the last `next_cursor` for only what is new. See [the guide](/developers/guides/registry). ## Parameters - `limit` (query, integer) - `cursor` (query, string): next_cursor from the previous call; coins registered after it - `since` (query, string): registered after ## Responses - 200: OK - 401: Missing or invalid key - 429: Over the limit. Retry-After says when to try again. ```json { "data": [ { "seq": 412, "mint": "3unDHbPUsLqQtoHgvuCsRSArnuhVjhsn11vRht5Xpump", "chain": "solana", "registered_at": "2026-11-15T04:12:09.000Z", "launched_at": "2026-11-15T04:12:07.000Z", "source": "launched", "mode": "cash_payback", "basket": true, "launch_tx": "5KYu1jGJ...MCdPLJ6", "creator": "J3rNJ3qzKFpRY5F9kGVs7VwspHxyrSd38643pTHU8MTA", "fee_route": "sharing_config", "fee_config": "CfgPda1111111111111111111111111111111111111", "recipient": null, "symbol": "Example", "name": "Example Coin", "links": { "page": "https://payday.direct/explore#coin/3unDHbPUsLqQtoHgvuCsRSArnuhVjhsn11vRht5Xpump", "pump": "https://pump.fun/coin/3unDHbPUsLqQtoHgvuCsRSArnuhVjhsn11vRht5Xpump" }, "details": "https://payday.direct/api/v1/coins/3unDHbPUsLqQtoHgvuCsRSArnuhVjhsn11vRht5Xpump" } ], "next_cursor": "NDEy", "has_more": false, "total": 412, "meta": { "updated_at": "2026-11-15T20:03:20.991Z", "api_version": "v1" } } ``` ## Example ```bash curl "https://payday.direct/api/v1/registry" \ -H "Authorization: Bearer pd_YOUR_KEY" ``` --- # Check one mint Source: https://payday.direct/developers/api-reference/registry/check-one-mint `GET https://payday.direct/api/v1/registry/{mint}` Answers 200 with the registry entry when the mint is a Payday coin, and 404 when it is not. ## Parameters - `mint` (path, string, required) ## Responses - 200: OK - 401: Missing or invalid key - 404: Not found - 429: Over the limit. Retry-After says when to try again. ```json { "data": { "seq": 412, "mint": "3unDHbPUsLqQtoHgvuCsRSArnuhVjhsn11vRht5Xpump", "chain": "solana", "registered_at": "2026-11-15T04:12:09.000Z", "launched_at": "2026-11-15T04:12:07.000Z", "source": "launched", "mode": "cash_payback", "basket": true, "launch_tx": "5KYu1jGJ...MCdPLJ6", "creator": "J3rNJ3qzKFpRY5F9kGVs7VwspHxyrSd38643pTHU8MTA", "fee_route": "sharing_config", "fee_config": "CfgPda1111111111111111111111111111111111111", "recipient": null, "symbol": "Example", "name": "Example Coin", "links": { "page": "https://payday.direct/explore#coin/3unDHbPUsLqQtoHgvuCsRSArnuhVjhsn11vRht5Xpump", "pump": "https://pump.fun/coin/3unDHbPUsLqQtoHgvuCsRSArnuhVjhsn11vRht5Xpump" }, "details": "https://payday.direct/api/v1/coins/3unDHbPUsLqQtoHgvuCsRSArnuhVjhsn11vRht5Xpump" }, "meta": { "updated_at": "2026-11-15T20:03:20.991Z", "api_version": "v1" } } ``` ## Example ```bash curl "https://payday.direct/api/v1/registry/MINT_ADDRESS" \ -H "Authorization: Bearer pd_YOUR_KEY" ``` --- # Check mints in bulk Source: https://payday.direct/developers/api-reference/registry/check-mints-in-bulk `POST https://payday.direct/api/v1/coins/check` Up to 500 mints in one call, which counts as one request. A coin launched in the last few seconds can still read as not Payday's; ask again shortly. ## Body - `mints` (string[], required): Mint addresses, as an array of strings ```json { "mints": [ "3unDHbPUsLqQtoHgvuCsRSArnuhVjhsn11vRht5Xpump", "DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263" ] } ``` ## Responses - 200: OK - 401: Missing or invalid key - 429: Over the limit. Retry-After says when to try again. ```json { "data": { "payday": [ { "seq": 412, "mint": "3unDHbPUsLqQtoHgvuCsRSArnuhVjhsn11vRht5Xpump", "chain": "solana", "registered_at": "2026-11-15T04:12:09.000Z", "launched_at": "2026-11-15T04:12:07.000Z", "source": "launched", "mode": "cash_payback", "basket": true, "launch_tx": "5KYu1jGJ...MCdPLJ6", "creator": "J3rNJ3qzKFpRY5F9kGVs7VwspHxyrSd38643pTHU8MTA", "fee_route": "sharing_config", "fee_config": "CfgPda1111111111111111111111111111111111111", "recipient": null, "symbol": "Example", "name": "Example Coin", "links": { "page": "https://payday.direct/explore#coin/3unDHbPUsLqQtoHgvuCsRSArnuhVjhsn11vRht5Xpump", "pump": "https://pump.fun/coin/3unDHbPUsLqQtoHgvuCsRSArnuhVjhsn11vRht5Xpump" }, "details": "https://payday.direct/api/v1/coins/3unDHbPUsLqQtoHgvuCsRSArnuhVjhsn11vRht5Xpump" } ], "not_payday": [ "DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263" ] }, "meta": { "updated_at": "2026-11-15T20:03:20.991Z", "api_version": "v1" } } ``` ## Example ```bash curl -X POST "https://payday.direct/api/v1/coins/check" \ -H "Authorization: Bearer pd_YOUR_KEY" \ -H "Content-Type: application/json" \ -d '{"mints":["3unDHbPUsLqQtoHgvuCsRSArnuhVjhsn11vRht5Xpump","DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263"]}' ``` --- # Get a fee recipient Source: https://payday.direct/developers/api-reference/fee-recipients/get-a-fee-recipient `GET https://payday.direct/api/v1/fees/{mint}` Who receives a token's creator fees, with the on-chain facts to check it: the coin's pump.fun fee sharing config and the Payday payout wallet that must be its only shareholder. `feedrop: false` for a token that is not a Payday coin. ## Parameters - `mint` (path, string, required): The token's mint address ## Responses - 200: OK - 401: Missing or invalid key - 429: Over the limit. Retry-After says when to try again. ```json { "mint": "3unDHbPUsLqQtoHgvuCsRSArnuhVjhsn11vRht5Xpump", "feedrop": true, "feeRecipient": { "type": "x_account", "handle": "examplehandle", "profile": "https://x.com/examplehandle", "paidOn": "xmoney", "since": "2026-11-12T10:04:00.000Z", "how": "launched for this account" }, "payouts": { "paidUsd": 1240.5, "openOrdersUsdc": 120, "lastPaidAt": "2026-11-15T18:22:41.000Z" }, "onchain": { "feeSharingConfig": "CfgPda1111111111111111111111111111111111111", "shareholders": [ { "address": "J3rNJ3qzKFpRY5F9kGVs7VwspHxyrSd38643pTHU8MTA", "shareBps": 10000 } ], "adminRevoked": true, "payoutWallet": "J3rNJ3qzKFpRY5F9kGVs7VwspHxyrSd38643pTHU8MTA", "verified": true }, "page": "https://payday.direct/x/examplehandle" } ``` ## Example ```bash curl "https://payday.direct/api/v1/fees/MINT_ADDRESS" \ -H "Authorization: Bearer pd_YOUR_KEY" ``` --- # Get fee recipients in bulk Source: https://payday.direct/developers/api-reference/fee-recipients/get-fee-recipients-in-bulk `POST https://payday.direct/api/v1/fees/batch` The same for up to 100 mints. Costs one request plus one for each Payday coin in it; mints that are not Payday coins cost nothing more. ## Body - `mints` (string[], required): Up to 100 mint addresses ```json { "mints": [ "3unDHbPUsLqQtoHgvuCsRSArnuhVjhsn11vRht5Xpump", "DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263" ] } ``` ## Responses - 200: OK - 401: Missing or invalid key - 429: Over the limit. Retry-After says when to try again. ```json { "results": [ { "mint": "3unDHbPUsLqQtoHgvuCsRSArnuhVjhsn11vRht5Xpump", "feedrop": true, "feeRecipient": { "type": "x_account", "handle": "examplehandle" } }, { "mint": "DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263", "feedrop": false, "feeRecipient": null } ] } ``` ## Example ```bash curl -X POST "https://payday.direct/api/v1/fees/batch" \ -H "Authorization: Bearer pd_YOUR_KEY" \ -H "Content-Type: application/json" \ -d '{"mints":["3unDHbPUsLqQtoHgvuCsRSArnuhVjhsn11vRht5Xpump","DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263"]}' ``` --- # List accounts Source: https://payday.direct/developers/api-reference/accounts-and-payouts/list-accounts `GET https://payday.direct/api/v1/accounts` Accounts that earn fees, by dollars earned, dollars paid or number of coins. ## Parameters - `limit` (query, integer) - `cursor` (query, string): next_cursor from the previous page - `sort` (query, "earned" | "paid" | "coins") ## Responses - 200: OK - 401: Missing or invalid key - 429: Over the limit. Retry-After says when to try again. ```json { "data": [ { "handle": "examplehandle", "rail": "xmoney", "coins": 3, "fees": { "earned_usd": "1520.40", "earned_sol": "6.48", "paid_usd": "1240.50", "on_the_way_usd": "120.00", "bonus_usd": "0.00" }, "payouts": 9, "next_batch": { "progress_usd": "64.10", "threshold_usd": "120.00" }, "last_paid_at": "2026-11-15T18:22:41.000Z" } ], "next_cursor": null, "total": 1, "meta": { "updated_at": "2026-11-15T20:03:20.991Z", "api_version": "v1" } } ``` ## Example ```bash curl "https://payday.direct/api/v1/accounts" \ -H "Authorization: Bearer pd_YOUR_KEY" ``` --- # Get an account Source: https://payday.direct/developers/api-reference/accounts-and-payouts/get-an-account `GET https://payday.direct/api/v1/accounts/{handle}` One X account: fees earned and paid, the next payout, its coins and its last 20 payouts. 404 for an account that opted out. ## Parameters - `handle` (path, string, required) ## Responses - 200: OK - 401: Missing or invalid key - 404: Not found - 429: Over the limit. Retry-After says when to try again. ```json { "data": { "handle": "examplehandle", "rail": "xmoney", "coins": [ { "mint": "3unDHbPUsLqQtoHgvuCsRSArnuhVjhsn11vRht5Xpump", "symbol": "Example", "name": "Example Coin", "image": "https://payday.direct/img/example.png", "created_at": "2026-11-14T18:02:11.000Z", "status": "curve", "curve_progress_bps": 6423, "quote": { "mint": "So11111111111111111111111111111111111111112", "symbol": "SOL" }, "market": { "market_cap_usd": "11282.45", "volume_24h_usd": "102734.54", "liquidity_usd": "3019.00", "holders": 164, "price_change_24h_pct": 244.5, "last_trade_at": "2026-11-15T19:35:36.000Z" }, "recipient": { "rail": "xmoney", "handle": "examplehandle" }, "mode": "account", "cash_payback": null, "dex": { "status": "filling", "reserved_usd": "199.55", "target_usd": "299.00", "sent_tx": null, "sent_at": null }, "chain": "solana", "chain_id": null, "links": { "page": "https://payday.direct/explore#coin/3unDHbPUsLqQtoHgvuCsRSArnuhVjhsn11vRht5Xpump", "pump": "https://pump.fun/coin/3unDHbPUsLqQtoHgvuCsRSArnuhVjhsn11vRht5Xpump", "website": null, "x": "https://x.com/examplehandle", "telegram": null } } ], "fees": { "earned_usd": "1520.40", "earned_sol": "6.48", "paid_usd": "1240.50", "on_the_way_usd": "120.00", "bonus_usd": "0.00" }, "payouts": 9, "next_batch": { "progress_usd": "64.10", "threshold_usd": "120.00" }, "last_paid_at": "2026-11-15T18:22:41.000Z", "recent_payouts": [ { "id": "412", "handle": "examplehandle", "rail": "xmoney", "status": "paid", "usdc": "120.00", "rate": 0.8, "paid_usd": "96.00", "peer": { "deposit_id": "1834", "url": "https://www.peer.xyz/deposit/1834", "listing_tx": "0x5f0c...e21a" }, "listed_at": "2026-11-15T17:40:02.000Z", "closed_at": "2026-11-15T18:22:41.000Z" } ] }, "meta": { "updated_at": "2026-11-15T20:03:20.991Z", "api_version": "v1" } } ``` ## Example ```bash curl "https://payday.direct/api/v1/accounts/examplehandle" \ -H "Authorization: Bearer pd_YOUR_KEY" ``` --- # List payouts Source: https://payday.direct/developers/api-reference/accounts-and-payouts/list-payouts `GET https://payday.direct/api/v1/payouts` Payout orders on Peer, newest first, each with its Peer link. Status moves through `listed`, `matched`, `partially_paid` and `paid` (or `withdrawn`). ## Parameters - `limit` (query, integer) - `cursor` (query, string): next_cursor from the previous page - `handle` (query, string) - `status` (query, string) ## Responses - 200: OK - 401: Missing or invalid key - 429: Over the limit. Retry-After says when to try again. ```json { "data": [ { "id": "412", "handle": "examplehandle", "rail": "xmoney", "status": "paid", "usdc": "120.00", "rate": 0.8, "paid_usd": "96.00", "peer": { "deposit_id": "1834", "url": "https://www.peer.xyz/deposit/1834", "listing_tx": "0x5f0c...e21a" }, "listed_at": "2026-11-15T17:40:02.000Z", "closed_at": "2026-11-15T18:22:41.000Z" } ], "next_cursor": "MQ", "total": 288, "meta": { "updated_at": "2026-11-15T20:03:20.991Z", "api_version": "v1" } } ``` ## Example ```bash curl "https://payday.direct/api/v1/payouts?status=paid" \ -H "Authorization: Bearer pd_YOUR_KEY" ``` --- # Get the rules Source: https://payday.direct/developers/api-reference/cash-payback/get-the-rules `GET https://payday.direct/api/v1/payback` Whether Cash Payback is on, its split, when rounds run, how holding is weighted, and what a terminal needs to read and launch baskets without hardcoding them. ## Responses - 200: OK - 401: Missing or invalid key - 429: Over the limit. Retry-After says when to try again. ```json { "data": { "enabled": true, "rules": { "mode": "cash_payback", "name": "Cash Payback", "split": { "burn_pct": 10, "treasury_pct": 5, "dex_pct": 70, "holders_pct": 15, "holders_after_dex_pct": 85 }, "dex_cost_usdc": 299, "return_days": 7, "rounds": { "round_usd": 50, "daily_usd": 5, "min_gap_min": 15 } }, "baskets": { "open": true, "types": [ "payout", "fund" ], "min_assets": 1, "max_assets": 15, "suggested_assets": [ 3, 5 ], "locked_at_launch": true } }, "meta": { "updated_at": "2026-11-15T20:03:20.991Z", "api_version": "v1" } } ``` ## Example ```bash curl "https://payday.direct/api/v1/payback" \ -H "Authorization: Bearer pd_YOUR_KEY" ``` --- # Get a Cash Payback coin Source: https://payday.direct/developers/api-reference/cash-payback/get-a-cash-payback-coin `GET https://payday.direct/api/v1/payback/coins/{mint}` One Cash Payback coin: its pot, the next round, the DexScreener reimbursement, recent rounds and rewards. A basket coin adds `basket`, `holdings`, `fund` and its last `dividends`. ## Parameters - `mint` (path, string, required) ## Responses - 200: OK - 401: Missing or invalid key - 404: Not found - 429: Over the limit. Retry-After says when to try again. ```json { "data": { "mint": "3unDHbPUsLqQtoHgvuCsRSArnuhVjhsn11vRht5Xpump", "symbol": "Example", "mode": "cash_payback", "pairing": { "mint": "So11111111111111111111111111111111111111112", "symbol": "SOL" }, "launched_at": "2026-11-15T16:11:38.514Z", "split": { "burn_pct": 10, "treasury_pct": 5, "dex_pct": 70, "holders_pct": 15 }, "dev_share": null, "pot": [ { "asset": { "mint": "So11111111111111111111111111111111111111112", "symbol": "SOL" }, "amount": "0.011402", "raw": "11402000", "usd": "2.67", "dev_amount": "0" } ], "pot_usd": "2.67", "next_round": { "pays_at_usd": "50.00", "progress_pct": 5.3, "daily_at_usd": "5.00", "last_round_at": "2026-11-15T19:25:14.126Z", "daily_round_after": "2026-11-16T19:25:14.126Z" }, "dex": { "status": "filling", "target_usdc": "299.00", "held_usdc": "199.55", "sent_early_usdc": "0.00", "paid_usdc": null, "sent_tx": null, "launch_wallet": "LaunchWa11et1111111111111111111111111111111", "returns_to_holders_at": "2026-11-22T16:11:38.520Z" }, "totals": { "paid_to_holders_usd": "57.49", "rounds": 3 }, "rounds": [ { "n": 3, "asset": { "mint": "So11111111111111111111111111111111111111112", "symbol": "SOL" }, "status": "done", "paid": "0.045607", "paid_usd": "10.62", "dev_paid": "0", "pot_usd": "11.85", "recipients": 89, "carried_over": 80, "holders": 169, "weighting": "time-held", "at": "2026-11-15T19:25:14.126Z", "done_at": "2026-11-15T19:25:24.686Z" } ], "category": "pairing", "label": "Holders", "rewards": { "distributed_usd": "57.49", "rounds": 3, "holders_paid": 168, "last_distributed_at": "2026-11-15T19:25:14.126Z", "by_asset": [ { "asset": { "mint": "So11111111111111111111111111111111111111112", "symbol": "SOL" }, "amount": "0.247415", "usd": "57.49", "rounds": 3, "last_at": "2026-11-15T19:25:14.126Z" } ] } }, "meta": { "updated_at": "2026-11-15T20:03:20.991Z", "api_version": "v1" } } ``` ## Example ```bash curl "https://payday.direct/api/v1/payback/coins/MINT_ADDRESS" \ -H "Authorization: Bearer pd_YOUR_KEY" ``` --- # Get a round Source: https://payday.direct/developers/api-reference/cash-payback/get-a-round `GET https://payday.direct/api/v1/payback/coins/{mint}/rounds/{n}` One round: every wallet paid, its amount, the delivery cost taken from its share, days held, its multiplier and the transaction. ## Parameters - `mint` (path, string, required) - `n` (path, integer, required) - `limit` (query, integer) - `cursor` (query, string): next_cursor from the previous page ## Responses - 200: OK - 401: Missing or invalid key - 429: Over the limit. Retry-After says when to try again. ```json { "data": [ { "wallet": "Ho1der111111111111111111111111111111111111", "role": "holder", "amount": "0.000912", "raw": "912000", "delivery_cost": "0.000002", "new_account": false, "held_days": 0.4, "boost": 1.12, "status": "sent", "tx": "3fQk...9aZ" } ], "next_cursor": "MQ", "total": 89, "round": { "mint": "3unDHbPUsLqQtoHgvuCsRSArnuhVjhsn11vRht5Xpump", "n": 3, "asset": { "mint": "So11111111111111111111111111111111111111112", "symbol": "SOL" }, "status": "done", "weighting": "time-held", "paid": "0.045607", "holders": 169, "carried_over": 80, "at": "2026-11-15T19:25:14.126Z", "done_at": "2026-11-15T19:25:24.686Z" } } ``` ## Example ```bash curl "https://payday.direct/api/v1/payback/coins/MINT_ADDRESS/rounds/1" \ -H "Authorization: Bearer pd_YOUR_KEY" ``` --- # Get a wallet's rewards Source: https://payday.direct/developers/api-reference/cash-payback/get-a-wallets-rewards `GET https://payday.direct/api/v1/payback/wallets/{owner}` A wallet's share across every Cash Payback coin: what it was paid, an estimate of what it has building for the next round, and everything it earned per asset. ## Parameters - `owner` (path, string, required) ## Responses - 200: OK - 401: Missing or invalid key - 429: Over the limit. Retry-After says when to try again. ```json { "data": { "wallet": "Ho1der111111111111111111111111111111111111", "coins": [ { "mint": "3unDHbPUsLqQtoHgvuCsRSArnuhVjhsn11vRht5Xpump", "held_days": 1.6, "boost": 1.4, "paid": [ { "asset": { "mint": "So11111111111111111111111111111111111111112" }, "amount": "0.0031", "usd": "0.72", "rounds": 3, "last_at": "2026-11-15T19:25:14.126Z" } ], "waiting_estimate": [ { "asset": { "mint": "So11111111111111111111111111111111111111112" }, "amount": "0.0004", "usd": "0.09" } ] } ], "earned_by_asset": [ { "asset": { "mint": "So11111111111111111111111111111111111111112" }, "amount": "0.0031", "usd_when_paid": "0.72", "rounds": 3, "coins": 1 } ] } } ``` ## Example ```bash curl "https://payday.direct/api/v1/payback/wallets/WALLET_ADDRESS" \ -H "Authorization: Bearer pd_YOUR_KEY" ``` --- # Get holder rewards Source: https://payday.direct/developers/api-reference/holder-rewards/get-holder-rewards `GET https://payday.direct/api/v1/rewards` What Cash Payback holders were paid across every coin: totals, dollars per asset, the top 25 coins and recent payouts newest first. A basket dividend is one row with every asset it paid. ## Parameters - `mint` (query, string): one coin only (top is then empty) - `limit` (query, integer): recent rounds per page - `cursor` (query, string): next_cursor from the previous page ## Responses - 200: OK - 401: Missing or invalid key - 429: Over the limit. Retry-After says when to try again. ```json { "data": { "totals": { "distributed_usd": "2418.68", "last_24h_usd": "512.30", "last_7d_usd": "2418.68", "rounds": 140, "dividends": 22, "transactions": 980, "paying_coins": 12, "holder_payouts": 4120, "wallets_paid": 1630, "assets_paid": 9, "last_distributed_at": "2026-11-15T19:25:14.126Z" }, "by_asset": [ { "asset": { "mint": "So11111111111111111111111111111111111111112", "symbol": "SOL" }, "amount": "9.81", "usd": "1412.20", "rounds": 88, "coins": 7 } ], "top": [ { "mint": "3unDHbPUsLqQtoHgvuCsRSArnuhVjhsn11vRht5Xpump", "symbol": "Example", "category": "pairing", "reward_symbols": [ "SOL" ], "distributed_usd": "57.49", "rounds": 3, "wallets_paid": 168, "last_at": "2026-11-15T19:25:14.126Z" } ], "recent": [ { "id": "r812", "mint": "3unDHbPUsLqQtoHgvuCsRSArnuhVjhsn11vRht5Xpump", "symbol": "Example", "type": "round", "round": 3, "dividend": null, "asset": { "mint": "So11111111111111111111111111111111111111112", "symbol": "SOL" }, "amount": "0.045607", "usd": "10.62", "wallets": 89, "transactions": 7, "tx": "3fQk...9aZ", "status": "done", "assets": [], "at": "2026-11-15T19:25:14.126Z" } ] }, "next_cursor": "ODEy" } ``` ## Example ```bash curl "https://payday.direct/api/v1/rewards" \ -H "Authorization: Bearer pd_YOUR_KEY" ``` --- # List basket assets Source: https://payday.direct/developers/api-reference/holder-rewards/list-basket-assets `GET https://payday.direct/api/v1/rewards/assets` Every asset a basket may hold: SOL, USDC and the assets pump.fun pairs with. `fund` says whether a Fund basket may hold it; `?for=fund` lists only those. ## Parameters - `limit` (query, integer) - `cursor` (query, string): next_cursor from the previous page - `q` (query, string): filter by ticker, name or the start of the mint - `for` (query, "payout" | "fund"): only what that basket type may hold: payout is the full list (also the payback asset list); fund is stocks, pre-IPO tokens, the majors and the named memes, never USDC ## Responses - 200: OK - 401: Missing or invalid key - 429: Over the limit. Retry-After says when to try again. ```json { "data": [ { "mint": "So11111111111111111111111111111111111111112", "symbol": "SOL", "name": "Solana", "kind": "major", "image": "https://payday.direct/sol-mark.svg", "fund": true }, { "mint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", "symbol": "USDC", "name": "USD Coin", "kind": "stable", "image": "https://payday.direct/usdc-mark.svg", "fund": false } ], "next_cursor": "Mg", "total": 241, "for": null, "baskets": { "open": true, "types": [ "payout", "fund" ], "max_assets": 15 } } ``` ## Example ```bash curl "https://payday.direct/api/v1/rewards/assets" \ -H "Authorization: Bearer pd_YOUR_KEY" ``` --- # List Payday token burns Source: https://payday.direct/developers/api-reference/platform/list-payday-token-burns `GET https://payday.direct/api/v1/burns` Every buy and burn of the Payday token, newest first, with the buy and burn transactions. ## Parameters - `limit` (query, integer) - `cursor` (query, string): next_cursor from the previous page ## Responses - 200: OK - 401: Missing or invalid key - 429: Over the limit. Retry-After says when to try again. ```json { "data": [ { "id": "310", "sol": "0.0512", "tokens": "81204.33", "mint": "uHMWNFjUNxbPy1q43WrdbzygmJwdeh6AiQm1NKdxPAY", "buy_tx": "4aB...k2", "burn_tx": "2Zp...q9", "at": "2026-11-15T19:30:02.000Z" } ], "next_cursor": "MQ", "total": 310, "meta": { "updated_at": "2026-11-15T20:03:20.991Z", "api_version": "v1" } } ``` ## Example ```bash curl "https://payday.direct/api/v1/burns" \ -H "Authorization: Bearer pd_YOUR_KEY" ``` --- # Get platform totals Source: https://payday.direct/developers/api-reference/platform/get-platform-totals `GET https://payday.direct/api/v1/stats` Coins, volume, fees, payouts, burns and DEX reimbursements across Payday. ## Responses - 200: OK - 401: Missing or invalid key - 429: Over the limit. Retry-After says when to try again. ```json { "data": { "coins": 412, "graduated": 38, "volume_24h_usd": "1840211.07", "fees_generated_usd": "48210.33", "fees_generated_sol": "205.61", "paid_out_usd": "21400.00", "payouts": 288, "accounts_paid": 97, "waiting_usd": "1820.40", "burned": { "tokens": "18422011.5", "sol": "41.2", "burns": 310, "last_at": "2026-11-15T19:30:02.000Z" }, "dex": { "filling": 9, "sent": 31, "reserved_usd": "1204.55" }, "sol_usd": 234.42 }, "meta": { "updated_at": "2026-11-15T20:03:20.991Z", "api_version": "v1" } } ``` ## Example ```bash curl "https://payday.direct/api/v1/stats" \ -H "Authorization: Bearer pd_YOUR_KEY" ``` --- # Create a launch Source: https://payday.direct/developers/api-reference/launch-on-solana/create-a-launch `POST https://payday.direct/api/v1/launches` Builds the launch transactions for the wallet to sign. Nothing is on chain yet. Needs a key made with launching switched on. See [the guide](/developers/guides/launch-solana). ## Body - `mode` ("account" | "cash_payback"): account: fees to fees_to. cash_payback: fees to the coin's holders by time held (GET /payback for the rules); any pairing pump.fun offers. - `wallet` (string, required): Solana address that signs and pays for the launch - `name` (string, required): The coin's name - `symbol` (string, required): ticker, case kept - `description` (string) - `image` (string, required): PNG, JPEG, GIF or WebP as base64 or a data URL - `banner` (string): optional, same formats - `dev_buy_sol` (number, required): SOL the wallet spends on the first buy - `fees_to` (string): X handle that gets the fees; or a $cashtag, venmo:username, or zelle: (a Zelle destination is permanent and never shown in public) - `hold_in_vault` (boolean): X handles only: hold the fees for the account to claim instead of paying them through Peer - `quote_mint` (string): optional: pair with a stock or another asset pump.fun supports instead of SOL - `reward_basket` (object[]): cash_payback only, where baskets are open: 1 to 15 assets from GET /rewards/assets, no repeats. Plain mints for an even split, or { mint, weight_bps } for every asset with weights adding up to 10000, each at least 100. The split stays the same; basket_type says what the holders' part does with the basket. Dividends follow the Cash Payback round clock and are shared by the hold ladder. Locked at launch. Only on a SOL pair (leave out quote_mint). Each asset is checked first (a transfer fee of at most 5%, no transfer hook, not frozen, a swap route from the pairing); a refused basket answers 400 with error.rejected, one reason per asset. An asset with its own transfer fee keeps it: holders get what is sent minus that fee, shown as transfer_fee_bps. Leave it out and holders are paid in the pairing. - `basket` (object): cash_payback only, where baskets are open; the newer form of reward_basket and basket_type (send one form, not both). Locked at launch. The site launcher runs the same validator. Refusals answer 400 with a stable error.code: basket_size, basket_weights, basket_type, basket_asset_not_allowed (error.mint and error.rejected, one reason per asset), basket_payback_not_allowed (error.mint). - `basket.type` ("payout" | "fund"): payout: the whole holders' part buys the legs by weight and all of it is sent every round. fund: the legs are bought and kept; holders are paid only value above cost. - `basket.legs` (object[], required) - `basket.payback` (string | null): fund only, optional: one asset from the full list (GET /rewards/assets?for=payout). pair_pct of the holders' part (GET /payback baskets.payback.pair_pct, saved on the coin at launch) buys it and is paid every round; the rest buys the fund. Refused on a payout basket. - `basket_type` ("payout" | "fund"): with reward_basket, locked at launch. payout: the whole holders' part buys the basket by weight and all of it is sent each dividend; nothing is held. fund: the whole holders' part buys the basket and the coin keeps it (never sold); holders are paid only each asset's value above what it cost, so if the assets do not rise the fund pays nothing. A fund basket takes only stocks, pre-stocks, the majors (SOL, WBTC, ETH, HYPE, XMR) and the big memes (PUMP, Fartcoin, Bonk, $WIF, TRUMP, PENGU); no USDC. - `pay_with_sol` (boolean): with quote_mint: the wallet pays in SOL and a swap transaction is added - `links` (object): Where to see the coin - `links.x` (string) - `links.telegram` (string) - `links.website` (string) ```json { "wallet": "LaunchWa11et1111111111111111111111111111111", "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" } ``` ## Responses - 201: Transactions to sign - 400: Error - 401: Missing or invalid key - 403: Error - 429: Over the limit. Retry-After says when to try again. ```json { "data": { "id": "L_9f2c1e", "status": "awaiting_signature", "mint": "NewCoinMint11111111111111111111111111111pump", "wallet": "LaunchWa11et1111111111111111111111111111111", "fees_to": { "rail": "xmoney", "handle": "examplehandle" }, "transactions": [ { "name": "launch", "transaction": "AQAB...BASE64" }, { "name": "buy", "transaction": "AQAB...BASE64" }, { "name": "split_1", "transaction": "AQAB...BASE64" } ], "sign_within_seconds": 60, "expires_in_seconds": 600 } } ``` ## Example ```bash curl -X POST "https://payday.direct/api/v1/launches" \ -H "Authorization: Bearer pd_YOUR_KEY" \ -H "Content-Type: application/json" \ -d '{"wallet":"LaunchWa11et1111111111111111111111111111111","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"}' ``` --- # Get a launch Source: https://payday.direct/developers/api-reference/launch-on-solana/get-a-launch `GET https://payday.direct/api/v1/launches/{id}` One launch made with your account's keys: `awaiting_signature`, `submitting`, `launched` or `expired`. ## Parameters - `id` (path, string, required): id from POST /launches ## Responses - 200: OK - 401: Missing or invalid key - 404: Not found - 429: Over the limit. Retry-After says when to try again. ```json { "data": { "id": "L_9f2c1e", "status": "launched", "mint": "NewCoinMint11111111111111111111111111111pump", "wallet": "LaunchWa11et1111111111111111111111111111111", "fees_to": { "rail": "xmoney", "handle": "examplehandle" }, "sign_within_seconds": 60, "expires_in_seconds": 600, "signature": "5KYu1jGJ...MCdPLJ6" } } ``` ## Example ```bash curl "https://payday.direct/api/v1/launches/LAUNCH_ID" \ -H "Authorization: Bearer pd_YOUR_KEY" ``` --- # Submit a launch Source: https://payday.direct/developers/api-reference/launch-on-solana/submit-a-launch `POST https://payday.direct/api/v1/launches/{id}/submit` Takes the signed transactions, checks they are the ones Payday built, and sends them. Send each one under its name, and the `split_` ones as the `split` list in order. ## Parameters - `id` (path, string, required): id from POST /launches ## Body - `signed` (object, required) - `signed.launch` (string, required): base64, signed by the wallet - `signed.swap` (string) - `signed.fund` (string) - `signed.buy` (string) - `signed.split` (string[]): split_1, split_2 ... in order ```json { "signed": { "launch": "BASE64", "buy": "BASE64", "split": [ "BASE64" ] } } ``` ## Responses - 200: OK - 400: Error - 401: Missing or invalid key - 409: Error - 410: Error - 429: Over the limit. Retry-After says when to try again. ```json { "data": { "id": "L_9f2c1e", "status": "launched", "mint": "NewCoinMint11111111111111111111111111111pump", "signature": "5KYu1jGJ...MCdPLJ6", "fee_split": { "status": "locked" }, "links": { "page": "https://payday.direct/explore#coin/NewCoinMint11111111111111111111111111111pump", "pump": "https://pump.fun/coin/NewCoinMint11111111111111111111111111111pump" } } } ``` ## Example ```bash 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"]}}' ``` --- # Get fresh fee split transactions Source: https://payday.direct/developers/api-reference/launch-on-solana/get-fresh-fee-split-transactions `POST https://payday.direct/api/v1/launches/{id}/split` For a launch whose fee split did not lock with it. The wallet signs and sends these itself, then reports the signatures. ## Parameters - `id` (path, string, required): id from POST /launches ## Responses - 200: OK - 401: Missing or invalid key - 429: Over the limit. Retry-After says when to try again. ## Example ```bash curl -X POST "https://payday.direct/api/v1/launches/LAUNCH_ID/split" \ -H "Authorization: Bearer pd_YOUR_KEY" ``` --- # Confirm the fee split Source: https://payday.direct/developers/api-reference/launch-on-solana/confirm-the-fee-split `POST https://payday.direct/api/v1/launches/{id}/split/confirm` Body `{"signatures": [...]}`. Confirms the fee split from the chain; the coin is listed once it is locked. ## Parameters - `id` (path, string, required): id from POST /launches ## Body - `signatures` (string[]) ```json { "signatures": [ "5Xy...q1" ] } ``` ## Responses - 200: OK - 401: Missing or invalid key - 409: Error - 429: Over the limit. Retry-After says when to try again. ## Example ```bash curl -X POST "https://payday.direct/api/v1/launches/LAUNCH_ID/split/confirm" \ -H "Authorization: Bearer pd_YOUR_KEY" \ -H "Content-Type: application/json" \ -d '{"signatures":["5Xy...q1"]}' ``` --- # List EVM chains Source: https://payday.direct/developers/api-reference/launch-on-evm/list-evm-chains `GET https://payday.direct/api/v1/evm/chains` The EVM chains Payday launches on, with their native coin and explorer. ## Responses - 200: OK - 401: Missing or invalid key - 429: Over the limit. Retry-After says when to try again. ## Example ```bash curl "https://payday.direct/api/v1/evm/chains" \ -H "Authorization: Bearer pd_YOUR_KEY" ``` --- # List pairings Source: https://payday.direct/developers/api-reference/launch-on-evm/list-pairings `GET https://payday.direct/api/v1/evm/configs` The pairings you can launch on: `id`, `label`, the paired coin, the fee and any starting fee. `dev_buy` says whether a dev buy is possible. ## Parameters - `chain` (query, integer) ## Responses - 200: OK - 401: Missing or invalid key - 429: Over the limit. Retry-After says when to try again. ## Example ```bash curl "https://payday.direct/api/v1/evm/configs?chain=99901" \ -H "Authorization: Bearer pd_YOUR_KEY" ``` --- # Quote a launch Source: https://payday.direct/developers/api-reference/launch-on-evm/quote-a-launch `POST https://payday.direct/api/v1/evm/quote` What a launch costs in the native coin (`gas`, `total`) and what the dev buy brings (`buy.coins`, `buy.percent`). ## Body - `chain` (integer): `solana` or the EVM chain's key - `config_id` (integer, required) - `dev_buy` (string) - `wallet` (string) ```json { "config_id": 0, "dev_buy": "0.5" } ``` ## Responses - 200: OK - 401: Missing or invalid key - 429: Over the limit. Retry-After says when to try again. ## Example ```bash curl -X POST "https://payday.direct/api/v1/evm/quote" \ -H "Authorization: Bearer pd_YOUR_KEY" \ -H "Content-Type: application/json" \ -d '{"config_id":0,"dev_buy":"0.5"}' ``` --- # Create an EVM launch Source: https://payday.direct/developers/api-reference/launch-on-evm/create-an-evm-launch `POST https://payday.direct/api/v1/evm/launches` Returns the one transaction for the wallet to send: `to`, `data`, `value` (in wei) and `gas`. Send it exactly as it is. ## Body - `chain` (integer): `solana` or the EVM chain's key - `wallet` (string, required) - `name` (string, required): The coin's name - `symbol` (string, required): The ticker, in the case it was launched with - `description` (string) - `image` (string, required): data URL - `fees_to` (string, required) - `config_id` (integer, required) - `dev_buy` (string) - `links` (object): Where to see the coin - `links.x` (string) - `links.website` (string) ```json { "chain": 99901, "wallet": "0xTHE_WALLET_THAT_SENDS_THE_LAUNCH", "name": "Blockhead", "symbol": "HEAD", "image": "data:image/png;base64,iVBORw0KGgo...", "fees_to": "someaccount", "config_id": 0, "dev_buy": "0.5" } ``` ## Responses - 201: Created - 401: Missing or invalid key - 429: Over the limit. Retry-After says when to try again. ## Example ```bash 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","image":"data:image/png;base64,iVBORw0KGgo...","fees_to":"someaccount","config_id":0,"dev_buy":"0.5"}' ``` --- # Submit an EVM launch Source: https://payday.direct/developers/api-reference/launch-on-evm/submit-an-evm-launch `POST https://payday.direct/api/v1/evm/launches/{id}/submit` Body `{"hash": "0x..."}`: the hash the wallet got when it sent the launch. ## Parameters - `id` (path, string, required): id from POST /launches ## Body - `hash` (string, required) ```json { "hash": "0x5f0c...e21a" } ``` ## Responses - 200: OK - 401: Missing or invalid key - 429: Over the limit. Retry-After says when to try again. ## Example ```bash curl -X POST "https://payday.direct/api/v1/evm/launches/LAUNCH_ID/submit" \ -H "Authorization: Bearer pd_YOUR_KEY" \ -H "Content-Type: application/json" \ -d '{"hash":"0x5f0c...e21a"}' ``` --- # Get an EVM launch Source: https://payday.direct/developers/api-reference/launch-on-evm/get-an-evm-launch `GET https://payday.direct/api/v1/evm/launches/{id}` `awaiting_signature`, `submitted`, `launched` (with the coin's address and links), `failed` or `expired`. ## Parameters - `id` (path, string, required): id from POST /launches ## Responses - 200: OK - 401: Missing or invalid key - 429: Over the limit. Retry-After says when to try again. ## Example ```bash curl "https://payday.direct/api/v1/evm/launches/LAUNCH_ID" \ -H "Authorization: Bearer pd_YOUR_KEY" ``` --- # List your keys Source: https://payday.direct/developers/api-reference/keys/list-your-keys `GET https://payday.direct/api/v1/keys` The keys on your signed-in account, with usage. Uses the payday.direct sign-in, not an API key; this is what the [API keys](/developers/api-keys) page calls. ## Responses - 200: OK ```json { "can_create": true, "reason": null, "signed_in": true, "data": [ { "id": "pd_aB3dE9xQ", "label": "My terminal", "status": "active", "limit_per_minute": 600, "calls": 18240, "can_launch": false, "created_at": "2026-11-12T10:00:00.000Z", "last_used_at": "2026-11-15T20:01:00.000Z" } ] } ``` ## Example ```bash curl "https://payday.direct/api/v1/keys" ``` --- # Create a key Source: https://payday.direct/developers/api-reference/keys/create-a-key `POST https://payday.direct/api/v1/keys` Makes a key and shows it once. Without a sign-in the request must be JSON and the key reads data only. `launch: true` needs a signed-in account. ## Body - `label` (string): A name for the key - `purpose` (string): What it is for (optional) - `launch` (boolean): Allow this key to launch coins. Needs a signed-in account. ```json { "label": "My terminal", "purpose": "Show fee recipients in my terminal", "launch": false } ``` ## Responses - 201: Created - 403: A launch key without a sign-in - 415: Not sent as JSON - 429: Too many new keys ```json { "id": "pd_aB3dE9xQ", "key": "pd_aB3dE9xQ...SHOWN_ONCE", "label": "My terminal", "status": "active", "limit_per_minute": 600, "can_launch": false, "signed_in": false, "note": "Copy this key now. It is shown only once." } ``` ## Example ```bash curl -X POST "https://payday.direct/api/v1/keys" \ -H "Content-Type: application/json" \ -d '{"label":"My terminal","purpose":"Show fee recipients in my terminal","launch":false}' ``` --- # Revoke this key Source: https://payday.direct/developers/api-reference/keys/revoke-this-key `DELETE https://payday.direct/api/v1/keys/self` Switches off the key sent in the header. The only way to revoke a key made without a sign-in, and the quickest for any key that leaked. ## Responses - 200: Revoked - 401: No key, or not a valid key ```json { "revoked": "pd_aB3dE9xQ" } ``` ## Example ```bash curl -X DELETE "https://payday.direct/api/v1/keys/self" \ -H "Authorization: Bearer pd_YOUR_KEY" ``` --- # Revoke a key by id Source: https://payday.direct/developers/api-reference/keys/revoke-a-key-by-id `DELETE https://payday.direct/api/v1/keys/{id}` Revokes one of your signed-in account's keys by its id (the first 11 characters). ## Parameters - `id` (path, string, required): The key's id: its first 11 characters ## Responses - 200: Revoked - 401: Not signed in - 404: No such key on your account ```json { "revoked": "pd_aB3dE9xQ" } ``` ## Example ```bash curl -X DELETE "https://payday.direct/api/v1/keys/LAUNCH_ID" ``` --- # Get the OpenAPI spec Source: https://payday.direct/developers/api-reference/keys/get-the-openapi-spec `GET https://payday.direct/api/v1/openapi.json` This API as OpenAPI 3.1. No key needed. ## Responses - 200: The spec ## Example ```bash curl "https://payday.direct/api/v1/openapi.json" ```