TR

Üye işyeri API dokümantasyonu

Temel URL: https://snapex.pro/api/v1/merchant

API anahtarı ve ilk istek

  1. Panelden anahtar alın

    Panel → Geliştiriciler → “API anahtarı al”. Anahtar smk_abcdefghij_plus48chars biçimindedir ve yalnızca bir kez gösterilir. Kaybederseniz yenisini oluşturun: önceki anahtar hemen geçersiz olur.

  2. Tek bir header ekleyin

    Authorization: Bearer your_key.

  3. Erişimi doğrulayın

    Bakiyeyi sorgulayın. data içeren bir JSON yanıtı geldiyse anahtar kabul edilmiştir.

istek
curl -sS https://snapex.pro/api/v1/merchant/balances \
  -H "Authorization: Bearer smk_abcdefghij_yourkey" \
  -H "Accept: application/json"
yanıt
{
  "data": [
    {
      "asset_id": "usdt",               // her zaman usdt — başka bakiye yoktur
      "available_atomic": "15000000",   // en küçük birimlerle 15 USDT (6 ondalık basamak)
      "available": "15",                // aynı değer ondalık biçimde
      "held_atomic": "0",               // tamamlanmamış çekimler için bloke edilen tutar
      "held": "0"
    }
  ]
}

İstek başarısız olduysa

Yanıt Neden
401 unauthorized Anahtar eksik, boşluk içeriyor veya kesilmiş. Bearer kelimesinden sonra smk_… tanımlayıcısının tamamı gelmelidir.
401 key_inactive Anahtar iptal edilmiş: yeni bir anahtar oluşturulmuş, ancak istek hâlâ öncekiyle gönderiliyor.

Beş kural

Entegrasyon hatalarının çoğu bu kurallardan birine uyulmamasından kaynaklanır.

1. Tutarları string olarak gönderin

İki alandan birini gönderin: amount — ondalık bir string: "0.001", "15" — ya da amount_atomic — en küçük birimlerle bir tam sayı: 0.001 BTC için "100000". Yalnızca bir alan kullanın. Yanıtlarda her zaman iki biçim de bulunur: amount ile amount_atomic yan yana gelir.

örnek
"amount": "0.001"        // geçerli
"amount_atomic": "100000" // bu da geçerli
// ikisi birden — 422

2. asset_id değerini yalnızca /assets yanıtından alın

İzin verilen kodlar: usdt, btc, xmr. Rastgele değerler ve blok gezginlerindeki kimlikler 422 ile reddedilir.

örnek
"asset_id": "btc"   // doğru
"asset_id": "BTC"   // hata
"asset_id": "bitcoin" // hata

3. Kayıt oluşturan her istekte Idempotency-Key

Denemenin benzersiz kimliğidir. Bağlantı koparsa ve sonuç bilinmiyorsa isteği aynı anahtarla tekrarlayın: ilk sonuç döner, ikinci bir işlem oluşturulmaz. POST /invoices, POST /payments, POST /payouts/preview ve POST /payouts için zorunludur.

örnek
Idempotency-Key: order-42-payment   // ilk deneme → 201, oluşturuldu
Idempotency-Key: order-42-payment   // tekrar → 200, aynı kaynak
Idempotency-Key: order-42-payment   // farklı tutar → 409 conflict

4. Boş alanlar yanıtta yer almaz

Null değerler ve boş string'ler yanıta eklenmez. Henüz ödenmemiş bir ödemede actual_amount, credited_amount ve fee bulunmaz. Anahtarın değerini değil, var olup olmadığını kontrol edin.

örnek
// henüz ödenmemiş ödeme:
{ "payment_id": "pay_…", "status": "awaiting_deposit" }
// credited_amount alanı hiç yer almaz

5. expired durumunda siparişi kapatmayın

expired, transferin hiç gelmeyeceği anlamına gelmez. Adres yaklaşık 6 saat daha izlenir ve geç gelen transfer bakiyeye eklenir. Bakiyeye ekleme yapılan nihai durumlar: confirmed, confirmed_underpaid, confirmed_overpaid.

Senaryolar

Her senaryo tüm döngüyü kapsar: isteklerin sırası, yanıtın yapısı ve alanların anlamı. JSON örneklerindeki yorumlar açıklama içindir, gerçek yanıtlarda yer almaz.

Ödeme alma

Müşteri 60 USD'lik siparişi BTC ile ödüyor

Sipariş: order-42. Yaklaşık 60 USDT almanız gerekiyor; BTC fiyatı yaklaşık 60.000 USD iken müşteriden beklenen tutar 0.001 BTC olur.

1
Kullanılabilir varlıkların listesini alın

Yanıt, varlık kodunu ve decimals değerini, yani ondalık ayırıcıdan sonraki basamak sayısını döndürür.

istek
curl -sS https://snapex.pro/api/v1/merchant/assets \
  -H "Authorization: Bearer smk_abcdefghij_yourkey" \
  -H "Accept: application/json"

Önemli noktalar

GET /assets
Parametre gerekmez.
Authorization
API'deki tek zorunlu header.
yanıt
{
  "data": [
    {
      "asset_id": "btc",       // ← sonraki isteklerde bunu kullanın
      "symbol": "BTC",         // kullanıcıya göstermek için
      "network": "bitcoin",    // çekimlerde kullanılır
      "decimals": 8,           // 1 BTC = 100000000 atomik birim
      "price_usd": "60000"     // yaklaşık değer, teklif için kullanılmaz
    },
    {
      "asset_id": "usdt",
      "symbol": "USDT",
      "network": "TRON",
      "decimals": 6,
      "price_usd": "1.00"
    }
  ]
}
2
Kuru 10 dakikalığına sabitleyin

Müşteri ödeme sayfasındayken kuru sabitler. Bu adımda ödeme ya da adres oluşturulmaz, yalnızca teklif hesaplanır. Yanıtta 0.001 BTC karşılığında bakiyeye eklenecek USDT tutarı yer alır.

istek
curl -sS -X POST https://snapex.pro/api/v1/merchant/payments/credit-preview \
  -H "Authorization: Bearer smk_abcdefghij_yourkey" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -d '{"asset_id":"btc","amount":"0.001"}'

Önemli noktalar

