Bu sayfada
  1. Başlangıç
  2. Kimlik doğrulama
  3. Yetki kapsamları
  4. İstek ve yanıt biçimi
  5. Hatalar
  6. Hız limiti
  7. Ürünler
  8. Liste
  9. Detay
  10. Fiyat
  11. Kategoriler ve markalar
  12. Siparişler
  13. Liste
  14. Detay
  15. Güncelle
  16. Kargo gönderisi
  17. Stok
  18. Webhook'lar
  19. Olaylar
  20. İmza doğrulama
  21. Mağaza panelindeki API ekranı
  22. Sınırlar ve öneriler
  23. Değişiklik günlüğü
API v1 Son güncelleme: 14.10.2026

Mağaza API'si ve Webhook'lar

Mağazanızın ürün, stok, fiyat, sipariş ve kargo verisini kendi yazılımınıza bağlamak için REST API ve olay bildirimleri (webhook). Muhasebe, ERP, depo ve pazaryeri entegratörleri için tasarlandı.

Taban adres
https://<mağaza-alan-adınız>/api/v1
Kimlik
X-API-KEY başlığı
Biçim
JSON · UTF-8
Hız limiti
Varsayılan 120 istek/dk
Paket
Platinum

Başlangıç

API ve webhook erişimi Platinum paketinde açıktır. Diğer paketlerde her istek 403 döner.

  1. Mağaza yönetim panelinde API & Webhook sayfasını açın (/admin/api).
  2. Yeni API Anahtarı kartında bir ad verin, ihtiyacınız olan yetki kapsamlarını işaretleyin ve Anahtar Oluştur'a basın.
  3. Anahtar yalnızca bir kez gösterilir. Hemen kopyalayıp güvenli bir yerde saklayın.
  4. İlk isteğinizi gönderin:
curl https://magazaniz.com/api/v1/products?per_page=5 \
  -H "X-API-KEY: 3f9c0e…(48 karakter)"

Örneklerdeki magazaniz.com yerine mağazanızın alan adını yazın. Alan adı bağlı değilse mağazanızın SUSOFTECH alt alan adını kullanın.

Kimlik doğrulama

Her istekte anahtarınızı X-API-KEY başlığında gönderin. Authorization: Bearer ve adres satırında (query string) anahtar desteklenmez.

ÖzellikDavranış
Anahtar biçimi48 karakterlik küçük harf onaltılık dizi, ön ek yok.
Mağaza kapsamıAnahtar oluşturulduğu mağazaya bağlıdır; yalnız o mağazanın verisini görür ve değiştirir.
İzinli IP'lerİsteğe bağlı, virgülle ayrılmış liste. Tam eşleşme aranır; CIDR ve joker karakter desteklenmez. Boş bırakılırsa her IP kabul edilir.
Son kullanmaİsteğe bağlı tarih. Seçilen günün 00:00'ından itibaren anahtar reddedilir.
İptalİptal edilen anahtar kalıcı olarak kapanır, yeniden açılamaz. Yeni anahtar oluşturun.
İstek imzalamaGelen istekler için imza gerekmez; güvenlik anahtar + HTTPS + isteğe bağlı IP listesiyle sağlanır.

Anahtarı tarayıcıda kullanmayın. API, tarayıcıdan yapılan çapraz alan isteklerine (CORS) izin vermez. Çağrıları kendi sunucunuzdan yapın; anahtarı ön yüz koduna koymayın.

Yetki kapsamları

Her anahtar yalnız kendisine verilen kapsamlardaki uçları çağırabilir. Hiç kapsam seçilmezse anahtar tüm okuma izinlerini alır, hiçbir yazma izni almaz.

KapsamNe sağlarTür
products:readÜrün listesi ve ürün detayıOkuma
products:writeÜrün fiyatını güncellemeYazma
categories:readKategorilerOkuma
brands:readMarkalarOkuma
orders:readSipariş listesi ve detayıOkuma
orders:writeSipariş durumu, kargo firması ve takip numarası güncellemeYazma
stock:readStok seviyeleriOkuma
stock:writeStok seviyesi güncellemeYazma
shipping:readSiparişin kargo gönderisini okumaOkuma
shipping:writeKargo gönderisi oluşturma (mağaza cüzdanından ücret çeker)Yazma

