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

Siparişler

Sipariş oluştur

POST/v1/orders

Kendi sitenizden, ERP’nizden veya başka bir yazılımdan yeni satış açın; stok ve tahsilat paneldeki elle siparişle aynı kuralla işlenir.

Gereken izin

Bearer anahtarı ve orders:write

Koşula bağlı izin

internal_notes:write: İstekte note gönderirseniz gerekir. Eksikse 403 döner. personal_data:write: İstekte customer, shipping_address, billing_address, customer_note gönderirseniz gerekir. Eksikse 403 döner.

Yanıtı genişleten izin

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

Maliyet

Yok; yeni satış hız bütçesine girmez.

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
delivery_methodmetin (seçenekler: shipping, hand, pickup, digital)Evetshipping: kargo; hand: elden; pickup: markadan teslim; digital: dijital teslim."hand"
itemsliste: nesne (en çok 100 öğe)EvetSatılacak seçenekler ve miktarları.
quantitysayı (en çok 100000) veya metinEvetMiktar; en çok üç ondalık hane. Adetle satılan üründe tam sayı gerekir."2"
skumetin (en çok 200 karakter) · null olabilirHayırStok kodu; baş/son boşluk ve harf farkı kaldırılarak tam eşleşir."KUPA-MAVI"
unit_pricesayı (en az 0; en çok 10000000) veya metin · null olabilirHayırİsteğe bağlı TRY birim fiyatı; orders.price eylem izni gerekir. Yoksa markanın kampanya dahil fiyatı kullanılır."120.00"
variantmetin · null olabilirHayırvar_ dış kimliği; variant veya sku alanından tam biri gerekir."var_1234567890abcdef1234567890abcdef"
allow_waitingtrue/falseHayırtrue: stokta olmayan adetler mal gelince gönderilir; panelle aynı açık onaydır.false
billing_addressnesne · null olabilirHayırDijital üründe zorunlu fatura adresi; personal_data:write gerekir.
address_linemetin (en çok 500 karakter)EvetAçık teslimat adresi."Örnek Sokak No: 1"
citymetin (en çok 100 karakter)EvetAdresin ili."İstanbul"
districtmetin (en çok 100 karakter)EvetAdresin ilçesi."Kadıköy"
full_namemetin (en çok 200 karakter)HayırAlıcının adı; boşsa sipariş verenin adı kullanılır."Örnek Alıcı"
neighborhoodmetin (en çok 100 karakter)HayırKargoda resmî listedeki mahalle veya köy adı gerekir."Caferağa"
neighborhood_areametin (en çok 100 karakter)HayırVarsa bağlı köy, semt veya belde.""
phonemetin (en çok 30 karakter)HayırAlıcının telefonu; kargoda zorunludur. Başka alıcıya müşterinin telefonu taşınmaz."05000000000"
postal_codemetin (en çok 10 karakter) · null olabilirHayırİsteğe bağlı posta kodu."34710"
villagetrue/falseHayırAdres köydeyse true.false
cod_typemetin (seçenekler: cash, card) · null olabilirHayırYalnız kargoyla kapıda ödemede: nakit veya kart."cash"
coupon_codemetin (en çok 60 karakter)HayırMüşteriye tanımlı kupon; mevcut kullanım, süre ve ürün koşulları uygulanır."HOSGELDIN"
customermetin veya nesne · null olabilirHayırMevcut cus_ müşteri kimliği veya ad/telefon/e-posta. personal_data:write gerekir. Atlanırsa elden/mağazadan müşterisiz satış."cus_1234567890abcdef1234567890abcdef"
namemetin (en çok 200 karakter)EvetMüşterinin adı."Örnek Müşteri"
emailmetin (en çok 200 karakter)HayırMüşterinin e-postası; mevcut müşteri eşleştirmesinde kullanılır."musteri@example.com"
phonemetin (en çok 30 karakter)HayırMüşterinin telefonu; mevcut müşteri eşleştirmesinde kullanılır."05000000000"
customer_notemetin (en çok 2000 karakter)HayırPaketleme fişine de giren müşteri notu; personal_data:write gerekir."Teslimden önce arayın."
delivery_daytarih · null olabilirHayırMarkanın takvimine göre söz verilen teslim günü; dijitalde uygulanmaz."2026-10-17"
depositnesne · null olabilirHayırŞimdi alınan kapora; toplamdan küçük olmalı. paid=false gönderin.
amountsayı (en az 0; en çok 10000000) veya metinEvetGerçekten alınan tutar, TRY; ondalık metin."120.00"
methodmetin (seçenekler: cash, pos, bank)Evetcash: nakit; pos: elle alınan kart; bank: havale."cash"
external_referencenesne · null olabilirHayırDış sipariş numarasını bu API bağlantısında tekilleştirir; anahtar döndürmek ad alanını değiştirmez.
idmetin (en çok 200 karakter)EvetKendi sisteminizdeki sipariş numarası; bu API bağlantısında tekildir."WEB-2026-001"
namespacemetin · null olabilirHayırAd alanı kalıcı grant kimliğidir (grt_). Atlayabilirsiniz; başka ad alanı seçilemez.null
notemetin (en çok 2000 karakter)Hayırİç not; internal_notes:write gerekir."Paket kontrol edildi."
paidtrue/falseHayırÖdeme gerçekten alındıysa true. Kapıda ödemede false; parçalı ödemede parçalar alınmış sayılır.true
payment_methodmetin (seçenekler: cod, bank_transfer, cash, credit_card, split) · null olabilirHayırPaneldeki elle ödeme yolu; credit_card POS kaydıdır, kart çekimi başlatmaz. 0 TL siparişte atlanabilir."cash"
paymentsliste: nesne (en çok 20 öğe) · null olabilirHayırsplit yönteminde alınan ödeme parçaları; toplam sipariş tutarıyla aynı olmalıdır.
amountsayı (en az 0; en çok 10000000) veya metinEvetGerçekten alınan tutar, TRY; ondalık metin."120.00"
methodmetin (seçenekler: cash, pos, bank)Evetcash: nakit; pos: elle alınan kart; bank: havale."cash"
shipping_addressnesne · null olabilirHayırKargoda zorunlu, elden teslimde isteğe bağlı adres; personal_data:write gerekir.
address_linemetin (en çok 500 karakter)EvetAçık teslimat adresi."Örnek Sokak No: 1"
citymetin (en çok 100 karakter)EvetAdresin ili."İstanbul"
districtmetin (en çok 100 karakter)EvetAdresin ilçesi."Kadıköy"
full_namemetin (en çok 200 karakter)HayırAlıcının adı; boşsa sipariş verenin adı kullanılır."Örnek Alıcı"
neighborhoodmetin (en çok 100 karakter)HayırKargoda resmî listedeki mahalle veya köy adı gerekir."Caferağa"
neighborhood_areametin (en çok 100 karakter)HayırVarsa bağlı köy, semt veya belde.""
phonemetin (en çok 30 karakter)HayırAlıcının telefonu; kargoda zorunludur. Başka alıcıya müşterinin telefonu taşınmaz."05000000000"
postal_codemetin (en çok 10 karakter) · null olabilirHayırİsteğe bağlı posta kodu."34710"
villagetrue/falseHayırAdres köydeyse true.false
shipping_feesayı (en az 0; en çok 100000) veya metin · null olabilirHayırTRY teslimat ücreti; atlanırsa panelin marka kuralı, verilirse orders.price izniyle açık tutar."0.00"
storemetin · null olabilirHayırSiparişin sto_ marka kimliği; tek markada veya marka sınırlı anahtarda atlanabilir."sto_1234567890abcdef1234567890abcdef"