asset_id: "btc"
Önceki adımdaki kod.
amount: "0.001"
Müşteriden beklenen BTC tutarı. Sayı olarak değil, string olarak gönderilir.
Idempotency-Key
İsteğe bağlı: herhangi bir işlem oluşturulmaz. Aynı teklifi yeniden kullanmak için gönderebilirsiniz.
yanıt
{
  "data": {
    "credit_lock_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
                                       // ← sonraki adım için kaydedin
    "asset_id": "btc",
    "expected_amount": "0.001",        // müşteriden beklenen tutar
    "expected_amount_atomic": "100000",
    "credit_usdt": "59.4",             // ← bakiyeye eklenecek tutar
    "credit_usdt_atomic": "59400000",
    "expires_at": "2026-08-11T17:20:00+00:00"
                                       // ← bu saatten sonra credit-preview geçersiz olur
  }
}

Müşteriye expected_amount değerini, yani kaç BTC göndermesi gerektiğini gösterin.

3
Ödemeyi oluşturun ve adresi alın

Bu adım ödemeyi oluşturur ve yatırma adresini döndürür. Bu istekte tutarı göndermeyin: tutar 2. adımda credit-preview ile zaten belirlendi.

istek
curl -sS -X POST https://snapex.pro/api/v1/merchant/payments \
  -H "Authorization: Bearer smk_abcdefghij_yourkey" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -H "Idempotency-Key: order-42-payment" \
  -d '{
    "credit_lock_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "external_id": "order-42"
  }'

Önemli noktalar

credit_lock_id
credit-preview yanıtındaki id. Sabitleme süresi dolduysa API 422 döndürür; yeni bir preview isteyin.
external_id: "order-42"
Sipariş numaranız. Ödemeyi daha sonra bulmak ve bir sipariş için iki ödeme oluşmasını önlemek için kullanılır.
Idempotency-Key
Zorunlu. Sabit ve benzersiz bir değer kullanın, örneğin sipariş numarası ve bir sonek.
yanıt
{
  "data": {
    "payment_id": "pay_01HZX...",      // ← durum sorgusu için id
    "external_id": "order-42",         // istekteki sipariş numarası
    "asset_id": "btc",
    "expected_amount": "0.001",
    "credit_usdt": "59.4",
    "status": "awaiting_deposit",      // transfer bekleniyor
    "channel": "api",
    "deposit_address": "bc1qexampledepositaddress000000000",
                                       // ← müşteriye gösterilecek adres
    "expires_at": "2026-08-11T18:00:00+00:00",
    "created_at": "2026-08-11T17:00:00+00:00"
  }
}

Ağ memo gerektiriyorsa yanıtta deposit_memo bulunur. Memo olmadan gönderilen transfer bakiyeye eklenmez; iki alanı da müşteriye gösterin.

4
Ödemeyi bekleyin

Ödemeyi 10–30 saniyede bir sorgulayın. Durum şu sırayla ilerler: awaiting_deposit → detected → processing → confirmed.

istek
curl -sS https://snapex.pro/api/v1/merchant/payments/pay_01HZX... \
  -H "Authorization: Bearer smk_abcdefghij_yourkey" \
  -H "Accept: application/json"

Önemli noktalar

GET /payments/{payment_id}
Önceki yanıttaki payment_id değerini kullanın.
Ne zaman
Önerilen aralık 10–30 saniyedir. Sınır, anahtar başına dakikada 120 istektir; daha sık sorgulamayın.
yanıt
{
  "data": {
    "payment_id": "pay_01HZX...",
    "status": "detected",              // transfer ağda görüldü,
                                       // henüz yeterli onay yok
    "asset_id": "btc",
    "expected_amount": "0.001",
    "actual_amount": "0.001",          // ← gerçekte gelen tutar
    "deposit_address": "bc1qexampledepositaddress000000000",
    "created_at": "2026-08-11T17:00:00+00:00"
  }
}
5
Ödeme onaylandı

confirmed, tutarın bakiyeye eklendiği anlamına gelir. Sipariş kapatılabilir.

istek
curl -sS https://snapex.pro/api/v1/merchant/payments/pay_01HZX... \
  -H "Authorization: Bearer smk_abcdefghij_yourkey" \
  -H "Accept: application/json"

Önemli noktalar

status: confirmed
Nihai durum; değişmez.
credited_amount
Bakiyeye fiilen eklenen USDT. Tam ödemede credit_usdt ile aynıdır.
yanıt
{
  "data": {
    "payment_id": "pay_01HZX...",
    "external_id": "order-42",
    "status": "confirmed",             // ← bakiyeye ekleme tamamlandı
    "asset_id": "btc",
    "expected_amount": "0.001",
    "actual_amount": "0.001",          // beklenen tutar geldi
    "credit_usdt": "59.4",
    "credited_amount": "59.4",         // ← bakiyeye eklenen tutar
    "fee": "0.6",                      // komisyon, credited_amount içine zaten dahil
    "deposit_address": "bc1qexampledepositaddress000000000",
    "created_at": "2026-08-11T17:00:00+00:00"
  }
}

Mutabakatı expected_amount üzerinden değil, credited_amount üzerinden yapın: eksik ödemede bu değerler farklıdır.

Not

  • Ödemeyi önceden oluşturmayın: kur yalnızca 10 dakika sabit kalır ve adres belirli bir tutar için verilir.
  • detected durumunda siparişi kapatmayın: tutar henüz bakiyeye eklenmedi.

Müşteri USDT ile ödüyor

Akış BTC senaryosundakiyle aynıdır, yalnızca asset_id değişir. Aşağıda daha kısa bir örnek var.

1
Tutarı sabitleyin

Dönüşüm olmadığı için credit_usdt neredeyse tutar eksi komisyona eşittir.

istek
curl -sS -X POST https://snapex.pro/api/v1/merchant/payments/credit-preview \
  -H "Authorization: Bearer smk_abcdefghij_yourkey" \
  -H "Content-Type: application/json" \
  -d '{"asset_id":"usdt","amount":"100"}'

Önemli noktalar

asset_id: "usdt"
BTC senaryosundan tek fark.
amount: "100"
Müşteri TRON ağında 100 USDT gönderiyor.
yanıt
{
  "data": {
    "credit_lock_id": "b2c3d4e5-...",
    "asset_id": "usdt",
    "expected_amount": "100",
    "credit_usdt": "99",         // ← 1 USDT komisyon
    "expires_at": "2026-08-11T17:20:00+00:00"
  }
}
2
Ödemeyi oluşturun

Önceki senaryodakiyle aynı adım. Adres bir TRON adresidir (T ile başlar).

