Using Payday
Environments
Two isolated services with the same API. Production settles real USDC on Monad; the sandbox settles Circle's test USDC on Monad testnet, with its own accounts, keys, and database.
| Production | Sandbox | |
|---|---|---|
| API | https://api.payday.sh | https://api.sandbox.payday.sh |
| Keys | payday_live_… | payday_test_… |
| Chain | Monad mainnet (chain id 143) | Monad testnet (chain id 10143) |
| Token | Circle-issued native USDC | Circle test USDC |
| Funds | Real | Test tokens from a faucet |
| Indexing and finality | Real | Real: the same indexer, the same finality gate |
| OpenAPI | /openapi.json | /openapi.json |
Every deposit request reports the chain and token it accepts. Read them from the response rather than hard-coding them, and show them to the payer: a matching symbol is not enough, and USDC on another network, bridged USDC, and look-alike tokens do not count.
Using the sandbox#
Point the client at the sandbox origin with a test key. Everything else is the same: the routes, the fields, the statuses, the webhooks, the proof.
const payday = new PaydayClient({
apiKey: process.env.PAYDAY_TEST_API_KEY!,
baseUrl: "https://api.sandbox.payday.sh",
});curl -fsS "https://api.sandbox.payday.sh/v1/deposit-requests/dr_…" \
-H "Authorization: Bearer payday_test_..."There is deliberately no "mark as paid" button. To settle a sandbox request, open its link as the payer, sign the wallet step, and send test USDC from that wallet. What you then watch is the real pipeline: finalized transfer, credit, settlement, proof.
Status and health#
GET /healthis unauthenticated readiness:okwhen the API can reach its database.GET /v1/status, with a key, reports the chain's finalized position, the indexer's cursor and lag, and the settlement queue. See Account and status.- Every response carries
X-Request-Id. Quote it to support.