Forsid Start · İlk 100 girişimciye özel

Yeni Forsid Start paketi, yalnızca ₺5.000

E-ticarete yeni başlayan girişimciler için birebir fırsat, kontenjan dolunca fiyat yükselir.

Hemen Başla
Geliştiriciler

Forsid REST API

Ürün, stok, müşteri ve sipariş verilerinizi ERP, muhasebe, pazaryeri ya da kendi yazılımınızla çift yönlü senkronize edin.

REST ve JSON OAuth 2.0 Sürüm v1
Temel adres https://magazaniz.com/api/v1

Genel bakış

Forsid REST API, mağazanızdaki verilere dış sistemlerden güvenli şekilde erişmenizi sağlar. Her mağazanın kendi API adresi vardır ve istekler mağazanın alan adına yapılır.

Tüm istek ve yanıtlar JSON biçimindedir. Tarihler ISO 8601 biçiminde ve Türkiye saatiyle döner. Tutar alanları iki ondalık basamaklı sayıdır. Her yanıtta meta alanı içinde request_id bulunur, destek talebinde bu değeri paylaşmanız sorunu hızla bulmamızı sağlar.

Katalog Ürün, varyant, görsel, kategori ve stok yönetimi
Müşteriler Kayıtlar, bireysel ve kurumsal adresler
Siparişler Sipariş okuma, durum, kargo ve ödeme işlemleri
Erişim nasıl açılır Forsid panelinde Genel Ayarlar altındaki Web Servis ekranından bir API kullanıcısı oluşturun. Client ID ve Client Secret bilgileri bu ekranda verilir. Her entegrasyon için ayrı kullanıcı açmanızı öneririz.
Örnek yanıt
200
{
  "data": {
    "id": 1042,
    "sku": "KLK-1042",
    "name": "Kablosuz Kulaklık",
    "price": 1960.0,
    "stock": 24
  },
  "meta": {
    "request_id": "5c3bf4ed-fe66-43ab-8d43-a1dbbf443163",
    "server_time": "2026-10-24T09:30:00Z"
  }
}

Kimlik doğrulama

API, OAuth 2.0 client credentials akışını kullanır. Client ID ve Client Secret ile token adresine istek atarak bir saat geçerli erişim tokenı alırsınız. Sonraki tüm isteklerde bu tokenı Authorization başlığında gönderirsiniz.

  1. 1
    Token alın

    Token adresine grant_type, client_id ve client_secret gönderin. Bilgiler JSON gövdede, form gövdesinde ya da Basic Authorization başlığında gönderilebilir.

  2. 2
    İstek atın

    Dönen access_token değerini Authorization başlığına Bearer önekiyle ekleyin.

  3. 3
    Süre dolunca yenileyin

    expires_in alanı saniye cinsinden süreyi verir. 401 invalid_token yanıtı aldığınızda yeni token alın.

POST/oauth/token
Gövde parametreleri
grant_type metin zorunlu
Her zaman client_credentials.
client_id metin zorunlu
Panelde verilen Client ID.
client_secret metin zorunlu
Panelde verilen Client Secret.
scope metin
Tokenı daha dar izinlerle almak için boşlukla ayrılmış izin listesi. Gönderilmezse kullanıcının tüm izinleri verilir.
Client Secret bir parola gibidir Secret sadece oluşturulduğu anda bir kez gösterilir. Tarayıcıda çalışan kodlara ya da mobil uygulamalara koymayın, sadece sunucu tarafında saklayın. Sızdığından şüphelenirseniz panelden yenileyin, eski secret ve açık tokenlar hemen geçersiz olur.
curl -X POST https://magazaniz.com/api/v1/oauth/token \
  -H "Content-Type: application/json" \
  -d '{
    "grant_type": "client_credentials",
    "client_id": "fsd_...",
    "client_secret": "fsk_..."
  }'
Yanıt
200
{
  "access_token": "fat_9c1e4b...",
  "token_type": "Bearer",
  "expires_in": 3600,
  "scope": "products.read products.write orders.read"
}

İzinler

Her API kullanıcısına panelden sadece ihtiyaç duyduğu alanlarda izin verilir. Yazma izni verilen alanda okuma izni de kendiliğinden açılır. İzni olmayan bir uca istek atıldığında 403 insufficient_scope döner ve eksik izin details.required alanında listelenir.

İzinKapsam
products.readÜrün, varyant, kategori, marka ve özellik listeleri
products.writeÜrün ve varyant oluşturma, güncelleme ve silme
inventory.writeToplu stok ve fiyat güncelleme
customers.readMüşteri ve adres okuma
customers.writeMüşteri ve adres oluşturma, güncelleme, adres silme
orders.readSipariş listesi ve detayı
orders.writeSipariş durumu, kargo takip bilgisi ve ödeme onayı

İzin değişiklikleri anında geçerli olur. Panelden bir izni kaldırdığınızda daha önce alınmış tokenlar da o uca erişemez. IP kısıtlaması tanımlanmışsa listede olmayan adreslerden gelen istekler 403 ip_not_allowed alır.

GET /me

Tokenın hangi kullanıcıya ait olduğunu ve verilen izinleri döner. Bağlantı testi için kullanabilirsiniz.

İstek
curl https://magazaniz.com/api/v1/me \
  -H "Authorization: Bearer fat_9c1e4b..."
Yanıt
200
{
  "data": {
    "name": "Muhasebe Entegrasyonu",
    "client_id": "fsd_b11ff8a360ba3527362154e5",
    "scopes": ["orders.read", "orders.write", "products.read"],
    "store": {
      "name": "Mağaza Adı",
      "url": "https://magazaniz.com"
    }
  }
}

Hatalar

Başarılı istekler 200 ya da 201 döner. Hata durumunda HTTP durum kodu ile birlikte error nesnesi gelir. code alanı makine tarafından okunmak içindir ve değişmez, message alanı Türkçe açıklamadır. Doğrulama hatalarında details alanı her hatalı alanı ayrı ayrı listeler.

HTTPcodeAnlamı
400invalid_jsonGövde geçerli bir JSON nesnesi değil
401unauthorizedAuthorization başlığı eksik
401invalid_tokenToken geçersiz ya da süresi dolmuş
401client_disabledAPI kullanıcısı panelden kapatılmış
403insufficient_scopeBu uç için izin yok
403ip_not_allowedİstek izin verilmeyen bir IP adresinden geldi
404not_foundKayıt ya da uç bulunamadı
405method_not_allowedUç bu HTTP yöntemini desteklemiyor
409already_paidSiparişin ödemesi zaten onaylı
415unsupported_media_typeGövde JSON değil, Content-Type application/json olmalı
422validation_failedGönderilen veriler geçersiz, ayrıntı details içinde
422read_only_productBu ürün türü API ile değiştirilemez
422invalid_transitionSipariş bu duruma geçirilemez
422invalid_stateİşlem siparişin mevcut durumunda yapılamaz
422last_variantÜrünün son varyantı silinemez
423order_lockedSipariş geçici olarak kilitli
429rate_limitedDakikalık istek sınırı aşıldı
500server_errorBeklenmeyen hata, request_id ile bize bildirin
503service_unavailableWeb servis bu mağazada henüz etkin değil

