İçeriğe geç
siparis.app geliştiriciAnahtarları yönet ↗

Ürünler

Ürün oluştur

POST/v1/products

Ürünü seçenekleri, kategorileri ve ürün markasıyla birlikte tek istekte açın.

Gereken izin

Bearer anahtarı ve products:write

Koşula bağlı izin

costs:write: İstekte cost, variants[].cost gönderirseniz gerekir. Eksikse 403 döner. inventory:write: İstekte variants[].opening_stock, opening_stock gönderirseniz gerekir. Eksikse 403 döner.

Yanıtı genişleten izin

costs:read: yanıttaki ilgili alanları açar; izin yoksa bu alanlar atlanır, istek reddedilmez.

Maliyet

1 puan (bağlantı başına 60 saniyede 600 puan)

Tekrar anahtarı

Gerekir: Idempotency-Key başlığı.

İstek

Temel adres: https://api.siparis.app/v1

Başlıklar

AlanTürZorunluAçıklamaÖrnek
Idempotency-Keymetin · null olabilirEvetZorunlu tekrar anahtarı; en çok 200 karakter. Yeni işte yeni değer; ağ tekrarında aynı gövde ve aynı değer."ilk-esitleme-20261016-001"

Gövde (application/json)

AlanTürZorunluAçıklamaÖrnek
namemetin (en çok 500 karakter)EvetÜrün adı."Seramik Kupa"
barcodemetin (en çok 100 karakter) · null olabilirHayırBarkod; işletmede canlı seçenekler arasında tekil. null temizler."8690000000001"
brandmetin · null olabilirHayırMevcut brd_ ürün markası; null bağı kaldırır. Satıcının sto_ markasıyla karıştırmayın.null
categoriesliste: metin (en çok 100 öğe) · null olabilirHayırMevcut cat_ kategori kimlikleri; [] bağları kaldırır. Yeni kategori açmaz.
compare_pricesayı (en az 0; en çok 10000000) veya metin · null olabilirHayırÜstü çizili fiyat; null kaldırır. Üründe satış fiyatından yüksek olmalıdır."150.00"
costsayı (en az 0; en çok 10000000) veya metin · null olabilirHayırAlış maliyeti; costs:write gerekir. Panel gibi KDV hariç, muaf işletmede KDV dahil saklanır; null kaldırır."80.00"
descriptionmetin (en çok 50000 karakter) · null olabilirHayırÜrün açıklaması; null kaldırır."Seramik kupa, 300 ml."
external_referencenesne · null olabilirHayırBu API bağlantısında ürünün dış kimliği.
idmetin (en çok 200 karakter)EvetKendi sisteminizdeki kimlik; grant ve kaynak türünde tekildir."ERP-001"
namespacemetin · null olabilirHayırKalıcı grt_ kimliği; atlanabilir, başka bağlantının ad alanı seçilemez.null
imagesliste: metin (en çok 2000 karakter) (en çok 12 öğe) · null olabilirHayırEn çok 12 http/https görsel URL’si; [] galeriyi boşaltır. Panelin güvenli kopyalama kuyruğu kullanılır.
made_to_ordertrue/false · null olabilirHayırSipariş üzerine hazırlanırsa true; mevcut stok korunur.false
opening_stocksayı (en az 0; en çok 100000) veya metin · null olabilirHayırSeçeneksiz ürünün ilk stoğu; inventory:write gerekir. Seçenekli üründe her seçeneğe yazın."10"
pricesayı (en az 0; en çok 10000000) veya metin · null olabilirHayırTRY satış fiyatı; ondalık metin. null ürünün fiyatını kaldırır, seçenekte ürün fiyatına döner."120.00"
short_descriptionmetin (en çok 1000 karakter) · null olabilirHayırKısa açıklama; null kaldırır."Seramik kupa"
skumetin (en çok 255 karakter) · null olabilirHayırStok kodu; işletmede canlı seçenekler arasında tekil. null temizler."KUPA-MAVI"
statusmetin (seçenekler: active, draft, inactive) · null olabilirHayırSatış durumu; arşiv için ayrı eylemi kullanın. Fiyatsız ürün satışa açılamaz."active"
storemetin · null olabilirHayırHedef sto_ markası; tek markada veya marka sınırlı anahtarda atlanabilir.null
storesliste: metin (en çok 100 öğe) · null olabilirHayırBirden çok hedef sto_ markası; store ile birlikte gönderilmez.
tax_ratesayı (en az 0; en çok 100) veya metin · null olabilirHayırYüzde KDV oranı; panelin vergi sınıfı doğrulaması kullanılır."20"
unitmetin (en çok 20 karakter) · null olabilirHayırSatış birimi; panelin miktar doğrulaması kullanılır."adet"
variantsliste: nesne (en çok 500 öğe) · null olabilirHayırÜrünle aynı işlemde açılacak seçenekler; bir hata tüm kaydı geri alır.
barcodemetin (en çok 100 karakter) · null olabilirHayırBarkod; işletmede canlı seçenekler arasında tekil. null temizler."8690000000001"
compare_pricesayı (en az 0; en çok 10000000) veya metin · null olabilirHayırÜstü çizili fiyat; null kaldırır. Üründe satış fiyatından yüksek olmalıdır."150.00"
costsayı (en az 0; en çok 10000000) veya metin · null olabilirHayırAlış maliyeti; costs:write gerekir. Panel gibi KDV hariç, muaf işletmede KDV dahil saklanır; null kaldırır."80.00"
expected_stocksayı (en az 0; en çok 100000) veya metin · null olabilirHayırİlk seçeneğe dönüşen varsayılanın görülen stoğu; yalnız opening_stock ile kullanılır."0"
external_referencenesne · null olabilirHayırBu API bağlantısında seçeneğin dış kimliği.
idmetin (en çok 200 karakter)EvetKendi sisteminizdeki kimlik; grant ve kaynak türünde tekildir."ERP-001"
namespacemetin · null olabilirHayırKalıcı grt_ kimliği; atlanabilir, başka bağlantının ad alanı seçilemez.null
imagesliste: metin (en çok 2000 karakter) (en çok 12 öğe) · null olabilirHayırEn çok 12 http/https görsel URL’si; [] galeriyi boşaltır. Panelin güvenli kopyalama kuyruğu kullanılır.
made_to_ordertrue/false · null olabilirHayırSipariş üzerine hazırlanırsa true; mevcut stok korunur.false
namemetin (en çok 500 karakter) · null olabilirHayırSeçeneğin görünen adı; gönderilmezse korunur."Mavi"
opening_stocksayı (en az 0; en çok 100000) veya metin · null olabilirHayırİlk stok; inventory:write gerekir. İlk seçenek mevcut varsayılanı dönüştürürse stok korunur; farklı sayı için expected_stock gerekir."10"
optionsliste: nesne (en çok 20 öğe) · null olabilirHayırSeçeneğin ad/değer çiftleri; gönderilmezse korunur.
namemetin (en çok 100 karakter)EvetSeçenek özelliğinin adı."Renk"
valuemetin (en çok 200 karakter)EvetSeçenek özelliğinin değeri."Mavi"
pricesayı (en az 0; en çok 10000000) veya metin · null olabilirHayırTRY satış fiyatı; ondalık metin. null ürünün fiyatını kaldırır, seçenekte ürün fiyatına döner."120.00"
price_rulenesne · null olabilirHayırÜrün fiyatından TL veya yüzde farkı; null ürünle aynı fiyat demektir.
kindmetin (seçenekler: tl, percent)EvetÜrün fiyatına eklenecek farkın birimi."tl"
valuesayı (en az -10000000; en çok 10000000) veya metinEvetFiyat farkı; negatif değer indirimdir. Son fiyat ortak fiyat kuralıyla doğrulanır."20.00"
skumetin (en çok 255 karakter) · null olabilirHayırStok kodu; işletmede canlı seçenekler arasında tekil. null temizler."KUPA-MAVI"
weightsayı (en az 0; en çok 100000) veya metin · null olabilirHayırKilogram cinsinden ağırlık; null kaldırır."0.350"
weightsayı (en az 0; en çok 100000) veya metin · null olabilirHayırKilogram cinsinden ağırlık; null kaldırır."0.350"

