Skip to Content
DocumentationQuickstart

Quickstart

Accept your first stablecoin payment in under 5 minutes.

Get your API key

Sign up at inzipay.com  and go to Settings → API Keys.

You’ll get two keys:

  • sk_test_... — test mode (mock payments, no real blockchain)
  • sk_live_... — live mode (real stablecoin payments)

Start with the test key.

API keys are shown only once. Store them securely.

Create a checkout

curl -X POST https://api.inzilink.com/api/v1/checkouts \ -H "Authorization: Bearer sk_test_xxxxx" \ -H "Content-Type: application/json" \ -d '{ "amount": "25.00", "currency": "USD", "description": "Order #12345", "metadata": { "order_id": "ORD-123" }, "redirect_url": "https://yoursite.com/success", "webhook_url": "https://yoursite.com/webhooks/inzi" }'

Open the checkout URL

The API returns a checkout_url. Redirect your user there:

{ "id": "chk_test_abc123def456", "status": "pending", "checkout_url": "https://inzilink.com/p/abc123", "expires_at": "2026-04-04T12:30:00Z" }

The checkout page shows available chains/tokens, a QR code, and a copy-paste address. The user pays from any wallet.

Receive the webhook

In test mode, a mock checkout.completed webhook fires 5 seconds after checkout creation. No real blockchain transaction occurs.

{ "event": "checkout.completed", "checkout_id": "chk_test_abc123def456", "data": { "status": "completed", "amount": "25.00", "currency": "USD", "payment": { "amount_crypto": "25.000000", "crypto_currency": "USDT", "network": "polygon", "tx_hash": "0xmock...", "confirmed_at": "2026-04-04T12:00:05Z" }, "metadata": { "order_id": "ORD-123" } } }

Verify the webhook signature

Every webhook includes an HMAC-SHA256 signature. Always verify it.

import crypto from 'crypto' function verifyWebhook(body, headers, secret) { const timestamp = headers['x-inzi-timestamp'] const signature = headers['x-inzi-signature'].replace('sha256=', '') const signedPayload = `${timestamp}.${body}` const expected = crypto .createHmac('sha256', secret) .update(signedPayload) .digest('hex') // Timing-safe comparison if (!crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(signature))) { throw new Error('Invalid webhook signature') } // Reject stale webhooks (> 5 min) if (Math.abs(Date.now() / 1000 - parseInt(timestamp)) > 300) { throw new Error('Webhook too old') } return JSON.parse(body) }

Go live

When you’re ready for real payments:

  1. Switch from sk_test_ to sk_live_ key
  2. Set your production webhook_url
  3. Set a settlement wallet address in Dashboard → Settings

That’s it. The API is identical — only the key changes.

Next steps