{"openapi":"3.0.3","info":{"title":"Courino API","version":"1.0.0","description":"Courino müşteri entegrasyon API'si: kendi sisteminizden (e-ticaret sitesi, ERP, depo yazılımı)\nfiyat alıp sipariş açmanız, siparişlerinizi izlemeniz ve durum değişikliklerini anında almanız için.\nBu sayfadaki her işlemi **Authorize** düğmesine anahtarınızı girip **Try it out** ile doğrudan\ndeneyebilirsiniz; istekler gerçek hesabınızda çalışır.\n\n## Başlangıç\n\n1. **Anahtar oluşturun.** Müşteri portalında **Firma bilgilerim → Entegrasyon (API anahtarları)** bölümünden yeni bir\n   API anahtarı oluşturun. Anahtar `kosk_` ile başlar ve **yalnız bir kez gösterilir**; parola gibi\n   saklayın, kaynak koduna ya da tarayıcıda çalışan koda koymayın.\n2. **Her isteğe ekleyin:** `Authorization: Bearer kosk_…`\n3. **Semt ve gidiş tipi kimliklerini alın:** `GET /me/order-options`. Fiyat ve sipariş isteklerindeki\n   `districtId` (semt) ve `deliveryTypeId` (gidiş tipi) değerleri bu listeden gelir. Liste seyrek\n   değişir; bir gün önbelleğe alabilirsiniz.\n4. **Fiyat alın:** `POST /pricing/quote` (sipariş açmaz).\n5. **Sipariş açın:** `POST /orders` (`Idempotency-Key` başlığıyla).\n6. **Durumları alın:** `POST /me/webhooks` ile bir webhook adresi kaydedin ya da\n   `GET /me/orders/{id}` ile okuyun.\n\nAdres: `https://client.courino.com/api/v1` (kendi sunucusunda çalışan firmalarda firmanın alan adı;\nbu sayfanın açıldığı adres her zaman doğrudur).\n\n## Kimlik doğrulama ve anahtarlar\n\n- Anahtar, bağlı olduğu müşteri hesabının yetkisiyle çalışır: yalnız sizin verdiğiniz ya da ödediğiniz\n  siparişleri görür. Başka bir siparişin kimliği 404 döner.\n- Hesap başına en çok **5 etkin anahtar** olabilir; anahtara isteğe bağlı bitiş tarihi verilebilir.\n- İptal edilen anahtar en geç **30 saniye** içinde çalışmaz olur. Hesap şifreniz değiştiğinde ya da\n  hesap pasifleştiğinde anahtarlar da geçersiz olur.\n- Geçersiz, süresi dolmuş ya da iptal edilmiş anahtar **401 `UNAUTHORIZED`** döner. Anahtarla\n  kullanılamayan uçlar (personel işlemleri; kayıtlı kartlar, destek talepleri, ödeme başlatma gibi\n  oturum ve insan onayı isteyen hesap işlemleri) **403 `FORBIDDEN`** döner.\n- Bu belgede, aşağıdaki iki sağlık denetimi ucu dışında yalnız API anahtarıyla çağrılabilen uçlar\n  vardır.\n\n## İstek sınırı\n\nAnahtar başına **dakikada 120 istek**. Her yanıtta:\n\n| Başlık | Anlamı |\n|---|---|\n| `X-RateLimit-Limit` | Dakikalık sınır (`120`) |\n| `X-RateLimit-Remaining` | Bu pencerede kalan istek |\n| `X-RateLimit-Reset` | Pencerenin sıfırlanmasına kalan saniye |\n\nSınır aşılırsa **429 `TOO_MANY_REQUESTS`** ve `Retry-After` (saniye) döner; o kadar bekleyip yeniden\ndeneyin. Sipariş durumlarını sık sık okumak yerine webhook kullanın; çok sayıda sipariş için\n`POST /me/orders/batch` (tek istekte 1000 satıra kadar) kullanın.\n\n## Veri biçimleri\n\n- **Tutarlar ve ondalıklar metindir:** `\"180.00\"`, `\"2.5\"`. Yuvarlama hatası olmaması için sayı\n  olarak değil, metin olarak gönderin ve okuyun. Ondalık ayraç noktadır.\n- **Zamanlar** RFC 3339'dur (`2027-03-04T09:15:02Z` ya da `2027-03-04T12:15:02+03:00`); yalnız tarih\n  isteyen alanlar `YYYY-MM-DD` biçimindedir.\n- **Telefon** girişte serbest biçimlidir (`0532 123 45 67`, `+90532…`); yanıtlarda E.164 biçiminde\n  döner (`+905321234567`).\n- **Kimlikler** UUID'dir. Sipariş numarası (`number`) firma içinde artan bir sayıdır.\n- **Dil:** `Accept-Language: tr` ya da `en` hata açıklamalarının (`detail`) ve CSV başlıklarının\n  dilini seçer.\n- Yanıtlarda yeni alanlar ve yeni enum değerleri eklenebilir; tanımadığınız alanları yok sayın.\n\n## Sayfalama\n\nListeler `limit` ve `offset` alır ve `{\"items\": [...], \"total\": N}` döner; `total`, süzgece uyan\ntoplam kayıt sayısıdır. Örnek: `GET /me/orders?limit=100&offset=200`. Siparişler varsayılan olarak\nen yeniden eskiye sıralanır. Sayfa boyutu üst sınırı her uçta parametrede yazılıdır (siparişlerde 200).\n\n## Arama ve sıralama\n\nSipariş, tahakkuk, fatura ve kapıda ödeme listeleri şu ortak parametreleri de alır:\n\n- `q`: serbest metin araması (büyük/küçük harf duyarsız, parça eşleşme; en çok 200 karakter).\n- `minAmount` / `maxAmount`: tutar aralığı (ikisi de dahil), ör. `minAmount=100.00`.\n- `sort`: `alan` artan, `-alan` azalan sıralar, ör. `sort=-total`. Her uçta izinli alanlar uç\n  açıklamasında yazılıdır; bilinmeyen alan **422** döner.\n\nÖrnek: `GET /me/orders?q=kadıköy&minAmount=100&sort=-total&limit=50`.\n\n## Tekrar koruması (Idempotency-Key)\n\n`POST /orders` ve `POST /me/orders/{id}/cancel` isteğe bağlı `Idempotency-Key` başlığı alır\n(ör. bir UUID). Ağ hatası ya da zaman aşımında aynı anahtarla yeniden denediğinizde ikinci sipariş\naçılmaz:\n\n- Anahtar müşteri hesabınıza (tüm API anahtarları ve kullanıcılarıyla) ve işleme özeldir, **24 saat** saklanır.\n- Aynı anahtar + aynı gövde: ilk başarılı yanıt aynen döner, `Idempotent-Replayed: true` başlığıyla.\n- Aynı anahtar + farklı gövde: **409 `IDEMPOTENCY_MISMATCH`**.\n- İlk istek hâlâ işlenirken gelen tekrar: **409 `IDEMPOTENCY_IN_PROGRESS`**; kısa süre bekleyip\n  yeniden deneyin.\n- Yalnız 2xx yanıtlar saklanır; hata alan istek aynı anahtarla yeniden denenebilir.\n\nToplu gönderide (`POST /me/orders/batch`) aynı referans numarası ya da koli barkodu olan satır\natlanır; aynı partiyi yeniden göndermek güvenlidir.\n\n## Sipariş akışı\n\n- **Gönderen** her zaman anahtarın sahibi olan müşteridir (`sender.customerId` boş bırakılabilir).\n  Semt verilmezse kayıtlı semtiniz kullanılır.\n- **Alıcı** ve **alım noktası** ya adres defterinizdeki bir müşteri (`customerId`,\n  `GET /me/customer` → `links`) ya da semtle (`districtId`) ve ad/telefon/adresle verilir.\n- **Ödeyen taraf** (`payer`) siz ya da adres defterinizdeki bir müşteri olmalıdır.\n- **Ödeme şekli** verilmezse: pul müşterisinde pul (bakiyeden düşülür), abonelerde açık cari,\n  diğerlerinde nakit. Pul bakiyesi yetmezse (eksi bakiye izniniz yoksa) sipariş açılmaz.\n- **Kapıda ödeme** (`codAmount`) taşıma ücretinden ayrıdır: alıcıdan sizin adınıza tahsil edilen\n  mal bedelidir. Firma bu özelliği açmamışsa 422 `COD_DISABLED` döner.\n- Sipariş yalnız kuryeye verilmeden önce (`on_table`, `pending_approval`) düzenlenebilir ve iptal\n  edilebilir; sonrasında 409 `CONFLICT` döner. Düzenlemede okuduğunuz `version` değerini gönderin;\n  arada değişmişse 409 `VERSION_CONFLICT` döner.\n\nDurumlar: `pending_approval` (firma onayı bekliyor) → `on_table` (kurye bekliyor) → `assigned`\n(kuryede) → `picked_up` (yolda) → `delivered`. Diğerleri: `return_leg`, `delivery_failed`,\n`returning`, `returned`, `at_hub`, `in_transfer`, `cancelled`.\n\n## Hatalar\n\nHatalar [RFC 7807](https://www.rfc-editor.org/rfc/rfc7807) biçiminde, `application/problem+json`\nolarak döner:\n\n```json\n{\n  \"type\": \"about:blank\",\n  \"title\": \"Unprocessable Entity\",\n  \"status\": 422,\n  \"code\": \"VALIDATION\",\n  \"detail\": \"Doğrulama hatası\",\n  \"errors\": [{\"field\": \"recipient.districtId\", \"message\": \"semt bulunamadı\"}],\n  \"traceId\": \"4bf92f3577b34da6a3ce929d0e0e4736\"\n}\n```\n\nKararı `status` ve `code` ile verin; `detail` insanlar içindir ve değişebilir. Destek isteğinde\n`traceId` değerini paylaşın.\n\n| HTTP | `code` | Ne zaman |\n|---|---|---|\n| 400 | `VALIDATION` | Gövde ya da parametre biçimi bozuk (geçersiz JSON, yanlış tür) |\n| 401 | `UNAUTHORIZED` | Anahtar yok, geçersiz, süresi dolmuş ya da iptal edilmiş |\n| 403 | `FORBIDDEN` | Bu uç API anahtarıyla kullanılamaz ya da yetkiniz yok |\n| 403 | `AIDAT_PASSIVE`, `TENANT_SUSPENDED` | Kurye firmasının hesabı kısıtlı; firmayla görüşün |\n| 403 | `FEATURE_DISABLED` | Firma bu özelliği kapatmış |\n| 404 | `NOT_FOUND` | Kayıt yok ya da size ait değil |\n| 409 | `CONFLICT` | Kayıt bu işleme uygun durumda değil (ör. kuryeye verilmiş sipariş, kullanılan koli barkodu, 5 webhook sınırı) |\n| 409 | `VERSION_CONFLICT` | Kayıt siz okuduktan sonra değişti; yeniden okuyun |\n| 409 | `IDEMPOTENCY_MISMATCH`, `IDEMPOTENCY_IN_PROGRESS` | Bkz. Tekrar koruması |\n| 409 | `COD_COLLECTED`, `COD_SETTLED` | Kapıda ödeme tahsil edilmiş / size ödenmiş; değiştirilemez |\n| 422 | `VALIDATION` | Alan değeri kurala uymuyor; ayrıntı `errors` içinde |\n| 422 | `COD_DISABLED` | Firma kapıda ödemeyi açmamış |\n| 429 | `TOO_MANY_REQUESTS` | İstek sınırı aşıldı; `Retry-After` kadar bekleyin |\n| 500 | `INTERNAL` | Beklenmeyen hata; `traceId` ile bildirin |\n| 503 | `UNAVAILABLE` | Geçici olarak kullanılamıyor; biraz sonra yeniden deneyin |\n\nKod listesi açıktır: yeni kodlar eklenebilir. Tanımadığınız bir kodu HTTP durumuna göre ele alın.\n5xx ve 429'da artan beklemeyle yeniden deneyin; `POST /orders` için bunu `Idempotency-Key` ile yapın.\n\n## Webhook\n\nWebhook, sipariş olaylarını gerçekleştiği anda sizin adresinize `POST` eder. `POST /me/webhooks`\nile en çok **5 abonelik** açabilirsiniz; abonelik yalnız sizin verdiğiniz ya da ödediğiniz\nsiparişlerin olaylarını alır.\n\n**Olaylar:** `order.created`, `order.approval_requested`, `order.approved`, `order.rejected`,\n`order.assigned`, `order.reassigned`, `order.returned_to_pool`, `order.picked_up`,\n`order.return_leg`, `order.delivered`, `order.delivery_reverted`, `order.delivery_failed`,\n`order.returning`, `order.returned`, `order.return_reverted`, `order.cancelled`, `order.restored`,\n`order.at_hub`, `order.hub_transfer`.\n\n**İstek:**\n\n```http\nPOST /kurye/webhook HTTP/1.1\nContent-Type: application/json\nUser-Agent: KOS-Webhook/1\nX-KOS-Event: order.delivered\nX-KOS-Delivery: 0f6d1c9e-6a1b-4f0e-9c5a-2b7d8e9f0a12\nX-KOS-Signature: t=1804151340,v1=5d2c…\n\n{\n  \"id\": \"a3c1e7f0-2b4d-4c6e-8f10-1a2b3c4d5e6f\",\n  \"type\": \"order.delivered\",\n  \"occurredAt\": \"2027-03-04T11:02:20Z\",\n  \"data\": {\n    \"order\": {\n      \"id\": \"2c8e4a6b-9d1f-4b3c-a5e7-6f8a0b2c4d99\",\n      \"number\": 10482,\n      \"status\": \"delivered\",\n      \"createdAt\": \"2027-03-04T09:15:02Z\",\n      \"pickedUpAt\": \"2027-03-04T09:40:11Z\",\n      \"deliveredAt\": \"2027-03-04T11:02:20Z\",\n      \"receiverName\": \"Ayşe Yılmaz\",\n      \"cancelledAt\": null,\n      \"cancelReason\": \"\",\n      \"reference\": \"SIP-2027-00042\",\n      \"paymentMethod\": \"account\",\n      \"total\": \"180.00\",\n      \"currency\": \"TRY\",\n      \"stops\": [\n        {\"role\": \"sender\", \"name\": \"Örnek Çiçekçilik\", \"district\": \"Kadıköy\"},\n        {\"role\": \"recipient\", \"name\": \"Ayşe Yılmaz\", \"district\": \"Beşiktaş\"}\n      ],\n      \"courier\": {\"id\": \"9d8c7b6a-5f4e-4d3c-8b2a-1f0e9d8c7b6a\", \"name\": \"Ali Kaya\"}\n    }\n  }\n}\n```\n\nGövdede telefon numarası gibi kişisel veriler bulunmaz; gerekirse `GET /me/orders/{id}` ile okuyun.\nHenüz olmamış zamanlar `null`, `courier` ise kurye yoksa hiç gelmez.\n\n**İmza doğrulama.** `X-KOS-Signature: t=<unix saniye>,v1=<imza>` biçimindedir. İmza,\n`<t>.<ham gövde>` metninin HMAC-SHA256 değeridir (küçük harf onaltılık); anahtar, abonelik\noluşturulurken bir kez gösterilen sırrın (`whsec_…`) **kendisidir** (çözülmeden, olduğu gibi\nUTF-8 baytları). Doğrularken:\n\n1. Gövdeyi JSON olarak çözmeden **ham baytlarıyla** alın.\n2. `t` ile şimdiki zaman arasındaki fark 5 dakikadan fazlaysa reddedin (tekrar oynatma koruması).\n3. Beklenen imzayı hesaplayıp `v1` ile **sabit zamanlı** karşılaştırın.\n4. Doğrulanmayan isteğe 401 dönün.\n\nÖrnek kodlar `POST /me/webhooks` işleminin altındadır. Sır sızarsa\n`POST /me/webhooks/{id}/rotate-secret` ile hemen yenileyin.\n\n**Teslim ve yeniden deneme.**\n\n- 10 saniye içinde **2xx** dönün; işi kuyruğa alıp sonra yapın.\n- 2xx dışındaki her yanıt (4xx dahil) ve bağlantı hatası yeniden denenir: toplam **8 deneme**,\n  artan bekleme (deneme⁴ saniye; yaklaşık 1,5 saat).\n- **410 Gone** dönerseniz o teslimat bir daha denenmez (abonelik açık kalır; tamamen durdurmak için\n  aboneliği kapatın ya da silin).\n- Aynı olay birden fazla kez gelebilir: `X-KOS-Delivery` aynı teslimatın bütün denemelerinde aynıdır;\n  daha önce işlediğiniz değeri görürseniz 200 dönüp atlayın.\n- Olaylar sıralı gelmeyebilir: `occurredAt` ve `data.order.status` değerine bakın.\n- Adres `http://` ya da `https://` olmalı (https önerilir), kullanıcı adı/şifre içermemeli ve\n  internetten erişilebilir olmalıdır.\n\n## Sağlık denetimi\n\nİzleme araçlarınız için iki uç anahtar istemez ve `/api/v1` altında değil, kökte sunulur\n(ör. `https://client.courino.com/healthz`):\n\n- `GET /healthz` sunucu çalışıyorsa gövdesiz `204` döner.\n- `GET /readyz` veritabanını da denetler (en çok 3 sn): hazırsa `200` ve `{\"status\":\"ok\"}`,\n  değilse `503` ve `{\"status\":\"unavailable\",\"failed\":{\"postgres\":\"unavailable\"}}`. `503` geçicidir;\n  biraz sonra yeniden deneyin.\n\nDakikada birkaç denetim yeterlidir.\n\n## Diğer\n\n- **Toplu sipariş:** `POST /me/orders/batch` satırları kuyrukta açar; `GET /me/orders/imports/{id}`\n  ile `status` `done` olana kadar birkaç saniyede bir okuyun.\n- **Excel/CSV dosyası:** `POST /me/orders/imports` dosyayı önizler; satırları kontrol edip\n  `POST /me/orders/imports/{id}/confirm` ile siparişleri açın.\n- **E-ticaret:** portalda bağladığınız mağazalardan gelen siparişleri `GET /me/ecommerce/orders`\n  ile izleyin; eşleşme bekleyenleri `resolve`, `retry` ya da `skip` ile sonuçlandırın.\n- **Takip bağlantısı:** `POST /me/orders/{id}/tracking-link` alıcıya gönderebileceğiniz, oturum\n  gerektirmeyen takip sayfasının adresini verir.\n- **Arşiv:** `GET /me/orders/export` CSV verir (UTF-8 BOM, noktalı virgül ayraçlı; Excel doğrudan\n  açar). Tek seferde en çok 20.000 sipariş.\n- **Belgeler:** bu belge OpenAPI 3.0 olarak [openapi.yaml](/api/v1/openapi.yaml) ve\n  [openapi.json](/api/v1/openapi.json) adreslerinden indirilebilir; Postman, Insomnia ya da kod\n  üreticilerle kullanabilirsiniz.\n"},"servers":[{"description":"Courino API (bulunduğunuz alan adı)","url":"/api/v1"}],"security":[{"apiKey":[]}],"tags":[{"description":"Semt ve gidiş tipi seçenekleri, fiyat teklifi ve geçerli indirimler.","name":"Fiyat ve seçenekler"},{"description":"Sipariş açma (tek tek ya da toplu), listeleme, düzenleme, iptal, teslim fotoğrafları ve CSV arşivi.","name":"Siparişler"},{"description":"Siparişin canlı kurye takibi ve alıcıya iletilecek takip bağlantısı.","name":"Takip"},{"description":"Sipariş olaylarını sisteminize anında ileten imzalı bildirim abonelikleri.","name":"Webhook"},{"description":"Müşteri kaydınız, yetkilileriniz ve adres defteriniz.","name":"Hesap"},{"description":"Pul (ön ödemeli bakiye) hareketleri, sipariş tahakkukları ve kesilmiş faturalar.","name":"Ödeme ve fatura"},{"description":"Alıcıdan sizin adınıza tahsil edilen kapıda ödemeler ve size yapılan aktarımlar.","name":"Kapıda ödeme"},{"description":"Müşteri portalında bağladığınız mağaza ve pazaryerlerinden (WooCommerce, Shopify, Trendyol,\nHepsiburada…) gelen siparişler. Bağlantı ekleme, mağaza bilgisi değiştirme ve mağaza onayı\nyalnız portalden yapılır; API ile durumu izler, eşleşme bekleyen siparişleri düzeltir, yeniden\ndener ya da atlarsınız.","name":"E-ticaret"},{"description":"İzleme araçlarınız (uptime denetimi, yük dengeleyici) için sağlık uçları. API anahtarı gerekmez ve\n`/api/v1` altında değildir: alan adının kökündedir, ör. `https://client.courino.com/healthz`.","name":"Sağlık denetimi"}],"paths":{"/me/order-options":{"get":{"tags":["Fiyat ve seçenekler"],"summary":"Sipariş seçenekleri (semtler ve gidiş tipleri)","description":"Sipariş ve teklif isteklerinde kullanacağınız `districtId` (semt) ve `deliveryTypeId` (gidiş tipi)\ndeğerlerini döner. Yalnız etkin kayıtlar listelenir; fiyat ayrıntısı içermez. Firmanın çalışma\nsaatleri tanımlıysa `businessHours` ile gelir. Liste seyrek değişir; günlük önbelleğe alabilirsiniz.","operationId":"getOrderOptions","responses":{"200":{"content":{"application/json":{"example":{"businessHours":{"end":"19:00","openNow":true,"start":"08:30"},"deliveryTypes":[{"fullName":"Normal teslimat","id":"b5d1e2f3-6a7b-4c8d-9e0f-1a2b3c4d5e66","isRoundTrip":false,"name":"Normal"},{"fullName":"Ekspres (60 dk)","id":"e1f2a3b4-c5d6-4e7f-8a9b-0c1d2e3f4a77","isRoundTrip":false,"name":"Ekspres"}],"districts":[{"id":"3f1c2a4e-8b7d-4c21-9a55-0e6b1f2d3c41","name":"Kadıköy"},{"id":"7a2e9c10-4d3b-4f8a-b1c2-5e6f7a8b9c02","name":"Beşiktaş"},{"id":"c4d5e6f7-0a1b-4c2d-8e3f-9a0b1c2d3e43","name":"Ataşehir"}]},"schema":{"$ref":"#/components/schemas/OrderOptions"}}},"description":"Seçenekler"},"default":{"$ref":"#/components/responses/Problem"}},"security":[{"apiKey":[]}]}},"/pricing/quote":{"post":{"tags":["Fiyat ve seçenekler"],"summary":"Fiyat teklifi hesaplar (sipariş açmaz)","description":"Siparişi açmadan önce fiyatı ve kırılımını gösterir. Sipariş açılırken aynı kurallarla yeniden\nhesaplanır ve sonuç siparişte değişmez olarak saklanır. Gönderen her zaman API anahtarının ait olduğu\nmüşteridir; `sender.customerId` boş bırakılabilir, `sender.districtId` verilmezse kayıtlı semtiniz\nkullanılır. Alım noktası ve alıcı ya adres defterinizdeki bir müşteriyle (`customerId`) ya da\nsemtle (`districtId`) tanımlanır. Ödeyen taraf (`payer`) siz ya da adres defterinizdeki bir müşteri\nolmalıdır; ör. `payer: recipient` için alıcıya `customerId` verin.","operationId":"quotePrice","requestBody":{"content":{"application/json":{"example":{"deliveryTypeId":"b5d1e2f3-6a7b-4c8d-9e0f-1a2b3c4d5e66","payer":"sender","recipient":{"districtId":"7a2e9c10-4d3b-4f8a-b1c2-5e6f7a8b9c02"},"sender":{},"weightKg":"2.5"},"schema":{"$ref":"#/components/schemas/QuoteRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"example":{"algorithmVersion":"kos-1","calculatedTotal":"180.00","currencyCode":"TRY","currencyRate":"1","deliveryMultiplier":"1","expectedDeliveryMinutes":90,"fromRegion":2,"lines":{"base":"150.00","bridge":"0.00","extra":"0.00","manualAdjustmentNet":"0.00","manualAdjustmentVat":"0.00","serviceNet":"150.00","vat":"30.00","volume":"0.00","wait":"0.00","weight":"0.00"},"nightMultiplier":"1","tier":"subscriber","toRegion":3,"total":"180.00","usesWallet":false,"vatRate":"20","vatScope":"all"},"schema":{"$ref":"#/components/schemas/Quote"}}},"description":"Teklif"},"default":{"$ref":"#/components/responses/Problem"}},"security":[{"apiKey":[]}],"x-codeSamples":[{"label":"curl","lang":"Shell","source":"curl -s https://client.courino.com/api/v1/pricing/quote \\\n  -H \"Authorization: Bearer $KOS_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Accept-Language: tr\" \\\n  -d '{\n    \"sender\": {},\n    \"recipient\": {\"districtId\": \"7a2e9c10-4d3b-4f8a-b1c2-5e6f7a8b9c02\"},\n    \"deliveryTypeId\": \"b5d1e2f3-6a7b-4c8d-9e0f-1a2b3c4d5e66\",\n    \"payer\": \"sender\",\n    \"weightKg\": \"2.5\"\n  }'\n"},{"label":"Node.js","lang":"JavaScript","source":"// Node.js 18+ (built-in fetch)\nconst BASE = \"https://client.courino.com/api/v1\";\nconst res = await fetch(`${BASE}/pricing/quote`, {\n  method: \"POST\",\n  headers: {\n    Authorization: `Bearer ${process.env.KOS_API_KEY}`,\n    \"Content-Type\": \"application/json\",\n  },\n  body: JSON.stringify({\n    sender: {},\n    recipient: { districtId: \"7a2e9c10-4d3b-4f8a-b1c2-5e6f7a8b9c02\" },\n    deliveryTypeId: \"b5d1e2f3-6a7b-4c8d-9e0f-1a2b3c4d5e66\",\n    payer: \"sender\",\n    weightKg: \"2.5\", // decimals are strings\n  }),\n});\nif (!res.ok) throw new Error(`${res.status} ${(await res.json()).code}`);\nconst quote = await res.json();\nconsole.log(quote.total, quote.currencyCode); // \"180.00\" \"TRY\"\n"},{"label":"Python","lang":"Python","source":"import os\nimport requests  # pip install requests\n\nBASE = \"https://client.courino.com/api/v1\"\ns = requests.Session()\ns.headers[\"Authorization\"] = \"Bearer \" + os.environ[\"KOS_API_KEY\"]\n\nr = s.post(f\"{BASE}/pricing/quote\", json={\n    \"sender\": {},\n    \"recipient\": {\"districtId\": \"7a2e9c10-4d3b-4f8a-b1c2-5e6f7a8b9c02\"},\n    \"deliveryTypeId\": \"b5d1e2f3-6a7b-4c8d-9e0f-1a2b3c4d5e66\",\n    \"payer\": \"sender\",\n    \"weightKg\": \"2.5\",\n}, timeout=15)\nr.raise_for_status()\nquote = r.json()\nprint(quote[\"total\"], quote[\"currencyCode\"])\n"},{"label":"PHP","lang":"PHP","source":"<?php\n$base = 'https://client.courino.com/api/v1';\n$ch = curl_init(\"$base/pricing/quote\");\ncurl_setopt_array($ch, [\n    CURLOPT_POST => true,\n    CURLOPT_RETURNTRANSFER => true,\n    CURLOPT_TIMEOUT => 15,\n    CURLOPT_HTTPHEADER => [\n        'Authorization: Bearer ' . getenv('KOS_API_KEY'),\n        'Content-Type: application/json',\n    ],\n    CURLOPT_POSTFIELDS => json_encode([\n        'sender' => new stdClass(),\n        'recipient' => ['districtId' => '7a2e9c10-4d3b-4f8a-b1c2-5e6f7a8b9c02'],\n        'deliveryTypeId' => 'b5d1e2f3-6a7b-4c8d-9e0f-1a2b3c4d5e66',\n        'payer' => 'sender',\n        'weightKg' => '2.5',\n    ]),\n]);\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\n$quote = json_decode($body, true);\nif ($status !== 200) {\n    throw new RuntimeException(\"$status {$quote['code']}: {$quote['detail']}\");\n}\necho $quote['total'], ' ', $quote['currencyCode'], PHP_EOL;\n"},{"label":"C#","lang":"C#","source":"// .NET 6+\nusing System.Net.Http.Headers;\nusing System.Net.Http.Json;\nusing System.Text.Json;\n\nvar http = new HttpClient { BaseAddress = new Uri(\"https://client.courino.com/api/v1/\") };\nhttp.DefaultRequestHeaders.Authorization =\n    new AuthenticationHeaderValue(\"Bearer\", Environment.GetEnvironmentVariable(\"KOS_API_KEY\"));\n\nvar res = await http.PostAsJsonAsync(\"pricing/quote\", new {\n    sender = new { },\n    recipient = new { districtId = \"7a2e9c10-4d3b-4f8a-b1c2-5e6f7a8b9c02\" },\n    deliveryTypeId = \"b5d1e2f3-6a7b-4c8d-9e0f-1a2b3c4d5e66\",\n    payer = \"sender\",\n    weightKg = \"2.5\",\n});\nvar quote = await res.Content.ReadFromJsonAsync<JsonElement>();\nif (!res.IsSuccessStatusCode)\n    throw new Exception($\"{(int)res.StatusCode} {quote.GetProperty(\"code\")}\");\nConsole.WriteLine($\"{quote.GetProperty(\"total\")} {quote.GetProperty(\"currencyCode\")}\");\n"},{"label":"Go","lang":"Go","source":"package main\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"net/http\"\n\t\"os\"\n)\n\nfunc main() {\n\tbody, _ := json.Marshal(map[string]any{\n\t\t\"sender\":         map[string]any{},\n\t\t\"recipient\":      map[string]any{\"districtId\": \"7a2e9c10-4d3b-4f8a-b1c2-5e6f7a8b9c02\"},\n\t\t\"deliveryTypeId\": \"b5d1e2f3-6a7b-4c8d-9e0f-1a2b3c4d5e66\",\n\t\t\"payer\":          \"sender\",\n\t\t\"weightKg\":       \"2.5\",\n\t})\n\treq, _ := http.NewRequest(http.MethodPost, \"https://client.courino.com/api/v1/pricing/quote\", bytes.NewReader(body))\n\treq.Header.Set(\"Authorization\", \"Bearer \"+os.Getenv(\"KOS_API_KEY\"))\n\treq.Header.Set(\"Content-Type\", \"application/json\")\n\tres, err := http.DefaultClient.Do(req)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tdefer res.Body.Close()\n\tvar quote struct {\n\t\tTotal        string `json:\"total\"`\n\t\tCurrencyCode string `json:\"currencyCode\"`\n\t\tCode         string `json:\"code\"`\n\t}\n\t_ = json.NewDecoder(res.Body).Decode(&quote)\n\tif res.StatusCode != http.StatusOK {\n\t\tpanic(fmt.Sprintf(\"%d %s\", res.StatusCode, quote.Code))\n\t}\n\tfmt.Println(quote.Total, quote.CurrencyCode)\n}\n"}]}},"/me/discounts":{"get":{"tags":["Fiyat ve seçenekler"],"summary":"Geçerli ve yaklaşan indirimlerim","description":"İptal edilen, süresi geçen ve kullanım hakkı biten indirimler dönmez. Uygun indirim sipariş\naçılırken kendiliğinden uygulanır; teklif yanıtında `discount` olarak görünür.","operationId":"listMyDiscounts","responses":{"200":{"content":{"application/json":{"example":[{"campaignId":"1b2c3d4e-5f6a-4b7c-8d9e-0f1a2b3c4d55","createdAt":"2027-02-01T09:00:00Z","customerId":"9b2f6c1e-3a4d-4e5f-8a7b-1c2d3e4f5a60","customerName":"Örnek Çiçekçilik","id":"0a1b2c3d-4e5f-4a6b-8c7d-9e0f1a2b3c44","kind":"percent","label":"Sevgililer Günü indirimi","maxUses":20,"source":"campaign","status":"active","used":3,"validFrom":"2027-02-10","validUntil":"2027-02-15","value":"10"}],"schema":{"items":{"$ref":"#/components/schemas/CustomerDiscount"},"type":"array"}}},"description":"İndirimler"},"default":{"$ref":"#/components/responses/Problem"}},"security":[{"apiKey":[]}]}},"/orders":{"post":{"tags":["Siparişler"],"summary":"Sipariş açar","description":"Fiyat teklifle aynı kurallarla hesaplanır ve siparişte değişmez olarak saklanır. Gönderen API\nanahtarının ait olduğu müşteridir. Ödeme şekli pul (ön ödemeli bakiye) ise tutar aynı işlemde\nbakiyeden düşülür; bakiye yetmezse (eksi bakiye izniniz yoksa) sipariş açılmaz.\n\nAğ hatasında güvenle yeniden denemek için `Idempotency-Key` başlığı gönderin: aynı anahtar ve aynı\ngövdeyle gelen tekrar istek yeni sipariş açmaz, ilk yanıtı `Idempotent-Replayed: true` başlığıyla\ndöner.","operationId":"createOrder","parameters":[{"$ref":"#/components/parameters/OrderIdempotencyKey"}],"requestBody":{"content":{"application/json":{"example":{"deliveryTypeId":"b5d1e2f3-6a7b-4c8d-9e0f-1a2b3c4d5e66","notes":"Kapıda arayın.","parcels":[{"barcode":"PKT-00042-1","description":"Çiçek buketi"}],"payer":"sender","paymentMethod":"account","recipient":{"address":"Sinanpaşa Mah. Ihlamurdere Cad. No:5 D:3, Beşiktaş","districtId":"7a2e9c10-4d3b-4f8a-b1c2-5e6f7a8b9c02","name":"Ayşe Yılmaz","phone":"0532 123 45 67"},"reference":"SIP-2027-00042","sender":{"address":"Caferağa Mah. Moda Cad. No:12, Kadıköy","phone":"0216 555 12 34"},"weightKg":"2.5"},"schema":{"$ref":"#/components/schemas/CreateOrderRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"example":{"branchId":"8e9f0a1b-2c3d-4e4f-9a5b-6c7d8e9f0a11","createdAt":"2027-03-04T09:15:02Z","customerId":"9b2f6c1e-3a4d-4e5f-8a7b-1c2d3e4f5a60","deliveryTypeId":"b5d1e2f3-6a7b-4c8d-9e0f-1a2b3c4d5e66","id":"2c8e4a6b-9d1f-4b3c-a5e7-6f8a0b2c4d99","isRoundTrip":false,"notes":"Kapıda arayın.","number":10482,"parcels":[{"barcode":"PKT-00042-1","description":"Çiçek buketi","external":true,"id":"4d5e6f7a-8b9c-4d0e-9f1a-2b3c4d5e6f88","seq":1}],"payer":"sender","payerCustomerId":"9b2f6c1e-3a4d-4e5f-8a7b-1c2d3e4f5a60","paymentMethod":"account","plannedPickupAt":"2027-03-04T09:15:02Z","price":{"algorithmVersion":"kos-1","calculatedTotal":"180.00","currencyCode":"TRY","currencyRate":"1","deliveryMultiplier":"1","expectedDeliveryMinutes":90,"fromRegion":2,"lines":{"base":"150.00","bridge":"0.00","extra":"0.00","manualAdjustmentNet":"0.00","manualAdjustmentVat":"0.00","serviceNet":"150.00","vat":"30.00","volume":"0.00","wait":"0.00","weight":"0.00"},"nightMultiplier":"1","tier":"subscriber","toRegion":3,"total":"180.00","usesWallet":false,"vatRate":"20","vatScope":"all"},"reference":"SIP-2027-00042","source":"api","status":"on_table","stops":[{"address":"Caferağa Mah. Moda Cad. No:12, Kadıköy","customerId":"9b2f6c1e-3a4d-4e5f-8a7b-1c2d3e4f5a60","districtId":"3f1c2a4e-8b7d-4c21-9a55-0e6b1f2d3c41","districtName":"Kadıköy","name":"Örnek Çiçekçilik","phone":"+902165551234","regionNo":2,"role":"sender"},{"address":"Sinanpaşa Mah. Ihlamurdere Cad. No:5 D:3, Beşiktaş","districtId":"7a2e9c10-4d3b-4f8a-b1c2-5e6f7a8b9c02","districtName":"Beşiktaş","name":"Ayşe Yılmaz","phone":"+905321234567","regionNo":3,"role":"recipient"}],"version":1,"volumeM3":"0","waitMinutes":"0","weightKg":"2.5"},"schema":{"$ref":"#/components/schemas/Order"}}},"description":"Sipariş açıldı","headers":{"Idempotent-Replayed":{"description":"Yanıt aynı Idempotency-Key ile daha önce verilmiş yanıtın tekrarıdır (yeni sipariş açılmadı).","schema":{"enum":["true"],"type":"string"}}}},"409":{"$ref":"#/components/responses/IdempotencyConflict"},"default":{"$ref":"#/components/responses/Problem"}},"security":[{"apiKey":[]}],"x-codeSamples":[{"label":"curl","lang":"Shell","source":"# 1) Districts and delivery types (cache for a day)\ncurl -s https://client.courino.com/api/v1/me/order-options \\\n  -H \"Authorization: Bearer $KOS_API_KEY\"\n\n# 2) Create the order. The same Idempotency-Key makes a retry safe.\ncurl -s https://client.courino.com/api/v1/orders \\\n  -H \"Authorization: Bearer $KOS_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -d '{\n    \"sender\": {\"phone\": \"0216 555 12 34\", \"address\": \"Moda Cad. No:12, Kadıköy\"},\n    \"recipient\": {\n      \"districtId\": \"7a2e9c10-4d3b-4f8a-b1c2-5e6f7a8b9c02\",\n      \"name\": \"Ayşe Yılmaz\",\n      \"phone\": \"0532 123 45 67\",\n      \"address\": \"Ihlamurdere Cad. No:5 D:3, Beşiktaş\"\n    },\n    \"deliveryTypeId\": \"b5d1e2f3-6a7b-4c8d-9e0f-1a2b3c4d5e66\",\n    \"payer\": \"sender\",\n    \"reference\": \"SIP-2027-00042\",\n    \"weightKg\": \"2.5\"\n  }'\n"},{"label":"Node.js","lang":"JavaScript","source":"// Node.js 18+ (built-in fetch)\nimport { randomUUID } from \"node:crypto\";\n\nconst BASE = \"https://client.courino.com/api/v1\";\nconst headers = {\n  Authorization: `Bearer ${process.env.KOS_API_KEY}`,\n  \"Content-Type\": \"application/json\",\n};\n\nasync function call(method, path, body, extra = {}) {\n  const res = await fetch(BASE + path, {\n    method, headers: { ...headers, ...extra },\n    body: body && JSON.stringify(body),\n  });\n  const data = await res.json();\n  if (!res.ok) throw Object.assign(new Error(data.detail), { status: res.status, code: data.code });\n  return data;\n}\n\nconst order = {\n  sender: { phone: \"0216 555 12 34\", address: \"Moda Cad. No:12, Kadıköy\" },\n  recipient: {\n    districtId: \"7a2e9c10-4d3b-4f8a-b1c2-5e6f7a8b9c02\",\n    name: \"Ayşe Yılmaz\", phone: \"0532 123 45 67\",\n    address: \"Ihlamurdere Cad. No:5 D:3, Beşiktaş\",\n  },\n  deliveryTypeId: \"b5d1e2f3-6a7b-4c8d-9e0f-1a2b3c4d5e66\",\n  payer: \"sender\",\n  reference: \"SIP-2027-00042\",\n  weightKg: \"2.5\",\n};\n\n// 1) Price quote (the same rules are applied when the order is created)\nconst quote = await call(\"POST\", \"/pricing/quote\", {\n  sender: {}, recipient: { districtId: order.recipient.districtId },\n  deliveryTypeId: order.deliveryTypeId, payer: order.payer, weightKg: order.weightKg,\n});\nconsole.log(\"price\", quote.total);\n\n// 2) Create; keep the key and reuse it if you retry after a network error\nconst key = randomUUID();\nconst created = await call(\"POST\", \"/orders\", order, { \"Idempotency-Key\": key });\nconsole.log(\"order\", created.number, created.status);\n"},{"label":"Python","lang":"Python","source":"import os\nimport uuid\nimport requests  # pip install requests\n\nBASE = \"https://client.courino.com/api/v1\"\ns = requests.Session()\ns.headers[\"Authorization\"] = \"Bearer \" + os.environ[\"KOS_API_KEY\"]\n\norder = {\n    \"sender\": {\"phone\": \"0216 555 12 34\", \"address\": \"Moda Cad. No:12, Kadıköy\"},\n    \"recipient\": {\n        \"districtId\": \"7a2e9c10-4d3b-4f8a-b1c2-5e6f7a8b9c02\",\n        \"name\": \"Ayşe Yılmaz\",\n        \"phone\": \"0532 123 45 67\",\n        \"address\": \"Ihlamurdere Cad. No:5 D:3, Beşiktaş\",\n    },\n    \"deliveryTypeId\": \"b5d1e2f3-6a7b-4c8d-9e0f-1a2b3c4d5e66\",\n    \"payer\": \"sender\",\n    \"reference\": \"SIP-2027-00042\",\n    \"weightKg\": \"2.5\",\n}\n\n# 1) Price quote\nq = s.post(f\"{BASE}/pricing/quote\", json={\n    \"sender\": {},\n    \"recipient\": {\"districtId\": order[\"recipient\"][\"districtId\"]},\n    \"deliveryTypeId\": order[\"deliveryTypeId\"],\n    \"payer\": order[\"payer\"],\n    \"weightKg\": order[\"weightKg\"],\n}, timeout=15)\nq.raise_for_status()\nprint(\"price\", q.json()[\"total\"])\n\n# 2) Create, retrying network errors with the same Idempotency-Key\nkey = str(uuid.uuid4())\nfor attempt in range(3):\n    try:\n        r = s.post(f\"{BASE}/orders\", json=order,\n                   headers={\"Idempotency-Key\": key}, timeout=30)\n        break\n    except requests.ConnectionError:\n        if attempt == 2:\n            raise\nif r.status_code != 201:\n    p = r.json()\n    raise RuntimeError(f\"{r.status_code} {p['code']}: {p.get('detail')}\")\ncreated = r.json()\nprint(\"order\", created[\"number\"], created[\"status\"])\n"},{"label":"PHP","lang":"PHP","source":"<?php\nconst BASE = 'https://client.courino.com/api/v1';\n\nfunction kos(string $method, string $path, ?array $body = null, array $headers = []): array {\n    $ch = curl_init(BASE . $path);\n    curl_setopt_array($ch, [\n        CURLOPT_CUSTOMREQUEST => $method,\n        CURLOPT_RETURNTRANSFER => true,\n        CURLOPT_TIMEOUT => 30,\n        CURLOPT_HTTPHEADER => array_merge([\n            'Authorization: Bearer ' . getenv('KOS_API_KEY'),\n            'Content-Type: application/json',\n        ], $headers),\n        CURLOPT_POSTFIELDS => $body === null ? null : json_encode($body),\n    ]);\n    $data = json_decode(curl_exec($ch), true);\n    $status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\n    if ($status >= 400) {\n        throw new RuntimeException(\"$status {$data['code']}: {$data['detail']}\");\n    }\n    return $data;\n}\n\n$order = [\n    'sender' => ['phone' => '0216 555 12 34', 'address' => 'Moda Cad. No:12, Kadıköy'],\n    'recipient' => [\n        'districtId' => '7a2e9c10-4d3b-4f8a-b1c2-5e6f7a8b9c02',\n        'name' => 'Ayşe Yılmaz',\n        'phone' => '0532 123 45 67',\n        'address' => 'Ihlamurdere Cad. No:5 D:3, Beşiktaş',\n    ],\n    'deliveryTypeId' => 'b5d1e2f3-6a7b-4c8d-9e0f-1a2b3c4d5e66',\n    'payer' => 'sender',\n    'reference' => 'SIP-2027-00042',\n    'weightKg' => '2.5',\n];\n\n// 1) Price quote\n$quote = kos('POST', '/pricing/quote', [\n    'sender' => new stdClass(),\n    'recipient' => ['districtId' => $order['recipient']['districtId']],\n    'deliveryTypeId' => $order['deliveryTypeId'],\n    'payer' => $order['payer'],\n    'weightKg' => $order['weightKg'],\n]);\necho 'price ', $quote['total'], PHP_EOL;\n\n// 2) Create (reuse the same key when retrying)\n$key = bin2hex(random_bytes(16));\n$created = kos('POST', '/orders', $order, [\"Idempotency-Key: $key\"]);\necho 'order ', $created['number'], ' ', $created['status'], PHP_EOL;\n"},{"label":"C#","lang":"C#","source":"// .NET 6+\nusing System.Net.Http.Headers;\nusing System.Net.Http.Json;\nusing System.Text.Json;\n\nvar http = new HttpClient { BaseAddress = new Uri(\"https://client.courino.com/api/v1/\") };\nhttp.DefaultRequestHeaders.Authorization =\n    new AuthenticationHeaderValue(\"Bearer\", Environment.GetEnvironmentVariable(\"KOS_API_KEY\"));\n\nvar order = new {\n    sender = new { phone = \"0216 555 12 34\", address = \"Moda Cad. No:12, Kadıköy\" },\n    recipient = new {\n        districtId = \"7a2e9c10-4d3b-4f8a-b1c2-5e6f7a8b9c02\",\n        name = \"Ayşe Yılmaz\", phone = \"0532 123 45 67\",\n        address = \"Ihlamurdere Cad. No:5 D:3, Beşiktaş\",\n    },\n    deliveryTypeId = \"b5d1e2f3-6a7b-4c8d-9e0f-1a2b3c4d5e66\",\n    payer = \"sender\",\n    reference = \"SIP-2027-00042\",\n    weightKg = \"2.5\",\n};\n\n// 1) Price quote\nvar q = await http.PostAsJsonAsync(\"pricing/quote\", new {\n    sender = new { }, recipient = new { order.recipient.districtId },\n    order.deliveryTypeId, order.payer, order.weightKg,\n});\nvar quote = await q.Content.ReadFromJsonAsync<JsonElement>();\nConsole.WriteLine($\"price {quote.GetProperty(\"total\")}\");\n\n// 2) Create (reuse the same key when retrying)\nvar req = new HttpRequestMessage(HttpMethod.Post, \"orders\") { Content = JsonContent.Create(order) };\nreq.Headers.Add(\"Idempotency-Key\", Guid.NewGuid().ToString());\nvar res = await http.SendAsync(req);\nvar created = await res.Content.ReadFromJsonAsync<JsonElement>();\nif (!res.IsSuccessStatusCode)\n    throw new Exception($\"{(int)res.StatusCode} {created.GetProperty(\"code\")}\");\nConsole.WriteLine($\"order {created.GetProperty(\"number\")} {created.GetProperty(\"status\")}\");\n"},{"label":"Go","lang":"Go","source":"package main\n\nimport (\n\t\"bytes\"\n\t\"crypto/rand\"\n\t\"encoding/hex\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"net/http\"\n\t\"os\"\n)\n\nconst base = \"https://client.courino.com/api/v1\"\n\nfunc call(method, path string, in, out any, hdr map[string]string) error {\n\tb, _ := json.Marshal(in)\n\treq, _ := http.NewRequest(method, base+path, bytes.NewReader(b))\n\treq.Header.Set(\"Authorization\", \"Bearer \"+os.Getenv(\"KOS_API_KEY\"))\n\treq.Header.Set(\"Content-Type\", \"application/json\")\n\tfor k, v := range hdr {\n\t\treq.Header.Set(k, v)\n\t}\n\tres, err := http.DefaultClient.Do(req)\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer res.Body.Close()\n\tif res.StatusCode >= 400 {\n\t\tvar p struct{ Code, Detail string }\n\t\t_ = json.NewDecoder(res.Body).Decode(&p)\n\t\treturn fmt.Errorf(\"%d %s: %s\", res.StatusCode, p.Code, p.Detail)\n\t}\n\treturn json.NewDecoder(res.Body).Decode(out)\n}\n\nfunc main() {\n\trecipient := map[string]any{\n\t\t\"districtId\": \"7a2e9c10-4d3b-4f8a-b1c2-5e6f7a8b9c02\",\n\t\t\"name\":       \"Ayşe Yılmaz\",\n\t\t\"phone\":      \"0532 123 45 67\",\n\t\t\"address\":    \"Ihlamurdere Cad. No:5 D:3, Beşiktaş\",\n\t}\n\torder := map[string]any{\n\t\t\"sender\":         map[string]any{\"phone\": \"0216 555 12 34\", \"address\": \"Moda Cad. No:12, Kadıköy\"},\n\t\t\"recipient\":      recipient,\n\t\t\"deliveryTypeId\": \"b5d1e2f3-6a7b-4c8d-9e0f-1a2b3c4d5e66\",\n\t\t\"payer\":          \"sender\",\n\t\t\"reference\":      \"SIP-2027-00042\",\n\t\t\"weightKg\":       \"2.5\",\n\t}\n\n\t// 1) Price quote\n\tvar quote struct{ Total string }\n\terr := call(http.MethodPost, \"/pricing/quote\", map[string]any{\n\t\t\"sender\":         map[string]any{},\n\t\t\"recipient\":      map[string]any{\"districtId\": recipient[\"districtId\"]},\n\t\t\"deliveryTypeId\": order[\"deliveryTypeId\"],\n\t\t\"payer\":          order[\"payer\"],\n\t\t\"weightKg\":       order[\"weightKg\"],\n\t}, &quote, nil)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tfmt.Println(\"price\", quote.Total)\n\n\t// 2) Create (reuse the same key when retrying)\n\tk := make([]byte, 16)\n\t_, _ = rand.Read(k)\n\tvar created struct {\n\t\tNumber int64\n\t\tStatus string\n\t}\n\tif err := call(http.MethodPost, \"/orders\", order, &created,\n\t\tmap[string]string{\"Idempotency-Key\": hex.EncodeToString(k)}); err != nil {\n\t\tpanic(err)\n\t}\n\tfmt.Println(\"order\", created.Number, created.Status)\n}\n"}]}},"/me/orders/batch":{"post":{"tags":["Siparişler"],"summary":"Toplu sipariş açar (en çok 1000 satır)","description":"Excel/CSV yüklemesiyle aynı doğrulama ve mükerrer kuralları uygulanır. Semt `areaId` ya da `area`\n(+ `district`/`province`) adıyla, gidiş tipi `deliveryTypeId` ya da `deliveryType` adıyla verilir.\n`dryRun=true` yalnız doğrular (önizleme; sipariş açılmaz). Aksi halde geçerli satır varsa siparişler\nkuyrukta açılır; ilerlemeyi ve satır sonuçlarını `GET /me/orders/imports/{id}` ile izleyin.\nAynı referans numarası ya da koli barkoduyla mevcut sipariş varsa satır atlanır; bu yüzden aynı\npartiyi yeniden göndermek güvenlidir.","operationId":"createMyOrderBatch","requestBody":{"content":{"application/json":{"example":{"dryRun":false,"rows":[{"address":"Sinanpaşa Mah. Ihlamurdere Cad. No:5 D:3","areaId":"7a2e9c10-4d3b-4f8a-b1c2-5e6f7a8b9c02","deliveryTypeId":"b5d1e2f3-6a7b-4c8d-9e0f-1a2b3c4d5e66","parcels":1,"recipientName":"Ayşe Yılmaz","recipientPhone":"0532 123 45 67","reference":"SIP-2027-00043","weightKg":"1.2"},{"address":"Atatürk Mah. Ertuğrul Gazi Sok. No:8","area":"Atatürk","barcodes":["PKT-00044-1","PKT-00044-2"],"deliveryType":"Ekspres","district":"Ataşehir","parcels":2,"province":"İstanbul","recipientName":"Mehmet Demir","recipientPhone":"0533 987 65 43","reference":"SIP-2027-00044"}]},"schema":{"properties":{"dryRun":{"default":false,"description":"true ise satırlar yalnız doğrulanır, sipariş açılmaz.","type":"boolean"},"rows":{"description":"Sipariş satırları (1–1000).","items":{"$ref":"#/components/schemas/OrderBatchRow"},"maxItems":1000,"minItems":1,"type":"array"}},"required":["rows"],"type":"object"}}},"required":true},"responses":{"201":{"content":{"application/json":{"example":{"createdAt":"2027-03-04T09:20:00Z","createdRows":0,"customerId":"9b2f6c1e-3a4d-4e5f-8a7b-1c2d3e4f5a60","customerName":"Örnek Çiçekçilik","error":"","failedRows":0,"filename":"api","id":"6a7b8c9d-0e1f-4a2b-8c3d-4e5f6a7b8c22","skippedRows":0,"source":"api","status":"queued","totalRows":2,"validRows":2},"schema":{"$ref":"#/components/schemas/OrderImport"}}},"description":"Yükleme kaydı (önizleme ya da kuyrukta)"},"default":{"$ref":"#/components/responses/Problem"}},"security":[{"apiKey":[]}]}},"/me/orders/imports/{id}":{"get":{"tags":["Siparişler"],"summary":"Toplu yüklemenin durumu ve satır sonuçları","description":"`status` `done` olana dek birkaç saniye arayla sorgulayın. Satır başına durum (`created`,\n`skipped`, `failed`, `invalid`), açılan sipariş numarası ve hata nedeni `rows` içindedir.","operationId":"getMyOrderImport","parameters":[{"$ref":"#/components/parameters/Id"}],"responses":{"200":{"content":{"application/json":{"example":{"createdAt":"2027-03-04T09:20:00Z","createdRows":1,"customerId":"9b2f6c1e-3a4d-4e5f-8a7b-1c2d3e4f5a60","customerName":"Örnek Çiçekçilik","error":"","failedRows":0,"filename":"api","finishedAt":"2027-03-04T09:20:03Z","id":"6a7b8c9d-0e1f-4a2b-8c3d-4e5f6a7b8c22","rows":[{"address":"Sinanpaşa Mah. Ihlamurdere Cad. No:5 D:3","area":"Beşiktaş","areaId":"7a2e9c10-4d3b-4f8a-b1c2-5e6f7a8b9c02","barcodes":[],"deliveryTypeId":"b5d1e2f3-6a7b-4c8d-9e0f-1a2b3c4d5e66","deliveryTypeName":"Normal","issues":[],"message":"","no":1,"notes":"","orderId":"3d9f5b7c-0e2a-4c4d-b6f8-7a9b1c3d5e00","orderNumber":10483,"parcels":1,"recipientName":"Ayşe Yılmaz","recipientPhone":"+905321234567","reference":"SIP-2027-00043","status":"created","weightKg":"1.2"},{"address":"Atatürk Mah. Ertuğrul Gazi Sok. No:8","area":"Atatürk","areaId":"c4d5e6f7-0a1b-4c2d-8e3f-9a0b1c2d3e43","barcodes":["PKT-00044-1","PKT-00044-2"],"deliveryTypeId":"e1f2a3b4-c5d6-4e7f-8a9b-0c1d2e3f4a77","deliveryTypeName":"Ekspres","district":"Ataşehir","duplicateOrderNumber":10470,"issues":[],"message":"Aynı referans numarasıyla sipariş var","no":2,"notes":"","parcels":2,"province":"İstanbul","recipientName":"Mehmet Demir","recipientPhone":"+905339876543","reference":"SIP-2027-00044","status":"skipped","weightKg":""}],"skippedRows":1,"source":"api","startedAt":"2027-03-04T09:20:01Z","status":"done","totalRows":2,"validRows":2},"schema":{"$ref":"#/components/schemas/OrderImport"}}},"description":"Yükleme"},"default":{"$ref":"#/components/responses/Problem"}},"security":[{"apiKey":[]}]},"delete":{"tags":["Siparişler"],"summary":"Önizlemedeki yüklemeden vazgeçer","description":"Onaylanmış (kuyruktaki ya da bitmiş) yükleme geri alınamaz; açılan siparişleri tek tek iptal edin.","operationId":"discardMyOrderImport","parameters":[{"$ref":"#/components/parameters/Id"}],"responses":{"204":{"description":"Vazgeçildi"},"default":{"$ref":"#/components/responses/Problem"}},"security":[{"apiKey":[]}]}},"/me/orders/imports":{"get":{"tags":["Siparişler"],"summary":"Toplu yüklemelerim (en yeni önce)","description":"Satır ayrıntısı içermez; ayrıntı için tek yüklemeyi okuyun.","operationId":"listMyOrderImports","parameters":[{"description":"Döndürülecek en çok kayıt","example":20,"in":"query","name":"limit","schema":{"default":50,"maximum":100,"minimum":1,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"example":[{"createdAt":"2027-03-04T09:20:00Z","createdRows":0,"customerId":"9b2f6c1e-3a4d-4e5f-8a7b-1c2d3e4f5a60","customerName":"Örnek Çiçekçilik","error":"","failedRows":0,"filename":"api","id":"6a7b8c9d-0e1f-4a2b-8c3d-4e5f6a7b8c22","skippedRows":0,"source":"api","status":"queued","totalRows":2,"validRows":2}],"schema":{"items":{"$ref":"#/components/schemas/OrderImport"},"type":"array"}}},"description":"Yüklemeler"},"default":{"$ref":"#/components/responses/Problem"}},"security":[{"apiKey":[]}]},"post":{"tags":["Siparişler"],"summary":"Excel/CSV toplu gönderi dosyasını yükler ve önizler (sipariş açılmaz)","description":"Dosya (.xlsx ya da .csv; en çok 5 MB, 1000 satır) ayrıştırılır, satırlar doğrulanır (alıcı adı,\ntelefon, il/ilçe/semt, adres, gidiş tipi, koli sayısı, barkod, referans no) ve önizleme olarak\nsaklanır. Hatalı satırlar `issues` ile döner; mevcut referans no / barkodla çakışan satırlar\n`duplicateOrderNumber` ile işaretlenir ve içe aktarmada atlanır. Siparişler ancak\n`POST /me/orders/imports/{id}/confirm` ile onaylanınca kuyrukta açılır. Dosya yerine JSON\ngöndermek için `POST /me/orders/batch` kullanın.","operationId":"uploadMyOrderImport","requestBody":{"content":{"multipart/form-data":{"example":{"file":"siparisler.xlsx"},"schema":{"properties":{"file":{"description":".xlsx ya da .csv; en çok 5 MB","format":"binary","type":"string"}},"required":["file"],"type":"object"}}},"required":true},"responses":{"201":{"content":{"application/json":{"example":{"createdAt":"2027-03-04T08:50:00Z","createdRows":0,"customerId":"9b2f6c1e-3a4d-4e5f-8a7b-1c2d3e4f5a60","customerName":"Örnek Çiçekçilik","error":"","failedRows":0,"filename":"siparisler.xlsx","id":"8b9c0d1e-2f3a-4b4c-9d5e-6f7a8b9c0d33","skippedRows":0,"source":"customer","status":"preview","totalRows":40,"validRows":38},"schema":{"$ref":"#/components/schemas/OrderImport"}}},"description":"Önizleme"},"default":{"$ref":"#/components/responses/Problem"}},"security":[{"apiKey":[]}]}},"/me/orders":{"get":{"tags":["Siparişler"],"summary":"Siparişlerim (verdiğim ya da ödediğim)","description":"Varsayılan olarak en yeni sipariş önce gelir. Süzgeçler birlikte kullanılabilir; `total` süzgece uyan\ntoplam kayıt sayısıdır. Sayfalama `limit`/`offset` iledir.\n\n- `q`: alıcı/gönderen adı, telefonu, adresi, referans ve not içinde arar.\n- `minAmount`/`maxAmount`: sipariş toplamı (KDV dahil) aralığı.\n- `sort`: `createdAt` (varsayılan, azalan), `number`, `total`, `status`, `deliveredAt`, `plannedPickupAt`;\n  azalan için başına `-` koyun (ör. `-total`).","operationId":"listMyOrders","parameters":[{"description":"Bir ya da daha çok durum, virgülle ayrılmış (ör. `assigned,picked_up`)","example":["assigned","picked_up"],"explode":false,"in":"query","name":"status","schema":{"items":{"$ref":"#/components/schemas/OrderStatus"},"type":"array"},"style":"form"},{"description":"Sipariş numarası","in":"query","name":"number","schema":{"format":"int64","type":"integer"}},{"description":"Müşteri referans numarası (büyük/küçük harf duyarsız tam eşleşme)","in":"query","name":"reference","schema":{"maxLength":100,"type":"string"}},{"description":"Koli barkodu (büyük/küçük harf duyarsız tam eşleşme)","in":"query","name":"barcode","schema":{"maxLength":40,"type":"string"}},{"description":"Oluşturulma zamanı alt sınırı","example":"2027-03-01T00:00:00+03:00","in":"query","name":"from","schema":{"format":"date-time","type":"string"}},{"description":"Oluşturulma zamanı üst sınırı (hariç)","example":"2027-04-01T00:00:00+03:00","in":"query","name":"to","schema":{"format":"date-time","type":"string"}},{"description":"Planlanan alım zamanı alt sınırı","in":"query","name":"plannedFrom","schema":{"format":"date-time","type":"string"}},{"description":"Planlanan alım zamanı üst sınırı (hariç)","in":"query","name":"plannedTo","schema":{"format":"date-time","type":"string"}},{"description":"Gönderen veya alım noktası semti","in":"query","name":"fromDistrictId","schema":{"format":"uuid","type":"string"}},{"description":"Alıcı semti","in":"query","name":"toDistrictId","schema":{"format":"uuid","type":"string"}},{"description":"Gidiş tipi","in":"query","name":"deliveryTypeId","schema":{"format":"uuid","type":"string"}},{"description":"Ödeme şekli","in":"query","name":"paymentMethod","schema":{"$ref":"#/components/schemas/PaymentMethod"}},{"description":"Sayfa boyu","example":50,"in":"query","name":"limit","schema":{"default":50,"maximum":200,"minimum":1,"type":"integer"}},{"description":"Atlanacak kayıt sayısı","in":"query","name":"offset","schema":{"default":0,"minimum":0,"type":"integer"}},{"$ref":"#/components/parameters/ListQ"},{"$ref":"#/components/parameters/MinAmount"},{"$ref":"#/components/parameters/MaxAmount"},{"$ref":"#/components/parameters/ListSort"}],"responses":{"200":{"content":{"application/json":{"example":{"items":[{"branchId":"8e9f0a1b-2c3d-4e4f-9a5b-6c7d8e9f0a11","createdAt":"2027-03-04T09:15:02Z","customerId":"9b2f6c1e-3a4d-4e5f-8a7b-1c2d3e4f5a60","deliveryTypeId":"b5d1e2f3-6a7b-4c8d-9e0f-1a2b3c4d5e66","id":"2c8e4a6b-9d1f-4b3c-a5e7-6f8a0b2c4d99","isRoundTrip":false,"notes":"Kapıda arayın.","number":10482,"parcels":[{"barcode":"PKT-00042-1","description":"Çiçek buketi","external":true,"id":"4d5e6f7a-8b9c-4d0e-9f1a-2b3c4d5e6f88","seq":1}],"payer":"sender","payerCustomerId":"9b2f6c1e-3a4d-4e5f-8a7b-1c2d3e4f5a60","paymentMethod":"account","plannedPickupAt":"2027-03-04T09:15:02Z","price":{"algorithmVersion":"kos-1","calculatedTotal":"180.00","currencyCode":"TRY","currencyRate":"1","deliveryMultiplier":"1","expectedDeliveryMinutes":90,"fromRegion":2,"lines":{"base":"150.00","bridge":"0.00","extra":"0.00","manualAdjustmentNet":"0.00","manualAdjustmentVat":"0.00","serviceNet":"150.00","vat":"30.00","volume":"0.00","wait":"0.00","weight":"0.00"},"nightMultiplier":"1","tier":"subscriber","toRegion":3,"total":"180.00","usesWallet":false,"vatRate":"20","vatScope":"all"},"reference":"SIP-2027-00042","source":"api","status":"on_table","stops":[{"address":"Caferağa Mah. Moda Cad. No:12, Kadıköy","customerId":"9b2f6c1e-3a4d-4e5f-8a7b-1c2d3e4f5a60","districtId":"3f1c2a4e-8b7d-4c21-9a55-0e6b1f2d3c41","districtName":"Kadıköy","name":"Örnek Çiçekçilik","phone":"+902165551234","regionNo":2,"role":"sender"},{"address":"Sinanpaşa Mah. Ihlamurdere Cad. No:5 D:3, Beşiktaş","districtId":"7a2e9c10-4d3b-4f8a-b1c2-5e6f7a8b9c02","districtName":"Beşiktaş","name":"Ayşe Yılmaz","phone":"+905321234567","regionNo":3,"role":"recipient"}],"version":1,"volumeM3":"0","waitMinutes":"0","weightKg":"2.5"}],"total":1},"schema":{"$ref":"#/components/schemas/OrderPage"}}},"description":"Siparişler"},"default":{"$ref":"#/components/responses/Problem"}},"security":[{"apiKey":[]}]}},"/me/orders/{id}":{"get":{"tags":["Siparişler"],"summary":"Siparişi okur","description":"Verdiğiniz ya da ödediğiniz sipariş döner; başka siparişte 404 alırsınız.","operationId":"getMyOrder","parameters":[{"$ref":"#/components/parameters/Id"}],"responses":{"200":{"content":{"application/json":{"example":{"branchId":"8e9f0a1b-2c3d-4e4f-9a5b-6c7d8e9f0a11","createdAt":"2027-03-04T09:15:02Z","customerId":"9b2f6c1e-3a4d-4e5f-8a7b-1c2d3e4f5a60","deliveryTypeId":"b5d1e2f3-6a7b-4c8d-9e0f-1a2b3c4d5e66","id":"2c8e4a6b-9d1f-4b3c-a5e7-6f8a0b2c4d99","isRoundTrip":false,"notes":"Kapıda arayın.","number":10482,"parcels":[{"barcode":"PKT-00042-1","description":"Çiçek buketi","external":true,"id":"4d5e6f7a-8b9c-4d0e-9f1a-2b3c4d5e6f88","seq":1}],"payer":"sender","payerCustomerId":"9b2f6c1e-3a4d-4e5f-8a7b-1c2d3e4f5a60","paymentMethod":"account","plannedPickupAt":"2027-03-04T09:15:02Z","price":{"algorithmVersion":"kos-1","calculatedTotal":"180.00","currencyCode":"TRY","currencyRate":"1","deliveryMultiplier":"1","expectedDeliveryMinutes":90,"fromRegion":2,"lines":{"base":"150.00","bridge":"0.00","extra":"0.00","manualAdjustmentNet":"0.00","manualAdjustmentVat":"0.00","serviceNet":"150.00","vat":"30.00","volume":"0.00","wait":"0.00","weight":"0.00"},"nightMultiplier":"1","tier":"subscriber","toRegion":3,"total":"180.00","usesWallet":false,"vatRate":"20","vatScope":"all"},"reference":"SIP-2027-00042","source":"api","status":"on_table","stops":[{"address":"Caferağa Mah. Moda Cad. No:12, Kadıköy","customerId":"9b2f6c1e-3a4d-4e5f-8a7b-1c2d3e4f5a60","districtId":"3f1c2a4e-8b7d-4c21-9a55-0e6b1f2d3c41","districtName":"Kadıköy","name":"Örnek Çiçekçilik","phone":"+902165551234","regionNo":2,"role":"sender"},{"address":"Sinanpaşa Mah. Ihlamurdere Cad. No:5 D:3, Beşiktaş","districtId":"7a2e9c10-4d3b-4f8a-b1c2-5e6f7a8b9c02","districtName":"Beşiktaş","name":"Ayşe Yılmaz","phone":"+905321234567","regionNo":3,"role":"recipient"}],"version":1,"volumeM3":"0","waitMinutes":"0","weightKg":"2.5"},"schema":{"$ref":"#/components/schemas/Order"}}},"description":"Sipariş"},"default":{"$ref":"#/components/responses/Problem"}},"security":[{"apiKey":[]}]},"put":{"tags":["Siparişler"],"summary":"Henüz kuryeye verilmemiş siparişimi düzenler","description":"Yalnız sizin açtığınız ve durumu `on_table` ya da `pending_approval` olan sipariş düzenlenebilir;\nkuryeye verilmiş siparişte 409 `CONFLICT` döner. Gövdeye siparişin tam hali (`order`) ve okuduğunuz\n`version` konur; arada sipariş değiştiyse 409 `VERSION_CONFLICT` alırsınız, siparişi yeniden okuyup\ntekrar deneyin. Fiyat yeniden hesaplanır.","operationId":"updateMyOrder","parameters":[{"$ref":"#/components/parameters/Id"}],"requestBody":{"content":{"application/json":{"example":{"order":{"deliveryTypeId":"b5d1e2f3-6a7b-4c8d-9e0f-1a2b3c4d5e66","notes":"Kapıda arayın.","parcels":[{"barcode":"PKT-00042-1","description":"Çiçek buketi"}],"payer":"sender","paymentMethod":"account","recipient":{"address":"Sinanpaşa Mah. Ihlamurdere Cad. No:5 D:3, Beşiktaş","districtId":"7a2e9c10-4d3b-4f8a-b1c2-5e6f7a8b9c02","name":"Ayşe Yılmaz","phone":"0532 123 45 67"},"reference":"SIP-2027-00042","sender":{"address":"Caferağa Mah. Moda Cad. No:12, Kadıköy","phone":"0216 555 12 34"},"weightKg":"2.5"},"version":1},"schema":{"$ref":"#/components/schemas/UpdateOrderRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"example":{"branchId":"8e9f0a1b-2c3d-4e4f-9a5b-6c7d8e9f0a11","createdAt":"2027-03-04T09:15:02Z","customerId":"9b2f6c1e-3a4d-4e5f-8a7b-1c2d3e4f5a60","deliveryTypeId":"b5d1e2f3-6a7b-4c8d-9e0f-1a2b3c4d5e66","id":"2c8e4a6b-9d1f-4b3c-a5e7-6f8a0b2c4d99","isRoundTrip":false,"notes":"Kapıda arayın.","number":10482,"parcels":[{"barcode":"PKT-00042-1","description":"Çiçek buketi","external":true,"id":"4d5e6f7a-8b9c-4d0e-9f1a-2b3c4d5e6f88","seq":1}],"payer":"sender","payerCustomerId":"9b2f6c1e-3a4d-4e5f-8a7b-1c2d3e4f5a60","paymentMethod":"account","plannedPickupAt":"2027-03-04T09:15:02Z","price":{"algorithmVersion":"kos-1","calculatedTotal":"180.00","currencyCode":"TRY","currencyRate":"1","deliveryMultiplier":"1","expectedDeliveryMinutes":90,"fromRegion":2,"lines":{"base":"150.00","bridge":"0.00","extra":"0.00","manualAdjustmentNet":"0.00","manualAdjustmentVat":"0.00","serviceNet":"150.00","vat":"30.00","volume":"0.00","wait":"0.00","weight":"0.00"},"nightMultiplier":"1","tier":"subscriber","toRegion":3,"total":"180.00","usesWallet":false,"vatRate":"20","vatScope":"all"},"reference":"SIP-2027-00042","source":"api","status":"on_table","stops":[{"address":"Caferağa Mah. Moda Cad. No:12, Kadıköy","customerId":"9b2f6c1e-3a4d-4e5f-8a7b-1c2d3e4f5a60","districtId":"3f1c2a4e-8b7d-4c21-9a55-0e6b1f2d3c41","districtName":"Kadıköy","name":"Örnek Çiçekçilik","phone":"+902165551234","regionNo":2,"role":"sender"},{"address":"Sinanpaşa Mah. Ihlamurdere Cad. No:5 D:3, Beşiktaş","districtId":"7a2e9c10-4d3b-4f8a-b1c2-5e6f7a8b9c02","districtName":"Beşiktaş","name":"Ayşe Yılmaz","phone":"+905321234567","regionNo":3,"role":"recipient"}],"version":1,"volumeM3":"0","waitMinutes":"0","weightKg":"2.5"},"schema":{"$ref":"#/components/schemas/Order"}}},"description":"Güncel sipariş"},"default":{"$ref":"#/components/responses/Problem"}},"security":[{"apiKey":[]}]}},"/me/orders/{id}/cancel":{"post":{"tags":["Siparişler"],"summary":"Henüz kuryeye verilmemiş siparişimi iptal eder","description":"Yalnız durumu `on_table` ya da `pending_approval` olan sipariş iptal edilebilir; kuryeye verilmiş\nsiparişte 409 `CONFLICT` döner (firmayla iletişime geçin). Pul ile ödenmişse tutar bakiyeye iade\nedilir. `Idempotency-Key` ile güvenle yeniden denenebilir.","operationId":"cancelMyOrder","parameters":[{"$ref":"#/components/parameters/Id"},{"$ref":"#/components/parameters/OrderIdempotencyKey"}],"requestBody":{"content":{"application/json":{"example":{"reason":"Alıcı siparişten vazgeçti"},"schema":{"$ref":"#/components/schemas/CancelRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"example":{"branchId":"8e9f0a1b-2c3d-4e4f-9a5b-6c7d8e9f0a11","cancelReason":"Alıcı siparişten vazgeçti","cancelledAt":"2027-03-04T09:31:40Z","createdAt":"2027-03-04T09:15:02Z","customerId":"9b2f6c1e-3a4d-4e5f-8a7b-1c2d3e4f5a60","deliveryTypeId":"b5d1e2f3-6a7b-4c8d-9e0f-1a2b3c4d5e66","id":"2c8e4a6b-9d1f-4b3c-a5e7-6f8a0b2c4d99","isRoundTrip":false,"notes":"Kapıda arayın.","number":10482,"payer":"sender","paymentMethod":"account","plannedPickupAt":"2027-03-04T09:15:02Z","price":{"algorithmVersion":"kos-1","calculatedTotal":"180.00","currencyCode":"TRY","currencyRate":"1","deliveryMultiplier":"1","expectedDeliveryMinutes":90,"fromRegion":2,"lines":{"base":"150.00","bridge":"0.00","extra":"0.00","manualAdjustmentNet":"0.00","manualAdjustmentVat":"0.00","serviceNet":"150.00","vat":"30.00","volume":"0.00","wait":"0.00","weight":"0.00"},"nightMultiplier":"1","tier":"subscriber","toRegion":3,"total":"180.00","usesWallet":false,"vatRate":"20","vatScope":"all"},"reference":"SIP-2027-00042","source":"api","status":"cancelled","stops":[{"address":"Caferağa Mah. Moda Cad. No:12, Kadıköy","customerId":"9b2f6c1e-3a4d-4e5f-8a7b-1c2d3e4f5a60","districtName":"Kadıköy","name":"Örnek Çiçekçilik","regionNo":2,"role":"sender"},{"address":"Sinanpaşa Mah. Ihlamurdere Cad. No:5 D:3, Beşiktaş","districtName":"Beşiktaş","name":"Ayşe Yılmaz","regionNo":3,"role":"recipient"}],"version":2,"volumeM3":"0","waitMinutes":"0","weightKg":"2.5"},"schema":{"$ref":"#/components/schemas/Order"}}},"description":"İptal edilmiş sipariş","headers":{"Idempotent-Replayed":{"description":"Yanıt aynı Idempotency-Key ile daha önce verilmiş yanıtın tekrarıdır.","schema":{"enum":["true"],"type":"string"}}}},"409":{"$ref":"#/components/responses/IdempotencyConflict"},"default":{"$ref":"#/components/responses/Problem"}},"security":[{"apiKey":[]}]}},"/me/orders/{id}/attachments":{"get":{"tags":["Siparişler"],"summary":"Siparişin teslim fotoğrafları ve imzası","description":"Kuryenin alımda/teslimde çektiği fotoğraflar ve alıcı imzası (varsa). Görselin kendisini ayrı uçtan indirin.","operationId":"listMyOrderAttachments","parameters":[{"$ref":"#/components/parameters/Id"}],"responses":{"200":{"content":{"application/json":{"example":[{"accuracy":8,"capturedAt":"2027-03-04T11:02:10Z","contentType":"image/jpeg","createdAt":"2027-03-04T11:02:14Z","height":960,"id":"7e8f9a0b-1c2d-4e3f-8a4b-5c6d7e8f9a33","kind":"delivery","lat":41.0438,"lng":29.0094,"size":184233,"width":1280},{"contentType":"image/png","createdAt":"2027-03-04T11:02:20Z","height":240,"id":"8f9a0b1c-2d3e-4f4a-9b5c-6d7e8f9a0b44","kind":"signature","size":9120,"width":600}],"schema":{"items":{"$ref":"#/components/schemas/OrderAttachment"},"type":"array"}}},"description":"Ekler"},"default":{"$ref":"#/components/responses/Problem"}},"security":[{"apiKey":[]}]}},"/me/orders/{id}/attachments/{attachmentId}":{"get":{"tags":["Siparişler"],"summary":"Ek görselini indirir","description":"Görsel ikili olarak (JPEG ya da PNG) döner.","operationId":"getMyOrderAttachment","parameters":[{"$ref":"#/components/parameters/Id"},{"description":"Ek kimliği (ek listesinden)","example":"7e8f9a0b-1c2d-4e3f-8a4b-5c6d7e8f9a33","in":"path","name":"attachmentId","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"content":{"image/jpeg":{"schema":{"format":"binary","type":"string"}},"image/png":{"schema":{"format":"binary","type":"string"}}},"description":"Görsel"},"default":{"$ref":"#/components/responses/Problem"}},"security":[{"apiKey":[]}]}},"/me/orders/export":{"get":{"tags":["Siparişler"],"summary":"Sipariş arşivim (CSV)","description":"Süzgeçler, arama (`q`), tutar aralığı ve sıralama (`sort`) sipariş listesiyle aynıdır. Tek seferde en\nçok 20.000 sipariş dışa aktarılır; aşılırsa 422 döner, tarih aralığını daraltın.","operationId":"exportMyOrders","parameters":[{"description":"Bir ya da daha çok durum, virgülle ayrılmış","explode":false,"in":"query","name":"status","schema":{"items":{"$ref":"#/components/schemas/OrderStatus"},"type":"array"},"style":"form"},{"description":"Sipariş numarası","in":"query","name":"number","schema":{"format":"int64","type":"integer"}},{"description":"Müşteri referans numarası (büyük/küçük harf duyarsız tam eşleşme)","in":"query","name":"reference","schema":{"maxLength":100,"type":"string"}},{"description":"Koli barkodu (büyük/küçük harf duyarsız tam eşleşme)","in":"query","name":"barcode","schema":{"maxLength":40,"type":"string"}},{"description":"Oluşturulma zamanı alt sınırı","example":"2027-03-01T00:00:00+03:00","in":"query","name":"from","schema":{"format":"date-time","type":"string"}},{"description":"Oluşturulma zamanı üst sınırı (hariç)","example":"2027-04-01T00:00:00+03:00","in":"query","name":"to","schema":{"format":"date-time","type":"string"}},{"description":"Gönderen veya alım noktası semti","in":"query","name":"fromDistrictId","schema":{"format":"uuid","type":"string"}},{"description":"Alıcı semti","in":"query","name":"toDistrictId","schema":{"format":"uuid","type":"string"}},{"description":"Gidiş tipi","in":"query","name":"deliveryTypeId","schema":{"format":"uuid","type":"string"}},{"description":"Ödeme şekli","in":"query","name":"paymentMethod","schema":{"$ref":"#/components/schemas/PaymentMethod"}},{"$ref":"#/components/parameters/ListQ"},{"$ref":"#/components/parameters/MinAmount"},{"$ref":"#/components/parameters/MaxAmount"},{"$ref":"#/components/parameters/ListSort"}],"responses":{"200":{"content":{"text/csv":{"example":"Sipariş No;Oluşturma;Durum;Gönderen;Gönderen semti;Alım noktası;Alım semti;Alıcı;Alıcı semti;Gidiş tipi;Gidiş-dönüş;Kurye;Alındı;Teslim;Teslim alan;Ödeme şekli;Referans no;Tutar;Para birimi;Not;İptal nedeni;Teslim kodu;Konum sonucu;Konum mesafesi (m)\n10482;04.03.2027 12:15;Teslim edildi;Örnek Çiçekçilik;Kadıköy;;;Ayşe Yılmaz;Beşiktaş;Normal;;Ali Kaya;04.03.2027 12:40;04.03.2027 14:02;Ayşe Yılmaz;Açık cari;SIP-2027-00042;180,00;TRY;Kapıda arayın.;;;Adreste;12\n","schema":{"format":"binary","type":"string"}}},"description":"CSV dosyası"},"default":{"$ref":"#/components/responses/Problem"}},"security":[{"apiKey":[]}]}},"/me/orders/imports/template":{"get":{"tags":["Siparişler"],"summary":"Toplu gönderi şablonu (örnek satırlı)","description":"Sütun başlıkları ve bir örnek satır içeren boş şablon; `format` ile xlsx ya da csv seçilir.","operationId":"getMyOrderImportTemplate","parameters":[{"description":"Dosya biçimi (varsayılan xlsx)","in":"query","name":"format","schema":{"default":"xlsx","enum":["xlsx","csv"],"type":"string"}},{"description":"Başlık dili (boş: isteğin dili)","in":"query","name":"lang","schema":{"enum":["tr","en"],"type":"string"}}],"responses":{"200":{"content":{"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":{"schema":{"format":"binary","type":"string"}},"text/csv":{"schema":{"format":"binary","type":"string"}}},"description":"Şablon"},"default":{"$ref":"#/components/responses/Problem"}},"security":[{"apiKey":[]}]}},"/me/orders/imports/{id}/confirm":{"post":{"tags":["Siparişler"],"summary":"Önizlemedeki yüklemenin geçerli satırlarından siparişleri açar","description":"Yalnız `preview` durumundaki yükleme onaylanır; geçersiz ve mükerrer satırlar atlanır. Siparişler\nkuyrukta açılır; ilerlemeyi ve satır sonuçlarını `GET /me/orders/imports/{id}` ile izleyin.","operationId":"confirmMyOrderImport","parameters":[{"$ref":"#/components/parameters/Id"}],"responses":{"200":{"content":{"application/json":{"example":{"createdAt":"2027-03-04T08:50:00Z","createdRows":0,"customerId":"9b2f6c1e-3a4d-4e5f-8a7b-1c2d3e4f5a60","customerName":"Örnek Çiçekçilik","error":"","failedRows":0,"filename":"siparisler.xlsx","id":"8b9c0d1e-2f3a-4b4c-9d5e-6f7a8b9c0d33","skippedRows":0,"source":"customer","status":"queued","totalRows":40,"validRows":38},"schema":{"$ref":"#/components/schemas/OrderImport"}}},"description":"Kuyruğa alınan yükleme"},"default":{"$ref":"#/components/responses/Problem"}},"security":[{"apiKey":[]}]}},"/me/orders/imports/{id}/report":{"get":{"tags":["Siparişler"],"summary":"Yüklemenin sonuç raporu (CSV)","description":"Satır başına durum, açılan sipariş numarası ve hata iletisi.","operationId":"getMyOrderImportReport","parameters":[{"$ref":"#/components/parameters/Id"}],"responses":{"200":{"content":{"text/csv":{"schema":{"format":"binary","type":"string"}}},"description":"CSV"},"default":{"$ref":"#/components/responses/Problem"}},"security":[{"apiKey":[]}]}},"/me/orders/{id}/tracking":{"get":{"tags":["Takip"],"summary":"Siparişin canlı kurye takibi","description":"Kurye adı sipariş kuryeye verildiğinden teslime kadar döner. Kuryenin konumu yalnız gönderi yoldayken\n(`picked_up` / `return_leg`) ve konum 15 dakikadan tazeyse verilir. Yoldaki gönderide 30–60 saniyede\nbir sorgulamanız yeterlidir; durum değişikliklerini webhook ile almanız önerilir.","operationId":"getMyOrderTracking","parameters":[{"$ref":"#/components/parameters/Id"}],"responses":{"200":{"content":{"application/json":{"example":{"companyPhone":"+902165550000","courierName":"Ali Kaya","expectedAt":"2027-03-04T11:05:00Z","location":{"at":"2027-03-04T10:48:31Z","lat":41.0391,"lng":29.0021},"status":"picked_up"},"schema":{"$ref":"#/components/schemas/MyOrderTracking"}}},"description":"Takip bilgisi"},"default":{"$ref":"#/components/responses/Problem"}},"security":[{"apiKey":[]}]}},"/me/orders/{id}/tracking-link":{"post":{"tags":["Takip"],"summary":"Alıcıya iletilecek takip bağlantısı","description":"Oturum açmadan görüntülenen herkese açık takip sayfasının adresini döner. Bağlantı ilk istekte\noluşturulur ve sonra hep aynıdır; alıcıya SMS, e-posta ya da kendi uygulamanızla iletebilirsiniz.","operationId":"createMyOrderTrackingLink","parameters":[{"$ref":"#/components/parameters/Id"}],"responses":{"200":{"content":{"application/json":{"example":{"url":"https://ornekkurye.courino.com/t/Xk3pQ9vB2mLs"},"schema":{"properties":{"url":{"description":"Takip sayfasının tam adresi","type":"string"}},"required":["url"],"type":"object"}}},"description":"Bağlantı"},"default":{"$ref":"#/components/responses/Problem"}},"security":[{"apiKey":[]}]}},"/me/webhooks":{"get":{"tags":["Webhook"],"summary":"Webhook aboneliklerim","description":"Sır (`secret`) listede dönmez; yalnız oluşturma ve yenilemede bir kez gösterilir.","operationId":"listMyWebhooks","responses":{"200":{"content":{"application/json":{"example":[{"createdAt":"2027-03-01T08:00:00Z","customerId":"9b2f6c1e-3a4d-4e5f-8a7b-1c2d3e4f5a60","description":"Sipariş durumları","enabled":true,"events":["order.assigned","order.picked_up","order.delivered","order.delivery_failed","order.cancelled"],"format":"kos","id":"1f2e3d4c-5b6a-4978-8695-a4b3c2d1e0f9","url":"https://ornek.com.tr/kurye/webhook"}],"schema":{"items":{"$ref":"#/components/schemas/Webhook"},"type":"array"}}},"description":"Abonelikler"},"default":{"$ref":"#/components/responses/Problem"}},"security":[{"apiKey":[]}]},"post":{"tags":["Webhook"],"summary":"Webhook aboneliği açar (en çok 5)","description":"Abonelik yalnız sizin verdiğiniz ya da ödediğiniz siparişlerin olaylarını alır. Adres `http://` ya\nda `https://` olmalı (https önerilir) ve kullanıcı adı/şifre içermemelidir. Yanıttaki `secret` imza doğrulaması içindir ve **yalnız\nbir kez** gösterilir; güvenli bir yerde saklayın. İmza ve teslim kuralları kılavuzun Webhook\nbölümündedir.","operationId":"createMyWebhook","requestBody":{"content":{"application/json":{"example":{"description":"Sipariş durumları","enabled":true,"events":["order.assigned","order.picked_up","order.delivered","order.delivery_failed","order.cancelled"],"format":"kos","url":"https://ornek.com.tr/kurye/webhook"},"schema":{"$ref":"#/components/schemas/WebhookInput"}}},"required":true},"responses":{"201":{"content":{"application/json":{"example":{"secret":"whsec_q8Yb3nR2vT7kL0pW5sZ1xC4mJ9hF6dG2aE8uI3oN5yQ","webhook":{"createdAt":"2027-03-01T08:00:00Z","customerId":"9b2f6c1e-3a4d-4e5f-8a7b-1c2d3e4f5a60","description":"Sipariş durumları","enabled":true,"events":["order.assigned","order.picked_up","order.delivered","order.delivery_failed","order.cancelled"],"format":"kos","id":"1f2e3d4c-5b6a-4978-8695-a4b3c2d1e0f9","url":"https://ornek.com.tr/kurye/webhook"}},"schema":{"properties":{"secret":{"description":"İmza sırrı (`whsec_…`); yalnız bu yanıtta gösterilir","type":"string"},"webhook":{"$ref":"#/components/schemas/Webhook"}},"required":["webhook","secret"],"type":"object"}}},"description":"Abonelik açıldı"},"default":{"$ref":"#/components/responses/Problem"}},"security":[{"apiKey":[]}],"x-codeSamples":[{"label":"curl","lang":"Shell","source":"curl -s https://client.courino.com/api/v1/me/webhooks \\\n  -H \"Authorization: Bearer $KOS_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"url\": \"https://example.com/kurye/webhook\",\n    \"events\": [\"order.picked_up\", \"order.delivered\", \"order.delivery_failed\", \"order.cancelled\"],\n    \"enabled\": true\n  }'\n# Store the \"secret\" (whsec_...) from the response; it is shown only once.\n"},{"label":"Node.js (verify)","lang":"JavaScript","source":"// Express: verify X-KOS-Signature on the RAW body, then answer 2xx quickly.\nimport express from \"express\";\nimport crypto from \"node:crypto\";\n\nconst SECRET = process.env.KOS_WEBHOOK_SECRET; // whsec_... (used as-is)\nconst TOLERANCE = 300; // seconds\nconst seen = new Set(); // use a database/cache in production\n\nfunction verify(raw, header) {\n  const parts = Object.fromEntries(header.split(\",\").map((p) => p.split(\"=\", 2)));\n  const t = Number(parts.t);\n  if (!t || Math.abs(Date.now() / 1000 - t) > TOLERANCE) return false;\n  const expected = crypto.createHmac(\"sha256\", SECRET).update(`${t}.`).update(raw).digest();\n  const given = Buffer.from(parts.v1 || \"\", \"hex\");\n  return given.length === expected.length && crypto.timingSafeEqual(given, expected);\n}\n\nconst app = express();\napp.post(\"/kurye/webhook\", express.raw({ type: \"application/json\" }), (req, res) => {\n  if (!verify(req.body, req.get(\"X-KOS-Signature\") || \"\")) return res.sendStatus(401);\n  const delivery = req.get(\"X-KOS-Delivery\");\n  if (seen.has(delivery)) return res.sendStatus(200); // retry of a delivery already handled\n  seen.add(delivery);\n  const event = JSON.parse(req.body);\n  console.log(event.type, event.data.order.number, event.data.order.status);\n  res.sendStatus(204);\n});\napp.listen(3000);\n"},{"label":"Python (verify)","lang":"Python","source":"# Flask: verify X-KOS-Signature on the RAW body, then answer 2xx quickly.\nimport hashlib\nimport hmac\nimport os\nimport time\nfrom flask import Flask, abort, request\n\nSECRET = os.environ[\"KOS_WEBHOOK_SECRET\"].encode()  # whsec_... (used as-is)\nTOLERANCE = 300  # seconds\napp = Flask(__name__)\nseen = set()  # use a database/cache in production\n\ndef verify(raw: bytes, header: str) -> bool:\n    parts = dict(p.split(\"=\", 1) for p in header.split(\",\") if \"=\" in p)\n    try:\n        t = int(parts[\"t\"])\n    except (KeyError, ValueError):\n        return False\n    if abs(time.time() - t) > TOLERANCE:\n        return False\n    expected = hmac.new(SECRET, f\"{t}.\".encode() + raw, hashlib.sha256).hexdigest()\n    return hmac.compare_digest(expected, parts.get(\"v1\", \"\"))\n\n@app.post(\"/kurye/webhook\")\ndef kos_webhook():\n    if not verify(request.get_data(), request.headers.get(\"X-KOS-Signature\", \"\")):\n        abort(401)\n    delivery = request.headers[\"X-KOS-Delivery\"]\n    if delivery in seen:\n        return \"\", 200\n    seen.add(delivery)\n    event = request.get_json()\n    print(event[\"type\"], event[\"data\"][\"order\"][\"number\"])\n    return \"\", 204\n"},{"label":"PHP (verify)","lang":"PHP","source":"<?php\n// Verify X-KOS-Signature on the RAW body, then answer 2xx quickly.\n$secret = getenv('KOS_WEBHOOK_SECRET'); // whsec_... (used as-is)\n$raw = file_get_contents('php://input');\n$header = $_SERVER['HTTP_X_KOS_SIGNATURE'] ?? '';\n\n$parts = [];\nforeach (explode(',', $header) as $p) {\n    [$k, $v] = array_pad(explode('=', $p, 2), 2, '');\n    $parts[$k] = $v;\n}\n$t = (int)($parts['t'] ?? 0);\n$expected = hash_hmac('sha256', $t . '.' . $raw, $secret);\nif ($t === 0 || abs(time() - $t) > 300 || !hash_equals($expected, $parts['v1'] ?? '')) {\n    http_response_code(401);\n    exit;\n}\n\n$delivery = $_SERVER['HTTP_X_KOS_DELIVERY'] ?? '';\n// if (alreadyHandled($delivery)) { http_response_code(200); exit; }\n$event = json_decode($raw, true);\nerror_log($event['type'] . ' ' . $event['data']['order']['number']);\nhttp_response_code(204);\n"},{"label":"C# (verify)","lang":"C#","source":"// ASP.NET Core minimal API: verify X-KOS-Signature on the RAW body.\nusing System.Security.Cryptography;\nusing System.Text;\n\nvar secret = Encoding.UTF8.GetBytes(Environment.GetEnvironmentVariable(\"KOS_WEBHOOK_SECRET\")!);\nvar app = WebApplication.Create(args);\n\napp.MapPost(\"/kurye/webhook\", async (HttpRequest req) =>\n{\n    using var ms = new MemoryStream();\n    await req.Body.CopyToAsync(ms);\n    var raw = ms.ToArray();\n\n    var parts = req.Headers[\"X-KOS-Signature\"].ToString().Split(',')\n        .Select(p => p.Split('=', 2)).Where(p => p.Length == 2)\n        .ToDictionary(p => p[0], p => p[1]);\n    if (!parts.TryGetValue(\"t\", out var ts) || !long.TryParse(ts, out var t) ||\n        Math.Abs(DateTimeOffset.UtcNow.ToUnixTimeSeconds() - t) > 300)\n        return Results.Unauthorized();\n\n    var signed = Encoding.UTF8.GetBytes($\"{t}.\").Concat(raw).ToArray();\n    var expected = HMACSHA256.HashData(secret, signed);\n    byte[] given;\n    try { given = Convert.FromHexString(parts.GetValueOrDefault(\"v1\", \"\")); }\n    catch (FormatException) { return Results.Unauthorized(); }\n    if (!CryptographicOperations.FixedTimeEquals(expected, given))\n        return Results.Unauthorized();\n\n    var delivery = req.Headers[\"X-KOS-Delivery\"].ToString(); // dedupe on this\n    return Results.NoContent();\n});\napp.Run();\n"},{"label":"Go (verify)","lang":"Go","source":"package main\n\nimport (\n\t\"crypto/hmac\"\n\t\"crypto/sha256\"\n\t\"encoding/hex\"\n\t\"io\"\n\t\"net/http\"\n\t\"os\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n)\n\nvar secret = []byte(os.Getenv(\"KOS_WEBHOOK_SECRET\")) // whsec_... (used as-is)\n\n// verify checks X-KOS-Signature: t=<unix>,v1=<hex HMAC-SHA256(secret, \"<t>.<body>\")>.\nfunc verify(body []byte, header string) bool {\n\tvar ts, v1 string\n\tfor _, p := range strings.Split(header, \",\") {\n\t\tk, v, _ := strings.Cut(p, \"=\")\n\t\tswitch k {\n\t\tcase \"t\":\n\t\t\tts = v\n\t\tcase \"v1\":\n\t\t\tv1 = v\n\t\t}\n\t}\n\tt, err := strconv.ParseInt(ts, 10, 64)\n\tif err != nil || time.Since(time.Unix(t, 0)).Abs() > 5*time.Minute {\n\t\treturn false\n\t}\n\tgiven, err := hex.DecodeString(v1)\n\tif err != nil {\n\t\treturn false\n\t}\n\tmac := hmac.New(sha256.New, secret)\n\tmac.Write([]byte(ts + \".\"))\n\tmac.Write(body)\n\treturn hmac.Equal(given, mac.Sum(nil))\n}\n\nfunc main() {\n\thttp.HandleFunc(\"/kurye/webhook\", func(w http.ResponseWriter, r *http.Request) {\n\t\tbody, err := io.ReadAll(io.LimitReader(r.Body, 1<<20))\n\t\tif err != nil || !verify(body, r.Header.Get(\"X-KOS-Signature\")) {\n\t\t\tw.WriteHeader(http.StatusUnauthorized)\n\t\t\treturn\n\t\t}\n\t\t_ = r.Header.Get(\"X-KOS-Delivery\") // dedupe on this; stays the same across retries\n\t\tw.WriteHeader(http.StatusNoContent)\n\t})\n\t_ = http.ListenAndServe(\":3000\", nil)\n}\n"}]}},"/me/webhooks/{id}":{"parameters":[{"$ref":"#/components/parameters/Id"}],"put":{"tags":["Webhook"],"summary":"Webhook aboneliğini günceller","description":"Adres, olaylar, açıklama, biçim ve etkinlik değiştirilebilir; sır değişmez.","operationId":"updateMyWebhook","requestBody":{"content":{"application/json":{"example":{"description":"Sipariş durumları","enabled":true,"events":["order.assigned","order.picked_up","order.delivered","order.delivery_failed","order.cancelled"],"format":"kos","url":"https://ornek.com.tr/kurye/webhook"},"schema":{"$ref":"#/components/schemas/WebhookInput"}}},"required":true},"responses":{"200":{"content":{"application/json":{"example":{"createdAt":"2027-03-01T08:00:00Z","customerId":"9b2f6c1e-3a4d-4e5f-8a7b-1c2d3e4f5a60","description":"Sipariş durumları","enabled":true,"events":["order.assigned","order.picked_up","order.delivered","order.delivery_failed","order.cancelled"],"format":"kos","id":"1f2e3d4c-5b6a-4978-8695-a4b3c2d1e0f9","url":"https://ornek.com.tr/kurye/webhook"},"schema":{"$ref":"#/components/schemas/Webhook"}}},"description":"Güncel abonelik"},"default":{"$ref":"#/components/responses/Problem"}},"security":[{"apiKey":[]}]},"delete":{"tags":["Webhook"],"summary":"Webhook aboneliğini siler","description":"Abonelik kalıcı olarak silinir; yeniden açarsanız yeni bir sır alırsınız.","operationId":"deleteMyWebhook","responses":{"204":{"description":"Silindi"},"default":{"$ref":"#/components/responses/Problem"}},"security":[{"apiKey":[]}]}},"/me/webhooks/{id}/rotate-secret":{"parameters":[{"$ref":"#/components/parameters/Id"}],"post":{"tags":["Webhook"],"summary":"Webhook sırrını yeniler","description":"Yeni sır hemen geçerli olur; sonraki istekler yeni sırla imzalanır. Sırrınız sızdıysa ya da düzenli\nyenileme için kullanın. Yeni sır yalnız bu yanıtta gösterilir.","operationId":"rotateMyWebhookSecret","responses":{"200":{"content":{"application/json":{"example":{"secret":"whsec_Zr4Tq1Wm8Ky2Nb6Vc3Xl9Hs5Jd0Pf7Ga4Ue1Io8Ow2Ry"},"schema":{"properties":{"secret":{"description":"Yeni imza sırrı (`whsec_…`)","type":"string"}},"required":["secret"],"type":"object"}}},"description":"Yeni sır"},"default":{"$ref":"#/components/responses/Problem"}},"security":[{"apiKey":[]}]}},"/me/customer":{"get":{"tags":["Hesap"],"summary":"Müşteri kaydım, yetkililerim ve adres defterim","description":"`links` adres defterinizdeki (size bağlı) müşterilerdir; alım noktası ya da alıcı olarak\n`customerId` ile kullanılabilirler. `contacts` bildirim alan yetkililerinizdir.","operationId":"getMyCustomer","responses":{"200":{"content":{"application/json":{"example":{"contacts":[{"email":"zeynep@ornek.com.tr","id":"2a3b4c5d-6e7f-4a8b-9c0d-1e2f3a4b5c66","mobilePhone":"+905441112233","name":"Zeynep Arslan","notifyEmail":true,"notifySms":true,"status":"active"}],"customer":{"account":"active","address":"Caferağa Mah. Moda Cad. No:12, Kadıköy","code":"M0042","deliveryCodePolicy":"inherit","districtId":"3f1c2a4e-8b7d-4c21-9a55-0e6b1f2d3c41","email":"siparis@ornek.com.tr","id":"9b2f6c1e-3a4d-4e5f-8a7b-1c2d3e4f5a60","isVip":false,"name":"Örnek Çiçekçilik","notifyEmail":true,"notifySms":false,"phone":"+902165551234","requiresApproval":false,"status":"active","taxNumber":"1234567890","taxOffice":"Kadıköy"},"links":[{"address":"Bağdat Cad. No:210, Kadıköy","code":"M0057","districtId":"3f1c2a4e-8b7d-4c21-9a55-0e6b1f2d3c41","id":"5d7e8f90-1a2b-4c3d-9e8f-7a6b5c4d3e21","name":"Moda Butik","status":"active"}],"specialDates":[{"day":14,"id":"3b4c5d6e-7f8a-4b9c-8d0e-1f2a3b4c5d77","label":"Kuruluş yıl dönümü","month":5,"year":2009}]},"schema":{"$ref":"#/components/schemas/CustomerProfile"}}},"description":"Müşteri profili"},"default":{"$ref":"#/components/responses/Problem"}},"security":[{"apiKey":[]}]}},"/me/customer/contacts":{"post":{"tags":["Hesap"],"summary":"Bildirim alacak yetkili ekler","description":"Yetkili, `notifySms` / `notifyEmail` açıksa siparişlerinizin bildirimlerini alır. Kayıtlı\nyetkililer `GET /me/customer` yanıtındaki `contacts` alanındadır.","operationId":"createMyContact","requestBody":{"content":{"application/json":{"example":{"email":"zeynep@ornek.com.tr","mobilePhone":"+905441112233","name":"Zeynep Arslan","notifyEmail":true,"notifySms":true,"status":"active"},"schema":{"$ref":"#/components/schemas/CustomerContactInput"}}},"required":true},"responses":{"201":{"content":{"application/json":{"example":{"email":"zeynep@ornek.com.tr","id":"2a3b4c5d-6e7f-4a8b-9c0d-1e2f3a4b5c66","mobilePhone":"+905441112233","name":"Zeynep Arslan","notifyEmail":true,"notifySms":true,"status":"active"},"schema":{"$ref":"#/components/schemas/CustomerContact"}}},"description":"Eklenen yetkili"},"default":{"$ref":"#/components/responses/Problem"}},"security":[{"apiKey":[]}]}},"/me/customer/contacts/{contactId}":{"put":{"tags":["Hesap"],"summary":"Yetkiliyi günceller ya da pasife alır","description":"Yetkili silinmez; bildirim almaması için `status: inactive` gönderin.","operationId":"updateMyContact","parameters":[{"description":"Yetkilinin kimliği (`GET /me/customer` → `contacts`)","example":"2a3b4c5d-6e7f-4a8b-9c0d-1e2f3a4b5c66","in":"path","name":"contactId","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"example":{"email":"zeynep@ornek.com.tr","mobilePhone":"+905441112233","name":"Zeynep Arslan","notifyEmail":true,"notifySms":false,"status":"active"},"schema":{"$ref":"#/components/schemas/CustomerContactInput"}}},"required":true},"responses":{"200":{"content":{"application/json":{"example":{"email":"zeynep@ornek.com.tr","id":"2a3b4c5d-6e7f-4a8b-9c0d-1e2f3a4b5c66","mobilePhone":"+905441112233","name":"Zeynep Arslan","notifyEmail":true,"notifySms":false,"status":"active"},"schema":{"$ref":"#/components/schemas/CustomerContact"}}},"description":"Güncel yetkili"},"default":{"$ref":"#/components/responses/Problem"}},"security":[{"apiKey":[]}]}},"/me/customer/special-dates":{"put":{"tags":["Hesap"],"summary":"Özel günlerimi verilen listeyle değiştirir (en çok 20)","description":"Liste bütün olarak değiştirilir: gönderilmeyen kayıtlar silinir, boş liste hepsini siler. Firma\nbu günlerde size kutlama ya da hatırlatma iletisi gönderebilir. Güncel liste `GET /me/customer`\nyanıtında da bulunur.","operationId":"replaceMyCustomerSpecialDates","requestBody":{"content":{"application/json":{"example":{"items":[{"day":14,"label":"Kuruluş yıl dönümü","month":5,"year":2009},{"day":10,"label":"Anneler Günü kampanyası","month":5}]},"schema":{"$ref":"#/components/schemas/CustomerSpecialDatesInput"}}},"required":true},"responses":{"200":{"content":{"application/json":{"example":[{"day":14,"id":"3b4c5d6e-7f8a-4b9c-8d0e-1f2a3b4c5d77","label":"Kuruluş yıl dönümü","month":5,"year":2009},{"day":10,"id":"4c5d6e7f-8a9b-4c0d-9e1f-2a3b4c5d6e81","label":"Anneler Günü kampanyası","month":5}],"schema":{"items":{"$ref":"#/components/schemas/CustomerSpecialDate"},"type":"array"}}},"description":"Güncel liste"},"default":{"$ref":"#/components/responses/Problem"}},"security":[{"apiKey":[]}]}},"/me/customer/messages":{"get":{"tags":["Hesap"],"summary":"Size ve yetkililerinize gönderilen SMS, e-posta ve bildirimler","description":"Siparişleriniz için size, yetkililerinize ve uygulama hesaplarınıza gönderilen iletiler (en yeni\nönce). Push satırlarında alıcı, bildirimin gittiği uygulama hesabının adıdır.","operationId":"listMyMessages","parameters":[{"description":"Kanal süzgeci","example":"sms","in":"query","name":"channel","schema":{"enum":["sms","email","push","whatsapp"],"type":"string"}},{"description":"Döndürülecek en çok kayıt","in":"query","name":"limit","schema":{"default":50,"maximum":200,"minimum":1,"type":"integer"}},{"description":"Atlanacak kayıt sayısı","in":"query","name":"offset","schema":{"default":0,"minimum":0,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"example":{"items":[{"body":"10482 numaralı gönderiniz teslim edildi.","channel":"sms","createdAt":"2027-03-04T11:42:10Z","id":"9c0d1e2f-3a4b-4c5d-8e6f-7a8b9c0d1e44","orderId":"2c8e4a6b-9d1f-4b3c-a5e7-6f8a0b2c4d99","recipient":"+905441112233","sentAt":"2027-03-04T11:42:12Z","status":"sent","subject":""}],"total":1},"schema":{"$ref":"#/components/schemas/CustomerMessagePage"}}},"description":"Mesajlar"},"default":{"$ref":"#/components/responses/Problem"}},"security":[{"apiKey":[]}]}},"/me/wallet":{"get":{"tags":["Ödeme ve fatura"],"summary":"Pul bakiyem ve son hareketler","description":"Ön ödemeli (pul) müşteriler içindir; bakiye, son 100 hareket ve eksi bakiye kuralı döner.","operationId":"getMyWallet","responses":{"200":{"content":{"application/json":{"example":{"balance":"1250.00","entries":[{"amount":"-180.00","createdAt":"2027-03-04T09:15:02Z","id":"4c5d6e7f-8a9b-4c0d-9e1f-2a3b4c5d6e88","kind":"order_charge","note":"","orderId":"2c8e4a6b-9d1f-4b3c-a5e7-6f8a0b2c4d99"},{"amount":"1000.00","createdAt":"2027-03-01T10:00:00Z","id":"5d6e7f8a-9b0c-4d1e-8f2a-3b4c5d6e7f99","kind":"topup","note":"Havale"}],"lowBalance":false,"lowBalanceThreshold":"200.00","policy":{"allowsNegative":false,"availableBalance":"1250.00","negative":"inherit"}},"schema":{"$ref":"#/components/schemas/Wallet"}}},"description":"Pul bakiyesi"},"default":{"$ref":"#/components/responses/Problem"}},"security":[{"apiKey":[]}]}},"/me/customer/charges":{"get":{"tags":["Ödeme ve fatura"],"summary":"Ödeyeni olduğum sipariş tahakkukları","description":"Sipariş başına ücret kırılımı, ödeme durumu ve girdiği fatura. `sumTotal` ve `sumUnpaid` süzgece uyan\ntüm kayıtların toplamıdır.\n\n- `q`: sipariş referansı, gönderen/alıcı/ödeyen adı içinde arar.\n- `minAmount`/`maxAmount`: sipariş toplamı aralığı.\n- `sort`: `createdAt` (varsayılan, azalan), `number`, `total`, `deliveredAt`, `paidAt`; azalan için başına `-`.","operationId":"listMyCharges","parameters":[{"description":"Ödeme durumu","example":"unpaid","in":"query","name":"status","schema":{"$ref":"#/components/schemas/PaymentStatus"}},{"description":"Başlangıç tarihi","example":"2027-03-01","in":"query","name":"from","schema":{"format":"date","type":"string"}},{"description":"Bitiş tarihi","example":"2027-03-31","in":"query","name":"to","schema":{"format":"date","type":"string"}},{"description":"Sayfa boyu","in":"query","name":"limit","schema":{"default":50,"maximum":500,"minimum":1,"type":"integer"}},{"description":"Atlanacak kayıt sayısı","in":"query","name":"offset","schema":{"default":0,"minimum":0,"type":"integer"}},{"$ref":"#/components/parameters/MinAmount"},{"$ref":"#/components/parameters/MaxAmount"},{"$ref":"#/components/parameters/ListQ"},{"in":"query","name":"paymentMethod","schema":{"$ref":"#/components/schemas/PaymentMethod"}},{"description":"true: e-faturası kesilmiş; false: kesilmemiş","in":"query","name":"einvoiced","schema":{"type":"boolean"}},{"$ref":"#/components/parameters/ListSort"}],"responses":{"200":{"content":{"application/json":{"example":{"items":[{"algorithmVersion":"kos-1","bridge":"0.00","createdAt":"2027-03-04T09:15:02Z","currencyCode":"TRY","deliveredAt":"2027-03-04T11:02:20Z","description":"Normal","manualNet":"0.00","number":10482,"orderId":"2c8e4a6b-9d1f-4b3c-a5e7-6f8a0b2c4d99","orderStatus":"delivered","payer":"sender","payerCustomerId":"9b2f6c1e-3a4d-4e5f-8a7b-1c2d3e4f5a60","payerName":"Örnek Çiçekçilik","paymentStatus":"unpaid","recipient":"Ayşe Yılmaz","sender":"Örnek Çiçekçilik","serviceNet":"150.00","total":"180.00","usesWallet":false,"vat":"30.00","vatRate":"20","volume":"0.00","wait":"0.00","weight":"0.00"}],"sumTotal":"180.00","sumUnpaid":"180.00","total":1},"schema":{"$ref":"#/components/schemas/ChargePage"}}},"description":"Tahakkuklar"},"default":{"$ref":"#/components/responses/Problem"}},"security":[{"apiKey":[]}]}},"/me/einvoices":{"get":{"tags":["Ödeme ve fatura"],"summary":"Kesilmiş faturalarım (e-Fatura / e-Arşiv)","description":"Varsayılan olarak en yeni fatura önce gelir.\n\n- `q`: fatura numarası ve unvan içinde arar.\n- `minAmount`/`maxAmount`: fatura toplamı aralığı.\n- `sort`: `createdAt` (varsayılan, azalan), `issuedAt`, `total`, `status`; azalan için başına `-`.","operationId":"listMyEInvoices","parameters":[{"description":"Sayfa boyu","example":20,"in":"query","name":"limit","schema":{"default":50,"maximum":200,"minimum":1,"type":"integer"}},{"description":"Atlanacak kayıt sayısı","in":"query","name":"offset","schema":{"default":0,"minimum":0,"type":"integer"}},{"description":"Oluşturulma zamanı alt sınırı","in":"query","name":"from","schema":{"format":"date-time","type":"string"}},{"description":"Oluşturulma zamanı üst sınırı (hariç)","in":"query","name":"to","schema":{"format":"date-time","type":"string"}},{"description":"Faturadaki sipariş numarası","in":"query","name":"orderNumber","schema":{"format":"int64","minimum":1,"type":"integer"}},{"$ref":"#/components/parameters/MinAmount"},{"$ref":"#/components/parameters/MaxAmount"},{"$ref":"#/components/parameters/ListQ"},{"$ref":"#/components/parameters/ListSort"}],"responses":{"200":{"content":{"application/json":{"example":{"items":[{"createdAt":"2027-04-01T06:00:00Z","currencyCode":"TRY","customerId":"9b2f6c1e-3a4d-4e5f-8a7b-1c2d3e4f5a60","customerName":"Örnek Çiçekçilik","error":"","id":"6e7f8a9b-0c1d-4e2f-9a3b-4c5d6e7f8a00","issuedAt":"2027-04-01T06:00:41Z","kind":"e_invoice","net":"1500.00","orderIds":["2c8e4a6b-9d1f-4b3c-a5e7-6f8a0b2c4d99"],"orderNumbers":[10482],"status":"issued","total":"1800.00","vat":"300.00"}],"total":1},"schema":{"$ref":"#/components/schemas/EInvoicePage"}}},"description":"Faturalar"},"default":{"$ref":"#/components/responses/Problem"}},"security":[{"apiKey":[]}]}},"/me/einvoices/{id}/pdf":{"parameters":[{"$ref":"#/components/parameters/Id"}],"get":{"tags":["Ödeme ve fatura"],"summary":"Fatura PDF bağlantısı","description":"Fatura kesildikten (`issued`) sonra kullanılabilir. Bağlantı kısa ömürlüdür; saklamayın, gerektiğinde yeniden isteyin.","operationId":"myEInvoicePdf","responses":{"200":{"content":{"application/json":{"example":{"url":"https://files.courino.com/einvoice/6e7f8a9b.pdf?expires=1806300000&signature=3f9a"},"schema":{"properties":{"url":{"description":"PDF adresi","type":"string"}},"required":["url"],"type":"object"}}},"description":"Kısa ömürlü PDF bağlantısı"},"default":{"$ref":"#/components/responses/Problem"}},"security":[{"apiKey":[]}]}},"/me/customer/statement":{"get":{"tags":["Ödeme ve fatura"],"summary":"Dönem hesap ekstresi (PDF)","description":"Verilen tarih aralığındaki tahakkuklar, ödemeler ve bakiye; PDF olarak döner.","operationId":"myStatement","parameters":[{"description":"Dönem başı (dahil)","in":"query","name":"from","required":true,"schema":{"format":"date","type":"string"}},{"description":"Dönem sonu (dahil)","in":"query","name":"to","required":true,"schema":{"format":"date","type":"string"}}],"responses":{"200":{"content":{"application/pdf":{"schema":{"format":"binary","type":"string"}}},"description":"PDF","headers":{"Content-Disposition":{"schema":{"type":"string"}}}},"default":{"$ref":"#/components/responses/Problem"}},"security":[{"apiKey":[]}]}},"/me/customer/charges/{id}/document":{"get":{"tags":["Ödeme ve fatura"],"summary":"Siparişin hizmet dökümü (PDF)","description":"Yalnız ücretini ödeyen taraf olduğunuz siparişin dökümü indirilebilir.","operationId":"myChargeDocument","parameters":[{"$ref":"#/components/parameters/Id"}],"responses":{"200":{"content":{"application/pdf":{"schema":{"format":"binary","type":"string"}}},"description":"PDF","headers":{"Content-Disposition":{"schema":{"type":"string"}}}},"default":{"$ref":"#/components/responses/Problem"}},"security":[{"apiKey":[]}]}},"/me/customer/payments":{"get":{"tags":["Ödeme ve fatura"],"summary":"Online ödemelerim","description":"Kartla yaptığınız online ödemeler (en yeni önce). `q` sağlayıcı referansı, açıklama ve hata\niletisi içinde arar. Sıralama (`sort`): createdAt (varsayılan, azalan), amount, status,\ncompletedAt. Yeni ödeme yalnız müşteri portalından başlatılır.","operationId":"listMyPayments","parameters":[{"description":"Döndürülecek en çok kayıt","in":"query","name":"limit","schema":{"default":50,"maximum":200,"minimum":1,"type":"integer"}},{"description":"Atlanacak kayıt sayısı","in":"query","name":"offset","schema":{"default":0,"minimum":0,"type":"integer"}},{"description":"Durum süzgeci","in":"query","name":"status","schema":{"$ref":"#/components/schemas/OnlinePaymentStatus"}},{"description":"Oluşturulma zamanı alt sınırı","in":"query","name":"from","schema":{"format":"date-time","type":"string"}},{"description":"Oluşturulma zamanı üst sınırı (hariç)","in":"query","name":"to","schema":{"format":"date-time","type":"string"}},{"$ref":"#/components/parameters/MinAmount"},{"$ref":"#/components/parameters/MaxAmount"},{"$ref":"#/components/parameters/ListQ"},{"$ref":"#/components/parameters/ListSort"}],"responses":{"200":{"content":{"application/json":{"example":{"items":[{"amount":"360.00","checkoutExpiresAt":"2027-03-05T10:30:00Z","collector":"firm","completedAt":"2027-03-05T10:02:41Z","createdAt":"2027-03-05T10:00:00Z","currency":"TRY","customerId":"9b2f6c1e-3a4d-4e5f-8a7b-1c2d3e4f5a60","description":"Mart 2027 sipariş ücretleri","id":"0d1e2f3a-4b5c-4d6e-9f7a-8b9c0d1e2f55","installments":1,"kind":"charges","orderIds":["2c8e4a6b-9d1f-4b3c-a5e7-6f8a0b2c4d99"],"paidAmount":"360.00","provider":"paytr","providerRef":"P-0D1E2F3A","refundedAmount":"0.00","status":"succeeded","storedCard":false,"test":false}],"total":1},"schema":{"$ref":"#/components/schemas/PaymentPage"}}},"description":"Ödemeler"},"default":{"$ref":"#/components/responses/Problem"}},"security":[{"apiKey":[]}]}},"/me/customer/payments/{id}":{"get":{"tags":["Ödeme ve fatura"],"summary":"Online ödemenin ayrıntısı","description":"Durum, ödenen ve iade edilen tutarlar ve kapsadığı siparişler.","operationId":"getMyPayment","parameters":[{"$ref":"#/components/parameters/Id"}],"responses":{"200":{"content":{"application/json":{"example":{"amount":"360.00","checkoutExpiresAt":"2027-03-05T10:30:00Z","collector":"firm","completedAt":"2027-03-05T10:02:41Z","createdAt":"2027-03-05T10:00:00Z","currency":"TRY","customerId":"9b2f6c1e-3a4d-4e5f-8a7b-1c2d3e4f5a60","description":"Mart 2027 sipariş ücretleri","id":"0d1e2f3a-4b5c-4d6e-9f7a-8b9c0d1e2f55","installments":1,"kind":"charges","orderIds":["2c8e4a6b-9d1f-4b3c-a5e7-6f8a0b2c4d99"],"paidAmount":"360.00","provider":"paytr","providerRef":"P-0D1E2F3A","refundedAmount":"0.00","status":"succeeded","storedCard":false,"test":false},"schema":{"$ref":"#/components/schemas/Payment"}}},"description":"Ödeme"},"default":{"$ref":"#/components/responses/Problem"}},"security":[{"apiKey":[]}]}},"/me/cod":{"get":{"tags":["Kapıda ödeme"],"summary":"Kapıda ödeme bakiyem","description":"Sizin adınıza tahsil edilen ve size aktarılmayı bekleyen tutarların özeti.","operationId":"getMyCod","responses":{"200":{"content":{"application/json":{"example":{"awaiting":"450.00","currency":"TRY","customerId":"9b2f6c1e-3a4d-4e5f-8a7b-1c2d3e4f5a60","customerName":"Örnek Çiçekçilik","lastRemittedOn":"2027-03-01","oldestDueOn":"2027-03-08","overdue":"0.00","pending":"1200.00","pendingCount":3,"pendingFee":"30.00","ready":"800.00","readyCount":2,"readyFee":"20.00","remitted":"15400.00","withCourier":"0.00"},"schema":{"$ref":"#/components/schemas/CodBalance"}}},"description":"Bakiye"},"default":{"$ref":"#/components/responses/Problem"}},"security":[{"apiKey":[]}]}},"/me/cod/orders":{"get":{"tags":["Kapıda ödeme"],"summary":"Kapıda ödemeli siparişlerim","description":"Siparişe göre tahsilat durumu, vade ve aktarım bilgisi.\n\n- `q`: sipariş no, referans, alıcı adı/telefonu ve kurye adı içinde arar.\n- `minAmount`/`maxAmount`: tahsil edilecek tutar aralığı.\n- `sort`: `collectedAt` (varsayılan, azalan), `number`, `amount`, `dueOn`, `status`; azalan için başına `-`.","operationId":"listMyCodOrders","parameters":[{"$ref":"#/components/parameters/CodQStatus"},{"$ref":"#/components/parameters/CodQFrom"},{"$ref":"#/components/parameters/CodQTo"},{"$ref":"#/components/parameters/CodQOverdue"},{"$ref":"#/components/parameters/CodQRemittance"},{"description":"Sayfa boyu","example":50,"in":"query","name":"limit","schema":{"maximum":500,"minimum":1,"type":"integer"}},{"description":"Atlanacak kayıt sayısı","in":"query","name":"offset","schema":{"minimum":0,"type":"integer"}},{"$ref":"#/components/parameters/ListQ"},{"$ref":"#/components/parameters/MinAmount"},{"$ref":"#/components/parameters/MaxAmount"},{"$ref":"#/components/parameters/ListSort"}],"responses":{"200":{"content":{"application/json":{"example":{"items":[{"amount":"400.00","collectedAt":"2027-03-04T11:02:20Z","courierName":"Ali Kaya","currency":"TRY","customerId":"9b2f6c1e-3a4d-4e5f-8a7b-1c2d3e4f5a60","customerName":"Örnek Çiçekçilik","dueOn":"2027-03-08","fee":"10.00","handoverAt":"2027-03-04T19:10:00Z","method":"cash","number":10482,"orderCreatedAt":"2027-03-04T09:15:02Z","orderId":"2c8e4a6b-9d1f-4b3c-a5e7-6f8a0b2c4d99","orderStatus":"delivered","recipientName":"Ayşe Yılmaz","status":"pending"}],"total":1},"schema":{"$ref":"#/components/schemas/CodOrderPage"}}},"description":"Kapıda ödemeli siparişler"},"default":{"$ref":"#/components/responses/Problem"}},"security":[{"apiKey":[]}]}},"/me/cod/orders/export":{"get":{"tags":["Kapıda ödeme"],"summary":"Kapıda ödeme ekstrem (CSV)","description":"`GET /me/cod/orders` ile aynı süzgeçleri alır. `q`: sipariş no, referans, müşteri, alıcı\nadı/telefonu, kurye. `sort`: collectedAt, number, amount, dueOn, customer, status (- azalan;\nvarsayılan -collectedAt).","operationId":"exportMyCodOrders","parameters":[{"$ref":"#/components/parameters/CodQStatus"},{"$ref":"#/components/parameters/CodQFrom"},{"$ref":"#/components/parameters/CodQTo"},{"$ref":"#/components/parameters/CodQOverdue"},{"$ref":"#/components/parameters/CodQRemittance"},{"$ref":"#/components/parameters/ListQ"},{"$ref":"#/components/parameters/MinAmount"},{"$ref":"#/components/parameters/MaxAmount"},{"$ref":"#/components/parameters/ListSort"}],"responses":{"200":{"content":{"text/csv":{"schema":{"format":"binary","type":"string"}}},"description":"CSV"},"default":{"$ref":"#/components/responses/Problem"}},"security":[{"apiKey":[]}]}},"/me/cod/remittances":{"get":{"tags":["Kapıda ödeme"],"summary":"Bana yapılan kapıda ödeme aktarımları","description":"Firmanın size yaptığı ödemeler; brüt tutar, kesintiler ve net ödenen.","operationId":"listMyCodRemittances","parameters":[{"description":"Sayfa boyu","example":50,"in":"query","name":"limit","schema":{"maximum":500,"minimum":1,"type":"integer"}},{"description":"Atlanacak kayıt sayısı","in":"query","name":"offset","schema":{"minimum":0,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"example":{"items":[{"createdAt":"2027-03-01T14:00:00Z","currency":"TRY","customerId":"9b2f6c1e-3a4d-4e5f-8a7b-1c2d3e4f5a60","customerName":"Örnek Çiçekçilik","feeTotal":"120.00","gross":"4800.00","id":"7f8a9b0c-1d2e-4f3a-8b4c-5d6e7f8a9b11","method":"bank_transfer","net":"4680.00","note":"","number":31,"offsetTotal":"0.00","orderCount":12,"paidOn":"2027-03-01","reference":"EFT-20270301-0042"}],"total":1},"schema":{"$ref":"#/components/schemas/CodRemittancePage"}}},"description":"Aktarımlar"},"default":{"$ref":"#/components/responses/Problem"}},"security":[{"apiKey":[]}]}},"/me/cod/remittances/{id}/receipt":{"parameters":[{"$ref":"#/components/parameters/Id"}],"get":{"tags":["Kapıda ödeme"],"summary":"Kapıda ödeme aktarım makbuzu (PDF)","description":"Firmanın size yaptığı aktarımın makbuzu; kapsadığı siparişleri listeler.","operationId":"myCodRemittanceReceipt","responses":{"200":{"content":{"application/pdf":{"schema":{"format":"binary","type":"string"}}},"description":"PDF","headers":{"Content-Disposition":{"schema":{"type":"string"}}}},"default":{"$ref":"#/components/responses/Problem"}},"security":[{"apiKey":[]}]}},"/me/ecommerce/connections":{"get":{"tags":["E-ticaret"],"summary":"Mağaza bağlantılarım","description":"Mağaza kimlik bilgileri yanıtta yer almaz.","operationId":"listMyEcommerceConnections","responses":{"200":{"content":{"application/json":{"example":[{"branchId":null,"branchName":"","cancelManualCount":0,"createdAt":"2027-01-10T12:00:00Z","customerId":"9b2f6c1e-3a4d-4e5f-8a7b-1c2d3e4f5a60","customerName":"Örnek Çiçekçilik","errorCount":0,"failedCount":0,"id":"1e2f3a4b-5c6d-4e7f-8a9b-0c1d2e3f4a66","importedCount":214,"lastError":"","lastSyncAt":"2027-03-04T09:00:00Z","name":"Web mağazası","needsAuthorization":false,"pendingCount":1,"platform":"woocommerce","settings":{"autoImport":true,"cancelSync":true,"carriers":[],"codEnabled":true,"codMethods":["cod"],"deliveryTypeId":"b5d1e2f3-6a7b-4c8d-9e0f-1a2b3c4d5e66","notifyCustomer":false,"parcelCount":1,"parcelMode":"single","payRecipient":false,"pickupAddress":"","pickupDistrictId":null,"triggerStatuses":["processing"],"writeback":true},"status":"active","storeUrl":"https://magaza.ornek.com.tr","updatedAt":"2027-03-04T09:00:00Z","webhookRegistered":true}],"schema":{"items":{"$ref":"#/components/schemas/EcommerceConnection"},"type":"array"}}},"description":"Bağlantılar"},"default":{"$ref":"#/components/responses/Problem"}},"security":[{"apiKey":[]}]}},"/me/ecommerce/connections/{id}/test":{"parameters":[{"$ref":"#/components/parameters/Id"}],"post":{"tags":["E-ticaret"],"summary":"Kayıtlı bağlantıyı dener","description":"Kayıtlı bilgilerle mağazaya bağlanmayı dener; hata 422 iletisiyle döner.","operationId":"testMyEcommerceConnection","responses":{"204":{"description":"Bağlantı başarılı"},"default":{"$ref":"#/components/responses/Problem"}},"security":[{"apiKey":[]}]}},"/me/ecommerce/connections/{id}/sync":{"parameters":[{"$ref":"#/components/parameters/Id"}],"post":{"tags":["E-ticaret"],"summary":"Şimdi senkronize eder","description":"Mağazadaki yeni siparişlerin yoklamasını kuyruğa alır; sonuç bağlantı günlüğüne yazılır.","operationId":"syncMyEcommerceConnection","responses":{"202":{"description":"Kuyruğa alındı"},"default":{"$ref":"#/components/responses/Problem"}},"security":[{"apiKey":[]}]}},"/me/ecommerce/connections/{id}/events":{"parameters":[{"$ref":"#/components/parameters/Id"}],"get":{"tags":["E-ticaret"],"summary":"Bağlantı günlüğü (son 90 gün)","operationId":"listMyEcommerceEvents","parameters":[{"description":"Döndürülecek en çok kayıt","example":50,"in":"query","name":"limit","schema":{"default":50,"maximum":200,"minimum":1,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"example":[{"createdAt":"2027-03-04T09:00:05Z","id":"2f3a4b5c-6d7e-4f8a-9b0c-1d2e3f4a5b77","kind":"import","level":"info","message":"#1057 içe alındı (sipariş 10482)","recordId":"3a4b5c6d-7e8f-4a9b-8c0d-1e2f3a4b5c88"}],"schema":{"items":{"$ref":"#/components/schemas/EcommerceEvent"},"type":"array"}}},"description":"Günlük"},"default":{"$ref":"#/components/responses/Problem"}},"security":[{"apiKey":[]}]}},"/me/ecommerce/orders":{"get":{"tags":["E-ticaret"],"summary":"Mağazalardan gelen siparişler","description":"Eşleşme bekleyenler için `status=pending`. `q`: mağaza sipariş no/kimliği, Courino sipariş no,\nmağaza adı, sorun metni. `sort`: createdAt, updatedAt, externalNumber, orderNumber, status,\ncodAmount (- azalan; varsayılan -createdAt).","operationId":"listMyEcommerceOrders","parameters":[{"description":"Durum süzgeci","example":["pending"],"explode":true,"in":"query","name":"status","schema":{"items":{"$ref":"#/components/schemas/EcommerceOrderStatus"},"type":"array"},"style":"form"},{"description":"Bağlantı süzgeci","in":"query","name":"connectionId","schema":{"format":"uuid","type":"string"}},{"description":"Mağaza iptali durumu (manual: elle karar bekleyenler)","in":"query","name":"cancelState","schema":{"$ref":"#/components/schemas/EcommerceCancelState"}},{"description":"Sorun türü (area: hizmet bölgesi dışında, kuryeye verilemez)","in":"query","name":"issueKind","schema":{"enum":["address","validation","error","area"],"type":"string"}},{"description":"Döndürülecek en çok kayıt","in":"query","name":"limit","schema":{"default":50,"maximum":200,"minimum":1,"type":"integer"}},{"description":"Atlanacak kayıt sayısı","in":"query","name":"offset","schema":{"default":0,"minimum":0,"type":"integer"}},{"description":"Oluşturulma zamanı alt sınırı","in":"query","name":"from","schema":{"format":"date-time","type":"string"}},{"description":"Oluşturulma zamanı üst sınırı (hariç)","in":"query","name":"to","schema":{"format":"date-time","type":"string"}},{"$ref":"#/components/parameters/ListQ"},{"$ref":"#/components/parameters/ListSort"}],"responses":{"200":{"content":{"application/json":{"example":{"items":[{"attempts":1,"cancelState":"","codAmount":"450.00","connectionId":"1e2f3a4b-5c6d-4e7f-8a9b-0c1d2e3f4a66","connectionName":"Web mağazası","createdAt":"2027-03-04T09:10:00Z","customerId":"9b2f6c1e-3a4d-4e5f-8a7b-1c2d3e4f5a60","districtId":null,"externalId":"1058","externalNumber":"1058","id":"4b5c6d7e-8f9a-4b0c-9d1e-2f3a4b5c6d99","issue":"Semt bulunamadı (Kadikoy / Caferaga)","issueKind":"address","orderId":null,"orderNumber":null,"platform":"woocommerce","status":"pending","store":{"address":"Caferağa Mah. Moda Cad. No:5","city":"Kadikoy","currency":"TRY","gateway":"cod","items":2,"name":"Elif Kaya","phone":"+905321234567","province":"Istanbul","status":"processing","total":"450.00"},"updatedAt":"2027-03-04T09:10:02Z","writebackError":"","writebackStage":""}],"serviceProvinces":["İstanbul"],"total":1},"schema":{"$ref":"#/components/schemas/EcommerceOrderPage"}}},"description":"Kayıtlar"},"default":{"$ref":"#/components/responses/Problem"}},"security":[{"apiKey":[]}]}},"/me/ecommerce/orders/{id}/resolve":{"parameters":[{"$ref":"#/components/parameters/Id"}],"post":{"tags":["E-ticaret"],"summary":"Eşleşme bekleyen siparişi düzeltip içe alır","description":"Semt (ve isteğe bağlı ad/telefon/adres) düzeltmesi kaydedilir ve sipariş hemen içe alınmaya\nçalışılır. `remember=true` ise bu il/ilçe/semt yazımı hatırlanır (sonraki siparişler otomatik\neşleşir).","operationId":"resolveMyEcommerceOrder","requestBody":{"content":{"application/json":{"example":{"districtId":"3f1c2a4e-8b7d-4c21-9a55-0e6b1f2d3c41","remember":true},"schema":{"$ref":"#/components/schemas/EcommerceResolveInput"}}},"required":true},"responses":{"200":{"content":{"application/json":{"example":{"attempts":2,"cancelState":"","codAmount":"450.00","connectionId":"1e2f3a4b-5c6d-4e7f-8a9b-0c1d2e3f4a66","connectionName":"Web mağazası","createdAt":"2027-03-04T09:10:00Z","customerId":"9b2f6c1e-3a4d-4e5f-8a7b-1c2d3e4f5a60","districtId":"3f1c2a4e-8b7d-4c21-9a55-0e6b1f2d3c41","externalId":"1058","externalNumber":"1058","fix":{"districtId":"3f1c2a4e-8b7d-4c21-9a55-0e6b1f2d3c41"},"id":"4b5c6d7e-8f9a-4b0c-9d1e-2f3a4b5c6d99","issue":"","issueKind":"","orderId":"5c6d7e8f-9a0b-4c1d-8e2f-3a4b5c6d7e01","orderNumber":10483,"platform":"woocommerce","status":"imported","store":{"address":"Caferağa Mah. Moda Cad. No:5","city":"Kadikoy","currency":"TRY","gateway":"cod","items":2,"name":"Elif Kaya","phone":"+905321234567","province":"Istanbul","status":"processing","total":"450.00"},"updatedAt":"2027-03-04T09:25:00Z","writebackError":"","writebackStage":""},"schema":{"$ref":"#/components/schemas/EcommerceOrder"}}},"description":"Sonuç"},"default":{"$ref":"#/components/responses/Problem"}},"security":[{"apiKey":[]}]}},"/me/ecommerce/orders/{id}/retry":{"parameters":[{"$ref":"#/components/parameters/Id"}],"post":{"tags":["E-ticaret"],"summary":"Başarısız siparişi yeniden içe almayı dener","operationId":"retryMyEcommerceOrder","responses":{"200":{"content":{"application/json":{"example":{"attempts":2,"cancelState":"","codAmount":"450.00","connectionId":"1e2f3a4b-5c6d-4e7f-8a9b-0c1d2e3f4a66","connectionName":"Web mağazası","createdAt":"2027-03-04T09:10:00Z","customerId":"9b2f6c1e-3a4d-4e5f-8a7b-1c2d3e4f5a60","districtId":"3f1c2a4e-8b7d-4c21-9a55-0e6b1f2d3c41","externalId":"1058","externalNumber":"1058","fix":{"districtId":"3f1c2a4e-8b7d-4c21-9a55-0e6b1f2d3c41"},"id":"4b5c6d7e-8f9a-4b0c-9d1e-2f3a4b5c6d99","issue":"","issueKind":"","orderId":"5c6d7e8f-9a0b-4c1d-8e2f-3a4b5c6d7e01","orderNumber":10483,"platform":"woocommerce","status":"imported","store":{"address":"Caferağa Mah. Moda Cad. No:5","city":"Kadikoy","currency":"TRY","gateway":"cod","items":2,"name":"Elif Kaya","phone":"+905321234567","province":"Istanbul","status":"processing","total":"450.00"},"updatedAt":"2027-03-04T09:25:00Z","writebackError":"","writebackStage":""},"schema":{"$ref":"#/components/schemas/EcommerceOrder"}}},"description":"Sonuç"},"default":{"$ref":"#/components/responses/Problem"}},"security":[{"apiKey":[]}]}},"/me/ecommerce/orders/{id}/skip":{"parameters":[{"$ref":"#/components/parameters/Id"}],"post":{"tags":["E-ticaret"],"summary":"Siparişi atlar (Courino siparişi açılmaz)","operationId":"skipMyEcommerceOrder","responses":{"200":{"content":{"application/json":{"example":{"attempts":1,"cancelState":"","codAmount":"450.00","connectionId":"1e2f3a4b-5c6d-4e7f-8a9b-0c1d2e3f4a66","connectionName":"Web mağazası","createdAt":"2027-03-04T09:10:00Z","customerId":"9b2f6c1e-3a4d-4e5f-8a7b-1c2d3e4f5a60","districtId":null,"externalId":"1058","externalNumber":"1058","id":"4b5c6d7e-8f9a-4b0c-9d1e-2f3a4b5c6d99","issue":"Semt bulunamadı (Kadikoy / Caferaga)","issueKind":"address","orderId":null,"orderNumber":null,"platform":"woocommerce","status":"skipped","store":{"address":"Caferağa Mah. Moda Cad. No:5","city":"Kadikoy","currency":"TRY","gateway":"cod","items":2,"name":"Elif Kaya","phone":"+905321234567","province":"Istanbul","status":"processing","total":"450.00"},"updatedAt":"2027-03-04T09:25:00Z","writebackError":"","writebackStage":""},"schema":{"$ref":"#/components/schemas/EcommerceOrder"}}},"description":"Atlandı"},"default":{"$ref":"#/components/responses/Problem"}},"security":[{"apiKey":[]}]}},"/healthz":{"get":{"tags":["Sağlık denetimi"],"summary":"Canlılık denetimi","description":"Sunucu süreci ayaktaysa her zaman 204 döner; veritabanını denetlemez. Kimlik doğrulama gerekmez.","operationId":"getHealthz","responses":{"204":{"description":"Sunucu çalışıyor (gövde yok)"}},"security":[],"servers":[{"url":"/"}]}},"/readyz":{"get":{"tags":["Sağlık denetimi"],"summary":"Hazırlık denetimi (veritabanı dahil)","description":"Sunucunun istek karşılamaya hazır olup olmadığını, bağımlılıklarını (veritabanı) yoklayarak söyler;\nyoklamaların toplam süresi en çok 3 saniyedir. Kimlik doğrulama gerekmez. Hata ayrıntısı verilmez:\nyalnız hazır olmayan bileşenin adı döner.","operationId":"getReadyz","responses":{"200":{"content":{"application/json":{"example":{"status":"ok"},"schema":{"properties":{"status":{"description":"Her zaman `ok`","enum":["ok"],"type":"string"}},"required":["status"],"type":"object"}}},"description":"Hazır"},"503":{"content":{"application/json":{"example":{"failed":{"postgres":"unavailable"},"status":"unavailable"},"schema":{"properties":{"failed":{"additionalProperties":{"enum":["unavailable"],"type":"string"},"description":"Yanıt vermeyen bileşenler (ör. `postgres`) → `unavailable`","type":"object"},"status":{"description":"Her zaman `unavailable`","enum":["unavailable"],"type":"string"}},"required":["status","failed"],"type":"object"}}},"description":"Hazır değil; biraz sonra yeniden deneyin"}},"security":[],"servers":[{"url":"/"}]}}},"components":{"parameters":{"CodQFrom":{"description":"Tahsil zamanı (tahsil edilmemişte siparişin açılışı) bu andan sonra","in":"query","name":"from","schema":{"format":"date-time","type":"string"}},"CodQOverdue":{"description":"Yalnız vadesi geçmiş, aktarılmamış tahsilatlar","in":"query","name":"overdue","schema":{"type":"boolean"}},"CodQRemittance":{"description":"Yalnız bu aktarımın siparişleri","in":"query","name":"remittanceId","schema":{"format":"uuid","type":"string"}},"CodQStatus":{"description":"Tahsilat durumu","in":"query","name":"status","schema":{"$ref":"#/components/schemas/CodStatus"}},"CodQTo":{"description":"Bu andan önce (hariç)","in":"query","name":"to","schema":{"format":"date-time","type":"string"}},"Id":{"description":"Kaydın kimliği (UUID)","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},"ListQ":{"description":"Serbest metin araması (büyük/küçük harf duyarsız, parça eşleşme)","in":"query","name":"q","schema":{"maxLength":200,"type":"string"}},"ListSort":{"description":"Sıralama: \"alan\" artan, \"-alan\" azalan; izinli alanlar uç açıklamasında. Bilinmeyen alan 422.","in":"query","name":"sort","schema":{"maxLength":40,"pattern":"^-?[a-zA-Z]{1,39}$","type":"string"}},"MaxAmount":{"description":"Tutar üst sınırı (dahil)","in":"query","name":"maxAmount","schema":{"$ref":"#/components/schemas/Decimal"}},"MinAmount":{"description":"Tutar alt sınırı (dahil)","in":"query","name":"minAmount","schema":{"$ref":"#/components/schemas/Decimal"}},"OrderIdempotencyKey":{"description":"İsteğe bağlı tekrar anahtarı (ör. UUID). Aynı anahtar ve aynı\ngövdeyle tekrarlanan istek yeniden çalışmaz, ilk başarılı yanıt\n`Idempotent-Replayed: true` başlığıyla döner (ağ hatasında güvenle\ntekrar denemek için). Kapsam firma, çağıran (müşteri ya da kullanıcı)\nve işlemdir; anahtar 24 saat saklanır.","in":"header","name":"Idempotency-Key","schema":{"maxLength":200,"type":"string"}}},"responses":{"IdempotencyConflict":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Idempotency-Key çakışması: `IDEMPOTENCY_MISMATCH` — anahtar\nfarklı bir istekte (gövde ya da yol) kullanılmış, yeni istek için yeni\nanahtar üretin; `IDEMPOTENCY_IN_PROGRESS` — aynı anahtarlı ilk istek\nhâlâ işleniyor, biraz sonra aynı anahtarla tekrar deneyin. Yalnız\nbaşlık gönderildiğinde döner."},"Problem":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Hata (RFC 7807 problem+json)"}},"schemas":{"AppliedDiscount":{"description":"Fiyata uygulanan indirim; `amount` KDV dahil düşülen tutardır.","properties":{"amount":{"$ref":"#/components/schemas/Decimal"},"id":{"format":"uuid","type":"string"},"kind":{"$ref":"#/components/schemas/DiscountKind"},"label":{"description":"İndirimin adı","type":"string"},"value":{"$ref":"#/components/schemas/Decimal"}},"required":["id","label","kind","value","amount"],"type":"object"},"BusinessHours":{"description":"Firmanın çalışma saatleri (tanımlıysa); dışında açılan sipariş ilk iş saatinde ele alınır.","properties":{"end":{"example":"18:00","type":"string"},"openNow":{"description":"Şu an çalışma saatleri içinde mi","type":"boolean"},"start":{"example":"09:00","type":"string"}},"required":["start","end","openNow"],"type":"object"},"CancelRequest":{"properties":{"reason":{"description":"İptal nedeni","maxLength":500,"minLength":1,"type":"string"}},"required":["reason"],"type":"object"},"Charge":{"description":"Bir siparişin ücreti ve ödeme durumu.","properties":{"algorithmVersion":{"description":"Fiyatı hesaplayan algoritmanın sürümü","type":"string"},"bridge":{"$ref":"#/components/schemas/Decimal"},"createdAt":{"format":"date-time","type":"string"},"currencyCode":{"type":"string"},"deliveredAt":{"format":"date-time","type":"string"},"description":{"type":"string"},"einvoiceId":{"description":"Siparişin girdiği fatura (e-Fatura/e-Arşiv)","format":"uuid","type":"string"},"einvoiceStatus":{"$ref":"#/components/schemas/EInvoiceStatus"},"manualNet":{"$ref":"#/components/schemas/Decimal"},"number":{"description":"Sipariş numarası","format":"int64","type":"integer"},"orderId":{"format":"uuid","type":"string"},"orderStatus":{"$ref":"#/components/schemas/OrderStatus"},"paidAt":{"description":"Ödendiği an","format":"date-time","type":"string"},"payer":{"description":"Ücreti ödeyen taraf","enum":["sender","pickup","recipient"],"type":"string"},"payerCustomerId":{"format":"uuid","type":"string"},"payerName":{"type":"string"},"paymentStatus":{"$ref":"#/components/schemas/PaymentStatus"},"recipient":{"type":"string"},"sender":{"type":"string"},"serviceNet":{"$ref":"#/components/schemas/Decimal"},"total":{"$ref":"#/components/schemas/Decimal"},"usesWallet":{"type":"boolean"},"vat":{"$ref":"#/components/schemas/Decimal"},"vatRate":{"$ref":"#/components/schemas/Decimal"},"volume":{"$ref":"#/components/schemas/Decimal"},"wait":{"$ref":"#/components/schemas/Decimal"},"weight":{"$ref":"#/components/schemas/Decimal"}},"required":["orderId","number","createdAt","orderStatus","payer","payerName","sender","recipient","algorithmVersion","currencyCode","serviceNet","wait","weight","volume","bridge","manualNet","vat","vatRate","total","usesWallet","paymentStatus","description"],"type":"object"},"ChargePage":{"properties":{"items":{"items":{"$ref":"#/components/schemas/Charge"},"type":"array"},"sumTotal":{"$ref":"#/components/schemas/Decimal"},"sumUnpaid":{"$ref":"#/components/schemas/Decimal"},"total":{"description":"Süzgece uyan kayıt sayısı","type":"integer"}},"required":["items","total","sumTotal","sumUnpaid"],"type":"object"},"CodBalance":{"properties":{"awaiting":{"allOf":[{"$ref":"#/components/schemas/Decimal"}],"description":"Teslim bekleyen siparişlerin kapıda ödemesi"},"currency":{"type":"string"},"customerId":{"format":"uuid","type":"string"},"customerName":{"type":"string"},"lastRemittedOn":{"format":"date","type":"string"},"oldestDueOn":{"description":"Aktarılmamış en eski vade","format":"date","type":"string"},"overdue":{"allOf":[{"$ref":"#/components/schemas/Decimal"}],"description":"Vadesi geçmiş, henüz aktarılmamış"},"pending":{"allOf":[{"$ref":"#/components/schemas/Decimal"}],"description":"Tahsil edildi, henüz aktarılmadı (kuryedekiler dahil; brüt)"},"pendingCount":{"type":"integer"},"pendingFee":{"$ref":"#/components/schemas/Decimal"},"ready":{"allOf":[{"$ref":"#/components/schemas/Decimal"}],"description":"Şimdi aktarılabilir (brüt)"},"readyCount":{"type":"integer"},"readyFee":{"$ref":"#/components/schemas/Decimal"},"remitted":{"allOf":[{"$ref":"#/components/schemas/Decimal"}],"description":"Bugüne dek aktarılan (brüt)"},"withCourier":{"allOf":[{"$ref":"#/components/schemas/Decimal"}],"description":"Nakit tahsil edildi, kurye henüz firmaya teslim etmedi"}},"required":["customerId","customerName","currency","awaiting","withCourier","pending","pendingFee","pendingCount","ready","readyFee","readyCount","overdue","remitted"],"type":"object"},"CodMethod":{"description":"cash: nakit; card: kapıda POS ile kart; link: ödeme bağlantısı / QR ile online kart","enum":["cash","card","link"],"type":"string"},"CodOrder":{"properties":{"amount":{"$ref":"#/components/schemas/Decimal"},"branchId":{"format":"uuid","type":"string"},"collectedAt":{"description":"Tahsil edildiği an","format":"date-time","type":"string"},"courierId":{"format":"uuid","type":"string"},"courierName":{"type":"string"},"currency":{"type":"string"},"customerId":{"format":"uuid","type":"string"},"customerName":{"type":"string"},"dueOn":{"description":"Size aktarım vadesi","format":"date","type":"string"},"fee":{"$ref":"#/components/schemas/Decimal"},"handoverAt":{"format":"date-time","type":"string"},"method":{"$ref":"#/components/schemas/CodMethod"},"number":{"format":"int64","type":"integer"},"orderCreatedAt":{"format":"date-time","type":"string"},"orderId":{"format":"uuid","type":"string"},"orderStatus":{"$ref":"#/components/schemas/OrderStatus"},"recipientName":{"type":"string"},"remittanceId":{"format":"uuid","type":"string"},"remittanceNumber":{"format":"int64","type":"integer"},"status":{"$ref":"#/components/schemas/CodStatus"}},"required":["orderId","number","orderStatus","customerId","customerName","recipientName","amount","currency","fee","status","orderCreatedAt"],"type":"object"},"CodOrderPage":{"properties":{"items":{"items":{"$ref":"#/components/schemas/CodOrder"},"type":"array"},"total":{"type":"integer"}},"required":["items","total"],"type":"object"},"CodRemittance":{"description":"Firmanın size yaptığı bir kapıda ödeme aktarımı.","properties":{"cancelReason":{"type":"string"},"cancelledAt":{"format":"date-time","type":"string"},"createdAt":{"format":"date-time","type":"string"},"createdBy":{"format":"uuid","type":"string"},"currency":{"type":"string"},"customerId":{"format":"uuid","type":"string"},"customerName":{"type":"string"},"feeTotal":{"$ref":"#/components/schemas/Decimal"},"gross":{"$ref":"#/components/schemas/Decimal"},"id":{"format":"uuid","type":"string"},"method":{"enum":["bank_transfer","cash","other"],"type":"string"},"net":{"$ref":"#/components/schemas/Decimal"},"note":{"type":"string"},"number":{"format":"int64","type":"integer"},"offsetTotal":{"$ref":"#/components/schemas/Decimal"},"orderCount":{"type":"integer"},"paidOn":{"description":"Ödeme tarihi","format":"date","type":"string"},"reference":{"description":"Banka dekont / referans numarası","type":"string"}},"required":["id","number","customerId","customerName","currency","gross","feeTotal","offsetTotal","net","orderCount","method","paidOn","reference","note","createdAt"],"type":"object"},"CodRemittancePage":{"properties":{"items":{"items":{"$ref":"#/components/schemas/CodRemittance"},"type":"array"},"total":{"type":"integer"}},"required":["items","total"],"type":"object"},"CodStatus":{"description":"awaiting: sipariş henüz teslim edilmedi; not_collected: iptal/iade, tahsil edilmeyecek; with_courier: nakit tahsil edildi, kurye henüz firmaya teslim etmedi; pending: size aktarım bekliyor; remitted: aktarıldı.","enum":["awaiting","not_collected","with_courier","pending","remitted"],"type":"string"},"CreateOrderRequest":{"description":"Sipariş gövdesi. Gönderen API anahtarının ait olduğu müşteridir.","properties":{"codAmount":{"allOf":[{"$ref":"#/components/schemas/Decimal"}],"description":"Kapıda ödeme tutarı: alıcıdan sizin adınıza tahsil edilecek mal bedeli. Taşıma ücretinden ayrıdır,\nfiyata girmez. Firma kapıda ödemeyi açmamışsa 422 `COD_DISABLED`. Güncellemede verilmezse değişmez;\n\"0\" kaldırır. Tahsil edildikten sonra değiştirilemez (409 `COD_COLLECTED`)."},"deliveryTypeId":{"description":"Gidiş tipi (`GET /me/order-options`)","format":"uuid","type":"string"},"notes":{"description":"Kuryeye not","maxLength":1000,"type":"string"},"parcels":{"description":"Koliler. Verilmezse tek koli açılır. Güncellemede verilmezse koliler değişmez; verilirse yeniden\nyazılır (okutulmuş koli varsa 409). Barkodu boş bırakılan koliye sistem `<sipariş no>-<sıra>` barkodu\nverir.","items":{"$ref":"#/components/schemas/ParcelInput"},"maxItems":99,"type":"array"},"payer":{"description":"Ücreti ödeyen taraf","enum":["sender","pickup","recipient"],"type":"string"},"paymentMethod":{"$ref":"#/components/schemas/PaymentMethod"},"pickup":{"$ref":"#/components/schemas/OrderParty"},"plannedPickupAt":{"description":"Planlanan alım zamanı; verilmezse hemen","format":"date-time","type":"string"},"recipient":{"$ref":"#/components/schemas/OrderParty"},"reference":{"description":"Kendi referans / takip numaranız; siparişleri bununla arayabilirsiniz","maxLength":100,"type":"string"},"requireDeliveryCode":{"description":"Teslimde alıcıdan tek kullanımlık kod istensin mi. Verilmezse müşteri kaydınızdaki ya da firmanın\nayarı geçerlidir. API ile yalnız açılabilir (`false` yok sayılır).","type":"boolean"},"sender":{"$ref":"#/components/schemas/OrderParty"},"volumeM3":{"allOf":[{"$ref":"#/components/schemas/Decimal"}],"description":"Hacim (m³)"},"waitMinutes":{"allOf":[{"$ref":"#/components/schemas/Decimal"}],"description":"Beklenen bekleme süresi (dakika)"},"weightKg":{"allOf":[{"$ref":"#/components/schemas/Decimal"}],"description":"Ağırlık (kg)"}},"required":["payer","sender","recipient","deliveryTypeId"],"type":"object"},"Customer":{"description":"Müşteri kaydınız.","properties":{"account":{"$ref":"#/components/schemas/CustomerAccountState"},"address":{"type":"string"},"birthDate":{"format":"date","type":"string"},"code":{"description":"Müşteri kodu","type":"string"},"customerTypeId":{"description":"Müşteri tipi","format":"uuid","type":"string"},"deliveryCodePolicy":{"$ref":"#/components/schemas/DeliveryCodePolicy"},"districtId":{"description":"Varsayılan semt","format":"uuid","type":"string"},"email":{"type":"string"},"id":{"format":"uuid","type":"string"},"isVip":{"type":"boolean"},"legalKind":{"$ref":"#/components/schemas/CustomerLegalKind"},"marketingConsent":{"description":"Kampanya iletisi (ticari elektronik ileti) onayı","type":"boolean"},"marketingConsentAt":{"format":"date-time","type":"string"},"marketingConsentSource":{"description":"Onayın son değiştiği kanal","type":"string"},"mobilePhone":{"type":"string"},"name":{"type":"string"},"notifyEmail":{"type":"boolean"},"notifySms":{"type":"boolean"},"phone":{"type":"string"},"priceListId":{"description":"Fiyat listesi","format":"uuid","type":"string"},"requiresApproval":{"description":"Açtığınız siparişler firmanın onayından sonra kuryeye verilir","type":"boolean"},"status":{"$ref":"#/components/schemas/CustomerStatus"},"taxNumber":{"type":"string"},"taxOffice":{"type":"string"}},"required":["id","name","address","notifySms","notifyEmail","isVip","status"],"type":"object"},"CustomerAccountState":{"description":"Giriş hesabı: active (girebilir), pending (davet edildi, şifre belirlenmedi), none (yok)","enum":["active","pending","none"],"type":"string"},"CustomerContact":{"allOf":[{"$ref":"#/components/schemas/CustomerContactInput"},{"properties":{"id":{"format":"uuid","type":"string"}},"required":["id"],"type":"object"}]},"CustomerContactInput":{"properties":{"birthDate":{"description":"Yetkilinin doğum tarihi","format":"date","type":"string"},"email":{"maxLength":200,"type":"string"},"mobilePhone":{"$ref":"#/components/schemas/Phone"},"name":{"maxLength":200,"minLength":1,"type":"string"},"notifyEmail":{"description":"Teslim bildirimlerini e-postayla alır","type":"boolean"},"notifySms":{"description":"Teslim bildirimlerini SMS ile alır","type":"boolean"},"status":{"$ref":"#/components/schemas/Status"}},"required":["name","notifySms","notifyEmail","status"],"type":"object"},"CustomerDiscount":{"description":"Size tanımlı bir indirim.","properties":{"campaignId":{"format":"uuid","type":"string"},"cancelledAt":{"format":"date-time","type":"string"},"createdAt":{"format":"date-time","type":"string"},"customerId":{"format":"uuid","type":"string"},"customerName":{"type":"string"},"id":{"format":"uuid","type":"string"},"kind":{"$ref":"#/components/schemas/DiscountKind"},"label":{"type":"string"},"maxUses":{"description":"Kullanım hakkı (boşsa sınırsız)","type":"integer"},"ruleId":{"format":"uuid","type":"string"},"source":{"enum":["manual","campaign","rule"],"type":"string"},"status":{"enum":["active","cancelled"],"type":"string"},"used":{"description":"Kullanılan","type":"integer"},"validFrom":{"format":"date","type":"string"},"validUntil":{"format":"date","type":"string"},"value":{"$ref":"#/components/schemas/Decimal"}},"required":["id","customerId","customerName","kind","value","validFrom","validUntil","used","source","label","status","createdAt"],"type":"object"},"CustomerLegalKind":{"description":"Müşterinin hukuki türü: individual bireysel (TCKN isteğe bağlı), sole_proprietor şahıs firması (TCKN ve vergi dairesi zorunlu), limited / joint_stock (anonim) / other (VKN ve vergi dairesi zorunlu). Boş = seçilmemiş (eski kayıt; yalnız biçim denetlenir). Güncellemede gönderilmezse değişmez.","enum":["individual","sole_proprietor","limited","joint_stock","other"],"type":"string"},"CustomerMessage":{"description":"Müşteriye gösterilen mesaj; sağlayıcı ayrıntıları ve hata metni yer almaz.","properties":{"body":{"type":"string"},"channel":{"enum":["sms","email","push","whatsapp"],"type":"string"},"createdAt":{"format":"date-time","type":"string"},"id":{"format":"uuid","type":"string"},"orderId":{"format":"uuid","type":"string"},"recipient":{"type":"string"},"sentAt":{"format":"date-time","type":"string"},"status":{"enum":["pending","sent","failed"],"type":"string"},"subject":{"type":"string"}},"required":["id","channel","recipient","subject","body","status","createdAt"],"type":"object"},"CustomerMessagePage":{"properties":{"items":{"items":{"$ref":"#/components/schemas/CustomerMessage"},"type":"array"},"total":{"type":"integer"}},"required":["items","total"],"type":"object"},"CustomerProfile":{"properties":{"contacts":{"description":"Yetkililer","items":{"$ref":"#/components/schemas/CustomerContact"},"type":"array"},"customer":{"$ref":"#/components/schemas/Customer"},"links":{"description":"Adres defteri (size bağlı müşteriler)","items":{"$ref":"#/components/schemas/CustomerSummary"},"type":"array"},"specialDates":{"description":"Özel günler","items":{"$ref":"#/components/schemas/CustomerSpecialDate"},"type":"array"}},"required":["customer","contacts","links"],"type":"object"},"CustomerSpecialDate":{"allOf":[{"$ref":"#/components/schemas/CustomerSpecialDateInput"},{"properties":{"id":{"format":"uuid","type":"string"}},"required":["id"],"type":"object"}]},"CustomerSpecialDateInput":{"properties":{"day":{"maximum":31,"minimum":1,"type":"integer"},"label":{"description":"Ör. Kuruluş yıl dönümü","maxLength":100,"minLength":1,"type":"string"},"month":{"maximum":12,"minimum":1,"type":"integer"},"year":{"description":"Biliniyorsa ilk yıl","maximum":2200,"minimum":1900,"type":"integer"}},"required":["label","month","day"],"type":"object"},"CustomerSpecialDatesInput":{"properties":{"items":{"items":{"$ref":"#/components/schemas/CustomerSpecialDateInput"},"maxItems":20,"type":"array"}},"required":["items"],"type":"object"},"CustomerStatus":{"description":"active: etkin; inactive: pasif; pending: firma onayı bekleniyor (sipariş verilemez)","enum":["active","inactive","pending"],"type":"string"},"CustomerSummary":{"properties":{"address":{"type":"string"},"code":{"type":"string"},"districtId":{"format":"uuid","type":"string"},"id":{"format":"uuid","type":"string"},"name":{"type":"string"},"status":{"$ref":"#/components/schemas/CustomerStatus"}},"required":["id","name","status"],"type":"object"},"Decimal":{"description":"Ondalık sayı, metin olarak (yuvarlama hatalarını önlemek için), ör. \"12.50\"","example":"12.50","pattern":"^-?[0-9]{1,10}(\\.[0-9]{1,6})?$","type":"string"},"DeliveryAttempt":{"description":"Teslim edilemedi kaydı.","properties":{"accuracy":{"format":"float","type":"number"},"at":{"format":"date-time","type":"string"},"byUser":{"format":"uuid","type":"string"},"courierId":{"format":"uuid","type":"string"},"lat":{"format":"double","type":"number"},"lng":{"format":"double","type":"number"},"note":{"type":"string"},"reason":{"$ref":"#/components/schemas/DeliveryFailReason"},"recordedAt":{"description":"Sunucuya ulaştığı an (çevrimdışı kayıtta `at`'ten sonra olabilir)","format":"date-time","type":"string"},"seq":{"type":"integer"}},"required":["seq","at","reason","note"],"type":"object"},"DeliveryCodePolicy":{"description":"Teslim kodu kuralı: inherit firmanın ayarı, on her zaman istenir, off istenmez.","enum":["inherit","on","off"],"type":"string"},"DeliveryCodeState":{"description":"Teslim kodu durumu. Kodun kendisi hiçbir yanıtta yoktur; yalnız alıcıya SMS/e-postayla gider.","properties":{"attemptsLeft":{"type":"integer"},"failedAttempts":{"type":"integer"},"lastSentAt":{"format":"date-time","type":"string"},"override":{"$ref":"#/components/schemas/VerifyOverride"},"required":{"type":"boolean"},"sentCount":{"description":"Toplam gönderim (ilk kod dahil)","type":"integer"},"status":{"enum":["none","pending","sent","locked","verified","overridden"],"type":"string"},"verifiedAt":{"format":"date-time","type":"string"}},"required":["required","status","sentCount","failedAttempts","attemptsLeft"],"type":"object"},"DeliveryFailReason":{"description":"recipient_absent: alıcı yok; wrong_address: adres yanlış; refused: teslim almadı; unreachable: ulaşılamadı; closed: işyeri kapalı; other: diğer","enum":["recipient_absent","wrong_address","refused","unreachable","closed","other"],"type":"string"},"DeliveryTypeOption":{"description":"Gidiş tipi.","properties":{"fullName":{"type":"string"},"id":{"format":"uuid","type":"string"},"isRoundTrip":{"description":"Gidiş-dönüş (alıcıdan geri dönüş ayağı var)","type":"boolean"},"name":{"type":"string"}},"required":["id","name","isRoundTrip"],"type":"object"},"DiscountKind":{"description":"percent: KDV dahil toplamdan yüzde; amount: KDV dahil sabit tutar (toplamı aşamaz)","enum":["percent","amount"],"type":"string"},"DistrictOption":{"description":"Semt.","properties":{"id":{"format":"uuid","type":"string"},"name":{"type":"string"}},"required":["id","name"],"type":"object"},"EInvoice":{"description":"Kesilmiş fatura.","properties":{"createdAt":{"format":"date-time","type":"string"},"currencyCode":{"type":"string"},"customerId":{"format":"uuid","type":"string"},"customerName":{"type":"string"},"error":{"description":"Kesilemediyse nedeni","type":"string"},"id":{"format":"uuid","type":"string"},"issuedAt":{"format":"date-time","type":"string"},"kind":{"description":"e-Fatura ya da e-Arşiv","enum":["e_invoice","e_archive"],"type":"string"},"net":{"$ref":"#/components/schemas/Decimal"},"orderIds":{"items":{"format":"uuid","type":"string"},"type":"array"},"orderNumbers":{"items":{"format":"int64","type":"integer"},"type":"array"},"status":{"$ref":"#/components/schemas/EInvoiceStatus"},"total":{"$ref":"#/components/schemas/Decimal"},"vat":{"$ref":"#/components/schemas/Decimal"}},"required":["id","customerId","customerName","orderIds","orderNumbers","status","currencyCode","net","vat","total","error","createdAt"],"type":"object"},"EInvoicePage":{"properties":{"items":{"items":{"$ref":"#/components/schemas/EInvoice"},"type":"array"},"total":{"type":"integer"}},"required":["items","total"],"type":"object"},"EInvoiceStatus":{"description":"queued: sırada; processing: kesiliyor; issued: kesildi; failed: kesilemedi","enum":["queued","processing","issued","failed"],"type":"string"},"EcommerceCancelState":{"description":"Mağaza iptali: '' iptal yok; pending Courino siparişinin iptali kuyrukta; cancelled Courino siparişi\niptal edildi (ya da hiç açılmamıştı); manual kurye paketi almıştı ya da iptal reddedildi — elle karar\nverin (`issue`); finished Courino siparişi zaten teslim edilmiş / gönderene dönmüştü (değişmedi); off\nsenkron kapalıyken iptal edildi (Courino siparişi değişmedi).","enum":["","pending","cancelled","manual","finished","off"],"type":"string"},"EcommerceConnection":{"properties":{"branchId":{"description":"Bağlantının şubesi; null = firma geneli","format":"uuid","nullable":true,"type":"string"},"branchName":{"description":"Şube adı (firma genelinde boş)","type":"string"},"cancelManualCount":{"description":"Mağazada iptal edilip elle karar bekleyenler (cancelState=manual)","type":"integer"},"createdAt":{"format":"date-time","type":"string"},"customerId":{"format":"uuid","type":"string"},"customerName":{"type":"string"},"errorCount":{"description":"Art arda başarısız senkron sayısı","type":"integer"},"failedCount":{"type":"integer"},"id":{"format":"uuid","type":"string"},"importedCount":{"type":"integer"},"lastError":{"type":"string"},"lastSyncAt":{"format":"date-time","nullable":true,"type":"string"},"name":{"type":"string"},"needsAuthorization":{"description":"Mağaza onayı (IdeaSoft) bekleniyor ya da onay geçersizleşti: sipariş alınmaz; onayı müşteri portalından verin","type":"boolean"},"pendingCount":{"type":"integer"},"platform":{"$ref":"#/components/schemas/EcommercePlatform"},"settings":{"$ref":"#/components/schemas/EcommerceSettings"},"status":{"enum":["active","paused"],"type":"string"},"storeUrl":{"type":"string"},"updatedAt":{"format":"date-time","type":"string"},"webhookRegistered":{"type":"boolean"}},"required":["id","customerId","customerName","platform","name","storeUrl","status","settings","webhookRegistered","needsAuthorization","lastError","errorCount","pendingCount","failedCount","importedCount","cancelManualCount","createdAt","updatedAt"],"type":"object"},"EcommerceEvent":{"properties":{"createdAt":{"format":"date-time","type":"string"},"id":{"format":"uuid","type":"string"},"kind":{"enum":["webhook","poll","import","writeback","test","setup","cancel"],"type":"string"},"level":{"description":"info | error","type":"string"},"message":{"type":"string"},"recordId":{"format":"uuid","nullable":true,"type":"string"}},"required":["id","level","kind","message","createdAt"],"type":"object"},"EcommerceFix":{"properties":{"address":{"maxLength":500,"type":"string"},"districtId":{"format":"uuid","nullable":true,"type":"string"},"name":{"maxLength":200,"type":"string"},"phone":{"maxLength":30,"type":"string"}},"type":"object"},"EcommerceOrder":{"properties":{"attempts":{"type":"integer"},"branchId":{"description":"Bağlantının şubesi (null = firma geneli)","format":"uuid","nullable":true,"type":"string"},"cancelState":{"$ref":"#/components/schemas/EcommerceCancelState"},"cancelledAt":{"description":"Mağazada iptalin görüldüğü an","format":"date-time","nullable":true,"type":"string"},"codAmount":{"description":"Kapıda ödeme tahsil tutarı (sipariş notuna yazıldı)","nullable":true,"type":"string"},"connectionId":{"format":"uuid","type":"string"},"connectionName":{"type":"string"},"createdAt":{"format":"date-time","type":"string"},"customerId":{"format":"uuid","type":"string"},"districtId":{"format":"uuid","nullable":true,"type":"string"},"externalId":{"type":"string"},"externalNumber":{"type":"string"},"fix":{"$ref":"#/components/schemas/EcommerceFix"},"id":{"format":"uuid","type":"string"},"issue":{"type":"string"},"issueKind":{"description":"'' | address | validation | error | area (alıcı firmanın hizmet bölgesi dışında; Courino siparişi açılmaz)","type":"string"},"orderId":{"format":"uuid","nullable":true,"type":"string"},"orderNumber":{"format":"int64","nullable":true,"type":"integer"},"payloadPurgedAt":{"description":"Doluysa mağaza siparişinin ayıklanmış verisi saklama süresi (varsayılan 90 gün) dolduğu için\nsilindi: `store` alanları boştur, `fix` içinde yalnız `districtId` kalır. Böyle bir\nkayıtta resolve/retry 409 döner.","format":"date-time","nullable":true,"type":"string"},"platform":{"$ref":"#/components/schemas/EcommercePlatform"},"status":{"$ref":"#/components/schemas/EcommerceOrderStatus"},"store":{"$ref":"#/components/schemas/EcommerceStoreOrder"},"updatedAt":{"format":"date-time","type":"string"},"writebackError":{"type":"string"},"writebackStage":{"enum":["","picked_up","delivered"],"type":"string"}},"required":["id","connectionId","connectionName","platform","customerId","externalId","externalNumber","status","issueKind","issue","store","attempts","writebackStage","writebackError","cancelState","createdAt","updatedAt"],"type":"object"},"EcommerceOrderPage":{"properties":{"items":{"items":{"$ref":"#/components/schemas/EcommerceOrder"},"type":"array"},"serviceProvinces":{"description":"Firmanın dağıtım yaptığı iller. Boş: bilinmiyor; o zaman il denetimi yapılmaz.","items":{"type":"string"},"type":"array"},"total":{"type":"integer"}},"required":["items","total","serviceProvinces"],"type":"object"},"EcommerceOrderStatus":{"enum":["received","importing","imported","pending","failed","skipped"],"type":"string"},"EcommercePlatform":{"description":"Mağazanın platformu.","enum":["woocommerce","shopify","trendyol","hepsiburada","n11","ciceksepeti","sentos","entegra","ideasoft","ikas","ticimax"],"type":"string"},"EcommerceResolveInput":{"properties":{"address":{"maxLength":500,"type":"string"},"districtId":{"format":"uuid","nullable":true,"type":"string"},"name":{"maxLength":200,"type":"string"},"phone":{"maxLength":30,"type":"string"},"remember":{"description":"Bu il/ilçe/semt yazımını müşteri için hatırla","type":"boolean"}},"type":"object"},"EcommerceSettings":{"description":"Eşleme ayarları (müşteri portalından değiştirilir). `triggerStatuses`: içe alınacak mağaza\ndurumları. `autoImport=false` ise her sipariş eşleşme bekleyenlere düşer ve elle onaylanır. Kapıda\nödeme (`codMethods` ödeme yöntemleri) sipariş notuna tahsil tutarı olarak yazılır. `writeback`:\nalındı/teslim edildi bilgisi mağazaya geri yazılır. `carriers`: yalnız bu kargo firmasına atanmış\npaketler içe alınır (pazaryeri; boş = tümü).","properties":{"autoImport":{"type":"boolean"},"cancelSync":{"description":"Mağaza iptali senkronu: mağazada iptal edilen sipariş, kurye paketi almadıysa Courino'da da iptal edilir; almışsa kayda elle karar uyarısı (cancelState=manual) yazılır.","type":"boolean"},"carriers":{"description":"Kargo firması süzgeci (içerir karşılaştırması; boş = tümü)","items":{"maxLength":100,"type":"string"},"maxItems":10,"type":"array"},"codEnabled":{"type":"boolean"},"codMethods":{"items":{"maxLength":100,"type":"string"},"maxItems":10,"type":"array"},"deliveryTypeId":{"format":"uuid","type":"string"},"notifyCustomer":{"description":"Shopify: fulfillment'ta mağaza müşterisine e-posta","type":"boolean"},"parcelCount":{"maximum":99,"minimum":1,"type":"integer"},"parcelMode":{"description":"single | per_item | fixed","type":"string"},"payRecipient":{"description":"Ücreti alıcı öder","type":"boolean"},"paymentMethod":{"enum":["","cash","bank_transfer","card","wallet","account"],"type":"string"},"pickupAddress":{"description":"Boşsa müşterinin kayıtlı adresi","maxLength":500,"type":"string"},"pickupDistrictId":{"description":"Boşsa müşterinin kayıtlı semti","format":"uuid","nullable":true,"type":"string"},"triggerStatuses":{"items":{"maxLength":100,"type":"string"},"maxItems":10,"type":"array"},"writeback":{"type":"boolean"},"writebackStatus":{"maxLength":40,"type":"string"}},"required":["triggerStatuses","autoImport","deliveryTypeId","payRecipient","parcelMode","parcelCount","codEnabled","codMethods","writeback","notifyCustomer"],"type":"object"},"EcommerceStoreOrder":{"description":"Mağazadaki siparişin özeti (alıcı ve adres)","properties":{"address":{"type":"string"},"city":{"type":"string"},"currency":{"type":"string"},"email":{"type":"string"},"gateway":{"type":"string"},"items":{"type":"integer"},"name":{"type":"string"},"note":{"type":"string"},"phone":{"type":"string"},"postcode":{"type":"string"},"province":{"type":"string"},"status":{"type":"string"},"total":{"type":"string"}},"required":["status","gateway","total","currency","name","phone","address","city","province","items"],"type":"object"},"ImportIssue":{"description":"Satırdaki bir doğrulama sorunu.","properties":{"field":{"description":"Sütun: recipient_name, recipient_phone, province, district, area, address, delivery_type, parcels, barcodes, reference, weight_kg, notes","type":"string"},"message":{"type":"string"}},"required":["field","message"],"type":"object"},"LocationCheck":{"description":"Kuryenin alım/teslim adımında konum denetimi.","properties":{"accuracy":{"format":"float","type":"number"},"at":{"format":"date-time","type":"string"},"courierId":{"format":"uuid","type":"string"},"distanceM":{"type":"integer"},"lat":{"format":"double","type":"number"},"lng":{"format":"double","type":"number"},"mode":{"$ref":"#/components/schemas/LocationCheckMode"},"overridden":{"description":"Firma istisnasıyla kabul edildi","type":"boolean"},"radiusM":{"type":"integer"},"result":{"$ref":"#/components/schemas/LocationResult"},"source":{"description":"Konumun kaynağı (adımda gönderilen ya da bilinen son konum)","enum":["step","last_known","none"],"type":"string"},"step":{"enum":["pickup","delivery"],"type":"string"},"targetLat":{"format":"double","type":"number"},"targetLng":{"format":"double","type":"number"}},"required":["step","at","mode","result","radiusM","source","overridden"],"type":"object"},"LocationCheckMode":{"description":"Konum denetimi: off kapalı; warn uyarır; block yarıçap dışında adımı engeller.","enum":["off","warn","block"],"type":"string"},"LocationResult":{"description":"ok: yarıçap içinde; outside: dışında; low_accuracy: içinde ama konum doğruluğu düşük; no_location: kurye konumu yok; no_coords: adresin koordinatı yok (denetim atlandı)","enum":["ok","outside","low_accuracy","no_location","no_coords"],"type":"string"},"MyOrderTracking":{"description":"Siparişin canlı takip bilgisi.","properties":{"companyPhone":{"description":"Kurye firmasının telefonu","type":"string"},"courierName":{"description":"Kuryenin adı soyadı (kuryeye verildiyse ve henüz teslim edilmediyse)","type":"string"},"expectedAt":{"description":"Tahmini teslim (firma bu özelliği açtıysa)","format":"date-time","type":"string"},"location":{"description":"Kuryenin son konumu (yalnız gönderi yoldayken ve konum tazeyse)","properties":{"at":{"format":"date-time","type":"string"},"lat":{"format":"double","type":"number"},"lng":{"format":"double","type":"number"}},"required":["lat","lng","at"],"type":"object"},"status":{"$ref":"#/components/schemas/OrderStatus"}},"required":["status","companyPhone"],"type":"object"},"NotificationEvent":{"description":"Webhook olayı: order.created (açıldı), order.assigned (kuryeye verildi), order.reassigned (kurye\ndeğişti), order.returned_to_pool (kuryeden alındı), order.picked_up (alındı), order.return_leg (dönüş\nayağında), order.delivered (teslim edildi), order.delivery_reverted (teslim geri alındı),\norder.cancelled (iptal), order.restored (iptalden döndü), order.delivery_failed (teslim edilemedi),\norder.returning (iade yolunda), order.returned (iade edildi), order.return_reverted (iade geri alındı),\norder.approval_requested (onay bekliyor), order.approved (onaylandı), order.rejected (reddedildi),\norder.at_hub (depoda), order.hub_transfer (depolar arası aktarmada).","enum":["order.created","order.assigned","order.reassigned","order.returned_to_pool","order.picked_up","order.return_leg","order.delivered","order.delivery_reverted","order.cancelled","order.restored","order.delivery_failed","order.returning","order.returned","order.return_reverted","order.approval_requested","order.approved","order.rejected","order.at_hub","order.hub_transfer"],"type":"string"},"OnlinePaymentStatus":{"enum":["pending","succeeded","failed","expired"],"type":"string"},"Order":{"description":"Sipariş.","properties":{"assignedAt":{"description":"Kuryeye verildiği an","format":"date-time","type":"string"},"branchId":{"description":"Siparişin şubesi","format":"uuid","type":"string"},"cancelReason":{"description":"İptal nedeni","type":"string"},"cancelledAt":{"description":"İptal edildiği an","format":"date-time","type":"string"},"cod":{"$ref":"#/components/schemas/OrderCod"},"courierId":{"description":"Siparişi taşıyan kurye","format":"uuid","type":"string"},"createdAt":{"format":"date-time","type":"string"},"customerId":{"description":"Gönderen müşteri","format":"uuid","type":"string"},"customerTypeId":{"description":"Fiyatlandırmada kullanılan müşteri tipi","format":"uuid","type":"string"},"deliveredAt":{"description":"Teslim edildiği an","format":"date-time","type":"string"},"deliveryAttempts":{"description":"Teslim edilemedi kayıtları (sırayla)","items":{"$ref":"#/components/schemas/DeliveryAttempt"},"type":"array"},"deliveryCode":{"$ref":"#/components/schemas/DeliveryCodeState"},"deliveryTypeId":{"format":"uuid","type":"string"},"firstLegDeliveredAt":{"description":"Gidiş-dönüşte gidiş ayağının teslim anı","format":"date-time","type":"string"},"firstLegReceiver":{"description":"Gidiş ayağında teslim alan","type":"string"},"hubAt":{"description":"Depoya giriş (aktarmada çıkış) anı","format":"date-time","type":"string"},"hubId":{"description":"Siparişin bulunduğu ya da son geçtiği depo","format":"uuid","type":"string"},"hubShelf":{"description":"Depodaki raf","type":"string"},"id":{"format":"uuid","type":"string"},"isRoundTrip":{"description":"Gidiş-dönüş","type":"boolean"},"locationChecks":{"description":"Alım/teslim adımlarının konum denetimleri","items":{"$ref":"#/components/schemas/LocationCheck"},"type":"array"},"locationFlag":{"$ref":"#/components/schemas/LocationResult"},"locationOverride":{"$ref":"#/components/schemas/VerifyOverride"},"notes":{"type":"string"},"number":{"description":"Sipariş numarası (firmada artan)","format":"int64","type":"integer"},"parcels":{"description":"Koliler (çok eski siparişlerde boş olabilir)","items":{"$ref":"#/components/schemas/Parcel"},"type":"array"},"payer":{"description":"Ücreti ödeyen taraf","enum":["sender","pickup","recipient"],"type":"string"},"payerCustomerId":{"description":"Ödeyen müşteri","format":"uuid","type":"string"},"paymentMethod":{"$ref":"#/components/schemas/PaymentMethod"},"pickedUpAt":{"description":"Kuryenin gönderiyi aldığı an","format":"date-time","type":"string"},"pickupCourierId":{"description":"Depolu teslimatta gönderiyi alıp depoya bırakan kurye","format":"uuid","type":"string"},"plannedPickupAt":{"description":"Planlanan alım zamanı","format":"date-time","type":"string"},"price":{"$ref":"#/components/schemas/Quote"},"priceListId":{"description":"Fiyatlandırmada kullanılan fiyat listesi","format":"uuid","type":"string"},"receiverCompany":{"description":"Teslim alan firma","type":"string"},"receiverName":{"description":"Teslim alan kişi","type":"string"},"reference":{"description":"Referans numaranız","type":"string"},"source":{"description":"Siparişin açıldığı yol (değişmez): panel (firma personeli), portal (müşteri portalı/uygulaması), api (API anahtarı), ecommerce (e-ticaret aktarımı), import (toplu yükleme), legacy (eski sistemden aktarım), schedule (planlı iş)","enum":["panel","portal","api","ecommerce","import","legacy","schedule"],"readOnly":true,"type":"string"},"status":{"$ref":"#/components/schemas/OrderStatus"},"stops":{"description":"Duraklar: gönderen, (varsa) alım noktası ve alıcı","items":{"$ref":"#/components/schemas/OrderStop"},"type":"array"},"version":{"description":"Sürüm; düzenlemede geri gönderilir (eşzamanlı değişiklik denetimi)","type":"integer"},"volumeM3":{"$ref":"#/components/schemas/Decimal"},"waitMinutes":{"$ref":"#/components/schemas/Decimal"},"weightKg":{"$ref":"#/components/schemas/Decimal"}},"required":["id","number","status","version","payer","deliveryTypeId","isRoundTrip","plannedPickupAt","waitMinutes","weightKg","volumeM3","notes","paymentMethod","reference","createdAt","stops","price","branchId","source"],"type":"object"},"OrderAttachment":{"description":"Siparişe eklenmiş görsel.","properties":{"accuracy":{"description":"Konum doğruluğu (metre)","format":"float","type":"number"},"capturedAt":{"description":"Çekim anı","format":"date-time","type":"string"},"contentType":{"type":"string"},"createdAt":{"description":"Sunucuya yüklendiği an","format":"date-time","type":"string"},"height":{"type":"integer"},"id":{"format":"uuid","type":"string"},"kind":{"description":"pickup: alım; delivery: teslim; signature: imza; failure: teslim edilemedi; other: diğer","enum":["pickup","delivery","signature","failure","other"],"type":"string"},"lat":{"description":"Çekim yerinin enlemi","format":"double","type":"number"},"lng":{"description":"Çekim yerinin boylamı","format":"double","type":"number"},"size":{"description":"Bayt","type":"integer"},"uploadedBy":{"format":"uuid","type":"string"},"width":{"type":"integer"}},"required":["id","kind","contentType","size","width","height","createdAt"],"type":"object"},"OrderBatchRow":{"description":"Toplu siparişte bir satır (alıcı).","properties":{"address":{"maxLength":500,"type":"string"},"area":{"description":"Semt adı (`areaId` yoksa); aynı adlı semtlerde `district`/`province` ile ayırın","maxLength":200,"type":"string"},"areaId":{"description":"Semt kimliği (`GET /me/order-options`)","format":"uuid","type":"string"},"barcodes":{"description":"Koli barkodlarınız (koli sırasıyla)","items":{"maxLength":40,"type":"string"},"maxItems":99,"type":"array"},"deliveryType":{"description":"Gidiş tipi adı (`deliveryTypeId` yoksa)","maxLength":100,"type":"string"},"deliveryTypeId":{"description":"Gidiş tipi kimliği","format":"uuid","type":"string"},"district":{"description":"İlçe","maxLength":100,"type":"string"},"notes":{"maxLength":1000,"type":"string"},"parcels":{"description":"Koli sayısı (varsayılan 1)","maximum":99,"minimum":1,"type":"integer"},"province":{"description":"İl","maxLength":100,"type":"string"},"recipientName":{"maxLength":200,"type":"string"},"recipientPhone":{"maxLength":40,"type":"string"},"reference":{"description":"Referans numaranız; aynı numaralı sipariş varsa satır atlanır","maxLength":100,"type":"string"},"weightKg":{"description":"Ağırlık (kg), ondalık metin (ör. \"2.5\")","maxLength":20,"type":"string"}},"required":["recipientName","recipientPhone","address"],"type":"object"},"OrderCod":{"description":"Siparişin kapıda ödemesi (taşıma ücretinden ayrı, sizin adınıza tahsil edilir).","properties":{"amount":{"$ref":"#/components/schemas/Decimal"},"collectedAt":{"format":"date-time","type":"string"},"currency":{"type":"string"},"dueOn":{"description":"Size aktarım vadesi","format":"date","type":"string"},"fee":{"allOf":[{"$ref":"#/components/schemas/Decimal"}],"description":"Kapıda ödeme hizmet bedeli"},"linkAvailable":{"description":"Alıcı kartla ödeme bağlantısı (QR) ile ödeyebilir","type":"boolean"},"method":{"$ref":"#/components/schemas/CodMethod"},"status":{"$ref":"#/components/schemas/CodStatus"}},"required":["amount","currency","status","fee"],"type":"object"},"OrderImport":{"description":"Toplu sipariş yüklemesi.","properties":{"createdAt":{"format":"date-time","type":"string"},"createdRows":{"description":"Sipariş açılan satır","type":"integer"},"customerId":{"format":"uuid","type":"string"},"customerName":{"type":"string"},"error":{"type":"string"},"failedRows":{"description":"Açılamayan satır","type":"integer"},"filename":{"type":"string"},"finishedAt":{"format":"date-time","type":"string"},"id":{"format":"uuid","type":"string"},"rows":{"description":"Satırlar (yalnız tek yükleme okunurken)","items":{"$ref":"#/components/schemas/OrderImportRow"},"type":"array"},"skippedRows":{"description":"Mükerrer olduğu için atlanan satır","type":"integer"},"source":{"enum":["staff","customer","api"],"type":"string"},"startedAt":{"format":"date-time","type":"string"},"status":{"description":"preview: önizleme (dryRun); queued: sırada; running: açılıyor; done: bitti; failed: başarısız; discarded: vazgeçildi","enum":["preview","queued","running","done","failed","discarded"],"type":"string"},"totalRows":{"type":"integer"},"validRows":{"description":"Geçerli satır","type":"integer"}},"required":["id","customerId","customerName","source","filename","status","totalRows","validRows","createdRows","skippedRows","failedRows","error","createdAt"],"type":"object"},"OrderImportRow":{"description":"Yüklemedeki bir satırın sonucu.","properties":{"address":{"type":"string"},"area":{"type":"string"},"areaId":{"format":"uuid","type":"string"},"areaLabel":{"type":"string"},"barcodes":{"items":{"type":"string"},"type":"array"},"deliveryTypeId":{"format":"uuid","type":"string"},"deliveryTypeName":{"type":"string"},"district":{"type":"string"},"duplicateOrderNumber":{"description":"Aynı referans/barkodla mevcut sipariş (satır atlanır)","format":"int64","type":"integer"},"issues":{"description":"Doğrulama sorunları","items":{"$ref":"#/components/schemas/ImportIssue"},"type":"array"},"message":{"description":"Açılamama / atlanma nedeni","type":"string"},"no":{"description":"Satır numarası (gönderdiğiniz dizide 1'den başlar; dosyada başlık 1. satırdır)","type":"integer"},"notes":{"type":"string"},"orderId":{"format":"uuid","type":"string"},"orderNumber":{"description":"Açılan siparişin numarası","format":"int64","type":"integer"},"parcels":{"type":"integer"},"province":{"type":"string"},"recipientName":{"type":"string"},"recipientPhone":{"type":"string"},"reference":{"type":"string"},"status":{"description":"invalid: geçersiz; pending: bekliyor; created: açıldı; skipped: atlandı; failed: açılamadı","enum":["invalid","pending","created","skipped","failed"],"type":"string"},"weightKg":{"type":"string"}},"required":["no","status","recipientName","recipientPhone","area","address","parcels","barcodes","reference","weightKg","notes","issues","message"],"type":"object"},"OrderOptions":{"description":"Sipariş seçenekleri.","properties":{"businessHours":{"$ref":"#/components/schemas/BusinessHours"},"deliveryTypes":{"description":"Etkin gidiş tipleri","items":{"$ref":"#/components/schemas/DeliveryTypeOption"},"type":"array"},"districts":{"description":"Etkin semtler","items":{"$ref":"#/components/schemas/DistrictOption"},"type":"array"}},"required":["districts","deliveryTypes"],"type":"object"},"OrderPage":{"properties":{"items":{"items":{"$ref":"#/components/schemas/Order"},"type":"array"},"total":{"description":"Süzgece uyan toplam kayıt","type":"integer"}},"required":["items","total"],"type":"object"},"OrderParty":{"allOf":[{"$ref":"#/components/schemas/QuoteParty"},{"properties":{"address":{"description":"Açık adres","maxLength":500,"type":"string"},"lat":{"description":"Adresin enlemi (isteğe bağlı; `lng` ile birlikte)","format":"double","maximum":90,"minimum":-90,"type":"number"},"lng":{"description":"Adresin boylamı","format":"double","maximum":180,"minimum":-180,"type":"number"},"name":{"description":"Ad soyad / unvan; `customerId` varsa müşteri adı varsayılır","maxLength":200,"type":"string"},"notifyContactIds":{"description":"Bu taraf için teslim bildirimi alacak yetkililer. Verilmezse tüm etkin yetkililer; boş liste verilirse hiçbiri.","items":{"format":"uuid","type":"string"},"maxItems":50,"type":"array"},"phone":{"$ref":"#/components/schemas/Phone"}},"type":"object"}],"description":"Siparişin bir tarafı (gönderen, alım noktası ya da alıcı)."},"OrderStatus":{"description":"pending_approval: firma onayı bekliyor; on_table: kurye bekliyor; assigned: kuryeye verildi;\npicked_up: alındı, yolda; return_leg: gidiş-dönüşte dönüş ayağında; delivered: teslim edildi;\ncancelled: iptal; delivery_failed: teslim edilemedi; returning: iade yolunda; returned: iade edildi;\nat_hub: depoda; in_transfer: depolar arası aktarmada","enum":["pending_approval","on_table","assigned","picked_up","return_leg","delivered","cancelled","delivery_failed","returning","returned","at_hub","in_transfer"],"type":"string"},"OrderStop":{"description":"Siparişin bir durağı.","properties":{"address":{"type":"string"},"contactIds":{"description":"Bildirim alacak yetkililer","items":{"format":"uuid","type":"string"},"type":"array"},"customerId":{"format":"uuid","type":"string"},"districtId":{"description":"Semt (çok eski siparişlerde boş olabilir)","format":"uuid","type":"string"},"districtName":{"description":"Semt adı","type":"string"},"lat":{"format":"double","type":"number"},"lng":{"format":"double","type":"number"},"name":{"type":"string"},"phone":{"type":"string"},"regionNo":{"description":"Fiyat bölgesi numarası","type":"integer"},"role":{"description":"sender: gönderen; pickup: alım noktası; recipient: alıcı","enum":["sender","pickup","recipient"],"type":"string"}},"required":["role","name","address","districtName","regionNo"],"type":"object"},"Parcel":{"description":"Koli.","properties":{"barcode":{"type":"string"},"deliveryScannedAt":{"description":"Kuryenin teslimde okuttuğu an","format":"date-time","type":"string"},"description":{"type":"string"},"external":{"description":"Barkod sizindir (sistem üretmedi)","type":"boolean"},"id":{"format":"uuid","type":"string"},"pickupScannedAt":{"description":"Kuryenin alımda okuttuğu an","format":"date-time","type":"string"},"seq":{"description":"Koli sırası (1'den başlar)","type":"integer"}},"required":["id","seq","barcode","external","description"],"type":"object"},"ParcelInput":{"properties":{"barcode":{"description":"Kendi barkodunuz (firmada tekil; `<sayı>-<sayı>` biçimi sisteme ayrılmıştır)","pattern":"^[A-Za-z0-9._/-]{3,40}$","type":"string"},"description":{"description":"Koli içeriği / açıklama","maxLength":200,"type":"string"}},"type":"object"},"Payment":{"properties":{"amount":{"$ref":"#/components/schemas/Decimal"},"autopayFallback":{"description":"Ana kart reddettiği için yedek kart onayınızla diğer kayıtlı kartınızdan çekildi","type":"boolean"},"checkoutExpiresAt":{"format":"date-time","type":"string"},"checkoutUrl":{"description":"Bekleyen ödemenin sayfası","type":"string"},"codOrderId":{"description":"kind=cod: kapıda kartla ödenen siparişin kimliği","format":"uuid","type":"string"},"collector":{"description":"Tahsilatı yapan: firm firma, platform Courino","enum":["firm","platform"],"type":"string"},"completedAt":{"format":"date-time","type":"string"},"createdAt":{"format":"date-time","type":"string"},"currency":{"type":"string"},"customerFee":{"allOf":[{"$ref":"#/components/schemas/Decimal"}],"description":"Size yansıtılan kartla ödeme hizmet bedeli; `amount` bunu içerir. Yoksa alan gelmez."},"customerId":{"format":"uuid","type":"string"},"description":{"type":"string"},"failureCode":{"type":"string"},"failureMessage":{"type":"string"},"id":{"format":"uuid","type":"string"},"installments":{"type":"integer"},"kind":{"enum":["charges","wallet_topup","cod"],"type":"string"},"orderIds":{"items":{"format":"uuid","type":"string"},"type":"array"},"paidAmount":{"$ref":"#/components/schemas/Decimal"},"provider":{"type":"string"},"providerOrderId":{"description":"Ödeme kuruluşundaki sipariş numarası (yalnız Courino tahsilatında)","type":"string"},"providerPaymentId":{"description":"Ödeme servisindeki kimlik (yalnız Courino tahsilatında)","type":"string"},"providerRef":{"description":"Courino ödeme numarası","type":"string"},"refundedAmount":{"$ref":"#/components/schemas/Decimal"},"refunds":{"items":{"$ref":"#/components/schemas/PaymentRefund"},"type":"array"},"status":{"$ref":"#/components/schemas/OnlinePaymentStatus"},"storedCard":{"description":"Ödeme kayıtlı kartınızdan (ödeme sayfası olmadan) çekildi","type":"boolean"},"test":{"type":"boolean"}},"required":["id","kind","customerId","provider","amount","currency","status","paidAmount","refundedAmount","installments","test","description","orderIds","checkoutExpiresAt","createdAt"],"type":"object"},"PaymentMethod":{"description":"cash: nakit (kapıda); bank_transfer: havale/EFT; card: kredi kartı; wallet: pul (ön ödemeli bakiye);\naccount: açık hesap (cari). Verilmezse pul müşterisinde pul, abonede açık hesap, diğerlerinde nakit.\nPul yalnız pul müşterisinde geçerlidir ve orada zorunludur.","enum":["cash","bank_transfer","card","wallet","account"],"type":"string"},"PaymentPage":{"properties":{"items":{"items":{"$ref":"#/components/schemas/Payment"},"type":"array"},"total":{"type":"integer"}},"required":["items","total"],"type":"object"},"PaymentRefund":{"properties":{"amount":{"$ref":"#/components/schemas/Decimal"},"completedAt":{"format":"date-time","type":"string"},"createdAt":{"format":"date-time","type":"string"},"failureMessage":{"type":"string"},"id":{"format":"uuid","type":"string"},"reason":{"type":"string"},"status":{"enum":["pending","succeeded","failed"],"type":"string"}},"required":["id","amount","status","reason","createdAt"],"type":"object"},"PaymentStatus":{"description":"paid: ödendi; unpaid: ödenmedi","enum":["paid","unpaid"],"type":"string"},"Phone":{"description":"Girişte serbest biçim (0532 123 45 67, +90532…); yanıtta E.164 (+905321234567)","maxLength":30,"type":"string"},"Problem":{"description":"Hata gövdesi (RFC 7807).","properties":{"code":{"description":"Makine okunur hata kodu. Açık bir kümedir; tanımadığınız kodu HTTP durumuna göre ele alın.","type":"string"},"detail":{"description":"İnsan okunur açıklama (Accept-Language diline göre)","type":"string"},"details":{"additionalProperties":true,"description":"Hataya özgü ek, makine okunur ayrıntı","type":"object"},"error":{"description":"Kısa hata anahtarı (dış sözleşme). `support_session`: cockpit \"Hesabına bağlan\"\noturumunda engellenen işlem (403; şifre, iletişim, API anahtarı, hesap silme, kart, ödeme).","type":"string"},"errors":{"description":"Alan bazlı doğrulama sorunları","items":{"properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["field","message"],"type":"object"},"type":"array"},"status":{"description":"HTTP durum kodu","type":"integer"},"title":{"type":"string"},"traceId":{"description":"Destek talebinde iletin; isteği kayıtlarda bulmamızı sağlar","type":"string"},"type":{"type":"string"}},"required":["type","title","status","code"],"type":"object"},"Quote":{"description":"Fiyat teklifi ve kırılımı.","properties":{"algorithmVersion":{"description":"Fiyatı hesaplayan algoritmanın sürümü","type":"string"},"calculatedTotal":{"allOf":[{"$ref":"#/components/schemas/Decimal"}],"description":"İndirimden önceki toplam"},"currencyCode":{"type":"string"},"currencyRate":{"$ref":"#/components/schemas/Decimal"},"deliveryMultiplier":{"$ref":"#/components/schemas/Decimal"},"discount":{"allOf":[{"$ref":"#/components/schemas/AppliedDiscount"}],"description":"Uygulanan indirim (varsa). `total` indirimli toplamdır."},"expectedDeliveryMinutes":{"description":"Beklenen teslim süresi (firma bu özelliği açtıysa)","type":"integer"},"fromRegion":{"description":"Çıkış fiyat bölgesi","type":"integer"},"lines":{"$ref":"#/components/schemas/QuoteLines"},"nightMultiplier":{"$ref":"#/components/schemas/Decimal"},"tier":{"$ref":"#/components/schemas/Tier"},"toRegion":{"description":"Varış fiyat bölgesi","type":"integer"},"total":{"allOf":[{"$ref":"#/components/schemas/Decimal"}],"description":"KDV dahil ödenecek toplam"},"usesWallet":{"description":"Tutar pul bakiyesinden düşülecek","type":"boolean"},"vatRate":{"$ref":"#/components/schemas/Decimal"},"vatScope":{"description":"KDV kapsamı: all tüm kalemler; service_only yalnız hizmet bedeli","enum":["all","service_only"],"type":"string"}},"required":["algorithmVersion","tier","fromRegion","toRegion","deliveryMultiplier","nightMultiplier","vatRate","vatScope","currencyCode","currencyRate","lines","calculatedTotal","total"],"type":"object"},"QuoteLines":{"description":"Fiyat kalemleri (KDV hariç, `vat` hariç).","properties":{"base":{"$ref":"#/components/schemas/Decimal"},"bridge":{"$ref":"#/components/schemas/Decimal"},"extra":{"$ref":"#/components/schemas/Decimal"},"manualAdjustmentNet":{"$ref":"#/components/schemas/Decimal"},"manualAdjustmentVat":{"$ref":"#/components/schemas/Decimal"},"returnFeeNet":{"allOf":[{"$ref":"#/components/schemas/Decimal"}],"description":"İade ücreti (KDV hariç; yalnız siparişte, toplama dahil)"},"returnFeeVat":{"allOf":[{"$ref":"#/components/schemas/Decimal"}],"description":"İade ücretinin KDV'si"},"serviceNet":{"$ref":"#/components/schemas/Decimal"},"vat":{"$ref":"#/components/schemas/Decimal"},"volume":{"$ref":"#/components/schemas/Decimal"},"wait":{"$ref":"#/components/schemas/Decimal"},"weight":{"$ref":"#/components/schemas/Decimal"}},"required":["base","extra","serviceNet","wait","weight","volume","bridge","vat","manualAdjustmentNet","manualAdjustmentVat"],"type":"object"},"QuoteParty":{"description":"Taraf ya adres defterinizdeki bir müşteriyle (`customerId`) ya da semtle (`districtId`) tanımlanır.\n`customerId` verilip semt verilmezse müşterinin kayıtlı semti kullanılır. Gönderen her zaman sizsiniz:\n`sender.customerId` boş bırakılabilir ya da kendi kimliğiniz olmalıdır.","properties":{"customerId":{"description":"Adres defterinizdeki müşteri (`GET /me/customer` → `links`)","format":"uuid","type":"string"},"districtId":{"description":"Semt (`GET /me/order-options`)","format":"uuid","type":"string"}},"type":"object"},"QuoteRequest":{"description":"Teklif isteği.","properties":{"deliveryTypeId":{"description":"Gidiş tipi (`GET /me/order-options`)","format":"uuid","type":"string"},"payer":{"description":"Ücreti ödeyen taraf: sender gönderen, pickup alım noktası, recipient alıcı","enum":["sender","pickup","recipient"],"type":"string"},"pickup":{"$ref":"#/components/schemas/QuoteParty"},"plannedPickupAt":{"description":"Planlanan alım zamanı; verilmezse şimdi (gece tarifesi buna göre belirlenir)","format":"date-time","type":"string"},"recipient":{"$ref":"#/components/schemas/QuoteParty"},"sender":{"$ref":"#/components/schemas/QuoteParty"},"volumeM3":{"$ref":"#/components/schemas/Decimal"},"waitMinutes":{"$ref":"#/components/schemas/Decimal"},"weightKg":{"$ref":"#/components/schemas/Decimal"}},"required":["payer","sender","recipient","deliveryTypeId"],"type":"object"},"Status":{"enum":["active","inactive"],"type":"string"},"Tier":{"description":"cash: peşin; subscriber: abone","enum":["cash","subscriber"],"type":"string"},"UpdateOrderRequest":{"properties":{"order":{"allOf":[{"$ref":"#/components/schemas/CreateOrderRequest"}],"description":"Siparişin tam yeni hali"},"version":{"description":"Okuduğunuz siparişin `version` değeri","type":"integer"}},"required":["version","order"],"type":"object"},"VerifyOverride":{"properties":{"at":{"format":"date-time","type":"string"},"byUser":{"format":"uuid","type":"string"},"reason":{"type":"string"}},"required":["reason","at"],"type":"object"},"Wallet":{"description":"Pul (ön ödemeli bakiye) hesabı.","properties":{"balance":{"$ref":"#/components/schemas/Decimal"},"entries":{"description":"Son 100 hareket","items":{"$ref":"#/components/schemas/WalletEntry"},"type":"array"},"lowBalance":{"description":"Bakiye firmanın düşük bakiye eşiğinin altında","type":"boolean"},"lowBalanceThreshold":{"$ref":"#/components/schemas/Decimal"},"policy":{"$ref":"#/components/schemas/WalletPolicy"}},"required":["balance","entries"],"type":"object"},"WalletEntry":{"properties":{"amount":{"$ref":"#/components/schemas/Decimal"},"createdAt":{"format":"date-time","type":"string"},"id":{"format":"uuid","type":"string"},"kind":{"description":"topup: yükleme; order_charge: sipariş ücreti; order_refund: iade; adjustment: düzeltme; opening_balance: açılış bakiyesi","enum":["topup","order_charge","order_refund","adjustment","opening_balance"],"type":"string"},"note":{"type":"string"},"orderId":{"format":"uuid","type":"string"}},"required":["id","amount","kind","note","createdAt"],"type":"object"},"WalletNegative":{"description":"Eksi bakiye kuralı: inherit firmanın ayarı, allow izinli, deny yasak","enum":["inherit","allow","deny"],"type":"string"},"WalletPolicy":{"properties":{"allowsNegative":{"description":"Bakiye eksiye düşebilir mi (etkin kural)","type":"boolean"},"availableBalance":{"allOf":[{"$ref":"#/components/schemas/Decimal"}],"description":"Siparişe harcanabilecek tutar (bakiye + eksi sınırı); eksiye sınırsız izinde yok"},"creditLimit":{"allOf":[{"$ref":"#/components/schemas/Decimal"}],"description":"Eksi sınırı (mutlak değer); yoksa sınırsız"},"negative":{"$ref":"#/components/schemas/WalletNegative"}},"required":["negative","allowsNegative"],"type":"object"},"Webhook":{"description":"Webhook aboneliği.","properties":{"createdAt":{"format":"date-time","type":"string"},"customerId":{"description":"Aboneliğin ait olduğu müşteri","format":"uuid","type":"string"},"description":{"type":"string"},"enabled":{"description":"Etkin mi","type":"boolean"},"events":{"description":"Abone olunan olaylar","items":{"$ref":"#/components/schemas/NotificationEvent"},"type":"array"},"format":{"$ref":"#/components/schemas/WebhookFormat"},"id":{"format":"uuid","type":"string"},"url":{"description":"Olayların gönderildiği adres","type":"string"}},"required":["id","url","events","description","enabled","createdAt","format"],"type":"object"},"WebhookFormat":{"description":"kos: imzalı JSON (önerilen, varsayılan). legacy: eski sistemle uyumlu istek — multipart/form-data, tek alan orderId (sipariş numarası).","enum":["kos","legacy"],"type":"string"},"WebhookInput":{"properties":{"description":{"description":"Kendi notunuz","maxLength":500,"type":"string"},"enabled":{"description":"false ise olay gönderilmez","type":"boolean"},"events":{"description":"Abone olunacak olaylar (en az bir)","items":{"$ref":"#/components/schemas/NotificationEvent"},"minItems":1,"type":"array"},"format":{"$ref":"#/components/schemas/WebhookFormat"},"url":{"description":"Olayların gönderileceği https adresi","maxLength":2000,"type":"string"}},"required":["url","events","enabled"],"type":"object"}},"securitySchemes":{"apiKey":{"bearerFormat":"kosk_…","description":"Müşteri portalında **Firma bilgilerim → Entegrasyon (API anahtarları)** bölümünden oluşturulan API anahtarı\n(`kosk_` ile başlar). Her istekte `Authorization: Bearer kosk_…` başlığıyla gönderilir.","scheme":"bearer","type":"http"}}}}