Örnek istek

curl --fail-with-body --silent --show-error --request POST \
  "${SIPARIS_API_URL:-https://api.siparis.app/v1}/products" \
  -H "Authorization: Bearer $SIPARIS_API_KEY" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: ornek-post-v1-products-001' \
  --data-binary @- <<'JSON'
{
  "name": "Seramik Kupa",
  "price": "120.00",
  "sku": "KUPA-001"
}
JSON
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
from urllib.error import HTTPError

# İmzalı indirme hedefine Bearer taşımamak için yönlendirme kendiliğinden izlenmez.
class NoRedirect(HTTPRedirectHandler):
    def redirect_request(self, req, fp, code, msg, headers, newurl):
        return None

base = os.environ.get("SIPARIS_API_URL", "https://api.siparis.app/v1")
headers = {
    "Authorization": "Bearer " + os.environ["SIPARIS_API_KEY"],
    "Content-Type": "application/json",
    "Idempotency-Key": "ornek-post-v1-products-001",
}
request = Request(base + "/products", headers=headers, method="POST",
    data="{\"name\":\"Seramik Kupa\",\"price\":\"120.00\",\"sku\":\"KUPA-001\"}".encode("utf-8"))
try:
    with build_opener(NoRedirect).open(request, timeout=30) as response:
        print(response.read().decode("utf-8"))
