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

Başka kanaldaki satış

Başka kanaldaki satışı bildir

POST/v1/external_orders

Ödemesi başka bir kanalda (ör. Etsy, fuar, kendi kasanız) alınmış kesinleşmiş satışı stoktan düşmek ve listede görmek için kaydedin.

Gereken izin

Bearer anahtarı ve orders:write

Koşula bağlı izin

personal_data:write: İstekte customer, shipping_address 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
channel_namemetin (en çok 20 karakter)EvetSatış kanalının en çok 20 karakterlik adı. Baş/son boşluklar kaldırılır; büyük/küçük harfler farklı kanal adlarıdır."Etsy"
external_referencemetin (en çok 200 karakter)EvetKanalın sipariş numarası; bu grant ve channel_name içinde kalıcı olarak tekildir."ETSY-2026-001"
itemsliste: nesne (en çok 100 öğe)Evetvar_ veya SKU, miktar ve kesinleşmiş birim fiyatıyla satış satırları.
quantitysayı (en çok 100000) veya metinEvetMiktar; en çok üç ondalık hane. Adetle satılan üründe tam sayı gerekir."2"
unit_pricesayı (en az 0; en çok 10000000) veya metinEvetKanalda kesinleşmiş KDV dahil TRY birim satış fiyatı; zorunludur. Kampanya uygulanmaz."120.00"
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"
variantmetin · null olabilirHayırvar_ dış kimliği; variant veya sku alanından tam biri gerekir."var_1234567890abcdef1234567890abcdef"
customermetin veya nesne · null olabilirHayırcus_ müşteri kimliği veya müşteri bilgileri; personal_data:write gerekir. E-posta/telefon yoksa yeni müşteri kartı açılmaz.null
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"
fulfillment_statusmetin (seçenekler: pending, shipped, delivered)Hayırpending: sonra siparis.app ile kargolanabilir; shipped/delivered: kanal kargoladı/teslim etti, burada gönderi açılmaz."pending"
ordered_attarih-saat · null olabilirHayırKanalda siparişin verildiği saat dilimli tarih; geçmiş kabul edilir, gelecek reddedilir. Atlanırsa kayıt anı."2026-10-15T09:00:00Z"
paid_attarih-saat · null olabilirHayırKanalın ödemeyi aldığı saat dilimli tarih; gelecek reddedilir. Atlanırsa ordered_at, o da yoksa kayıt anı."2026-10-15T09:01:00Z"
shipping_addressnesne · null olabilirHayırTeslimat adresi; personal_data:write gerekir. Adressiz satış kaydedilir; kargo için adres tamamlanır.
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_totalsayı (en az 0; en çok 10000000) veya metinHayırKanalda müşteriden alınmış TRY kargo ücreti; toplam tahsilata eklenir."0.00"
storemetin · null olabilirHayırsto_ marka kimliği; tek markada veya marka sınırlı anahtarda atlanabilir.null

Örnek istek

curl --fail-with-body --silent --show-error --request POST \
  "${SIPARIS_API_URL:-https://api.siparis.app/v1}/external_orders" \
  -H "Authorization: Bearer $SIPARIS_API_KEY" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: ornek-post-v1-external-orders-001' \
  --data-binary @- <<'JSON'
{
  "channel_name": "Etsy",
  "customer": {
    "email": "musteri@example.com",
    "name": "Örnek Müşteri"
  },
  "external_reference": "ETSY-2026-001",
  "items": [
    {
      "quantity": "2",
      "sku": "KUPA-MAVI",
      "unit_price": "120.00"
    }
  ],
  "ordered_at": "2026-10-15T09:00:00Z",
  "paid_at": "2026-10-15T09:01:00Z"
}
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-external-orders-001",
}
request = Request(base + "/external_orders", headers=headers, method="POST",
    data="{\"channel_name\":\"Etsy\",\"customer\":{\"email\":\"musteri@example.com\",\"name\":\"Örnek Müşteri\"},\"external_reference\":\"ETSY-2026-001\",\"items\":[{\"quantity\":\"2\",\"sku\":\"KUPA-MAVI\",\"unit_price\":\"120.00\"}],\"ordered_at\":\"2026-10-15T09:00:00Z\",\"paid_at\":\"2026-10-15T09:01:00Z\"}".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 + "/external_orders", {
  method: "POST",
  headers: {
    "Authorization": `Bearer ${process.env.SIPARIS_API_KEY}`,
    "Content-Type": "application/json",
    "Idempotency-Key": "ornek-post-v1-external-orders-001",
  },
  redirect: "manual", // 307 hedefini Bearer olmadan ayrı istekte okuyun.
  signal: AbortSignal.timeout(30_000),
  body: JSON.stringify({
  "channel_name": "Etsy",
  "customer": {
    "email": "musteri@example.com",
    "name": "Örnek Müşteri"
  },
  "external_reference": "ETSY-2026-001",
  "items": [
    {
      "quantity": "2",
      "sku": "KUPA-MAVI",
      "unit_price": "120.00"
    }
  ],
  "ordered_at": "2026-10-15T09:00:00Z",
  "paid_at": "2026-10-15T09:01:00Z"
}),
});
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": "Etsy",
  "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": "marketplace",
  "payment_state": "paid",
  "preorder_from": null,
  "shipping_total": "0.00",
  "source": "api_external",
  "status": "confirmed",
  "store": "sto_1234567890abcdef1234567890abcdef",
  "subtotal": "240.00",
  "tax_status": "standard",
  "tax_total": "20.00",
  "total": "240.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 (Bildirilen satışın sipariş okuma yolu.).

Hatalar

HTTPcodeAnlamıNasıl düzelir?
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.
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.
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.