Örnek istek

curl --fail-with-body --silent --show-error --request POST \
  "${SIPARIS_API_URL:-https://api.siparis.app/v1}/orders" \
  -H "Authorization: Bearer $SIPARIS_API_KEY" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: ornek-post-v1-orders-001' \
  --data-binary @- <<'JSON'
{
  "customer": {
    "email": "musteri@example.com",
    "name": "Örnek Müşteri",
    "phone": "05000000000"
  },
  "delivery_method": "hand",
  "external_reference": {
    "id": "WEB-2026-001"
  },
  "items": [
    {
      "quantity": "2",
      "sku": "KUPA-MAVI"
    }
  ],
  "paid": true,
  "payment_method": "cash"
}
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-orders-001",
}
request = Request(base + "/orders", headers=headers, method="POST",
    data="{\"customer\":{\"email\":\"musteri@example.com\",\"name\":\"Örnek Müşteri\",\"phone\":\"05000000000\"},\"delivery_method\":\"hand\",\"external_reference\":{\"id\":\"WEB-2026-001\"},\"items\":[{\"quantity\":\"2\",\"sku\":\"KUPA-MAVI\"}],\"paid\":true,\"payment_method\":\"cash\"}".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 + "/orders", {
  method: "POST",
  headers: {
    "Authorization": `Bearer ${process.env.SIPARIS_API_KEY}`,
    "Content-Type": "application/json",
    "Idempotency-Key": "ornek-post-v1-orders-001",
  },
  redirect: "manual", // 307 hedefini Bearer olmadan ayrı istekte okuyun.
  signal: AbortSignal.timeout(30_000),
  body: JSON.stringify({
  "customer": {
    "email": "musteri@example.com",
    "name": "Örnek Müşteri",
    "phone": "05000000000"
  },
  "delivery_method": "hand",
  "external_reference": {
    "id": "WEB-2026-001"
  },
  "items": [
    {
      "quantity": "2",
      "sku": "KUPA-MAVI"
    }
  ],
  "paid": true,
  "payment_method": "cash"
}),
});
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