istek
curl -sS -X POST https://snapex.pro/api/v1/merchant/payments \
  -H "Authorization: Bearer smk_abcdefghij_yourkey" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: order-43-payment" \
  -d '{"credit_lock_id":"b2c3d4e5-...","external_id":"order-43"}'

Önemli noktalar

Idempotency-Key
Yeni sipariş için yeni bir Idempotency-Key kullanın. order-42 siparişinin anahtarını yeniden kullanmayın.
yanıt
{
  "data": {
    "payment_id": "pay_01HZY...",
    "external_id": "order-43",
    "asset_id": "usdt",
    "expected_amount": "100",
    "credit_usdt": "99",
    "status": "awaiting_deposit",
    "deposit_address": "TXYZexampletronaddress000000000",
                                 // ← TRON adresi, TRC20
    "expires_at": "2026-08-11T18:00:00+00:00"
  }
}

Müşteriye ağın TRC20 olduğunu söyleyin. Bu adrese başka bir ağda gönderilen USDT bakiyeye eklenmez.

Müşteri istenenden az gönderdi

0.001 BTC bekleniyordu, 0.0009 geldi; örneğin müşterinin cüzdanı ağ ücretini tutardan düştü.

1
Ödemeyi kontrol edin

Gelen tutar expected_amount değerinden azsa ama bakiyeye eklenmek için yine de yeterliyse durum confirmed_underpaid olur ve credited_amount tekliften düşük çıkar. Tutar çok küçükse hiçbir şey eklenmez.

istek
curl -sS https://snapex.pro/api/v1/merchant/payments/pay_01HZX... \
  -H "Authorization: Bearer smk_abcdefghij_yourkey" \
  -H "Accept: application/json"

Önemli noktalar

Anlamı
credit_usdt değerini değil, credited_amount değerini karşılaştırın. İlki bakiyeye eklenen tutardır, ikincisi tam ödeme için verilen tekliftir.
yanıt
{
  "data": {
    "payment_id": "pay_01HZX...",
    "external_id": "order-42",
    "status": "confirmed_underpaid",   // ← eksik ödeme, ancak tutar bakiyeye eklendi
    "asset_id": "btc",
    "expected_amount": "0.001",        // beklenen tutar
    "actual_amount": "0.0009",         // gerçekte gelen tutar
    "credit_usdt": "59.4",             // tam ödeme için teklif
    "credited_amount": "53.4",         // ← gerçekte bakiyeye eklenen tutar
    "fee": "0.6",
    "created_at": "2026-08-11T17:00:00+00:00"
  }
}

Sonraki adımlar size kalmış: eksik tutarı isteyin, siparişi kısmen yerine getirin veya iptal edin. API, bakiyeye fiilen eklenen tutarı döndürür.

Not

  • “Ödendi mi, ödenmedi mi” kararını actual_amount ile expected_amount karşılaştırarak vermeyin. credited_amount değerini ihtiyacınız olan USDT tutarıyla karşılaştırın.

Müşteri zamanında ödemedi

expires_at geçti ve transfer gelmedi. Ödeme expired durumuna geçer; adres izlenmeye devam eder.

1
expired durumu

Ödeme süresi kapandı. Adres yaklaşık 6 saat daha izlenir.

istek
curl -sS https://snapex.pro/api/v1/merchant/payments/pay_01HZX... \
  -H "Authorization: Bearer smk_abcdefghij_yourkey" \
  -H "Accept: application/json"

Önemli noktalar

status: expired
Ödeme süresi doldu.
credited_amount
Henüz para gelmedi.
yanıt
{
  "data": {
    "payment_id": "pay_01HZX...",
    "status": "expired",               // süre doldu
    "asset_id": "btc",
    "expected_amount": "0.001",
    "deposit_address": "bc1qexampledepositaddress000000000",
    "expires_at": "2026-08-11T18:00:00+00:00"
    // actual_amount ve credited_amount yok — hiç transfer gelmedi
  }
}
2
Müşteri geç ödedi

Transfer ek izleme süresi içinde gelirse ödeme yine de confirmed durumuna geçer. expired durumunda siparişi silmeyin: gecikmiş olarak işaretleyin ve sorgulamaya devam edin.

istek
curl -sS https://snapex.pro/api/v1/merchant/payments/pay_01HZX... \
  -H "Authorization: Bearer smk_abcdefghij_yourkey" \
  -H "Accept: application/json"

Önemli noktalar

expired → confirmed
Olağan durum: transfer expires_at zamanından sonra geldi.
yanıt
{
  "data": {
    "payment_id": "pay_01HZX...",
    "status": "confirmed",             // ← expires_at sonrasında bakiyeye eklendi
    "actual_amount": "0.001",
    "credited_amount": "59.4",
    "created_at": "2026-08-11T17:00:00+00:00"
  }
}

Not

  • expired durumundan hemen sonra yeni adres vermeyin: müşteri önceki adrese para gönderiyor olabilir. Transferi 6 saat daha bekliyoruz.

Faturalar

Hazır ödeme sayfasıyla USD cinsinden fatura. Ağı müşteri seçer, tutar bakiyenize USDT olarak eklenir.

USDT ile ödenen 15 USD'lik fatura

Sipariş order-15. Üye işyeri USD cinsinden bir fatura oluşturur ve müşteriye ödeme sayfasının linkini gönderir.

1
Faturayı oluşturun

Fatura, USD tutarını ve komisyonu kimin ödeyeceğini sabitler ve pay_url döndürür. Henüz adres yoktur.

istek
curl -sS -X POST https://snapex.pro/api/v1/merchant/invoices \
  -H "Authorization: Bearer smk_abcdefghij_yourkey" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -H "Idempotency-Key: order-15-invoice" \
  -d '{
    "amount_usd": "15.00",
    "fee_on": "merchant",
    "external_id": "order-15"
  }'

Önemli noktalar

