🔌 API REFERANSI

Zyrix Ödeme API
v1.0

MENA ve Türkiye genelinde ödeme kabul etmek, işlemleri yönetmek ve ödeme iş akışını otomatize etmek için REST API. Base URL: api.zyrix.co/v1

RESTJSONHTTPS onlyIdempotentWebhooks99.9% SLA

Kimlik Doğrulama

Tüm API istekleri, Authorization başlığında Gizli Anahtarınızı kullanarak kimlik doğrulaması gerektirir.

# Her istekte ekleyin
Authorization: Bearer sk_live_zyrix_xxxxxxxxxxxxxxxxxxxx
Content-Type: application/json
X-Idempotency-Key: your-unique-key-per-request
sk_live_...
Canlı Gizli Anahtar
Yalnızca sunucu tarafı
pk_live_...
Canlı Genel Anahtar
İstemci tarafı
sk_test_...
Test Gizli Anahtarı
Yalnızca sandbox

Ödeme İşleyici

Core API
POST/v1/payments/intentÖdeme Niyeti Oluştur

Bir ödeme girişimini temsil eden sunucu taraflı bir nesne olan Ödeme Niyeti oluşturur.

İstek Gövdesi
{
  // Required
  "amount": 25000,              // integer, in smallest unit (kuruş/halala/fils)
  "currency": "TRY",            // "TRY"|"SAR"|"AED"|"KWD"|"QAR"|"EGP"|"IQD"
  "payment_method": "card",     // "card"|"crypto"|"cod"|"qr"|"tap_to_pay"

  // Crypto-specific (required when payment_method = "crypto")
  "crypto_asset": "USDT",       // "USDT"|"BTC"|"ETH"
  "crypto_network": "trc20",    // "trc20"|"erc20"|"bep20"|"bitcoin"|"ethereum"

  // Optional — metadata
  "merchant_id": "mer_xxxxxxxxx",
  "customer_id": "cus_xxxxxxxxx",   // Zyrix customer ID (from /customers)
  "order_id": "ord_123456",         // Your internal order reference
  "description": "Order #1234 — Blue Sneakers",
  "statement_descriptor": "MYSTORE",  // max 22 chars, on bank statement
  "metadata": {                       // arbitrary key-value, returned in webhooks
    "product_id": "prod_xyz",
    "channel": "mobile_app"
  },

  // COD-specific
  "cod_address": {
    "line1": "King Fahd Road",
    "city": "Riyadh",
    "country": "SA",
    "postal_code": "12271"
  },

  // Split Pay (optional)
  "split": [
    { "merchant_id": "mer_supplier_01", "amount": 5000, "currency": "TRY" },
    { "merchant_id": "mer_supplier_02", "amount": 3000, "currency": "TRY" }
  ],

  // Locale for receipts & notifications
  "locale": "ar",               // "ar"|"tr"|"en"

  // Idempotency (also pass as header X-Idempotency-Key)
  "idempotency_key": "order_1234_attempt_1"
}
Yanıt 201 Oluşturuldu
{
  "id": "pay_xxxxxxxxxxxxxxxxxx",
  "object": "payment_intent",
  "status": "requires_payment_method",
  // Status flow:
  // requires_payment_method → requires_confirmation →
  // requires_action → processing → succeeded | failed

  "amount": 25000,
  "currency": "TRY",
  "amount_received": 0,
  "payment_method": "card",

  // For crypto payments
  "crypto": {
    "asset": "USDT",
    "network": "trc20",
    "address": "TQn5nZxxxxxxxxxxxxxxxxxxxxxxxxxx",
    "amount_crypto": "8.33",       // exact amount customer must send
    "rate_locked_until": "2026-03-29T14:30:00Z",  // 15-min rate lock
    "qr_code_url": "https://api.zyrix.co/v1/qr/pay_xxx"
  },

  // Checkout URL (for hosted payment page)
  "checkout_url": "https://pay.zyrix.co/c/pay_xxxxxxxxx",
  "client_secret": "pay_xxx_secret_yyy",  // for Zyrix.js client SDK

  // Fees (transparent — shown upfront)
  "fee": {
    "amount": 200,          // ₺2.00 in kuruş
    "currency": "TRY",
    "rate": "0.008",        // 0.8%
    "breakdown": {
      "processing": 200,
      "currency_conversion": 0,
      "network": 0
    }
  },

  // Settlement
  "net_amount": 24800,      // amount - fees
  "settlement_date": "2026-03-30",  // next business day

  "merchant_id": "mer_xxxxxxxxx",
  "order_id": "ord_123456",
  "metadata": { "product_id": "prod_xyz", "channel": "mobile_app" },
  "created_at": "2026-03-29T13:45:00Z",
  "expires_at": "2026-03-29T14:45:00Z",   // 1-hour expiry
  "livemode": true
}
Hata Yanıtları
400·invalid_amount
Tutar minimumun altında
400·invalid_currency
Para birimi bu pazarda desteklenmiyor
401·invalid_api_key
Gizli anahtar eksik veya geçersiz
402·insufficient_funds
Tüccar bakiyesi yetersiz
409·idempotency_conflict
Aynı idempotency anahtarı, farklı parametreler
429·rate_limit_exceeded
API anahtarı başına 120 istek/dakika
POST/v1/payments/{payment_id}/confirmÖdemeyi Onayla
// Request
{
  "payment_method_id": "pm_xxxxxxxxx",  // from /payment-methods
  "return_url": "https://yourstore.com/payment/result"
}