except HTTPError as error:
    print(error.code, error.read().decode("utf-8"))
    raise
// Node.js 22+; anahtar yalnız sunucunun ortam değişkenindedir.
const base = process.env.SIPARIS_API_URL ?? "https://api.siparis.app/v1";
if (!process.env.SIPARIS_API_KEY) throw new Error("SIPARIS_API_KEY gerekli");
const response = await fetch(base + "/products", {
  method: "POST",
  headers: {
    "Authorization": `Bearer ${process.env.SIPARIS_API_KEY}`,
    "Content-Type": "application/json",
    "Idempotency-Key": "ornek-post-v1-products-001",
  },
  redirect: "manual", // 307 hedefini Bearer olmadan ayrı istekte okuyun.
  signal: AbortSignal.timeout(30_000),
  body: JSON.stringify({
  "name": "Seramik Kupa",
  "price": "120.00",
  "sku": "KUPA-001"
}),
});
const text = await response.text();
if (!response.ok) throw new Error(`${response.status}: ${text}`);
console.log(text);

Kimlik içeren yollarda örnek kimliği kendi liste yanıtınızdan alın. SIPARIS_API_KEY sunucu ortamında tanımlı olmalı; yerelde SIPARIS_API_URL ile /v1 içeren adresi değiştirin. Üretimde tekrar kurallarını uygulayın.

Yanıt

201 İstek başarıyla tamamlandı.

İçerik türü: application/json