Token adresi OAuth 2.0 standardına uygun olarak farklı bir yapı kullanır. Hata durumunda error ve error_description alanları döner, örneğin invalid_client, invalid_scope ya da unsupported_grant_type.

Doğrulama hatası
422
{
  "error": {
    "code": "validation_failed",
    "message": "Gönderilen veriler geçersiz. Standart ürün için price zorunludur.",
    "details": {
      "price": ["Standart ürün için price zorunludur."],
      "variants.1.sku": ["Yeni varyant için sku zorunludur."]
    }
  },
  "meta": {
    "request_id": "e7f2dada-92f2-42fa-bc28-0f959bbe07b0",
    "server_time": "2026-10-24T09:30:00Z"
  }
}
Token hatası
401
{
  "error": "invalid_client",
  "error_description": "Kimlik bilgileri geçersiz."
}

Limitler

İstekler API kullanıcısı başına dakikalık olarak sınırlanır. Sınır panelde kullanıcı bazında 60, 120, 300 ya da 600 olarak seçilir, varsayılan 120 istektir. Her yanıtta kalan hakkınız başlıklarda bildirilir. Sınır aşıldığında 429 rate_limited döner ve Retry-After başlığı kaç saniye beklemeniz gerektiğini söyler.

Yanıt başlıkları
X-RateLimit-Limit integer
Dakikalık toplam istek hakkı.
X-RateLimit-Remaining integer
Bu dakika içinde kalan istek hakkı.
Retry-After integer
Sadece 429 yanıtında gelir. Tekrar denemeden önce beklenecek saniye.
X-Request-Id metin
İsteğin takip numarası. İsterseniz kendi değerinizi aynı başlıkla gönderebilirsiniz.
SınırDeğer
Token isteğiDakikada 60, aynı bilgilerle 20 hatalı deneme
Liste sayfa boyutuEn fazla 100 kayıt
ids filtresiEn fazla 200 id
Toplu stok ve fiyatİstek başına 200 kalem
Ürün başına varyantİstek başına 200 varyant
Görsel adresiİstek başına 20, galeride 20, varyantta 10
Görsel dosyasıEn fazla 10 MB ve 12000 piksel
Toplu işlemlerde öneri Stok ve fiyat güncellemelerini tek tek ürün güncellemesi yerine toplu stok ve fiyat ucuyla 200 kalemlik paketler halinde gönderin. 429 aldığınızda Retry-After süresi kadar bekleyip aynı isteği tekrarlayın.
Sınır aşıldığında
429
HTTP/1.1 429 Too Many Requests
Retry-After: 42
X-RateLimit-Limit: 120
X-RateLimit-Remaining: 0

{
  "error": {
    "code": "rate_limited",
    "message": "Dakikalık istek sınırı aşıldı.",
    "details": { "retry_after": 42 }
  }
}

Sayfalama ve senkronizasyon

Tüm liste uçları sayfalı döner ve aşağıdaki ortak parametreleri kabul eder. Sayfalama bilgisi meta.pagination içinde gelir. last_page değerine ulaşana kadar page değerini artırarak tüm kayıtları alabilirsiniz.

Ortak liste parametreleri
page integer
Sayfa numarası. Varsayılan 1.
per_page integer
Sayfa başına kayıt. Varsayılan 50, en fazla 100.
updated_since tarih
Bu tarihten sonra güncellenen kayıtlar. ISO 8601 biçiminde gönderin.
created_since tarih
Bu tarihten sonra oluşturulan kayıtlar.
ids metin
Virgülle ayrılmış id listesi. En fazla 200 id.

Değişiklikleri çekmek

  1. 1
    İlk senkronizasyon

    Tüm kayıtları sayfa sayfa çekin ve ilk yanıttaki meta.server_time değerini saklayın.

  2. 2
    Sonraki çalışmalar

    updated_since parametresine sakladığınız zamanı vererek sadece değişen kayıtları çekin. Yeni server_time değerini saklayın.

  3. 3
    Güvenlik payı

    Saat farklarına karşı updated_since değerini birkaç dakika geriden göndermenizi öneririz. Aynı kaydın iki kez gelmesi sorun yaratmaz, id ile eşleştirin.

İstek
curl "https://magazaniz.com/api/v1/orders?updated_since=2026-10-24T09:00:00%2B03:00&per_page=100&page=2" \
  -H "Authorization: Bearer fat_9c1e4b..."
Yanıt
200
{
  "data": [ ... ],
  "meta": {
    "request_id": "7d798764-4ae0-4f86-8952-0c620f32a261",
    "server_time": "2026-10-24T09:31:12Z",
    "pagination": {
      "page": 2,
      "per_page": 100,
      "total": 248,
      "last_page": 3
    }
  }
}

Ürünler

Ürünleri çevirileri, fiyatları, stokları, kategorileri, görselleri ve varyantlarıyla birlikte okuyun. API ile standart ve varyantlı ürünler oluşturulup güncellenebilir. Baskı, tasarım, teklif ve harici ürünler API üzerinden sadece okunur.

Ürünleri listele

GET /products products.read
Filtreler
sku metin
Ürün ya da varyant SKU değeriyle tam eşleşme.
barcode metin
Ürün ya da varyant barkoduyla tam eşleşme.
type metin
standard, variant, external, quote, designer ya da print.
is_active boolean
Sadece aktif ya da pasif ürünler.
category_id integer
Bu kategorideki ürünler.
brand_id integer
Bu markanın ürünleri.
q metin
Ürün adı, SKU ya da barkodda arama.
page integer
Sayfa numarası. Varsayılan 1.
per_page integer
Sayfa başına kayıt. Varsayılan 50, en fazla 100.
updated_since tarih
Bu tarihten sonra güncellenen kayıtlar. ISO 8601 biçiminde gönderin.
created_since tarih
Bu tarihten sonra oluşturulan kayıtlar.
ids metin
Virgülle ayrılmış id listesi. En fazla 200 id.
İstek
curl "https://magazaniz.com/api/v1/products?category_id=5&is_active=1&per_page=50" \
  -H "Authorization: Bearer fat_9c1e4b..."

Ürün detayı

GET /products/{id} products.read

Listedeki alanlara ek olarak çevirilerde description ve short_description alanlarını, baskı ürünlerinde print_tiers adet kademelerini döner.

