# Başka kanaldaki satışı bildir

`POST /v1/external_orders` · Grup: Başka kanaldaki satış

Ö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.

> **Bilmeniz gerekenler:** Kalem fiyatları ve external_reference zorunludur; dış numara bu bağlantı ve channel_name içinde tekildir. source=api_external olur. Pazaryeriyle aynı stok, kanal tahsilatı ve müşteri yolu kullanılır; sayılan stok yetmezse eksiye iner, müşteriye e-posta/SMS gitmez. Yerel kasa tahsilatı veya kart çekimi yapılmaz. 201 sipariş okuma modeli, ETag ve Location döner.

- **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`. Yol: `/v1/external_orders`.

### Başlıklar

| Alan | Tür | Zorunlu | Açıklama | Örnek |
| --- | --- | --- | --- | --- |
| `Idempotency-Key` | metin · null olabilir | Evet | Zorunlu 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)

| Alan | Tür | Zorunlu | Açıklama | Örnek |
| --- | --- | --- | --- | --- |
| `channel_name` | metin (en çok 20 karakter) | Evet | Satış 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_reference` | metin (en çok 200 karakter) | Evet | Kanalın sipariş numarası; bu grant ve channel_name içinde kalıcı olarak tekildir. | `"ETSY-2026-001"` |
| `items` | liste: nesne (en çok 100 öğe) | Evet | var_ veya SKU, miktar ve kesinleşmiş birim fiyatıyla satış satırları. |  |
| `items[].quantity` | sayı (en çok 100000) veya metin | Evet | Miktar; en çok üç ondalık hane. Adetle satılan üründe tam sayı gerekir. | `"2"` |
| `items[].unit_price` | sayı (en az 0; en çok 10000000) veya metin | Evet | Kanalda kesinleşmiş KDV dahil TRY birim satış fiyatı; zorunludur. Kampanya uygulanmaz. | `"120.00"` |
| `items[].sku` | metin (en çok 200 karakter) · null olabilir | Hayır | Stok kodu; baş/son boşluk ve harf farkı kaldırılarak tam eşleşir. | `"KUPA-MAVI"` |
| `items[].variant` | metin · null olabilir | Hayır | var_ dış kimliği; variant veya sku alanından tam biri gerekir. | `"var_1234567890abcdef1234567890abcdef"` |
| `customer` | metin veya nesne · null olabilir | Hayır | cus_ müşteri kimliği veya müşteri bilgileri; personal_data:write gerekir. E-posta/telefon yoksa yeni müşteri kartı açılmaz. | `null` |
| `customer.name` | metin (en çok 200 karakter) | Evet | Müşterinin adı. | `"Örnek Müşteri"` |
| `customer.email` | metin (en çok 200 karakter) | Hayır | Müşterinin e-postası; mevcut müşteri eşleştirmesinde kullanılır. | `"musteri@example.com"` |
| `customer.phone` | metin (en çok 30 karakter) | Hayır | Müşterinin telefonu; mevcut müşteri eşleştirmesinde kullanılır. | `"05000000000"` |
| `fulfillment_status` | metin (seçenekler: pending, shipped, delivered) | Hayır | pending: sonra siparis.app ile kargolanabilir; shipped/delivered: kanal kargoladı/teslim etti, burada gönderi açılmaz. | `"pending"` |
| `ordered_at` | tarih-saat · null olabilir | Hayır | Kanalda siparişin verildiği saat dilimli tarih; geçmiş kabul edilir, gelecek reddedilir. Atlanırsa kayıt anı. | `"2026-10-15T09:00:00Z"` |
| `paid_at` | tarih-saat · null olabilir | Hayır | Kanalın ödemeyi aldığı saat dilimli tarih; gelecek reddedilir. Atlanırsa ordered_at, o da yoksa kayıt anı. | `"2026-10-15T09:01:00Z"` |
| `shipping_address` | nesne · null olabilir | Hayır | Teslimat adresi; personal_data:write gerekir. Adressiz satış kaydedilir; kargo için adres tamamlanır. |  |
| `shipping_address.address_line` | metin (en çok 500 karakter) | Evet | Açık teslimat adresi. | `"Örnek Sokak No: 1"` |
| `shipping_address.city` | metin (en çok 100 karakter) | Evet | Adresin ili. | `"İstanbul"` |
| `shipping_address.district` | metin (en çok 100 karakter) | Evet | Adresin ilçesi. | `"Kadıköy"` |
| `shipping_address.full_name` | metin (en çok 200 karakter) | Hayır | Alıcının adı; boşsa sipariş verenin adı kullanılır. | `"Örnek Alıcı"` |
| `shipping_address.neighborhood` | metin (en çok 100 karakter) | Hayır | Kargoda resmî listedeki mahalle veya köy adı gerekir. | `"Caferağa"` |
| `shipping_address.neighborhood_area` | metin (en çok 100 karakter) | Hayır | Varsa bağlı köy, semt veya belde. | `""` |
| `shipping_address.phone` | metin (en çok 30 karakter) | Hayır | Alıcının telefonu; kargoda zorunludur. Başka alıcıya müşterinin telefonu taşınmaz. | `"05000000000"` |
| `shipping_address.postal_code` | metin (en çok 10 karakter) · null olabilir | Hayır | İsteğe bağlı posta kodu. | `"34710"` |
| `shipping_address.village` | true/false | Hayır | Adres köydeyse true. | `false` |
| `shipping_total` | sayı (en az 0; en çok 10000000) veya metin | Hayır | Kanalda müşteriden alınmış TRY kargo ücreti; toplam tahsilata eklenir. | `"0.00"` |
| `store` | metin · null olabilir | Hayır | sto_ marka kimliği; tek markada veya marka sınırlı anahtarda atlanabilir. | `null` |