{
  "archived": false,
  "brand": "brd_1234567890abcdef1234567890abcdef",
  "code": "KUPA-001",
  "compare_price": "150.00",
  "created_at": "2026-10-16T09:00:00Z",
  "currency": "TRY",
  "description": "Seramik kupa, 300 ml.",
  "id": "prd_1234567890abcdef1234567890abcdef",
  "images": [
    "https://example.com/kupa.jpg"
  ],
  "kind": "standard",
  "made_to_order": false,
  "maximum_quantity": "100.000",
  "minimum_quantity": "1.000",
  "name": "Seramik Kupa",
  "pool_unit": "adet",
  "preparation": "3 iş günü",
  "price": "120.00",
  "quantity_step": "1.000",
  "short_description": "Seramik kupa",
  "slug": "ornek-kupa",
  "status": "active",
  "tax_rate": "20.00",
  "tax_status": "standard",
  "unit": "adet",
  "updated_at": "2026-10-16T09:00:00Z"
}
Yanıt alanları (68)
AlanTürZorunluAçıklamaÖrnek
archivedtrue/falseEvetArşivdeki veya kapanmış kaynaksa true. archived=true süzgeci bunları da içerir.false
brandmetin · null olabilirEvetÜrün markası kimliği (brd_ ve 32 küçük onaltılık karakter)."brd_1234567890abcdef1234567890abcdef"
codemetin · null olabilirEvetÜrün kodu."KUPA-001"
compare_pricemetin · null olabilirEvetKarşılaştırma fiyatı; TRY cinsinden ondalık metin. Kuruş kaybını önlemek için ondalık sayı kütüphanesiyle işleyin."150.00"
created_attarih-saatEvetOluşturulma zamanı; RFC 3339 UTC."2026-10-16T09:00:00Z"
currencysabit "TRY"EvetPara birimi; v1 tutarları Türk lirasıdır."TRY"
descriptionmetin · null olabilirEvetKaynağın açıklama metni."Seramik kupa, 300 ml."
idmetinEvetKaynağın dış kimliği; prd_ ve 32 küçük onaltılık karakter. İç sayısal kimlik kullanılmaz."prd_1234567890abcdef1234567890abcdef"
imagesliste: metinEvetÜrün görsellerinin sıralı HTTPS adresleri.
kindmetinEvetÜrün türü; ör. standard: tek ürün, bundle: paket."standard"
made_to_ordertrue/falseEvetSipariş üzerine hazırlanırsa true; sayılmayan stoktan önceliklidir.false
maximum_quantitymetin · null olabilirEvetEn çok sipariş miktarı; birimi ilgili ürün/depo alanında verilen ondalık metin."100.000"
minimum_quantitymetin · null olabilirEvetEn az sipariş miktarı; birimi ilgili ürün/depo alanında verilen ondalık metin."1.000"
namemetinEvetKaydın görünen adı."Seramik Kupa"
pool_unitmetin · null olabilirEvetOrtak stok havuzunun birimi."adet"
preparationmetin · null olabilirEvetSipariş üzerine hazırlama süresinin açıklaması."3 iş günü"
pricemetin · null olabilirEvetSatış fiyatı; TRY cinsinden ondalık metin. Kuruş kaybını önlemek için ondalık sayı kütüphanesiyle işleyin."120.00"
quantity_stepmetin · null olabilirEvetSipariş miktarının artış adımı; birimi ilgili ürün/depo alanında verilen ondalık metin."1.000"
short_descriptionmetin · null olabilirEvetÜrünün kısa açıklaması."Seramik kupa"
slugmetin · null olabilirEvetAdreslerde kullanılan kısa ad."ornek-kupa"
statusmetinEvetKaynağın işlem durumu."active"
tax_ratemetin · null olabilirEvetYüzde cinsinden vergi oranı; ondalık metin."20.00"
tax_statusmetin (seçenekler: standard, exempt)Evetstandard: KDV mükellefi; exempt: vergiden muaf."standard"
unitmetinEvetÜrünün satış miktarı birimi."adet"
updated_attarih-saatEvetSon değişiklik zamanı; RFC 3339 UTC."2026-10-16T09:00:00Z"
categoriesliste: nesne · null olabilirHayırinclude=categories ile eklenen görünür kategoriler.
archivedtrue/falseEvetArşivdeki veya kapanmış kaynaksa true. archived=true süzgeci bunları da içerir.false
created_attarih-saatEvetOluşturulma zamanı; RFC 3339 UTC."2026-10-16T09:00:00Z"
descriptionmetin · null olabilirEvetKaynağın açıklama metni."Seramik kupa, 300 ml."
idmetinEvetKaynağın dış kimliği; cat_ ve 32 küçük onaltılık karakter. İç sayısal kimlik kullanılmaz."cat_1234567890abcdef1234567890abcdef"
imagemetin · null olabilirEvetGörselin genel HTTPS adresi."https://example.com/kupa.jpg"
namemetinEvetKaydın görünen adı."Mutfak"
parentmetin · null olabilirEvetÜst kategori kimliği (cat_ ve 32 küçük onaltılık karakter).null
revisiontam sayıEvetKaydın revizyonu; If-Match için ETag ile birlikte kullanılır.1
slugmetin · null olabilirEvetAdreslerde kullanılan kısa ad."ornek-kupa"
sort_ordertam sayıEvetPanel ve vitrindeki sırası; küçük değer önce gelir.0
statusmetinEvetKaynağın işlem durumu."active"
updated_attarih-saatEvetSon değişiklik zamanı; RFC 3339 UTC."2026-10-16T09:00:00Z"
costmetin · null olabilirHayırMaliyet; yalnız costs:read ile görünür; TRY cinsinden ondalık metin. Kuruş kaybını önlemek için ondalık sayı kütüphanesiyle işleyin."80.00"
store_pricesliste: nesne · null olabilirHayırinclude=store_prices ile eklenen kayıtlı marka fiyatları; kampanya fiyatı değildir.
archivedtrue/falseEvetArşivdeki veya kapanmış kaynaksa true. archived=true süzgeci bunları da içerir.false
compare_pricemetin · null olabilirEvetKarşılaştırma fiyatı; TRY cinsinden ondalık metin. Kuruş kaybını önlemek için ondalık sayı kütüphanesiyle işleyin."150.00"
created_attarih-saatEvetOluşturulma zamanı; RFC 3339 UTC."2026-10-16T09:00:00Z"
currencysabit "TRY"EvetPara birimi; v1 tutarları Türk lirasıdır."TRY"
pricemetin · null olabilirEvetSatış fiyatı; TRY cinsinden ondalık metin. Kuruş kaybını önlemek için ondalık sayı kütüphanesiyle işleyin."120.00"
productmetinEvetÜrün kimliği (prd_ ve 32 küçük onaltılık karakter)."prd_1234567890abcdef1234567890abcdef"
storemetinEvetMarka kimliği (sto_ ve 32 küçük onaltılık karakter)."sto_1234567890abcdef1234567890abcdef"
updated_attarih-saatEvetSon değişiklik zamanı; RFC 3339 UTC."2026-10-16T09:00:00Z"
variantmetin · null olabilirEvetSeçenek kimliği (var_ ve 32 küçük onaltılık karakter)."var_1234567890abcdef1234567890abcdef"
variantsliste: nesne · null olabilirHayırinclude=variants ile eklenen seçenekler.
archivedtrue/falseEvetArşivdeki veya kapanmış kaynaksa true. archived=true süzgeci bunları da içerir.false
barcodemetin · null olabilirEvetÜrünün veya seçeneğin barkodu."8690000000001"
compare_pricemetin · null olabilirEvetKarşılaştırma fiyatı; TRY cinsinden ondalık metin. Kuruş kaybını önlemek için ondalık sayı kütüphanesiyle işleyin."150.00"
created_attarih-saatEvetOluşturulma zamanı; RFC 3339 UTC."2026-10-16T09:00:00Z"
currencysabit "TRY"EvetPara birimi; v1 tutarları Türk lirasıdır."TRY"
expiredtrue/falseEvetSeçenek emekli edilmişse true.false
idmetinEvetKaynağın dış kimliği; var_ ve 32 küçük onaltılık karakter. İç sayısal kimlik kullanılmaz."var_1234567890abcdef1234567890abcdef"
is_defaulttrue/falseEvetVarsayılan seçenek veya depo ise true.true
made_to_ordertrue/falseEvetSipariş üzerine hazırlanırsa true; sayılmayan stoktan önceliklidir.false
namemetinEvetKaydın görünen adı."Mavi"
optionsliste: nesne (Option)EvetSeçeneğin ad/değer özellikleri.
pool_quantitymetin · null olabilirEvetSeçeneğin ortak stoktan kullandığı miktar; birimi ilgili ürün/depo alanında verilen ondalık metin."1.000"
pricemetin · null olabilirEvetSatış fiyatı; TRY cinsinden ondalık metin. Kuruş kaybını önlemek için ondalık sayı kütüphanesiyle işleyin."120.00"
productmetinEvetÜrün kimliği (prd_ ve 32 küçük onaltılık karakter)."prd_1234567890abcdef1234567890abcdef"
skumetin · null olabilirEvetStok takip kodu; eşitlik araması normalize edilerek yapılır."KUPA-MAVI"
stock_uncountedtrue/falseEvetStok sayılmıyorsa true; stok miktarı null sunulur.false
updated_attarih-saatEvetSon değişiklik zamanı; RFC 3339 UTC."2026-10-16T09:00:00Z"
costmetin · null olabilirHayırMaliyet; yalnız costs:read ile görünür; TRY cinsinden ondalık metin. Kuruş kaybını önlemek için ondalık sayı kütüphanesiyle işleyin."80.00"