Kapsamı olmayan bir uç çağrılırsa 403 döner ve gereken kapsam errors.required_scope alanında belirtilir.

İstek ve yanıt biçimi

Yanıtlar her zaman JSON'dur (Content-Type: application/json; charset=utf-8). Yazma isteklerinde gövdeyi JSON olarak gönderin ve Content-Type: application/json başlığını ekleyin. Gövde boşsa form verisi (application/x-www-form-urlencoded) de okunur.

Başarılı yanıt

JSON
{
  "success": true,
  "message": "OK",
  "data": { … }
}

Sayfalı liste

Liste uçları page (varsayılan 1) ve per_page (varsayılan 20, en fazla 100) parametrelerini alır. 100'ün üzerindeki değerler 100'e indirilir.

JSON
{
  "success": true,
  "message": "OK",
  "data": [ … ],
  "meta": { "page": 1, "per_page": 20, "total": 143, "total_pages": 8 }
}

Hata yanıtı

JSON
{
  "success": false,
  "message": "Validation failed",
  "errors": { "price": "Geçerli bir fiyat gerekli." }
}

Tutarlar ondalık sayıdır (TRY, iki basamak). Tarihler sunucu saatine (Türkiye, UTC+3) göre YYYY-MM-DD HH:MM:SS biçimindedir.

Hatalar

HTTPNe zamanÖrnek mesaj
400Gövde gönderildi ama geçerli JSON değilGeçersiz JSON gövdesi.
401Anahtar yok, geçersiz, iptal edilmiş, süresi dolmuş ya da IP izinli değilAPI key missing · Invalid API key · API key is revoked or inactive · API key has expired · IP address not allowed
403Paket Platinum değil ya da anahtarda gereken kapsam yokREST API erişimi paketinizde dahil değil (Platinum gerektirir).
404Kayıt bu mağazada yokProduct not found · Order not found
409Kargo gönderisi bu durumda oluşturulamazMağazada aktif kargo entegrasyonu yok.
413Gövde sunucu sınırını aşıyorİstek gövdesi sunucunun post_max_size limitini aşıyor …
422Doğrulama hatası; alan bazında ayrıntı errors içindeValidation failed
429Hız limiti aşıldıRate limit aşıldı (dakikada 120 istek).
500Beklenmeyen sunucu hatasıInternal server error

Var olmayan bir adres (ör. yazım hatalı uç) JSON yerine HTML hata sayfası döndürür. İstemcinizde yanıt gövdesini çözmeden önce Content-Type başlığını kontrol edin.

Hız limiti

Her anahtarın dakikalık istek limiti vardır (varsayılan 120; yönetim ekranından 0–100.000 arası ayarlanır, 0 = sınırsız). Pencere kayan 60 saniyedir.

BaşlıkAnlamı
X-RateLimit-LimitDakikalık limit
X-RateLimit-RemainingBu pencerede kalan istek
Retry-After: 60Yalnız 429 yanıtında; bu kadar saniye bekleyin

Reddedilen (429) istekler de pencereye sayılır. Limite takıldığınızda yeniden denemeden önce Retry-After kadar bekleyin; aralıksız tekrar denemek bekleme süresini uzatır.

Ürünler

GET/api/v1/productsKapsam products:read

Ürünleri sayfalı listeler. Varsayılan sıralama en yeni ürün önce.

Parametreler

AdAçıklama
qÜrün adı, stok kodu (SKU) veya barkodda arama
category_idKategori kimliği
brand_idMarka kimliği
statusactive · passive · draft
featured1 öne çıkan · 0 diğerleri
in_stock1 stokta olan · 0 stokta olmayan
sortprice_asc · price_desc · name · oldest
page, per_pageSayfalama

Liste alanları

