Documentation

Everything you need to accept non-custodial crypto payments on your own site.

Quick start

  1. 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. 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. 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.

bash
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_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Regenerating 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.

Request body
{
  "amount_usd": 9.99,
  "order_reference": "order_123",
  "description": "Pro plan (optional)"
}
Response
{
  "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.

Payload
{
  "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:

python
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.

CodeMeaning
401Missing or invalid API key
400Invalid request body, or nothing owed (billing endpoints)
402Free-plan order limit reached — upgrade or switch billing model
404Checkout 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.

bash
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).