{
  "channel": "whatsapp",
  "created_at": "2026-10-16T09:00:00Z",
  "currency": "TRY",
  "customer": null,
  "delivery_day": "2026-10-17",
  "delivery_method": "shipping",
  "discount_total": "0.00",
  "gift_wrap_fee": "0.00",
  "id": "ord_1234567890abcdef1234567890abcdef",
  "number": "48273910",
  "payment_fee": "0.00",
  "payment_method": "bank_transfer",
  "payment_state": "paid",
  "preorder_from": null,
  "shipping_total": "0.00",
  "source": "api",
  "status": "confirmed",
  "store": "sto_1234567890abcdef1234567890abcdef",
  "subtotal": "120.00",
  "tax_status": "standard",
  "tax_total": "20.00",
  "total": "120.00",
  "updated_at": "2026-10-16T10:00:00Z"
}
Yanıt alanları (69)
AlanTürZorunluAçıklamaÖrnek
channelmetin · null olabilirEvetSiparişin satış kanalı; api_external kaynağında bildirilen channel_name."whatsapp"
created_attarih-saatEvetOluşturulma zamanı; RFC 3339 UTC."2026-10-16T09:00:00Z"
customermetin · null olabilirEvetMüşteri kimliği (cus_ ve 32 küçük onaltılık karakter)."cus_1234567890abcdef1234567890abcdef"
delivery_daytarih · null olabilirEvetTeslim günü; YYYY-MM-DD."2026-10-17"
delivery_methodmetin · null olabilirEvetTeslim yöntemi. Değerler: shipping, hand, pickup, digital. Türkçe karşılıkları: https://developer.siparis.app/referans#teslim-yontemleri."shipping"
discount_totalmetin · null olabilirEvetToplam indirim; TRY cinsinden ondalık metin. Kuruş kaybını önlemek için ondalık sayı kütüphanesiyle işleyin."0.00"
gift_wrap_feemetin · null olabilirEvetHediye paketi ücreti; TRY cinsinden ondalık metin. Kuruş kaybını önlemek için ondalık sayı kütüphanesiyle işleyin."0.00"
idmetinEvetKaynağın dış kimliği; ord_ ve 32 küçük onaltılık karakter. İç sayısal kimlik kullanılmaz."ord_1234567890abcdef1234567890abcdef"
numbermetin · null olabilirEvetSiparişin görünen sekiz haneli numarası; kaynak kimliği değildir."48273910"
payment_feemetin · null olabilirEvetÖdeme yöntemi ücreti; TRY cinsinden ondalık metin. Kuruş kaybını önlemek için ondalık sayı kütüphanesiyle işleyin."0.00"
payment_methodmetin · null olabilirEvetÖdeme yöntemi. Değerler: cod, bank_transfer, credit_card, split, cash, marketplace. Türkçe karşılıkları: https://developer.siparis.app/referans#odeme-yontemleri."bank_transfer"
payment_statemetin · null olabilirEvetÖdeme durumu; alınan ve iade edilen paradan hesaplanır, sipariş durumundan ayrıdır. Değerler: none, awaiting, partial, paid, refund_due, refunded, test. Türkçe karşılıkları: https://developer.siparis.app/referans#odeme-durumlari."paid"
preorder_fromtarih · null olabilirEvetÖn siparişin başlangıç günü; YYYY-MM-DD.null
shipping_totalmetin · null olabilirEvetToplam kargo ücreti; TRY cinsinden ondalık metin. Kuruş kaybını önlemek için ondalık sayı kütüphanesiyle işleyin."0.00"
sourcemetin · null olabilirEvetKaydın kaynağı; api: yeni satış, api_external: başka kanalda kesinleşmiş satış, import: eski siteden bilgi amaçlı aktarım. Panel/AI ve bağlı kanal kaynakları da korunur."panel"
statusmetinEvetSiparişin iş akışındaki durumu; ödeme durumu ayrıca payment_state alanındadır. Değerler: pending, payment_pending, confirmed, processing, shipped, delivered, cancelled, refunded. Türkçe karşılıkları: https://developer.siparis.app/referans#siparis-durumlari."confirmed"
storemetinEvetMarka kimliği (sto_ ve 32 küçük onaltılık karakter)."sto_1234567890abcdef1234567890abcdef"
subtotalmetin · null olabilirEvetÜrünlerin ara toplamı; TRY cinsinden ondalık metin. Kuruş kaybını önlemek için ondalık sayı kütüphanesiyle işleyin."120.00"
tax_statusmetin (seçenekler: exempt, standard)Evetstandard: KDV mükellefi; exempt: vergiden muaf."standard"
tax_totalmetin · null olabilirEvetToplam vergi; TRY cinsinden ondalık metin. Kuruş kaybını önlemek için ondalık sayı kütüphanesiyle işleyin."20.00"
totalmetinEvetToplam tutar; TRY cinsinden ondalık metin. Kuruş kaybını önlemek için ondalık sayı kütüphanesiyle işleyin."120.00"
updated_attarih-saatEvetSon değişiklik zamanı; RFC 3339 UTC."2026-10-16T09:00:00Z"
billing_addressnesne · null olabilirHayırFatura adresi; personal_data:read yoksa alan atlanır.
address_linemetin · null olabilirHayırAdres satırı; yalnız personal_data:read kapsamında görünür. Örnek kişisel veri içermez.null
citymetin · null olabilirHayırİl; yalnız personal_data:read kapsamında görünür. Örnek kişisel veri içermez.null
districtmetin · null olabilirHayırİlçe; yalnız personal_data:read kapsamında görünür. Örnek kişisel veri içermez.null
full_namemetin · null olabilirHayırAd soyad; yalnız personal_data:read kapsamında görünür. Örnek kişisel veri içermez.null
neighborhoodmetin · null olabilirHayırMahalle; yalnız personal_data:read kapsamında görünür. Örnek kişisel veri içermez.null
neighborhood_areametin · null olabilirHayırVarsa bağlı köy, semt veya belde; yalnız personal_data:read kapsamında görünür. Örnek kişisel veri içermez.null
phonemetin · null olabilirHayırTelefon; yalnız personal_data:read kapsamında görünür. Örnek kişisel veri içermez.null
postal_codemetin · null olabilirHayırPosta kodu; yalnız personal_data:read kapsamında görünür. Örnek kişisel veri içermez.null
villagetrue/false · null olabilirHayırKöy adresi işareti; yalnız personal_data:read kapsamında görünür. Örnek kişisel veri içermez.null
currencysabit "TRY"HayırPara birimi; v1 tutarları Türk lirasıdır."TRY"
customer_emailmetin · null olabilirHayırMüşteri e-postası; yalnız personal_data:read kapsamında görünür. Örnek kişisel veri içermez.null
customer_namemetin · null olabilirHayırMüşteri adı; yalnız personal_data:read kapsamında görünür. Örnek kişisel veri içermez.null
customer_notemetin · null olabilirHayırMüşterinin sipariş notu; yalnız personal_data:read kapsamında görünür. Örnek kişisel veri içermez.null
customer_phonemetin · null olabilirHayırMüşteri telefonu; yalnız personal_data:read kapsamında görünür. Örnek kişisel veri içermez.null
invoicenesne · null olabilirHayırFatura alıcı bilgileri; personal_data:read yoksa alan atlanır.
company_namemetin · null olabilirHayırFatura unvanı; yalnız personal_data:read kapsamında görünür. Örnek kişisel veri içermez.null
tax_numbermetin · null olabilirHayırVergi/kimlik numarası; yalnız personal_data:read kapsamında görünür. Örnek kişisel veri içermez.null
tax_officemetin · null olabilirHayırVergi dairesi; yalnız personal_data:read kapsamında görünür. Örnek kişisel veri içermez.null
linesnesne · null olabilirHayırinclude=lines ile ilk 50 sipariş satırı; devamı /orders/{id}/lines ile alınır.
dataliste: nesne (Line)EvetBu sayfanın görünür kayıtları; boş liste de geçerli bir sayfadır.
has_moretrue/falseEvetTaranacak başka sayfa varsa true; olaylarda boş data ile de true olabilir.false
next_cursormetin · null olabilirEvetSonraki sayfa için aynen gönderilecek opak imleç; kaynak listesi bittiyse null.null
notemetin · null olabilirHayırİç not; internal_notes:read gerekir. Kişisel kaynakta personal_data:read da gerekir."Örnek iç not"
paymentsnesne · null olabilirHayırinclude=payments ile ilk 50 tahsilat/iade ve bütün siparişin para özeti; payments:read gerekir.
dataliste: nesne (Payment)EvetBu sayfanın görünür kayıtları; boş liste de geçerli bir sayfadır.
has_moretrue/falseEvetTaranacak başka sayfa varsa true; olaylarda boş data ile de true olabilir.false
next_cursormetin · null olabilirEvetSonraki sayfa için aynen gönderilecek opak imleç; kaynak listesi bittiyse null.null
summarynesne (MoneySummary)EvetSiparişin bütün tahsilat ve iadelerinden hesaplanan para özeti; yalnız bu sayfanın toplamı değildir.
returnsnesne · null olabilirHayırinclude=returns ile ilk 50 iade; returns:read gerekir.
dataliste: nesne (Return)EvetBu sayfanın görünür kayıtları; boş liste de geçerli bir sayfadır.
has_moretrue/falseEvetTaranacak başka sayfa varsa true; olaylarda boş data ile de true olabilir.false
next_cursormetin · null olabilirEvetSonraki sayfa için aynen gönderilecek opak imleç; kaynak listesi bittiyse null.null
shipmentsnesne · null olabilirHayırinclude=shipments ile ilk 50 gönderi; shipments:read gerekir.
dataliste: nesne (Shipment)EvetBu sayfanın görünür kayıtları; boş liste de geçerli bir sayfadır.
has_moretrue/falseEvetTaranacak başka sayfa varsa true; olaylarda boş data ile de true olabilir.false
next_cursormetin · null olabilirEvetSonraki sayfa için aynen gönderilecek opak imleç; kaynak listesi bittiyse null.null
shipping_addressnesne · null olabilirHayırTeslimat adresi; personal_data:read yoksa alan atlanır.
address_linemetin · null olabilirHayırAdres satırı; yalnız personal_data:read kapsamında görünür. Örnek kişisel veri içermez.null
citymetin · null olabilirHayırİl; yalnız personal_data:read kapsamında görünür. Örnek kişisel veri içermez.null
districtmetin · null olabilirHayırİlçe; yalnız personal_data:read kapsamında görünür. Örnek kişisel veri içermez.null
full_namemetin · null olabilirHayırAd soyad; yalnız personal_data:read kapsamında görünür. Örnek kişisel veri içermez.null
neighborhoodmetin · null olabilirHayırMahalle; yalnız personal_data:read kapsamında görünür. Örnek kişisel veri içermez.null
neighborhood_areametin · null olabilirHayırVarsa bağlı köy, semt veya belde; yalnız personal_data:read kapsamında görünür. Örnek kişisel veri içermez.null
phonemetin · null olabilirHayırTelefon; yalnız personal_data:read kapsamında görünür. Örnek kişisel veri içermez.null
postal_codemetin · null olabilirHayırPosta kodu; yalnız personal_data:read kapsamında görünür. Örnek kişisel veri içermez.null
villagetrue/false · null olabilirHayırKöy adresi işareti; yalnız personal_data:read kapsamında görünür. Örnek kişisel veri içermez.null

Bu uca özgü yanıt başlıkları: ETag (Kaynağın güçlü sürüm etiketi; 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.
400insufficient_stockSipariş için yeterli stok yok.Miktarı azaltın veya paneldeki bekleyen stok kuralını açıkça allow_waiting=true ile seçin.
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.
409duplicate_external_referenceBu dış numarayla sipariş zaten açılmış.existing_order içindeki ord_ kimliğini kullanın; ikinci sipariş açılmadı.

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