Ürün nesnesi
id integer
Ürün id değeri.
type metin
Ürün türü.
sku, barcode, product_code metin
Stok kodu, barkod ve ürün kodu.
name metin
Mağaza dilindeki ürün adı.
translations dizi
Dil bazında ad, slug, açıklamalar ve SEO alanları.
brand nesne
Marka id ve adı ya da null.
categories dizi
Kategoriler. is_primary ana kategoriyi belirtir.
price, discount_price sayı
Normal ve indirimli fiyat. Varyantlı üründe null, fiyatlar varyantlarda.
vat_rate, price_includes_vat sayı, boolean
KDV oranı ve fiyatın KDV dahil olup olmadığı.
stock integer
Tüm depolardaki toplam stok. Varyantlı üründe varyantların toplamı.
dimensions nesne
weight, width, height, depth ve desi.
images dizi
Görsel adresleri. variant_id dolu olanlar varyant görselidir.
variants dizi
Varyantlar, fiyatları, stokları ve özellikleri.
Yanıt
200
{
  "data": {
    "id": 10,
    "type": "variant",
    "sku": "TSHIRT-OVERSIZE",
    "barcode": "",
    "name": "Oversize Pamuklu Tişört",
    "translations": [
      {
        "locale": "tr",
        "name": "Oversize Pamuklu Tişört",
        "slug": "oversize-pamuklu-tisort",
        "short_description": "%100 pamuk, unisex.",
        "description": "<p>%100 pamuk, oversize kesim.</p>",
        "meta_title": "Oversize Pamuklu Tişört",
        "meta_description": ""
      }
    ],
    "brand": { "id": 3, "name": "Forsid Basics" },
    "default_category_id": 5,
    "categories": [
      { "id": 5, "name": "Tişört", "is_primary": true }
    ],
    "is_active": true,
    "is_available_for_order": true,
    "price": null,
    "discount_price": null,
    "vat_rate": 20,
    "price_includes_vat": true,
    "stock": 24,
    "dimensions": { "weight": 0.25, "width": null, "height": null, "depth": null, "desi": null },
    "images": [
      { "url": "https://magazaniz.com/storage/products/on.jpg", "is_main": true, "variant_id": null, "position": 0 }
    ],
    "variants": [
      {
        "id": 13,
        "sku": "TSHIRT-OVERSIZE-SIYAH-S",
        "barcode": "8690000000013",
        "is_active": true,
        "is_default": true,
        "position": 0,
        "price": 790,
        "discount_price": 650,
        "stock": 12,
        "attributes": [
          { "attribute_id": 1, "attribute": "Renk", "value_id": 1, "value": "Siyah" },
          { "attribute_id": 2, "attribute": "Beden", "value_id": 3, "value": "S" }
        ],
        "dimensions": { "weight": null, "width": null, "height": null, "depth": null, "desi": null }
      }
    ],
    "created_at": "2026-10-14T12:58:24+03:00",
    "updated_at": "2026-10-24T09:12:03+03:00"
  }
}

Ürün oluştur

POST /products products.write

Standart ürün için price zorunludur. Varyantlı üründe fiyat ve stok ürün seviyesinde gönderilmez, variants listesinde her varyant için ayrı verilir. Başarılı istekte 201 ve oluşan ürünün tam hali döner.

Gövde parametreleri
type metin zorunlu
standard ya da variant.
sku metin zorunlu
Harf, rakam ve tire. Tüm ürün ve varyantlarda benzersiz olmalıdır, silinmiş ürünlerin SKU değeri de tekrar kullanılamaz.
name metin translations yoksa
Mağaza dilindeki ürün adı.
description, short_description HTML
Açıklamalar. Güvenlik için script, iframe, olay öznitelikleri ve javascript bağlantıları temizlenir.
slug, meta_title, meta_description metin
SEO alanları. slug boşsa addan üretilir, çakışırsa sonuna sayı eklenir.
translations dizi
Diğer diller için locale, name, slug, description, short_description, meta_title, meta_description.
barcode, product_code metin
Benzersiz olmalıdır.
brand_id integer
Marka id değeri.
category_ids dizi
Kategori id listesi. En fazla 50.
primary_category_id integer
Ana kategori. Boşsa listedeki ilk kategori ana kategori olur.
price sayı standartta
Normal satış fiyatı.
discount_price sayı
İndirimli fiyat. Normal fiyattan düşük olmalıdır.
vat_rate sayı
KDV oranı. Boşsa mağazanın varsayılan oranı kullanılır.
price_includes_vat boolean
Fiyatlar KDV dahil mi. Boşsa mağaza vergi ayarı kullanılır.
stock integer
Varsayılan depodaki stok.
stocks dizi
Depo bazında stok, warehouse_id ve quantity. stock ile birlikte gönderilemez.
images dizi
Görsel adresleri ya da url ve image_id içeren nesneler. İlk görsel ana görsel olur.
variants dizi varyantlıda
Varyant listesi. Alanlar Varyantlar bölümünde.
is_active boolean
Varsayılan true.
is_available_for_order, is_featured boolean
Siparişe açık ve öne çıkan ürün seçenekleri.
min_order_quantity, max_order_quantity integer
Sipariş adet sınırları. En az 1.
delivery_time metin
Teslim süresi metni.
weight, width, height, depth sayı
Ağırlık ve ölçüler. Desi otomatik hesaplanır.
İstek
curl -X POST https://magazaniz.com/api/v1/products \
  -H "Authorization: Bearer fat_9c1e4b..." \
  -H "Content-Type: application/json" \
  -d '{
    "type": "standard",
    "sku": "KUPA-SERAMIK-01",
    "barcode": "8690000000011",
    "name": "Seramik Kupa",
    "description": "<p>El yapımı seramik kupa.</p>",
    "category_ids": [5, 12],
    "brand_id": 3,
    "price": 450,
    "discount_price": 399.9,
    "vat_rate": 20,
    "price_includes_vat": true,
    "stocks": [
      { "warehouse_id": 1, "quantity": 25 },
      { "warehouse_id": 2, "quantity": 10 }
    ],
    "weight": 0.4,
    "width": 10,
    "height": 12,
    "depth": 10,
    "images": [
      "https://cdn.ornek.com/kupa-on.jpg",
      "https://cdn.ornek.com/kupa-yan.jpg"
    ]
  }'
Yanıt
201
{
  "data": {
    "id": 18,
    "type": "standard",
    "sku": "KUPA-SERAMIK-01",
    "name": "Seramik Kupa",
    "price": 450,
    "discount_price": 399.9,
    "vat_rate": 20,
    "price_includes_vat": true,
    "stock": 35,
    "dimensions": { "weight": 0.4, "width": 10, "height": 12, "depth": 10, "desi": 0.4 },
    "images": [
      { "url": "https://magazaniz.com/storage/products/api/2026/10/a1b2.jpg", "is_main": true, "variant_id": null, "position": 0 }
    ]
  }
}