// Response 200
{
  "id": "pay_xxxxxxxxxxxxxxxxxx",
  "status": "processing",           // or "succeeded" for instant methods
  "next_action": {                   // if 3DS required
    "type": "redirect_to_url",
    "redirect_to_url": {
      "url": "https://3ds.bank.com/challenge/...",
      "return_url": "https://yourstore.com/payment/result"
    }
  },
  "succeeded_at": null,             // populated when status = "succeeded"
  "receipt_url": null               // WhatsApp receipt sent automatically
}
GET/v1/payments/{payment_id}Ödemeyi Al
GET /v1/payments/pay_xxxxxxxxxxxxxxxxxx
Authorization: Bearer sk_live_xxx

// Response 200 — complete payment object with current status
GET/v1/paymentsÖdemeleri Listele
GET /v1/payments?
  limit=20                   // 1-100, default 20
  &starting_after=pay_xxx    // cursor pagination
  &status=succeeded          // filter by status
  &currency=TRY              // filter by currency
  &payment_method=crypto     // filter by method
  &created[gte]=1711670400   // Unix timestamp
  &created[lte]=1711756800

// Response 200
{
  "object": "list",
  "data": [ /* array of payment objects */ ],
  "has_more": true,
  "next_cursor": "pay_yyy",
  "total_count": 847
}

Webhook'lar

Zyrix, ödeme olayları gerçekleştiğinde uç noktanıza webhook'lar gönderir. İşlemeden önce webhook sırrınızı kullanarak imzayı her zaman doğrulayın.

// Webhook payload structure
{
  "id": "evt_xxxxxxxxxxxxxxxxxx",
  "type": "payment.succeeded",
  // Event types:
  // payment.created | payment.processing | payment.succeeded
  // payment.failed | payment.refunded | payment.disputed
  // crypto.detected | crypto.confirmed | crypto.expired
  // cod.assigned | cod.delivered | cod.returned
  // payout.paid | invoice.sent | subscription.renewed

  "created": 1711756800,
  "livemode": true,
  "data": {
    "object": { /* full payment object */ }
  },
  "merchant_id": "mer_xxxxxxxxx"
}

// Signature verification (Node.js example)
const crypto = require('crypto');
const expectedSig = crypto
  .createHmac('sha256', process.env.ZYRIX_WEBHOOK_SECRET)
  .update(rawBody)
  .digest('hex');
if (request.headers['x-zyrix-signature'] !== expectedSig) {
  return res.status(401).json({ error: 'Invalid signature' });
}
⚠️ Her zaman 5 saniye içinde HTTP 200 ile yanıtlayın. Zyrix, üstel geri çekilme ile başarısız webhook'ları yeniden dener: 5s → 30s → 2d → 10d → 1s → 6s → 24s (toplam 7 deneme).

TypeScript Türleri

// ── Zyrix Payment Types ─────────────────────────────────────────
// Install: npm install @zyrix/types
// Or use these definitions directly in your project

type ZyrixCurrency = "TRY" | "SAR" | "AED" | "KWD" | "QAR" | "EGP" | "IQD";
type ZyrixCryptoAsset = "USDT" | "BTC" | "ETH";
type ZyrixCryptoNetwork = "trc20" | "erc20" | "bep20" | "bitcoin" | "ethereum";
type ZyrixPaymentMethod = "card" | "crypto" | "cod" | "qr" | "tap_to_pay" | "bank_transfer";
type ZyrixLocale = "ar" | "tr" | "en";