idskubarcodecategory_idbrand_idbrand_nameproduct_typenameslugpricecompare_pricevat_ratevat_includedstocklow_stock_thresholdstatusfeaturedpreorder_enabledimagevariant_countupdated_at

price satış fiyatı, compare_price üstü çizili (liste) fiyatıdır. image ana görselin göreli yoludur; tam adres için mağaza alan adının önüne ekleyin.

curl "https://magazaniz.com/api/v1/products?in_stock=1&sort=price_asc&per_page=50" \
  -H "X-API-KEY: $API_KEY"
GET/api/v1/products/{id}Kapsam products:read

Tek ürünün tüm ayrıntıları: liste alanları (görsel ve varyant sayısı hariç) ve aşağıdakiler.

descriptionmeta_titlemeta_descriptionweightshipping_desimin_order_qtymax_order_qtypreorder_notevideo_pathspecscreated_at

images[]: id, path, alt_text, sort_order, is_main — ana görsel önce.

variants[]: id, sku, barcode, attributes, price_diff, stock, status, price. Varyantın satış fiyatı price alanındadır (ürün fiyatı + price_diff).

PUT/api/v1/products/{id}/priceKapsam products:write

Ürünün satış fiyatını ve isteğe bağlı olarak üstü çizili fiyatını günceller. Değerler iki basamağa yuvarlanır. Yanıtta ürünün güncel detayı döner ve product.price_changed webhook'u gönderilir.

AlanTürKural
pricesayıZorunlu, 0 veya üstü
compare_pricesayıİsteğe bağlı, 0 veya üstü. null göndermek mevcut değeri silmez; değiştirmek için yeni değer gönderin.
curl -X PUT https://magazaniz.com/api/v1/products/128/price \
  -H "X-API-KEY: $API_KEY" -H "Content-Type: application/json" \
  -d '{"price": 449.90, "compare_price": 599.90}'

Varyant fiyatları bu uçla değişmez; varyant fiyatı ürün fiyatı + price_diff olarak hesaplanır.

Kategoriler ve markalar

GET/api/v1/categoriesKapsam categories:read

Aktif kategorilerin tamamı (sayfasız), sıralama sırasına göre. Alanlar: id, parent_id, slug, name, image, sort_order, status, product_count. Ağaç yapısını parent_id ile kurun.

GET/api/v1/categories/{id}Kapsam categories:read

Tek kategori: listedeki alanlara ek description, meta_title, meta_description, created_at. Pasif kategoriler de döner.

GET/api/v1/brandsKapsam brands:read

Aktif markaların tamamı (sayfasız). Alanlar: id, name, slug, image, status, sort_order, product_count.

GET/api/v1/brands/{id}Kapsam brands:read

Tek marka: id, name, slug, image, status, sort_order, created_at.

Siparişler

GET/api/v1/ordersKapsam orders:read

Siparişleri en yeniden eskiye sayfalı listeler.

ParametreDeğerler
statuspending · confirmed · processing · shipped · delivered · cancelled · refunded
typeb2c perakende · b2b bayi
approval_statusnot_required · pending · approved · rejected
sourceSipariş kaynağı, ör. online, manual, store, trendyol, hepsiburada
date_from, date_toYYYY-MM-DD; günün başı ve sonu dahil
page, per_pageSayfalama
idorder_numbertypeorder_sourcestatusapproval_statusshipment_statusreturn_statuscancel_statussubtotalshipping_costdiscounttotalcurrencycustomer_namecargo_companytracking_numberitem_countcreated_at

Yeni siparişleri anında almak için order.created webhook'una abone olun; kaçırılanları tamamlamak için bu ucu belirli aralıklarla date_from ile sorgulayın.

GET/api/v1/orders/{id}Kapsam orders:read

Siparişin tamamı. Listedeki alanlara ek olarak:

user_idrefund_statusrefund_amountgift_wrapgift_wrap_feepayment_feetotal_tax_amountcurrency_ratelangcustomer_emailguest_phoneshipping_addressbilling_addressselected_shipping_method_nameshipping_providercarrier_preference_codeestimated_desimanual_desipayment_methodmarketplace_platformmarketplace_barcodeshipped_atdelivered_atupdated_at