Ürün güncelle

PATCH /products/{id} products.write

Sadece gönderdiğiniz alanlar güncellenir, gönderilmeyen alanlar olduğu gibi kalır. Oluşturma ucundaki tüm alanlar kullanılabilir, type değiştirilemez.

  • Ad değiştiğinde slug korunur, böylece ürün bağlantısı ve SEO değeri bozulmaz. Yeni slug için slug alanını gönderin.
  • category_ids gönderilirse kategoriler bu listeyle değiştirilir, boş dizi tüm kategorileri kaldırır.
  • images gönderilirse ürün galerisi bu listeyle değiştirilir. Mevcut görseli korumak için image_id gönderin. Varyant görselleri etkilenmez.
  • stock ya da stocks gönderildiğinde stok verilen adede ayarlanır, eklenmez.
  • vat_rate ya da price_includes_vat değişikliği ürünün ve tüm varyantlarının fiyatlarına uygulanır.
İstek
curl -X PATCH https://magazaniz.com/api/v1/products/18 \
  -H "Authorization: Bearer fat_9c1e4b..." \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Seramik Kupa 350 ml",
    "price": 500,
    "discount_price": null,
    "stocks": [{ "warehouse_id": 2, "quantity": 0 }],
    "is_featured": true
  }'

Ürün sil

DELETE /products/{id} products.write

Ürünü panelden silmekle aynı şekilde siler. Geçmiş siparişlerdeki ürün bilgileri korunur. Sadece standart ve varyantlı ürünler silinebilir.

Yanıt
200
{
  "data": { "id": 18, "deleted": true }
}

Varyantlar ve görseller

Varyantlı ürünlerde her varyant bir özellik kombinasyonudur, örneğin Renk Siyah ve Beden M. Varyantlar ürün oluşturulurken ya da güncellenirken variants listesiyle gönderilir.

Varyant alanları

id integer güncellemede
Mevcut varyantı güncellemek için gönderilir. Gönderilmezse yeni varyant oluşturulur.
sku metin yeni varyantta
Harf, rakam ve tire içerebilir. Tüm ürün ve varyantlar arasında benzersiz olmalıdır.
barcode metin
Barkod ya da GTIN.
price sayı yeni varyantta
Normal satış fiyatı.
discount_price sayı
İndirimli fiyat. Normal fiyattan düşük olmalıdır. null ya da 0 gönderilirse indirim kaldırılır.
stock integer
Varsayılan depodaki stok adedi.
stocks dizi
Depo bazında stok. Her eleman warehouse_id ve quantity içerir. stock ile birlikte gönderilemez.
attributes dizi yeni varyantta
Varyant özellikleri. Her eleman attribute_id ya da attribute adı ile value_id ya da value içerir.
images dizi
Varyant görselleri. En fazla 10 adet. Gönderilirse varyantın görselleri bu listeyle değiştirilir.
is_active boolean
Varyantın satışta olup olmadığı. Varsayılan true.
weight, width, height, depth sayı
Varyanta özel ağırlık ve ölçüler. Desi otomatik hesaplanır.

Özellik eşleştirme

  • Özellik ve değerler id ile ya da adıyla gönderilebilir. Adla gönderildiğinde büyük küçük harf ve Türkçe karakter farkı gözetilmeden mevcut tanımla eşleşir.
  • Eşleşen tanım yoksa özellik ya da değer mağaza dilinde otomatik oluşturulur.
  • Bir ürünün tüm varyantları aynı özellikleri kullanmalıdır ve aynı kombinasyon iki kez kullanılamaz.

Güncellemede varyantlar

  • id gönderilen varyant güncellenir, id olmayan satır yeni varyant olarak eklenir.
  • Listede olmayan varyantlar silinmez. Silmek için varyant silme ucunu kullanın.
  • Pasif varyantlar satıştan kalkar ama silinmez.
Varyantlı ürün oluşturma
curl -X POST https://magazaniz.com/api/v1/products \
  -H "Authorization: Bearer fat_9c1e4b..." \
  -H "Content-Type: application/json" \
  -d '{
    "type": "variant",
    "sku": "SWEAT-BASIC",
    "name": "Basic Sweatshirt",
    "category_ids": [5],
    "vat_rate": 20,
    "price_includes_vat": true,
    "images": ["https://cdn.ornek.com/sweat-genel.jpg"],
    "variants": [
      {
        "sku": "SWEAT-BASIC-SIYAH-S",
        "price": 900,
        "discount_price": 790,
        "stock": 5,
        "attributes": [
          { "attribute": "Renk", "value": "Siyah" },
          { "attribute": "Beden", "value": "S" }
        ],
        "images": ["https://cdn.ornek.com/sweat-siyah.jpg"]
      },
      {
        "sku": "SWEAT-BASIC-SIYAH-M",
        "price": 900,
        "stock": 7,
        "attributes": [
          { "attribute_id": 1, "value_id": 1 },
          { "attribute_id": 2, "value": "M" }
        ]
      }
    ]
  }'
Varyant güncelleme ve ekleme
curl -X PATCH https://magazaniz.com/api/v1/products/19 \
  -H "Authorization: Bearer fat_9c1e4b..." \
  -H "Content-Type: application/json" \
  -d '{
    "variants": [
      { "id": 30, "discount_price": 850, "stock": 10 },
      {
        "sku": "SWEAT-BASIC-SIYAH-L",
        "price": 950,
        "stock": 2,
        "attributes": [
          { "attribute": "Renk", "value": "Siyah" },
          { "attribute": "Beden", "value": "L" }
        ]
      }
    ]
  }'

Varyant sil

DELETE /products/{id}/variants/{variant_id} products.write

Varyantı siler ve stoğunu stok hareketleriyle birlikte düşer. Ürünün son varyantı silinemez, ürünü kaldırmak için ürün silme ucunu kullanın. Yanıt olarak ürünün güncel hali döner.

Görseller

  • Görseller herkese açık http ya da https adreslerinden indirilip mağazaya kaydedilir, karşı sunucuya bağlı kalınmaz.
  • JPG, PNG, WEBP ve GIF desteklenir. Dosya en fazla 10 MB ve 12000 piksel olabilir.
  • Herhangi bir görsel indirilemezse istek 422 ile reddedilir ve ürün hiç oluşmaz. Hangi görselin sorunlu olduğu details içinde belirtilir.
  • Yerel ağ ve iç adresler güvenlik nedeniyle kabul edilmez.
  • Daha önce yüklenmiş bir görseli tekrar indirmeden kullanmak için image_id gönderin.