Bu uca özgü yanıt başlıkları: ETag (Ürünün API görünümünün SHA-256 içerik özetinin ilk 16 onaltılık karakteri; stok durumu ve updated_at hariç. If-Match için tırnaklarıyla saklayın.); Location (Yeni kaydın API kökenine göre yolu.).

Hatalar

HTTPcodeAnlamıNasıl düzelir?
403forbiddenMevcut ticari kural bu işlemi yapmanıza izin vermiyor.Gerekli kapsamları ve siparişin durumunu kontrol edin.
409conflictSipariş veya ödeme bilgisi değişmiş ya da işlem mevcut duruma uygun değil.Güncel siparişi okuyun, iş kuralını kontrol edip yeni tekrar anahtarıyla deneyin.
409code_takenStok kodu veya barkod başka bir kayıtta kullanılıyor.Görünür existing_variant / existing_product kimliğini okuyun veya farklı kod seçin.
400invalid_if_matchIf-Match geçerli bir güçlü ETag değil.GET kaynak yanıtındaki ETag değerini çift tırnaklarıyla aynen kullanın.
412revision_mismatchKayıt siz okuduktan sonra değişmiş.Güncel kaydı okuyun; düzeltmeyi yeniden değerlendirip yeni tekrar anahtarıyla gönderin.
422store_requiredÇok markalı işletmede kaydın markası eksik./me yanıtındaki sto_ kimliğini store alanına yazın.
403store_forbiddenAnahtar başka markaya yazamaz.Anahtarın kendi markasını seçin; marka sınırı gövdeyle genişletilmez.
403reference_namespace_forbiddenDış numaranın ad alanı başka bağlantıya ait.namespace alanını atlayın veya /me içindeki grt_ kimliğini kullanın.
409external_reference_conflictBu dış numarayla stok belgesi zaten açılmış.Ağ tekrarında özgün Idempotency-Key değerini ve gövdeyi kullanın.

Ortak hatalar (anahtar, izin, istek biçimi, hız sınırı, tekrar anahtarı) her uçta aynıdır: Hata kodları › Ortak hatalar.