{
  "openapi": "3.1.0",
  "info": {
    "title": "Restomenum Plugin API",
    "version": "2026-06-15",
    "description": "Restomenum eklenti platformunun Veri API uçları + webhook (event/lifecycle) teslim sözleşmeleri. Bu spec build-time, dokümanları besleyen tek-kaynak kataloglardan üretilir (drift yok). İnsan-okunur dokümanlar: https://dev.restomenum.com/docs — AI için: https://dev.restomenum.com/llms.txt",
    "contact": {
      "url": "https://dev.restomenum.com/docs"
    }
  },
  "externalDocs": {
    "description": "Geliştirici dokümanları",
    "url": "https://dev.restomenum.com/docs"
  },
  "servers": [
    {
      "url": "https://sandbox.plugins.restomenum.app",
      "description": "Dev / Sandbox"
    },
    {
      "url": "https://plugins.restomenum.app",
      "description": "Production"
    }
  ],
  "security": [
    {
      "bearerAuth": []
    }
  ],
  "paths": {
    "/plugin-api/packets/get": {
      "get": {
        "operationId": "get_packets_get",
        "tags": [
          "packets"
        ],
        "summary": "Paket detayı (dolu order: ürünler, müşteri, adres, toplam)",
        "description": "Paket detayı (dolu order: ürünler, müşteri, adres, toplam)",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "x-required-scope": "orders:read",
        "x-status": "live",
        "externalDocs": {
          "description": "Alan tabloları + örnekler",
          "url": "https://dev.restomenum.com/docs/api/packets-get"
        },
        "responses": {
          "200": {
            "description": "Başarı zarfı (`data` uca özel) — uygulama hataları da `{success:false,message}` dönebilir.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessEnvelope"
                }
              }
            }
          },
          "400": {
            "description": "Doğrulama / eksik-yanlış parametre (plugin.<kaynak>.missingParams, joi, unknown_payment_method…)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "401": {
            "description": "Geçersiz/eksik apiKey (unauthorized)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "403": {
            "description": "Scope reddi veya sahiplik reddi (plugin.scope.denied, plugin.<kaynak>.notOwner)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "404": {
            "description": "Kayıt bulunamadı (plugin.<kaynak>.notFound)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "409": {
            "description": "Çakışma (categoryNotEmpty, Duplicate request already in progress)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit (plugin.rateLimited) — Retry-After (sn) değerine uy; header yoksa üstel backoff + jitter. Limitler: https://dev.restomenum.com/docs/limits",
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/RetryAfter"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "default": {
            "description": "Hata zarfı — kodlar için /docs/errors",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          }
        }
      }
    },
    "/plugin-api/packets/open": {
      "get": {
        "operationId": "get_packets_open",
        "tags": [
          "packets"
        ],
        "summary": "Açık paket/delivery hesapları (özet): packetId, kanal, tutar, ürün adedi",
        "description": "Açık paket/delivery hesapları (özet): packetId, kanal, tutar, ürün adedi. Detay: packets/get?packetId=.",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "x-required-scope": "orders:read",
        "x-status": "live",
        "externalDocs": {
          "description": "Alan tabloları + örnekler",
          "url": "https://dev.restomenum.com/docs/api/packets-open"
        },
        "responses": {
          "200": {
            "description": "Başarı zarfı (`data` uca özel) — uygulama hataları da `{success:false,message}` dönebilir.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessEnvelope"
                }
              }
            }
          },
          "400": {
            "description": "Doğrulama / eksik-yanlış parametre (plugin.<kaynak>.missingParams, joi, unknown_payment_method…)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "401": {
            "description": "Geçersiz/eksik apiKey (unauthorized)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "403": {
            "description": "Scope reddi veya sahiplik reddi (plugin.scope.denied, plugin.<kaynak>.notOwner)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "404": {
            "description": "Kayıt bulunamadı (plugin.<kaynak>.notFound)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "409": {
            "description": "Çakışma (categoryNotEmpty, Duplicate request already in progress)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit (plugin.rateLimited) — Retry-After (sn) değerine uy; header yoksa üstel backoff + jitter. Limitler: https://dev.restomenum.com/docs/limits",
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/RetryAfter"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "default": {
            "description": "Hata zarfı — kodlar için /docs/errors",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          }
        }
      }
    },
    "/plugin-api/packets/create": {
      "post": {
        "operationId": "post_packets_create",
        "tags": [
          "packets"
        ],
        "summary": "Yeni paket/sipariş oluştur (yazma ucu)",
        "description": "Yeni paket/sipariş oluştur (yazma ucu). Sepet ürün id'leriyle; fiyat Restomenum kaydından. idempotencyKey ile retry-güvenli. Ayrı write limit (20/dk).",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "x-required-scope": "orders:write",
        "x-status": "live",
        "externalDocs": {
          "description": "Alan tabloları + örnekler",
          "url": "https://dev.restomenum.com/docs/api/packets-create"
        },
        "responses": {
          "200": {
            "description": "Başarı zarfı (`data` uca özel) — uygulama hataları da `{success:false,message}` dönebilir.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessEnvelope"
                }
              }
            }
          },
          "400": {
            "description": "Doğrulama / eksik-yanlış parametre (plugin.<kaynak>.missingParams, joi, unknown_payment_method…)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "401": {
            "description": "Geçersiz/eksik apiKey (unauthorized)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "403": {
            "description": "Scope reddi veya sahiplik reddi (plugin.scope.denied, plugin.<kaynak>.notOwner)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "404": {
            "description": "Kayıt bulunamadı (plugin.<kaynak>.notFound)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "409": {
            "description": "Çakışma (categoryNotEmpty, Duplicate request already in progress)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit (plugin.rateLimited) — Retry-After (sn) değerine uy; header yoksa üstel backoff + jitter. Limitler: https://dev.restomenum.com/docs/limits",
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/RetryAfter"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "default": {
            "description": "Hata zarfı — kodlar için /docs/errors",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          }
        }
      }
    },
    "/plugin-api/packets/update": {
      "post": {
        "operationId": "post_packets_update",
        "tags": [
          "packets"
        ],
        "summary": "Paketin sınırlı alanlarını güncelle (allowlist: status[label]/note/paymentNote/invoice*/customer",
        "description": "Paketin sınırlı alanlarını güncelle (allowlist: status[label]/note/paymentNote/invoice*/customer.address|phone). Kapanış/iptal tetiklemez.",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "x-required-scope": "orders:write",
        "x-status": "live",
        "externalDocs": {
          "description": "Alan tabloları + örnekler",
          "url": "https://dev.restomenum.com/docs/api/packets-update"
        },
        "responses": {
          "200": {
            "description": "Başarı zarfı (`data` uca özel) — uygulama hataları da `{success:false,message}` dönebilir.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessEnvelope"
                }
              }
            }
          },
          "400": {
            "description": "Doğrulama / eksik-yanlış parametre (plugin.<kaynak>.missingParams, joi, unknown_payment_method…)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "401": {
            "description": "Geçersiz/eksik apiKey (unauthorized)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "403": {
            "description": "Scope reddi veya sahiplik reddi (plugin.scope.denied, plugin.<kaynak>.notOwner)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "404": {
            "description": "Kayıt bulunamadı (plugin.<kaynak>.notFound)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "409": {
            "description": "Çakışma (categoryNotEmpty, Duplicate request already in progress)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit (plugin.rateLimited) — Retry-After (sn) değerine uy; header yoksa üstel backoff + jitter. Limitler: https://dev.restomenum.com/docs/limits",
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/RetryAfter"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "default": {
            "description": "Hata zarfı — kodlar için /docs/errors",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          }
        }
      }
    },
    "/plugin-api/packets/update-orders": {
      "post": {
        "operationId": "post_packets_update_orders",
        "tags": [
          "packets"
        ],
        "summary": "Paket kalemlerini (cart) DEĞİŞTİR (full replace)",
        "description": "Paket kalemlerini (cart) DEĞİŞTİR (full replace). total ürün kaydından yeniden hesaplanır. paid > yeni total → reddedilir (success:false).",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "x-required-scope": "orders:write",
        "x-status": "live",
        "externalDocs": {
          "description": "Alan tabloları + örnekler",
          "url": "https://dev.restomenum.com/docs/api/packets-update-orders"
        },
        "responses": {
          "200": {
            "description": "Başarı zarfı (`data` uca özel) — uygulama hataları da `{success:false,message}` dönebilir.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessEnvelope"
                }
              }
            }
          },
          "400": {
            "description": "Doğrulama / eksik-yanlış parametre (plugin.<kaynak>.missingParams, joi, unknown_payment_method…)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "401": {
            "description": "Geçersiz/eksik apiKey (unauthorized)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "403": {
            "description": "Scope reddi veya sahiplik reddi (plugin.scope.denied, plugin.<kaynak>.notOwner)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "404": {
            "description": "Kayıt bulunamadı (plugin.<kaynak>.notFound)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "409": {
            "description": "Çakışma (categoryNotEmpty, Duplicate request already in progress)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit (plugin.rateLimited) — Retry-After (sn) değerine uy; header yoksa üstel backoff + jitter. Limitler: https://dev.restomenum.com/docs/limits",
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/RetryAfter"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "default": {
            "description": "Hata zarfı — kodlar için /docs/errors",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          }
        }
      }
    },
    "/plugin-api/packets/update-payments": {
      "post": {
        "operationId": "post_packets_update_payments",
        "tags": [
          "packets"
        ],
        "summary": "Paket ödemelerini DEĞİŞTİR (full replace)",
        "description": "Paket ödemelerini DEĞİŞTİR (full replace). paid yeniden hesaplanır (price>0). paid > total → reddedilir (success:false). update-orders ile eş zamanlı çağırma.",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "x-required-scope": "orders:write",
        "x-status": "live",
        "externalDocs": {
          "description": "Alan tabloları + örnekler",
          "url": "https://dev.restomenum.com/docs/api/packets-update-payments"
        },
        "responses": {
          "200": {
            "description": "Başarı zarfı (`data` uca özel) — uygulama hataları da `{success:false,message}` dönebilir.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessEnvelope"
                }
              }
            }
          },
          "400": {
            "description": "Doğrulama / eksik-yanlış parametre (plugin.<kaynak>.missingParams, joi, unknown_payment_method…)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "401": {
            "description": "Geçersiz/eksik apiKey (unauthorized)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "403": {
            "description": "Scope reddi veya sahiplik reddi (plugin.scope.denied, plugin.<kaynak>.notOwner)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "404": {
            "description": "Kayıt bulunamadı (plugin.<kaynak>.notFound)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "409": {
            "description": "Çakışma (categoryNotEmpty, Duplicate request already in progress)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit (plugin.rateLimited) — Retry-After (sn) değerine uy; header yoksa üstel backoff + jitter. Limitler: https://dev.restomenum.com/docs/limits",
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/RetryAfter"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "default": {
            "description": "Hata zarfı — kodlar için /docs/errors",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          }
        }
      }
    },
    "/plugin-api/tables/get": {
      "get": {
        "operationId": "get_tables_get",
        "tags": [
          "tables"
        ],
        "summary": "Masa detayı (dolu order)",
        "description": "Masa detayı (dolu order). orders[] packets/get ile aynı satır şekli; kimlik masaya özel (tableId/tableName/desing — packetId değil). table.close gate target.id ile çekilir.",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "x-required-scope": "orders:read",
        "x-status": "live",
        "externalDocs": {
          "description": "Alan tabloları + örnekler",
          "url": "https://dev.restomenum.com/docs/api/tables-get"
        },
        "responses": {
          "200": {
            "description": "Başarı zarfı (`data` uca özel) — uygulama hataları da `{success:false,message}` dönebilir.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessEnvelope"
                }
              }
            }
          },
          "400": {
            "description": "Doğrulama / eksik-yanlış parametre (plugin.<kaynak>.missingParams, joi, unknown_payment_method…)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "401": {
            "description": "Geçersiz/eksik apiKey (unauthorized)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "403": {
            "description": "Scope reddi veya sahiplik reddi (plugin.scope.denied, plugin.<kaynak>.notOwner)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "404": {
            "description": "Kayıt bulunamadı (plugin.<kaynak>.notFound)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "409": {
            "description": "Çakışma (categoryNotEmpty, Duplicate request already in progress)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit (plugin.rateLimited) — Retry-After (sn) değerine uy; header yoksa üstel backoff + jitter. Limitler: https://dev.restomenum.com/docs/limits",
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/RetryAfter"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "default": {
            "description": "Hata zarfı — kodlar için /docs/errors",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          }
        }
      }
    },
    "/plugin-api/tables/layout": {
      "get": {
        "operationId": "get_tables_layout",
        "tags": [
          "tables"
        ],
        "summary": "Masa yerleşimi (floor plan): bölümler + masa adları",
        "description": "Masa yerleşimi (floor plan): bölümler + masa adları. Ücret/grid alanları dönmez. Masa = bölüm+ad.",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "x-required-scope": "orders:read",
        "x-status": "live",
        "externalDocs": {
          "description": "Alan tabloları + örnekler",
          "url": "https://dev.restomenum.com/docs/api/tables-layout"
        },
        "responses": {
          "200": {
            "description": "Başarı zarfı (`data` uca özel) — uygulama hataları da `{success:false,message}` dönebilir.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessEnvelope"
                }
              }
            }
          },
          "400": {
            "description": "Doğrulama / eksik-yanlış parametre (plugin.<kaynak>.missingParams, joi, unknown_payment_method…)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "401": {
            "description": "Geçersiz/eksik apiKey (unauthorized)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "403": {
            "description": "Scope reddi veya sahiplik reddi (plugin.scope.denied, plugin.<kaynak>.notOwner)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "404": {
            "description": "Kayıt bulunamadı (plugin.<kaynak>.notFound)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "409": {
            "description": "Çakışma (categoryNotEmpty, Duplicate request already in progress)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit (plugin.rateLimited) — Retry-After (sn) değerine uy; header yoksa üstel backoff + jitter. Limitler: https://dev.restomenum.com/docs/limits",
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/RetryAfter"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "default": {
            "description": "Hata zarfı — kodlar için /docs/errors",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          }
        }
      }
    },
    "/plugin-api/tables/open": {
      "get": {
        "operationId": "get_tables_open",
        "tags": [
          "tables"
        ],
        "summary": "Açık masa hesapları (özet): tableId, tutar (total/paid/indirim), ürün adedi",
        "description": "Açık masa hesapları (özet): tableId, tutar (total/paid/indirim), ürün adedi. Detay: tables/get?id=.",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "x-required-scope": "orders:read",
        "x-status": "live",
        "externalDocs": {
          "description": "Alan tabloları + örnekler",
          "url": "https://dev.restomenum.com/docs/api/tables-open"
        },
        "responses": {
          "200": {
            "description": "Başarı zarfı (`data` uca özel) — uygulama hataları da `{success:false,message}` dönebilir.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessEnvelope"
                }
              }
            }
          },
          "400": {
            "description": "Doğrulama / eksik-yanlış parametre (plugin.<kaynak>.missingParams, joi, unknown_payment_method…)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "401": {
            "description": "Geçersiz/eksik apiKey (unauthorized)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "403": {
            "description": "Scope reddi veya sahiplik reddi (plugin.scope.denied, plugin.<kaynak>.notOwner)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "404": {
            "description": "Kayıt bulunamadı (plugin.<kaynak>.notFound)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "409": {
            "description": "Çakışma (categoryNotEmpty, Duplicate request already in progress)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit (plugin.rateLimited) — Retry-After (sn) değerine uy; header yoksa üstel backoff + jitter. Limitler: https://dev.restomenum.com/docs/limits",
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/RetryAfter"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "default": {
            "description": "Hata zarfı — kodlar için /docs/errors",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          }
        }
      }
    },
    "/plugin-api/tables/update-orders": {
      "post": {
        "operationId": "post_tables_update_orders",
        "tags": [
          "tables"
        ],
        "summary": "Masa kalemlerini DEĞİŞTİR (full replace)",
        "description": "Masa kalemlerini DEĞİŞTİR (full replace). total kuver dahil yeniden hesap; timer ürün desteklenmez.",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "x-required-scope": "orders:write",
        "x-status": "live",
        "externalDocs": {
          "description": "Alan tabloları + örnekler",
          "url": "https://dev.restomenum.com/docs/api/tables-update-orders"
        },
        "responses": {
          "200": {
            "description": "Başarı zarfı (`data` uca özel) — uygulama hataları da `{success:false,message}` dönebilir.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessEnvelope"
                }
              }
            }
          },
          "400": {
            "description": "Doğrulama / eksik-yanlış parametre (plugin.<kaynak>.missingParams, joi, unknown_payment_method…)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "401": {
            "description": "Geçersiz/eksik apiKey (unauthorized)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "403": {
            "description": "Scope reddi veya sahiplik reddi (plugin.scope.denied, plugin.<kaynak>.notOwner)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "404": {
            "description": "Kayıt bulunamadı (plugin.<kaynak>.notFound)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "409": {
            "description": "Çakışma (categoryNotEmpty, Duplicate request already in progress)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit (plugin.rateLimited) — Retry-After (sn) değerine uy; header yoksa üstel backoff + jitter. Limitler: https://dev.restomenum.com/docs/limits",
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/RetryAfter"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "default": {
            "description": "Hata zarfı — kodlar için /docs/errors",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          }
        }
      }
    },
    "/plugin-api/tables/update-payments": {
      "post": {
        "operationId": "post_tables_update_payments",
        "tags": [
          "tables"
        ],
        "summary": "Masa ödemelerini DEĞİŞTİR (full replace)",
        "description": "Masa ödemelerini DEĞİŞTİR (full replace). Ödeme doğrulaması packets ile birebir (unknown_payment_method).",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "x-required-scope": "orders:write",
        "x-status": "live",
        "externalDocs": {
          "description": "Alan tabloları + örnekler",
          "url": "https://dev.restomenum.com/docs/api/tables-update-payments"
        },
        "responses": {
          "200": {
            "description": "Başarı zarfı (`data` uca özel) — uygulama hataları da `{success:false,message}` dönebilir.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessEnvelope"
                }
              }
            }
          },
          "400": {
            "description": "Doğrulama / eksik-yanlış parametre (plugin.<kaynak>.missingParams, joi, unknown_payment_method…)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "401": {
            "description": "Geçersiz/eksik apiKey (unauthorized)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "403": {
            "description": "Scope reddi veya sahiplik reddi (plugin.scope.denied, plugin.<kaynak>.notOwner)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "404": {
            "description": "Kayıt bulunamadı (plugin.<kaynak>.notFound)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "409": {
            "description": "Çakışma (categoryNotEmpty, Duplicate request already in progress)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit (plugin.rateLimited) — Retry-After (sn) değerine uy; header yoksa üstel backoff + jitter. Limitler: https://dev.restomenum.com/docs/limits",
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/RetryAfter"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "default": {
            "description": "Hata zarfı — kodlar için /docs/errors",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          }
        }
      }
    },
    "/plugin-api/products/get": {
      "get": {
        "operationId": "get_products_get",
        "tags": [
          "products"
        ],
        "summary": "Ürün detayı (id ile)",
        "description": "Ürün detayı (id ile). fiyat, KDV, görsel, barkod, stok, seçenek/choice ağacı. cost/recete dönmez.",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "x-required-scope": "products:read",
        "x-status": "live",
        "externalDocs": {
          "description": "Alan tabloları + örnekler",
          "url": "https://dev.restomenum.com/docs/api/products-get"
        },
        "responses": {
          "200": {
            "description": "Başarı zarfı (`data` uca özel) — uygulama hataları da `{success:false,message}` dönebilir.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessEnvelope"
                }
              }
            }
          },
          "400": {
            "description": "Doğrulama / eksik-yanlış parametre (plugin.<kaynak>.missingParams, joi, unknown_payment_method…)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "401": {
            "description": "Geçersiz/eksik apiKey (unauthorized)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "403": {
            "description": "Scope reddi veya sahiplik reddi (plugin.scope.denied, plugin.<kaynak>.notOwner)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "404": {
            "description": "Kayıt bulunamadı (plugin.<kaynak>.notFound)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "409": {
            "description": "Çakışma (categoryNotEmpty, Duplicate request already in progress)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit (plugin.rateLimited) — Retry-After (sn) değerine uy; header yoksa üstel backoff + jitter. Limitler: https://dev.restomenum.com/docs/limits",
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/RetryAfter"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "default": {
            "description": "Hata zarfı — kodlar için /docs/errors",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          }
        }
      }
    },
    "/plugin-api/products/list": {
      "get": {
        "operationId": "get_products_list",
        "tags": [
          "products"
        ],
        "summary": "Tüm ürün kataloğu (aktif+pasif)",
        "description": "Tüm ürün kataloğu (aktif+pasif). Max 2000 (aşılırsa truncated+total). cost/recete dönmez.",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "x-required-scope": "products:read",
        "x-status": "live",
        "externalDocs": {
          "description": "Alan tabloları + örnekler",
          "url": "https://dev.restomenum.com/docs/api/products-list"
        },
        "responses": {
          "200": {
            "description": "Başarı zarfı (`data` uca özel) — uygulama hataları da `{success:false,message}` dönebilir.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessEnvelope"
                }
              }
            }
          },
          "400": {
            "description": "Doğrulama / eksik-yanlış parametre (plugin.<kaynak>.missingParams, joi, unknown_payment_method…)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "401": {
            "description": "Geçersiz/eksik apiKey (unauthorized)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "403": {
            "description": "Scope reddi veya sahiplik reddi (plugin.scope.denied, plugin.<kaynak>.notOwner)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "404": {
            "description": "Kayıt bulunamadı (plugin.<kaynak>.notFound)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "409": {
            "description": "Çakışma (categoryNotEmpty, Duplicate request already in progress)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit (plugin.rateLimited) — Retry-After (sn) değerine uy; header yoksa üstel backoff + jitter. Limitler: https://dev.restomenum.com/docs/limits",
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/RetryAfter"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "default": {
            "description": "Hata zarfı — kodlar için /docs/errors",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          }
        }
      }
    },
    "/plugin-api/categories/list": {
      "get": {
        "operationId": "get_categories_list",
        "tags": [
          "categories"
        ],
        "summary": "Tüm ürün kategorileri (aktif+pasif)",
        "description": "Tüm ürün kategorileri (aktif+pasif). id, title, image, color, rank. Ürün category ile eşleşir. Max 500.",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "x-required-scope": "products:read",
        "x-status": "live",
        "externalDocs": {
          "description": "Alan tabloları + örnekler",
          "url": "https://dev.restomenum.com/docs/api/categories-list"
        },
        "responses": {
          "200": {
            "description": "Başarı zarfı (`data` uca özel) — uygulama hataları da `{success:false,message}` dönebilir.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessEnvelope"
                }
              }
            }
          },
          "400": {
            "description": "Doğrulama / eksik-yanlış parametre (plugin.<kaynak>.missingParams, joi, unknown_payment_method…)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "401": {
            "description": "Geçersiz/eksik apiKey (unauthorized)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "403": {
            "description": "Scope reddi veya sahiplik reddi (plugin.scope.denied, plugin.<kaynak>.notOwner)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "404": {
            "description": "Kayıt bulunamadı (plugin.<kaynak>.notFound)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "409": {
            "description": "Çakışma (categoryNotEmpty, Duplicate request already in progress)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit (plugin.rateLimited) — Retry-After (sn) değerine uy; header yoksa üstel backoff + jitter. Limitler: https://dev.restomenum.com/docs/limits",
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/RetryAfter"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "default": {
            "description": "Hata zarfı — kodlar için /docs/errors",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          }
        }
      }
    },
    "/plugin-api/categories/get": {
      "get": {
        "operationId": "get_categories_get",
        "tags": [
          "categories"
        ],
        "summary": "Tek kategori detayı (id ile)",
        "description": "Tek kategori detayı (id ile). Şekil categories/list öğesiyle aynı. category.* event id'sini zenginleştir.",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "x-required-scope": "products:read",
        "x-status": "live",
        "externalDocs": {
          "description": "Alan tabloları + örnekler",
          "url": "https://dev.restomenum.com/docs/api/categories-get"
        },
        "parameters": [
          {
            "name": "id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Başarı zarfı (`data` uca özel) — uygulama hataları da `{success:false,message}` dönebilir.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessEnvelope"
                }
              }
            }
          },
          "400": {
            "description": "Doğrulama / eksik-yanlış parametre (plugin.<kaynak>.missingParams, joi, unknown_payment_method…)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "401": {
            "description": "Geçersiz/eksik apiKey (unauthorized)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "403": {
            "description": "Scope reddi veya sahiplik reddi (plugin.scope.denied, plugin.<kaynak>.notOwner)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "404": {
            "description": "Kayıt bulunamadı (plugin.<kaynak>.notFound)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "409": {
            "description": "Çakışma (categoryNotEmpty, Duplicate request already in progress)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit (plugin.rateLimited) — Retry-After (sn) değerine uy; header yoksa üstel backoff + jitter. Limitler: https://dev.restomenum.com/docs/limits",
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/RetryAfter"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "default": {
            "description": "Hata zarfı — kodlar için /docs/errors",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          }
        }
      }
    },
    "/plugin-api/payment-methods/list": {
      "get": {
        "operationId": "get_payment_methods_list",
        "tags": [
          "payment-methods"
        ],
        "summary": "Tanımlı ödeme yöntemleri (Nakit/Kredi Kartı…): id, title, description, cash, noreport",
        "description": "Tanımlı ödeme yöntemleri (Nakit/Kredi Kartı…): id, title, description, cash, noreport. users dönmez.",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "x-required-scope": "payment_methods:read",
        "x-status": "live",
        "externalDocs": {
          "description": "Alan tabloları + örnekler",
          "url": "https://dev.restomenum.com/docs/api/payment-methods-list"
        },
        "responses": {
          "200": {
            "description": "Başarı zarfı (`data` uca özel) — uygulama hataları da `{success:false,message}` dönebilir.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessEnvelope"
                }
              }
            }
          },
          "400": {
            "description": "Doğrulama / eksik-yanlış parametre (plugin.<kaynak>.missingParams, joi, unknown_payment_method…)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "401": {
            "description": "Geçersiz/eksik apiKey (unauthorized)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "403": {
            "description": "Scope reddi veya sahiplik reddi (plugin.scope.denied, plugin.<kaynak>.notOwner)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "404": {
            "description": "Kayıt bulunamadı (plugin.<kaynak>.notFound)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "409": {
            "description": "Çakışma (categoryNotEmpty, Duplicate request already in progress)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit (plugin.rateLimited) — Retry-After (sn) değerine uy; header yoksa üstel backoff + jitter. Limitler: https://dev.restomenum.com/docs/limits",
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/RetryAfter"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "default": {
            "description": "Hata zarfı — kodlar için /docs/errors",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          }
        }
      }
    },
    "/plugin-api/ingredients/list": {
      "get": {
        "operationId": "get_ingredients_list",
        "tags": [
          "ingredients"
        ],
        "summary": "Malzeme/stok kataloğu (envanter): id, title, unit, stock, alert, tax",
        "description": "Malzeme/stok kataloğu (envanter): id, title, unit, stock, alert, tax. ort(maliyet)/stocks/storages dönmez.",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "x-required-scope": "ingredients:read",
        "x-status": "live",
        "externalDocs": {
          "description": "Alan tabloları + örnekler",
          "url": "https://dev.restomenum.com/docs/api/ingredients-list"
        },
        "responses": {
          "200": {
            "description": "Başarı zarfı (`data` uca özel) — uygulama hataları da `{success:false,message}` dönebilir.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessEnvelope"
                }
              }
            }
          },
          "400": {
            "description": "Doğrulama / eksik-yanlış parametre (plugin.<kaynak>.missingParams, joi, unknown_payment_method…)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "401": {
            "description": "Geçersiz/eksik apiKey (unauthorized)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "403": {
            "description": "Scope reddi veya sahiplik reddi (plugin.scope.denied, plugin.<kaynak>.notOwner)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "404": {
            "description": "Kayıt bulunamadı (plugin.<kaynak>.notFound)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "409": {
            "description": "Çakışma (categoryNotEmpty, Duplicate request already in progress)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit (plugin.rateLimited) — Retry-After (sn) değerine uy; header yoksa üstel backoff + jitter. Limitler: https://dev.restomenum.com/docs/limits",
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/RetryAfter"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "default": {
            "description": "Hata zarfı — kodlar için /docs/errors",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          }
        }
      }
    },
    "/plugin-api/customers/list": {
      "get": {
        "operationId": "get_customers_list",
        "tags": [
          "customers"
        ],
        "summary": "Müşteri kataloğu (CRM/sadakat) — cursor pagination (after/nextCursor, max 500)",
        "description": "Müşteri kataloğu (CRM/sadakat) — cursor pagination (after/nextCursor, max 500). name/phone/address (PII) + total (finansal) yalnız consent ile; yoksa {id,region}.",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "x-required-scope": "customers:read",
        "x-status": "live",
        "externalDocs": {
          "description": "Alan tabloları + örnekler",
          "url": "https://dev.restomenum.com/docs/api/customers-list"
        },
        "responses": {
          "200": {
            "description": "Başarı zarfı (`data` uca özel) — uygulama hataları da `{success:false,message}` dönebilir.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessEnvelope"
                }
              }
            }
          },
          "400": {
            "description": "Doğrulama / eksik-yanlış parametre (plugin.<kaynak>.missingParams, joi, unknown_payment_method…)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "401": {
            "description": "Geçersiz/eksik apiKey (unauthorized)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "403": {
            "description": "Scope reddi veya sahiplik reddi (plugin.scope.denied, plugin.<kaynak>.notOwner)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "404": {
            "description": "Kayıt bulunamadı (plugin.<kaynak>.notFound)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "409": {
            "description": "Çakışma (categoryNotEmpty, Duplicate request already in progress)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit (plugin.rateLimited) — Retry-After (sn) değerine uy; header yoksa üstel backoff + jitter. Limitler: https://dev.restomenum.com/docs/limits",
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/RetryAfter"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "default": {
            "description": "Hata zarfı — kodlar için /docs/errors",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          }
        }
      }
    },
    "/plugin-api/customers/get": {
      "get": {
        "operationId": "get_customers_get",
        "tags": [
          "customers"
        ],
        "summary": "Müşteri detayı (id ile)",
        "description": "Müşteri detayı (id ile). {id,region} + name/phone/address (PII) + total (finansal) yalnız consent ile. Şekil customers/list öğesiyle aynı.",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "x-required-scope": "customers:read",
        "x-status": "live",
        "externalDocs": {
          "description": "Alan tabloları + örnekler",
          "url": "https://dev.restomenum.com/docs/api/customers-get"
        },
        "parameters": [
          {
            "name": "customerId",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Başarı zarfı (`data` uca özel) — uygulama hataları da `{success:false,message}` dönebilir.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessEnvelope"
                }
              }
            }
          },
          "400": {
            "description": "Doğrulama / eksik-yanlış parametre (plugin.<kaynak>.missingParams, joi, unknown_payment_method…)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "401": {
            "description": "Geçersiz/eksik apiKey (unauthorized)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "403": {
            "description": "Scope reddi veya sahiplik reddi (plugin.scope.denied, plugin.<kaynak>.notOwner)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "404": {
            "description": "Kayıt bulunamadı (plugin.<kaynak>.notFound)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "409": {
            "description": "Çakışma (categoryNotEmpty, Duplicate request already in progress)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit (plugin.rateLimited) — Retry-After (sn) değerine uy; header yoksa üstel backoff + jitter. Limitler: https://dev.restomenum.com/docs/limits",
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/RetryAfter"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "default": {
            "description": "Hata zarfı — kodlar için /docs/errors",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          }
        }
      }
    },
    "/plugin-api/users/get": {
      "get": {
        "operationId": "get_users_get",
        "tags": [
          "users"
        ],
        "summary": "Personel (kullanıcı) listesi [{ id, name }] — name yalnız PII consent ile",
        "description": "Personel (kullanıcı) listesi [{ id, name }] — name yalnız PII consent ile. Max 200, cache'le. pincode/yetki/e-posta/mesai dönmez.",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "x-required-scope": "users:read",
        "x-status": "live",
        "externalDocs": {
          "description": "Alan tabloları + örnekler",
          "url": "https://dev.restomenum.com/docs/api/users-get"
        },
        "responses": {
          "200": {
            "description": "Başarı zarfı (`data` uca özel) — uygulama hataları da `{success:false,message}` dönebilir.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessEnvelope"
                }
              }
            }
          },
          "400": {
            "description": "Doğrulama / eksik-yanlış parametre (plugin.<kaynak>.missingParams, joi, unknown_payment_method…)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "401": {
            "description": "Geçersiz/eksik apiKey (unauthorized)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "403": {
            "description": "Scope reddi veya sahiplik reddi (plugin.scope.denied, plugin.<kaynak>.notOwner)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "404": {
            "description": "Kayıt bulunamadı (plugin.<kaynak>.notFound)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "409": {
            "description": "Çakışma (categoryNotEmpty, Duplicate request already in progress)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit (plugin.rateLimited) — Retry-After (sn) değerine uy; header yoksa üstel backoff + jitter. Limitler: https://dev.restomenum.com/docs/limits",
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/RetryAfter"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "default": {
            "description": "Hata zarfı — kodlar için /docs/errors",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          }
        }
      }
    },
    "/plugin-api/products/create": {
      "post": {
        "operationId": "post_products_create",
        "tags": [
          "products"
        ],
        "summary": "Ürün katalog yazma",
        "description": "Ürün katalog yazma. Sahiplik: yalnız kendi oluşturduğunu düzenler/siler. category var olmalı; cost/stock/image yazılamaz.",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "x-required-scope": "products:write",
        "x-status": "live",
        "externalDocs": {
          "description": "Alan tabloları + örnekler",
          "url": "https://dev.restomenum.com/docs/api/products-write"
        },
        "responses": {
          "200": {
            "description": "Başarı zarfı (`data` uca özel) — uygulama hataları da `{success:false,message}` dönebilir.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessEnvelope"
                }
              }
            }
          },
          "400": {
            "description": "Doğrulama / eksik-yanlış parametre (plugin.<kaynak>.missingParams, joi, unknown_payment_method…)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "401": {
            "description": "Geçersiz/eksik apiKey (unauthorized)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "403": {
            "description": "Scope reddi veya sahiplik reddi (plugin.scope.denied, plugin.<kaynak>.notOwner)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "404": {
            "description": "Kayıt bulunamadı (plugin.<kaynak>.notFound)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "409": {
            "description": "Çakışma (categoryNotEmpty, Duplicate request already in progress)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit (plugin.rateLimited) — Retry-After (sn) değerine uy; header yoksa üstel backoff + jitter. Limitler: https://dev.restomenum.com/docs/limits",
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/RetryAfter"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "default": {
            "description": "Hata zarfı — kodlar için /docs/errors",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          }
        }
      }
    },
    "/plugin-api/products/update": {
      "post": {
        "operationId": "post_products_update",
        "tags": [
          "products"
        ],
        "summary": "Ürün katalog yazma",
        "description": "Ürün katalog yazma. Sahiplik: yalnız kendi oluşturduğunu düzenler/siler. category var olmalı; cost/stock/image yazılamaz.",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "x-required-scope": "products:write",
        "x-status": "live",
        "externalDocs": {
          "description": "Alan tabloları + örnekler",
          "url": "https://dev.restomenum.com/docs/api/products-write"
        },
        "responses": {
          "200": {
            "description": "Başarı zarfı (`data` uca özel) — uygulama hataları da `{success:false,message}` dönebilir.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessEnvelope"
                }
              }
            }
          },
          "400": {
            "description": "Doğrulama / eksik-yanlış parametre (plugin.<kaynak>.missingParams, joi, unknown_payment_method…)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "401": {
            "description": "Geçersiz/eksik apiKey (unauthorized)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "403": {
            "description": "Scope reddi veya sahiplik reddi (plugin.scope.denied, plugin.<kaynak>.notOwner)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "404": {
            "description": "Kayıt bulunamadı (plugin.<kaynak>.notFound)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "409": {
            "description": "Çakışma (categoryNotEmpty, Duplicate request already in progress)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit (plugin.rateLimited) — Retry-After (sn) değerine uy; header yoksa üstel backoff + jitter. Limitler: https://dev.restomenum.com/docs/limits",
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/RetryAfter"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "default": {
            "description": "Hata zarfı — kodlar için /docs/errors",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          }
        }
      }
    },
    "/plugin-api/products/delete": {
      "post": {
        "operationId": "post_products_delete",
        "tags": [
          "products"
        ],
        "summary": "Ürün katalog yazma",
        "description": "Ürün katalog yazma. Sahiplik: yalnız kendi oluşturduğunu düzenler/siler. category var olmalı; cost/stock/image yazılamaz.",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "x-required-scope": "products:write",
        "x-status": "live",
        "externalDocs": {
          "description": "Alan tabloları + örnekler",
          "url": "https://dev.restomenum.com/docs/api/products-write"
        },
        "responses": {
          "200": {
            "description": "Başarı zarfı (`data` uca özel) — uygulama hataları da `{success:false,message}` dönebilir.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessEnvelope"
                }
              }
            }
          },
          "400": {
            "description": "Doğrulama / eksik-yanlış parametre (plugin.<kaynak>.missingParams, joi, unknown_payment_method…)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "401": {
            "description": "Geçersiz/eksik apiKey (unauthorized)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "403": {
            "description": "Scope reddi veya sahiplik reddi (plugin.scope.denied, plugin.<kaynak>.notOwner)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "404": {
            "description": "Kayıt bulunamadı (plugin.<kaynak>.notFound)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "409": {
            "description": "Çakışma (categoryNotEmpty, Duplicate request already in progress)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit (plugin.rateLimited) — Retry-After (sn) değerine uy; header yoksa üstel backoff + jitter. Limitler: https://dev.restomenum.com/docs/limits",
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/RetryAfter"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "default": {
            "description": "Hata zarfı — kodlar için /docs/errors",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          }
        }
      }
    },
    "/plugin-api/categories/create": {
      "post": {
        "operationId": "post_categories_create",
        "tags": [
          "categories"
        ],
        "summary": "Kategori katalog yazma (products:write; ayrı scope yok)",
        "description": "Kategori katalog yazma (products:write; ayrı scope yok). delete: kategori boş olmalı (categoryNotEmpty).",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "x-required-scope": "products:write",
        "x-status": "live",
        "externalDocs": {
          "description": "Alan tabloları + örnekler",
          "url": "https://dev.restomenum.com/docs/api/categories-write"
        },
        "responses": {
          "200": {
            "description": "Başarı zarfı (`data` uca özel) — uygulama hataları da `{success:false,message}` dönebilir.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessEnvelope"
                }
              }
            }
          },
          "400": {
            "description": "Doğrulama / eksik-yanlış parametre (plugin.<kaynak>.missingParams, joi, unknown_payment_method…)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "401": {
            "description": "Geçersiz/eksik apiKey (unauthorized)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "403": {
            "description": "Scope reddi veya sahiplik reddi (plugin.scope.denied, plugin.<kaynak>.notOwner)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "404": {
            "description": "Kayıt bulunamadı (plugin.<kaynak>.notFound)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "409": {
            "description": "Çakışma (categoryNotEmpty, Duplicate request already in progress)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit (plugin.rateLimited) — Retry-After (sn) değerine uy; header yoksa üstel backoff + jitter. Limitler: https://dev.restomenum.com/docs/limits",
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/RetryAfter"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "default": {
            "description": "Hata zarfı — kodlar için /docs/errors",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          }
        }
      }
    },
    "/plugin-api/categories/update": {
      "post": {
        "operationId": "post_categories_update",
        "tags": [
          "categories"
        ],
        "summary": "Kategori katalog yazma (products:write; ayrı scope yok)",
        "description": "Kategori katalog yazma (products:write; ayrı scope yok). delete: kategori boş olmalı (categoryNotEmpty).",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "x-required-scope": "products:write",
        "x-status": "live",
        "externalDocs": {
          "description": "Alan tabloları + örnekler",
          "url": "https://dev.restomenum.com/docs/api/categories-write"
        },
        "responses": {
          "200": {
            "description": "Başarı zarfı (`data` uca özel) — uygulama hataları da `{success:false,message}` dönebilir.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessEnvelope"
                }
              }
            }
          },
          "400": {
            "description": "Doğrulama / eksik-yanlış parametre (plugin.<kaynak>.missingParams, joi, unknown_payment_method…)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "401": {
            "description": "Geçersiz/eksik apiKey (unauthorized)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "403": {
            "description": "Scope reddi veya sahiplik reddi (plugin.scope.denied, plugin.<kaynak>.notOwner)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "404": {
            "description": "Kayıt bulunamadı (plugin.<kaynak>.notFound)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "409": {
            "description": "Çakışma (categoryNotEmpty, Duplicate request already in progress)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit (plugin.rateLimited) — Retry-After (sn) değerine uy; header yoksa üstel backoff + jitter. Limitler: https://dev.restomenum.com/docs/limits",
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/RetryAfter"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "default": {
            "description": "Hata zarfı — kodlar için /docs/errors",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          }
        }
      }
    },
    "/plugin-api/categories/delete": {
      "post": {
        "operationId": "post_categories_delete",
        "tags": [
          "categories"
        ],
        "summary": "Kategori katalog yazma (products:write; ayrı scope yok)",
        "description": "Kategori katalog yazma (products:write; ayrı scope yok). delete: kategori boş olmalı (categoryNotEmpty).",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "x-required-scope": "products:write",
        "x-status": "live",
        "externalDocs": {
          "description": "Alan tabloları + örnekler",
          "url": "https://dev.restomenum.com/docs/api/categories-write"
        },
        "responses": {
          "200": {
            "description": "Başarı zarfı (`data` uca özel) — uygulama hataları da `{success:false,message}` dönebilir.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessEnvelope"
                }
              }
            }
          },
          "400": {
            "description": "Doğrulama / eksik-yanlış parametre (plugin.<kaynak>.missingParams, joi, unknown_payment_method…)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "401": {
            "description": "Geçersiz/eksik apiKey (unauthorized)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "403": {
            "description": "Scope reddi veya sahiplik reddi (plugin.scope.denied, plugin.<kaynak>.notOwner)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "404": {
            "description": "Kayıt bulunamadı (plugin.<kaynak>.notFound)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "409": {
            "description": "Çakışma (categoryNotEmpty, Duplicate request already in progress)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit (plugin.rateLimited) — Retry-After (sn) değerine uy; header yoksa üstel backoff + jitter. Limitler: https://dev.restomenum.com/docs/limits",
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/RetryAfter"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "default": {
            "description": "Hata zarfı — kodlar için /docs/errors",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          }
        }
      }
    },
    "/plugin-api/payment-methods/create": {
      "post": {
        "operationId": "post_payment_methods_create",
        "tags": [
          "payment-methods"
        ],
        "summary": "Ödeme yöntemi tanımı yazma",
        "description": "Ödeme yöntemi tanımı yazma. Sahiplik kontrollü. Personel ataması panelden (API'de yazılamaz).",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "x-required-scope": "payment_methods:write",
        "x-status": "live",
        "externalDocs": {
          "description": "Alan tabloları + örnekler",
          "url": "https://dev.restomenum.com/docs/api/payment-methods-write"
        },
        "responses": {
          "200": {
            "description": "Başarı zarfı (`data` uca özel) — uygulama hataları da `{success:false,message}` dönebilir.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessEnvelope"
                }
              }
            }
          },
          "400": {
            "description": "Doğrulama / eksik-yanlış parametre (plugin.<kaynak>.missingParams, joi, unknown_payment_method…)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "401": {
            "description": "Geçersiz/eksik apiKey (unauthorized)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "403": {
            "description": "Scope reddi veya sahiplik reddi (plugin.scope.denied, plugin.<kaynak>.notOwner)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "404": {
            "description": "Kayıt bulunamadı (plugin.<kaynak>.notFound)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "409": {
            "description": "Çakışma (categoryNotEmpty, Duplicate request already in progress)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit (plugin.rateLimited) — Retry-After (sn) değerine uy; header yoksa üstel backoff + jitter. Limitler: https://dev.restomenum.com/docs/limits",
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/RetryAfter"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "default": {
            "description": "Hata zarfı — kodlar için /docs/errors",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          }
        }
      }
    },
    "/plugin-api/payment-methods/update": {
      "post": {
        "operationId": "post_payment_methods_update",
        "tags": [
          "payment-methods"
        ],
        "summary": "Ödeme yöntemi tanımı yazma",
        "description": "Ödeme yöntemi tanımı yazma. Sahiplik kontrollü. Personel ataması panelden (API'de yazılamaz).",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "x-required-scope": "payment_methods:write",
        "x-status": "live",
        "externalDocs": {
          "description": "Alan tabloları + örnekler",
          "url": "https://dev.restomenum.com/docs/api/payment-methods-write"
        },
        "responses": {
          "200": {
            "description": "Başarı zarfı (`data` uca özel) — uygulama hataları da `{success:false,message}` dönebilir.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessEnvelope"
                }
              }
            }
          },
          "400": {
            "description": "Doğrulama / eksik-yanlış parametre (plugin.<kaynak>.missingParams, joi, unknown_payment_method…)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "401": {
            "description": "Geçersiz/eksik apiKey (unauthorized)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "403": {
            "description": "Scope reddi veya sahiplik reddi (plugin.scope.denied, plugin.<kaynak>.notOwner)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "404": {
            "description": "Kayıt bulunamadı (plugin.<kaynak>.notFound)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "409": {
            "description": "Çakışma (categoryNotEmpty, Duplicate request already in progress)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit (plugin.rateLimited) — Retry-After (sn) değerine uy; header yoksa üstel backoff + jitter. Limitler: https://dev.restomenum.com/docs/limits",
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/RetryAfter"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "default": {
            "description": "Hata zarfı — kodlar için /docs/errors",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          }
        }
      }
    },
    "/plugin-api/payment-methods/delete": {
      "post": {
        "operationId": "post_payment_methods_delete",
        "tags": [
          "payment-methods"
        ],
        "summary": "Ödeme yöntemi tanımı yazma",
        "description": "Ödeme yöntemi tanımı yazma. Sahiplik kontrollü. Personel ataması panelden (API'de yazılamaz).",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "x-required-scope": "payment_methods:write",
        "x-status": "live",
        "externalDocs": {
          "description": "Alan tabloları + örnekler",
          "url": "https://dev.restomenum.com/docs/api/payment-methods-write"
        },
        "responses": {
          "200": {
            "description": "Başarı zarfı (`data` uca özel) — uygulama hataları da `{success:false,message}` dönebilir.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessEnvelope"
                }
              }
            }
          },
          "400": {
            "description": "Doğrulama / eksik-yanlış parametre (plugin.<kaynak>.missingParams, joi, unknown_payment_method…)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "401": {
            "description": "Geçersiz/eksik apiKey (unauthorized)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "403": {
            "description": "Scope reddi veya sahiplik reddi (plugin.scope.denied, plugin.<kaynak>.notOwner)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "404": {
            "description": "Kayıt bulunamadı (plugin.<kaynak>.notFound)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "409": {
            "description": "Çakışma (categoryNotEmpty, Duplicate request already in progress)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit (plugin.rateLimited) — Retry-After (sn) değerine uy; header yoksa üstel backoff + jitter. Limitler: https://dev.restomenum.com/docs/limits",
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/RetryAfter"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "default": {
            "description": "Hata zarfı — kodlar için /docs/errors",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          }
        }
      }
    },
    "/plugin-api/ingredients/create": {
      "post": {
        "operationId": "post_ingredients_create",
        "tags": [
          "ingredients"
        ],
        "summary": "Malzeme/stok kartı yazma",
        "description": "Malzeme/stok kartı yazma. Sahiplik kontrollü. stock/ort yazılamaz; yeni kart stok 0.",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "x-required-scope": "ingredients:write",
        "x-status": "live",
        "externalDocs": {
          "description": "Alan tabloları + örnekler",
          "url": "https://dev.restomenum.com/docs/api/ingredients-write"
        },
        "responses": {
          "200": {
            "description": "Başarı zarfı (`data` uca özel) — uygulama hataları da `{success:false,message}` dönebilir.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessEnvelope"
                }
              }
            }
          },
          "400": {
            "description": "Doğrulama / eksik-yanlış parametre (plugin.<kaynak>.missingParams, joi, unknown_payment_method…)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "401": {
            "description": "Geçersiz/eksik apiKey (unauthorized)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "403": {
            "description": "Scope reddi veya sahiplik reddi (plugin.scope.denied, plugin.<kaynak>.notOwner)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "404": {
            "description": "Kayıt bulunamadı (plugin.<kaynak>.notFound)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "409": {
            "description": "Çakışma (categoryNotEmpty, Duplicate request already in progress)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit (plugin.rateLimited) — Retry-After (sn) değerine uy; header yoksa üstel backoff + jitter. Limitler: https://dev.restomenum.com/docs/limits",
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/RetryAfter"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "default": {
            "description": "Hata zarfı — kodlar için /docs/errors",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          }
        }
      }
    },
    "/plugin-api/ingredients/update": {
      "post": {
        "operationId": "post_ingredients_update",
        "tags": [
          "ingredients"
        ],
        "summary": "Malzeme/stok kartı yazma",
        "description": "Malzeme/stok kartı yazma. Sahiplik kontrollü. stock/ort yazılamaz; yeni kart stok 0.",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "x-required-scope": "ingredients:write",
        "x-status": "live",
        "externalDocs": {
          "description": "Alan tabloları + örnekler",
          "url": "https://dev.restomenum.com/docs/api/ingredients-write"
        },
        "responses": {
          "200": {
            "description": "Başarı zarfı (`data` uca özel) — uygulama hataları da `{success:false,message}` dönebilir.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessEnvelope"
                }
              }
            }
          },
          "400": {
            "description": "Doğrulama / eksik-yanlış parametre (plugin.<kaynak>.missingParams, joi, unknown_payment_method…)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "401": {
            "description": "Geçersiz/eksik apiKey (unauthorized)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "403": {
            "description": "Scope reddi veya sahiplik reddi (plugin.scope.denied, plugin.<kaynak>.notOwner)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "404": {
            "description": "Kayıt bulunamadı (plugin.<kaynak>.notFound)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "409": {
            "description": "Çakışma (categoryNotEmpty, Duplicate request already in progress)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit (plugin.rateLimited) — Retry-After (sn) değerine uy; header yoksa üstel backoff + jitter. Limitler: https://dev.restomenum.com/docs/limits",
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/RetryAfter"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "default": {
            "description": "Hata zarfı — kodlar için /docs/errors",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          }
        }
      }
    },
    "/plugin-api/ingredients/delete": {
      "post": {
        "operationId": "post_ingredients_delete",
        "tags": [
          "ingredients"
        ],
        "summary": "Malzeme/stok kartı yazma",
        "description": "Malzeme/stok kartı yazma. Sahiplik kontrollü. stock/ort yazılamaz; yeni kart stok 0.",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "x-required-scope": "ingredients:write",
        "x-status": "live",
        "externalDocs": {
          "description": "Alan tabloları + örnekler",
          "url": "https://dev.restomenum.com/docs/api/ingredients-write"
        },
        "responses": {
          "200": {
            "description": "Başarı zarfı (`data` uca özel) — uygulama hataları da `{success:false,message}` dönebilir.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessEnvelope"
                }
              }
            }
          },
          "400": {
            "description": "Doğrulama / eksik-yanlış parametre (plugin.<kaynak>.missingParams, joi, unknown_payment_method…)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "401": {
            "description": "Geçersiz/eksik apiKey (unauthorized)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "403": {
            "description": "Scope reddi veya sahiplik reddi (plugin.scope.denied, plugin.<kaynak>.notOwner)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "404": {
            "description": "Kayıt bulunamadı (plugin.<kaynak>.notFound)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "409": {
            "description": "Çakışma (categoryNotEmpty, Duplicate request already in progress)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit (plugin.rateLimited) — Retry-After (sn) değerine uy; header yoksa üstel backoff + jitter. Limitler: https://dev.restomenum.com/docs/limits",
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/RetryAfter"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "default": {
            "description": "Hata zarfı — kodlar için /docs/errors",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          }
        }
      }
    },
    "/plugin-api/purchases/create": {
      "post": {
        "operationId": "post_purchases_create",
        "tags": [
          "purchases"
        ],
        "summary": "Tek-seferlik (IAP) satın alma başlat",
        "description": "Tek-seferlik (IAP) satın alma başlat. Stripe Checkout URL üretir; tenant UI'da öder. Gross kuruş [min,max]; idempotencyKey ile retry-güvenli. Ayrı write kovası.",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "x-required-scope": "purchases:write",
        "x-status": "live",
        "externalDocs": {
          "description": "Alan tabloları + örnekler",
          "url": "https://dev.restomenum.com/docs/monetization/iap#create"
        },
        "responses": {
          "200": {
            "description": "Başarı zarfı (`data` uca özel) — uygulama hataları da `{success:false,message}` dönebilir.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessEnvelope"
                }
              }
            }
          },
          "400": {
            "description": "Doğrulama / eksik-yanlış parametre (plugin.<kaynak>.missingParams, joi, unknown_payment_method…)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "401": {
            "description": "Geçersiz/eksik apiKey (unauthorized)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "403": {
            "description": "Scope reddi veya sahiplik reddi (plugin.scope.denied, plugin.<kaynak>.notOwner)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "404": {
            "description": "Kayıt bulunamadı (plugin.<kaynak>.notFound)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "409": {
            "description": "Çakışma (categoryNotEmpty, Duplicate request already in progress)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit (plugin.rateLimited) — Retry-After (sn) değerine uy; header yoksa üstel backoff + jitter. Limitler: https://dev.restomenum.com/docs/limits",
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/RetryAfter"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "default": {
            "description": "Hata zarfı — kodlar için /docs/errors",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          }
        }
      }
    },
    "/plugin-api/purchases/get": {
      "get": {
        "operationId": "get_purchases_get",
        "tags": [
          "purchases"
        ],
        "summary": "IAP satın alma durumu (authoritative)",
        "description": "IAP satın alma durumu (authoritative). status/type/productKey/amount/currency/zaman damgaları. net/developerShare/Stripe ID gibi finansal alanlar sızmaz.",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "x-required-scope": "purchases:read",
        "x-status": "live",
        "externalDocs": {
          "description": "Alan tabloları + örnekler",
          "url": "https://dev.restomenum.com/docs/monetization/iap#get"
        },
        "parameters": [
          {
            "name": "purchaseId",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Başarı zarfı (`data` uca özel) — uygulama hataları da `{success:false,message}` dönebilir.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessEnvelope"
                }
              }
            }
          },
          "400": {
            "description": "Doğrulama / eksik-yanlış parametre (plugin.<kaynak>.missingParams, joi, unknown_payment_method…)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "401": {
            "description": "Geçersiz/eksik apiKey (unauthorized)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "403": {
            "description": "Scope reddi veya sahiplik reddi (plugin.scope.denied, plugin.<kaynak>.notOwner)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "404": {
            "description": "Kayıt bulunamadı (plugin.<kaynak>.notFound)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "409": {
            "description": "Çakışma (categoryNotEmpty, Duplicate request already in progress)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit (plugin.rateLimited) — Retry-After (sn) değerine uy; header yoksa üstel backoff + jitter. Limitler: https://dev.restomenum.com/docs/limits",
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/RetryAfter"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "default": {
            "description": "Hata zarfı — kodlar için /docs/errors",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          }
        }
      }
    },
    "/plugin-api/purchases/list": {
      "get": {
        "operationId": "get_purchases_list",
        "tags": [
          "purchases"
        ],
        "summary": "Kendi IAP satın almaları — en yeni önce, limit max 100",
        "description": "Kendi IAP satın almaları — en yeni önce, limit max 100. Yalnız çağıran install'ın (serverId+pluginId) kayıtları; başka eklenti/tenant görünmez.",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "x-required-scope": "purchases:read",
        "x-status": "live",
        "externalDocs": {
          "description": "Alan tabloları + örnekler",
          "url": "https://dev.restomenum.com/docs/monetization/iap#list"
        },
        "responses": {
          "200": {
            "description": "Başarı zarfı (`data` uca özel) — uygulama hataları da `{success:false,message}` dönebilir.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessEnvelope"
                }
              }
            }
          },
          "400": {
            "description": "Doğrulama / eksik-yanlış parametre (plugin.<kaynak>.missingParams, joi, unknown_payment_method…)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "401": {
            "description": "Geçersiz/eksik apiKey (unauthorized)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "403": {
            "description": "Scope reddi veya sahiplik reddi (plugin.scope.denied, plugin.<kaynak>.notOwner)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "404": {
            "description": "Kayıt bulunamadı (plugin.<kaynak>.notFound)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "409": {
            "description": "Çakışma (categoryNotEmpty, Duplicate request already in progress)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit (plugin.rateLimited) — Retry-After (sn) değerine uy; header yoksa üstel backoff + jitter. Limitler: https://dev.restomenum.com/docs/limits",
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/RetryAfter"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "default": {
            "description": "Hata zarfı — kodlar için /docs/errors",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          }
        }
      }
    }
  },
  "webhooks": {
    "table.created": {
      "post": {
        "operationId": "webhook_table_created",
        "summary": "Event: table.created (abonelik gerekir)",
        "description": "`table.created` — webhookUrl'üne HMAC imzalı POST gelir. İmzayı doğrula, hızlı 2xx dön, `id` ile dedup et. Teslim/retry politikası: https://dev.restomenum.com/docs/delivery-health",
        "externalDocs": {
          "url": "https://dev.restomenum.com/docs/events"
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/SignatureHeader"
          },
          {
            "$ref": "#/components/parameters/EventHeader"
          },
          {
            "$ref": "#/components/parameters/DeliveryHeader"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WebhookEnvelope"
              },
              "example": {
                "id": "evt_<uuid>",
                "type": "table.created",
                "version": "1",
                "tenantId": "<tenantId>",
                "occurredAt": 1781000000000,
                "data": {
                  "tableId": "masa-1",
                  "tableName": "Masa 1",
                  "docNo": 12,
                  "desing": "Bahçe",
                  "location": "Masa 1",
                  "personCount": 2,
                  "customer": null,
                  "orders": [
                    {
                      "id": "masa-1-ab",
                      "title": "Menemen",
                      "quantity": 2,
                      "options": [],
                      "extra": 0,
                      "discount": 0,
                      "note": "",
                      "lineTotal": 38
                    }
                  ],
                  "total": 38,
                  "paid": 0,
                  "totalDiscount": 0
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Alındı — hızlı 2xx dön; ağır işi async yap (10 sn timeout, 6 retry)."
          }
        }
      }
    },
    "table.closed": {
      "post": {
        "operationId": "webhook_table_closed",
        "summary": "Event: table.closed (abonelik gerekir)",
        "description": "`table.closed` — webhookUrl'üne HMAC imzalı POST gelir. İmzayı doğrula, hızlı 2xx dön, `id` ile dedup et. Teslim/retry politikası: https://dev.restomenum.com/docs/delivery-health",
        "externalDocs": {
          "url": "https://dev.restomenum.com/docs/events"
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/SignatureHeader"
          },
          {
            "$ref": "#/components/parameters/EventHeader"
          },
          {
            "$ref": "#/components/parameters/DeliveryHeader"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WebhookEnvelope"
              },
              "example": {
                "id": "tableclosed_<serverId><saleId>",
                "type": "table.closed",
                "version": "1",
                "tenantId": "<tenantId>",
                "occurredAt": 1780884616000,
                "data": {
                  "tableId": "e4356402-...",
                  "tableName": "Masa 1",
                  "docNo": 5,
                  "desing": "Bahçe",
                  "location": "Masa 1",
                  "personCount": 0,
                  "orders": [
                    {
                      "id": "masa-1-f308",
                      "title": "Bellavista",
                      "quantity": 1,
                      "options": [],
                      "extra": 0,
                      "discount": 0,
                      "note": "",
                      "lineTotal": 13
                    },
                    {
                      "id": "masa-1-4724",
                      "title": "dondurma",
                      "quantity": 1,
                      "options": [
                        "çilek",
                        "oreo"
                      ],
                      "lineTotal": 4
                    }
                  ],
                  "total": 17,
                  "paid": 17,
                  "totalDiscount": 0,
                  "status": null,
                  "channel": "TABLE"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Alındı — hızlı 2xx dön; ağır işi async yap (10 sn timeout, 6 retry)."
          }
        }
      }
    },
    "packet.created": {
      "post": {
        "operationId": "webhook_packet_created",
        "summary": "Event: packet.created (abonelik gerekir)",
        "description": "`packet.created` — webhookUrl'üne HMAC imzalı POST gelir. İmzayı doğrula, hızlı 2xx dön, `id` ile dedup et. Teslim/retry politikası: https://dev.restomenum.com/docs/delivery-health",
        "externalDocs": {
          "url": "https://dev.restomenum.com/docs/events"
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/SignatureHeader"
          },
          {
            "$ref": "#/components/parameters/EventHeader"
          },
          {
            "$ref": "#/components/parameters/DeliveryHeader"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WebhookEnvelope"
              },
              "example": {
                "id": "evt_9f2a7c1b",
                "type": "packet.created",
                "version": "1",
                "tenantId": "tnt_123",
                "occurredAt": 1730000000000,
                "data": {
                  "packetId": "1780633662954",
                  "docNo": 42,
                  "orderCode": "A12",
                  "total": 145,
                  "paid": 0,
                  "totalDiscount": 0,
                  "paymentNote": "Kapıda nakit",
                  "isScheduled": false,
                  "scheduledDate": null,
                  "note": "Zili çalma",
                  "entegrasyon": "packet",
                  "orders": [
                    {
                      "id": "ord_1",
                      "title": "Lahmacun",
                      "quantity": 2,
                      "options": [
                        "Acılı",
                        "Bol soğan"
                      ],
                      "extra": 0,
                      "discount": 0,
                      "note": "",
                      "lineTotal": 60,
                      "product": {
                        "title": "Lahmacun"
                      }
                    }
                  ],
                  "customer": {
                    "id": "cust_9",
                    "name": "Ahmet Yılmaz",
                    "phone": "05xxxxxxxxx",
                    "address": "Atatürk Cad. No:5",
                    "addressDescription": "2. kat",
                    "region": "Kadıköy",
                    "call": "05xxxxxxxxx"
                  },
                  "callbackUrls": {
                    "pickup": "https://plugins.restomenum.app/plugin-api/packets/{tenantId}/{pluginId}/{packetId}/pickup?token=…",
                    "delivered": "https://plugins.restomenum.app/plugin-api/packets/{tenantId}/{pluginId}/{packetId}/delivered?token=…",
                    "cancel": "https://plugins.restomenum.app/plugin-api/packets/{tenantId}/{pluginId}/{packetId}/cancel?token=…"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Alındı — hızlı 2xx dön; ağır işi async yap (10 sn timeout, 6 retry)."
          }
        }
      }
    },
    "packet.closed": {
      "post": {
        "operationId": "webhook_packet_closed",
        "summary": "Event: packet.closed (abonelik gerekir)",
        "description": "`packet.closed` — webhookUrl'üne HMAC imzalı POST gelir. İmzayı doğrula, hızlı 2xx dön, `id` ile dedup et. Teslim/retry politikası: https://dev.restomenum.com/docs/delivery-health",
        "externalDocs": {
          "url": "https://dev.restomenum.com/docs/events"
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/SignatureHeader"
          },
          {
            "$ref": "#/components/parameters/EventHeader"
          },
          {
            "$ref": "#/components/parameters/DeliveryHeader"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WebhookEnvelope"
              },
              "example": {
                "id": "packetclosed_<serverId><packetId>",
                "type": "packet.closed",
                "version": "1",
                "tenantId": "<tenantId>",
                "occurredAt": 1780885101009,
                "data": {
                  "packetId": "YJyvBuxjDA31kdc7E3KQ",
                  "docNo": 3,
                  "channel": "PACKET",
                  "entegrasyon": "packet",
                  "status": "Delivered",
                  "note": "Sipariş Notu",
                  "paymentNote": "nakit",
                  "total": 17,
                  "paid": 17,
                  "totalDiscount": 0,
                  "orders": [
                    {
                      "id": "1780875078783-32e1",
                      "title": "Bellavista",
                      "quantity": 1,
                      "options": [],
                      "extra": 0,
                      "discount": 0,
                      "note": "",
                      "lineTotal": 13
                    },
                    {
                      "id": "1780875078783-4e12",
                      "title": "dondurma",
                      "quantity": 1,
                      "options": [
                        "çilek"
                      ],
                      "extra": 0,
                      "discount": 0,
                      "note": "",
                      "lineTotal": 4
                    }
                  ],
                  "customer": {
                    "id": "123456",
                    "name": "Ahmet Bayrak",
                    "region": null,
                    "address": "Adres",
                    "addressDescription": null,
                    "phone": "123456",
                    "call": "123456",
                    "latitude": null,
                    "longitude": null
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Alındı — hızlı 2xx dön; ağır işi async yap (10 sn timeout, 6 retry)."
          }
        }
      }
    },
    "product.created": {
      "post": {
        "operationId": "webhook_product_created",
        "summary": "Event: product.created (abonelik gerekir)",
        "description": "`product.created` — webhookUrl'üne HMAC imzalı POST gelir. İmzayı doğrula, hızlı 2xx dön, `id` ile dedup et. Teslim/retry politikası: https://dev.restomenum.com/docs/delivery-health",
        "externalDocs": {
          "url": "https://dev.restomenum.com/docs/events"
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/SignatureHeader"
          },
          {
            "$ref": "#/components/parameters/EventHeader"
          },
          {
            "$ref": "#/components/parameters/DeliveryHeader"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WebhookEnvelope"
              },
              "example": {
                "id": "evt_<uuid>",
                "type": "product.created",
                "version": "1",
                "tenantId": "<tenantId>",
                "occurredAt": 1781000000000,
                "data": {
                  "id": "3b5d-f6d0",
                  "title": "Menemen",
                  "category": "a0-62",
                  "price": 19,
                  "tax": 0,
                  "active": true,
                  "image": "https://d37x2wx7jj7xm7.cloudfront.net/server/SM9M.../products/.../original.jpeg",
                  "barcode": "",
                  "barcodeType": "Product",
                  "stock": 59,
                  "languages": {
                    "US": {
                      "title": "Menemen",
                      "description": ""
                    }
                  },
                  "options": [
                    {
                      "id": 1780871104983,
                      "title": "",
                      "min": 0,
                      "max": 99,
                      "multiple": true,
                      "choices": [
                        {
                          "id": 1661781517624,
                          "title": "Sade",
                          "price": 0
                        },
                        {
                          "id": 1661781517374,
                          "title": "Peynir",
                          "price": 1
                        },
                        {
                          "id": 1661781517278,
                          "title": "Kavurma",
                          "price": 5
                        },
                        {
                          "id": 1661781517482,
                          "title": "Sucuk",
                          "price": 2
                        }
                      ]
                    }
                  ]
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Alındı — hızlı 2xx dön; ağır işi async yap (10 sn timeout, 6 retry)."
          }
        }
      }
    },
    "product.updated": {
      "post": {
        "operationId": "webhook_product_updated",
        "summary": "Event: product.updated (abonelik gerekir)",
        "description": "`product.updated` — webhookUrl'üne HMAC imzalı POST gelir. İmzayı doğrula, hızlı 2xx dön, `id` ile dedup et. Teslim/retry politikası: https://dev.restomenum.com/docs/delivery-health",
        "externalDocs": {
          "url": "https://dev.restomenum.com/docs/events"
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/SignatureHeader"
          },
          {
            "$ref": "#/components/parameters/EventHeader"
          },
          {
            "$ref": "#/components/parameters/DeliveryHeader"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WebhookEnvelope"
              },
              "example": {
                "id": "evt_<uuid>",
                "type": "product.updated",
                "version": "1",
                "tenantId": "<tenantId>",
                "occurredAt": 1781000000000,
                "data": {
                  "id": "3b5d-f6d0",
                  "title": "Menemen",
                  "category": "a0-62",
                  "price": 19,
                  "tax": 0,
                  "active": true,
                  "image": "https://d37x2wx7jj7xm7.cloudfront.net/server/SM9M.../products/.../original.jpeg",
                  "barcode": "",
                  "barcodeType": "Product",
                  "stock": 59,
                  "languages": {
                    "US": {
                      "title": "Menemen",
                      "description": ""
                    }
                  },
                  "options": [
                    {
                      "id": 1780871104983,
                      "title": "",
                      "min": 0,
                      "max": 99,
                      "multiple": true,
                      "choices": [
                        {
                          "id": 1661781517624,
                          "title": "Sade",
                          "price": 0
                        },
                        {
                          "id": 1661781517374,
                          "title": "Peynir",
                          "price": 1
                        },
                        {
                          "id": 1661781517278,
                          "title": "Kavurma",
                          "price": 5
                        },
                        {
                          "id": 1661781517482,
                          "title": "Sucuk",
                          "price": 2
                        }
                      ]
                    }
                  ]
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Alındı — hızlı 2xx dön; ağır işi async yap (10 sn timeout, 6 retry)."
          }
        }
      }
    },
    "product.deleted": {
      "post": {
        "operationId": "webhook_product_deleted",
        "summary": "Event: product.deleted (abonelik gerekir)",
        "description": "`product.deleted` — webhookUrl'üne HMAC imzalı POST gelir. İmzayı doğrula, hızlı 2xx dön, `id` ile dedup et. Teslim/retry politikası: https://dev.restomenum.com/docs/delivery-health",
        "externalDocs": {
          "url": "https://dev.restomenum.com/docs/events"
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/SignatureHeader"
          },
          {
            "$ref": "#/components/parameters/EventHeader"
          },
          {
            "$ref": "#/components/parameters/DeliveryHeader"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WebhookEnvelope"
              },
              "example": {
                "id": "evt_<uuid>",
                "type": "product.deleted",
                "version": "1",
                "tenantId": "<tenantId>",
                "occurredAt": 1781000000000,
                "data": {
                  "id": "3b5d-f6d0",
                  "title": "Menemen",
                  "category": "a0-62",
                  "price": 19,
                  "tax": 0,
                  "active": true,
                  "image": "https://d37x2wx7jj7xm7.cloudfront.net/server/SM9M.../products/.../original.jpeg",
                  "barcode": "",
                  "barcodeType": "Product",
                  "stock": 59,
                  "languages": {
                    "US": {
                      "title": "Menemen",
                      "description": ""
                    }
                  },
                  "options": [
                    {
                      "id": 1780871104983,
                      "title": "",
                      "min": 0,
                      "max": 99,
                      "multiple": true,
                      "choices": [
                        {
                          "id": 1661781517624,
                          "title": "Sade",
                          "price": 0
                        },
                        {
                          "id": 1661781517374,
                          "title": "Peynir",
                          "price": 1
                        },
                        {
                          "id": 1661781517278,
                          "title": "Kavurma",
                          "price": 5
                        },
                        {
                          "id": 1661781517482,
                          "title": "Sucuk",
                          "price": 2
                        }
                      ]
                    }
                  ]
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Alındı — hızlı 2xx dön; ağır işi async yap (10 sn timeout, 6 retry)."
          }
        }
      }
    },
    "category.created": {
      "post": {
        "operationId": "webhook_category_created",
        "summary": "Event: category.created (abonelik gerekir)",
        "description": "`category.created` — webhookUrl'üne HMAC imzalı POST gelir. İmzayı doğrula, hızlı 2xx dön, `id` ile dedup et. Teslim/retry politikası: https://dev.restomenum.com/docs/delivery-health",
        "externalDocs": {
          "url": "https://dev.restomenum.com/docs/events"
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/SignatureHeader"
          },
          {
            "$ref": "#/components/parameters/EventHeader"
          },
          {
            "$ref": "#/components/parameters/DeliveryHeader"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WebhookEnvelope"
              },
              "example": {
                "id": "evt_<uuid>",
                "type": "category.created",
                "version": "1",
                "tenantId": "<tenantId>",
                "occurredAt": 1780954278355,
                "data": {
                  "id": "a0-0c",
                  "title": "SOĞUK İÇECEKLER",
                  "image": "https://d37x2wx7jj7xm7.cloudfront.net/server/SM9M.../category/.../original.jpeg",
                  "rank": 2,
                  "active": true,
                  "languages": {}
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Alındı — hızlı 2xx dön; ağır işi async yap (10 sn timeout, 6 retry)."
          }
        }
      }
    },
    "category.updated": {
      "post": {
        "operationId": "webhook_category_updated",
        "summary": "Event: category.updated (abonelik gerekir)",
        "description": "`category.updated` — webhookUrl'üne HMAC imzalı POST gelir. İmzayı doğrula, hızlı 2xx dön, `id` ile dedup et. Teslim/retry politikası: https://dev.restomenum.com/docs/delivery-health",
        "externalDocs": {
          "url": "https://dev.restomenum.com/docs/events"
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/SignatureHeader"
          },
          {
            "$ref": "#/components/parameters/EventHeader"
          },
          {
            "$ref": "#/components/parameters/DeliveryHeader"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WebhookEnvelope"
              },
              "example": {
                "id": "evt_<uuid>",
                "type": "category.updated",
                "version": "1",
                "tenantId": "<tenantId>",
                "occurredAt": 1780954278355,
                "data": {
                  "id": "a0-0c",
                  "title": "SOĞUK İÇECEKLER",
                  "image": "https://d37x2wx7jj7xm7.cloudfront.net/server/SM9M.../category/.../original.jpeg",
                  "rank": 2,
                  "active": true,
                  "languages": {}
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Alındı — hızlı 2xx dön; ağır işi async yap (10 sn timeout, 6 retry)."
          }
        }
      }
    },
    "category.deleted": {
      "post": {
        "operationId": "webhook_category_deleted",
        "summary": "Event: category.deleted (abonelik gerekir)",
        "description": "`category.deleted` — webhookUrl'üne HMAC imzalı POST gelir. İmzayı doğrula, hızlı 2xx dön, `id` ile dedup et. Teslim/retry politikası: https://dev.restomenum.com/docs/delivery-health",
        "externalDocs": {
          "url": "https://dev.restomenum.com/docs/events"
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/SignatureHeader"
          },
          {
            "$ref": "#/components/parameters/EventHeader"
          },
          {
            "$ref": "#/components/parameters/DeliveryHeader"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WebhookEnvelope"
              },
              "example": {
                "id": "evt_<uuid>",
                "type": "category.deleted",
                "version": "1",
                "tenantId": "<tenantId>",
                "occurredAt": 1780954278355,
                "data": {
                  "id": "a0-0c",
                  "title": "SOĞUK İÇECEKLER",
                  "image": "https://d37x2wx7jj7xm7.cloudfront.net/server/SM9M.../category/.../original.jpeg",
                  "rank": 2,
                  "active": true,
                  "languages": {}
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Alındı — hızlı 2xx dön; ağır işi async yap (10 sn timeout, 6 retry)."
          }
        }
      }
    },
    "user.created": {
      "post": {
        "operationId": "webhook_user_created",
        "summary": "Event: user.created (abonelik gerekir)",
        "description": "`user.created` — webhookUrl'üne HMAC imzalı POST gelir. İmzayı doğrula, hızlı 2xx dön, `id` ile dedup et. Teslim/retry politikası: https://dev.restomenum.com/docs/delivery-health",
        "externalDocs": {
          "url": "https://dev.restomenum.com/docs/events"
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/SignatureHeader"
          },
          {
            "$ref": "#/components/parameters/EventHeader"
          },
          {
            "$ref": "#/components/parameters/DeliveryHeader"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WebhookEnvelope"
              },
              "example": {
                "id": "evt_<uuid>",
                "type": "user.created",
                "version": "1",
                "tenantId": "<tenantId>",
                "occurredAt": 1781000000000,
                "data": {
                  "id": "lZz6BqN46Og4HKrhjf6eflOgWnA2",
                  "name": "Test User"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Alındı — hızlı 2xx dön; ağır işi async yap (10 sn timeout, 6 retry)."
          }
        }
      }
    },
    "user.updated": {
      "post": {
        "operationId": "webhook_user_updated",
        "summary": "Event: user.updated (abonelik gerekir)",
        "description": "`user.updated` — webhookUrl'üne HMAC imzalı POST gelir. İmzayı doğrula, hızlı 2xx dön, `id` ile dedup et. Teslim/retry politikası: https://dev.restomenum.com/docs/delivery-health",
        "externalDocs": {
          "url": "https://dev.restomenum.com/docs/events"
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/SignatureHeader"
          },
          {
            "$ref": "#/components/parameters/EventHeader"
          },
          {
            "$ref": "#/components/parameters/DeliveryHeader"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WebhookEnvelope"
              },
              "example": {
                "id": "evt_<uuid>",
                "type": "user.updated",
                "version": "1",
                "tenantId": "<tenantId>",
                "occurredAt": 1781000000000,
                "data": {
                  "id": "lZz6BqN46Og4HKrhjf6eflOgWnA2",
                  "name": "Test User"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Alındı — hızlı 2xx dön; ağır işi async yap (10 sn timeout, 6 retry)."
          }
        }
      }
    },
    "user.deleted": {
      "post": {
        "operationId": "webhook_user_deleted",
        "summary": "Event: user.deleted (abonelik gerekir)",
        "description": "`user.deleted` — webhookUrl'üne HMAC imzalı POST gelir. İmzayı doğrula, hızlı 2xx dön, `id` ile dedup et. Teslim/retry politikası: https://dev.restomenum.com/docs/delivery-health",
        "externalDocs": {
          "url": "https://dev.restomenum.com/docs/events"
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/SignatureHeader"
          },
          {
            "$ref": "#/components/parameters/EventHeader"
          },
          {
            "$ref": "#/components/parameters/DeliveryHeader"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WebhookEnvelope"
              },
              "example": {
                "id": "evt_<uuid>",
                "type": "user.deleted",
                "version": "1",
                "tenantId": "<tenantId>",
                "occurredAt": 1781000000000,
                "data": {
                  "id": "lZz6BqN46Og4HKrhjf6eflOgWnA2",
                  "name": "Test User"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Alındı — hızlı 2xx dön; ağır işi async yap (10 sn timeout, 6 retry)."
          }
        }
      }
    },
    "customer.created": {
      "post": {
        "operationId": "webhook_customer_created",
        "summary": "Event: customer.created (abonelik gerekir)",
        "description": "`customer.created` — webhookUrl'üne HMAC imzalı POST gelir. İmzayı doğrula, hızlı 2xx dön, `id` ile dedup et. Teslim/retry politikası: https://dev.restomenum.com/docs/delivery-health",
        "externalDocs": {
          "url": "https://dev.restomenum.com/docs/events"
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/SignatureHeader"
          },
          {
            "$ref": "#/components/parameters/EventHeader"
          },
          {
            "$ref": "#/components/parameters/DeliveryHeader"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WebhookEnvelope"
              },
              "example": {
                "id": "evt_<deterministik-firestore-trigger-id>",
                "type": "customer.created",
                "version": "1",
                "tenantId": "<tenantId>",
                "occurredAt": 1781000000000,
                "data": {
                  "customerId": "cust_001",
                  "customer": {
                    "id": "cust_001",
                    "name": "Ahmet Yılmaz",
                    "phone": "5551234567",
                    "address": "Atatürk Cad. No:5",
                    "total": 0
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Alındı — hızlı 2xx dön; ağır işi async yap (10 sn timeout, 6 retry)."
          }
        }
      }
    },
    "customer.updated": {
      "post": {
        "operationId": "webhook_customer_updated",
        "summary": "Event: customer.updated (abonelik gerekir)",
        "description": "`customer.updated` — webhookUrl'üne HMAC imzalı POST gelir. İmzayı doğrula, hızlı 2xx dön, `id` ile dedup et. Teslim/retry politikası: https://dev.restomenum.com/docs/delivery-health",
        "externalDocs": {
          "url": "https://dev.restomenum.com/docs/events"
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/SignatureHeader"
          },
          {
            "$ref": "#/components/parameters/EventHeader"
          },
          {
            "$ref": "#/components/parameters/DeliveryHeader"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WebhookEnvelope"
              },
              "example": {
                "id": "evt_<deterministik-firestore-trigger-id>",
                "type": "customer.updated",
                "version": "1",
                "tenantId": "<tenantId>",
                "occurredAt": 1781000000000,
                "data": {
                  "customerId": "cust_001",
                  "customer": {
                    "id": "cust_001",
                    "name": "Ahmet Yılmaz",
                    "phone": "5551234567",
                    "address": "Atatürk Cad. No:5",
                    "total": 22.61
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Alındı — hızlı 2xx dön; ağır işi async yap (10 sn timeout, 6 retry)."
          }
        }
      }
    },
    "customer.order_added": {
      "post": {
        "operationId": "webhook_customer_order_added",
        "summary": "Event: customer.order_added (abonelik gerekir)",
        "description": "`customer.order_added` — webhookUrl'üne HMAC imzalı POST gelir. İmzayı doğrula, hızlı 2xx dön, `id` ile dedup et. Teslim/retry politikası: https://dev.restomenum.com/docs/delivery-health",
        "externalDocs": {
          "url": "https://dev.restomenum.com/docs/events"
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/SignatureHeader"
          },
          {
            "$ref": "#/components/parameters/EventHeader"
          },
          {
            "$ref": "#/components/parameters/DeliveryHeader"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WebhookEnvelope"
              },
              "example": {
                "id": "cust_001_addorder_order_line_001order_line_002",
                "type": "customer.order_added",
                "version": "1",
                "tenantId": "<tenantId>",
                "occurredAt": 1781000000000,
                "data": {
                  "customerId": "cust_001",
                  "customer": {
                    "id": "cust_001",
                    "name": "Ahmet Yılmaz",
                    "phone": "5551234567",
                    "address": "Atatürk Cad. No:5",
                    "total": 46.41
                  },
                  "orders": [
                    {
                      "id": "order_line_001",
                      "title": "Espresso",
                      "quantity": 1,
                      "options": [],
                      "extra": 0,
                      "note": "",
                      "lineTotal": 9.9
                    },
                    {
                      "id": "order_line_002",
                      "title": "Cortado",
                      "quantity": 1,
                      "options": [],
                      "extra": 0,
                      "note": "",
                      "lineTotal": 13.9
                    }
                  ],
                  "amount": 23.8,
                  "balance": 36.41
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Alındı — hızlı 2xx dön; ağır işi async yap (10 sn timeout, 6 retry)."
          }
        }
      }
    },
    "customer.payment_added": {
      "post": {
        "operationId": "webhook_customer_payment_added",
        "summary": "Event: customer.payment_added (abonelik gerekir)",
        "description": "`customer.payment_added` — webhookUrl'üne HMAC imzalı POST gelir. İmzayı doğrula, hızlı 2xx dön, `id` ile dedup et. Teslim/retry politikası: https://dev.restomenum.com/docs/delivery-health",
        "externalDocs": {
          "url": "https://dev.restomenum.com/docs/events"
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/SignatureHeader"
          },
          {
            "$ref": "#/components/parameters/EventHeader"
          },
          {
            "$ref": "#/components/parameters/DeliveryHeader"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WebhookEnvelope"
              },
              "example": {
                "id": "cust_001_addpayment_pay_77",
                "type": "customer.payment_added",
                "version": "1",
                "tenantId": "<tenantId>",
                "occurredAt": 1781000000000,
                "data": {
                  "customerId": "cust_001",
                  "customer": {
                    "id": "cust_001",
                    "name": "Ahmet Yılmaz",
                    "phone": "5551234567",
                    "address": "Atatürk Cad. No:5",
                    "total": 46.41
                  },
                  "amount": 36.41,
                  "method": {
                    "id": "a2-cash",
                    "title": "nakit"
                  },
                  "balance": 0,
                  "orders": [],
                  "note": ""
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Alındı — hızlı 2xx dön; ağır işi async yap (10 sn timeout, 6 retry)."
          }
        }
      }
    },
    "payment_method.created": {
      "post": {
        "operationId": "webhook_payment_method_created",
        "summary": "Event: payment_method.created (abonelik gerekir)",
        "description": "`payment_method.created` — webhookUrl'üne HMAC imzalı POST gelir. İmzayı doğrula, hızlı 2xx dön, `id` ile dedup et. Teslim/retry politikası: https://dev.restomenum.com/docs/delivery-health",
        "externalDocs": {
          "url": "https://dev.restomenum.com/docs/events"
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/SignatureHeader"
          },
          {
            "$ref": "#/components/parameters/EventHeader"
          },
          {
            "$ref": "#/components/parameters/DeliveryHeader"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WebhookEnvelope"
              },
              "example": {
                "id": "evt_<uuid>",
                "type": "payment_method.created",
                "version": "1",
                "tenantId": "<tenantId>",
                "occurredAt": 1781000000000,
                "data": {
                  "id": "ab-12",
                  "title": "Kredi Kartı",
                  "description": "POS cihazı",
                  "cash": false,
                  "noreport": false
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Alındı — hızlı 2xx dön; ağır işi async yap (10 sn timeout, 6 retry)."
          }
        }
      }
    },
    "payment_method.updated": {
      "post": {
        "operationId": "webhook_payment_method_updated",
        "summary": "Event: payment_method.updated (abonelik gerekir)",
        "description": "`payment_method.updated` — webhookUrl'üne HMAC imzalı POST gelir. İmzayı doğrula, hızlı 2xx dön, `id` ile dedup et. Teslim/retry politikası: https://dev.restomenum.com/docs/delivery-health",
        "externalDocs": {
          "url": "https://dev.restomenum.com/docs/events"
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/SignatureHeader"
          },
          {
            "$ref": "#/components/parameters/EventHeader"
          },
          {
            "$ref": "#/components/parameters/DeliveryHeader"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WebhookEnvelope"
              },
              "example": {
                "id": "evt_<uuid>",
                "type": "payment_method.updated",
                "version": "1",
                "tenantId": "<tenantId>",
                "occurredAt": 1781000000000,
                "data": {
                  "id": "ab-12",
                  "title": "Kredi Kartı",
                  "description": "POS cihazı",
                  "cash": false,
                  "noreport": false
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Alındı — hızlı 2xx dön; ağır işi async yap (10 sn timeout, 6 retry)."
          }
        }
      }
    },
    "payment_method.deleted": {
      "post": {
        "operationId": "webhook_payment_method_deleted",
        "summary": "Event: payment_method.deleted (abonelik gerekir)",
        "description": "`payment_method.deleted` — webhookUrl'üne HMAC imzalı POST gelir. İmzayı doğrula, hızlı 2xx dön, `id` ile dedup et. Teslim/retry politikası: https://dev.restomenum.com/docs/delivery-health",
        "externalDocs": {
          "url": "https://dev.restomenum.com/docs/events"
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/SignatureHeader"
          },
          {
            "$ref": "#/components/parameters/EventHeader"
          },
          {
            "$ref": "#/components/parameters/DeliveryHeader"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WebhookEnvelope"
              },
              "example": {
                "id": "evt_<uuid>",
                "type": "payment_method.deleted",
                "version": "1",
                "tenantId": "<tenantId>",
                "occurredAt": 1781000000000,
                "data": {
                  "id": "ab-12",
                  "title": "Kredi Kartı",
                  "description": "POS cihazı",
                  "cash": false,
                  "noreport": false
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Alındı — hızlı 2xx dön; ağır işi async yap (10 sn timeout, 6 retry)."
          }
        }
      }
    },
    "ingredient.created": {
      "post": {
        "operationId": "webhook_ingredient_created",
        "summary": "Event: ingredient.created (abonelik gerekir)",
        "description": "`ingredient.created` — webhookUrl'üne HMAC imzalı POST gelir. İmzayı doğrula, hızlı 2xx dön, `id` ile dedup et. Teslim/retry politikası: https://dev.restomenum.com/docs/delivery-health",
        "externalDocs": {
          "url": "https://dev.restomenum.com/docs/events"
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/SignatureHeader"
          },
          {
            "$ref": "#/components/parameters/EventHeader"
          },
          {
            "$ref": "#/components/parameters/DeliveryHeader"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WebhookEnvelope"
              },
              "example": {
                "id": "evt_<uuid>",
                "type": "ingredient.created",
                "version": "1",
                "tenantId": "<tenantId>",
                "occurredAt": 1781000000000,
                "data": {
                  "id": "ab-12",
                  "title": "Domates",
                  "unit": "kg",
                  "stock": 42,
                  "alert": 5,
                  "tax": 1
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Alındı — hızlı 2xx dön; ağır işi async yap (10 sn timeout, 6 retry)."
          }
        }
      }
    },
    "ingredient.updated": {
      "post": {
        "operationId": "webhook_ingredient_updated",
        "summary": "Event: ingredient.updated (abonelik gerekir)",
        "description": "`ingredient.updated` — webhookUrl'üne HMAC imzalı POST gelir. İmzayı doğrula, hızlı 2xx dön, `id` ile dedup et. Teslim/retry politikası: https://dev.restomenum.com/docs/delivery-health",
        "externalDocs": {
          "url": "https://dev.restomenum.com/docs/events"
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/SignatureHeader"
          },
          {
            "$ref": "#/components/parameters/EventHeader"
          },
          {
            "$ref": "#/components/parameters/DeliveryHeader"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WebhookEnvelope"
              },
              "example": {
                "id": "evt_<uuid>",
                "type": "ingredient.updated",
                "version": "1",
                "tenantId": "<tenantId>",
                "occurredAt": 1781000000000,
                "data": {
                  "id": "ab-12",
                  "title": "Domates",
                  "unit": "kg",
                  "stock": 42,
                  "alert": 5,
                  "tax": 1
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Alındı — hızlı 2xx dön; ağır işi async yap (10 sn timeout, 6 retry)."
          }
        }
      }
    },
    "ingredient.deleted": {
      "post": {
        "operationId": "webhook_ingredient_deleted",
        "summary": "Event: ingredient.deleted (abonelik gerekir)",
        "description": "`ingredient.deleted` — webhookUrl'üne HMAC imzalı POST gelir. İmzayı doğrula, hızlı 2xx dön, `id` ile dedup et. Teslim/retry politikası: https://dev.restomenum.com/docs/delivery-health",
        "externalDocs": {
          "url": "https://dev.restomenum.com/docs/events"
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/SignatureHeader"
          },
          {
            "$ref": "#/components/parameters/EventHeader"
          },
          {
            "$ref": "#/components/parameters/DeliveryHeader"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WebhookEnvelope"
              },
              "example": {
                "id": "evt_<uuid>",
                "type": "ingredient.deleted",
                "version": "1",
                "tenantId": "<tenantId>",
                "occurredAt": 1781000000000,
                "data": {
                  "id": "ab-12",
                  "title": "Domates",
                  "unit": "kg",
                  "stock": 42,
                  "alert": 5,
                  "tax": 1
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Alındı — hızlı 2xx dön; ağır işi async yap (10 sn timeout, 6 retry)."
          }
        }
      }
    },
    "purchase.granted": {
      "post": {
        "operationId": "webhook_purchase_granted",
        "summary": "Event: purchase.granted (abonelik gerekir)",
        "description": "`purchase.granted` — webhookUrl'üne HMAC imzalı POST gelir. İmzayı doğrula, hızlı 2xx dön, `id` ile dedup et. Teslim/retry politikası: https://dev.restomenum.com/docs/delivery-health",
        "externalDocs": {
          "url": "https://dev.restomenum.com/docs/events"
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/SignatureHeader"
          },
          {
            "$ref": "#/components/parameters/EventHeader"
          },
          {
            "$ref": "#/components/parameters/DeliveryHeader"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WebhookEnvelope"
              },
              "example": {
                "id": "9b1f2c3d_granted",
                "type": "purchase.granted",
                "version": "1",
                "tenantId": "<tenantId>",
                "occurredAt": 1718200030000,
                "data": {
                  "purchaseId": "9b1f2c3d",
                  "pluginId": "plugin_abc",
                  "type": "one_time",
                  "productKey": "premium_unlock",
                  "amount": 10000,
                  "currency": "try"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Alındı — hızlı 2xx dön; ağır işi async yap (10 sn timeout, 6 retry)."
          }
        }
      }
    },
    "app.installed": {
      "post": {
        "operationId": "webhook_app_installed",
        "summary": "Lifecycle: app.installed (abonelik gerekmez)",
        "description": "`app.installed` — webhookUrl'üne HMAC imzalı POST gelir. İmzayı doğrula, hızlı 2xx dön, `id` ile dedup et. Teslim/retry politikası: https://dev.restomenum.com/docs/delivery-health",
        "externalDocs": {
          "url": "https://dev.restomenum.com/docs/lifecycle/app-installed"
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/SignatureHeader"
          },
          {
            "$ref": "#/components/parameters/EventHeader"
          },
          {
            "$ref": "#/components/parameters/DeliveryHeader"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WebhookEnvelope"
              },
              "example": {
                "id": "evt_9f2a7c1b",
                "type": "app.installed",
                "version": "1",
                "tenantId": "tnt_123",
                "occurredAt": 1780000000000,
                "data": {
                  "version": "1.1.3",
                  "scopes": [
                    "orders:read",
                    "hooks:table.close"
                  ]
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Alındı — hızlı 2xx dön; ağır işi async yap (10 sn timeout, 6 retry)."
          }
        }
      }
    },
    "subscription.activated": {
      "post": {
        "operationId": "webhook_subscription_activated",
        "summary": "Lifecycle: subscription.activated (abonelik gerekmez)",
        "description": "`subscription.activated` — webhookUrl'üne HMAC imzalı POST gelir. İmzayı doğrula, hızlı 2xx dön, `id` ile dedup et. Teslim/retry politikası: https://dev.restomenum.com/docs/delivery-health",
        "externalDocs": {
          "url": "https://dev.restomenum.com/docs/lifecycle/subscription-activated"
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/SignatureHeader"
          },
          {
            "$ref": "#/components/parameters/EventHeader"
          },
          {
            "$ref": "#/components/parameters/DeliveryHeader"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WebhookEnvelope"
              },
              "example": {
                "id": "evt_9f2a7c1b",
                "type": "subscription.activated",
                "version": "1",
                "tenantId": "tnt_123",
                "occurredAt": 1780000000000,
                "data": {
                  "interval": "monthly",
                  "currentPeriodEnd": 1783374777006
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Alındı — hızlı 2xx dön; ağır işi async yap (10 sn timeout, 6 retry)."
          }
        }
      }
    },
    "subscription.past_due": {
      "post": {
        "operationId": "webhook_subscription_past_due",
        "summary": "Lifecycle: subscription.past_due (abonelik gerekmez)",
        "description": "`subscription.past_due` — webhookUrl'üne HMAC imzalı POST gelir. İmzayı doğrula, hızlı 2xx dön, `id` ile dedup et. Teslim/retry politikası: https://dev.restomenum.com/docs/delivery-health",
        "externalDocs": {
          "url": "https://dev.restomenum.com/docs/lifecycle/subscription-past-due"
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/SignatureHeader"
          },
          {
            "$ref": "#/components/parameters/EventHeader"
          },
          {
            "$ref": "#/components/parameters/DeliveryHeader"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WebhookEnvelope"
              },
              "example": {
                "id": "evt_9f2a7c1b",
                "type": "subscription.past_due",
                "version": "1",
                "tenantId": "tnt_123",
                "occurredAt": 1780000000000,
                "data": {}
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Alındı — hızlı 2xx dön; ağır işi async yap (10 sn timeout, 6 retry)."
          }
        }
      }
    },
    "subscription.canceled": {
      "post": {
        "operationId": "webhook_subscription_canceled",
        "summary": "Lifecycle: subscription.canceled (abonelik gerekmez)",
        "description": "`subscription.canceled` — webhookUrl'üne HMAC imzalı POST gelir. İmzayı doğrula, hızlı 2xx dön, `id` ile dedup et. Teslim/retry politikası: https://dev.restomenum.com/docs/delivery-health",
        "externalDocs": {
          "url": "https://dev.restomenum.com/docs/lifecycle/subscription-canceled"
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/SignatureHeader"
          },
          {
            "$ref": "#/components/parameters/EventHeader"
          },
          {
            "$ref": "#/components/parameters/DeliveryHeader"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WebhookEnvelope"
              },
              "example": {
                "id": "evt_9f2a7c1b",
                "type": "subscription.canceled",
                "version": "1",
                "tenantId": "tnt_123",
                "occurredAt": 1780000000000,
                "data": {}
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Alındı — hızlı 2xx dön; ağır işi async yap (10 sn timeout, 6 retry)."
          }
        }
      }
    },
    "app.uninstalled": {
      "post": {
        "operationId": "webhook_app_uninstalled",
        "summary": "Lifecycle: app.uninstalled (abonelik gerekmez)",
        "description": "`app.uninstalled` — webhookUrl'üne HMAC imzalı POST gelir. İmzayı doğrula, hızlı 2xx dön, `id` ile dedup et. Teslim/retry politikası: https://dev.restomenum.com/docs/delivery-health",
        "externalDocs": {
          "url": "https://dev.restomenum.com/docs/lifecycle/app-uninstalled"
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/SignatureHeader"
          },
          {
            "$ref": "#/components/parameters/EventHeader"
          },
          {
            "$ref": "#/components/parameters/DeliveryHeader"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WebhookEnvelope"
              },
              "example": {
                "id": "evt_9f2a7c1b",
                "type": "app.uninstalled",
                "version": "1",
                "tenantId": "tnt_123",
                "occurredAt": 1780000000000,
                "data": {}
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Alındı — hızlı 2xx dön; ağır işi async yap (10 sn timeout, 6 retry)."
          }
        }
      }
    },
    "customer.redact": {
      "post": {
        "operationId": "webhook_customer_redact",
        "summary": "Lifecycle: customer.redact (abonelik gerekmez)",
        "description": "`customer.redact` — webhookUrl'üne HMAC imzalı POST gelir. İmzayı doğrula, hızlı 2xx dön, `id` ile dedup et. Teslim/retry politikası: https://dev.restomenum.com/docs/delivery-health",
        "externalDocs": {
          "url": "https://dev.restomenum.com/docs/lifecycle/customer-redact"
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/SignatureHeader"
          },
          {
            "$ref": "#/components/parameters/EventHeader"
          },
          {
            "$ref": "#/components/parameters/DeliveryHeader"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WebhookEnvelope"
              },
              "example": {
                "id": "evt_9f2a7c1b",
                "type": "customer.redact",
                "version": "1",
                "tenantId": "tnt_123",
                "occurredAt": 1780000000000,
                "data": {
                  "customerId": "cust-123",
                  "deletedAt": 1781200000000
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Alındı — hızlı 2xx dön; ağır işi async yap (10 sn timeout, 6 retry)."
          }
        }
      }
    },
    "delivery.degraded": {
      "post": {
        "operationId": "webhook_delivery_degraded",
        "summary": "Lifecycle: delivery.degraded (abonelik gerekmez)",
        "description": "`delivery.degraded` — webhookUrl'üne HMAC imzalı POST gelir. İmzayı doğrula, hızlı 2xx dön, `id` ile dedup et. Teslim/retry politikası: https://dev.restomenum.com/docs/delivery-health",
        "externalDocs": {
          "url": "https://dev.restomenum.com/docs/lifecycle/delivery-degraded"
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/SignatureHeader"
          },
          {
            "$ref": "#/components/parameters/EventHeader"
          },
          {
            "$ref": "#/components/parameters/DeliveryHeader"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WebhookEnvelope"
              },
              "example": {
                "id": "evt_9f2a7c1b",
                "type": "delivery.degraded",
                "version": "1",
                "tenantId": "tnt_123",
                "occurredAt": 1780000000000,
                "data": {
                  "consecutiveDead": 10,
                  "windowFail": 22,
                  "windowOk": 1,
                  "openedAt": 1781200000000,
                  "hint": "Endpoint art arda başarısız; düzeltip test event gönderin."
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Alındı — hızlı 2xx dön; ağır işi async yap (10 sn timeout, 6 retry)."
          }
        }
      }
    },
    "delivery.restored": {
      "post": {
        "operationId": "webhook_delivery_restored",
        "summary": "Lifecycle: delivery.restored (abonelik gerekmez)",
        "description": "`delivery.restored` — webhookUrl'üne HMAC imzalı POST gelir. İmzayı doğrula, hızlı 2xx dön, `id` ile dedup et. Teslim/retry politikası: https://dev.restomenum.com/docs/delivery-health",
        "externalDocs": {
          "url": "https://dev.restomenum.com/docs/lifecycle/delivery-restored"
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/SignatureHeader"
          },
          {
            "$ref": "#/components/parameters/EventHeader"
          },
          {
            "$ref": "#/components/parameters/DeliveryHeader"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WebhookEnvelope"
              },
              "example": {
                "id": "evt_9f2a7c1b",
                "type": "delivery.restored",
                "version": "1",
                "tenantId": "tnt_123",
                "occurredAt": 1780000000000,
                "data": {
                  "restoredAt": 1781205000000
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Alındı — hızlı 2xx dön; ağır işi async yap (10 sn timeout, 6 retry)."
          }
        }
      }
    },
    "delivery.disabled": {
      "post": {
        "operationId": "webhook_delivery_disabled",
        "summary": "Lifecycle: delivery.disabled (abonelik gerekmez)",
        "description": "`delivery.disabled` — webhookUrl'üne HMAC imzalı POST gelir. İmzayı doğrula, hızlı 2xx dön, `id` ile dedup et. Teslim/retry politikası: https://dev.restomenum.com/docs/delivery-health",
        "externalDocs": {
          "url": "https://dev.restomenum.com/docs/lifecycle/delivery-disabled"
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/SignatureHeader"
          },
          {
            "$ref": "#/components/parameters/EventHeader"
          },
          {
            "$ref": "#/components/parameters/DeliveryHeader"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WebhookEnvelope"
              },
              "example": {
                "id": "evt_9f2a7c1b",
                "type": "delivery.disabled",
                "version": "1",
                "tenantId": "tnt_123",
                "occurredAt": 1780000000000,
                "data": {
                  "openedAt": 1781000000000,
                  "disabledAt": 1781259200000,
                  "hint": "Endpoint düzeldiyse portaldan yeniden etkinleştir veya test event gönder."
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Alındı — hızlı 2xx dön; ağır işi async yap (10 sn timeout, 6 retry)."
          }
        }
      }
    },
    "delivery.throttled": {
      "post": {
        "operationId": "webhook_delivery_throttled",
        "summary": "Lifecycle: delivery.throttled (abonelik gerekmez)",
        "description": "`delivery.throttled` — webhookUrl'üne HMAC imzalı POST gelir. İmzayı doğrula, hızlı 2xx dön, `id` ile dedup et. Teslim/retry politikası: https://dev.restomenum.com/docs/delivery-health",
        "externalDocs": {
          "url": "https://dev.restomenum.com/docs/lifecycle/delivery-throttled"
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/SignatureHeader"
          },
          {
            "$ref": "#/components/parameters/EventHeader"
          },
          {
            "$ref": "#/components/parameters/DeliveryHeader"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WebhookEnvelope"
              },
              "example": {
                "id": "evt_9f2a7c1b",
                "type": "delivery.throttled",
                "version": "1",
                "tenantId": "tnt_123",
                "occurredAt": 1780000000000,
                "data": {
                  "cls": "bulk",
                  "count": 37,
                  "eventType": "product.updated",
                  "hint": "Toplu güncellemeleri sadeleştir veya hacmi düşür."
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Alındı — hızlı 2xx dön; ağır işi async yap (10 sn timeout, 6 retry)."
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "bearerAuth": {
        "type": "http",
        "scheme": "bearer",
        "description": "Install API key — OAuth Connect sonrası token exchange ile alınır. Bkz. https://dev.restomenum.com/docs/token"
      }
    },
    "schemas": {
      "SuccessEnvelope": {
        "type": "object",
        "description": "Ortak başarı zarfı. `data` şekli uca özeldir — alan tabloları için ucun externalDocs sayfasına bak.",
        "required": [
          "success"
        ],
        "properties": {
          "success": {
            "type": "boolean",
            "const": true
          },
          "data": {
            "description": "Uca özel yanıt gövdesi (detay dokümanda)."
          }
        }
      },
      "ErrorEnvelope": {
        "type": "object",
        "description": "Ortak hata zarfı. Yaygın kodlar: `plugin.scope.denied` (gerekli scope yok), `plugin.<kaynak>.notFound` (kayıt yok), `plugin.rateLimited` (429). Tam liste: https://dev.restomenum.com/docs/errors",
        "required": [
          "success",
          "message"
        ],
        "properties": {
          "success": {
            "type": "boolean",
            "const": false
          },
          "message": {
            "type": "string",
            "description": "Makine-okunur hata kodu"
          }
        }
      },
      "WebhookEnvelope": {
        "type": "object",
        "description": "Standart teslim zarfı — yalnız `data` event'e özeldir. Retry'da aynı `id` tekrar gelir → dedup anahtarı.",
        "required": [
          "id",
          "type",
          "tenantId",
          "occurredAt",
          "data"
        ],
        "properties": {
          "id": {
            "type": "string",
            "description": "Teslim/idempotency anahtarı (dedup et)"
          },
          "type": {
            "type": "string",
            "description": "Event tipi"
          },
          "version": {
            "type": "string"
          },
          "tenantId": {
            "type": "string",
            "description": "Kurulumun tenant kimliği"
          },
          "occurredAt": {
            "type": "integer",
            "format": "int64",
            "description": "Epoch ms"
          },
          "data": {
            "type": "object",
            "additionalProperties": true,
            "description": "Event'e özgü gövde — örnek + alan tablosu için externalDocs sayfasına bak."
          }
        }
      }
    },
    "headers": {
      "RateLimitLimit": {
        "description": "Pencere limiti",
        "schema": {
          "type": "integer"
        }
      },
      "RateLimitRemaining": {
        "description": "Pencerede kalan istek",
        "schema": {
          "type": "integer"
        }
      },
      "RateLimitReset": {
        "description": "Pencere reset zamanı — epoch saniye (yaklaşık)",
        "schema": {
          "type": "integer"
        }
      },
      "RetryAfter": {
        "description": "Bu kadar saniye bekle (backoff yerine buna uy)",
        "schema": {
          "type": "integer"
        }
      }
    },
    "parameters": {
      "SignatureHeader": {
        "name": "X-Restomenum-Signature",
        "in": "header",
        "required": true,
        "schema": {
          "type": "string"
        },
        "description": "t=<unixSec>,v1=<HMAC_SHA256(webhookSecret,\"<t>.<rawBody>\")> — ham gövde üzerinde, ±5 dk tolerans. Doğrulama: https://dev.restomenum.com/docs/webhook-signature"
      },
      "EventHeader": {
        "name": "X-Restomenum-Event",
        "in": "header",
        "required": true,
        "schema": {
          "type": "string"
        },
        "description": "Event tipi (gövdedeki type ile aynı)"
      },
      "DeliveryHeader": {
        "name": "X-Restomenum-Delivery",
        "in": "header",
        "required": false,
        "schema": {
          "type": "string"
        },
        "description": "Teslim denemesi kimliği"
      }
    }
  }
}