amount_usd
Sipariş tutarı, string olarak. Bu endpoint yalnızca USD kabul eder, amount_atomic kabul etmez.
fee_on
merchant — komisyonu siz ödersiniz, müşteri 15.00 görür. customer — komisyonu müşteri öder.
Idempotency-Key
Zorunlu. Aynı anahtarla yapılan yeniden deneme aynı faturayı döndürür.
partner_ref
İsteğe bağlı. Entegrasyonunuzu kuran entegratörün Partner ID'si (SnapEX Pay referans programı). Hesabınızı bu iş ortağına bir kez bağlar; entegrasyonu kendiniz yapıyorsanız bu alanı göndermeyin.
yanıt
{
  "data": {
    "invoice_id": "INV-8K2M1Q0P",
    "amount_usd": "15.00",
    "fee_on": "merchant",
    "charge_usd": "15.00",
    "credit_usd": "13.85",
    "status": "open",
    "pay_url": "https://pay.snapex.pro/0123456789abcdef0123456789abcdef",
    "methods": [
      { "asset_id": "usdt.trc20", "symbol": "USDT", "network": "TRC20" },
      { "asset_id": "usdt.erc20", "symbol": "USDT", "network": "ERC20" },
      { "asset_id": "usdt.bep20", "symbol": "USDT", "network": "BEP20" }
    ]
  }
}

Anahtarın invoices.write veya payments.write yetkisi olmalıdır. Test ortamı: environment=test.

2
Müşteri ağı seçer

Bu adımda benzersiz bir adres oluşturulur. Transfer gelene kadar yöntem değiştirilebilir.

istek
curl -sS -X POST https://snapex.pro/api/v1/merchant/invoices/INV-8K2M1Q0P/methods \
  -H "Authorization: Bearer smk_abcdefghij_yourkey" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: order-15-trc20" \
  -d '{"asset_id":"usdt.trc20"}'

Önemli noktalar

asset_id: "usdt.trc20"
methods listesinden bir kod: usdt.trc20, usdt.erc20 veya usdt.bep20 (ödeme kendi adreslerimize gelir). Diğer ağlardaki USDT (usdt_solana, usdt_ton, …) ve diğer kripto paralar da aynı listeden gelir.
payment.address
Yalnızca bu adresi ve tutarı gösterin. Memo ve Tag kullanılmaz.
yanıt
{
  "data": {
    "invoice_id": "INV-8K2M1Q0P",
    "status": "awaiting",
    "selected_asset_id": "usdt.trc20",
    "payment": {
      "asset_id": "usdt.trc20",
      "amount": "15 USDT",
      "address": "TExampleUniqueAddressForThisAttempt",
      "status": "awaiting"
    }
  }
}

Bu çağrıyı atlayabilirsiniz: müşteri ağı pay_url sayfasında seçer.

3
Fatura ödendi

Tamamlanan ilk transfer faturayı kapatır. Daha sonra başka bir adrese gelen transfer bakiyeye ayrıca eklenir.

istek
curl -sS https://snapex.pro/api/v1/merchant/invoices/INV-8K2M1Q0P \
  -H "Authorization: Bearer smk_abcdefghij_yourkey" \
  -H "Accept: application/json"

Önemli noktalar

status: paid
Nihai durum. Siparişi kapatabilirsiniz.
invoice.paid
invoice.paid webhook'u, panelde belirlediğiniz URL'ye gelir. İmza doğrulaması için “Webhook'lar” bölümüne bakın.
yanıt
{
  "data": {
    "invoice_id": "INV-8K2M1Q0P",
    "status": "paid",
    "credit_usd": "13.85",
    "paid_at": "2026-09-25T12:00:10+00:00"
  }
}

Eksik ödeme faturayı kapatmaz: durum underpaid olur ve aynı adres kalan tutarı bekler (USDT için 72 saat). Kalan tutar zamanında gelmezse fatura partially_paid durumuyla kapanır.

Not

  • Müşteriye gösterilen arayüzde dahili rotaların adını vermeyin. Ödeme sayfası yalnızca adresi, tutarı ve ağı gösterir.
  • İade API'si yoktur. Tamamlanan ikinci transfer ayrı bir bakiye eklemesidir, ilkinin geri alınması değildir.

Çekimler

USDT bakiyenizden dışarıya yapılan transferler.

Müşteriye 15 USDT karşılığı BTC gönderin

amount, alıcının alacağı tutar değil, bakiyenizden düşülecek tutardır. Alıcıya gidecek tutarı preview döndürür.

1
Kullanılabilir bakiyeyi kontrol edin

available değerini kullanın, available ile held toplamını değil. held, tamamlanmamış çekimler için bloke edilen tutardır ve harcanamaz.

istek
curl -sS https://snapex.pro/api/v1/merchant/balances \
  -H "Authorization: Bearer smk_abcdefghij_yourkey" \
  -H "Accept: application/json"

Önemli noktalar

available
Düşülebilecek kullanılabilir bakiye.
held
Devam eden çekimler için bloke edilen tutar.
yanıt
{
  "data": [
    {
      "asset_id": "usdt",
      "available": "74.4",       // ← kullanılabilir tutar
      "available_atomic": "74400000",
      "held": "0",               // bloke edilen tutar yok
      "held_atomic": "0"
    }
  ]
}
2
Çekim için teklif alın

Preview, 15 USDT karşılığında alıcının kaç BTC alacağını ve komisyonu döndürür. Henüz hiçbir tutar düşülmez: yalnızca teklif sabitlenir.

istek
curl -sS -X POST https://snapex.pro/api/v1/merchant/payouts/preview \
  -H "Authorization: Bearer smk_abcdefghij_yourkey" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -H "Idempotency-Key: wd-77-preview" \
  -d '{
    "destination_asset_id": "btc",
    "destination_network": "bitcoin",
    "destination_address": "bc1qexampledestinationaddress000000",
    "amount": "15"
  }'

Önemli noktalar

amount: "15"
Bakiyenizden düşülecek USDT tutarı. Alıcının alacağı tutar bu değildir.
destination_asset_id
Alıcıya gönderilecek varlık. Kodu GET /assets yanıtından alın.
destination_network
Alıcının ağı. BTC için bitcoin. Değeri GET /assets yanıtındaki network alanından alın.
destination_address
Alıcının adresi. Göndermeden önce kontrol edin: transfer iptal edilemez.
Idempotency-Key
Zorunlu. Preview için ayrı bir anahtar kullanın.
yanıt
{
  "data": {
    "preview_id": "c3d4e5f6-7890-abcd-ef12-34567890abcd",
                                     // ← sonraki adım için id
    "from_asset_id": "usdt",
    "from_amount": "15",             // düşülen tutar
    "to_asset_id": "btc",
    "to_amount": "0.000221",         // ← alıcının alacağı tutar
    "fee_amount": "0.000019",        // BTC cinsinden komisyon, zaten dahil
    "expires_at": "2026-08-11T17:20:00+00:00"
                                     // ← bu saatten önce gerçekleştirin
  }
}

