{
    "info": {
        "_postman_id": "8f2a1c60-bayi-api-v1-oyuneks",
        "name": "Oyuneks Bayi API v1",
        "description": "Bayi API koleksiyonu. token değişkenine kendi anahtarınızı yazın (test için oyxb_test_ önekli).\n\nDoküman: https://oyuneks.com/bayi-api/docs",
        "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
    },
    "auth": {
        "type": "bearer",
        "bearer": [
            {
                "key": "token",
                "value": "{{token}}",
                "type": "string"
            }
        ]
    },
    "variable": [
        {
            "key": "baseUrl",
            "value": "https://oyuneks.com/bayi-api/v1",
            "type": "string"
        },
        {
            "key": "token",
            "value": "oyxb_test_KENDI_ANAHTARIN",
            "type": "string"
        }
    ],
    "item": [
        {
            "name": "Hesap & bakiye",
            "description": "Anahtarın hangi hesaba bağlı olduğu, limitler ve para.",
            "item": [
                {
                    "name": "Anahtar sağlık kontrolü",
                    "request": {
                        "method": "GET",
                        "header": [],
                        "url": {
                            "raw": "{{baseUrl}}/me",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "me"
                            ]
                        },
                        "description": "Bayi kimliği, firma adı, kademe, kullanılabilir bakiye, günlük limit ve anahtarın kapsamları. mode alanı \"live\" ya da \"test\" döner; entegrasyonun ilk isteği bu olmalı. Kapsam İSTEMEZ: hangi kapsamla üretilmiş olursa olsun geçerli her anahtar kendini doğrulayabilir.\n\nKapsam: (herhangi)"
                    },
                    "response": [
                        {
                            "name": "Örnek yanıt (200)",
                            "originalRequest": {
                                "method": "GET",
                                "header": [],
                                "url": {
                                    "raw": "{{baseUrl}}/me",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "me"
                                    ]
                                },
                                "description": "Bayi kimliği, firma adı, kademe, kullanılabilir bakiye, günlük limit ve anahtarın kapsamları. mode alanı \"live\" ya da \"test\" döner; entegrasyonun ilk isteği bu olmalı. Kapsam İSTEMEZ: hangi kapsamla üretilmiş olursa olsun geçerli her anahtar kendini doğrulayabilir.\n\nKapsam: (herhangi)"
                            },
                            "status": "OK",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": {\n        \"dealerId\": 385841,\n        \"company\": \"ÖRNEK BİLİŞİM LTD. ŞTİ.\",\n        \"tier\": \"Bronz\",\n        \"tierId\": 1,\n        \"balance\": \"48250.00\",\n        \"currency\": \"TRY\",\n        \"limits\": {\n            \"dailyPurchase\": \"250000.00\",\n            \"dailyUsed\": \"1200.00\",\n            \"maxQtyPerOrder\": 500\n        },\n        \"apiEnabled\": true,\n        \"key\": {\n            \"name\": \"Canlı anahtar\",\n            \"masked\": \"oyxb_live_a91f...3c0e\",\n            \"scopes\": [\n                \"catalog:read\",\n                \"orders:read\",\n                \"orders:write\",\n                \"balance:read\"\n            ],\n            \"rateReadPerMin\": 300,\n            \"rateWritePerMin\": 60\n        },\n        \"apiVersion\": \"v1\",\n        \"serverTime\": \"2026-08-28T14:05:00+03:00\"\n    },\n    \"mode\": \"live\",\n    \"requestId\": \"01K3QF6ZC2M9V0X7NB4TDHR8YE\"\n}"
                        }
                    ]
                },
                {
                    "name": "Kullanılabilir bakiye",
                    "request": {
                        "method": "GET",
                        "header": [],
                        "url": {
                            "raw": "{{baseUrl}}/balance",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "balance"
                            ]
                        },
                        "description": "Kullanılabilir bakiye, bloke tutar, onay bekleyen havale toplamı ve kırılım (bakiye + iade edilebilir + bonus). available değeri SİPARİŞ KAPISININ okuduğu ile aynı sayıdır; başka bir toplama yazılsa bot \"param var\" der ama sipariş INSUFFICIENT_BALANCE yerdi.\n\nKapsam: balance:read"
                    },
                    "response": [
                        {
                            "name": "Örnek yanıt (200)",
                            "originalRequest": {
                                "method": "GET",
                                "header": [],
                                "url": {
                                    "raw": "{{baseUrl}}/balance",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "balance"
                                    ]
                                },
                                "description": "Kullanılabilir bakiye, bloke tutar, onay bekleyen havale toplamı ve kırılım (bakiye + iade edilebilir + bonus). available değeri SİPARİŞ KAPISININ okuduğu ile aynı sayıdır; başka bir toplama yazılsa bot \"param var\" der ama sipariş INSUFFICIENT_BALANCE yerdi.\n\nKapsam: balance:read"
                            },
                            "status": "OK",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": {\n        \"available\": \"48250.00\",\n        \"blocked\": \"0.00\",\n        \"breakdown\": {\n            \"balance\": \"46250.00\",\n            \"refundable\": \"1500.00\",\n            \"bonus\": \"500.00\"\n        },\n        \"pendingDeposits\": \"5000.00\",\n        \"currency\": \"TRY\",\n        \"asOf\": \"2026-08-28T14:05:00+03:00\"\n    },\n    \"mode\": \"live\",\n    \"requestId\": \"01K3QF6ZC2M9V0X7NB4TDHR8YE\"\n}"
                        }
                    ]
                },
                {
                    "name": "Cari hareketler (imleçli)",
                    "request": {
                        "method": "GET",
                        "header": [],
                        "url": {
                            "raw": "{{baseUrl}}/balance/transactions",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "balance",
                                "transactions"
                            ],
                            "query": [
                                {
                                    "key": "from",
                                    "value": "2026-08-01",
                                    "description": "Başlangıç tarihi (dahil). Okunamayan tarih sessizce yok sayılır.",
                                    "disabled": true
                                },
                                {
                                    "key": "to",
                                    "value": "2026-08-28",
                                    "description": "Bitiş tarihi (dahil).",
                                    "disabled": true
                                },
                                {
                                    "key": "type",
                                    "value": "order",
                                    "description": "Hareket tipi süzgeci. Listede olmayan tipler \"other\" döner ve typeId alanı ham değeri taşır.",
                                    "disabled": true
                                },
                                {
                                    "key": "cursor",
                                    "value": "3012301",
                                    "description": "Önceki yanıttaki nextCursor. Yalnız rakam kabul edilir.",
                                    "disabled": true
                                },
                                {
                                    "key": "limit",
                                    "value": "50",
                                    "description": "Sayfa boyu (1-200).",
                                    "disabled": true
                                }
                            ]
                        },
                        "description": "Cari hareket defteri. Sipariş hareketlerinde tutar EKSİ işaretli döner ve orderId + externalRef alanları dolar; balanceAfter ile mutabakat yapılır. Sayfalama imleçli: yanıttaki nextCursor değerini ?cursor= ile geri gönderin.\n\nKapsam: balance:read"
                    },
                    "response": [
                        {
                            "name": "Örnek yanıt (200)",
                            "originalRequest": {
                                "method": "GET",
                                "header": [],
                                "url": {
                                    "raw": "{{baseUrl}}/balance/transactions",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "balance",
                                        "transactions"
                                    ],
                                    "query": [
                                        {
                                            "key": "from",
                                            "value": "2026-08-01",
                                            "description": "Başlangıç tarihi (dahil). Okunamayan tarih sessizce yok sayılır.",
                                            "disabled": true
                                        },
                                        {
                                            "key": "to",
                                            "value": "2026-08-28",
                                            "description": "Bitiş tarihi (dahil).",
                                            "disabled": true
                                        },
                                        {
                                            "key": "type",
                                            "value": "order",
                                            "description": "Hareket tipi süzgeci. Listede olmayan tipler \"other\" döner ve typeId alanı ham değeri taşır.",
                                            "disabled": true
                                        },
                                        {
                                            "key": "cursor",
                                            "value": "3012301",
                                            "description": "Önceki yanıttaki nextCursor. Yalnız rakam kabul edilir.",
                                            "disabled": true
                                        },
                                        {
                                            "key": "limit",
                                            "value": "50",
                                            "description": "Sayfa boyu (1-200).",
                                            "disabled": true
                                        }
                                    ]
                                },
                                "description": "Cari hareket defteri. Sipariş hareketlerinde tutar EKSİ işaretli döner ve orderId + externalRef alanları dolar; balanceAfter ile mutabakat yapılır. Sayfalama imleçli: yanıttaki nextCursor değerini ?cursor= ile geri gönderin.\n\nKapsam: balance:read"
                            },
                            "status": "OK",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": {\n        \"items\": [\n            {\n                \"id\": 3012402,\n                \"type\": \"order\",\n                \"typeId\": 1,\n                \"amount\": \"-197.40\",\n                \"balanceAfter\": \"48052.60\",\n                \"orderId\": 184213,\n                \"externalRef\": \"SIP-2026-0001\",\n                \"description\": \"Sipariş ödemesi\",\n                \"createdAt\": \"2026-08-28T14:05:00+03:00\"\n            },\n            {\n                \"id\": 3012301,\n                \"type\": \"deposit\",\n                \"typeId\": 2,\n                \"amount\": \"25000.00\",\n                \"balanceAfter\": \"48250.00\",\n                \"orderId\": null,\n                \"externalRef\": null,\n                \"description\": \"Havale\",\n                \"createdAt\": \"2026-08-28T09:12:00+03:00\"\n            }\n        ],\n        \"nextCursor\": \"3012301\",\n        \"currency\": \"TRY\"\n    },\n    \"mode\": \"live\",\n    \"requestId\": \"01K3QF6ZC2M9V0X7NB4TDHR8YE\"\n}"
                        }
                    ]
                }
            ]
        },
        {
            "name": "Katalog & fiyat",
            "description": "Ürün kimliği, bayi fiyatınız, stok ve zorunlu alan şeması. Kimlik ve alan adı UYDURULMAZ, hep buradan okunur.",
            "item": [
                {
                    "name": "Oyun listesi",
                    "request": {
                        "method": "GET",
                        "header": [
                            {
                                "key": "If-None-Match",
                                "value": "\"a91f3c0e\"",
                                "description": "Önceki yanıtın ETag değeri. Gövde değişmediyse 304 döner.",
                                "disabled": true
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/catalog/games",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "catalog",
                                "games"
                            ]
                        },
                        "description": "Bayiye satılan ürünü olan oyunlar (üst kategoriler), her oyunun altındaki kategoriler (categories) ve ürün sayıları. Ürün listesinde category süzgecine categories[].category verilir. Ürün listesindeki game süzgecine BURADAKİ slug verilir, kategori kimliği değil: kimlikler yönetimde birleştirme sırasında değişebilir, slug adresin parçası olduğu için sabit kalmak zorundadır.\n\nKapsam: catalog:read"
                    },
                    "response": [
                        {
                            "name": "Örnek yanıt (200)",
                            "originalRequest": {
                                "method": "GET",
                                "header": [
                                    {
                                        "key": "If-None-Match",
                                        "value": "\"a91f3c0e\"",
                                        "description": "Önceki yanıtın ETag değeri. Gövde değişmediyse 304 döner.",
                                        "disabled": true
                                    }
                                ],
                                "url": {
                                    "raw": "{{baseUrl}}/catalog/games",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "catalog",
                                        "games"
                                    ]
                                },
                                "description": "Bayiye satılan ürünü olan oyunlar (üst kategoriler), her oyunun altındaki kategoriler (categories) ve ürün sayıları. Ürün listesinde category süzgecine categories[].category verilir. Ürün listesindeki game süzgecine BURADAKİ slug verilir, kategori kimliği değil: kimlikler yönetimde birleştirme sırasında değişebilir, slug adresin parçası olduğu için sabit kalmak zorundadır.\n\nKapsam: catalog:read"
                            },
                            "status": "OK",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": {\n        \"items\": [\n            {\n                \"game\": \"pubg-mobile\",\n                \"name\": \"PUBG Mobile\",\n                \"categoryId\": 25,\n                \"productCount\": 34,\n                \"categories\": [\n                    {\n                        \"category\": \"pubg-mobile-uc\",\n                        \"name\": \"PUBG Mobile UC\",\n                        \"categoryId\": 251,\n                        \"productCount\": 34\n                    }\n                ]\n            },\n            {\n                \"game\": \"knight-online\",\n                \"name\": \"Knight Online\",\n                \"categoryId\": 12,\n                \"productCount\": 18,\n                \"categories\": []\n            }\n        ]\n    },\n    \"mode\": \"live\",\n    \"requestId\": \"01K3QF6ZC2M9V0X7NB4TDHR8YE\"\n}"
                        }
                    ]
                },
                {
                    "name": "Ürün listesi (imleçli)",
                    "request": {
                        "method": "GET",
                        "header": [
                            {
                                "key": "If-None-Match",
                                "value": "",
                                "description": "Önceki yanıtın ETag değeri.",
                                "disabled": true
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/catalog/products",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "catalog",
                                "products"
                            ],
                            "query": [
                                {
                                    "key": "type",
                                    "value": "epin",
                                    "description": "epin = kod teslim edilir, topup = oyuncu hesabına yükleme yapılır (kod yok, makbuz döner), goldbar = oyun parası (GB); karakter adına oyun içi elle teslim edilir, kod dönmez. Başka değer 400 döner.",
                                    "disabled": true
                                },
                                {
                                    "key": "game",
                                    "value": "pubg-mobile",
                                    "description": "Oyun slug'ı (GET /catalog/games listesinden).",
                                    "disabled": true
                                },
                                {
                                    "key": "category",
                                    "value": "pubg-mobile-uc",
                                    "description": "Alt kategori slug'ı (GET /catalog/games içindeki categories[].category). game ile birlikte ya da tek başına kullanılabilir.",
                                    "disabled": true
                                },
                                {
                                    "key": "q",
                                    "value": "660 UC",
                                    "description": "Ürün, oyun ya da kategori adında arama.",
                                    "disabled": true
                                },
                                {
                                    "key": "inStock",
                                    "value": "1",
                                    "description": "1 gönderilirse yalnız stokta olanlar döner (\"0\", \"false\", \"no\", \"off\" ve boş değer kapalı sayılır).",
                                    "disabled": true
                                },
                                {
                                    "key": "updatedSince",
                                    "value": "",
                                    "description": "HENÜZ UYGULANMIYOR: üründe güncelleme damgası tutulmadığı için tam liste döner ve yanıtta note alanı bunu açıkça söyler. Artımlı senkron için ETag ya da GET /catalog/prices?since= kullanın.",
                                    "disabled": true
                                },
                                {
                                    "key": "cursor",
                                    "value": "1421",
                                    "description": "Önceki yanıttaki nextCursor (son ürün kimliği).",
                                    "disabled": true
                                },
                                {
                                    "key": "limit",
                                    "value": "50",
                                    "description": "Sayfa boyu (1-200).",
                                    "disabled": true
                                }
                            ]
                        },
                        "description": "Bayi fiyatı, liste fiyatı, stok durumu, adet sınırları, zorunlu alan şeması ve teslim tahmini. type=goldbar ürünlerde delivery.mode=manual gelir (kod dönmez, operatör oyun içi teslim eder) ve deliveryNote teslimat yerini yazar. price SİZİN fiyatınızdır (kademe + size özel istisna uygulanmış), listPrice sitedeki perakende fiyat. ETag döner: sonraki istekte If-None-Match ile gönderin, değişmediyse 304 alırsınız ve gövde harcanmaz.\n\nKapsam: catalog:read"
                    },
                    "response": [
                        {
                            "name": "Örnek yanıt (200)",
                            "originalRequest": {
                                "method": "GET",
                                "header": [
                                    {
                                        "key": "If-None-Match",
                                        "value": "",
                                        "description": "Önceki yanıtın ETag değeri.",
                                        "disabled": true
                                    }
                                ],
                                "url": {
                                    "raw": "{{baseUrl}}/catalog/products",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "catalog",
                                        "products"
                                    ],
                                    "query": [
                                        {
                                            "key": "type",
                                            "value": "epin",
                                            "description": "epin = kod teslim edilir, topup = oyuncu hesabına yükleme yapılır (kod yok, makbuz döner), goldbar = oyun parası (GB); karakter adına oyun içi elle teslim edilir, kod dönmez. Başka değer 400 döner.",
                                            "disabled": true
                                        },
                                        {
                                            "key": "game",
                                            "value": "pubg-mobile",
                                            "description": "Oyun slug'ı (GET /catalog/games listesinden).",
                                            "disabled": true
                                        },
                                        {
                                            "key": "category",
                                            "value": "pubg-mobile-uc",
                                            "description": "Alt kategori slug'ı (GET /catalog/games içindeki categories[].category). game ile birlikte ya da tek başına kullanılabilir.",
                                            "disabled": true
                                        },
                                        {
                                            "key": "q",
                                            "value": "660 UC",
                                            "description": "Ürün, oyun ya da kategori adında arama.",
                                            "disabled": true
                                        },
                                        {
                                            "key": "inStock",
                                            "value": "1",
                                            "description": "1 gönderilirse yalnız stokta olanlar döner (\"0\", \"false\", \"no\", \"off\" ve boş değer kapalı sayılır).",
                                            "disabled": true
                                        },
                                        {
                                            "key": "updatedSince",
                                            "value": "",
                                            "description": "HENÜZ UYGULANMIYOR: üründe güncelleme damgası tutulmadığı için tam liste döner ve yanıtta note alanı bunu açıkça söyler. Artımlı senkron için ETag ya da GET /catalog/prices?since= kullanın.",
                                            "disabled": true
                                        },
                                        {
                                            "key": "cursor",
                                            "value": "1421",
                                            "description": "Önceki yanıttaki nextCursor (son ürün kimliği).",
                                            "disabled": true
                                        },
                                        {
                                            "key": "limit",
                                            "value": "50",
                                            "description": "Sayfa boyu (1-200).",
                                            "disabled": true
                                        }
                                    ]
                                },
                                "description": "Bayi fiyatı, liste fiyatı, stok durumu, adet sınırları, zorunlu alan şeması ve teslim tahmini. type=goldbar ürünlerde delivery.mode=manual gelir (kod dönmez, operatör oyun içi teslim eder) ve deliveryNote teslimat yerini yazar. price SİZİN fiyatınızdır (kademe + size özel istisna uygulanmış), listPrice sitedeki perakende fiyat. ETag döner: sonraki istekte If-None-Match ile gönderin, değişmediyse 304 alırsınız ve gövde harcanmaz.\n\nKapsam: catalog:read"
                            },
                            "status": "OK",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": {\n        \"items\": [\n            {\n                \"productId\": 6,\n                \"name\": \"Knight Online 1020 Cash\",\n                \"type\": \"epin\",\n                \"game\": \"knight-online\",\n                \"category\": \"knight-online-cash\",\n                \"region\": null,\n                \"listPrice\": \"105.00\",\n                \"price\": \"98.70\",\n                \"currency\": \"TRY\",\n                \"vatIncluded\": true,\n                \"stock\": {\n                    \"mode\": \"count\",\n                    \"count\": 420\n                },\n                \"limits\": {\n                    \"minQty\": 1,\n                    \"maxQty\": 500\n                },\n                \"requiredFields\": [],\n                \"delivery\": {\n                    \"mode\": \"instant\",\n                    \"etaSeconds\": 5\n                },\n                \"enabled\": true,\n                \"updatedAt\": null\n            },\n            {\n                \"productId\": 1421,\n                \"name\": \"PUBG Mobile 660 UC\",\n                \"type\": \"topup\",\n                \"game\": \"pubg-mobile\",\n                \"category\": \"pubg-mobile-uc\",\n                \"region\": null,\n                \"listPrice\": \"428.90\",\n                \"price\": \"411.50\",\n                \"currency\": \"TRY\",\n                \"vatIncluded\": true,\n                \"stock\": {\n                    \"mode\": \"instant\"\n                },\n                \"limits\": {\n                    \"minQty\": 1,\n                    \"maxQty\": 500\n                },\n                \"requiredFields\": [\n                    {\n                        \"key\": \"playerId\",\n                        \"label\": \"Oyuncu ID\",\n                        \"type\": \"string\",\n                        \"minLength\": 8,\n                        \"maxLength\": 12,\n                        \"required\": true,\n                        \"pattern\": \"^.{8,12}$\",\n                        \"placeholder\": null\n                    }\n                ],\n                \"delivery\": {\n                    \"mode\": \"instant\",\n                    \"etaSeconds\": 30\n                },\n                \"enabled\": true,\n                \"updatedAt\": null\n            }\n        ],\n        \"nextCursor\": \"1421\",\n        \"count\": 2\n    },\n    \"mode\": \"live\",\n    \"requestId\": \"01K3QF6ZC2M9V0X7NB4TDHR8YE\"\n}"
                        }
                    ]
                },
                {
                    "name": "Tek ürün",
                    "request": {
                        "method": "GET",
                        "header": [
                            {
                                "key": "If-None-Match",
                                "value": "",
                                "description": "Önceki yanıtın ETag değeri.",
                                "disabled": true
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/catalog/products/:productId",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "catalog",
                                "products",
                                ":productId"
                            ],
                            "variable": [
                                {
                                    "key": "productId",
                                    "value": "1421"
                                }
                            ]
                        },
                        "description": "Tek ürünün tam görünümü. Ürün başına zorunlu alan ŞEMASI burada yayınlanır: alan anahtarları (playerId, server, zoneId, character...) ürün başlıklarından türetilir. Bot bunları uydurmaz, buradan okur; sıra değil ANAHTAR ADI önemlidir.\n\nKapsam: catalog:read"
                    },
                    "response": [
                        {
                            "name": "Örnek yanıt (200)",
                            "originalRequest": {
                                "method": "GET",
                                "header": [
                                    {
                                        "key": "If-None-Match",
                                        "value": "",
                                        "description": "Önceki yanıtın ETag değeri.",
                                        "disabled": true
                                    }
                                ],
                                "url": {
                                    "raw": "{{baseUrl}}/catalog/products/:productId",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "catalog",
                                        "products",
                                        ":productId"
                                    ],
                                    "variable": [
                                        {
                                            "key": "productId",
                                            "value": "1421"
                                        }
                                    ]
                                },
                                "description": "Tek ürünün tam görünümü. Ürün başına zorunlu alan ŞEMASI burada yayınlanır: alan anahtarları (playerId, server, zoneId, character...) ürün başlıklarından türetilir. Bot bunları uydurmaz, buradan okur; sıra değil ANAHTAR ADI önemlidir.\n\nKapsam: catalog:read"
                            },
                            "status": "OK",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": {\n        \"productId\": 1421,\n        \"name\": \"PUBG Mobile 660 UC\",\n        \"type\": \"topup\",\n        \"game\": \"pubg-mobile\",\n        \"category\": \"pubg-mobile-uc\",\n        \"region\": null,\n        \"listPrice\": \"428.90\",\n        \"price\": \"411.50\",\n        \"currency\": \"TRY\",\n        \"vatIncluded\": true,\n        \"stock\": {\n            \"mode\": \"instant\"\n        },\n        \"limits\": {\n            \"minQty\": 1,\n            \"maxQty\": 500\n        },\n        \"requiredFields\": [\n            {\n                \"key\": \"playerId\",\n                \"label\": \"Oyuncu ID\",\n                \"type\": \"string\",\n                \"minLength\": 8,\n                \"maxLength\": 12,\n                \"required\": true,\n                \"pattern\": \"^.{8,12}$\",\n                \"placeholder\": null\n            }\n        ],\n        \"delivery\": {\n            \"mode\": \"instant\",\n            \"etaSeconds\": 30\n        },\n        \"enabled\": true,\n        \"updatedAt\": null\n    },\n    \"mode\": \"live\",\n    \"requestId\": \"01K3QF6ZC2M9V0X7NB4TDHR8YE\"\n}"
                        }
                    ]
                },
                {
                    "name": "Fiyat/stok dökümü ve delta",
                    "request": {
                        "method": "GET",
                        "header": [
                            {
                                "key": "If-None-Match",
                                "value": "",
                                "description": "Önceki yanıtın ETag değeri.",
                                "disabled": true
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/catalog/prices",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "catalog",
                                "prices"
                            ],
                            "query": [
                                {
                                    "key": "since",
                                    "value": "2026-08-28T09:00:00+03:00",
                                    "description": "Bu andan sonra değişen ürünler. Okunamayan değerde tam liste + note döner.",
                                    "disabled": true
                                },
                                {
                                    "key": "cursor",
                                    "value": "",
                                    "description": "Önceki yanıttaki nextCursor.",
                                    "disabled": true
                                },
                                {
                                    "key": "limit",
                                    "value": "200",
                                    "description": "Sayfa boyu (1-200).",
                                    "disabled": true
                                }
                            ]
                        },
                        "description": "Ürün listesinin hafif sürümü: yalnız productId, fiyat, stok, satışta mı. Fiyat senkronu yapan botlar için. ?since verilirse GERÇEK DELTA döner (o tarihten sonra fiyatı/stoğu/durumu değişen ürünler, her satırda gerçek updatedAt). Anlık görüntü henüz oluşmamış bir hesapta süzgeç UYGULANMAZ: tam liste + uyarı notu döner, çünkü boş liste botun \"değişim yok\" sanıp fiyat senkronunu hiç yapmaması demek olurdu.\n\nKapsam: catalog:read"
                    },
                    "response": [
                        {
                            "name": "Örnek yanıt (200)",
                            "originalRequest": {
                                "method": "GET",
                                "header": [
                                    {
                                        "key": "If-None-Match",
                                        "value": "",
                                        "description": "Önceki yanıtın ETag değeri.",
                                        "disabled": true
                                    }
                                ],
                                "url": {
                                    "raw": "{{baseUrl}}/catalog/prices",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "catalog",
                                        "prices"
                                    ],
                                    "query": [
                                        {
                                            "key": "since",
                                            "value": "2026-08-28T09:00:00+03:00",
                                            "description": "Bu andan sonra değişen ürünler. Okunamayan değerde tam liste + note döner.",
                                            "disabled": true
                                        },
                                        {
                                            "key": "cursor",
                                            "value": "",
                                            "description": "Önceki yanıttaki nextCursor.",
                                            "disabled": true
                                        },
                                        {
                                            "key": "limit",
                                            "value": "200",
                                            "description": "Sayfa boyu (1-200).",
                                            "disabled": true
                                        }
                                    ]
                                },
                                "description": "Ürün listesinin hafif sürümü: yalnız productId, fiyat, stok, satışta mı. Fiyat senkronu yapan botlar için. ?since verilirse GERÇEK DELTA döner (o tarihten sonra fiyatı/stoğu/durumu değişen ürünler, her satırda gerçek updatedAt). Anlık görüntü henüz oluşmamış bir hesapta süzgeç UYGULANMAZ: tam liste + uyarı notu döner, çünkü boş liste botun \"değişim yok\" sanıp fiyat senkronunu hiç yapmaması demek olurdu.\n\nKapsam: catalog:read"
                            },
                            "status": "OK",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": {\n        \"items\": [\n            {\n                \"productId\": 6,\n                \"listPrice\": \"105.00\",\n                \"price\": \"96.20\",\n                \"currency\": \"TRY\",\n                \"stock\": {\n                    \"mode\": \"count\",\n                    \"count\": 418\n                },\n                \"enabled\": true,\n                \"updatedAt\": \"2026-08-28T14:30:00+03:00\"\n            }\n        ],\n        \"nextCursor\": null,\n        \"count\": 1,\n        \"asOf\": \"2026-08-28T14:35:00+03:00\"\n    },\n    \"mode\": \"live\",\n    \"requestId\": \"01K3QF6ZC2M9V0X7NB4TDHR8YE\"\n}"
                        }
                    ]
                }
            ]
        },
        {
            "name": "Hesap doğrulama",
            "description": "Top-up ürünlerinde oyuncu bilgisini yüklemeden ÖNCE sorun.",
            "item": [
                {
                    "name": "Oyuncu bilgisini önceden doğrula",
                    "request": {
                        "method": "POST",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/orders/validate",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "orders",
                                "validate"
                            ]
                        },
                        "description": "Top-up ürünlerinde oyuncu bilgisini tedarikçiye ÖNCEDEN sorar; para düşmez. supported=false ise üründe önceden doğrulama yoktur (sipariş vermeyi engellemez). valid=null \"şu an kontrol edilemedi\" demektir: teknik hata satışı ENGELLEMEZ, aynı kontrol sipariş sırasında çekirdekte tekrar çalışır. Yanıtta requiredFields şeması da döner, böylece hangi alanları göndereceğinizi tek istekte öğrenirsiniz.\n\nKapsam: orders:write",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"productId\": 1421,\n    \"fields\": {\n        \"playerId\": \"5123456789\",\n        \"server\": \"7012\"\n    }\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": [
                        {
                            "name": "Örnek yanıt (200)",
                            "originalRequest": {
                                "method": "POST",
                                "header": [
                                    {
                                        "key": "Content-Type",
                                        "value": "application/json"
                                    }
                                ],
                                "url": {
                                    "raw": "{{baseUrl}}/orders/validate",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "orders",
                                        "validate"
                                    ]
                                },
                                "description": "Top-up ürünlerinde oyuncu bilgisini tedarikçiye ÖNCEDEN sorar; para düşmez. supported=false ise üründe önceden doğrulama yoktur (sipariş vermeyi engellemez). valid=null \"şu an kontrol edilemedi\" demektir: teknik hata satışı ENGELLEMEZ, aynı kontrol sipariş sırasında çekirdekte tekrar çalışır. Yanıtta requiredFields şeması da döner, böylece hangi alanları göndereceğinizi tek istekte öğrenirsiniz.\n\nKapsam: orders:write",
                                "body": {
                                    "mode": "raw",
                                    "raw": "{\n    \"productId\": 1421,\n    \"fields\": {\n        \"playerId\": \"5123456789\",\n        \"server\": \"7012\"\n    }\n}",
                                    "options": {
                                        "raw": {
                                            "language": "json"
                                        }
                                    }
                                }
                            },
                            "status": "OK",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": {\n        \"supported\": true,\n        \"valid\": true,\n        \"nickname\": \"OyuncuAdi\",\n        \"validUntil\": \"2026-08-28T14:10:00+03:00\",\n        \"requiredFields\": [\n            {\n                \"key\": \"playerId\",\n                \"label\": \"Oyuncu ID\",\n                \"type\": \"string\",\n                \"minLength\": 8,\n                \"maxLength\": 12,\n                \"validate\": true\n            }\n        ],\n        \"message\": null\n    },\n    \"mode\": \"live\",\n    \"requestId\": \"01K3QF6ZC2M9V0X7NB4TDHR8YE\"\n}"
                        }
                    ]
                }
            ]
        },
        {
            "name": "Sipariş",
            "description": "Sipariş verme, okuma ve bekleyen kalem iptali. Panel ile API AYNI çekirdeği kullanır: iki kanal hiçbir zaman farklı fiyat/stok/hata göstermez.",
            "item": [
                {
                    "name": "Sipariş ver",
                    "request": {
                        "method": "POST",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            },
                            {
                                "key": "Idempotency-Key",
                                "value": "SIP-2026-0001-1",
                                "description": "Sizin benzersiz referansınız, en fazla 64 karakter. Her YENİ sipariş için yeni anahtar üretin. Anahtar 24 saat hatırlanır.",
                                "disabled": false
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/orders",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "orders"
                            ]
                        },
                        "description": "Sipariş verir; tutar bakiyeden düşer. Idempotency-Key başlığı ZORUNLUDUR. Tek istekte en fazla 50 kalem. expectedPrice gönderilirse fiyat değişmişse sipariş VERİLMEZ (PRICE_CHANGED). waitForStock=false ise stok yetmiyorsa hiç başlamaz. Yanıt 201 (sonuç kesin) ya da 202 (teslimat sürüyor). Aynı anahtarla tekrar denerseniz aynı yanıt + Idempotent-Replayed: true başlığı döner, YENİ SİPARİŞ OLUŞMAZ; ağ koptuğunda tekrar göndermek güvenlidir.\n\nKapsam: orders:write",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"externalRef\": \"SIP-2026-0001\",\n    \"waitForStock\": true,\n    \"items\": [\n        {\n            \"productId\": 6,\n            \"quantity\": 2,\n            \"expectedPrice\": \"98.70\"\n        },\n        {\n            \"productId\": 1421,\n            \"quantity\": 1,\n            \"fields\": {\n                \"playerId\": \"5123456789\"\n            }\n        }\n    ]\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": [
                        {
                            "name": "Örnek yanıt (201)",
                            "originalRequest": {
                                "method": "POST",
                                "header": [
                                    {
                                        "key": "Content-Type",
                                        "value": "application/json"
                                    },
                                    {
                                        "key": "Idempotency-Key",
                                        "value": "SIP-2026-0001-1",
                                        "description": "Sizin benzersiz referansınız, en fazla 64 karakter. Her YENİ sipariş için yeni anahtar üretin. Anahtar 24 saat hatırlanır.",
                                        "disabled": false
                                    }
                                ],
                                "url": {
                                    "raw": "{{baseUrl}}/orders",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "orders"
                                    ]
                                },
                                "description": "Sipariş verir; tutar bakiyeden düşer. Idempotency-Key başlığı ZORUNLUDUR. Tek istekte en fazla 50 kalem. expectedPrice gönderilirse fiyat değişmişse sipariş VERİLMEZ (PRICE_CHANGED). waitForStock=false ise stok yetmiyorsa hiç başlamaz. Yanıt 201 (sonuç kesin) ya da 202 (teslimat sürüyor). Aynı anahtarla tekrar denerseniz aynı yanıt + Idempotent-Replayed: true başlığı döner, YENİ SİPARİŞ OLUŞMAZ; ağ koptuğunda tekrar göndermek güvenlidir.\n\nKapsam: orders:write",
                                "body": {
                                    "mode": "raw",
                                    "raw": "{\n    \"externalRef\": \"SIP-2026-0001\",\n    \"waitForStock\": true,\n    \"items\": [\n        {\n            \"productId\": 6,\n            \"quantity\": 2,\n            \"expectedPrice\": \"98.70\"\n        },\n        {\n            \"productId\": 1421,\n            \"quantity\": 1,\n            \"fields\": {\n                \"playerId\": \"5123456789\"\n            }\n        }\n    ]\n}",
                                    "options": {
                                        "raw": {
                                            "language": "json"
                                        }
                                    }
                                }
                            },
                            "status": "OK",
                            "code": 201,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": {\n        \"orderId\": 184213,\n        \"externalRef\": \"SIP-2026-0001\",\n        \"channel\": \"dealer-api\",\n        \"status\": \"delivered\",\n        \"mode\": \"live\",\n        \"total\": \"608.90\",\n        \"balanceAfter\": \"47641.10\",\n        \"createdAt\": \"2026-08-28T14:05:00+03:00\",\n        \"items\": [\n            {\n                \"itemId\": \"184213-1\",\n                \"productId\": 6,\n                \"name\": \"Knight Online 1020 Cash\",\n                \"quantity\": 2,\n                \"unitPrice\": \"98.70\",\n                \"status\": \"delivered\",\n                \"codes\": [\n                    {\n                        \"code\": \"KO10-2XQ4-9WPA\",\n                        \"serial\": null,\n                        \"expiresAt\": null\n                    },\n                    {\n                        \"code\": \"KO10-7MTB-3VZC\",\n                        \"serial\": null,\n                        \"expiresAt\": null\n                    }\n                ],\n                \"receipt\": null,\n                \"failCode\": null,\n                \"failReason\": null\n            },\n            {\n                \"itemId\": \"184213-2\",\n                \"productId\": 1421,\n                \"name\": \"PUBG Mobile 660 UC\",\n                \"quantity\": 1,\n                \"unitPrice\": \"411.50\",\n                \"status\": \"delivered\",\n                \"codes\": [],\n                \"receipt\": \"TOPUP-9F31A2\",\n                \"failCode\": null,\n                \"failReason\": null\n            }\n        ]\n    },\n    \"mode\": \"live\",\n    \"requestId\": \"01K3QF6ZC2M9V0X7NB4TDHR8YE\"\n}"
                        }
                    ]
                },
                {
                    "name": "Sipariş detayı ve kodlar",
                    "request": {
                        "method": "GET",
                        "header": [],
                        "url": {
                            "raw": "{{baseUrl}}/orders/:orderId",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "orders",
                                ":orderId"
                            ],
                            "variable": [
                                {
                                    "key": "orderId",
                                    "value": "184213"
                                }
                            ]
                        },
                        "description": "Sipariş detayı + teslim edilen kodlar. Kodlar YALNIZ bu uçta ve sipariş yanıtında döner; webhook gövdesinde asla gönderilmez. Test modunda verilen siparişlerin kimliği \"test_12\" biçimindedir ve aynı uçtan okunur. Başka bayinin siparişi 404 döner.\n\nKapsam: orders:read"
                    },
                    "response": [
                        {
                            "name": "Örnek yanıt (200)",
                            "originalRequest": {
                                "method": "GET",
                                "header": [],
                                "url": {
                                    "raw": "{{baseUrl}}/orders/:orderId",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "orders",
                                        ":orderId"
                                    ],
                                    "variable": [
                                        {
                                            "key": "orderId",
                                            "value": "184213"
                                        }
                                    ]
                                },
                                "description": "Sipariş detayı + teslim edilen kodlar. Kodlar YALNIZ bu uçta ve sipariş yanıtında döner; webhook gövdesinde asla gönderilmez. Test modunda verilen siparişlerin kimliği \"test_12\" biçimindedir ve aynı uçtan okunur. Başka bayinin siparişi 404 döner.\n\nKapsam: orders:read"
                            },
                            "status": "OK",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": {\n        \"orderId\": 184213,\n        \"externalRef\": \"SIP-2026-0001\",\n        \"channel\": \"dealer-api\",\n        \"status\": \"partially_delivered\",\n        \"mode\": \"live\",\n        \"total\": \"608.90\",\n        \"balanceAfter\": \"47641.10\",\n        \"createdAt\": \"2026-08-28T14:05:00+03:00\",\n        \"items\": [\n            {\n                \"itemId\": \"184213-1\",\n                \"productId\": 6,\n                \"name\": \"Knight Online 1020 Cash\",\n                \"quantity\": 2,\n                \"unitPrice\": \"98.70\",\n                \"status\": \"delivered\",\n                \"codes\": [\n                    {\n                        \"code\": \"KO10-2XQ4-9WPA\",\n                        \"serial\": null,\n                        \"expiresAt\": null\n                    }\n                ],\n                \"receipt\": null,\n                \"failCode\": null,\n                \"failReason\": null\n            },\n            {\n                \"itemId\": \"184213-2\",\n                \"productId\": 1421,\n                \"name\": \"PUBG Mobile 660 UC\",\n                \"quantity\": 1,\n                \"unitPrice\": \"411.50\",\n                \"status\": \"failed\",\n                \"codes\": [],\n                \"receipt\": null,\n                \"failCode\": \"TIMEOUT\",\n                \"failReason\": \"ZAMAN_ASIMI: stok 15 dk icinde saglanamadi\"\n            }\n        ]\n    },\n    \"mode\": \"live\",\n    \"requestId\": \"01K3QF6ZC2M9V0X7NB4TDHR8YE\"\n}"
                        }
                    ]
                },
                {
                    "name": "Kendi referansınızla sipariş bul",
                    "request": {
                        "method": "GET",
                        "header": [],
                        "url": {
                            "raw": "{{baseUrl}}/orders/by-ref/:externalRef",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "orders",
                                "by-ref",
                                ":externalRef"
                            ],
                            "variable": [
                                {
                                    "key": "externalRef",
                                    "value": "SIP-2026-0001"
                                }
                            ]
                        },
                        "description": "Bayinin kendi referansıyla sipariş bulur (aynı referansla birden fazla kayıt varsa EN SON kayıt). Ağ hatasından sonra \"sipariş düştü mü\" sorusunun en hızlı yanıtı budur. Test siparişleri de bu uçtan bulunur.\n\nKapsam: orders:read"
                    },
                    "response": [
                        {
                            "name": "Örnek yanıt (200)",
                            "originalRequest": {
                                "method": "GET",
                                "header": [],
                                "url": {
                                    "raw": "{{baseUrl}}/orders/by-ref/:externalRef",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "orders",
                                        "by-ref",
                                        ":externalRef"
                                    ],
                                    "variable": [
                                        {
                                            "key": "externalRef",
                                            "value": "SIP-2026-0001"
                                        }
                                    ]
                                },
                                "description": "Bayinin kendi referansıyla sipariş bulur (aynı referansla birden fazla kayıt varsa EN SON kayıt). Ağ hatasından sonra \"sipariş düştü mü\" sorusunun en hızlı yanıtı budur. Test siparişleri de bu uçtan bulunur.\n\nKapsam: orders:read"
                            },
                            "status": "OK",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": {\n        \"orderId\": 184213,\n        \"externalRef\": \"SIP-2026-0001\",\n        \"channel\": \"dealer-api\",\n        \"status\": \"delivered\",\n        \"mode\": \"live\",\n        \"total\": \"608.90\",\n        \"balanceAfter\": \"47641.10\",\n        \"createdAt\": \"2026-08-28T14:05:00+03:00\",\n        \"items\": []\n    },\n    \"mode\": \"live\",\n    \"requestId\": \"01K3QF6ZC2M9V0X7NB4TDHR8YE\"\n}"
                        }
                    ]
                },
                {
                    "name": "Sipariş listesi (imleçli)",
                    "request": {
                        "method": "GET",
                        "header": [],
                        "url": {
                            "raw": "{{baseUrl}}/orders",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "orders"
                            ],
                            "query": [
                                {
                                    "key": "from",
                                    "value": "2026-08-01",
                                    "description": "Başlangıç tarihi (dahil).",
                                    "disabled": true
                                },
                                {
                                    "key": "to",
                                    "value": "2026-08-28",
                                    "description": "Bitiş tarihi (dahil).",
                                    "disabled": true
                                },
                                {
                                    "key": "status",
                                    "value": "processing",
                                    "description": "Durum süzgeci. Geçersiz değer 400 döner (sessizce yok sayılmaz).",
                                    "disabled": true
                                },
                                {
                                    "key": "channel",
                                    "value": "dealer-api",
                                    "description": "Kanal süzgeci. Boş bırakılırsa iki kanal birlikte döner.",
                                    "disabled": true
                                },
                                {
                                    "key": "productId",
                                    "value": "6",
                                    "description": "Yalnız dönen sayfa içinde süzer; sonraki sayfalar için nextCursor ile devam edin.",
                                    "disabled": true
                                },
                                {
                                    "key": "cursor",
                                    "value": "",
                                    "description": "Önceki yanıttaki nextCursor (son sipariş numarası).",
                                    "disabled": true
                                },
                                {
                                    "key": "limit",
                                    "value": "25",
                                    "description": "Sayfa boyu (1-100).",
                                    "disabled": true
                                }
                            ]
                        },
                        "description": "Bayinin siparişleri; panel ve API siparişleri aynı listede (ikisi aynı caridir), channel ile ayrılabilir. productId süzgeci YALNIZ DÖNEN SAYFAYA uygulanır: sipariş içeriği JSON anlık görüntü içinde durduğu için SQL ile aranamaz. Bu durumda yanıtta note alanı çıkar; bot \"ürün yok\" sanmasın diye susmuyoruz.\n\nKapsam: orders:read"
                    },
                    "response": [
                        {
                            "name": "Örnek yanıt (200)",
                            "originalRequest": {
                                "method": "GET",
                                "header": [],
                                "url": {
                                    "raw": "{{baseUrl}}/orders",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "orders"
                                    ],
                                    "query": [
                                        {
                                            "key": "from",
                                            "value": "2026-08-01",
                                            "description": "Başlangıç tarihi (dahil).",
                                            "disabled": true
                                        },
                                        {
                                            "key": "to",
                                            "value": "2026-08-28",
                                            "description": "Bitiş tarihi (dahil).",
                                            "disabled": true
                                        },
                                        {
                                            "key": "status",
                                            "value": "processing",
                                            "description": "Durum süzgeci. Geçersiz değer 400 döner (sessizce yok sayılmaz).",
                                            "disabled": true
                                        },
                                        {
                                            "key": "channel",
                                            "value": "dealer-api",
                                            "description": "Kanal süzgeci. Boş bırakılırsa iki kanal birlikte döner.",
                                            "disabled": true
                                        },
                                        {
                                            "key": "productId",
                                            "value": "6",
                                            "description": "Yalnız dönen sayfa içinde süzer; sonraki sayfalar için nextCursor ile devam edin.",
                                            "disabled": true
                                        },
                                        {
                                            "key": "cursor",
                                            "value": "",
                                            "description": "Önceki yanıttaki nextCursor (son sipariş numarası).",
                                            "disabled": true
                                        },
                                        {
                                            "key": "limit",
                                            "value": "25",
                                            "description": "Sayfa boyu (1-100).",
                                            "disabled": true
                                        }
                                    ]
                                },
                                "description": "Bayinin siparişleri; panel ve API siparişleri aynı listede (ikisi aynı caridir), channel ile ayrılabilir. productId süzgeci YALNIZ DÖNEN SAYFAYA uygulanır: sipariş içeriği JSON anlık görüntü içinde durduğu için SQL ile aranamaz. Bu durumda yanıtta note alanı çıkar; bot \"ürün yok\" sanmasın diye susmuyoruz.\n\nKapsam: orders:read"
                            },
                            "status": "OK",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": {\n        \"items\": [\n            {\n                \"orderId\": 184213,\n                \"externalRef\": \"SIP-2026-0001\",\n                \"channel\": \"dealer-api\",\n                \"status\": \"delivered\",\n                \"mode\": \"live\",\n                \"total\": \"608.90\",\n                \"balanceAfter\": \"47641.10\",\n                \"createdAt\": \"2026-08-28T14:05:00+03:00\",\n                \"items\": [\n                    {\n                        \"itemId\": \"184213-1\",\n                        \"productId\": 6,\n                        \"name\": \"Knight Online 1020 Cash\",\n                        \"quantity\": 2,\n                        \"unitPrice\": \"98.70\",\n                        \"status\": \"delivered\",\n                        \"codes\": [],\n                        \"receipt\": null,\n                        \"failCode\": null,\n                        \"failReason\": null\n                    }\n                ]\n            }\n        ],\n        \"nextCursor\": \"184213\",\n        \"count\": 1\n    },\n    \"mode\": \"live\",\n    \"requestId\": \"01K3QF6ZC2M9V0X7NB4TDHR8YE\"\n}"
                        }
                    ]
                },
                {
                    "name": "Bekleyen kalemleri iptal et",
                    "request": {
                        "method": "POST",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/orders/:orderId/cancel",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "orders",
                                ":orderId",
                                "cancel"
                            ],
                            "variable": [
                                {
                                    "key": "orderId",
                                    "value": "184219"
                                }
                            ]
                        },
                        "description": "Yalnız BEKLEYEN (processing) kalemleri iptal eder ve tutarı iade alır. Teslim edilmiş kaleme dokunulmaz: kod sizde, kullanılmamış kod iadesi destek kararıdır. İade ve muhasebe işini kanonik teslimat yolu yapar, bu uç ayrı bir iade yolu açmaz. GB (oyun parası) kalemi bu uçtan iptal EDİLEMEZ (NOT_CANCELLABLE): teslimat elle yapıldığı için iade de elle yapılır, destek ekibine yazın.\n\nKapsam: orders:write",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"reason\": \"Müşteri vazgeçti\"\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": [
                        {
                            "name": "Örnek yanıt (200)",
                            "originalRequest": {
                                "method": "POST",
                                "header": [
                                    {
                                        "key": "Content-Type",
                                        "value": "application/json"
                                    }
                                ],
                                "url": {
                                    "raw": "{{baseUrl}}/orders/:orderId/cancel",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "orders",
                                        ":orderId",
                                        "cancel"
                                    ],
                                    "variable": [
                                        {
                                            "key": "orderId",
                                            "value": "184219"
                                        }
                                    ]
                                },
                                "description": "Yalnız BEKLEYEN (processing) kalemleri iptal eder ve tutarı iade alır. Teslim edilmiş kaleme dokunulmaz: kod sizde, kullanılmamış kod iadesi destek kararıdır. İade ve muhasebe işini kanonik teslimat yolu yapar, bu uç ayrı bir iade yolu açmaz. GB (oyun parası) kalemi bu uçtan iptal EDİLEMEZ (NOT_CANCELLABLE): teslimat elle yapıldığı için iade de elle yapılır, destek ekibine yazın.\n\nKapsam: orders:write",
                                "body": {
                                    "mode": "raw",
                                    "raw": "{\n    \"reason\": \"Müşteri vazgeçti\"\n}",
                                    "options": {
                                        "raw": {
                                            "language": "json"
                                        }
                                    }
                                }
                            },
                            "status": "OK",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": {\n        \"orderId\": 184219,\n        \"externalRef\": \"SIP-2026-0007\",\n        \"channel\": \"dealer-api\",\n        \"status\": \"cancelled\",\n        \"mode\": \"live\",\n        \"total\": \"41.90\",\n        \"balanceAfter\": \"48250.00\",\n        \"createdAt\": \"2026-08-28T14:20:00+03:00\",\n        \"items\": [\n            {\n                \"itemId\": \"184219-1\",\n                \"productId\": 1421,\n                \"name\": \"PUBG Mobile 660 UC\",\n                \"quantity\": 1,\n                \"unitPrice\": \"41.90\",\n                \"status\": \"cancelled\",\n                \"codes\": [],\n                \"receipt\": null,\n                \"failCode\": \"CANCELLED\",\n                \"failReason\": \"Müşteri vazgeçti\"\n            }\n        ]\n    },\n    \"mode\": \"live\",\n    \"requestId\": \"01K3QF6ZC2M9V0X7NB4TDHR8YE\"\n}"
                        }
                    ]
                }
            ]
        },
        {
            "name": "Raporlar",
            "description": "Ekstre ve fatura. Panel ekstresi, API ekstresi ve fatura AYNI rakamları verir.",
            "item": [
                {
                    "name": "Dönem ekstresi (json/csv)",
                    "request": {
                        "method": "GET",
                        "header": [],
                        "url": {
                            "raw": "{{baseUrl}}/reports/statement",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "reports",
                                "statement"
                            ],
                            "query": [
                                {
                                    "key": "from",
                                    "value": "2026-08-01",
                                    "description": "Başlangıç tarihi. Boşsa içinde bulunulan ayın 1'i.",
                                    "disabled": true
                                },
                                {
                                    "key": "to",
                                    "value": "2026-08-28",
                                    "description": "Bitiş tarihi. from > to ise 400 döner.",
                                    "disabled": true
                                },
                                {
                                    "key": "format",
                                    "value": "json",
                                    "description": "csv seçilirse dosya indirmesi döner (text/csv).",
                                    "disabled": true
                                }
                            ]
                        },
                        "description": "Açılış bakiyesi, yükleme/sipariş/iade toplamları, kapanış bakiyesi ve hareket satırları. format=csv doğrudan muhasebe programına verilebilecek dosya döner (BOM ile, noktalı virgül ayırıcı, zarf YOK). Dönemde 5000 satır tavanına ulaşılırsa yanıtta note çıkar; aralığı daraltın.\n\nKapsam: balance:read"
                    },
                    "response": [
                        {
                            "name": "Örnek yanıt (200)",
                            "originalRequest": {
                                "method": "GET",
                                "header": [],
                                "url": {
                                    "raw": "{{baseUrl}}/reports/statement",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "reports",
                                        "statement"
                                    ],
                                    "query": [
                                        {
                                            "key": "from",
                                            "value": "2026-08-01",
                                            "description": "Başlangıç tarihi. Boşsa içinde bulunulan ayın 1'i.",
                                            "disabled": true
                                        },
                                        {
                                            "key": "to",
                                            "value": "2026-08-28",
                                            "description": "Bitiş tarihi. from > to ise 400 döner.",
                                            "disabled": true
                                        },
                                        {
                                            "key": "format",
                                            "value": "json",
                                            "description": "csv seçilirse dosya indirmesi döner (text/csv).",
                                            "disabled": true
                                        }
                                    ]
                                },
                                "description": "Açılış bakiyesi, yükleme/sipariş/iade toplamları, kapanış bakiyesi ve hareket satırları. format=csv doğrudan muhasebe programına verilebilecek dosya döner (BOM ile, noktalı virgül ayırıcı, zarf YOK). Dönemde 5000 satır tavanına ulaşılırsa yanıtta note çıkar; aralığı daraltın.\n\nKapsam: balance:read"
                            },
                            "status": "OK",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": {\n        \"from\": \"2026-08-01\",\n        \"to\": \"2026-08-28\",\n        \"currency\": \"TRY\",\n        \"openingBalance\": \"12500.00\",\n        \"deposits\": \"75000.00\",\n        \"orders\": \"39250.00\",\n        \"refunds\": \"0.00\",\n        \"other\": \"0.00\",\n        \"closingBalance\": \"48250.00\",\n        \"count\": 2,\n        \"items\": [\n            {\n                \"id\": 3012301,\n                \"date\": \"2026-08-28T09:12:00+03:00\",\n                \"typeId\": 2,\n                \"amount\": \"25000.00\",\n                \"balanceAfter\": \"48250.00\",\n                \"orderId\": null,\n                \"description\": \"Havale\"\n            },\n            {\n                \"id\": 3012402,\n                \"date\": \"2026-08-28T14:05:00+03:00\",\n                \"typeId\": 1,\n                \"amount\": \"-608.90\",\n                \"balanceAfter\": \"47641.10\",\n                \"orderId\": 184213,\n                \"description\": \"Sipariş ödemesi\"\n            }\n        ]\n    },\n    \"mode\": \"live\",\n    \"requestId\": \"01K3QF6ZC2M9V0X7NB4TDHR8YE\"\n}"
                        }
                    ]
                },
                {
                    "name": "Fatura listesi",
                    "request": {
                        "method": "GET",
                        "header": [],
                        "url": {
                            "raw": "{{baseUrl}}/invoices",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "invoices"
                            ],
                            "query": [
                                {
                                    "key": "from",
                                    "value": "2026-08-01",
                                    "description": "Başlangıç tarihi (dahil).",
                                    "disabled": true
                                },
                                {
                                    "key": "to",
                                    "value": "2026-08-28",
                                    "description": "Bitiş tarihi (dahil).",
                                    "disabled": true
                                }
                            ]
                        },
                        "description": "Kesilen faturalar: numara, tarih, tutar, KDV ve panel adresi. PDF/UBL indirme bağlantısı henüz API üzerinden VERİLMİYOR (pdfUrl null): sitedeki fatura görüntüleme ucu oturumlu, imzalı ve süresi kısıtlı bir indirme bağlantısı üretmek yeni bir yetkilendirme yüzeyi açmak demek ve bu sürümün kapsamında değil. Belge panelUrl adresinden görüntülenir.\n\nKapsam: balance:read"
                    },
                    "response": [
                        {
                            "name": "Örnek yanıt (200)",
                            "originalRequest": {
                                "method": "GET",
                                "header": [],
                                "url": {
                                    "raw": "{{baseUrl}}/invoices",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "invoices"
                                    ],
                                    "query": [
                                        {
                                            "key": "from",
                                            "value": "2026-08-01",
                                            "description": "Başlangıç tarihi (dahil).",
                                            "disabled": true
                                        },
                                        {
                                            "key": "to",
                                            "value": "2026-08-28",
                                            "description": "Bitiş tarihi (dahil).",
                                            "disabled": true
                                        }
                                    ]
                                },
                                "description": "Kesilen faturalar: numara, tarih, tutar, KDV ve panel adresi. PDF/UBL indirme bağlantısı henüz API üzerinden VERİLMİYOR (pdfUrl null): sitedeki fatura görüntüleme ucu oturumlu, imzalı ve süresi kısıtlı bir indirme bağlantısı üretmek yeni bir yetkilendirme yüzeyi açmak demek ve bu sürümün kapsamında değil. Belge panelUrl adresinden görüntülenir.\n\nKapsam: balance:read"
                            },
                            "status": "OK",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": {\n        \"items\": [\n            {\n                \"invoiceId\": 90124,\n                \"number\": \"OYN2026000012345\",\n                \"numbers\": [\n                    \"OYN2026000012345\"\n                ],\n                \"date\": \"2026-08-01T10:00:00+03:00\",\n                \"type\": \"satis\",\n                \"orderNo\": \"184213\",\n                \"total\": \"608.90\",\n                \"vat\": \"0.00\",\n                \"currency\": \"TRY\",\n                \"pdfUrl\": null,\n                \"panelUrl\": \"/faturalarim/90124\"\n            }\n        ],\n        \"count\": 1,\n        \"note\": \"PDF indirme baglantisi henuz API uzerinden verilmiyor; belge panelUrl adresinden (oturumlu) goruntulenir.\"\n    },\n    \"mode\": \"live\",\n    \"requestId\": \"01K3QF6ZC2M9V0X7NB4TDHR8YE\"\n}"
                        }
                    ]
                }
            ]
        },
        {
            "name": "Webhook'lar",
            "description": "Yoklamayı (polling) bırakın: sipariş sonucu, fiyat değişimi ve bakiye yüklemesi imzalı olay olarak size gelir. Bayi başına TEK adres olduğu için PUT /webhooks bir \"upsert\"tir.",
            "item": [
                {
                    "name": "Abonelik durumu",
                    "request": {
                        "method": "GET",
                        "header": [],
                        "url": {
                            "raw": "{{baseUrl}}/webhooks",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "webhooks"
                            ]
                        },
                        "description": "Adres, abone olunan olaylar, durum (active|suspended), son başarı/hata damgası, üst üste hata sayacı ve MASKELENMİŞ imza sırrı. Ham sır BU UÇTA DÖNMEZ: jetonu okuyabilen biri sırrı da okuyabilseydi imzanın anlamı kalmazdı. Yanıtta abone olunabilecek olayların katalogu da döner.\n\nKapsam: webhooks:manage"
                    },
                    "response": [
                        {
                            "name": "Örnek yanıt (200)",
                            "originalRequest": {
                                "method": "GET",
                                "header": [],
                                "url": {
                                    "raw": "{{baseUrl}}/webhooks",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "webhooks"
                                    ]
                                },
                                "description": "Adres, abone olunan olaylar, durum (active|suspended), son başarı/hata damgası, üst üste hata sayacı ve MASKELENMİŞ imza sırrı. Ham sır BU UÇTA DÖNMEZ: jetonu okuyabilen biri sırrı da okuyabilseydi imzanın anlamı kalmazdı. Yanıtta abone olunabilecek olayların katalogu da döner.\n\nKapsam: webhooks:manage"
                            },
                            "status": "OK",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": {\n        \"configured\": true,\n        \"webhook\": {\n            \"id\": 214,\n            \"url\": \"https://bayi.example.com/oyuneks-hook\",\n            \"events\": [\n                \"order.delivered\",\n                \"order.failed\",\n                \"price.changed\",\n                \"balance.low\"\n            ],\n            \"status\": \"active\",\n            \"secretMasked\": \"whsec_a91f3c********9d0e\",\n            \"failStreak\": 0,\n            \"lastSuccessAt\": \"2026-08-28T14:05:00+03:00\",\n            \"lastFailureAt\": null\n        },\n        \"availableEvents\": {\n            \"order.delivered\": \"Siparis teslim edildi (kismi teslim de bu olayla gelir)\"\n        }\n    },\n    \"mode\": \"live\",\n    \"requestId\": \"01K3QF6ZC2M9V0X7NB4TDHR8YE\"\n}"
                        }
                    ]
                },
                {
                    "name": "Gönderim kaydı (imleçli)",
                    "request": {
                        "method": "GET",
                        "header": [],
                        "url": {
                            "raw": "{{baseUrl}}/webhooks/deliveries",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "webhooks",
                                "deliveries"
                            ],
                            "query": [
                                {
                                    "key": "cursor",
                                    "value": "",
                                    "description": "Önceki yanıttaki nextCursor.",
                                    "disabled": true
                                },
                                {
                                    "key": "limit",
                                    "value": "50",
                                    "description": "Sayfa boyu (1-200).",
                                    "disabled": true
                                }
                            ]
                        },
                        "description": "Olay adı, kanal (webhook|email), durum (pending|sent|dead), deneme sayısı, HTTP kodu, süre ve hata metni. Olay GÖVDESİ döndürülmez; gövdeyi ikinci bir yerden yayınlamak gereksiz yüzey olurdu. Yeniden gönderim şu an yalnız Bayi Panelinden yapılır. Yanıtta yeniden deneme tablosu da döner.\n\nKapsam: webhooks:manage"
                    },
                    "response": [
                        {
                            "name": "Örnek yanıt (200)",
                            "originalRequest": {
                                "method": "GET",
                                "header": [],
                                "url": {
                                    "raw": "{{baseUrl}}/webhooks/deliveries",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "webhooks",
                                        "deliveries"
                                    ],
                                    "query": [
                                        {
                                            "key": "cursor",
                                            "value": "",
                                            "description": "Önceki yanıttaki nextCursor.",
                                            "disabled": true
                                        },
                                        {
                                            "key": "limit",
                                            "value": "50",
                                            "description": "Sayfa boyu (1-200).",
                                            "disabled": true
                                        }
                                    ]
                                },
                                "description": "Olay adı, kanal (webhook|email), durum (pending|sent|dead), deneme sayısı, HTTP kodu, süre ve hata metni. Olay GÖVDESİ döndürülmez; gövdeyi ikinci bir yerden yayınlamak gereksiz yüzey olurdu. Yeniden gönderim şu an yalnız Bayi Panelinden yapılır. Yanıtta yeniden deneme tablosu da döner.\n\nKapsam: webhooks:manage"
                            },
                            "status": "OK",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": {\n        \"items\": [\n            {\n                \"id\": 9214,\n                \"eventId\": \"evt_o184213_d\",\n                \"type\": \"order.delivered\",\n                \"channel\": \"webhook\",\n                \"mode\": \"live\",\n                \"status\": \"sent\",\n                \"attempts\": 1,\n                \"httpCode\": 200,\n                \"durationMs\": 184,\n                \"error\": null,\n                \"createdAt\": \"2026-08-28T14:05:01+03:00\",\n                \"nextAttemptAt\": null,\n                \"sentAt\": \"2026-08-28T14:05:02+03:00\"\n            }\n        ],\n        \"nextCursor\": \"9214\",\n        \"count\": 1,\n        \"retry\": {\n            \"maxAttempts\": 8,\n            \"backoffMinutes\": [\n                2,\n                4,\n                8,\n                16,\n                32,\n                64,\n                128\n            ],\n            \"note\": \"Tavan 720 dakikadir. 8 denemede cevap alinamazsa olay olu sayilir.\"\n        }\n    },\n    \"mode\": \"live\",\n    \"requestId\": \"01K3QF6ZC2M9V0X7NB4TDHR8YE\"\n}"
                        }
                    ]
                },
                {
                    "name": "Aboneliği oluştur/güncelle",
                    "request": {
                        "method": "PUT",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/webhooks",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "webhooks"
                            ]
                        },
                        "description": "Bayi başına TEK adres olduğu için bu bir \"upsert\"tir. Adres yalnız https olabilir; localhost ve özel ağ adresleri reddedilir (SSRF). İLK KAYITTA imza sırrı yanıtta BİR KEZ döner, bir daha gösterilmez. Adres değiştirilirse askı (varsa) kalkar. Bilinmeyen olay adı sessizce düşürülmez, 400 ile söylenir: yoksa bot \"abone oldum\" sanıp olayı beklerdi. events boş gönderilirse varsayılan set uygulanır. POST /webhooks aynı işe bağlıdır.\n\nKapsam: webhooks:manage",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"url\": \"https://bayi.example.com/oyuneks-hook\",\n    \"events\": [\n        \"order.delivered\",\n        \"order.failed\",\n        \"price.changed\",\n        \"balance.low\"\n    ]\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": [
                        {
                            "name": "Örnek yanıt (200)",
                            "originalRequest": {
                                "method": "PUT",
                                "header": [
                                    {
                                        "key": "Content-Type",
                                        "value": "application/json"
                                    }
                                ],
                                "url": {
                                    "raw": "{{baseUrl}}/webhooks",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "webhooks"
                                    ]
                                },
                                "description": "Bayi başına TEK adres olduğu için bu bir \"upsert\"tir. Adres yalnız https olabilir; localhost ve özel ağ adresleri reddedilir (SSRF). İLK KAYITTA imza sırrı yanıtta BİR KEZ döner, bir daha gösterilmez. Adres değiştirilirse askı (varsa) kalkar. Bilinmeyen olay adı sessizce düşürülmez, 400 ile söylenir: yoksa bot \"abone oldum\" sanıp olayı beklerdi. events boş gönderilirse varsayılan set uygulanır. POST /webhooks aynı işe bağlıdır.\n\nKapsam: webhooks:manage",
                                "body": {
                                    "mode": "raw",
                                    "raw": "{\n    \"url\": \"https://bayi.example.com/oyuneks-hook\",\n    \"events\": [\n        \"order.delivered\",\n        \"order.failed\",\n        \"price.changed\",\n        \"balance.low\"\n    ]\n}",
                                    "options": {
                                        "raw": {
                                            "language": "json"
                                        }
                                    }
                                }
                            },
                            "status": "OK",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": {\n        \"webhook\": {\n            \"id\": 214,\n            \"url\": \"https://bayi.example.com/oyuneks-hook\",\n            \"events\": [\n                \"order.delivered\",\n                \"order.failed\",\n                \"price.changed\",\n                \"balance.low\"\n            ],\n            \"status\": \"active\",\n            \"secretMasked\": \"whsec_a91f3c********9d0e\",\n            \"failStreak\": 0,\n            \"lastSuccessAt\": null,\n            \"lastFailureAt\": null\n        },\n        \"signature\": {\n            \"header\": \"X-Oyuneks-Signature\",\n            \"format\": \"t=<unix>,v1=<hex>\",\n            \"algorithm\": \"HMAC-SHA256\"\n        },\n        \"secret\": \"whsec_a91f3c7d2b8e4f16a05c9d0e\",\n        \"secretNote\": \"Bu sir yalniz bu yanitta doner.\"\n    },\n    \"mode\": \"live\",\n    \"requestId\": \"01K3QF6ZC2M9V0X7NB4TDHR8YE\"\n}"
                        }
                    ]
                },
                {
                    "name": "Aboneliği oluştur/güncelle (eş adres)",
                    "request": {
                        "method": "POST",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/webhooks",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "webhooks"
                            ]
                        },
                        "description": "Bayi başına TEK adres olduğu için bu bir \"upsert\"tir. Adres yalnız https olabilir; localhost ve özel ağ adresleri reddedilir (SSRF). İLK KAYITTA imza sırrı yanıtta BİR KEZ döner, bir daha gösterilmez. Adres değiştirilirse askı (varsa) kalkar. Bilinmeyen olay adı sessizce düşürülmez, 400 ile söylenir: yoksa bot \"abone oldum\" sanıp olayı beklerdi. events boş gönderilirse varsayılan set uygulanır. POST /webhooks aynı işe bağlıdır.\n\nKapsam: webhooks:manage",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"url\": \"https://bayi.example.com/oyuneks-hook\",\n    \"events\": [\n        \"order.delivered\",\n        \"order.failed\",\n        \"price.changed\",\n        \"balance.low\"\n    ]\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": [
                        {
                            "name": "Örnek yanıt (200)",
                            "originalRequest": {
                                "method": "POST",
                                "header": [
                                    {
                                        "key": "Content-Type",
                                        "value": "application/json"
                                    }
                                ],
                                "url": {
                                    "raw": "{{baseUrl}}/webhooks",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "webhooks"
                                    ]
                                },
                                "description": "Bayi başına TEK adres olduğu için bu bir \"upsert\"tir. Adres yalnız https olabilir; localhost ve özel ağ adresleri reddedilir (SSRF). İLK KAYITTA imza sırrı yanıtta BİR KEZ döner, bir daha gösterilmez. Adres değiştirilirse askı (varsa) kalkar. Bilinmeyen olay adı sessizce düşürülmez, 400 ile söylenir: yoksa bot \"abone oldum\" sanıp olayı beklerdi. events boş gönderilirse varsayılan set uygulanır. POST /webhooks aynı işe bağlıdır.\n\nKapsam: webhooks:manage",
                                "body": {
                                    "mode": "raw",
                                    "raw": "{\n    \"url\": \"https://bayi.example.com/oyuneks-hook\",\n    \"events\": [\n        \"order.delivered\",\n        \"order.failed\",\n        \"price.changed\",\n        \"balance.low\"\n    ]\n}",
                                    "options": {
                                        "raw": {
                                            "language": "json"
                                        }
                                    }
                                }
                            },
                            "status": "OK",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": {\n        \"webhook\": {\n            \"id\": 214,\n            \"url\": \"https://bayi.example.com/oyuneks-hook\",\n            \"events\": [\n                \"order.delivered\",\n                \"order.failed\",\n                \"price.changed\",\n                \"balance.low\"\n            ],\n            \"status\": \"active\",\n            \"secretMasked\": \"whsec_a91f3c********9d0e\",\n            \"failStreak\": 0,\n            \"lastSuccessAt\": null,\n            \"lastFailureAt\": null\n        },\n        \"signature\": {\n            \"header\": \"X-Oyuneks-Signature\",\n            \"format\": \"t=<unix>,v1=<hex>\",\n            \"algorithm\": \"HMAC-SHA256\"\n        },\n        \"secret\": \"whsec_a91f3c7d2b8e4f16a05c9d0e\",\n        \"secretNote\": \"Bu sir yalniz bu yanitta doner.\"\n    },\n    \"mode\": \"live\",\n    \"requestId\": \"01K3QF6ZC2M9V0X7NB4TDHR8YE\"\n}"
                        }
                    ]
                },
                {
                    "name": "İmza sırrını yenile",
                    "request": {
                        "method": "POST",
                        "header": [],
                        "url": {
                            "raw": "{{baseUrl}}/webhooks/rotate-secret",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "webhooks",
                                "rotate-secret"
                            ]
                        },
                        "description": "Yeni imza sırrı üretir ve BİR KEZ döndürür. Eski sır ANINDA geçersizdir: iki geçerli sır tutmak, sızan sırrı iptal etmeyi anlamsız kılardı. Yeni sırrı yazana kadar gelen olayların imzası doğrulanamaz, bu yüzden dağıtımı hemen yapın.\n\nKapsam: webhooks:manage"
                    },
                    "response": [
                        {
                            "name": "Örnek yanıt (200)",
                            "originalRequest": {
                                "method": "POST",
                                "header": [],
                                "url": {
                                    "raw": "{{baseUrl}}/webhooks/rotate-secret",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "webhooks",
                                        "rotate-secret"
                                    ]
                                },
                                "description": "Yeni imza sırrı üretir ve BİR KEZ döndürür. Eski sır ANINDA geçersizdir: iki geçerli sır tutmak, sızan sırrı iptal etmeyi anlamsız kılardı. Yeni sırrı yazana kadar gelen olayların imzası doğrulanamaz, bu yüzden dağıtımı hemen yapın.\n\nKapsam: webhooks:manage"
                            },
                            "status": "OK",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": {\n        \"secret\": \"whsec_2f7c81a94de0b3c65a1f8d42\",\n        \"secretNote\": \"Eski sir ANINDA gecersizdir.\",\n        \"webhook\": {\n            \"id\": 214,\n            \"url\": \"https://bayi.example.com/oyuneks-hook\",\n            \"events\": [\n                \"order.delivered\"\n            ],\n            \"status\": \"active\",\n            \"secretMasked\": \"whsec_2f7c81********8d42\"\n        },\n        \"signature\": {\n            \"header\": \"X-Oyuneks-Signature\",\n            \"format\": \"t=<unix>,v1=<hex>\",\n            \"algorithm\": \"HMAC-SHA256\"\n        }\n    },\n    \"mode\": \"live\",\n    \"requestId\": \"01K3QF6ZC2M9V0X7NB4TDHR8YE\"\n}"
                        }
                    ]
                },
                {
                    "name": "Test olayı gönder (ping)",
                    "request": {
                        "method": "POST",
                        "header": [],
                        "url": {
                            "raw": "{{baseUrl}}/webhooks/test",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "webhooks",
                                "test"
                            ]
                        },
                        "description": "\"ping\" olayını ANINDA gönderir (kuyruğa girmez, yeniden denenmez) ve HTTP sonucunu döndürür. Adres cevap vermezse yanıt YİNE 200 olur, gövdedeki delivered=false bakılır: istek doğru işlendi, gönderim başarısız. 502 döndürmek botu \"benim isteğim hatalı\" sanmaya iterdi. POST /webhooks/{webhookId}/test aynı işe bağlıdır.\n\nKapsam: webhooks:manage"
                    },
                    "response": [
                        {
                            "name": "Örnek yanıt (200)",
                            "originalRequest": {
                                "method": "POST",
                                "header": [],
                                "url": {
                                    "raw": "{{baseUrl}}/webhooks/test",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "webhooks",
                                        "test"
                                    ]
                                },
                                "description": "\"ping\" olayını ANINDA gönderir (kuyruğa girmez, yeniden denenmez) ve HTTP sonucunu döndürür. Adres cevap vermezse yanıt YİNE 200 olur, gövdedeki delivered=false bakılır: istek doğru işlendi, gönderim başarısız. 502 döndürmek botu \"benim isteğim hatalı\" sanmaya iterdi. POST /webhooks/{webhookId}/test aynı işe bağlıdır.\n\nKapsam: webhooks:manage"
                            },
                            "status": "OK",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": {\n        \"delivered\": true,\n        \"eventId\": \"evt_01K3QF6ZC2M9V0X7NB4TDHR8YE\",\n        \"httpCode\": 200,\n        \"durationMs\": 184,\n        \"error\": null\n    },\n    \"mode\": \"test\",\n    \"requestId\": \"01K3QF6ZC2M9V0X7NB4TDHR8YE\"\n}"
                        }
                    ]
                },
                {
                    "name": "Test olayı gönder (ping) (eş adres)",
                    "request": {
                        "method": "POST",
                        "header": [],
                        "url": {
                            "raw": "{{baseUrl}}/webhooks/:webhookId/test",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "webhooks",
                                ":webhookId",
                                "test"
                            ],
                            "variable": [
                                {
                                    "key": "webhookId",
                                    "value": "214"
                                }
                            ]
                        },
                        "description": "\"ping\" olayını ANINDA gönderir (kuyruğa girmez, yeniden denenmez) ve HTTP sonucunu döndürür. Adres cevap vermezse yanıt YİNE 200 olur, gövdedeki delivered=false bakılır: istek doğru işlendi, gönderim başarısız. 502 döndürmek botu \"benim isteğim hatalı\" sanmaya iterdi. POST /webhooks/{webhookId}/test aynı işe bağlıdır.\n\nKapsam: webhooks:manage"
                    },
                    "response": [
                        {
                            "name": "Örnek yanıt (200)",
                            "originalRequest": {
                                "method": "POST",
                                "header": [],
                                "url": {
                                    "raw": "{{baseUrl}}/webhooks/:webhookId/test",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "webhooks",
                                        ":webhookId",
                                        "test"
                                    ],
                                    "variable": [
                                        {
                                            "key": "webhookId",
                                            "value": "214"
                                        }
                                    ]
                                },
                                "description": "\"ping\" olayını ANINDA gönderir (kuyruğa girmez, yeniden denenmez) ve HTTP sonucunu döndürür. Adres cevap vermezse yanıt YİNE 200 olur, gövdedeki delivered=false bakılır: istek doğru işlendi, gönderim başarısız. 502 döndürmek botu \"benim isteğim hatalı\" sanmaya iterdi. POST /webhooks/{webhookId}/test aynı işe bağlıdır.\n\nKapsam: webhooks:manage"
                            },
                            "status": "OK",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": {\n        \"delivered\": true,\n        \"eventId\": \"evt_01K3QF6ZC2M9V0X7NB4TDHR8YE\",\n        \"httpCode\": 200,\n        \"durationMs\": 184,\n        \"error\": null\n    },\n    \"mode\": \"test\",\n    \"requestId\": \"01K3QF6ZC2M9V0X7NB4TDHR8YE\"\n}"
                        }
                    ]
                },
                {
                    "name": "Aboneliği sil",
                    "request": {
                        "method": "DELETE",
                        "header": [],
                        "url": {
                            "raw": "{{baseUrl}}/webhooks",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "webhooks"
                            ]
                        },
                        "description": "Aboneliği siler; kuyrukta bekleyen olaylar ölü işaretlenir. DELETE /webhooks/{webhookId} de kabul edilir; kimlik başka bayiye aitse 404 döner (varlığını sızdırmayız). Silmek yerine olay listesini daraltmak genelde daha iyidir: adres silindiğinde teslim bildirimlerini de kaybedersiniz.\n\nKapsam: webhooks:manage"
                    },
                    "response": [
                        {
                            "name": "Örnek yanıt (200)",
                            "originalRequest": {
                                "method": "DELETE",
                                "header": [],
                                "url": {
                                    "raw": "{{baseUrl}}/webhooks",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "webhooks"
                                    ]
                                },
                                "description": "Aboneliği siler; kuyrukta bekleyen olaylar ölü işaretlenir. DELETE /webhooks/{webhookId} de kabul edilir; kimlik başka bayiye aitse 404 döner (varlığını sızdırmayız). Silmek yerine olay listesini daraltmak genelde daha iyidir: adres silindiğinde teslim bildirimlerini de kaybedersiniz.\n\nKapsam: webhooks:manage"
                            },
                            "status": "OK",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": {\n        \"deleted\": true\n    },\n    \"mode\": \"live\",\n    \"requestId\": \"01K3QF6ZC2M9V0X7NB4TDHR8YE\"\n}"
                        }
                    ]
                },
                {
                    "name": "Aboneliği sil (eş adres)",
                    "request": {
                        "method": "DELETE",
                        "header": [],
                        "url": {
                            "raw": "{{baseUrl}}/webhooks/:webhookId",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "webhooks",
                                ":webhookId"
                            ],
                            "variable": [
                                {
                                    "key": "webhookId",
                                    "value": "214"
                                }
                            ]
                        },
                        "description": "Aboneliği siler; kuyrukta bekleyen olaylar ölü işaretlenir. DELETE /webhooks/{webhookId} de kabul edilir; kimlik başka bayiye aitse 404 döner (varlığını sızdırmayız). Silmek yerine olay listesini daraltmak genelde daha iyidir: adres silindiğinde teslim bildirimlerini de kaybedersiniz.\n\nKapsam: webhooks:manage"
                    },
                    "response": [
                        {
                            "name": "Örnek yanıt (200)",
                            "originalRequest": {
                                "method": "DELETE",
                                "header": [],
                                "url": {
                                    "raw": "{{baseUrl}}/webhooks/:webhookId",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "webhooks",
                                        ":webhookId"
                                    ],
                                    "variable": [
                                        {
                                            "key": "webhookId",
                                            "value": "214"
                                        }
                                    ]
                                },
                                "description": "Aboneliği siler; kuyrukta bekleyen olaylar ölü işaretlenir. DELETE /webhooks/{webhookId} de kabul edilir; kimlik başka bayiye aitse 404 döner (varlığını sızdırmayız). Silmek yerine olay listesini daraltmak genelde daha iyidir: adres silindiğinde teslim bildirimlerini de kaybedersiniz.\n\nKapsam: webhooks:manage"
                            },
                            "status": "OK",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": {\n        \"deleted\": true\n    },\n    \"mode\": \"live\",\n    \"requestId\": \"01K3QF6ZC2M9V0X7NB4TDHR8YE\"\n}"
                        }
                    ]
                }
            ]
        }
    ]
}