type ZyrixPaymentStatus =
  | "requires_payment_method"
  | "requires_confirmation"
  | "requires_action"
  | "processing"
  | "succeeded"
  | "failed"
  | "canceled"
  | "refunded";

interface ZyrixCreatePaymentIntent {
  amount: number;                        // in smallest unit
  currency: ZyrixCurrency;
  payment_method: ZyrixPaymentMethod;
  crypto_asset?: ZyrixCryptoAsset;
  crypto_network?: ZyrixCryptoNetwork;
  merchant_id?: string;
  customer_id?: string;
  order_id?: string;
  description?: string;
  statement_descriptor?: string;         // max 22 chars
  metadata?: Record<string, string>;
  locale?: ZyrixLocale;
  idempotency_key?: string;
  cod_address?: {
    line1: string;
    city: string;
    country: string;
    postal_code?: string;
  };
  split?: Array<{
    merchant_id: string;
    amount: number;
    currency: ZyrixCurrency;
  }>;
}

interface ZyrixPaymentIntent {
  id: string;
  object: "payment_intent";
  status: ZyrixPaymentStatus;
  amount: number;
  currency: ZyrixCurrency;
  amount_received: number;
  payment_method: ZyrixPaymentMethod;
  crypto?: {
    asset: ZyrixCryptoAsset;
    network: ZyrixCryptoNetwork;
    address: string;
    amount_crypto: string;
    rate_locked_until: string;
    qr_code_url: string;
  };
  fee: {
    amount: number;
    currency: ZyrixCurrency;
    rate: string;
    breakdown: {
      processing: number;
      currency_conversion: number;
      network: number;
    };
  };
  net_amount: number;
  settlement_date: string;
  checkout_url: string;
  client_secret: string;
  merchant_id: string;
  order_id?: string;
  metadata?: Record<string, string>;
  created_at: string;
  expires_at: string;
  livemode: boolean;
  next_action?: {
    type: "redirect_to_url";
    redirect_to_url: {
      url: string;
      return_url: string;
    };
  };
}

interface ZyrixWebhookEvent {
  id: string;
  type: string;
  created: number;
  livemode: boolean;
  data: { object: ZyrixPaymentIntent | Record<string, unknown> };
  merchant_id: string;
}

// ── Usage example ───────────────────────────────────────────────
async function createPayment(orderAmount: number, currency: ZyrixCurrency) {
  const intent: ZyrixCreatePaymentIntent = {
    amount: orderAmount * 100,   // convert to kuruş/halala
    currency,
    payment_method: "card",
    locale: "ar",
    metadata: { source: "mobile_app" },
    idempotency_key: `order_${Date.now()}`,
  };

  const response = await fetch("https://api.zyrix.co/v1/payments/intent", {
    method: "POST",
    headers: {
      "Authorization": `Bearer ${process.env.ZYRIX_SECRET_KEY}`,
      "Content-Type": "application/json",
      "X-Idempotency-Key": intent.idempotency_key!,
    },
    body: JSON.stringify(intent),
  });

  const payment: ZyrixPaymentIntent = await response.json();
  return payment;
}

Hız Limitleri

API Hız Limiti
120 req/min
API anahtarı başına
Min Ödeme Tutarı
₺1 / SAR 0.10
Para birimine göre değişir
Max Ödeme Tutarı
₺500,000
Kurumsal ile daha yüksek limitler
Webhook Zaman Aşımı
5 seconds
Sonra başarısız işaretlendi
Ödeme Süresi Dolumu
1 hour
Kripto: 15 dk kur kilidi
Mutabakat Penceresi
T+1
Sonraki iş günü (standart)

SDKs

Node.js / TypeScript
Mevcut
npm install @zyrix/node
Python
Mevcut
pip install zyrix
PHP
Mevcut
composer require zyrix/zyrix-php
Go
Yakında
go get github.com/zyrix/zyrix-go
Ruby
Yakında
gem install zyrix
Zyrix.js (Browser)
Mevcut
<script src="https://js.zyrix.co/v1/"></script>

Entegrasyon için Hazır mısınız?

Test API anahtarlarınızı anında alın. Sandbox için onay gerekmez.