Görsel hatası
422
{
  "error": {
    "code": "validation_failed",
    "message": "Görsel indirilemedi. Sunucu 404 döndü.",
    "details": {
      "variants.0.images.1.url": ["Görsel indirilemedi. Sunucu 404 döndü."]
    }
  }
}

Kategori, marka ve özellik

Ürünlere atanabilecek tanımları listeler. Ürün oluştururken ve güncellerken kullanacağınız id değerlerini buradan alırsınız. Üçü de products.read izni ister ve ortak liste parametrelerini kabul eder.

GET /categories products.read

Kategoriler üst kategori ve sıra bilgisiyle döner. Ağaç yapısını parent_id ile kurabilirsiniz.

Filtreler
parent_id integer
Bu kategorinin alt kategorileri. 0 gönderilirse sadece ana kategoriler.
GET /brands products.read

Markalar id, ad, slug ve web sitesi bilgisiyle döner.

GET /attributes products.read

Varyant ve filtre özelliklerini değerleriyle birlikte döner. Renk değerlerinde color alanı renk kodunu içerir.

GET /categories
200
{
  "data": [
    {
      "id": 5,
      "parent_id": null,
      "name": "Giyim",
      "level": 0,
      "position": 1,
      "is_active": true,
      "translations": [
        { "locale": "tr", "name": "Giyim", "slug": "giyim" }
      ],
      "updated_at": "2026-10-01T10:00:00+03:00"
    }
  ]
}
GET /attributes
200
{
  "data": [
    {
      "id": 1,
      "name": "Renk",
      "values": [
        { "id": 1, "value": "Siyah", "code": "siyah", "color": "#000000", "position": 1 },
        { "id": 2, "value": "Beyaz", "code": "beyaz", "color": "#ffffff", "position": 2 }
      ]
    }
  ]
}

Toplu stok ve fiyat

ERP ya da depo yazılımınızdan stok ve fiyatları hızlıca aktarmak için tasarlandı. Tek istekte 200 kaleme kadar güncelleme yapılır. Her kalem bağımsız işlenir, hatalı bir kalem diğerlerini engellemez.

POST /inventory inventory.write
items içindeki her kalem
variant_id integer biri zorunlu
Varyant id değeri.
product_id integer biri zorunlu
Standart ürün id değeri.
sku metin biri zorunlu
Önce varyantlarda, sonra ürünlerde aranır.
barcode metin biri zorunlu
Önce varyantlarda, sonra ürünlerde aranır.
stock integer
Yeni stok adedi. Verilen değere ayarlanır.
warehouse_id integer
Stoğun güncelleneceği depo. Boşsa varsayılan depo.
price sayı
Normal satış fiyatı.
discount_price sayı
İndirimli fiyat. 0 gönderilirse indirim kaldırılır.
  • Eşleştirme sırası variant_id, product_id, sku ve barcode şeklindedir.
  • Varyantlı ürünlerde güncelleme varyant bazında yapılır, ana ürün id değeri kabul edilmez.
  • Aynı SKU birden fazla kayıtta kullanılıyorsa kalem reddedilir, bu durumda id ile gönderin.
  • Baskı ürünlerinin fiyatı adet kademelerinden geldiği için bu uçtan değiştirilemez.
  • Sonuçlar gönderdiğiniz sırayla döner, index alanı kalemin sırasını belirtir.
İstek
curl -X POST https://magazaniz.com/api/v1/inventory \
  -H "Authorization: Bearer fat_9c1e4b..." \
  -H "Content-Type: application/json" \
  -d '{
    "items": [
      { "sku": "SWEAT-BASIC-SIYAH-S", "stock": 9 },
      { "barcode": "8690000000013", "price": 350, "discount_price": 320 },
      { "variant_id": 31, "stock": 4, "warehouse_id": 2 },
      { "sku": "OLMAYAN-SKU", "stock": 1 }
    ]
  }'
Yanıt
200
{
  "data": [
    { "index": 0, "status": "updated", "reference": { "sku": "SWEAT-BASIC-SIYAH-S" }, "product_id": 19, "variant_id": 29, "stock": 9, "price": 900, "discount_price": 790 },
    { "index": 1, "status": "updated", "reference": { "barcode": "8690000000013" }, "product_id": 10, "variant_id": 13, "stock": 12, "price": 350, "discount_price": 320 },
    { "index": 2, "status": "updated", "reference": { "variant_id": 31 }, "product_id": 19, "variant_id": 31, "stock": 4, "price": 950, "discount_price": null },
    { "index": 3, "status": "failed", "reference": { "sku": "OLMAYAN-SKU" }, "error": "Bu sku ile ürün ya da varyant bulunamadı." }
  ],
  "meta": { "updated": 3, "failed": 1 }
}

Müşteriler

Kayıtlı ve misafir müşterileri listeleyin, yeni müşteri açın ve bilgilerini güncelleyin. API ile açılan müşteriye varsayılan olarak davet epostası gönderilmez, isterseniz send_invitation ile gönderebilirsiniz.

Müşterileri listele

GET /customers customers.read
Filtreler
email metin
Eposta ile tam eşleşme, büyük küçük harf duyarsız.
phone metin
Telefon numarası. Son 10 hane ile eşleşir.
is_active boolean
Aktif ya da pasif müşteriler.
is_guest boolean
Misafir ya da kayıtlı müşteriler.
q metin
Ad, soyad, eposta ya da telefonda arama.
page integer
Sayfa numarası. Varsayılan 1.
per_page integer
Sayfa başına kayıt. Varsayılan 50, en fazla 100.
updated_since tarih
Bu tarihten sonra güncellenen kayıtlar. ISO 8601 biçiminde gönderin.
created_since tarih
Bu tarihten sonra oluşturulan kayıtlar.
ids metin
Virgülle ayrılmış id listesi. En fazla 200 id.

Müşteri detayı

GET /customers/{id} customers.read

Müşteri bilgilerine ek olarak stats alanında sipariş sayısını ve tamamlanan siparişlerin toplam tutarını döner.

Yanıt
200
{
  "data": {
    "id": 1,
    "first_name": "Ayşe",
    "last_name": "Yılmaz",
    "email": "ayse@ornek.com",
    "phone": "5551112233",
    "gender": "female",
    "birthday": "1990-05-04",
    "is_active": true,
    "is_guest": false,
    "group": { "id": 1, "name": "Standart" },
    "note": null,
    "addresses": [ ... ],
    "preferred_shipping_address_id": null,
    "preferred_billing_address_id": null,
    "registered_at": "2026-10-24T03:35:41+03:00",
    "created_at": "2026-10-24T03:35:41+03:00",
    "updated_at": "2026-10-24T03:37:42+03:00",
    "stats": { "orders_count": 4, "total_spent": 5240.5 }
  }
}

Müşteri oluştur