to_amount değerini kullanıcıya alacağı tutar olarak gösterin. Tutar uygun değilse teklifi uygulamayın: teklifin süresi expires_at zamanında dolar.

3
Çekimi gerçekleştirin

Bu adımda tutar bakiyeden düşülür ve gönderilir. Adresi ve ağı istekte yeniden belirtin: böylece adımlar arasında değiştirilemezler.

istek
curl -sS -X POST https://snapex.pro/api/v1/merchant/payouts \
  -H "Authorization: Bearer smk_abcdefghij_yourkey" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -H "Idempotency-Key: wd-77-execute" \
  -d '{
    "preview_id": "c3d4e5f6-7890-abcd-ef12-34567890abcd",
    "destination_network": "bitcoin",
    "destination_address": "bc1qexampledestinationaddress000000",
    "external_id": "wd-77"
  }'

Önemli noktalar

Idempotency-Key: wd-77-execute
Preview anahtarından farklı, yeni bir anahtar. Preview anahtarını yeniden kullanırsanız 409 döner.
destination_network / address
Preview ile birebir aynı olmalıdır, aksi halde 422 döner.
external_id
İşlemi sonradan sorgulamak için kendi ID'niz.
yanıt
{
  "data": {
    "payout_id": "payout_01HZX...",  // ← takip için id
    "external_id": "wd-77",
    "asset_id": "usdt",
    "debit_amount": "15",            // bakiyeden düşüldü
    "destination_asset_id": "btc",
    "destination_network": "bitcoin",
    "destination_address": "bc1qexampledestinationaddress000000",
    "destination_amount": "0.000221",// alıcının alacağı tutar
    "fee": "0.000019",
    "status": "reserved",            // tutar bloke edildi, gönderim başladı
    "channel": "api",
    "created_at": "2026-08-11T17:10:00+00:00"
  }
}
4
Tamamlanmasını bekleyin

Durum sırası: reserved → submitting → processing → completed. Her 15–30 saniyede bir sorgulayın.

istek
curl -sS https://snapex.pro/api/v1/merchant/payouts/payout_01HZX... \
  -H "Authorization: Bearer smk_abcdefghij_yourkey" \
  -H "Accept: application/json"

Önemli noktalar

status: completed
Para alıcıya ulaştı. Nihai durum.
status: failed
Transfer başarısız oldu; bloke tutar genellikle bakiyeye geri döner.
status: manual_review
Sonuç belirsiz. İncelemeyi bekleyin; yeni bir çekim oluşturmayın.
yanıt
{
  "data": {
    "payout_id": "payout_01HZX...",
    "external_id": "wd-77",
    "debit_amount": "15",
    "destination_amount": "0.000221",
    "status": "completed",           // ← teslim edildi
    "created_at": "2026-08-11T17:10:00+00:00"
  }
}

Not

  • amount, bakiyeden düşülecek tutardır; alıcının alacağı tutar değildir.
  • Çekimlerin ayrı bir limiti vardır: dakikada 5, saatte 30 istek. Preview isteğini döngü içinde göndermeyin.
  • Preview süresi dolduysa (expires_at), POST /payouts 422 döndürür. Yeni bir preview isteyin.

Harici bir TRON cüzdanına USDT gönderin

Fark şu: destination_asset_id de usdt olur. Bu durumda komisyon en düşük seviyededir.

1
Çekim için teklif alın

Düşülen varlık ile alıcıya giden varlık aynı olduğundan to_amount, neredeyse amount eksi ağ ücretidir.

istek
curl -sS -X POST https://snapex.pro/api/v1/merchant/payouts/preview \
  -H "Authorization: Bearer smk_abcdefghij_yourkey" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: wd-78-preview" \
  -d '{
    "destination_asset_id": "usdt",
    "destination_network": "TRON",
    "destination_address": "TXYZexampletronaddress000000000",
    "amount": "50"
  }'

Önemli noktalar

destination_network: "TRON"
Değeri GET /assets yanıtındaki network alanından alın; büyük/küçük harf önemlidir.
amount: "50"
Bakiyenizden 50 USDT düşülür.
yanıt
{
  "data": {
    "preview_id": "d4e5f6a7-...",
    "from_asset_id": "usdt",
    "from_amount": "50",           // düşülecek tutar
    "to_asset_id": "usdt",
    "to_amount": "48.9",           // ← alınan tutar (ağ ücreti düşüldükten sonra)
    "fee_amount": "1.1",
    "expires_at": "2026-08-11T17:25:00+00:00"
  }
}
2
Çekimi gerçekleştirin

Sıra, önceki senaryodakiyle aynıdır.

istek
curl -sS -X POST https://snapex.pro/api/v1/merchant/payouts \
  -H "Authorization: Bearer smk_abcdefghij_yourkey" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: wd-78-execute" \
  -d '{
    "preview_id": "d4e5f6a7-...",
    "destination_network": "TRON",
    "destination_address": "TXYZexampletronaddress000000000",
    "external_id": "wd-78"
  }'
yanıt
{
  "data": {
    "payout_id": "payout_01HZZ...",
    "debit_amount": "50",
    "destination_asset_id": "usdt",
    "destination_amount": "48.9",
    "status": "reserved",
    "created_at": "2026-08-11T17:26:00+00:00"
  }
}

Not

  • Alıcı adresinin TRON ağında olduğundan emin olun. Başka bir ağa transfer yapılmaz: istek reddedilir ya da para ulaşmaz.

Çekim için yetersiz bakiye

Bakiye 10 USDT, istenen çekim 15.

1
Preview isteği reddeder

Bakiye, herhangi bir tutar düşülmeden önce, teklif aşamasında kontrol edilir. Hatayı kullanıcıya hemen gösterebilirsiniz.

istek
curl -sS -X POST https://snapex.pro/api/v1/merchant/payouts/preview \
  -H "Authorization: Bearer smk_abcdefghij_yourkey" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: wd-79-preview" \
  -d '{
    "destination_asset_id": "btc",
    "destination_network": "bitcoin",
    "destination_address": "bc1q…",
    "amount": "15"
  }'

Önemli noktalar

HTTP 422
İş kuralına bağlı ret. Yanıt yapısı (zarf) doğrulama hatalarındakiyle aynıdır.
details.amount
Hata bir alana bağlıdır ve formda gösterilebilir.
yanıt
{
  "error": {
    "code": "validation_error",
    "message": "The request is invalid.",
    "details": {
      "amount": ["Yetersiz bakiye."]
                              // ← ret nedeni amount alanına bağlı
    }
  }
}