Adresler JSON nesnesi olarak döner. items[]: id, product_id, variant_id, product_name, product_sku, qty, unit_price, vat_rate, vat_amount, total.

PATCH/api/v1/orders/{id}Kapsam orders:write

Sipariş durumunu ve kargo bilgisini günceller. Tüm alanlar isteğe bağlıdır; yalnız gönderilenler değişir.

AlanKural
statuspending · confirmed · processing · shipped · delivered · cancelled · refunded
cargo_companyMetin, en fazla 100 karakter
tracking_numberMetin, en fazla 100 karakter
curl -X PATCH https://magazaniz.com/api/v1/orders/5021 \
  -H "X-API-KEY: $API_KEY" -H "Content-Type: application/json" \
  -d '{"status": "shipped", "cargo_company": "Aras Kargo", "tracking_number": "3450012345"}'

Değişiklik yoksa 200 ve "Değişiklik yok." döner; aynı isteği tekrar göndermek güvenlidir. Durum değiştiyse order.status_changed webhook'u gönderilir.

Yalnız kayıt güncellenir. Bu uç iade/para hareketi yapmaz, stoğu geri eklemez, müşteriye bildirim göndermez, kargo etiketi oluşturmaz ve kargoya veriliş/teslim tarihlerini doldurmaz. Durum geçişleri sınırlandırılmaz; iş akışınıza uygun sırayı istemcinizde uygulayın.

Kargo gönderisi

GET/api/v1/orders/{id}/shipmentKapsam shipping:read

Siparişin son kargo gönderisi: id, order_id, provider, carrier, tracking_number, tracking_url, status, desi, weight_kg, created_at, updated_at. Gönderi yoksa 404.

POST/api/v1/orders/{id}/shipmentKapsam shipping:write

Mağazanın kargo entegrasyonuyla gerçek bir kargo gönderisi ve barkod oluşturur; kargo ücreti mağaza cüzdanından çekilir. Gövde isteğe bağlıdır: {"carrier_code": "…"} ile kargo firması seçilir; boşsa siparişin tercih ettiği, o da yoksa mağazanın ana kargo firması kullanılır.

Siparişin zaten aktif bir gönderisi varsa yeni gönderi oluşturulmaz, mevcut gönderi döner (tekrar denemek güvenlidir). Dijital ürün siparişlerinde gönderi oluşturulmaz ve yanıtta "skipped": true gelir. Başarıda shipment.created webhook'u gönderilir.

Hata kodu (errors.error)HTTPAnlamı
order_not_found404Sipariş bu mağazada yok
no_active_carrier409Mağazada aktif kargo entegrasyonu yok
order_cancelled409İptal/iade edilmiş siparişe gönderi oluşturulamaz
address_incomplete422Teslimat adresinde şehir/adres eksik
no_rate_available422Bu gönderi için fiyat bulunamadı
wallet_hold_failed422Cüzdan bakiyesi yetersiz ya da ücret ayrılamadı
invalid_package: …422Paket ölçü/ağırlık bilgisi geçersiz
diğer422Kargo gönderisi oluşturulamadı

Stok

GET/api/v1/stockKapsam stock:read

Ürün stoklarını sayfalı listeler. Parametreler: state (in_stock · low_stock · out_of_stock), q (ad, SKU, barkod), page, per_page.

Alanlar: product_id, sku, barcode, name, stock, low_stock_threshold, status, stock_state.

GET/api/v1/stock/{productId}Kapsam stock:read

Tek ürünün stoğu ve variants[]: id, sku, barcode, attributes, stock, status, stock_state.

PUT/api/v1/stock/{productId}Kapsam stock:write

Stoğu mutlak değere ayarlar (artırma/azaltma değil). Varyantlı üründe variant_id gönderin.

AlanKural
stockZorunlu tam sayı, 0 veya üstü (ondalık gönderilirse tam sayıya indirilir)
variant_idİsteğe bağlı; ürüne ait varyant kimliği
curl -X PUT https://magazaniz.com/api/v1/stock/128 \
  -H "X-API-KEY: $API_KEY" -H "Content-Type: application/json" \
  -d '{"variant_id": 904, "stock": 25}'