## Örnek istek

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ı](https://developer.siparis.app/hiz-siniri) uygulayın.

### curl


```bash
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
```


### Python


```python
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
```


### TypeScript


```typescript
// 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);
```


## Yanıt

### 201 · İstek başarıyla tamamlandı.

İçerik türü: `application/json`.


```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ı:

| Alan | Tür | Zorunlu | Açıklama | Örnek |
| --- | --- | --- | --- | --- |
| `channel` | metin · null olabilir | Evet | Siparişin satış kanalı; api_external kaynağında bildirilen channel_name. | `"whatsapp"` |
| `created_at` | tarih-saat | Evet | Oluşturulma zamanı; RFC 3339 UTC. | `"2026-10-16T09:00:00Z"` |
| `customer` | metin · null olabilir | Evet | Müşteri kimliği (cus_ ve 32 küçük onaltılık karakter). | `"cus_1234567890abcdef1234567890abcdef"` |
| `delivery_day` | tarih · null olabilir | Evet | Teslim günü; YYYY-MM-DD. | `"2026-10-17"` |
| `delivery_method` | metin · null olabilir | Evet | Teslim yöntemi. Değerler: shipping, hand, pickup, digital. Türkçe karşılıkları: https://developer.siparis.app/referans#teslim-yontemleri. | `"shipping"` |
| `discount_total` | metin · null olabilir | Evet | Toplam indirim; TRY cinsinden ondalık metin. Kuruş kaybını önlemek için ondalık sayı kütüphanesiyle işleyin. | `"0.00"` |
| `gift_wrap_fee` | metin · null olabilir | Evet | Hediye paketi ücreti; TRY cinsinden ondalık metin. Kuruş kaybını önlemek için ondalık sayı kütüphanesiyle işleyin. | `"0.00"` |
| `id` | metin | Evet | Kaynağın dış kimliği; ord_ ve 32 küçük onaltılık karakter. İç sayısal kimlik kullanılmaz. | `"ord_1234567890abcdef1234567890abcdef"` |
| `number` | metin · null olabilir | Evet | Siparişin görünen sekiz haneli numarası; kaynak kimliği değildir. | `"48273910"` |
| `payment_fee` | metin · null olabilir | Evet | Ö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_method` | metin · null olabilir | Evet | Ö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_state` | metin · null olabilir | Evet | Ö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_from` | tarih · null olabilir | Evet | Ön siparişin başlangıç günü; YYYY-MM-DD. | `null` |
| `shipping_total` | metin · null olabilir | Evet | Toplam kargo ücreti; TRY cinsinden ondalık metin. Kuruş kaybını önlemek için ondalık sayı kütüphanesiyle işleyin. | `"0.00"` |
| `source` | metin · null olabilir | Evet | Kaydı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"` |
| `status` | metin | Evet | Sipariş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"` |
| `store` | metin | Evet | Marka kimliği (sto_ ve 32 küçük onaltılık karakter). | `"sto_1234567890abcdef1234567890abcdef"` |
| `subtotal` | metin · null olabilir | Evet | Ü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_status` | metin (seçenekler: exempt, standard) | Evet | standard: KDV mükellefi; exempt: vergiden muaf. | `"standard"` |
| `tax_total` | metin · null olabilir | Evet | Toplam vergi; TRY cinsinden ondalık metin. Kuruş kaybını önlemek için ondalık sayı kütüphanesiyle işleyin. | `"20.00"` |
| `total` | metin | Evet | Toplam tutar; TRY cinsinden ondalık metin. Kuruş kaybını önlemek için ondalık sayı kütüphanesiyle işleyin. | `"120.00"` |
| `updated_at` | tarih-saat | Evet | Son değişiklik zamanı; RFC 3339 UTC. | `"2026-10-16T09:00:00Z"` |
| `billing_address` | nesne · null olabilir | Hayır | Fatura adresi; personal_data:read yoksa alan atlanır. |  |
| `billing_address.address_line` | metin · null olabilir | Hayır | Adres satırı; yalnız personal_data:read kapsamında görünür. Örnek kişisel veri içermez. | `null` |
| `billing_address.city` | metin · null olabilir | Hayır | İl; yalnız personal_data:read kapsamında görünür. Örnek kişisel veri içermez. | `null` |
| `billing_address.district` | metin · null olabilir | Hayır | İlçe; yalnız personal_data:read kapsamında görünür. Örnek kişisel veri içermez. | `null` |
| `billing_address.full_name` | metin · null olabilir | Hayır | Ad soyad; yalnız personal_data:read kapsamında görünür. Örnek kişisel veri içermez. | `null` |
| `billing_address.neighborhood` | metin · null olabilir | Hayır | Mahalle; yalnız personal_data:read kapsamında görünür. Örnek kişisel veri içermez. | `null` |
| `billing_address.neighborhood_area` | metin · null olabilir | Hayır | Varsa 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` |
| `billing_address.phone` | metin · null olabilir | Hayır | Telefon; yalnız personal_data:read kapsamında görünür. Örnek kişisel veri içermez. | `null` |
| `billing_address.postal_code` | metin · null olabilir | Hayır | Posta kodu; yalnız personal_data:read kapsamında görünür. Örnek kişisel veri içermez. | `null` |
| `billing_address.village` | true/false · null olabilir | Hayır | Köy adresi işareti; yalnız personal_data:read kapsamında görünür. Örnek kişisel veri içermez. | `null` |
| `currency` | sabit "TRY" | Hayır | Para birimi; v1 tutarları Türk lirasıdır. | `"TRY"` |
| `customer_email` | metin · null olabilir | Hayır | Müşteri e-postası; yalnız personal_data:read kapsamında görünür. Örnek kişisel veri içermez. | `null` |
| `customer_name` | metin · null olabilir | Hayır | Müşteri adı; yalnız personal_data:read kapsamında görünür. Örnek kişisel veri içermez. | `null` |
| `customer_note` | metin · null olabilir | Hayır | Müşterinin sipariş notu; yalnız personal_data:read kapsamında görünür. Örnek kişisel veri içermez. | `null` |
| `customer_phone` | metin · null olabilir | Hayır | Müşteri telefonu; yalnız personal_data:read kapsamında görünür. Örnek kişisel veri içermez. | `null` |
| `invoice` | nesne · null olabilir | Hayır | Fatura alıcı bilgileri; personal_data:read yoksa alan atlanır. |  |
| `invoice.company_name` | metin · null olabilir | Hayır | Fatura unvanı; yalnız personal_data:read kapsamında görünür. Örnek kişisel veri içermez. | `null` |
| `invoice.tax_number` | metin · null olabilir | Hayır | Vergi/kimlik numarası; yalnız personal_data:read kapsamında görünür. Örnek kişisel veri içermez. | `null` |
| `invoice.tax_office` | metin · null olabilir | Hayır | Vergi dairesi; yalnız personal_data:read kapsamında görünür. Örnek kişisel veri içermez. | `null` |
| `lines` | nesne · null olabilir | Hayır | include=lines ile ilk 50 sipariş satırı; devamı /orders/{id}/lines ile alınır. |  |
| `lines.data` | liste: nesne (Line) | Evet | Bu sayfanın görünür kayıtları; boş liste de geçerli bir sayfadır. |  |
| `lines.has_more` | true/false | Evet | Taranacak başka sayfa varsa true; olaylarda boş data ile de true olabilir. | `false` |
| `lines.next_cursor` | metin · null olabilir | Evet | Sonraki sayfa için aynen gönderilecek opak imleç; kaynak listesi bittiyse null. | `null` |
| `note` | metin · null olabilir | Hayır | İç not; internal_notes:read gerekir. Kişisel kaynakta personal_data:read da gerekir. | `"Örnek iç not"` |
| `payments` | nesne · null olabilir | Hayır | include=payments ile ilk 50 tahsilat/iade ve bütün siparişin para özeti; payments:read gerekir. |  |
| `payments.data` | liste: nesne (Payment) | Evet | Bu sayfanın görünür kayıtları; boş liste de geçerli bir sayfadır. |  |
| `payments.has_more` | true/false | Evet | Taranacak başka sayfa varsa true; olaylarda boş data ile de true olabilir. | `false` |
| `payments.next_cursor` | metin · null olabilir | Evet | Sonraki sayfa için aynen gönderilecek opak imleç; kaynak listesi bittiyse null. | `null` |
| `payments.summary` | nesne (MoneySummary) | Evet | Siparişin bütün tahsilat ve iadelerinden hesaplanan para özeti; yalnız bu sayfanın toplamı değildir. |  |
| `returns` | nesne · null olabilir | Hayır | include=returns ile ilk 50 iade; returns:read gerekir. |  |
| `returns.data` | liste: nesne (Return) | Evet | Bu sayfanın görünür kayıtları; boş liste de geçerli bir sayfadır. |  |
| `returns.has_more` | true/false | Evet | Taranacak başka sayfa varsa true; olaylarda boş data ile de true olabilir. | `false` |
| `returns.next_cursor` | metin · null olabilir | Evet | Sonraki sayfa için aynen gönderilecek opak imleç; kaynak listesi bittiyse null. | `null` |
| `shipments` | nesne · null olabilir | Hayır | include=shipments ile ilk 50 gönderi; shipments:read gerekir. |  |
| `shipments.data` | liste: nesne (Shipment) | Evet | Bu sayfanın görünür kayıtları; boş liste de geçerli bir sayfadır. |  |
| `shipments.has_more` | true/false | Evet | Taranacak başka sayfa varsa true; olaylarda boş data ile de true olabilir. | `false` |
| `shipments.next_cursor` | metin · null olabilir | Evet | Sonraki sayfa için aynen gönderilecek opak imleç; kaynak listesi bittiyse null. | `null` |
| `shipping_address` | nesne · null olabilir | Hayır | Teslimat adresi; personal_data:read yoksa alan atlanır. |  |
| `shipping_address.address_line` | metin · null olabilir | Hayır | Adres satırı; yalnız personal_data:read kapsamında görünür. Örnek kişisel veri içermez. | `null` |
| `shipping_address.city` | metin · null olabilir | Hayır | İl; yalnız personal_data:read kapsamında görünür. Örnek kişisel veri içermez. | `null` |
| `shipping_address.district` | metin · null olabilir | Hayır | İlçe; yalnız personal_data:read kapsamında görünür. Örnek kişisel veri içermez. | `null` |
| `shipping_address.full_name` | metin · null olabilir | Hayır | Ad soyad; yalnız personal_data:read kapsamında görünür. Örnek kişisel veri içermez. | `null` |
| `shipping_address.neighborhood` | metin · null olabilir | Hayır | Mahalle; yalnız personal_data:read kapsamında görünür. Örnek kişisel veri içermez. | `null` |
| `shipping_address.neighborhood_area` | metin · null olabilir | Hayır | Varsa 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` |
| `shipping_address.phone` | metin · null olabilir | Hayır | Telefon; yalnız personal_data:read kapsamında görünür. Örnek kişisel veri içermez. | `null` |
| `shipping_address.postal_code` | metin · null olabilir | Hayır | Posta kodu; yalnız personal_data:read kapsamında görünür. Örnek kişisel veri içermez. | `null` |
| `shipping_address.village` | true/false · null olabilir | Hayır | Kö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

| HTTP | code | Anlamı | Nasıl düzelir? |
| --- | --- | --- | --- |
| 409 | `conflict` | Sipariş 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. |
| 422 | `store_required` | Çok markalı işletmede kaydın markası eksik. | /me yanıtındaki sto_ kimliğini store alanına yazın. |
| 403 | `store_forbidden` | Anahtar başka markaya yazamaz. | Anahtarın kendi markasını seçin; marka sınırı gövdeyle genişletilmez. |
| 409 | `duplicate_external_reference` | Bu 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](https://developer.siparis.app/hatalar#ortak-hatalar).
