{"openapi":"3.1.0","info":{"title":"Lezzet35 API","version":"1.0.0","description":"İzmir yemek pazaryeri Lezzet35’in HTTP API’si. Üç bölge: herkese açık JSON uçları (sağlık, kimlik, bölge), SiparişMatik kasa uyumluluk katmanı `/api/v1` (canlı) ve Partner API `/api/v2` (Faz 6). Tüm tutarlar sunucuda hesaplanır; istemciden fiyat/indirim alanı kabul edilmez.","contact":{"name":"Lezzet35","url":"/docs/api"}},"servers":[{"url":"/","description":"Belgenin sunulduğu kaynak (üretimde wpsiparis.tr — KARAR-5; alan adı EKSİK)"}],"tags":[{"name":"Sağlık","description":"Sağlık kontrolü ve belge keşfi (kimlik gerekmez)"},{"name":"Kimlik","description":"OTP ile giriş/kayıt (D1). Şifre yok; oturum HttpOnly çerez"},{"name":"Bölge","description":"İzmir ilçe/mahalle ve servis alanı (M04)"},{"name":"SiparişMatik v1 (iki sistem: WhatsApp/markalı site · Pazaryeri)","description":"SiparişMatik kasa uyumluluk katmanı — yollar ve alanlar WPSipariş ile birebir (Faz 6, canlı); entegrasyon belgesi docs/api/siparismatik.md"},{"name":"Partner API v2 (Faz 6)","description":"Diğer restoran yazılımları ve mobil uygulama için Partner API — taslak; Faz 6’da kontrat testleriyle sabitlenir"}],"paths":{"/api/health":{"get":{"tags":["Sağlık"],"summary":"Sağlık kontrolü","description":"Coolify ve izleme araçları için sağlık ucu. Veritabanı ve Redis ayrı raporlanır; biri hatalıysa 503 döner. Bu uç standart `{success, data}` zarfını **kullanmaz** (izleme araçları düz alan bekler). Yanıt `cache-control: no-store` ile gelir; her bağımlılık kontrolü 2 sn zaman aşımlıdır.","operationId":"saglikKontrolu","responses":{"200":{"description":"Her iki bağımlılık sağlıklı","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthYaniti"},"example":{"durum":"ok","db":"ok","redis":"ok","surum":"0.1.0","zaman":"2026-09-16T09:00:00.000Z"}}}},"503":{"description":"db ya da redis hatalı; gövde aynı şekil, `durum: sorunlu`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthYaniti"},"example":{"durum":"sorunlu","db":"ok","redis":"hata","surum":"0.1.0","zaman":"2026-09-16T09:00:00.000Z"}}}}},"x-durum":"hazir","x-faz":1,"x-kaynak":"src/app/api/health/route.ts"}},"/api/openapi.json":{"get":{"tags":["Sağlık"],"summary":"OpenAPI belgesi","description":"Bu belgenin makine biçimi (OpenAPI 3.1). 5 dakika önbelleklenir (`cache-control: public, max-age=300`). Kod üretimi ve sözleşme testleri bu ucu kullanır.","operationId":"openapiBelgesi","responses":{"200":{"description":"OpenAPI 3.1 belgesi","content":{"application/json":{"schema":{"type":"object","description":"OpenAPI 3.1.0 belgesi; `openapi`, `info`, `paths`, `components` anahtarları","required":["openapi","info","paths"]}}}}},"x-durum":"hazir","x-faz":3,"x-kaynak":"src/app/api/openapi.json/route.ts"}},"/api/auth/otp/istek":{"post":{"tags":["Kimlik"],"summary":"OTP kodu iste","description":"Telefona 6 haneli tek kullanımlık kod gönderir (SMS: MasGSM; geliştirmede konsol). Kod düz metin saklanmaz, sha256 özeti 5 dk geçerlidir ve 5 deneme hakkı vardır. Aynı numara için `OTP_BEKLEME_SN` (60 sn) dolmadan yeni istek 429 döner. Üye olmayan numara doğrulamada otomatik kaydedilir (şifre yok).","operationId":"otpIste","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OtpIstek"},"example":{"telefon":"0532 123 45 67","amac":"giris"}}}},"responses":{"200":{"description":"Kod gönderildi","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OtpIstekYaniti"},"example":{"success":true,"data":{"gonderildi":true,"bitisSn":300}}}}},"400":{"description":"Doğrulama hatası (alan bazlı `errors`) ya da geçersiz Türkiye numarası","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Hata"},"example":{"success":false,"message":"Geçerli bir Türkiye cep telefonu numarası girin","errors":{"telefon":["biçim"]}}}}},"429":{"description":"Hız sınırı aşıldı; `retry-after` başlığı ve `yenidenSn` alanı kaç saniye sonra denenebileceğini söyler","headers":{"retry-after":{"description":"Saniye","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Hata"},"example":{"success":false,"message":"Çok fazla istek; lütfen biraz sonra tekrar deneyin","yenidenSn":412}}}},"500":{"description":"Beklenmeyen sunucu hatası; ayrıntı yalnız sunucu logunda","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Hata"},"example":{"success":false,"message":"Sunucu hatası"}}}}},"x-durum":"hazir","x-faz":1,"x-hiz-siniri":"Telefon başına 3 / 10 dk (`OTP_TEL_LIMIT`), IP başına 21 / 10 dk; ardışık istek 60 sn bekleme","x-kaynak":"src/app/api/auth/otp/istek/route.ts"}},"/api/auth/otp/dogrula":{"post":{"tags":["Kimlik"],"summary":"OTP kodunu doğrula","description":"Kodu doğrular; başarılıysa kullanıcı kimliğini döner ve numara ilk kez doğrulanıyorsa hesabı oluşturur. **Oturum çerezi bu uçta açılmaz**: tarayıcı akışı `/giris` sayfasındaki Server Action ile HttpOnly `l35_oturum` çerezi açar. Mobil/PWA için token tabanlı oturum ucu Faz 5’te (D1). Hatalı kod `neden` alanıyla ayrıştırılır: `bulunamadi | suresi_doldu | deneme_asildi | yanlis`.","operationId":"otpDogrula","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OtpDogrula"},"example":{"telefon":"0532 123 45 67","kod":"123456"}}}},"responses":{"200":{"description":"Kod doğru","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OtpDogrulaYaniti"},"example":{"success":true,"data":{"userId":"cmfl3k9x40000abcd1234efgh","yeniKullanici":false}}}}},"400":{"description":"Doğrulama hatası, geçersiz numara ya da yanlış/süresi dolmuş kod (`neden`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Hata"},"example":{"success":false,"message":"Kod hatalı","neden":"yanlis"}}}},"429":{"description":"Hız sınırı aşıldı; `retry-after` başlığı ve `yenidenSn` alanı kaç saniye sonra denenebileceğini söyler","headers":{"retry-after":{"description":"Saniye","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Hata"},"example":{"success":false,"message":"Çok fazla istek; lütfen biraz sonra tekrar deneyin","yenidenSn":412}}}},"500":{"description":"Beklenmeyen sunucu hatası; ayrıntı yalnız sunucu logunda","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Hata"},"example":{"success":false,"message":"Sunucu hatası"}}}}},"x-durum":"hazir","x-faz":1,"x-hiz-siniri":"Telefon başına 10 / 10 dk","x-kaynak":"src/app/api/auth/otp/dogrula/route.ts"}},"/api/bolge/mahalle-ara":{"get":{"tags":["Bölge"],"summary":"Mahalle ara","description":"İzmir mahallelerinde arama (adres formu ve vitrin konum seçici için). Önek eşleşmesi önce, sonra trigram benzerliği (`pg_trgm`, eşik 0,3); Türkçe karakterden bağımsız (`alsan` → Alsancak). En fazla 8 sonuç; 2 karakterden kısa sorgu boş liste döner. Yanıt 60 sn herkese açık önbelleklenir. Bu uç ilçe filtresi almaz; istemci `ilceId` alanına göre sıralar.","operationId":"mahalleAra","parameters":[{"name":"q","in":"query","required":false,"description":"Arama metni (en az 2 karakter; 60 karakterden sonrası kırpılır)","schema":{"type":"string","minLength":2,"maxLength":60,"description":"Arama metni; 2 karakterden kısa sorgu boş liste döner. Türkçe karakterden bağımsız (alsan = Alsan)","examples":["alsan"]},"example":"alsan"}],"responses":{"200":{"description":"Eşleşen mahalleler (boş dizi olabilir)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MahalleAraYaniti"},"example":{"success":true,"data":[{"id":61033,"ad":"Alsancak Mahallesi","ilceId":3513,"ilceAd":"Konak"}]}}}},"429":{"description":"Hız sınırı aşıldı; `retry-after` başlığı ve `yenidenSn` alanı kaç saniye sonra denenebileceğini söyler","headers":{"retry-after":{"description":"Saniye","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Hata"},"example":{"success":false,"message":"Çok fazla istek; lütfen biraz sonra tekrar deneyin","yenidenSn":412}}}},"500":{"description":"Beklenmeyen sunucu hatası; ayrıntı yalnız sunucu logunda","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Hata"},"example":{"success":false,"message":"Sunucu hatası"}}}}},"x-durum":"hazir","x-faz":2,"x-hiz-siniri":"IP başına 60 / dk","x-kaynak":"src/app/api/bolge/mahalle-ara/route.ts · modules/M04-bolge/servis-alani.ts mahalleAra"}},"/api/v1/pool":{"get":{"tags":["SiparişMatik v1 (iki sistem: WhatsApp/markalı site · Pazaryeri)"],"responses":{"200":{"description":"v1 zarfı: `success` JSON boolean, `message`; veri anahtarları alan tablosunda","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Zarf"}}}},"401":{"description":"Kimlik başlığı eksik/yanlış: `{success:false, message}`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Zarf"}}}}},"x-durum":"hazir","x-faz":6,"summary":"Havuz: bağlantıya hazır firmalar","description":"Exe açılışta yerelde Lezzet35 kaydı yoksa çağırır; `havuz[]` içinde `siparismatik_id` eşleşen firmanın `api_token`’ını alır. Lezzet35’te **HAZIR penceresi** (KARAR-9): admin \"bağlantıya hazırla\" der → firma `POOL_HAZIR_PENCERE_SAAT` (24 sa) boyunca havuzda görünür → `PUT /pool/connect` ile BAGLI olur ya da süre dolunca düşer. WPSipariş’in \"tüm HAZIR firmaların token’ı döner\" davranışı böyle daraltılır; exe değişmez.","operationId":"v1PoolListesi","security":[{"poolSecret":[]}],"x-alanlar":[{"ad":"success","tip":"boolean","zorunlu":true,"aciklama":"JSON boolean; exe \"True\" metniyle karşılaştırır"},{"ad":"message","tip":"string","zorunlu":false,"aciklama":"Bilgi mesajı"},{"ad":"havuz[].id","tip":"integer","zorunlu":true,"aciklama":"Firma kimliği (Firma.v1Id); exe `pool` seçiminde kullanır"},{"ad":"havuz[].domain_id","tip":"integer","zorunlu":false,"aciklama":"Ana marka kimliği"},{"ad":"havuz[].siparismatik_id","tip":"integer","zorunlu":true,"aciklama":"SiparişMatik firmaid; exe Registry(\"firmaid\") ile eşler"},{"ad":"havuz[].ad","tip":"string","zorunlu":true,"aciklama":"Firma adı"},{"ad":"havuz[].subdomain","tip":"string","zorunlu":true,"aciklama":"Marka slug’ı (eski alt alan adı)"},{"ad":"havuz[].baglanti_durumu","tip":"string","zorunlu":true,"aciklama":"Her zaman HAZIR (pencere içindeki firmalar)"},{"ad":"havuz[].api_token","tip":"string","zorunlu":true,"aciklama":"Firma Bearer anahtarı — yalnız HAZIR penceresinde döner (KARAR-9)"},{"ad":"toplam","tip":"integer","zorunlu":false,"aciklama":"Listedeki firma sayısı"}],"x-hiz-siniri":"IP başına 30 / dk","x-kaynak":"wpsiparis-api-contract.md §4.1 · Entegrasyon.cs:7905-7921"}},"/api/v1/pool/connect":{"put":{"tags":["SiparişMatik v1 (iki sistem: WhatsApp/markalı site · Pazaryeri)"],"responses":{"200":{"description":"v1 zarfı: `success` JSON boolean, `message`; veri anahtarları alan tablosunda","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Zarf"}}}},"401":{"description":"Kimlik başlığı eksik/yanlış: `{success:false, message}`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Zarf"}}}},"404":{"description":"Firma/kayıt yok ya da başka firmaya ait (varlık sızdırmaz)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Zarf"}}}}},"x-durum":"hazir","x-faz":6,"summary":"Havuz: bağlan","description":"Gövde yok. Firma `BAGLI` olur, havuzdan düşer; `firma.*` alanları exe’nin entegrasyon kaydına yazılır. Token rotasyonu bu uçta mümkün değil (exe token’ı değiştirmez).","operationId":"v1PoolConnect","security":[{"bearerFirma":[]}],"x-alanlar":[{"ad":"success","tip":"boolean","zorunlu":true,"aciklama":""},{"ad":"firma.id","tip":"integer","zorunlu":true,"aciklama":"Firma kimliği"},{"ad":"firma.domain_id","tip":"integer","zorunlu":true,"aciklama":"Ana şube kimliği; exe ana entegrasyon kaydına yazar"},{"ad":"firma.ad","tip":"string","zorunlu":true,"aciklama":""},{"ad":"firma.subdomain","tip":"string","zorunlu":true,"aciklama":""},{"ad":"firma.baglanti_durumu","tip":"string","zorunlu":true,"aciklama":"connect → BAGLI, disconnect → HAZIR"},{"ad":"firma.baglanti_zamani","tip":"string","zorunlu":true,"aciklama":"dd.MM.yyyy HH:mm"},{"ad":"firma.baglanti","tip":"string","zorunlu":true,"aciklama":"ONLINE | OFFLINE"}],"x-kaynak":"§4.2 · Entegrasyon.cs:7945-7961"}},"/api/v1/pool/disconnect":{"put":{"tags":["SiparişMatik v1 (iki sistem: WhatsApp/markalı site · Pazaryeri)"],"responses":{"200":{"description":"v1 zarfı: `success` JSON boolean, `message`; veri anahtarları alan tablosunda","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Zarf"}}}},"401":{"description":"Kimlik başlığı eksik/yanlış: `{success:false, message}`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Zarf"}}}},"404":{"description":"Firma/kayıt yok ya da başka firmaya ait (varlık sızdırmaz)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Zarf"}}}}},"x-durum":"hazir","x-faz":6,"summary":"Havuz: bağlantıyı kopar","description":"Exe çağırmaz; admin \"bağlantıyı kopar\" ile aynı işlev. Firma yeniden HAZIR olur ve pencere baştan başlar.","operationId":"v1PoolDisconnect","security":[{"bearerFirma":[]}],"x-alanlar":[{"ad":"success","tip":"boolean","zorunlu":true,"aciklama":""},{"ad":"firma.id","tip":"integer","zorunlu":true,"aciklama":"Firma kimliği"},{"ad":"firma.ad","tip":"string","zorunlu":true,"aciklama":""},{"ad":"firma.baglanti_durumu","tip":"string","zorunlu":true,"aciklama":"connect → BAGLI, disconnect → HAZIR"},{"ad":"firma.baglanti","tip":"string","zorunlu":true,"aciklama":"ONLINE | OFFLINE"}],"x-kaynak":"§4.2 · PoolController.php:194-230"}},"/api/v1/pool/categories/sync":{"post":{"tags":["SiparişMatik v1 (iki sistem: WhatsApp/markalı site · Pazaryeri)"],"responses":{"200":{"description":"v1 zarfı: `success` JSON boolean, `message`; veri anahtarları alan tablosunda","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Zarf"}}}},"401":{"description":"Kimlik başlığı eksik/yanlış: `{success:false, message}`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Zarf"}}}},"422":{"description":"Doğrulama hatası: `{success:false, message:\"Doğrulama hatası: …\"}`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Zarf"}}}}},"x-durum":"hazir","x-faz":6,"summary":"Kategori senkronu (exe → Lezzet35)","description":"Kodda var, zamanlanmamış (Form_KasaService.cs:1207 yorumda). Yeni kategori PASIF olarak eklenir ve moderasyon kuyruğuna düşer; `sp_kategori_id` eşleşende yalnız `ad` güncellenir; silme yok. İdempotent: `(firma, sp_kategori_id)` tekil.","operationId":"v1KategoriSenkron","security":[{"bearerFirma":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["categories"],"properties":{"categories":{"type":"array","items":{"type":"object","required":["ad"],"properties":{"sp_kategori_id":{"type":"string"},"ad":{"type":"string"},"sira":{"type":"integer"},"aciklama":{"type":"string"},"durum":{"type":"string","enum":["AKTIF","PASIF"]}}}}}},"example":{"categories":[{"sp_kategori_id":"12","ad":"Kumrular","sira":1,"aciklama":""}]}}}},"x-alanlar":[{"ad":"categories[].sp_kategori_id","tip":"string","zorunlu":true,"aciklama":"Kasa kategori kimliği (eşleme anahtarı)"},{"ad":"categories[].ad","tip":"string","zorunlu":true,"aciklama":"ASCIITemizle uygulanmış ad"},{"ad":"categories[].sira","tip":"integer","zorunlu":true,"aciklama":""},{"ad":"categories[].aciklama","tip":"string","zorunlu":true,"aciklama":""},{"ad":"categories[].durum","tip":"AKTIF | PASIF","zorunlu":false,"aciklama":""},{"ad":"success","tip":"boolean","zorunlu":true,"aciklama":""},{"ad":"message","tip":"string","zorunlu":true,"aciklama":"Exe ürün senkronunda okur"},{"ad":"summary.created","tip":"integer","zorunlu":false,"aciklama":""},{"ad":"summary.updated","tip":"integer","zorunlu":false,"aciklama":""},{"ad":"summary.skipped","tip":"integer","zorunlu":false,"aciklama":"İdempotent tekrar → skipped artar"},{"ad":"summary.total","tip":"integer","zorunlu":false,"aciklama":""}],"x-kaynak":"§4.2 · PoolController.php:305-406 · Entegrasyon.cs:8094-8128"}},"/api/v1/pool/products/sync":{"post":{"tags":["SiparişMatik v1 (iki sistem: WhatsApp/markalı site · Pazaryeri)"],"responses":{"200":{"description":"v1 zarfı: `success` JSON boolean, `message`; veri anahtarları alan tablosunda","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Zarf"}}}},"401":{"description":"Kimlik başlığı eksik/yanlış: `{success:false, message}`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Zarf"}}}},"422":{"description":"Doğrulama hatası: `{success:false, message:\"Doğrulama hatası: …\"}`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Zarf"}}}}},"x-durum":"hazir","x-faz":6,"summary":"Ürün senkronu (exe/Pro → Lezzet35)","description":"10 sn’de bir, yalnız `guncelle='Y'` ürünler. Exe bayrağı yanıt gelmeden temizler (Entegrasyon.cs:8233) → ağ hatasında güncelleme kaybolur; telafi: admin \"tam senkron iste\" komutu ve Faz 6 v2 webhook. Yeni ürün PASIF eklenir; `sp_urun_id` eşleşende ad/fiyat/varyant güncellenir ve restoran panelinde \"SiparişMatik’ten geldi\" etiketiyle görünür. `urunweb='N'` → PASIF; çarpan tipi varyantta `fiyat = urun_fiyat × carpan`.","operationId":"v1UrunSenkron","security":[{"bearerFirma":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["products"],"properties":{"products":{"type":"array","items":{"type":"object","required":["ad","fiyat"],"properties":{"sp_urun_id":{"type":"string"},"sp_kategori_id":{"type":"string"},"kategori_ad":{"type":"string"},"ad":{"type":"string"},"fiyat":{"type":"number"},"aciklama":{"type":"string"},"sira":{"type":"integer"},"durum":{"type":"string","enum":["AKTIF","PASIF"]},"kdv":{"type":"integer","enum":[0,1,10,20]},"ekstralar":{"type":"array","items":{"type":"object","properties":{"ad":{"type":"string"},"fiyat":{"type":"number"}}}},"foto_url":{"type":"string"},"salon_fiyat":{"type":"number","nullable":true},"alerjenler":{"type":"array","items":{"type":"string"}},"etiketler":{"type":"array","items":{"type":"string"}},"silindi":{"type":"boolean"},"guncellendi_at":{"type":"string","format":"date-time"},"varyantlar":{"type":"array","items":{"type":"object","required":["ad","fiyat"],"properties":{"ad":{"type":"string"},"fiyat":{"type":"number"}}}}}}}}},"example":{"products":[{"sp_urun_id":"1001","sp_kategori_id":"12","kategori_ad":"Kumrular","ad":"Klasik Kumru","fiyat":120,"aciklama":"","sira":1,"durum":"AKTIF","varyantlar":[{"ad":"Büyük","fiyat":145}]}]}}}},"x-alanlar":[{"ad":"products[].sp_urun_id","tip":"string","zorunlu":true,"aciklama":"Kasa ürün kimliği (eşleme anahtarı)"},{"ad":"products[].sp_kategori_id","tip":"string","zorunlu":true,"aciklama":""},{"ad":"products[].kategori_ad","tip":"string","zorunlu":true,"aciklama":""},{"ad":"products[].ad","tip":"string","zorunlu":true,"aciklama":""},{"ad":"products[].fiyat","tip":"number","zorunlu":true,"aciklama":"TL, ondalık"},{"ad":"products[].aciklama","tip":"string","zorunlu":true,"aciklama":""},{"ad":"products[].sira","tip":"integer","zorunlu":true,"aciklama":""},{"ad":"products[].durum","tip":"AKTIF | PASIF","zorunlu":true,"aciklama":"`urunweb='N'` → PASIF"},{"ad":"products[].varyantlar[].ad","tip":"string","zorunlu":true,"aciklama":""},{"ad":"products[].varyantlar[].fiyat","tip":"number","zorunlu":true,"aciklama":"Çarpanlı varyantta hesaplanmış fiyat"},{"ad":"products[].kdv","tip":"0 | 1 | 10 | 20","zorunlu":false,"aciklama":"Pro ek alanı (sözleşme §1.2)"},{"ad":"products[].ekstralar[]","tip":"{ad, fiyat}[]","zorunlu":false,"aciklama":"Pro ek alanı; tek grup \"Ekstralar\", ek ücret"},{"ad":"products[].foto_url","tip":"string","zorunlu":false,"aciklama":"Yalnız Lezzet35 yükleme adresi (`…/foto` ucu)"},{"ad":"products[].salon_fiyat","tip":"number","zorunlu":false,"aciklama":"Masa (xQR) fiyatı TL (K-44 §4); verilmezse değişmez, null → paket fiyatı"},{"ad":"products[].alerjenler","tip":"string[]","zorunlu":false,"aciklama":"14 yönetmelik kodu (bilinmeyen kod → 422): gluten, kabuklu_deniz, yumurta, balik, fistik, soya, sut, kabuklu_yemis, kereviz, hardal, susam, sulfit, aci_bakla, yumusakca"},{"ad":"products[].etiketler","tip":"string[]","zorunlu":false,"aciklama":"vejetaryen, vegan, glutensiz, laktozsuz, helal, aci (bilinmeyen → 422)"},{"ad":"products[].silindi","tip":"boolean","zorunlu":false,"aciklama":"true → PASIF (silinmez)"},{"ad":"products[].guncellendi_at","tip":"date-time","zorunlu":false,"aciklama":"Çakışma kuralı: Lezzet35 updatedAt'ten eskiyse satır uygulanmaz"},{"ad":"success","tip":"boolean","zorunlu":true,"aciklama":""},{"ad":"message","tip":"string","zorunlu":true,"aciklama":"Exe ürün senkronunda okur"},{"ad":"summary.created","tip":"integer","zorunlu":false,"aciklama":""},{"ad":"summary.updated","tip":"integer","zorunlu":false,"aciklama":""},{"ad":"summary.skipped","tip":"integer","zorunlu":false,"aciklama":"İdempotent tekrar → skipped artar"},{"ad":"summary.total","tip":"integer","zorunlu":false,"aciklama":""},{"ad":"errors[]","tip":"string[]","zorunlu":false,"aciklama":"Satır bazlı hata mesajları"},{"ad":"conflicts[]","tip":"string[]","zorunlu":false,"aciklama":"Çakışma nedeniyle atlanan sp_urun_id'ler (Pro)"}],"x-hiz-siniri":"Token başına 120 / dk (tüm firma uçları ortak)","x-kaynak":"§4.2 · PoolController.php:415-584 · Entegrasyon.cs:8163-8243"}},"/api/v1/pool/products/{sp_urun_id}/foto":{"post":{"tags":["SiparişMatik v1 (iki sistem: WhatsApp/markalı site · Pazaryeri)"],"responses":{"200":{"description":"v1 zarfı: `success` JSON boolean, `message`; veri anahtarları alan tablosunda","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Zarf"}}}},"401":{"description":"Kimlik başlığı eksik/yanlış: `{success:false, message}`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Zarf"}}}},"404":{"description":"Ürün yok (önce products/sync)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Zarf"}}}},"422":{"description":"Doğrulama hatası: `{success:false, message:\"Doğrulama hatası: …\"}`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Zarf"}}}}},"x-durum":"hazir","x-faz":6,"summary":"Ürün görseli (Pro → Lezzet35)","description":"SiparişMatik Pro menü senkronu (docs/pro-menu-senkron-sozlesmesi.md §1.3): multipart `dosya` (JPEG/PNG/WebP, ≤ 3 MB) → WebP ≤ 1200 px; ürün `sp_urun_id` ile bulunur (önce products/sync). Yanıt `data.foto_url` mutlak adres.","operationId":"v1UrunFoto","security":[{"bearerFirma":[]}],"parameters":[{"name":"sp_urun_id","in":"path","required":true,"description":"Pro ürün kimliği (metin; sayı da kabul)","schema":{"type":"string"},"example":"41"}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","required":["dosya"],"properties":{"dosya":{"type":"string","format":"binary"}}}}}},"x-alanlar":[{"ad":"dosya","tip":"file","zorunlu":true,"aciklama":"multipart"},{"ad":"success","tip":"boolean","zorunlu":true,"aciklama":""},{"ad":"data.foto_url","tip":"string","zorunlu":true,"aciklama":"Mutlak adres; products/sync `foto_url` olarak geri gönderilebilir"}],"x-hiz-siniri":"Firma başına 30 / dk","x-kaynak":"Pro sözleşmesi §1.3"}},"/api/v1/pool/sms/log":{"post":{"tags":["SiparişMatik v1 (iki sistem: WhatsApp/markalı site · Pazaryeri)"],"responses":{"200":{"description":"v1 zarfı: `success` JSON boolean, `message`; veri anahtarları alan tablosunda","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Zarf"}}}},"401":{"description":"Kimlik başlığı eksik/yanlış: `{success:false, message}`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Zarf"}}}},"404":{"description":"Firma/kayıt yok ya da başka firmaya ait (varlık sızdırmaz)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Zarf"}}}},"422":{"description":"Doğrulama hatası: `{success:false, message:\"Doğrulama hatası: …\"}`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Zarf"}}}}},"x-durum":"hazir","x-faz":6,"summary":"SMS kazanım logu (api.siparismatik.net → Lezzet35)","description":"Exe değil, SiparişMatik merkez sunucusu çağırır (`function.php:522-560 Lezzet35_SMSLog`): içinde Lezzet35 adresi geçen SMS’lerin adedini raporlar. İdempotency: `siparismatik_id + tarih + tip + adet + aciklama` özeti; aynı kayıt iki kez sayılmaz (M08/M13 raporu).","operationId":"v1SmsLog","security":[{"poolSecret":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["siparismatik_id","sms_logs"],"properties":{"siparismatik_id":{"type":"integer"},"sms_logs":{"type":"array","items":{"type":"object","required":["tarih","tip","adet"],"properties":{"tarih":{"type":"string","format":"date"},"tip":{"type":"string","enum":["tek","toplu"]},"adet":{"type":"integer","minimum":1},"aciklama":{"type":"string"}}}}}},"example":{"siparismatik_id":9001,"sms_logs":[{"tarih":"2026-09-16","tip":"toplu","adet":120,"aciklama":"Kampanya"}]}}}},"x-alanlar":[{"ad":"siparismatik_id","tip":"integer","zorunlu":true,"aciklama":""},{"ad":"sms_logs[].tarih","tip":"date","zorunlu":true,"aciklama":""},{"ad":"sms_logs[].tip","tip":"tek | toplu","zorunlu":true,"aciklama":""},{"ad":"sms_logs[].adet","tip":"integer ≥ 1","zorunlu":true,"aciklama":""},{"ad":"sms_logs[].aciklama","tip":"string","zorunlu":false,"aciklama":""},{"ad":"data.firma_id","tip":"integer","zorunlu":false,"aciklama":""},{"ad":"data.firma_ad","tip":"string","zorunlu":false,"aciklama":""},{"ad":"data.kaydedilen","tip":"integer","zorunlu":false,"aciklama":"Bu çağrıda kaydedilen satır sayısı"}],"x-kaynak":"§4.1 · PoolController.php:766-825"}},"/api/v1/":{"get":{"tags":["SiparişMatik v1 (iki sistem: WhatsApp/markalı site · Pazaryeri)"],"responses":{"200":{"description":"v1 zarfı: `success` JSON boolean, `message`; veri anahtarları alan tablosunda","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Zarf"}}}},"401":{"description":"Kimlik başlığı eksik/yanlış: `{success:false, message}`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Zarf"}}}}},"x-durum":"hazir","x-faz":6,"summary":"Keşif ucu","description":"Firma özeti ve uç listesi (`restaurant`, `endpoints`). Exe çağırmaz; zararsız keşif.","operationId":"v1Kesif","security":[{"bearerFirma":[]}],"x-alanlar":[{"ad":"restaurant.id","tip":"integer","zorunlu":false,"aciklama":""},{"ad":"restaurant.name","tip":"string","zorunlu":false,"aciklama":""},{"ad":"restaurant.subdomain","tip":"string","zorunlu":false,"aciklama":""},{"ad":"restaurant.online_aktif","tip":"boolean","zorunlu":false,"aciklama":""},{"ad":"restaurant.status","tip":"string","zorunlu":false,"aciklama":""},{"ad":"restaurant.markalar[]","tip":"object[]","zorunlu":false,"aciklama":""},{"ad":"endpoints","tip":"object","zorunlu":false,"aciklama":"Uç adı → yol"}],"x-kaynak":"§4.3 · ApiController.php:17-57"}},"/api/v1/status":{"get":{"tags":["SiparişMatik v1 (iki sistem: WhatsApp/markalı site · Pazaryeri)"],"responses":{"200":{"description":"v1 zarfı: `success` JSON boolean, `message`; veri anahtarları alan tablosunda","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Zarf"}}}},"401":{"description":"Kimlik başlığı eksik/yanlış: `{success:false, message}`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Zarf"}}}}},"x-durum":"hazir","x-faz":6,"summary":"Firma durumu","description":"Firma ve markaların açık/kapalı durumu.","operationId":"v1DurumOku","security":[{"bearerFirma":[]}],"x-alanlar":[{"ad":"data.id","tip":"integer","zorunlu":false,"aciklama":""},{"ad":"data.name","tip":"string","zorunlu":false,"aciklama":""},{"ad":"data.online_aktif","tip":"boolean","zorunlu":false,"aciklama":""},{"ad":"data.status","tip":"string","zorunlu":false,"aciklama":""},{"ad":"data.url","tip":"string","zorunlu":false,"aciklama":""},{"ad":"data.markalar[].id","tip":"integer","zorunlu":false,"aciklama":""},{"ad":"data.markalar[].marka_adi","tip":"string","zorunlu":false,"aciklama":""},{"ad":"data.markalar[].aktif","tip":"boolean","zorunlu":false,"aciklama":""},{"ad":"data.markalar[].status","tip":"string","zorunlu":false,"aciklama":""}],"x-kaynak":"§4.3 · ApiController.php:62-99"},"post":{"tags":["SiparişMatik v1 (iki sistem: WhatsApp/markalı site · Pazaryeri)"],"responses":{"200":{"description":"v1 zarfı: `success` JSON boolean, `message`; veri anahtarları alan tablosunda","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Zarf"}}}},"401":{"description":"Kimlik başlığı eksik/yanlış: `{success:false, message}`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Zarf"}}}}},"x-durum":"hazir","x-faz":6,"summary":"Firmayı aç/kapat","description":"Exe’de yorumda (8051). Lezzet35’te **firmanın tüm şubelerini** açar/kapatır (WPSipariş yalnız `online_aktif` bayrağını değiştiriyordu, vitrinde etkisizdi).","operationId":"v1DurumYaz","security":[{"bearerFirma":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["status"],"properties":{"status":{"type":"string","enum":["online","offline"]}}},"example":{"status":"online"}}}},"x-alanlar":[{"ad":"status","tip":"online | offline","zorunlu":true,"aciklama":"İstek"}],"x-kaynak":"§4.3 · ApiController.php:104-131"}},"/api/v1/branches":{"get":{"tags":["SiparişMatik v1 (iki sistem: WhatsApp/markalı site · Pazaryeri)"],"responses":{"200":{"description":"v1 zarfı: `success` JSON boolean, `message`; veri anahtarları alan tablosunda","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Zarf"}}}},"401":{"description":"Kimlik başlığı eksik/yanlış: `{success:false, message}`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Zarf"}}}}},"x-durum":"hazir","x-faz":6,"summary":"Şubeler (alt markalar)","description":"Ana şube hariç şubeler; exe her satır için ayrı entegrasyon kaydı açar (`entegrasyonresid = data[].id`). Ana şube `connect.firma.domain_id` ile ayrıca kaydedilir — Lezzet35 aynı ayrımı korur.","operationId":"v1Subeler","security":[{"bearerFirma":[]}],"x-alanlar":[{"ad":"success","tip":"boolean","zorunlu":true,"aciklama":""},{"ad":"data[].id","tip":"integer","zorunlu":true,"aciklama":"Şube kimliği"},{"ad":"data[].marka_adi","tip":"string","zorunlu":true,"aciklama":""},{"ad":"data[].subdomain","tip":"string","zorunlu":true,"aciklama":""},{"ad":"data[].url","tip":"string","zorunlu":true,"aciklama":"Vitrin adresi"},{"ad":"data[].aktif","tip":"boolean","zorunlu":true,"aciklama":""},{"ad":"data[].status","tip":"string","zorunlu":false,"aciklama":""}],"x-kaynak":"§4.3 · ApiController.php:136-160 · Entegrasyon.cs:7990-8009"}},"/api/v1/branches/{id}/status":{"post":{"tags":["SiparişMatik v1 (iki sistem: WhatsApp/markalı site · Pazaryeri)"],"responses":{"200":{"description":"v1 zarfı: `success` JSON boolean, `message`; veri anahtarları alan tablosunda","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Zarf"}}}},"401":{"description":"Kimlik başlığı eksik/yanlış: `{success:false, message}`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Zarf"}}}},"403":{"description":"Başka firmanın şubesi","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Zarf"}}}},"404":{"description":"Şube yok","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Zarf"}}}}},"x-durum":"hazir","x-faz":6,"summary":"Şubeyi aç/kapat","description":"10 sn’de bir, yalnız yerel durum değişince. Kiracı sınırı: token firması ≠ şube firması → 403. Yanıttaki `data.online_aktif` gönderilenle eşitse exe yerel durumu günceller.","operationId":"v1SubeDurum","security":[{"bearerFirma":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Şube kimliği (`branches` → `data[].id`; ana şube kimliği de kabul)","schema":{"type":"integer"},"example":1042}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["status"],"properties":{"status":{"type":"string","enum":["online","offline"]}}},"example":{"status":"offline"}}}},"x-alanlar":[{"ad":"status","tip":"online | offline","zorunlu":true,"aciklama":"İstek"},{"ad":"success","tip":"boolean","zorunlu":true,"aciklama":""},{"ad":"data.domain_id","tip":"integer","zorunlu":false,"aciklama":""},{"ad":"data.marka_adi","tip":"string","zorunlu":false,"aciklama":""},{"ad":"data.online_aktif","tip":"boolean","zorunlu":true,"aciklama":"Exe \"True\" karşılaştırması"},{"ad":"data.ana_marka","tip":"boolean","zorunlu":false,"aciklama":""}],"x-kaynak":"§4.3 · ApiController.php:165-249 · Entegrasyon.cs:8046-8072"}},"/api/v1/menu":{"get":{"tags":["SiparişMatik v1 (iki sistem: WhatsApp/markalı site · Pazaryeri)"],"responses":{"200":{"description":"v1 zarfı: `success` JSON boolean, `message`; veri anahtarları alan tablosunda","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Zarf"}}}},"401":{"description":"Kimlik başlığı eksik/yanlış: `{success:false, message}`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Zarf"}}}}},"x-durum":"hazir","x-faz":6,"summary":"Menü aynası (Lezzet35 → exe)","description":"Açılışta bir kez. Kategori ve ürünler kasaya aynalanır; exe `urun.kategori.id == kategori.id` ile eşler, `siparismatik_id` alanlarıyla yerel tablolara bağlar. **`marka` nesnesi asla null dönmez** (exe null kontrolsüz okur: Entegrasyon.cs:8508, 8521).","operationId":"v1Menu","security":[{"bearerFirma":[]}],"parameters":[{"name":"since","in":"query","description":"ISO-8601 UTC; verilirse yalnız `updatedAt >= since` kayıtlar (silinmişler `silindi:true`). Pro artımlı çekme; bir sonraki değer `summary.sunucu_zamani`","schema":{"type":"string","format":"date-time"}}],"x-alanlar":[{"ad":"success","tip":"boolean","zorunlu":true,"aciklama":""},{"ad":"data.firma.id","tip":"integer","zorunlu":true,"aciklama":""},{"ad":"data.firma.ad","tip":"string","zorunlu":true,"aciklama":""},{"ad":"data.firma.siparismatik_id","tip":"integer","zorunlu":true,"aciklama":""},{"ad":"data.markalar[]","tip":"object[]","zorunlu":true,"aciklama":"`{id, ad, subdomain, ana_marka, aktif}`"},{"ad":"data.kategoriler[].id","tip":"integer","zorunlu":true,"aciklama":""},{"ad":"data.kategoriler[].siparismatik_id","tip":"string","zorunlu":true,"aciklama":"Kasa kategori kimliği (eşleme)"},{"ad":"data.kategoriler[].ad","tip":"string","zorunlu":true,"aciklama":""},{"ad":"data.kategoriler[].sira","tip":"integer","zorunlu":true,"aciklama":""},{"ad":"data.kategoriler[].durum","tip":"string","zorunlu":false,"aciklama":""},{"ad":"data.kategoriler[].marka.id","tip":"integer","zorunlu":true,"aciklama":"Asla null"},{"ad":"data.kategoriler[].marka.ad","tip":"string","zorunlu":false,"aciklama":""},{"ad":"data.urunler[].id","tip":"integer","zorunlu":true,"aciklama":""},{"ad":"data.urunler[].siparismatik_id","tip":"string","zorunlu":true,"aciklama":""},{"ad":"data.urunler[].ad","tip":"string","zorunlu":true,"aciklama":""},{"ad":"data.urunler[].kategori.id","tip":"integer","zorunlu":true,"aciklama":"Kategori eşleme anahtarı"},{"ad":"data.urunler[].fiyat","tip":"number","zorunlu":true,"aciklama":""},{"ad":"data.urunler[].indirimli_fiyat","tip":"number | null","zorunlu":false,"aciklama":""},{"ad":"data.urunler[].aciklama","tip":"string","zorunlu":true,"aciklama":""},{"ad":"data.urunler[].foto","tip":"string | null","zorunlu":false,"aciklama":""},{"ad":"data.urunler[].sira","tip":"integer","zorunlu":false,"aciklama":""},{"ad":"data.urunler[].durum","tip":"string","zorunlu":false,"aciklama":""},{"ad":"data.urunler[].varyantlar[]","tip":"object[]","zorunlu":false,"aciklama":"`{ad, fiyat}` mutlak fiyat"},{"ad":"data.urunler[].ekstralar[]","tip":"object[]","zorunlu":false,"aciklama":"`{ad, fiyat}` ek ücret (Pro)"},{"ad":"data.urunler[].kdv","tip":"integer","zorunlu":false,"aciklama":"Pro"},{"ad":"data.urunler[].guncellendi_at","tip":"date-time","zorunlu":false,"aciklama":"UTC ISO (Pro çakışma kuralı)"},{"ad":"data.urunler[].salon_fiyat","tip":"number | null","zorunlu":false,"aciklama":"Masa (xQR) fiyatı TL; null → paket fiyatı (K-44 §4)"},{"ad":"data.urunler[].alerjenler","tip":"string[]","zorunlu":false,"aciklama":"14 yönetmelik kodu: gluten, kabuklu_deniz, yumurta, balik, fistik, soya, sut, kabuklu_yemis, kereviz, hardal, susam, sulfit, aci_bakla, yumusakca"},{"ad":"data.urunler[].etiketler","tip":"string[]","zorunlu":false,"aciklama":"vejetaryen, vegan, glutensiz, laktozsuz, helal, aci"},{"ad":"data.urunler[].silindi","tip":"boolean","zorunlu":false,"aciklama":"Yalnız `since` ile gelebilir"},{"ad":"data.urunler[].marka.id","tip":"integer","zorunlu":true,"aciklama":"Asla null"},{"ad":"summary","tip":"object","zorunlu":false,"aciklama":"Sayımlar + `sunucu_zamani` (bir sonraki `since`) + `since`"}],"x-kaynak":"§4.3 · MenuController.php:20-128 · Entegrasyon.cs:8490-8531"}},"/api/v1/iptal-nedenleri":{"get":{"tags":["SiparişMatik v1 (iki sistem: WhatsApp/markalı site · Pazaryeri)"],"responses":{"200":{"description":"Liste","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"data":{"type":"array","items":{"type":"object","properties":{"kod":{"type":"string"},"metin":{"type":"string"},"aciklama_zorunlu":{"type":"boolean"}}}}}},"example":{"success":true,"message":"İptal nedenleri","data":[{"kod":"URUN_YOK","metin":"Ürün / malzeme kalmadı","aciklama_zorunlu":false},{"kod":"DIGER","metin":"Diğer","aciklama_zorunlu":true}]}}}},"401":{"description":"Kimlik başlığı eksik/yanlış: `{success:false, message}`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Zarf"}}}}},"x-durum":"hazir","x-faz":6,"operationId":"v1IptalNedenleri","summary":"İptal/ret nedenleri (v2.0)","description":"Admin'in yönettiği hazır neden listesi; exe/köprü kodları gömmez, açılışta ve günde bir çeker. `PUT …/durum` gövdesinde `iptal_nedeni` olarak gönderilir. Her iki akışta aynı liste.","security":[{"bearerFirma":[]}],"x-alanlar":[{"ad":"kod","tip":"string","zorunlu":true,"aciklama":"Sabit kod"},{"ad":"metin","tip":"string","zorunlu":true,"aciklama":"Müşteriye gösterilen metin (admin düzenler)"},{"ad":"aciklama_zorunlu","tip":"boolean","zorunlu":true,"aciklama":"true ise `durum_aciklama` zorunlu"}],"x-kaynak":"sözleşme v2.0 §3"}},"/api/v1/firma/siparisler":{"get":{"tags":["SiparişMatik v1 (iki sistem: WhatsApp/markalı site · Pazaryeri)"],"responses":{"200":{"description":"v1 zarfı: `success` JSON boolean, `message`; veri anahtarları alan tablosunda","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Zarf"}}}},"401":{"description":"Kimlik başlığı eksik/yanlış: `{success:false, message}`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Zarf"}}}}},"x-durum":"hazir","x-faz":6,"summary":"Aktif siparişler (exe 10 sn’de bir çeker)","description":"Exe parametresiz çağırır ve yalnız ilk sayfayı işler. WPSipariş 20’lik sayfalıyordu → 21. sipariş kayboluyordu. Lezzet35: parametresiz çağrıda **günün tüm aktif siparişleri tek yanıtta** (`meta.last_page = 1`); `durum not in (TESLIM_EDILDI, IPTAL, REDDEDILDI)`. Exe `siparis_no` ile tekilleştirir (`websiparisid`), `marka.id` ile hangi entegrasyon kaydına düşeceğini bulur.","operationId":"v1Siparisler","security":[{"bearerFirma":[]}],"parameters":[{"name":"durum","in":"query","description":"v1 durum filtresi; exe göndermez","schema":{"type":"string","enum":["BEKLEMEDE","ONAYLANDI","HAZIRLANIYOR","YOLDA","TESLIM_EDILDI","IPTAL","REDDEDILDI"]}},{"name":"tarih_baslangic","in":"query","description":"YYYY-MM-DD","schema":{"type":"string","format":"date"}},{"name":"tarih_bitis","in":"query","description":"YYYY-MM-DD","schema":{"type":"string","format":"date"}},{"name":"per_page","in":"query","description":"Yalnız parametreli çağrıda; varsayılan 20","schema":{"type":"integer","minimum":1,"maximum":200}},{"name":"page","in":"query","schema":{"type":"integer","minimum":1}}],"x-alanlar":[{"ad":"success","tip":"boolean","zorunlu":true,"aciklama":""},{"ad":"data[].id","tip":"integer","zorunlu":true,"aciklama":"Sipariş v1Id; exe `messageid` — durum güncellemesinde `{id}`"},{"ad":"data[].siparis_no","tip":"string","zorunlu":true,"aciklama":"L35-YYYYMMDD-XXXXXX; exe `websiparisid` (tekilleştirme anahtarı)"},{"ad":"data[].musteri_id","tip":"integer","zorunlu":true,"aciklama":""},{"ad":"data[].musteri_adi","tip":"string","zorunlu":true,"aciklama":""},{"ad":"data[].musteri_telefon","tip":"string","zorunlu":true,"aciklama":"Ulusal biçim"},{"ad":"data[].musteri_adres","tip":"string","zorunlu":true,"aciklama":"Tam metin: sokak/bina/kat/daire, mahalle, ilçe (+tarif); eski exe için"},{"ad":"data[].musteri_adres_kisa","tip":"string","zorunlu":true,"aciklama":"Yalnız sokak/bina/kat/daire (+tarif); mahalle/ilçe ayrı alanlarda (26.10)"},{"ad":"data[].musteri_enlem","tip":"number | null","zorunlu":true,"aciklama":"Teslimat pini WGS84 (26.10); yoksa null → metin yedeği"},{"ad":"data[].musteri_boylam","tip":"number | null","zorunlu":true,"aciklama":""},{"ad":"data[].musteri_il","tip":"string","zorunlu":true,"aciklama":"İzmir"},{"ad":"data[].musteri_ilce","tip":"string","zorunlu":true,"aciklama":""},{"ad":"data[].musteri_semt","tip":"string","zorunlu":true,"aciklama":"Boş dize olabilir"},{"ad":"data[].musteri_mahalle","tip":"string","zorunlu":true,"aciklama":""},{"ad":"data[].siparis_tipi","tip":"string","zorunlu":true,"aciklama":"Sabit \"WP\" (exe → \"Y\")"},{"ad":"data[].teslimat_tipi","tip":"string","zorunlu":true,"aciklama":"PAKET | GEL_AL | MASA (xQR masa siparişi, K-44 Faz 2: YOLDA yok, hazır olunca servis; ödeme masada)"},{"ad":"data[].masa_no","tip":"string | null","zorunlu":true,"aciklama":"MASA siparişinde masa numarası/adı (QR'daki özgün yazım); diğerlerinde null"},{"ad":"data[].odeme_turu","tip":"string","zorunlu":true,"aciklama":"NAKIT | KAPIDA_KART | ONLINE_KART | YEMEK_KARTI — kasa tahsilat kararı bununla"},{"ad":"data[].odendi","tip":"boolean","zorunlu":true,"aciklama":"Yalnız ONLINE_KART’ta true (iyzico’da tahsil edildi)"},{"ad":"data[].odeme_yontemi","tip":"string","zorunlu":true,"aciklama":"Görünen ad / yemek kartı markası (Multinet, Sodexo, Edenred, Setcard, Metropol, Tokenflex, Paycell, iWallet); katalog 26.10"},{"ad":"data[].para_ustu","tip":"number | null","zorunlu":true,"aciklama":"Nakitte müşterinin vereceği tutar (TL); yoksa null (26.10)"},{"ad":"data[].ara_toplam","tip":"number","zorunlu":true,"aciklama":"TL (Σ urunler[].toplam_fiyat, ödenen fiyatlarla)"},{"ad":"data[].indirim_orani","tip":"number","zorunlu":false,"aciklama":"Marka/site yüzde indirimi"},{"ad":"data[].indirim_tutari","tip":"number","zorunlu":true,"aciklama":"Marka/site indirimi tutarı"},{"ad":"data[].urun_indirimi","tip":"number","zorunlu":true,"aciklama":"Σ adet × urunler[].indirim (ürün indirimleri); indirim_tutari’na eklenmez (26.10)"},{"ad":"data[].teslimat_ucreti","tip":"number","zorunlu":true,"aciklama":""},{"ad":"data[].toplam_tutar","tip":"number","zorunlu":true,"aciklama":"ara_toplam − indirim_tutari + teslimat_ucreti"},{"ad":"data[].durum","tip":"string","zorunlu":true,"aciklama":"v1 görünümü: BEKLEMEDE | ONAYLANDI | YOLDA | TESLIM_EDILDI | IPTAL (HAZIRLANIYOR → ONAYLANDI, REDDEDILDI → IPTAL)"},{"ad":"data[].durum_text","tip":"string","zorunlu":true,"aciklama":"Türkçe etiket"},{"ad":"data[].siparis_zamani","tip":"string","zorunlu":true,"aciklama":"**dd.MM.yyyy HH:mm** — başka biçim exe’de istisna (DateTime.ParseExact)"},{"ad":"data[].teslim_tahmini","tip":"string | null","zorunlu":true,"aciklama":"HH:mm"},{"ad":"data[].siparis_notu","tip":"string","zorunlu":false,"aciklama":""},{"ad":"data[].marka.id","tip":"integer","zorunlu":true,"aciklama":"Şube/marka kimliği (v1Id); exe `entegrasyonresid` ile eşler"},{"ad":"data[].marka.marka_adi","tip":"string","zorunlu":true,"aciklama":""},{"ad":"data[].marka.subdomain","tip":"string","zorunlu":false,"aciklama":""},{"ad":"data[].marka.ana_marka","tip":"boolean","zorunlu":false,"aciklama":""},{"ad":"data[].urunler[].product_id","tip":"integer","zorunlu":true,"aciklama":"Lezzet35 ürün v1Id"},{"ad":"data[].urunler[].siparismatik_id","tip":"string","zorunlu":false,"aciklama":"Kasa ürün kimliği (eşleme)"},{"ad":"data[].urunler[].kategori_siparismatik_id","tip":"string","zorunlu":false,"aciklama":""},{"ad":"data[].urunler[].urun_adi","tip":"string","zorunlu":true,"aciklama":"Sipariş anındaki ad"},{"ad":"data[].urunler[].adet","tip":"integer","zorunlu":true,"aciklama":""},{"ad":"data[].urunler[].birim_fiyat","tip":"number","zorunlu":true,"aciklama":"ÖDENEN birim fiyat (seçimler dahil)"},{"ad":"data[].urunler[].liste_fiyat","tip":"number | null","zorunlu":true,"aciklama":"İndirimsiz birim fiyat; indirim yoksa null (26.10)"},{"ad":"data[].urunler[].indirim","tip":"number","zorunlu":true,"aciklama":"Birim başına ürün indirimi; yoksa 0 (26.10)"},{"ad":"data[].urunler[].toplam_fiyat","tip":"number","zorunlu":true,"aciklama":""},{"ad":"data[].urunler[].varyantlar[].id","tip":"integer","zorunlu":true,"aciklama":""},{"ad":"data[].urunler[].varyantlar[].ad","tip":"string","zorunlu":true,"aciklama":""},{"ad":"data[].urunler[].varyantlar[].fiyat","tip":"number","zorunlu":true,"aciklama":""},{"ad":"data[].urunler[].ekstralar[].id","tip":"integer","zorunlu":true,"aciklama":""},{"ad":"data[].urunler[].ekstralar[].ad","tip":"string","zorunlu":true,"aciklama":""},{"ad":"data[].urunler[].ekstralar[].fiyat","tip":"number","zorunlu":true,"aciklama":""},{"ad":"data[].urunler[].ozel_not","tip":"string","zorunlu":true,"aciklama":"Kalem notu; boş dize olabilir"},{"ad":"data[].urunler[].menu","tip":"object | null","zorunlu":true,"aciklama":"Menü seçimi: `{id, ad, fiyat, secilenler[]}`"},{"ad":"data[].urunler[].menu.secilenler[].urun","tip":"string","zorunlu":true,"aciklama":""},{"ad":"data[].urunler[].menu.secilenler[].fiyat","tip":"number","zorunlu":true,"aciklama":""},{"ad":"meta.current_page","tip":"integer","zorunlu":false,"aciklama":"Parametresiz çağrıda her zaman 1"},{"ad":"meta.last_page","tip":"integer","zorunlu":false,"aciklama":"Parametresiz çağrıda 1 (günün tüm aktif siparişleri tek sayfa)"},{"ad":"meta.per_page","tip":"integer","zorunlu":false,"aciklama":""},{"ad":"meta.total","tip":"integer","zorunlu":false,"aciklama":""}],"x-hiz-siniri":"Token başına 120 / dk (exe 10 sn’de ≤ 4 çağrı yapar)","x-kaynak":"§4.3 · SiparisController.php:597-768 · Entegrasyon.cs:8281-8417"}},"/api/v1/firma/siparisler/{id}":{"get":{"tags":["SiparişMatik v1 (iki sistem: WhatsApp/markalı site · Pazaryeri)"],"responses":{"200":{"description":"v1 zarfı: `success` JSON boolean, `message`; veri anahtarları alan tablosunda","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Zarf"}}}},"401":{"description":"Kimlik başlığı eksik/yanlış: `{success:false, message}`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Zarf"}}}},"404":{"description":"Sipariş bulunamadı","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Zarf"}}}}},"x-durum":"hazir","x-faz":6,"summary":"Tek sipariş (24.10, Pro: fiş yeniden basımı)","description":"Liste satırıyla aynı şekil (`data:{…}`); teslim edilen / iptal edilen sipariş de okunur. Başka firmanın siparişi ya da yok → 404; sayı olmayan id → 422.","operationId":"v1SiparisGetir","security":[{"bearerFirma":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Sipariş v1Id (`data[].id`)","schema":{"type":"integer"},"example":1042}],"x-alanlar":[{"ad":"data.id","tip":"integer","zorunlu":true,"aciklama":"Sipariş v1Id; exe `messageid` — durum güncellemesinde `{id}`"},{"ad":"data.siparis_no","tip":"string","zorunlu":true,"aciklama":"L35-YYYYMMDD-XXXXXX; exe `websiparisid` (tekilleştirme anahtarı)"},{"ad":"data.musteri_id","tip":"integer","zorunlu":true,"aciklama":""},{"ad":"data.musteri_adi","tip":"string","zorunlu":true,"aciklama":""},{"ad":"data.musteri_telefon","tip":"string","zorunlu":true,"aciklama":"Ulusal biçim"},{"ad":"data.musteri_adres","tip":"string","zorunlu":true,"aciklama":"Tam metin: sokak/bina/kat/daire, mahalle, ilçe (+tarif); eski exe için"},{"ad":"data.musteri_adres_kisa","tip":"string","zorunlu":true,"aciklama":"Yalnız sokak/bina/kat/daire (+tarif); mahalle/ilçe ayrı alanlarda (26.10)"},{"ad":"data.musteri_enlem","tip":"number | null","zorunlu":true,"aciklama":"Teslimat pini WGS84 (26.10); yoksa null → metin yedeği"},{"ad":"data.musteri_boylam","tip":"number | null","zorunlu":true,"aciklama":""},{"ad":"data.musteri_il","tip":"string","zorunlu":true,"aciklama":"İzmir"},{"ad":"data.musteri_ilce","tip":"string","zorunlu":true,"aciklama":""},{"ad":"data.musteri_semt","tip":"string","zorunlu":true,"aciklama":"Boş dize olabilir"},{"ad":"data.musteri_mahalle","tip":"string","zorunlu":true,"aciklama":""},{"ad":"data.siparis_tipi","tip":"string","zorunlu":true,"aciklama":"Sabit \"WP\" (exe → \"Y\")"},{"ad":"data.teslimat_tipi","tip":"string","zorunlu":true,"aciklama":"PAKET | GEL_AL | MASA (xQR masa siparişi, K-44 Faz 2: YOLDA yok, hazır olunca servis; ödeme masada)"},{"ad":"data.masa_no","tip":"string | null","zorunlu":true,"aciklama":"MASA siparişinde masa numarası/adı (QR'daki özgün yazım); diğerlerinde null"},{"ad":"data.odeme_turu","tip":"string","zorunlu":true,"aciklama":"NAKIT | KAPIDA_KART | ONLINE_KART | YEMEK_KARTI — kasa tahsilat kararı bununla"},{"ad":"data.odendi","tip":"boolean","zorunlu":true,"aciklama":"Yalnız ONLINE_KART’ta true (iyzico’da tahsil edildi)"},{"ad":"data.odeme_yontemi","tip":"string","zorunlu":true,"aciklama":"Görünen ad / yemek kartı markası (Multinet, Sodexo, Edenred, Setcard, Metropol, Tokenflex, Paycell, iWallet); katalog 26.10"},{"ad":"data.para_ustu","tip":"number | null","zorunlu":true,"aciklama":"Nakitte müşterinin vereceği tutar (TL); yoksa null (26.10)"},{"ad":"data.ara_toplam","tip":"number","zorunlu":true,"aciklama":"TL (Σ urunler[].toplam_fiyat, ödenen fiyatlarla)"},{"ad":"data.indirim_orani","tip":"number","zorunlu":false,"aciklama":"Marka/site yüzde indirimi"},{"ad":"data.indirim_tutari","tip":"number","zorunlu":true,"aciklama":"Marka/site indirimi tutarı"},{"ad":"data.urun_indirimi","tip":"number","zorunlu":true,"aciklama":"Σ adet × urunler[].indirim (ürün indirimleri); indirim_tutari’na eklenmez (26.10)"},{"ad":"data.teslimat_ucreti","tip":"number","zorunlu":true,"aciklama":""},{"ad":"data.toplam_tutar","tip":"number","zorunlu":true,"aciklama":"ara_toplam − indirim_tutari + teslimat_ucreti"},{"ad":"data.durum","tip":"string","zorunlu":true,"aciklama":"v1 görünümü: BEKLEMEDE | ONAYLANDI | YOLDA | TESLIM_EDILDI | IPTAL (HAZIRLANIYOR → ONAYLANDI, REDDEDILDI → IPTAL)"},{"ad":"data.durum_text","tip":"string","zorunlu":true,"aciklama":"Türkçe etiket"},{"ad":"data.siparis_zamani","tip":"string","zorunlu":true,"aciklama":"**dd.MM.yyyy HH:mm** — başka biçim exe’de istisna (DateTime.ParseExact)"},{"ad":"data.teslim_tahmini","tip":"string | null","zorunlu":true,"aciklama":"HH:mm"},{"ad":"data.siparis_notu","tip":"string","zorunlu":false,"aciklama":""},{"ad":"data.marka.id","tip":"integer","zorunlu":true,"aciklama":"Şube/marka kimliği (v1Id); exe `entegrasyonresid` ile eşler"},{"ad":"data.marka.marka_adi","tip":"string","zorunlu":true,"aciklama":""},{"ad":"data.marka.subdomain","tip":"string","zorunlu":false,"aciklama":""},{"ad":"data.marka.ana_marka","tip":"boolean","zorunlu":false,"aciklama":""},{"ad":"data.urunler[].product_id","tip":"integer","zorunlu":true,"aciklama":"Lezzet35 ürün v1Id"},{"ad":"data.urunler[].siparismatik_id","tip":"string","zorunlu":false,"aciklama":"Kasa ürün kimliği (eşleme)"},{"ad":"data.urunler[].kategori_siparismatik_id","tip":"string","zorunlu":false,"aciklama":""},{"ad":"data.urunler[].urun_adi","tip":"string","zorunlu":true,"aciklama":"Sipariş anındaki ad"},{"ad":"data.urunler[].adet","tip":"integer","zorunlu":true,"aciklama":""},{"ad":"data.urunler[].birim_fiyat","tip":"number","zorunlu":true,"aciklama":"ÖDENEN birim fiyat (seçimler dahil)"},{"ad":"data.urunler[].liste_fiyat","tip":"number | null","zorunlu":true,"aciklama":"İndirimsiz birim fiyat; indirim yoksa null (26.10)"},{"ad":"data.urunler[].indirim","tip":"number","zorunlu":true,"aciklama":"Birim başına ürün indirimi; yoksa 0 (26.10)"},{"ad":"data.urunler[].toplam_fiyat","tip":"number","zorunlu":true,"aciklama":""},{"ad":"data.urunler[].varyantlar[].id","tip":"integer","zorunlu":true,"aciklama":""},{"ad":"data.urunler[].varyantlar[].ad","tip":"string","zorunlu":true,"aciklama":""},{"ad":"data.urunler[].varyantlar[].fiyat","tip":"number","zorunlu":true,"aciklama":""},{"ad":"data.urunler[].ekstralar[].id","tip":"integer","zorunlu":true,"aciklama":""},{"ad":"data.urunler[].ekstralar[].ad","tip":"string","zorunlu":true,"aciklama":""},{"ad":"data.urunler[].ekstralar[].fiyat","tip":"number","zorunlu":true,"aciklama":""},{"ad":"data.urunler[].ozel_not","tip":"string","zorunlu":true,"aciklama":"Kalem notu; boş dize olabilir"},{"ad":"data.urunler[].menu","tip":"object | null","zorunlu":true,"aciklama":"Menü seçimi: `{id, ad, fiyat, secilenler[]}`"},{"ad":"data.urunler[].menu.secilenler[].urun","tip":"string","zorunlu":true,"aciklama":""},{"ad":"data.urunler[].menu.secilenler[].fiyat","tip":"number","zorunlu":true,"aciklama":""}],"x-kaynak":"modules/M11-entegrasyon/v1-siparis.ts v1SiparisGetir"}},"/api/v1/firma/siparisler/{id}/durum":{"put":{"tags":["SiparişMatik v1 (iki sistem: WhatsApp/markalı site · Pazaryeri)"],"responses":{"200":{"description":"v1 zarfı: `success` JSON boolean, `message`; veri anahtarları alan tablosunda","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Zarf"}}}},"401":{"description":"Kimlik başlığı eksik/yanlış: `{success:false, message}`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Zarf"}}}},"404":{"description":"Başka firmanın siparişi ya da yok","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Zarf"}}}},"422":{"description":"Geçersiz `durum` değeri","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Zarf"}}}}},"x-durum":"hazir","x-faz":6,"summary":"Sipariş durumu (exe → Lezzet35)","description":"`tbl_siparis.guncelle='Y'` olan WEB siparişleri için. Exe eşlemesi: BEKLIYOR→ONAYLANDI, ONAY→YOLDA, TESLIM→TESLIM_EDILDI, IPTAL/RED→IPTAL. Lezzet35 M06 durum makinesini uygular; **geçersiz geçişte de `success:true` döner** (aksi halde exe sonsuza kadar tekrar eder) ve olayı IntegrationLog’a \"reddedildi\" yazar. Exe `success=\"True\"` görünce bayrağı temizler.","operationId":"v1SiparisDurum","security":[{"bearerFirma":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Sipariş v1Id (`data[].id`, exe `messageid`)","schema":{"type":"integer"},"example":1042}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["durum"],"properties":{"durum":{"type":"string","enum":["BEKLEMEDE","ONAYLANDI","HAZIRLANIYOR","YOLDA","TESLIM_EDILDI","IPTAL","REDDEDILDI"]},"iptal_nedeni":{"type":"string","maxLength":40,"description":"v2.0: iptal/ret nedeni kodu (GET /iptal-nedenleri); bilinmeyen kod 422"},"durum_aciklama":{"type":"string","maxLength":500},"tahmini_sure_dk":{"type":"integer","minimum":1,"maximum":600}}},"example":{"durum":"YOLDA"}}}},"x-alanlar":[{"ad":"durum","tip":"string","zorunlu":true,"aciklama":"İstek; 7 değer kabul, exe 4’ünü gönderir"},{"ad":"iptal_nedeni","tip":"string","zorunlu":false,"aciklama":"İstek (v2.0): iptal/ret nedeni kodu — `GET /iptal-nedenleri` listesinden; DIGER'de durum_aciklama zorunlu"},{"ad":"durum_aciklama","tip":"string","zorunlu":false,"aciklama":"İstek; iptal/ret sebebi (≤ 500)"},{"ad":"tahmini_sure_dk","tip":"integer","zorunlu":false,"aciklama":"İstek (24.10): teslim_tahmini = şimdi + dk; uç durumda yok sayılır"},{"ad":"odendi","tip":"boolean","zorunlu":false,"aciklama":"İstek (27.10): hesap kapanışı; uç durumda da yazılır, `GET` `odendi` bunu döner"},{"ad":"odeme_turu","tip":"string","zorunlu":false,"aciklama":"İstek (27.10): gerçek ödeme türü NAKIT|KAPIDA_KART|ONLINE_KART|YEMEK_KARTI (masa/kasa kapanışı)"},{"ad":"success","tip":"boolean","zorunlu":true,"aciklama":"Geçersiz geçişte de true"},{"ad":"data.siparis_no","tip":"string","zorunlu":false,"aciklama":""},{"ad":"data.durum","tip":"string","zorunlu":false,"aciklama":""},{"ad":"data.durum_text","tip":"string","zorunlu":false,"aciklama":""},{"ad":"data.teslim_tahmini","tip":"string | null","zorunlu":false,"aciklama":"HH:mm (24.10)"},{"ad":"data.degisti","tip":"boolean","zorunlu":false,"aciklama":"Durum gerçekten değişti mi (24.10)"},{"ad":"data.reddedildi","tip":"boolean","zorunlu":false,"aciklama":"Geçersiz geçiş: uygulanmadı, message açıklar (24.10)"}],"x-kaynak":"§4.3 · SiparisController.php:773-828 · Entegrasyon.cs:8462-8476"}},"/api/v1/xqr/kayit":{"post":{"tags":["SiparişMatik v1 (iki sistem: WhatsApp/markalı site · Pazaryeri)"],"responses":{"200":{"description":"v1 zarfı: `success` JSON boolean, `message`; veri anahtarları alan tablosunda","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Zarf"}}}},"201":{"description":"Yeni firma + xQR sitesi kuruldu; `data.api_key` tek sefer","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Zarf"}}}},"401":{"description":"Kimlik başlığı eksik/yanlış: `{success:false, message}`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Zarf"}}}},"403":{"description":"İstemci IP izinli listede değil ya da firmaid SiparişMatik listesinde yok","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Zarf"}}}},"409":{"description":"Firma Lezzet35'te aktif değil / şubesi yok","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Zarf"}}}},"422":{"description":"Doğrulama hatası (il/ilçe eşleşmedi, masa_sayisi, diller)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Zarf"}}}},"429":{"description":"IP başına 5/saat aşıldı","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Zarf"}}}},"503":{"description":"SiparişMatik doğrulaması yapılandırılmamış ya da liste alınamadı","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Zarf"}}}}},"x-durum":"hazir","x-faz":6,"summary":"xQR kaydı (Pro kasası → kod + alt alan)","description":"Kimlik (Owner 26.10 gece: \"kayıtta SiparişMatik ID kullanılsın\"): X-Pool-Secret + istemci IP Pro paneli sunucusu (`XQR_KAYIT_IZINLI_IP`) + `firmaid` SiparişMatik yönetim listesinde var; telefon yalnız bilgi alanı (Firma/Şube telefonu). Firma Lezzet35'te yoksa Firma + ana marka + Merkez şube (pazaryeri dışı, açık) + sahip hesabı + tek seferlik `api_key` kurulur → **201**. Firma zaten varsa yalnız xQR sitesi açılır → **200**, `api_key: null` (mevcut Bearer geçerli). Aynı `firmaid` ile tekrar → aynı `kod` (idempotent). Hız sınırı firmaid başına 5/saat, IP başına 120/saat (kayıtlar Pro panelinden tek IP ile gelir).","operationId":"v1XqrKayit","security":[{"poolSecret":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["firmaid","ad","telefon","adres","il","ilce"],"properties":{"firmaid":{"type":"integer"},"ad":{"type":"string","maxLength":120},"telefon":{"type":"string","description":"İşletme telefonu (cep ya da sabit hat, 10–11 hane); yalnız bilgi — eşleşme aranmaz"},"cep":{"type":"string","description":"Sahip cebi (isteğe bağlı): restoran paneli OTP girişi; yoksa telefon cepse o kullanılır"},"adres":{"type":"string","maxLength":300},"il":{"type":"string","description":"İl adı ya da plaka kodu"},"ilce":{"type":"string"},"konum":{"type":"object","properties":{"enlem":{"type":"number"},"boylam":{"type":"number"}}},"masa_siparis":{"type":"boolean","default":true},"masa_sayisi":{"type":"integer","minimum":1,"maximum":200,"default":20},"diller":{"type":"array","items":{"type":"string","enum":["en","de","ar","ru"]}}}},"example":{"firmaid":2456,"ad":"01 Lokman Usta","telefon":"05438676447","adres":"Saim Çıkrıkçı Cad. No 206","il":"İzmir","ilce":"Karabağlar","konum":{"enlem":38.38,"boylam":27.11},"masa_siparis":true,"masa_sayisi":20,"diller":["en"]}}}},"x-alanlar":[{"ad":"data.kod","tip":"string","zorunlu":true,"aciklama":"4 karakter; `https://{kod}.xqr.com.tr`"},{"ad":"data.url","tip":"string","zorunlu":true,"aciklama":"Sitenin tam adresi (kapı etiketi QR'ı); masa QR'ı `{url}/masa/{no}`"},{"ad":"data.api_key","tip":"string | null","zorunlu":true,"aciklama":"Yalnız yeni firmada (201), tek sefer; Pro Bearer olarak saklar"},{"ad":"data.firma_id","tip":"string","zorunlu":true,"aciklama":"Lezzet35 firma kimliği"},{"ad":"data.lezzet35","tip":"boolean","zorunlu":true,"aciklama":"Firma zaten Lezzet35'te miydi"},{"ad":"data.online_url","tip":"string | null","zorunlu":true,"aciklama":"Müşteriye açık online sipariş adresi (markalı site / pazaryeri sayfası) ya da null"}],"x-kaynak":"docs/api/xqr-sozlesme-taslagi.md §2"}},"/api/v1/xqr":{"get":{"tags":["SiparişMatik v1 (iki sistem: WhatsApp/markalı site · Pazaryeri)"],"responses":{"200":{"description":"v1 zarfı: `success` JSON boolean, `message`; veri anahtarları alan tablosunda","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Zarf"}}}},"401":{"description":"Kimlik başlığı eksik/yanlış: `{success:false, message}`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Zarf"}}}},"404":{"description":"Firma xQR'a kayıtlı değil","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Zarf"}}}}},"x-durum":"hazir","x-faz":6,"summary":"xQR ayarları","operationId":"v1XqrAyarOku","security":[{"bearerFirma":[]}],"x-alanlar":[{"ad":"data.kod","tip":"string","zorunlu":true,"aciklama":""},{"ad":"data.url","tip":"string","zorunlu":true,"aciklama":""},{"ad":"data.masa_siparis","tip":"boolean","zorunlu":true,"aciklama":"Masadan sipariş açık mı (Faz 2)"},{"ad":"data.masa_sayisi","tip":"integer","zorunlu":true,"aciklama":"1–200"},{"ad":"data.diller","tip":"string[]","zorunlu":true,"aciklama":"en|de|ar|ru"},{"ad":"data.brosur","tip":"object | null","zorunlu":true,"aciklama":"`{surum, url, pdf_url}` (Faz 4) ya da null"}],"x-kaynak":"docs/api/xqr-sozlesme-taslagi.md §3"},"put":{"tags":["SiparişMatik v1 (iki sistem: WhatsApp/markalı site · Pazaryeri)"],"responses":{"200":{"description":"v1 zarfı: `success` JSON boolean, `message`; veri anahtarları alan tablosunda","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Zarf"}}}},"401":{"description":"Kimlik başlığı eksik/yanlış: `{success:false, message}`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Zarf"}}}},"404":{"description":"Firma xQR'a kayıtlı değil","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Zarf"}}}},"422":{"description":"Doğrulama hatası","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Zarf"}}}}},"x-durum":"hazir","x-faz":6,"summary":"xQR ayarlarını güncelle (masadan sipariş anahtarı)","operationId":"v1XqrAyarYaz","security":[{"bearerFirma":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"masa_siparis":{"type":"boolean"},"masa_sayisi":{"type":"integer","minimum":1,"maximum":200},"diller":{"type":"array","items":{"type":"string","enum":["en","de","ar","ru"]}}}},"example":{"masa_siparis":false}}}},"x-alanlar":[{"ad":"masa_siparis","tip":"boolean","zorunlu":false,"aciklama":"İstek"},{"ad":"masa_sayisi","tip":"integer","zorunlu":false,"aciklama":"İstek; 1–200"},{"ad":"diller","tip":"string[]","zorunlu":false,"aciklama":"İstek"},{"ad":"data","tip":"object","zorunlu":true,"aciklama":"GET ile aynı gövde"}],"x-kaynak":"docs/api/xqr-sozlesme-taslagi.md §3"}},"/api/v1/xqr/brosur":{"put":{"tags":["SiparişMatik v1 (iki sistem: WhatsApp/markalı site · Pazaryeri)"],"responses":{"200":{"description":"v1 zarfı: `success` JSON boolean, `message`; veri anahtarları alan tablosunda","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Zarf"}}}},"201":{"description":"Broşür kaydedildi","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Zarf"}}}},"401":{"description":"Kimlik başlığı eksik/yanlış: `{success:false, message}`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Zarf"}}}},"404":{"description":"Firma xQR'a kayıtlı değil","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Zarf"}}}},"409":{"description":"surum mevcut sürümden büyük değil","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Zarf"}}}},"422":{"description":"dosya/surum doğrulaması","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Zarf"}}}}},"x-durum":"hazir","x-faz":6,"summary":"Broşür PDF'ini barındır (Pro üretir, Lezzet35 sunar)","description":"multipart: `dosya` (PDF, ≤ 10 MB, `%PDF-` imzası), `surum` (artan tam sayı; eski/aynı sürüm 409), `tasarim` (1–4, bilgi). Sonuç `https://{kod}.xqr.com.tr/b` (3 düğme + gömülü PDF) ve `/b.pdf?v={surum}`. Eski sürüm dosyası silinir. 10/dk.","operationId":"v1XqrBrosurYukle","security":[{"bearerFirma":[]}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","required":["dosya","surum"],"properties":{"dosya":{"type":"string","format":"binary"},"surum":{"type":"integer","minimum":1},"tasarim":{"type":"integer","minimum":1,"maximum":4}}}}}},"x-alanlar":[{"ad":"data.surum","tip":"integer","zorunlu":true,"aciklama":""},{"ad":"data.boyut","tip":"integer","zorunlu":true,"aciklama":"bayt"},{"ad":"data.url","tip":"string","zorunlu":true,"aciklama":"`https://{kod}.xqr.com.tr/b`"},{"ad":"data.pdf_url","tip":"string","zorunlu":true,"aciklama":"`https://{kod}.xqr.com.tr/b.pdf`"}],"x-kaynak":"docs/api/xqr-sozlesme-taslagi.md §7"},"delete":{"tags":["SiparişMatik v1 (iki sistem: WhatsApp/markalı site · Pazaryeri)"],"responses":{"200":{"description":"v1 zarfı: `success` JSON boolean, `message`; veri anahtarları alan tablosunda","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Zarf"}}}},"401":{"description":"Kimlik başlığı eksik/yanlış: `{success:false, message}`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Zarf"}}}},"404":{"description":"Firma xQR'a kayıtlı değil","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Zarf"}}}}},"x-durum":"hazir","x-faz":6,"summary":"Broşürü kaldır","operationId":"v1XqrBrosurSil","security":[{"bearerFirma":[]}],"x-alanlar":[{"ad":"data.silindi","tip":"boolean","zorunlu":true,"aciklama":"Zaten yoksa false"}],"x-kaynak":"docs/api/xqr-sozlesme-taslagi.md §7"}},"/api/v1/firma/masa-olaylari":{"get":{"tags":["SiparişMatik v1 (iki sistem: WhatsApp/markalı site · Pazaryeri)"],"responses":{"200":{"description":"v1 zarfı: `success` JSON boolean, `message`; veri anahtarları alan tablosunda","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Zarf"}}}},"401":{"description":"Kimlik başlığı eksik/yanlış: `{success:false, message}`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Zarf"}}}},"422":{"description":"Geçersiz `durum`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Zarf"}}}}},"x-durum":"hazir","x-faz":6,"summary":"Masa olayları: garson çağır / hesap iste","description":"Pro 10 sn sipariş döngüsüne eklenir (`?durum=acik` varsayılan). Müşteri masa sayfasındaki düğmeyle açar; aynı masada aynı türde açık olay tekrar açılmaz. `sonSenkron` damgalanır.","operationId":"v1MasaOlaylari","security":[{"bearerFirma":[]}],"parameters":[{"name":"durum","in":"query","required":false,"description":"acik (varsayılan) | kapandi | tumu","schema":{"type":"string","enum":["acik","kapandi","tumu"]}}],"x-alanlar":[{"ad":"data[].id","tip":"integer","zorunlu":true,"aciklama":"Olay kimliği; kapatma ucunda kullanılır"},{"ad":"data[].masa_no","tip":"string","zorunlu":true,"aciklama":"Masa (QR'daki numara ya da kısa ad)"},{"ad":"data[].tur","tip":"string","zorunlu":true,"aciklama":"GARSON | HESAP"},{"ad":"data[].not","tip":"string | null","zorunlu":false,"aciklama":"Müşteri notu (≤ 200)"},{"ad":"data[].durum","tip":"string","zorunlu":true,"aciklama":"ACIK | KAPANDI"},{"ad":"data[].olusturma","tip":"string","zorunlu":true,"aciklama":"ISO 8601 (UTC)"},{"ad":"data[].kapanis","tip":"string | null","zorunlu":true,"aciklama":"ISO 8601 (UTC) ya da null"},{"ad":"toplam","tip":"integer","zorunlu":true,"aciklama":""}],"x-kaynak":"docs/api/xqr-sozlesme-taslagi.md §6"}},"/api/v1/firma/masa-olaylari/{id}":{"put":{"tags":["SiparişMatik v1 (iki sistem: WhatsApp/markalı site · Pazaryeri)"],"responses":{"200":{"description":"v1 zarfı: `success` JSON boolean, `message`; veri anahtarları alan tablosunda","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Zarf"}}}},"401":{"description":"Kimlik başlığı eksik/yanlış: `{success:false, message}`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Zarf"}}}},"404":{"description":"Başka firmanın olayı ya da yok","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Zarf"}}}},"422":{"description":"Geçersiz gövde","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Zarf"}}}}},"x-durum":"hazir","x-faz":6,"summary":"Masa olayını kapat (garson gitti / hesap götürüldü)","operationId":"v1MasaOlayiKapat","security":[{"bearerFirma":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Masa olayı kimliği (`data[].id`)","schema":{"type":"integer"},"example":17}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["durum"],"properties":{"durum":{"type":"string","enum":["KAPANDI"]}}},"example":{"durum":"KAPANDI"}}}},"x-alanlar":[{"ad":"durum","tip":"string","zorunlu":true,"aciklama":"İstek; yalnız KAPANDI"},{"ad":"data.id","tip":"integer","zorunlu":true,"aciklama":""},{"ad":"data.durum","tip":"string","zorunlu":true,"aciklama":"KAPANDI"},{"ad":"data.kapanis","tip":"string","zorunlu":true,"aciklama":"ISO 8601"},{"ad":"data.degisti","tip":"boolean","zorunlu":true,"aciklama":"Zaten kapalıysa false (idempotent)"}],"x-kaynak":"docs/api/xqr-sozlesme-taslagi.md §6"}},"/api/v2/restoranlar":{"get":{"tags":["Partner API v2 (Faz 6)"],"security":[{"partnerAnahtar":[]}],"responses":{"200":{"description":"`{success, data}` zarfı; şekil alan tablosunda","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"}}}}}},"401":{"description":"API anahtarı eksik/yanlış","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Hata"}}}},"429":{"description":"Partner kotası aşıldı","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Hata"}}}}},"x-durum":"taslak","x-faz":6,"x-hiz-siniri":"Partner başına 600 / dk (kota sözleşmeyle)","summary":"Partnerin bağlı şubeleri","description":"Anahtarın kapsamındaki şubeler (çoklu kiracı: bir anahtar birden çok şube yönetebilir). Kimlikler v2’de metin (cuid); v1’deki sayısal `v1Id` yalnız SiparişMatik için.","operationId":"v2Subeler","x-alanlar":[{"ad":"data[].id","tip":"string","zorunlu":true,"aciklama":"Şube kimliği"},{"ad":"data[].ad","tip":"string","zorunlu":true,"aciklama":""},{"ad":"data[].marka","tip":"string","zorunlu":true,"aciklama":"Vitrin adı"},{"ad":"data[].ilce","tip":"string","zorunlu":true,"aciklama":""},{"ad":"data[].acik","tip":"boolean","zorunlu":true,"aciklama":""},{"ad":"data[].calismaSaatleri[]","tip":"object[]","zorunlu":false,"aciklama":"`{gun, acilis, kapanis}`"}]}},"/api/v2/restoranlar/{subeId}/menu":{"get":{"tags":["Partner API v2 (Faz 6)"],"security":[{"partnerAnahtar":[]}],"responses":{"200":{"description":"`{success, data}` zarfı; şekil alan tablosunda","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"}}}}}},"401":{"description":"API anahtarı eksik/yanlış","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Hata"}}}},"404":{"description":"Şube anahtarın kapsamında değil","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Hata"}}}},"429":{"description":"Partner kotası aşıldı","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Hata"}}}}},"x-durum":"taslak","x-faz":6,"x-hiz-siniri":"Partner başına 600 / dk (kota sözleşmeyle)","summary":"Şube menüsü","description":"Kategoriler, ürünler, varyant/ekstra/menü grupları ve şube fiyatları. Fiyatlar **kuruş** (tam sayı).","operationId":"v2MenuOku","parameters":[{"name":"subeId","in":"path","required":true,"description":"Şube kimliği (cuid)","schema":{"type":"string"},"example":"cmfl3k9x40000abcd1234efgh"}],"x-alanlar":[{"ad":"data.kategoriler[]","tip":"object[]","zorunlu":true,"aciklama":"`{id, ad, sira, durum}`"},{"ad":"data.urunler[]","tip":"object[]","zorunlu":true,"aciklama":"`{id, kategoriId, ad, aciklama, fiyatKurus, indirimliFiyatKurus, durum, disKimlik}`"},{"ad":"data.urunler[].varyantGruplari[]","tip":"object[]","zorunlu":false,"aciklama":""},{"ad":"data.urunler[].ekstraGruplari[]","tip":"object[]","zorunlu":false,"aciklama":""}]},"put":{"tags":["Partner API v2 (Faz 6)"],"security":[{"partnerAnahtar":[]}],"responses":{"200":{"description":"`{success, data}` zarfı; şekil alan tablosunda","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"}}}}}},"400":{"description":"Doğrulama hatası (alan bazlı)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Hata"}}}},"401":{"description":"API anahtarı eksik/yanlış","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Hata"}}}},"409":{"description":"Aynı Idempotency-Key farklı gövdeyle","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Hata"}}}},"429":{"description":"Partner kotası aşıldı","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Hata"}}}}},"x-durum":"taslak","x-faz":6,"x-hiz-siniri":"Partner başına 600 / dk (kota sözleşmeyle)","summary":"Menü senkronu (partner → Lezzet35)","description":"Tam ya da kısmi menü gönderimi; `disKimlik` eşleme anahtarı. Yeni kayıt moderasyon kuyruğuna düşer (F4). İdempotent; `Idempotency-Key` zorunlu. Yanıt `summary {created, updated, skipped}`.","operationId":"v2MenuSenkron","parameters":[{"name":"subeId","in":"path","required":true,"description":"Şube kimliği (cuid)","schema":{"type":"string"},"example":"cmfl3k9x40000abcd1234efgh"},{"name":"Idempotency-Key","in":"header","required":true,"description":"Partnerin ürettiği tekil anahtar (UUID); aynı anahtarla tekrar → ilk yanıt, yan etki yok (24 sa)","schema":{"type":"string","format":"uuid"},"example":"6f1c2a0e-3b8e-4c8f-9c1a-2d5f7a9b1c33"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["urunler"],"properties":{"kategoriler":{"type":"array","items":{"type":"object"}},"urunler":{"type":"array","items":{"type":"object","required":["disKimlik","ad","fiyatKurus"]}}}},"example":{"kategoriler":[{"disKimlik":"12","ad":"Kumrular","sira":1}],"urunler":[{"disKimlik":"1001","kategoriDisKimlik":"12","ad":"Klasik Kumru","fiyatKurus":12000,"durum":"AKTIF"}]}}}},"x-alanlar":[{"ad":"urunler[].disKimlik","tip":"string","zorunlu":true,"aciklama":"Partner ürün kimliği"},{"ad":"urunler[].ad","tip":"string","zorunlu":true,"aciklama":""},{"ad":"urunler[].fiyatKurus","tip":"integer","zorunlu":true,"aciklama":"Kuruş"},{"ad":"urunler[].kategoriDisKimlik","tip":"string","zorunlu":false,"aciklama":""},{"ad":"urunler[].durum","tip":"AKTIF | PASIF","zorunlu":false,"aciklama":""},{"ad":"data.summary","tip":"object","zorunlu":true,"aciklama":"`{created, updated, skipped}`"}]}},"/api/v2/restoranlar/{subeId}/durum":{"put":{"tags":["Partner API v2 (Faz 6)"],"security":[{"partnerAnahtar":[]}],"responses":{"200":{"description":"`{success, data}` zarfı; şekil alan tablosunda","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"}}}}}},"401":{"description":"API anahtarı eksik/yanlış","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Hata"}}}},"429":{"description":"Partner kotası aşıldı","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Hata"}}}}},"x-durum":"taslak","x-faz":6,"x-hiz-siniri":"Partner başına 600 / dk (kota sözleşmeyle)","summary":"Şubeyi aç/kapat","operationId":"v2SubeDurum","parameters":[{"name":"subeId","in":"path","required":true,"description":"Şube kimliği (cuid)","schema":{"type":"string"},"example":"cmfl3k9x40000abcd1234efgh"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["acik"],"properties":{"acik":{"type":"boolean"},"neden":{"type":"string"}}},"example":{"acik":false,"neden":"Yoğunluk"}}}},"x-alanlar":[{"ad":"acik","tip":"boolean","zorunlu":true,"aciklama":"İstek"},{"ad":"neden","tip":"string","zorunlu":false,"aciklama":"Vitrinde gösterilmez; panelde loglanır"},{"ad":"data.acik","tip":"boolean","zorunlu":true,"aciklama":""}]}},"/api/v2/siparisler":{"get":{"tags":["Partner API v2 (Faz 6)"],"security":[{"partnerAnahtar":[]}],"responses":{"200":{"description":"`{success, data}` zarfı; şekil alan tablosunda","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"}}}}}},"401":{"description":"API anahtarı eksik/yanlış","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Hata"}}}},"429":{"description":"Partner kotası aşıldı","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Hata"}}}}},"x-durum":"taslak","x-faz":6,"x-hiz-siniri":"Partner başına 600 / dk (kota sözleşmeyle)","summary":"Siparişleri listele","description":"Webhook yerine ya da yanında çekme (polling) yolu. `since` ile artımlı; imleç tabanlı sayfalama (`meta.sonraki`).","operationId":"v2Siparisler","parameters":[{"name":"durum","in":"query","schema":{"type":"string","enum":["ALINDI","ONAYLANDI","HAZIRLANIYOR","YOLDA","TESLIM_EDILDI","IPTAL","REDDEDILDI"]}},{"name":"since","in":"query","description":"ISO 8601; bu andan sonra güncellenenler","schema":{"type":"string","format":"date-time"}},{"name":"imlec","in":"query","description":"Önceki yanıtın `meta.sonraki` değeri","schema":{"type":"string"}}],"x-alanlar":[{"ad":"data[]","tip":"object[]","zorunlu":true,"aciklama":"Sipariş özeti: `{id, no, subeId, durum, toplamKurus, olusturuldu, guncellendi}`"},{"ad":"meta.sonraki","tip":"string | null","zorunlu":true,"aciklama":"Sonraki sayfa imleci"}]}},"/api/v2/siparisler/{id}":{"get":{"tags":["Partner API v2 (Faz 6)"],"security":[{"partnerAnahtar":[]}],"responses":{"200":{"description":"`{success, data}` zarfı; şekil alan tablosunda","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"}}}}}},"401":{"description":"API anahtarı eksik/yanlış","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Hata"}}}},"404":{"description":"Sipariş anahtarın kapsamında değil","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Hata"}}}},"429":{"description":"Partner kotası aşıldı","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Hata"}}}}},"x-durum":"taslak","x-faz":6,"x-hiz-siniri":"Partner başına 600 / dk (kota sözleşmeyle)","summary":"Sipariş detayı","description":"Kalemler ve seçimler sipariş anındaki anlık görüntü; müşteri PII’si yalnız teslimat için gereken kadar (ad, telefon, adres).","operationId":"v2SiparisOku","parameters":[{"name":"id","in":"path","required":true,"description":"Sipariş kimliği (cuid) ya da numarası (L35-…)","schema":{"type":"string"},"example":"L35-20260916-4F2A9C"}],"x-alanlar":[{"ad":"data.id","tip":"string","zorunlu":true,"aciklama":""},{"ad":"data.no","tip":"string","zorunlu":true,"aciklama":"L35-YYYYMMDD-XXXXXX"},{"ad":"data.durum","tip":"string","zorunlu":true,"aciklama":"M06 iç durum"},{"ad":"data.kalemler[]","tip":"object[]","zorunlu":true,"aciklama":"`{urunAdi, adet, birimFiyatKurus, toplamKurus, secimler[], not}`"},{"ad":"data.teslimat","tip":"object","zorunlu":true,"aciklama":"`{tip, adres, mahalle, not}`"},{"ad":"data.odeme","tip":"object","zorunlu":true,"aciklama":"`{tur, toplamKurus, tahsilatGerekli}`"}]}},"/api/v2/siparisler/{id}/durum":{"put":{"tags":["Partner API v2 (Faz 6)"],"security":[{"partnerAnahtar":[]}],"responses":{"200":{"description":"`{success, data}` zarfı; şekil alan tablosunda","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"}}}}}},"400":{"description":"Geçersiz geçiş ya da doğrulama","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Hata"}}}},"401":{"description":"API anahtarı eksik/yanlış","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Hata"}}}},"404":{"description":"Sipariş yok","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Hata"}}}},"429":{"description":"Partner kotası aşıldı","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Hata"}}}}},"x-durum":"taslak","x-faz":6,"x-hiz-siniri":"Partner başına 600 / dk (kota sözleşmeyle)","summary":"Sipariş durumunu güncelle","description":"M06 durum makinesi `kaynak: restoran` kurallarıyla; geçersiz geçiş **400** döner (v1’den farklı: partnerin tekrar döngüsü yok). İdempotent.","operationId":"v2SiparisDurum","parameters":[{"name":"id","in":"path","required":true,"description":"Sipariş kimliği (cuid) ya da numarası (L35-…)","schema":{"type":"string"},"example":"L35-20260916-4F2A9C"},{"name":"Idempotency-Key","in":"header","required":true,"description":"Partnerin ürettiği tekil anahtar (UUID); aynı anahtarla tekrar → ilk yanıt, yan etki yok (24 sa)","schema":{"type":"string","format":"uuid"},"example":"6f1c2a0e-3b8e-4c8f-9c1a-2d5f7a9b1c33"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["durum"],"properties":{"durum":{"type":"string","enum":["ONAYLANDI","HAZIRLANIYOR","YOLDA","TESLIM_EDILDI","IPTAL","REDDEDILDI"]},"aciklama":{"type":"string"},"teslimTahminiDk":{"type":"integer"}}},"example":{"durum":"ONAYLANDI","teslimTahminiDk":35}}}},"x-alanlar":[{"ad":"durum","tip":"string","zorunlu":true,"aciklama":"İstek"},{"ad":"aciklama","tip":"string","zorunlu":false,"aciklama":"Müşteriye gösterilir (ret/iptal nedeni)"},{"ad":"teslimTahminiDk","tip":"integer","zorunlu":false,"aciklama":"Onayda tahmini süre"},{"ad":"data.onceki","tip":"string","zorunlu":true,"aciklama":""},{"ad":"data.yeni","tip":"string","zorunlu":true,"aciklama":""}]}},"/api/v2/webhooks":{"post":{"tags":["Partner API v2 (Faz 6)"],"security":[{"partnerAnahtar":[]}],"responses":{"200":{"description":"`{success, data}` zarfı; şekil alan tablosunda","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"}}}}}},"400":{"description":"URL https değil ya da olay bilinmiyor","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Hata"}}}},"401":{"description":"API anahtarı eksik/yanlış","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Hata"}}}},"429":{"description":"Partner kotası aşıldı","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Hata"}}}}},"x-durum":"taslak","x-faz":6,"x-hiz-siniri":"Partner başına 600 / dk (kota sözleşmeyle)","summary":"Webhook aboneliği","description":"Olaylar: `siparis.olusturuldu`, `siparis.durum`, `menu.degisti`, `sube.durum`. Teslim: `POST url`, gövde `{olay, kimlik, zaman, veri}`; başlıklar `X-Lezzet35-Olay`, `X-Lezzet35-Teslim-Id`, `X-Lezzet35-Imza: sha256=HMAC_SHA256(gizliAnahtar, hamGovde)`. 2xx dışı → üstel geri çekilme ile 5 deneme (1, 2, 5, 15, 60 dk), sonra dead-letter ve panelde uyarı. Sipariş oluştuğunda teslim hedefi ≤ 2 sn.","operationId":"v2WebhookKaydet","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["url","olaylar"],"properties":{"url":{"type":"string","format":"uri"},"olaylar":{"type":"array","items":{"type":"string","enum":["siparis.olusturuldu","siparis.durum","menu.degisti","sube.durum"]}},"gizliAnahtar":{"type":"string","minLength":32,"description":"Verilmezse sunucu üretir ve yalnız bu yanıtta gösterir"}}},"example":{"url":"https://pos.ornek.com/lezzet35/webhook","olaylar":["siparis.olusturuldu","siparis.durum"]}}}},"x-alanlar":[{"ad":"url","tip":"uri (https)","zorunlu":true,"aciklama":"İstek"},{"ad":"olaylar[]","tip":"string[]","zorunlu":true,"aciklama":"İstek"},{"ad":"gizliAnahtar","tip":"string","zorunlu":false,"aciklama":"İstek; ≥ 32 karakter"},{"ad":"data.id","tip":"string","zorunlu":true,"aciklama":"Abonelik kimliği"},{"ad":"data.gizliAnahtar","tip":"string","zorunlu":true,"aciklama":"Yalnız bu yanıtta düz metin"}]}}},"components":{"schemas":{"OtpIstek":{"type":"object","properties":{"telefon":{"type":"string","minLength":10,"maxLength":20,"description":"Türkiye cep telefonu; 05xx, 5xx ya da +905xx biçimleri kabul edilir, sunucu E.164’e çevirir","examples":["0532 123 45 67"]},"amac":{"default":"giris","description":"Kodun amacı; varsayılan giris","type":"string","enum":["giris","kayit","panel-token"]}},"required":["telefon"]},"OtpIstekYaniti":{"type":"object","description":"Başarılı yanıt zarfı","required":["success","data"],"properties":{"success":{"type":"boolean","const":true,"description":"Her zaman true"},"data":{"type":"object","properties":{"gonderildi":{"type":"boolean","const":true},"bitisSn":{"type":"integer","description":"Kodun geçerlilik süresi (saniye)","examples":[300]}},"required":["gonderildi","bitisSn"]}}},"OtpDogrula":{"type":"object","properties":{"telefon":{"type":"string","minLength":10,"maxLength":20,"description":"Türkiye cep telefonu; 05xx, 5xx ya da +905xx biçimleri kabul edilir, sunucu E.164’e çevirir","examples":["0532 123 45 67"]},"kod":{"type":"string","pattern":"^\\d{6}$","description":"SMS ile gelen 6 haneli kod","examples":["123456"]}},"required":["telefon","kod"]},"OtpDogrulaYaniti":{"type":"object","description":"Başarılı yanıt zarfı","required":["success","data"],"properties":{"success":{"type":"boolean","const":true,"description":"Her zaman true"},"data":{"type":"object","properties":{"userId":{"type":"string","description":"Kullanıcı kimliği (cuid)"},"yeniKullanici":{"type":"boolean","description":"Numara ilk kez doğrulandıysa true (otomatik kayıt)"}},"required":["userId","yeniKullanici"]}}},"MahalleSonucu":{"type":"object","properties":{"id":{"type":"integer","description":"Mahalle kimliği (kaynak veri mahalle_id)","examples":[61033]},"ad":{"type":"string","description":"Başlık biçiminde ad","examples":["Alsancak Mahallesi"]},"ilceId":{"type":"integer","examples":[3513]},"ilceAd":{"type":"string","examples":["Konak"]}},"required":["id","ad","ilceId","ilceAd"]},"MahalleAraYaniti":{"type":"object","description":"Başarılı yanıt zarfı","required":["success","data"],"properties":{"success":{"type":"boolean","const":true,"description":"Her zaman true"},"data":{"type":"array","items":{"$ref":"#/components/schemas/MahalleSonucu"},"description":"En fazla 8 sonuç; önek eşleşmesi önce"}}},"HealthYaniti":{"type":"object","properties":{"durum":{"type":"string","enum":["ok","sorunlu"],"description":"İki bağımlılık da ok ise ok"},"db":{"type":"string","enum":["ok","hata"]},"redis":{"type":"string","enum":["ok","hata"]},"surum":{"type":"string","description":"package.json sürümü","examples":["0.1.0"]},"zaman":{"type":"string","format":"date-time","description":"Sunucu saati (ISO 8601, UTC)"}},"required":["durum","db","redis","surum","zaman"]},"Hata":{"type":"object","description":"Hata zarfı; `errors` yalnız doğrulama hatasında (alan adı → mesaj listesi)","required":["success","message"],"properties":{"success":{"type":"boolean","const":false},"message":{"type":"string","description":"Türkçe, kullanıcıya gösterilebilir mesaj","examples":["Doğrulama hatası"]},"errors":{"type":"object","description":"Alan bazlı doğrulama mesajları (400)","additionalProperties":{"type":"array","items":{"type":"string"}},"examples":[{"telefon":["Telefon en az 10 karakter olmalı"]}]},"neden":{"type":"string","description":"OTP doğrulamada makine kodu: bulunamadi | suresi_doldu | deneme_asildi | yanlis"},"yenidenSn":{"type":"integer","description":"429’da kaç saniye sonra yeniden denenebileceği"}}},"V1Zarf":{"type":"object","description":"SiparişMatik v1 zarfı: `success` JSON boolean (exe \"True\" metniyle karşılaştırır), `message` metin; veri anahtarı uca göre (havuz, firma, data)","required":["success"],"properties":{"success":{"type":"boolean"},"message":{"type":"string"}}}},"securitySchemes":{"bearerFirma":{"type":"http","scheme":"bearer","bearerFormat":"Firma API anahtarı","description":"`Authorization: Bearer <api_token>` — firma anahtarı; sunucuda sha256 özeti saklanır, düz metin yalnız üretim anında admin’e bir kez gösterilir. SiparişMatik exe `GET /pool` ile alır."},"poolSecret":{"type":"apiKey","in":"header","name":"X-Pool-Secret","description":"Tüm SiparişMatik kurulumlarında ortak, exe’ye gömülü anahtar (yalnız `/api/v1/pool` ve `/pool/sms/log`). Değiştirilemez; HAZIR penceresiyle daraltılır (KARAR-9)."},"partnerAnahtar":{"type":"apiKey","in":"header","name":"X-Api-Key","description":"Partner API v2 anahtarı; sha256 özet, çoklu kiracı, partner başına kota (Faz 6)."},"cerezOturum":{"type":"apiKey","in":"cookie","name":"l35_oturum","description":"Tarayıcı oturumu: HttpOnly, SameSite=Lax, 30 gün; `/giris` Server Action açar. Dahili sayfa/eylem yetkisi bu çerezle; herkese açık JSON uçları çerez istemez."}}},"x-hata-kodlari":[{"kod":400,"ad":"Doğrulama hatası","aciklama":"Gövde/parametre şemaya uymuyor; `errors` alan bazlı mesajlar (Türkçe). Geçersiz JSON da 400."},{"kod":401,"ad":"Kimlik gerekli","aciklama":"Oturum çerezi, Bearer ya da X-Pool-Secret eksik/yanlış."},{"kod":403,"ad":"Yetki yok","aciklama":"Kimlik doğru ama kapsam dışı (başka firmanın şubesi, rol uymuyor)."},{"kod":404,"ad":"Bulunamadı","aciklama":"Kayıt yok ya da kiracı sınırı dışında — ikisi aynı yanıt (varlık sızdırmaz)."},{"kod":409,"ad":"Çakışma","aciklama":"Aynı Idempotency-Key farklı gövdeyle (v2)."},{"kod":422,"ad":"İşlenemeyen içerik","aciklama":"Yalnız v1: WPSipariş doğrulama yanıtı biçimi (`Doğrulama hatası: …`)."},{"kod":429,"ad":"Hız sınırı","aciklama":"`retry-after` başlığı ve `yenidenSn` alanı; sınırlar uç bazlı (bkz. Hız sınırı)."},{"kod":500,"ad":"Sunucu hatası","aciklama":"Beklenmeyen hata; ayrıntı yalnız sunucu logunda (PII maskeli)."},{"kod":503,"ad":"Hizmet dışı","aciklama":"Sağlık ucunda bağımlılık hatası; üretimde hız sınırı deposu (Redis) erişilemezse fail-closed."}],"x-degisiklik-gunlugu":[{"surum":"1.0.0","tarih":"2026-10-27","notlar":["Sözleşme v2.0: iki sistem — WhatsApp/markalı site (`akis: whatsapp`, kanal MARKA_SITESI+XQR) ve Pazaryeri (`akis: pazaryeri`, kanal WEB); anahtar akış kapsamlı, sipariş uçları yalnız kendi akışını görür; sipariş gövdesine `akis` alanı","Webhook (Lezzet35 → SiparişMatik köprüsü, akış başına): `siparis.olusturuldu` / `siparis.durum` / `siparis.iptal` / `test`; JWT HS512 + `X-Lezzet35-Signature`; 10 deneme ≈ 24 sa (rehber: /docs/api/siparismatik)","Jeton otomasyonu: anahtar ve webhook sırrı SiparişMatik sunucusuna `entegrasyon.anahtar` olayıyla itilir (X-Pool-Secret + imza)","`GET /iptal-nedenleri` ve `PUT …/durum` `iptal_nedeni` (admin yönetir)","`musteri_il` teslimat mahallesinin ilinden (sabit İzmir kaldırıldı)"]},{"surum":"0.9.0","tarih":"2026-10-27","notlar":["xQR Faz 4: `PUT|DELETE /xqr/brosur` (PDF barındırma; `/b` sayfası ve `/b.pdf`)","`POST /xqr/kayit`: `X-Xqr-Panel-Key` canlıda zorunlu (27.10)"]},{"surum":"0.8.0","tarih":"2026-10-27","notlar":["xQR Faz 2: `GET /firma/siparisler` `teslimat_tipi: MASA` + `masa_no` (masa siparişi; YOLDA yok, hazır olunca servis, ödeme masada)","`POST /pool/products/sync` ve `GET /menu`: `salon_fiyat`, `alerjenler[]`, `etiketler[]` (bilinmeyen kod 422)","`POST /xqr/kayit`: kimlik SiparişMatik ID + Pro paneli (telefon bilgi alanı), isteğe bağlı `X-Xqr-Panel-Key`"]},{"surum":"0.7.0","tarih":"2026-10-26","notlar":["xQR (QR menü, K-44) Faz 1: `POST /xqr/kayit` (X-Pool-Secret; firmaid + telefon doğrulaması, 201 tek seferlik api_key), `GET|PUT /xqr` (masa_siparis, masa_sayisi, diller)","`GET /firma/masa-olaylari` (garson çağır / hesap iste; Pro 10 sn çekimi) ve `PUT /firma/masa-olaylari/{id}` {durum:KAPANDI}","Sözleşme: docs/api/xqr-sozlesme-taslagi.md"]},{"surum":"0.6.0","tarih":"2026-10-26","notlar":["`GET /firma/siparisler`: `urunler[].liste_fiyat`, `urunler[].indirim`, `urun_indirimi`, `para_ustu`, `musteri_enlem`/`musteri_boylam`, `musteri_adres_kisa`, `teslimat_tipi`, `odeme_turu`, `odendi`, `teslimat_ucreti` belgeye eklendi","`GET /firma/siparisler/{id}` tek sipariş; süzgeçler (`durum`, `tarih_baslangic`, `tarih_bitis`)","`PUT …/durum`: `tahmini_sure_dk`; yanıtta `teslim_tahmini`, `degisti`, `reddedildi`","Ödeme kataloğu: `odeme_turu`+`odendi` öncelikli, `odeme_yontemi` görünen ad / yemek kartı markası"]},{"surum":"0.5.0","tarih":"2026-10-23","notlar":["SiparişMatik Pro çift yönlü menü senkronu: `products/sync` ek alanları (kdv, ekstralar, foto_url, silindi, guncellendi_at) ve `conflicts[]`","`GET /menu?since=` artımlı çekme; `guncellendi_at`, `silindi`, `ekstralar`, `kdv`, `summary.sunucu_zamani`","`POST /pool/products/{sp_urun_id}/foto` görsel yükleme"]},{"surum":"0.4.0","tarih":"2026-10-23","notlar":["SiparişMatik v1 uçları canlı (Faz 6): havuz/connect/disconnect, categories/products sync, sms/log, status, branches, menu, firma/siparisler + durum","Yeni ürün ONAY_BEKLIYOR; `GET /firma/siparisler` tek sayfa; ek alanlar `teslimat_tipi`, `odeme_turu`, `odendi`","`entegrasyon_gunlugu` ve admin “bağlantı koptu” uyarısı"]},{"surum":"0.3.0","tarih":"2026-09-16","notlar":["Belge ve `/docs/api` yayında (Faz 3)","`GET /api/openapi.json`","SiparişMatik v1 uçları sözleşmeden planlandı olarak eklendi","Partner API v2 taslağı"]},{"surum":"0.2.0","tarih":"2026-09-15","notlar":["`GET /api/bolge/mahalle-ara` — İzmir mahalle araması (Faz 2)","Servis alanı çekirdeği (M04)"]},{"surum":"0.1.0","tarih":"2026-09-14","notlar":["`GET /api/health`","`POST /api/auth/otp/istek`, `POST /api/auth/otp/dogrula` (Faz 1)","Yanıt zarfı `{success, data | message, errors}`"]}]}