Yanıt: {"product_id":128,"variant_id":904,"stock":25}. Her başarılı çağrıda stock.changed webhook'u gönderilir.

Not: API ile yapılan stok güncellemesi mağazanın stok hareketleri raporuna satır eklemez ve düşük stok uyarısı tetiklemez. Değişiklikler yönetim panelindeki API & Webhook › Aktivite denetim izinde görünür.

Webhook'lar

Webhook, seçtiğiniz olay gerçekleştiğinde mağazanın sizin adresinize gönderdiği HTTPS POST isteğidir. Yönetim panelinde API & Webhook › Webhook'lar sekmesinden HTTPS adresinizi ve olayları seçerek eklenir. Oluştururken gösterilen imza anahtarını (secret) kopyalayın; bir daha gösterilmez.

Olaylar

OlayNe zamandata alanları
order.createdYeni sipariş: vitrin, yönetim paneli ve pazaryerinden aktarılan siparişler. Kartlı ödemede ödeme onaylandığında, diğer yöntemlerde sipariş oluştuğunda. Sipariş başına bir kez.order_id, order_number, status, type, source, total, currency, payment_method, item_count, created_at
order.status_changedSipariş durumu panelden veya API ile değiştiğindeorder_id, order_number, old_status, new_status, changed_via (admin | api)
stock.changedStok değiştiğinde: panel, stok hareketi, satış, APIproduct_id, variant_id, old, new, reason
product.price_changedSatış fiyatı panelden (tekil, toplu, hızlı düzenleme) veya API ile değiştiğindeproduct_id, old_price, new_price
shipment.createdKargo gönderisi API ile oluşturulduğundaorder_id, shipment_id, status, carrier, tracking_number
webhook.testPanelde Test gönder düğmesine basıldığında (abonelikten bağımsız)message, webhook_id

stock.changed içindeki reason: order_sale (satış), admin (ürün düzenleme), api, order_cancel (iptal iadesi), order_return (iade), ya da stok hareketi türü (ör. manual_in, manual_out). Olaylar yalnız değer gerçekten değiştiğinde gönderilir.

İstek

HTTP
POST /sizin/webhook/adresiniz HTTP/1.1
Content-Type: application/json
User-Agent: SUSOFTECH-Webhook/1.0
X-Webhook-Event: stock.changed
X-Webhook-Delivery: 3f9a1c7e2b8d4a60b1e5c9d7a2f4e816
X-Webhook-Signature: sha256=5d1c9e…

{"id":"3f9a1c7e2b8d4a60b1e5c9d7a2f4e816","event":"stock.changed","data":{"product_id":128,"variant_id":904,"old":5,"new":25,"reason":"api"},"timestamp":1760443200}
ÖzellikDavranış
BaşarıHerhangi bir 2xx yanıt. Gövde içeriği önemsizdir.
Zaman aşımıBağlantı 3 sn, toplam 5 sn. Uzun işleri kuyruğa alıp hemen 200 dönün.
Teslim zamanıOlaylar kuyruğa alınır ve genellikle birkaç saniye, en geç yaklaşık 1 dakika içinde gönderilir. Mağaza işlemi sizin yanıtınızı beklemez.
Yeniden deneme2xx dışı yanıt veya zaman aşımında 1, 5, 30, 120 ve 360 dakika sonra tekrar denenir (toplam 6 deneme). Sonra teslimat başarısız sayılır.
Tekrar ayıklamaAynı teslimatın tekrar denemeleri aynı X-Webhook-Delivery / id değerini taşır. İşlediğiniz id'leri saklayıp tekrarları atlayın. Sıra garanti değildir.
Otomatik duraklatmaArt arda 10 teslimat tüm denemelerde başarısız olursa webhook duraklatılır. Panelden yeniden aktifleştirince sayaç sıfırlanır.
timestampOlayın Unix zamanı (saniye). İmza kapsamındadır; tekrar oynatmaya karşı eski olayları reddetmek için kullanın.