POST /customers customers.write
Gövde parametreleri
first_name, last_name metin zorunlu
Ad ve soyad.
email metin zorunlu
Benzersiz olmalıdır. Küçük harfe çevrilerek kaydedilir.
phone metin
Telefon numarası.
gender metin
male, female ya da unknown.
birthday tarih
Doğum tarihi.
is_active boolean
Varsayılan true.
note metin
Müşteri notu. En fazla 500 karakter.
send_invitation boolean
true ise müşteriye hesap etkinleştirme epostası gönderilir. Varsayılan false.
addresses dizi
En fazla 10 adres. Alanlar Adresler bölümünde.

Müşteri güncelle

PATCH /customers/{id} customers.write

Oluşturma ucundaki first_name, last_name, email, phone, gender, birthday, is_active ve note alanlarını kısmi olarak günceller. Adresler bu uçtan değişmez, adres uçlarını kullanın.

İstek
curl -X POST https://magazaniz.com/api/v1/customers \
  -H "Authorization: Bearer fat_9c1e4b..." \
  -H "Content-Type: application/json" \
  -d '{
    "first_name": "Ayşe",
    "last_name": "Yılmaz",
    "email": "ayse@ornek.com",
    "phone": "5551112233",
    "gender": "female",
    "addresses": [
      {
        "label": "Ev",
        "contact_name": "Ayşe Yılmaz",
        "contact_phone": "5551112233",
        "city": "İstanbul",
        "district": "Ataşehir",
        "address_line1": "Selvili Sk. No 4",
        "billing_type": "individual",
        "tckn": "11111111110"
      }
    ]
  }'

Adresler

Müşterinin teslimat ve fatura adreslerini yönetin. Bireysel adreslerde TC kimlik numarası, kurumsal adreslerde firma adı, vergi dairesi ve vergi numarası tutulur.

POST /customers/{id}/addresses customers.write
PATCH /customers/{id}/addresses/{address_id} customers.write
DELETE /customers/{id}/addresses/{address_id} customers.write
Adres alanları
address_line1 metin oluşturmada
Açık adres.
city metin city_id yoksa
İl adı.
city_id, district_id, country_id integer
Sistemdeki il, ilçe ve ülke id değerleri.
district, neighborhood, postal_code metin
İlçe, mahalle ve posta kodu.
address_line2 metin
Adres devamı.
country metin
Ülke adı. Varsayılan Türkiye.
label metin
Adres başlığı, örneğin Ev ya da İş.
contact_name, contact_phone, contact_email metin
Adresteki alıcının bilgileri.
billing_type metin
individual ya da corporate. Varsayılan individual.
tckn metin
Bireysel adreste TC kimlik numarası.
company_name, tax_office, tax_number metin
Kurumsal adreste firma ve vergi bilgileri.
  • İl ve ilçe sadece adla gönderilirse sistemdeki kayıtla otomatik eşleşir ve id değerleri doldurulur. Eşleşme büyük küçük harf ve Türkçe karakter farkına duyarsızdır.
  • Güncellemede il değişir ve ilçe gönderilmezse eski ilçe bilgisi temizlenir.
  • Silinen adres müşterinin tercih edilen adresiyse tercih kaldırılır.
İstek
curl -X POST https://magazaniz.com/api/v1/customers/1/addresses \
  -H "Authorization: Bearer fat_9c1e4b..." \
  -H "Content-Type: application/json" \
  -d '{
    "label": "Ofis",
    "contact_name": "Ayşe Yılmaz",
    "city": "ankara",
    "district": "çankaya",
    "address_line1": "Atatürk Blv. No 1",
    "billing_type": "corporate",
    "company_name": "Örnek Teknoloji AŞ",
    "tax_office": "Çankaya",
    "tax_number": "1234567890"
  }'
Yanıt
201
{
  "data": {
    "id": 4,
    "label": "Ofis",
    "contact_name": "Ayşe Yılmaz",
    "country": "Türkiye",
    "city": "Ankara",
    "city_id": 6,
    "district": "Çankaya",
    "district_id": 79,
    "address_line1": "Atatürk Blv. No 1",
    "billing_type": "corporate",
    "tckn": null,
    "company_name": "Örnek Teknoloji AŞ",
    "tax_office": "Çankaya",
    "tax_number": "1234567890",
    "updated_at": "2026-10-24T03:39:43+03:00"
  }
}

Siparişler

Siparişleri tutarları, müşteri bilgileri, teslimat ve fatura adresleri, kalemleri ve kargo bilgileriyle birlikte okuyun. Fatura adresi bireysel ya da kurumsal ayrımıyla, TC kimlik ya da vergi bilgileri dolu olarak gelir.

Siparişleri listele

GET /orders orders.read
Filtreler
status metin
Virgülle birden fazla durum, örneğin pending,processing.
payment_status metin
Virgülle birden fazla ödeme durumu.
order_number metin
Sipariş numarasıyla tam eşleşme.
customer_id integer
Bu müşterinin siparişleri.
page integer
Sayfa numarası. Varsayılan 1.
per_page integer
Sayfa başına kayıt. Varsayılan 50, en fazla 100.
updated_since tarih
Bu tarihten sonra güncellenen kayıtlar. ISO 8601 biçiminde gönderin.
created_since tarih
Bu tarihten sonra oluşturulan kayıtlar.
ids metin
Virgülle ayrılmış id listesi. En fazla 200 id.

Sipariş detayı