Hiçbir tutar bloke edilmez. Aynı Idempotency-Key ile yeniden denemek güvenlidir; önce bakiyenize para yatırın.

Not

  • held değerini hesaba katın: paranın bir kısmı başka bir çekim için bloke edildiyse available beklediğinizden düşük olur.

İşlemler

Ödeme geçmişi

Ledger bir işlem defteridir: bakiyeye eklenen, bakiyeden düşülen ve bloke edilen tutarlar ayrı kayıtlar olarak tutulur.

1
Geçmişi sayfa sayfa alın

Kayıtlar en yeniden en eskiye doğru döner. İstek başına en fazla 100 kayıt gelir; sonraki sayfa cursor ile alınır.

istek
curl -sS "https://snapex.pro/api/v1/merchant/transactions?limit=50" \
  -H "Authorization: Bearer smk_abcdefghij_yourkey" \
  -H "Accept: application/json"

Önemli noktalar

limit=50
Yanıt başına kayıt sayısı: 1 ile 100 arası, varsayılan 25.
status=payment
Kayıt türüne göre isteğe bağlı filtre.
yanıt
{
  "data": [
    {
      "id": "124",
      "direction": "credit",          // bakiyeye ekleme
      "type": "payment",              // kaynak — yatırma
      "amount": "59.4",
      "asset_id": "usdt",
      "channel": "api",
      "occurred_at": "2026-08-11T17:05:00+00:00"
    },
    {
      "id": "125",
      "direction": "reserve",         // çekim için bloke
      "type": "payout",
      "amount": "15",
      "asset_id": "usdt",
      "occurred_at": "2026-08-11T17:10:00+00:00"
    }
  ],
  "meta": {
    "next_cursor": "eyJpZCI6MTI1fQ",  // ← cursor parametresinin değeri
    "per_page": 50
  }
}
2
Sonraki sayfa

next_cursor null olduğunda başka kayıt kalmamıştır.

istek
curl -sS "https://snapex.pro/api/v1/merchant/transactions?limit=50&cursor=eyJpZCI6MTI1fQ" \
  -H "Authorization: Bearer smk_abcdefghij_yourkey" \
  -H "Accept: application/json"

Önemli noktalar

cursor
Önceki yanıttaki meta.next_cursor değeri. Rastgele bir değer kabul edilmez.
yanıt
{
  "data": [ /* daha fazla kayıt var */ ],
  "meta": {
    "next_cursor": null,              // ← son sayfa
    "per_page": 50
  }
}

Not

  • direction değeri reserve ve release olan kayıtlar, dışarı giden bir transfer değil, tutarın bloke edilmesi ve blokenin kaldırılmasıdır. Bunları harcama saymayın.

Yanıt gelmedi: aynı isteği tekrarlayın

1
Aynı isteği tekrarlayın

Aynı Idempotency-Key ve aynı parametreleri kullanın. Sunucu bunu aynı işlem olarak değerlendirir.

istek
curl -sS -X POST https://snapex.pro/api/v1/merchant/payouts \
  -H "Authorization: Bearer smk_abcdefghij_yourkey" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: wd-77-execute" \
  -d '{
    "preview_id": "c3d4e5f6-...",
    "destination_network": "bitcoin",
    "destination_address": "bc1qexampledestinationaddress000000",
    "external_id": "wd-77"
  }'

Önemli noktalar

Idempotency-Key
Yeni bir anahtar yeni bir çekim oluşturur.
HTTP 200 / 201
İşlem zaten vardı; orijinal nesne döndürülür.
yanıt
{
  "data": {
    "payout_id": "payout_01HZX...",   // ← ilk yanıttaki ile aynı id
    "external_id": "wd-77",
    "debit_amount": "15",
    "status": "processing",           // beklerken durum değişmiş olabilir
    "created_at": "2026-08-11T17:10:00+00:00"
  }
}

HTTP 201: işlem bu istekle oluşturuldu. HTTP 200: işlem zaten vardı. İki kod da başarı anlamına gelir.

2
Parametreler değiştiyse

Aynı anahtarla farklı bir tutar veya adres gönderilirse istek reddedilir. Bu, parametre uyuşmazlığını önler.

istek
curl -sS -X POST https://snapex.pro/api/v1/merchant/payouts \
  -H "Authorization: Bearer smk_abcdefghij_yourkey" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: wd-77-execute" \
  -d '{
    "preview_id": "another-preview",
    "destination_network": "bitcoin",
    "destination_address": "bc1qanotheraddress"
  }'

Önemli noktalar

HTTP 409
Çakışma: anahtar zaten başka bir işleme bağlı.
Ne yapmalı
Bu yeni bir çekimse yeni bir Idempotency-Key kullanın.
yanıt
{
  "error": {
    "code": "conflict",
    "message": "Idempotency-Key was used with different parameters."
  }
}

Not

  • Anahtarı bir kez oluşturun ve siparişle birlikte saklayın. Her istekten önce yeni anahtar üretirseniz mükerrer işlem koruması devre dışı kalır.
  • HTTP 429 alırsanız birkaç saniye sonra aynı anahtarla yeniden deneyin.

Webhook'lar

Bir fatura, yatırma, çekim, dönüşüm veya bakiye değiştiğinde SnapEX, URL'nize bir POST isteği gönderir. Webhook bir sinyaldir, doğruluk kaynağı değildir: imzayı doğrulayın ve önemli kararlar için nesneyi API üzerinden yeniden okuyun.

Kurulum

  1. URL'yi panelde ayarlayın

    Panel → Geliştiriciler → “Webhook” kartı: URL'yi girin ve “Kaydet” düğmesine basın. Her hesap için tek bir URL vardır; aşağıdaki tablodaki tüm olay türleri bu adrese gönderilir.

  2. İmza anahtarını saklayın

    İlk kaydetmede panel whsec_… gizli anahtarını yalnızca bir kez gösterir. Anahtarı yalnızca kendi sunucunuzda tutun. URL'yi sonradan değiştirmek anahtarı değiştirmez.

  3. URL gereksinimleri

    Herkese açık bir host içeren mutlak bir https:// URL'si: URL'de login:password olmamalı, localhost kullanılmamalı ve host özel ya da ayrılmış bir IP adresine çözümlenmemelidir. URL, kaydedilirken ve her gönderim denemesinden önce yeniden kontrol edilir.

Ne gelir

