Developer Platform

Built for
developers

Clean REST API, real-time webhooks, and SDKs in every major language. Accept crypto payments with a few lines of code.

Quick Start Full Docs
Create a payment
curl -X POST https://zateway.com/api/v1/payments \
-H "X-API-Key: zate_sk_..." \
-H "Content-Type: application/json" \
-d '{"amount":"<n>50.00</n>","currency":"USDT","chain":"polygon"}'
API Overview

Everything you need to integrate

A single, consistent REST API for creating payments, managing webhooks, and querying transaction data.

Base URL

https://zateway.com/api/v1

Authentication

API key via X-API-Key header

Format

JSON request & response bodies

Key Endpoints

MethodEndpointDescription
POST/paymentsCreate a new payment session
GET/payments/:idRetrieve payment details
POST/payment-linksCreate a reusable payment link
GET/payment-linksList your payment links
GET/currenciesList supported currencies & chains
POST/refundsCreate a refund request
GET/statusCheck API and chain listener health
Quick Start

Accept crypto in 3 steps

From zero to live payments in under five minutes.

1

Get your API key

Sign up and grab your API key from the Dashboard under Settings → API Keys. Your key starts with zate_sk_.

2

Create a payment

Send a POST request to create a payment session. You'll receive a checkout URL to redirect your customer. Required fields: amount, currency, chain, and merchantWallet (your receiving wallet address).

curl -X POST https://zateway.com/api/v1/payments \
-H "X-API-Key: zate_sk_..." \
-H "Content-Type: application/json" \
-d '{"amount": "<n>50.00</n>", "currency": "USDT", "chain": "polygon", "merchantWallet": "0x..."}'
3

Handle the webhook

Register a webhook URL in the Dashboard. We'll notify you when a payment is confirmed, failed, or expired.

Webhook payload
{
"event": "payment.confirmed",
"data": {
"id": "pay_abc123",
"amount": "<n>50.00</n>",
"currency": "USDT",
"chain": "polygon",
"status": "confirmed",
"txHash": "0xabc...def",
"confirmedAt": "<n>2026</n>-<n>03</n>-25T12:<n>00</n>:00Z"
},
"timestamp": "<n>2026</n>-<n>03</n>-25T12:<n>00</n>:05Z"
}
Webhooks

Real-time event notifications

Subscribe to payment lifecycle events. Every webhook is signed with HMAC-SHA256 so you can verify authenticity.

Events

EventDescription
payment.confirmedPayment has been confirmed on-chain
payment.failedPayment failed or was rejected
payment.expiredPayment session expired without payment
payment.underpaidReceived amount is less than expected

Signature Verification

Every webhook includes three headers for verification: X-Zateway-Signature (format: sha256=<hmac>), X-Zateway-Timestamp (unix seconds), and X-Zateway-Nonce (unique string). The signature is computed as HMAC-SHA256(secret, timestamp.nonce.payload).

Node.js — Verify signature
const crypto = require('crypto');
function verifyWebhook(req, secret) {
const signature = req.headers['x-zateway-signature'];
const timestamp = req.headers['x-zateway-timestamp'];
const nonce = req.headers['x-zateway-nonce'];
const payload = JSON.stringify(req.body);
// Check timestamp freshness (5 min window)
const age = Math.abs(Date.now() / 1000 - parseInt(timestamp));
if (age > 300) return false;
// Verify HMAC
const message = `${timestamp}.${nonce}.${payload}`;
const expected = crypto.createHmac('sha256', secret)
.update(message).digest('hex');
const actual = signature.replace('sha256=', '');
return crypto.timingSafeEqual(
Buffer.from(expected), Buffer.from(actual)
);
}
Error Handling

Predictable error responses

All errors return a JSON object with a single error string field.

HTTP Status Codes

CodeStatusDescription
400Bad RequestInvalid parameters or missing required fields
401UnauthorizedMissing or invalid API key
403ForbiddenAPI key lacks permission for this action
404Not FoundResource does not exist
429Too Many RequestsRate limit exceeded (varies by endpoint)
500Internal Server ErrorSomething went wrong on our end
Rate limits: 100 requests per minute per API key. Exceeding this returns a 429 status with a Retry-After header.

Error Response Format

Example error response
{
"error": "Amount must be a positive number"
}
Get Started

Ready to integrate?

Start building with Zateway today. Full API reference, guides, and support are just a click away.

Read the Docs Create Account