Documentation
Everything you need to accept non-custodial crypto payments on your own site.
Quick start
- 1
Create an account
Sign up at zynostpay.umarae.com and enable merchant mode with your own EVM extended public key (xpub) — a public key from any wallet you control, never a private key or seed phrase.
- 2
Copy your API key
It's shown once when you enable merchant mode, and again any time you regenerate it from Dashboard → API & webhooks.
- 3
Create your first checkout
One request, shown below. The response includes a unique receive address derived from your xpub — money sent there goes straight to your own wallet.
curl -X POST https://zynost-gateway-production.up.railway.app/api/v1/checkout \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"amount_usd": 9.99, "order_reference": "order_123"}'Authentication
Every public API call is authenticated with a Bearer API key — the same one from your dashboard. There is no OAuth flow, no client secret, no separate sandbox key.
Authorization: Bearer zg_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxRegenerating your key immediately invalidates the old one. Keep it server-side only — never ship it in client-side JS.
Creating checkouts
POST /v1/checkout creates a new order and mints a fresh receive address just for it — never reused.
{
"amount_usd": 9.99,
"order_reference": "order_123",
"description": "Pro plan (optional)"
}{
"id": "169bd00f-...",
"order_reference": "order_123",
"amount_usd": 9.99,
"evm_address": "0x9af24e02a1e5e75d2838668151dce74a4c2744ab",
"solana_address": null,
"status": "pending",
"paid_chain": null,
"paid_asset": null,
"paid_amount": null,
"expires_at": "2026-07-29T02:38:30Z",
"checkout_url": "https://zynost-gateway-production.up.railway.app/checkout/169bd00f-..."
}Redirect your customer to checkout_url for a hosted payment page, or build your own UI and poll status yourself:
GET /v1/checkout/{id}A checkout accepts anything at or above ~99.9% of the invoiced amount (to tolerate rounding), across Ethereum, BSC, Polygon (USDT/USDC), and Solana (USDT/USDC). Unpaid checkouts expire after 45 minutes.
Webhooks
Set a webhook URL from Dashboard → API & webhooks. We POST here the instant a payment confirms, signed with your webhook secret so you can verify it really came from us.
{
"event": "checkout.confirmed",
"order_id": "169bd00f-...",
"order_reference": "order_123",
"amount_usd": 9.99,
"paid_amount": 9.99,
"paid_asset": "USDT",
"paid_chain": "bsc",
"paid_at": "2026-07-29T02:41:10Z"
}Verify the X-Zynost-Signature header:
import hmac, hashlib
def verify(payload_bytes: bytes, signature: str, secret: str) -> bool:
expected = hmac.new(secret.encode(), payload_bytes, hashlib.sha256).hexdigest()
return hmac.compare_digest(expected, signature)Errors
Standard HTTP status codes, JSON body with a detail string.
| Code | Meaning |
|---|---|
| 401 | Missing or invalid API key |
| 400 | Invalid request body, or nothing owed (billing endpoints) |
| 402 | Free-plan order limit reached — upgrade or switch billing model |
| 404 | Checkout or invoice not found |
Billing models
Every merchant picks one, and can switch (from Dashboard → Settings):
Flat
Free up to 50 checkouts/month. Upgrade to Pro ($19/mo) for unlimited — paid through this same gateway, with Zynost as the payee.
Pay-as-you-go
No checkout cap. 0.3% of what actually gets paid each month, settled the same way — through the gateway itself.
A billing-mode switch takes effect at the start of your next cycle, never mid-cycle — so it can never be used to dodge a limit you just hit.
Withdrawing funds
There is no withdraw endpoint, because there's nothing to withdraw from us — every payment lands directly at an address derived from your own xpub. Since each checkout gets its own fresh address, use the free sweep tool (Dashboard → API & webhooks) to consolidate them into one wallet.
pip install -r requirements-offline-tools.txt
python sweep_via_api.py
# Asks for: your API key, your mnemonic, and one destination address.
# Choose "auto" and it re-checks + sweeps every 4 hours by itself —
# your mnemonic stays only in that process's memory, never on disk.FAQ
Is my xpub safe to share?
Yes — it derives receive addresses only, and mathematically cannot be used to move funds. It's the same watch-only principle hardware wallets use for read-only address books.
What if a customer underpays?
We accept anything at or above ~99.9% of the invoiced amount. Underpayments stay pending — there's no automatic partial fulfillment.
Do you support recurring billing?
Not built-in yet — call POST /v1/checkout again each cycle from your own backend to build recurring billing on top of one-time invoices.
Which chains and assets?
USDT and USDC on Ethereum, BSC, and Polygon (one address covers all three), plus USDT and USDC on Solana (one static address per merchant).