Read every Payday coin, the X accounts they pay, payouts on Peer and Payday token burns from your app, bot or terminal.
curl -H "Authorization: Bearer pd_YOUR_KEY" "https://payday.direct/api/v1/coins?status=graduated&limit=5"
curl -H "X-API-Key: pd_YOUR_KEY" https://payday.direct/api/v1/accounts/elonmusk
Base address https://payday.direct/api/v1. Everything is read only and answers JSON.
Authorization or X-API-Key header. A key in a URL is refused, because URLs end up in logs and browser history.| Endpoint | What it returns |
|---|---|
| GET/coins | Payday coins. status curve or graduated, handle, pair sol or stock, since (ISO date), sort new, market_cap, volume or holders. |
| GET/coins/{mint} | One coin, with the account it pays. |
| GET/accounts | Accounts that earn fees. sort earned, paid or coins. |
| GET/accounts/{handle} | One X account: fees earned and paid, next batch, its coins and recent payouts. |
| GET/payouts | Payout orders on Peer, newest first, with the Peer link. handle, status. |
| GET/burns | Every Payday token buy and burn, with transactions. |
| GET/stats | Platform totals: coins, volume, fees, paid out, burned, DEX reserves. |
| GET/fees/{mint} | Who receives a token's creator fees, with the on-chain facts to check it yourself: the pump.fun fee-sharing config and the Payday payout wallet that must be its only shareholder. |
| POST/fees/batch | The same for up to 100 mints: body {"mints": [...]}. Each mint counts as one request. |
Lists take limit (up to 200, default 50). When there is more, the response has next_cursor: pass it back as cursor.
Dollar amounts are strings with two decimals ("12.34") and SOL amounts are strings, so nothing loses precision. Times are ISO 8601 in UTC. Tickers keep their case.
X handles are public. Coins paying Cash App or Venmo show the rail only, never the username. Accounts that opted out of Payday are left out entirely.
The shape of one coin from /api/v1/coins?limit=1 (example values):
{
"data": [{
"mint": "uHMWNFjUNxbPy1q43WrdbzygmJwdeh6AiQm1NKdxPAY",
"symbol": "PAYDAY",
"name": "Payday",
"created_at": "2026-11-09T18:02:11.000Z",
"status": "graduated",
"curve_progress_bps": 10000,
"quote": { "mint": "So11111111111111111111111111111111111111112", "symbol": "SOL" },
"market": { "market_cap_usd": "258000.00", "volume_24h_usd": "117255.90", "liquidity_usd": "41200.00",
"holders": 1830, "price_change_24h_pct": 541.8, "last_trade_at": "2026-11-11T13:02:40.000Z" },
"recipient": { "rail": "xmoney", "handle": "examplehandle" },
"dex": null,
"links": { "page": "https://payday.direct/explore#coin/uHMW…", "pump": "https://pump.fun/coin/uHMW…" }
}],
"next_cursor": "MQ",
"total": 69,
"meta": { "updated_at": "2026-11-11T13:03:20.991Z", "api_version": "v1" }
}
{ "error": { "code": "rate_limited", "message": "Limit is 600 requests a minute for this key." } }
| Status | Code | Meaning |
|---|---|---|
| 400 | bad_status, bad_sort, bad_cursor, bad_since | A parameter is not one the endpoint takes. The message says what is allowed. |
| 400 | key_in_url | A key was put in the URL. Send it in a header, and revoke it if the link was shared. |
| 401 | missing_key, invalid_key | No key, or the key is wrong or revoked. |
| 404 | not_found | No such coin, account or endpoint. |
| 429 | rate_limited, daily_quota, too_many_bad_keys | Over a limit. Wait the seconds in Retry-After. |
| 5xx | internal, unavailable | Our side. Retry with a short backoff. |
Every response carries X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset, plus an ETag: send it back as If-None-Match and an unchanged answer comes back as an empty 304.
Keys are free. A key is shown once when you create it.
v1 only gains fields; nothing in it is renamed or removed. Anything that would break a client ships as v2, announced 90 days ahead. Questions or a higher limit: [email protected].