İmza doğrulama

X-Webhook-Signature değeri, ham istek gövdesinin imza anahtarınızla HMAC-SHA256 özetidir (küçük harf onaltılık, başında sha256=). Gövdeyi çözmeden önce ham baytlar üzerinden doğrulayın ve sabit zamanlı karşılaştırma kullanın.

$raw    = file_get_contents('php://input');
$secret = getenv('SUSOFTECH_WEBHOOK_SECRET');
$beklen = 'sha256=' . hash_hmac('sha256', $raw, $secret);
$gelen  = $_SERVER['HTTP_X_WEBHOOK_SIGNATURE'] ?? '';

if (!hash_equals($beklen, $gelen)) { http_response_code(401); exit; }

$olay = json_decode($raw, true);
if (abs(time() - (int) $olay['timestamp']) > 300) { http_response_code(400); exit; } // 5 dk'dan eski
// işi kuyruğa al …
http_response_code(200);

Mağaza panelindeki API ekranı

Mağaza yönetim panelinde API & Webhook sayfası (/admin/api, Platinum) üç sekmeden oluşur:

Sekmeİşlemler
AnahtarlarAnahtar oluşturma (ad, dakikalık limit, son kullanma, kapsamlar, izinli IP'ler); mevcut anahtarın kapsam, limit, bitiş ve IP listesini düzenleme; iptal. Anahtar değeri yalnız oluşturulduğunda bir kez gösterilir.
Webhook'larHTTPS adresi ve olaylarla webhook ekleme (olay seçilmezse tüm olaylar), duraklatma/aktifleştirme, silme. Listede durum, art arda hata sayısı ve son teslim zamanı görünür. Test gönder düğmesi adresinize hemen bir webhook.test olayı yollar ve dönen HTTP kodunu gösterir. Son Teslimatlar tablosu son 30 teslimatın olayını, durumunu, HTTP kodunu ve deneme sayısını listeler. Adres veya olayları değiştirmek için webhook'u silip yeniden ekleyin.
AktiviteToplam, son 24 saat ve hatalı istek sayıları; son 50 yazma işleminin denetim izi (eski → yeni değer, anahtar, IP); son 50 isteğin kaydı (yöntem, yol, durum kodu, süre).

Sınırlar ve öneriler

  • Sunucudan çağırın. CORS desteği yoktur; anahtarı tarayıcıya, mobil uygulamaya veya herkese açık depoya koymayın.
  • Her entegrasyona ayrı anahtar. ERP, depo, muhasebe gibi her sisteme yalnız gereken kapsamlarla ayrı anahtar açın; biri sızarsa yalnız onu iptal edersiniz.
  • Sabit IP'niz varsa İzinli IP'ler listesini doldurun.
  • Kargo gönderisi ücretlidir. POST …/shipment gerçek barkod oluşturur ve mağaza cüzdanından ücret çeker; testleri dikkatle yapın.
  • Stok mutlak değerdir. Eşzamanlı satışlarda üzerine yazmamak için güncellemeden hemen önce okuyun ya da tek yönlü senkron (ERP → mağaza) kurun.
  • Webhook'u tek kaynak yapmayın. Tekrar denemeler olsa da adresiniz uzun süre kapalı kalırsa olay kaybolabilir; kritik verileri belirli aralıklarla API ile karşılaştırın.
  • Hız limiti için toplu senkronlarda per_page=100 kullanın ve X-RateLimit-Remaining başlığını izleyin.
  • Bu sürümde ürün oluşturma/silme, kategori/marka yazma, müşteri verisi ve sipariş oluşturma uçları yoktur.

Değişiklik günlüğü

14.10.2026
order.created tüm kaynaklardan gönderiliyor; teslim kuyruğu ve 6 tekrar deneme; X-Webhook-Delivery başlığı; panelde Test gönder.

Bu doküman Ekim 2026 itibarıyla API'nin çalışan davranışını anlatır. Soru ve talepler için destek kanalımızı kullanın.

WhatsApp