Header Anlamı
Webhook-Id Benzersiz olay kimliği (UUID), gövdedeki id ile aynıdır. Yeniden denemelerde ve elle yeniden gönderimlerde değişmez — tekrarları bu değere göre ayıklayın.
Webhook-Timestamp Bu denemenin gönderildiği an, saniye cinsinden Unix zamanı. Her yeniden denemede yeni bir değer ve yeni bir imza gelir.
Webhook-Signature v1= ve ardından “{Webhook-Timestamp}.{ham gövde}” string'inin küçük harfli hex HMAC-SHA256 değeri. Anahtar, whsec_ öneki dahil gizli anahtarın tamamıdır.
Content-Type Her zaman application/json. Gövde UTF-8 JSON'dur.
istek
POST /hooks/snapex HTTP/1.1
Content-Type: application/json
Webhook-Id: 6f1c2a8e-3b4d-4f5a-9c7e-1a2b3c4d5e6f
Webhook-Timestamp: 1790337610
Webhook-Signature: v1=2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881
gövde
{
  "id": "6f1c2a8e-3b4d-4f5a-9c7e-1a2b3c4d5e6f",   // = Webhook-Id
  "type": "invoice.paid",                          // olay türü, aşağıdaki tabloya bakın
  "created_at": "2026-09-25T12:00:10+00:00",       // olayın gerçekleştiği zaman
  "data": {                                        // olay anındaki nesne
    "invoice_id": "INV-8K2M1Q0P",
    "environment": "live",
    "amount_usd": "15.00",
    "charge_usd": "15.00",
    "credit_usd": "13.85",
    "status": "paid",
    "external_id": "order-15",
    "paid_at": "2026-09-25T12:00:10+00:00"
  }
}

data, olay türüne bağlıdır: invoice.* — GET /invoices/{id} ile aynı yapıdaki fatura (attempts boştur, geçerli deneme payment içindedir); payment.* — yatırma (payment_id, external_id, status, tutarlar); payout.* — çekim (payout_id, external_id, status, tutarlar); conversion.* — dönüşüm (conversion_id, status, tutarlar); balance.changed — değişiklikten sonraki asset_id, entry_type, available_atomic ve held_atomic.

Olay türleri

Olay Anlamı
invoice.created Fatura oluşturuldu; ödeme yöntemi henüz seçilmedi (open).
invoice.awaiting Ödeme yöntemi seçildi ve adres verildi (awaiting).
invoice.underpaid Tutarın bir kısmı geldi; aynı adres kalanını bekliyor (underpaid).
invoice.paid Tutarın tamamı ödendi ve bakiyeye eklendi (paid, nihai). Siparişi teslim etmek için tek sinyal budur.
invoice.partially_paid Müşteri tutarın yalnızca bir kısmını ödedi, tamamlama süresi doldu, gelen kısım bakiyenize eklendi (partially_paid, nihai).
invoice.expired Fatura süresi ödeme yapılmadan doldu (expired, nihai).
invoice.extra_payment Fatura ödendikten sonra bir transfer daha geldi; ayrıca bakiyeye eklenir.
payment.created Bir yatırma oluşturuldu.
payment.detected Transfer ağda görüldü, ancak henüz bakiyeye eklenmedi.
payment.credited Yatırma bakiyeye eklendi (confirmed* durumlarından biri).
payment.expired Yatırma süresi doldu.
payout.created Bir çekim oluşturuldu ve tutar bloke edildi.
payout.processing Çekim gönderiliyor.
payout.completed Tutar alıcıya ulaştı.
payout.failed Çekim başarısız oldu.
conversion.completed Dönüşüm tamamlandı.
conversion.failed Dönüşüm tamamen ya da kısmen başarısız oldu.
balance.changed Bakiyeye bir kayıt işlendi: ekleme, bloke veya düşüm.

Siparişi yalnızca invoice.paid geldiğinde teslim edin — bu olay yalnızca tutarın tamamı ödendiğinde gönderilir. invoice.underpaid ve invoice.partially_paid tutarın eksik olduğu anlamına gelir.

environment=test ile oluşturulan faturalar simüle edilir: aynı durumlardan geçer ve aynı webhook'ları gönderir (data.environment = "test"), ancak gerçek bakiyeyi asla değiştirmez.

Gönderim ve yeniden denemeler

  • Herhangi bir 2xx yanıtı başarılı sayılır. Diğer tüm kodlar, zaman aşımı veya ağ hatası başarısızlıktır. Yanıt gövdesi yorumlanmaz.
  • Zaman aşımları: bağlantı için 5 sn, isteğin tamamı için 15 sn.
  • Yönlendirmeler izlenmez: 301/302 başarısızlık sayılır. Nihai URL'yi girin.
  • Her olay için en fazla 5 deneme: ilk gönderim, ardından her başarısızlıktan sonra yaklaşık 10 sn, 1 dk, 5 dk ve 15 dk sonra yeniden deneme. Beşinci başarısızlıktan sonra otomatik gönderim durur.
  • Aynı sayfadaki “Webhook gönderimleri” kartında olay, HTTP kodu veya hata, zaman ve deneme numarası listelenir. “Yeniden gönder” düğmesi olayı aynı Webhook-Id ile tekrar gönderir.
  • Gönderim en az bir kez (at-least-once) ilkesiyle yapılır: aynı olay birkaç kez gelebilir ve olaylar sırasız gelebilir (yeniden denenen bir olay daha yeni bir olaydan sonra ulaşabilir).

İmza doğrulaması

  1. İsteğin ham gövdesini JSON ayrıştırmasından önce bayt olarak okuyun. Yeniden serileştirilmiş JSON imzayla eşleşmez.
  2. “{Webhook-Timestamp}.{ham gövde}” üzerinden, anahtar olarak whsec_… gizli anahtarınızla HMAC-SHA256 hesaplayın ve hex olarak kodlayın.
  3. “v1=” + hex değerini Webhook-Signature header'ı ile sabit zamanlı bir fonksiyonla karşılaştırın: hash_equals, crypto.timingSafeEqual, hmac.compare_digest.
  4. Saatinizden 5 dakikadan fazla farklı olan Webhook-Timestamp değerlerini reddedin (önerilir). Yeniden denemeler yeni bir zaman damgasıyla gelir, bu yüzden bu kontrol onları bozmaz.