GET /orders/{id} orders.read
Sipariş durumuAnlamı
pendingOnay bekliyor
processingHazırlanıyor
shippedKargoya verildi
completedTamamlandı
cancelledİptal edildi
returnedİade edildi
Ödeme durumuAnlamı
unpaidÖdenmedi
pendingÖdeme bekleniyor
paidÖdendi
failedÖdeme başarısız
refundedİade edildi
partially_refundedKısmi iade
Yanıt
200
{
  "data": {
    "id": 4,
    "order_number": "FS-1003",
    "status": "processing",
    "status_label": "Hazırlanıyor",
    "payment_status": "paid",
    "payment_method": "bank",
    "paid_at": "2026-10-24T03:05:49+03:00",
    "currency": "TRY",
    "totals": {
      "items_subtotal": 1908.34,
      "discounts_total": 381.66,
      "shipping_total": 500.0,
      "cod_fee": 0.0,
      "gift_package_total": 0.0,
      "bank_transfer_discount": 0.0,
      "tax_total": 305.34,
      "grand_total": 2332.0
    },
    "coupon_code": "DENEME20",
    "customer": {
      "id": 1,
      "is_guest": false,
      "name": "Ayşe Yılmaz",
      "email": "ayse@ornek.com",
      "phone": "5551112233"
    },
    "shipping_address": {
      "name": "Ayşe Yılmaz",
      "phone": "5551112233",
      "address_line1": "Selvili Sk. No 4",
      "address_line2": "",
      "neighborhood": "Küçükbakkalköy",
      "district": "Ataşehir",
      "city": "İstanbul",
      "postal_code": "34750",
      "country": "Türkiye"
    },
    "billing_address": {
      "name": "Ayşe Yılmaz",
      "city": "İstanbul",
      "billing_type": "individual",
      "tckn": "11111111110",
      "company_name": null,
      "tax_office": null,
      "tax_number": null
    },
    "items": [
      {
        "id": 3,
        "product_id": 10,
        "variant_id": 17,
        "sku": "TSHIRT-OVERSIZE-BEYAZ-M",
        "barcode": "",
        "name": "Oversize Pamuklu Tişört",
        "variant": "Beyaz, M",
        "product_type": "variant",
        "quantity": 1,
        "unit_price": 541.67,
        "unit_price_incl_tax": 650.0,
        "tax_rate": 20,
        "discount": 108.33,
        "tax": 86.67,
        "total": 520.01,
        "status": "active",
        "customization": "",
        "customization_files": [],
        "print_details": "",
        "design": ""
      }
    ],
    "shipment": {
      "company": { "id": 1, "name": "Aras Kargo" },
      "tracking_number": "ARAS123456",
      "tracking_url": "https://kargotakip.araskargo.com.tr/?code=ARAS123456",
      "shipped_at": "2026-10-24T14:10:00+03:00",
      "delivered_at": null,
      "store_pickup": false
    },
    "gift": { "enabled": false, "note": null },
    "customer_note": null,
    "placed_at": "2026-10-24T03:00:18+03:00",
    "created_at": "2026-10-24T03:00:18+03:00",
    "updated_at": "2026-10-24T03:06:10+03:00"
  }
}

Durum, kargo ve ödeme

Bu uçlar paneldeki sipariş ekranıyla aynı kuralları ve aynı işlemleri kullanır. Müşteri bildirimleri, stok hareketleri ve fatura entegrasyonu panelde olduğu gibi çalışır. Her işlem siparişin geçmişine API kullanıcısının adıyla kaydedilir.

Sipariş durumunu güncelle

PATCH /orders/{id}/status orders.write
Gövde parametreleri
status metin zorunlu
Yeni durum.
cancel_reason metin iptal ve iadede
İptal ya da iade nedeni. En fazla 200 karakter.
shipping_company_id integer kargolamada
Kargo firması id değeri. Siparişte firma kayıtlıysa gönderilmeyebilir.
tracking_number metin entegrasyonsuz kargoda
Kargo takip numarası. Kargo entegrasyonu olan firmalarda takip numarası otomatik alınır.
  • Durum sadece bir sonraki adıma ilerler, sırası pending, processing, shipped ve completed şeklindedir.
  • İptal ve iade her aşamadan yapılabilir. İptal ya da iade edilmiş sipariş tekrar değiştirilemez.
  • Tamamlanmış sipariş sadece iptal ya da iade edilebilir.
  • Hazırlanıyor ve tamamlandı adımlarında fatura entegrasyonu ayarlarınıza göre fatura kesilir.
Kargoya verme
curl -X PATCH https://magazaniz.com/api/v1/orders/4/status \
  -H "Authorization: Bearer fat_9c1e4b..." \
  -H "Content-Type: application/json" \
  -d '{
    "status": "shipped",
    "shipping_company_id": 1,
    "tracking_number": "ARAS123456"
  }'
Geçersiz geçiş
422
{
  "error": {
    "code": "invalid_transition",
    "message": "Durum sadece bir sonraki adıma güncellenebilir."
  }
}

Kargo takip bilgisini güncelle

PATCH /orders/{id}/shipment orders.write

Kargoya verilmiş siparişin takip numarasını ya da takip adresini günceller. En az birini göndermelisiniz.

tracking_number metin
Kargo takip numarası.
tracking_url metin
http ya da https ile başlayan takip adresi.

Ödemeyi onayla

POST /orders/{id}/mark-paid orders.write

Havale ve kapıda ödeme siparişlerinde ödemenin alındığını işaretler ve müşteriye ödeme onayı bildirimi gönderir. Ödemesi zaten onaylı siparişte 409 already_paid, iptal ya da iade edilmiş siparişte 422 döner.

payment_reference metin
Banka dekont ya da işlem numarası. En fazla 120 karakter.
Ödeme onayı
curl -X POST https://magazaniz.com/api/v1/orders/7/mark-paid \
  -H "Authorization: Bearer fat_9c1e4b..." \
  -H "Content-Type: application/json" \
  -d '{ "payment_reference": "EFT-2026-10241" }'

Webhook'lar

Webhook'lar mağazada bir olay gerçekleştiğinde entegrasyonunuza anında haber verir. Sipariş, stok ya da ürün değişikliklerini öğrenmek için API'yi sürekli sorgulamanız gerekmez. Adresler Forsid panelinde Web Servis ekranından, ilgili API kullanıcısının içinde tanımlanır. Bir API kullanıcısına en fazla 5 adres eklenebilir ve her adres için hangi olayların gönderileceği ayrı ayrı seçilir.

Olaylar

OlayNe zaman gönderilir
order.createdYeni sipariş oluştuğunda. İzin orders.read
order.paidSiparişin ödemesi onaylandığında. İzin orders.read
order.status_changedSipariş durumu değiştiğinde, önceki durum previous alanında gelir. İzin orders.read
product.createdYeni ürün eklendiğinde. İzin products.read
product.updatedÜrün bilgisi, fiyatı, çevirisi ya da varyantları değiştiğinde. İzin products.read
product.deletedÜrün silindiğinde. İzin products.read
stock.changedMağaza deposundaki stok miktarı değiştiğinde. İzin products.read
customer.createdYeni müşteri kaydolduğunda. İzin customers.read
customer.updatedMüşteri bilgileri değiştiğinde. İzin customers.read
webhook.testPanelde Test gönder butonuna basıldığında

Bir olay yalnızca API kullanıcısının ilgili okuma izni varsa gönderilir. İzin kaldırılır ya da API kullanıcısı kapatılırsa gönderim de durur.

İstek formatı

Her olay için adresinize JSON gövdeli bir POST isteği gönderilir. data alanı ilgili kaydın API'de dönen halinin aynısıdır, ek bir istek yapmanıza gerek kalmaz. product.deleted olayında sadece id, sku ve barkod gelir. stock.changed olayında ürün, varyant, SKU ve yeni miktar gelir.

