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.

ProductionSandbox
APIhttps://api.payday.shhttps://api.sandbox.payday.sh
Keyspayday_live_…payday_test_…
ChainMonad mainnet (chain id 143)Monad testnet (chain id 10143)
TokenCircle-issued native USDCCircle test USDC
FundsRealTest tokens from a faucet
Indexing and finalityRealReal: 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.

TypeScript
const payday = new PaydayClient({
  apiKey: process.env.PAYDAY_TEST_API_KEY!,
  baseUrl: "https://api.sandbox.payday.sh",
});
Shell
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 /health is unauthenticated readiness: ok when 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.