PHP
<?php
$secret = getenv('SNAPEX_WEBHOOK_SECRET'); // panelden alınan whsec_…
$body = file_get_contents('php://input');  // ham gövde, JSON ayrıştırmasından önce
$timestamp = $_SERVER['HTTP_WEBHOOK_TIMESTAMP'] ?? '';
$signature = $_SERVER['HTTP_WEBHOOK_SIGNATURE'] ?? '';

$expected = 'v1='.hash_hmac('sha256', $timestamp.'.'.$body, $secret);
if (! ctype_digit($timestamp)
    || abs(time() - (int) $timestamp) > 300
    || ! hash_equals($expected, $signature)) {
    http_response_code(400);
    exit;
}

$event = json_decode($body, true);
// bu Webhook-Id zaten işlendiyse atlayın; ağır işleri kuyrukta yapın
http_response_code(200);

İşleyici (handler) kontrol listesi

  • İmzayı ham gövde üzerinden, sabit zamanlı karşılaştırmayla doğrulayın; eşleşmezse 400 ile yanıt verin.
  • Webhook-Timestamp değeri 5 dakikadan eski olan istekleri reddedin.
  • İşlenmiş Webhook-Id değerlerini saklayın ve tekrarları yok sayın. Sıraya güvenmeyin: olaydaki durumu elinizdeki durumla karşılaştırın.
  • Hızla 2xx yanıtı verin (15 saniyenin epey altında); ağır işleri asenkron yapın.
  • Webhook'tan sonra doğrulamak için nesneyi API üzerinden yeniden okuyabilirsiniz: GET /invoices/{id}, GET /payments/{id}, GET /payouts/{id}.

Durumlar

“Nihai” etiketi, durumun artık değişmeyeceğini gösterir. Tek istisna süresi dolmuş yatırmalardır: geç gönderilen bir transfer yine de gelebilir.

Yatırmalar

Durum Anlamı Ne yapmalı
awaiting_deposit Adres verildi, transfer bekleniyor Müşteriye adresi ve tutarı gösterin
detected Transfer ağda görüldü, henüz bakiyeye eklenmedi Bekleyin. Siparişi kapatmayın
processing USDT'ye dönüştürülüyor Bekleyin
confirmed Beklenen tutar geldi, bakiyeye eklendi Siparişi kapatın nihai
confirmed_underpaid Beklenenden az geldi, izin verilen aralık içinde credited_amount değerini kontrol edin ve yeterli olup olmadığına karar verin nihai
confirmed_overpaid Beklenenden fazla geldi, credit-preview'a göre bakiyeye eklendi Siparişi kapatın. Fazla tutar için destekle iletişime geçin nihai
confirmed_mismatch Uyumluluk için korunuyor Yeni ödemelerde kullanılmaz nihai
manual_review Manuel inceleme gerekiyor İncelemeyi bekleyin; ikinci bir ödeme oluşturmayın
expired Ödeme süresi doldu, adres yaklaşık 6 saat daha izleniyor Siparişi silmeyin; durumu sorgulamaya devam edin
failed Sağlayıcı tarafında hata Yeni bir ödeme oluşturun nihai
cancelled Ödeme iptal edildi Yeni bir ödeme oluşturun nihai
refunded Sağlayıcı tarafından iade edildi Bakiye mutabakatı yapın; tutmuyorsa destekle iletişime geçin nihai

Faturalar

Durum Anlamı Ne yapmalı
open Fatura oluşturuldu, ödeme yöntemi seçilmedi Müşteriye pay_url verin veya asset_id değerini kendiniz seçin
awaiting Adres verildi, transfer bekleniyor Adresi ve tutarı gösterin; durumu sorgulayın
underpaid Tutarın bir kısmı geldi; adres aynı Müşteriden kalan tutarı bu adrese göndermesini isteyin
paid İlk tam transfer bakiyeye eklendi Siparişi kapatın nihai
partially_paid Müşteri tutarın yalnızca bir kısmını ödedi, tamamlama süresi doldu, gelen kısım bakiyenize eklendi Ödenmiş sipariş gibi teslim etmeyin; kalan tutarı müşteriyle çözün nihai
expired Fatura süresi doldu Yeni bir fatura oluşturun nihai

Çekimler

Durum Anlamı Ne yapmalı
reserved Çekim için tutar bloke edildi Bekleyin
submitting Sağlayıcıya iletildi Bekleyin
processing Sağlayıcı zincir üzerinde gönderiyor Bekleyin
completed Tutar alıcıya ulaştı Tamamlandı nihai
manual_review Sonuç belirsiz Yeni bir çekim oluşturmayın; incelemeyi bekleyin
failed Transfer başarısız oldu; bloke genellikle kaldırılır Bakiyeyi kontrol edin; gerekirse yeni bir Idempotency-Key ile yeniden deneyin nihai

Hatalar

Başarılı yanıt her zaman data içinde, hata her zaman error içinde gelir. Başka bir zarf yapısı yoktur.

hata yapısı
{
  "error": {
    "code": "validation_error",     // makine tarafından okunabilir kod, aşağıdaki tabloya bakın
    "message": "The request is invalid.",
    "details": {                    // her zaman bulunmaz
      "destination_address": ["The destination address field is required."]
                                    // anahtar, doğrulamayı geçemeyen alandır
    }
  }
}
HTTP code Ne zaman Ne yapmalı
401 unauthorized Anahtar yok veya geçersiz Authorization: Bearer smk_… header'ını boşluk ve satır sonu olmadan, eksiksiz kontrol edin
401 key_inactive Anahtar iptal edildi Önceki anahtar iptal edildi. Paneldeki güncel anahtarı kullanın
401 key_expired Anahtarın süresi doldu Yeni bir anahtar oluşturun
404 not_found Id bulunamadı veya başka bir üye işyerine ait Kendi yanıtınızdaki payment_id veya payout_id değerini kullanın
409 conflict Idempotency-Key başka bir işleme bağlı ya da external_id zaten kullanılmış Yeni bir işlem için yeni bir anahtar kullanın. Yeniden deneme için aynı anahtarı ve aynı parametreleri kullanın
422 validation_error Geçersiz alanlar, süresi dolmuş credit-preview, yetersiz bakiye veya eksik Idempotency-Key Hatalı alan ve neden details içinde yer alır
429 rate_limited İstek limiti aşıldı Daha sonra aynı Idempotency-Key ile yeniden deneyin
500 internal_error Sunucu iç hatası Daha sonra aynı Idempotency-Key ile yeniden deneyin. Sorun devam ederse destekle iletişime geçin ve X-Request-Id değerini ekleyin