BaşlıkAçıklama
X-Forsid-EventOlay adı, örneğin order.paid
X-Forsid-Event-IdOlayın benzersiz numarası, gövdedeki id ile aynıdır
X-Forsid-DeliveryBu gönderimin numarası, her denemede ve yeniden gönderimde farklıdır
X-Forsid-Timestampİsteğin imzalandığı an, Unix saniyesi olarak
X-Forsid-Signaturet ve v1 değerlerinden oluşan imza
User-AgentForsid-Webhooks/1.0

İmza doğrulama

Her adresin kendine ait bir imza anahtarı vardır. Anahtar whsec_ ile başlar, panelde sadece oluşturulduğunda ya da yenilendiğinde bir kez gösterilir. Doğrulamak için X-Forsid-Signature başlığındaki t değeri, bir nokta ve ham istek gövdesi birleştirilir, sonuç imza anahtarıyla HMAC SHA256 olarak hesaplanır ve v1 değeriyle sabit zamanlı bir karşılaştırmayla eşleştirilir.

Güvenlik önerisi Gövdeyi JSON olarak çözümlemeden önce ham haliyle doğrulayın. Tekrar saldırılarına karşı zaman damgası 5 dakikadan eskiyse isteği reddedin. İmza anahtarı sızarsa panelden yenileyin, eski anahtarla imzalanan istekler hemen geçersiz olur.

Yanıt ve tekrar deneme

  • İsteğe 10 saniye içinde 2xx durum koduyla yanıt verin. İşi kendi kuyruğunuza alıp hemen yanıt vermeniz önerilir.
  • 2xx dışındaki yanıtlar ve zaman aşımları başarısız sayılır. Olay 1 dakika, 5 dakika, 30 dakika, 2 saat, 6 saat ve 12 saat sonra yeniden denenir.
  • 410 yanıtı verirseniz o olay için tekrar deneme yapılmaz.
  • Yönlendirmeler takip edilmez. Adres herkese açık olmalı ve https ile başlamalıdır.
  • Art arda 15 olay tüm denemelere rağmen iletilemezse adres otomatik kapatılır. Sorunu giderdikten sonra panelden tekrar açabilirsiniz.

Tekrar eden ve sırasız olaylar

Aynı olay birden fazla kez gelebilir, örneğin yanıtınız zaman aşımına uğradıysa. X-Forsid-Event-Id değerini saklayıp daha önce işlediğiniz olayları atlayın. Olaylar her zaman oluştuğu sırayla gelmeyebilir, data içindeki updated_at alanına göre en güncel kaydı esas alın. Bir kayıt aynı işlem içinde birden fazla kez değişirse tek olay gönderilir ve data alanı kaydın son halini taşır.

Panelde her adres için son gönderimler, gönderilen veri ve sunucunuzun yanıtı görüntülenir. Test gönder ile webhook.test olayı yollanır ve geçmişteki herhangi bir olay yeniden gönderilebilir. Gönderim kayıtları 30 gün saklanır.

Gelen istek
POST /forsid/webhook HTTP/1.1
Content-Type: application/json; charset=utf-8
User-Agent: Forsid-Webhooks/1.0
X-Forsid-Event: order.status_changed
X-Forsid-Event-Id: evt_3022f8786ba445a78c95e7c899e43966
X-Forsid-Delivery: 6d248b0d-8883-471a-a7d5-5727bac4d4b0
X-Forsid-Timestamp: 1792871827
X-Forsid-Signature: t=1792871827,v1=2ac9fe8cbb47d1d453b6939f0d27372456a42630a925d3ca0c0a0b08e67f698c
order.status_changed
{
  "id": "evt_3022f8786ba445a78c95e7c899e43966",
  "type": "order.status_changed",
  "created_at": "2026-10-24T22:57:07+03:00",
  "data": {
    "id": 1007,
    "order_number": "FS-1007",
    "status": "shipped",
    "status_label": "Kargoya Verildi",
    "payment_status": "paid",
    "currency": "TRY",
    "totals": { "grand_total": 1249.9 }
  },
  "previous": { "status": "processing" }
}
stock.changed
{
  "id": "evt_9b41c0e2d7a84f0e9a3c5d1e2f7a6b80",
  "type": "stock.changed",
  "created_at": "2026-10-24T23:04:12+03:00",
  "data": {
    "product_id": 18,
    "variant_id": 42,
    "sku": "TSH-BLK-M",
    "barcode": "8690000000421",
    "quantity": 7,
    "warehouse_id": 1,
    "updated_at": "2026-10-24T23:04:12+03:00"
  },
  "previous": { "quantity": 8 }
}
$payload = $request->getContent();
$header = (string) $request->header('X-Forsid-Signature', '');
$secret = config('services.forsid.webhook_secret');

parse_str(str_replace(',', '&', $header), $parts);
$timestamp = (int) ($parts['t'] ?? 0);
$expected = hash_hmac('sha256', $timestamp . '.' . $payload, $secret);

if (abs(time() - $timestamp) > 300 || ! hash_equals($expected, (string) ($parts['v1'] ?? ''))) {
    abort(400);
}

$event = json_decode($payload, true);

if ($event['type'] === 'order.paid') {
    ProcessForsidOrder::dispatch($event['data']['id']);
}

return response()->noContent();

Depolar ve kargo firmaları

Stok güncellemede kullanılacak depo id değerlerini ve sipariş kargolamada kullanılacak kargo firması id değerlerini verir. Bu uçlar herhangi bir izin gerektirmez, geçerli bir token yeterlidir.

GET /warehouses

is_default alanı stok gönderiminde depo belirtilmediğinde kullanılan depoyu gösterir.

GET /shipping-companies

has_integration true olan firmalarda kargo kaydı ve takip numarası entegrasyon üzerinden otomatik oluşur.

GET /warehouses
200
{
  "data": [
    { "id": 1, "code": "MRZ-8L6G", "name": "E Ticaret Depo", "is_default": true, "is_active": true },
    { "id": 2, "code": "IST-DC01", "name": "Perakende Depo", "is_default": false, "is_active": true }
  ]
}
GET /shipping-companies
200
{
  "data": [
    { "id": 1, "name": "Aras Kargo", "code": "ARAS", "has_integration": false },
    { "id": 2, "name": "Yurtiçi Kargo", "code": "YURTICI", "has_integration": true }
  ]
}

Yakında

Aşağıdaki özellikler sonraki sürümlerde eklenecek. API sürüm 1 içinde yapılan değişiklikler geriye uyumludur, mevcut alanlar kaldırılmaz ya da anlamı değiştirilmez, sadece yeni alan ve uç eklenir.

Tanım yönetimi Kategori ve marka oluşturma ve güncelleme uçları
Hazır SDK PHP ve Node.js için hazır istemci kütüphaneleri
Desteğe mi ihtiyacınız var Entegrasyon sırasında sorun yaşarsanız yanıttaki request_id değeriyle birlikte support@forsid.com adresine yazın.