# 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.
## 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
## Registry
## Fee recipients
## Accounts and payouts
## Cash Payback
## Holder rewards
## Platform
## Launch on Solana
## Launch on EVM
## Keys
---
# 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"
```