{
  "openapi": "3.1.0",
  "info": {
    "title": "seopanel API",
    "version": "1.1.0",
    "description": "seopanel API'si, sitenizi panele bağlar. Hazır SEO düzeltmelerini ve içerikleri çekip uygulandığını bildirirsiniz, bot ziyaretlerini gönderirsiniz, randevuları yönetirsiniz; hesabınızdaki yazıları üretip yayınlayabilirsiniz. Tüm gövdeler JSON'dur.\n\n## Temel adres\n\nTüm istekler `https://ordinaryus.net` adresine yapılır. Yol öneki, hangi anahtarın geçerli olduğunu belirler:\n\n| Yol öneki | Kapsam | Anahtar |\n|---|---|---|\n| `/api/seo-repair/v1` | SEO düzeltmeleri, içerik teslimi, bot ziyaretleri, MCP | Proje anahtarı |\n| `/api/integrations/v1` | Anahtar bilgisi ve randevular | Proje anahtarı |\n| `/api/public/v1` | Hesap, projeler, yazılar ve raporlar | Hesap anahtarı |\n\n## Kimlik doğrulama\n\nİki anahtar türü vardır ve birbirinin yerine geçmez.\n\n- **Proje anahtarı (`sp_…`):** Tek projeye bağlıdır. Panelde projenin API erişimi bölümünden oluşturulur. Yolda `{projectId}` geçen uçlarda anahtar o projeye ait olmalıdır.\n- **Hesap anahtarı (`spt_…`):** Erişebildiğiniz tüm projelerde, seçtiğiniz izinlerle çalışır. Hesap → API Erişimi sayfasından oluşturulur ve yalnız oluşturulurken gösterilir. Hesap başına en çok 10 anahtar açılabilir.\n\nAnahtarı `X-SP-Auth: <anahtar>` ya da `Authorization: Bearer <anahtar>` başlığıyla gönderin; ikisi birlikte gelirse `X-SP-Auth` kullanılır. Proje anahtarı panelden IP izin listesiyle sınırlanabilir. API yanıtları CORS başlığı taşımaz; istekleri sunucu tarafından yapın.\n\n## Kota ve hız sınırı\n\n| Kapsam | Sınır |\n|---|---|\n| Proje anahtarı | Dakikada 300 istek |\n| Hesap anahtarı | Dakikada 120 istek, bunun en çok 30 tanesi yazma |\n| İstemci IP adresi | Dakikada 600 istek (proje ve hesap uçları ayrı sayılır) |\n| İstek gövdesi | En çok 256 KB; aşılırsa 413 `SP_API_BODY_TOO_LARGE` |\n\nSınır aşıldığında 429 `SP_API_RATE_LIMITED` ve `Retry-After: 60` döner. Kalan hak yanıt başlıklarında bildirilmez.\n\nAPI çağrıları için ayrıca dönemlik kota yoktur. İşin kendisine bağlı sınırlar geçerlidir: yazı üretimi hesap bakiyesinden düşer (402 `AI_CREDITS`) ve günlük üretim sınırına tabidir (429 `DAILY_CAP`), randevu sayısı paketinize bağlıdır (409 `SP_BOOKING_LIMIT`).\n\n## Hata biçimi\n\nBaşarılı yanıtlar 2xx döner. Hata yanıtlarının gövdesi aynıdır:\n\n```json\n{\n  \"success\": false,\n  \"error\": \"API anahtarı geçersiz.\",\n  \"code\": \"SP_API_INVALID_KEY\"\n}\n```\n\n`code` makine okuması içindir, kodunuzda buna bakın; `error` kullanıcıya gösterilebilecek açıklamadır ve metni değişebilir. Bazı içerik hataları ek alan taşır: `CHECKS_FAILED` için `blocking`, `AI_CREDITS` için `kurus`, `balanceKurus`, `shortfallKurus`. Tek istisna MCP ucudur: protokol hataları JSON-RPC `error` nesnesiyle döner. Her ucun hataları kendi sayfasında, tüm kodlar aşağıdaki Hata kodları bölümünde listelenir.\n\n## Sürümleme\n\nSürüm yolda `v1` olarak yer alır. Proje uçları anlamsal sürüm kullanır; güncel sürüm `1.1.0`, her yanıtta `X-SP-Api-Version` başlığında bildirilir. Kodunuzun yazıldığı sürümü aynı başlıkla gönderdiğinizde panel ve `GET /api/seo-repair/v1/status` (`declaredVersion`, `updatesAvailable`) kaç sürüm geride olduğunuzu gösterir. Bu başlık isteğin işlenişini değiştirmez.\n\nHesap uçları tarihli sürüm kullanır; yanıtlarda `X-SP-Public-Api-Version: 2026-10-31` başlığı gelir.\n\n## Hızlı başlangıç\n\n1. `POST /api/seo-repair/v1/handshake` ile anahtarı doğrulayın.\n2. `GET /api/seo-repair/v1/rules/{projectId}` ile hazır düzeltmeleri ve içerikleri çekin.\n3. Düzeltmeleri sitenize uygulayın.\n4. `POST /api/seo-repair/v1/rules/{projectId}/applied` ile uygulanan kimlikleri bildirin. Yeni sayfa ya da blog yazısı oluşturan düzeltmelerde yayın adresini `urls` alanında ekleyin.\n\n## Senkron döngüsü\n\nYanıttaki `cursor` değerini saklayıp sonraki çağrıda `since` olarak gönderin; yalnız yeni ya da değişen kayıtlar döner. `hasMore` true ise aynı çağrıyı yeni imleçle hemen tekrarlayın. Geri alınan düzeltmeler yalnız `since` gönderildiğinde `removedIds` içinde bildirilir.\n\nDüzeltme imleci ISO 8601 tarihtir, içerik imleci ise içeriği yorumlanmaması gereken opak bir metindir; ikisini karıştırmayın. `GET /rules/{projectId}` yanıtındaki içerik kalemleri kendi imleciyle ilerler: `contentCursor` değerini `contentSince` olarak gönderin.\n\n## İzinler\n\n**Proje anahtarı.** Randevu uçları anahtarda ilgili iznin ve sitede Randevu modülünün açık olmasını ister: `bookings:read`, `bookings:write`. Eksik izin 403 `INTEGRATION_SCOPE_MISSING`, kapalı modül 403 `INTEGRATION_MODULE_INACTIVE` döner. Anahtarın açık izinlerini ve sitenin modüllerini `GET /api/integrations/v1/me` ile görebilirsiniz.\n\n**Hesap anahtarı.** İzinler anahtar oluşturulurken seçilir; eksik izin 403 `TOKEN_SCOPE_MISSING` döner.\n\n| İzin | Kapsam |\n|---|---|\n| `account:read` | Hesap ve bakiye bilgisi |\n| `projects:read` | Proje listesi |\n| `content:read` | Yazıları okuma |\n| `content:write` | Yazı üretme ve düzenleme |\n| `content:publish` | Yazı yayınlama ve yayındaki yazıyı güncelleme |\n| `reports:read` | Proje raporu |\n\nEkip üyesi olarak erişilen projelerde üyenin rolü geçerlidir; salt okunur rol yazma isteğinde 403 `ROLE_READ_ONLY` alır.\n\n## Tekrar koruması\n\nParametre listesinde `Idempotency-Key` görünen uçlarda bu başlığı (en çok 128 karakter) gönderdiğinizde istek 24 saat boyunca bir kez işlenir. Aynı anahtar ve aynı gövdeyle gelen tekrar, ilk yanıtı `Idempotent-Replayed: true` başlığıyla döndürür. Aynı anahtar farklı gövdeyle gelirse 409 `INTEGRATION_IDEMPOTENCY_CONFLICT`, boş ya da fazla uzun anahtar 400 `INTEGRATION_IDEMPOTENCY_KEY_INVALID` döner. 5xx yanıtları saklanmaz; bu durumda aynı anahtarla yeniden deneyebilirsiniz.\n\n## Olay bildirimleri (webhook)\n\nSorgulama yapmadan haberdar olmak için panelde olay adresi tanımlayın (proje başına en çok 5 adres, yalnız HTTPS). Olay gerçekleştiğinde adrese imzalı bir `POST` gönderilir. Örneğin `fix.ready` geldiğinde düzeltmeleri çekebilirsiniz.\n\nAlıcı 10 saniye içinde 2xx dönmelidir; yönlendirme (3xx) başarısız sayılır. Başarısız teslim sırasıyla 1 dakika, 5 dakika, 15 dakika, 1 saat, 3 saat, 6 saat ve 12 saat bekledikten sonra yeniden denenir, toplam 8 denemeden sonra bırakılır. Art arda 50 başarısız teslimde adres kapatılır ve panelden bildirim gelir.\n\nAPI ile yaptığınız randevu işlemleri için olay gönderilmez; olaylar panelden, siteden ve sistemden gelen değişiklikleri bildirir.\n\n## Olay imzası\n\nHer gönderimde `X-SP-Signature: t=<unix>,v1=<hex>` başlığı gelir. `v1`, `<t>.<ham gövde>` metninin adresinize özel gizli anahtarla (`whsec_…`) hesaplanmış HMAC-SHA256 özetidir. Özeti ham gövde üzerinden hesaplayıp sabit zamanlı karşılaştırın; `t` ile sunucu saatiniz arasındaki fark 5 dakikadan fazlaysa isteği reddedin.\n\nDiğer başlıklar: `X-SP-Event` olay adı, `X-SP-Event-Id` olay kimliği (tekrarları ayıklamak için), `X-SP-Delivery` teslim kimliği.\n\n## Hata kodları\n\n| Kod | HTTP | Anlamı |\n|---|---|---|\n| `SP_API_BAD_REQUEST` | 400 | Gövde ya da sorgu parametresi geçersiz. |\n| `SP_API_SINCE_INVALID` | 400 | `since` değeri geçersiz. |\n| `SP_API_LIMIT_INVALID` | 400 | `limit` değeri izin verilen aralıkta değil. |\n| `SP_API_APPLIED_IDS_REQUIRED` | 400 | Gövde eksik ya da biçimi geçersiz. |\n| `INTEGRATION_IDEMPOTENCY_KEY_INVALID` | 400 | `Idempotency-Key` boş ya da fazla uzun. |\n| `INVALID_MODEL` | 400 | İstenen model kullanılamıyor. |\n| `SP_API_NO_KEY` | 401 | Anahtar gönderilmedi. |\n| `SP_API_INVALID_KEY` | 401 | Anahtar geçersiz, iptal edilmiş ya da süresi dolmuş. |\n| `SP_API_KEY_PROJECT_MISMATCH` | 401 | Anahtar yoldaki projeye ait değil. |\n| `AI_CREDITS` | 402 | Bakiye yetersiz. |\n| `SP_API_IP_DENIED` | 403 | İstek, anahtarın IP izin listesinde olmayan bir adresten geldi. |\n| `PROJECT_INACTIVE` | 403 | Proje etkin değil. |\n| `SEO_REPAIR_DISABLED` | 403 | Projede SEO Düzeltme kapalı. |\n| `INTEGRATION_SCOPE_MISSING` | 403 | Proje anahtarında gerekli izin açık değil. |\n| `INTEGRATION_MODULE_INACTIVE` | 403 | Gerekli modül sitede etkin değil. |\n| `MODULE_DISABLED` | 403 | Paketinizde bot takibi kapalı. |\n| `TOKEN_SCOPE_MISSING` | 403 | Hesap anahtarında gerekli izin yok. |\n| `ROLE_READ_ONLY` | 403 | Ekip rolünüz bu projede yalnız görüntülemeye izin veriyor. |\n| `SP_API_NOT_FOUND` | 404 | Uç ya da proje bulunamadı veya erişiminiz yok. |\n| `NOT_FOUND` | 404 | Yazı bulunamadı ya da erişiminiz yok. |\n| `SP_BOOKING_NOT_FOUND` | 404 | Randevu, hizmet ya da randevu sayfası bulunamadı. |\n| `SP_API_METHOD_NOT_ALLOWED` | 405 | Uç bu HTTP yöntemini desteklemiyor. |\n| `INTEGRATION_IDEMPOTENCY_CONFLICT` | 409 | Aynı `Idempotency-Key` farklı gövdeyle kullanıldı. |\n| `INVALID_STATE` | 409 | Yazının bu durumunda işlem yapılamaz. |\n| `SP_BOOKING_CLOSED` | 409 | Randevu sayfası kapalı. |\n| `SP_BOOKING_LIMIT` | 409 | Paketin randevu sınırına ulaşıldı. |\n| `SP_BOOKING_SLOT_TAKEN` | 409 | Seçilen saat dolu. |\n| `SP_BOOKING_STATE` | 409 | Randevunun bu durumunda işlem yapılamaz. |\n| `SP_API_BODY_TOO_LARGE` | 413 | İstek gövdesi sınırı aştı. |\n| `CHECKS_FAILED` | 422 | Zorunlu içerik denetimleri geçmedi; `blocking` alanına bakın. |\n| `SP_BOOKING_INVALID` | 422 | Tarih aralığı, personel ya da form alanı geçersiz. |\n| `SP_API_RATE_LIMITED` | 429 | Hız sınırı aşıldı; `Retry-After` kadar bekleyin. |\n| `DAILY_CAP` | 429 | Günlük üretim sınırına ulaşıldı. |\n| `SP_API_INTERNAL` | 500 | Beklenmeyen sunucu hatası. |\n| `INTEGRATION_NOT_IMPLEMENTED` | 501 | Uç henüz yayında değil. Bu belgede yer almayan modül uçlarında görülür. |\n| `NOT_CONFIGURED` | 503 | Yapay zekâ hizmeti yapılandırılmamış. |\n| `PAUSED` | 503 | İçerik üretimi geçici olarak durduruldu. |\n\n## Sürüm notları\n\n- **1.1.0** (2026-10-27): Bot ziyaretleri ucu (POST /bot-visits/{projectId}) yayında; /me sitede gerçekten açık modülleri döner; modül uçlarında modül kapısı (modül yokken 403 INTEGRATION_MODULE_INACTIVE); yazma isteklerinde Idempotency-Key.\n- **1.0.0** (2026-10-26): İlk sürüm: handshake, status, rules (cursor/since, removedIds), applied (urls ile yazı adresi), MCP sunucusu ve modül uçları için izin/modül kapısı."
  },
  "servers": [
    {
      "url": "https://ordinaryus.net",
      "description": "Canlı ortam"
    }
  ],
  "tags": [
    {
      "name": "Bağlantı",
      "description": "Anahtarı doğrulama, senkron durumu ve anahtar bilgisi."
    },
    {
      "name": "SEO Düzeltmeleri",
      "description": "Panelde hazırlanan SEO düzeltmelerini çekme ve uygulandığını bildirme."
    },
    {
      "name": "İçerik Teslimi",
      "description": "Sitenizde yayınlanacak yazıları çekme ve sonucu bildirme."
    },
    {
      "name": "Bot Ziyaretleri",
      "description": "Sunucu günlüklerinizdeki bot isteklerini panele aktarma."
    },
    {
      "name": "Randevular",
      "description": "Randevu hizmetleri, boş saatler ve randevular. Randevu modülü ve `bookings:*` izni gerekir."
    },
    {
      "name": "MCP",
      "description": "Yapay zekâ istemcileri için Model Context Protocol sunucusu."
    },
    {
      "name": "Hesap",
      "description": "Hesap anahtarının sahibi ve erişebildiği projeler."
    },
    {
      "name": "Yazılar",
      "description": "Yazı üretme, düzenleme ve yayınlama."
    },
    {
      "name": "Raporlar",
      "description": "Proje bazında içerik özeti."
    },
    {
      "name": "Webhook Olayları",
      "description": "Panelde tanımladığınız adrese gönderilen olaylar. Bunlar sizin çağırdığınız uçlar değil, sunucunuzda karşılamanız gereken isteklerdir."
    }
  ],
  "x-tagGroups": [
    {
      "name": "Proje API'si (sp_ anahtarı)",
      "tags": [
        "Bağlantı",
        "SEO Düzeltmeleri",
        "İçerik Teslimi",
        "Bot Ziyaretleri",
        "Randevular",
        "MCP"
      ]
    },
    {
      "name": "Hesap API'si (spt_ anahtarı)",
      "tags": [
        "Hesap",
        "Yazılar",
        "Raporlar"
      ]
    },
    {
      "name": "Olaylar",
      "tags": [
        "Webhook Olayları"
      ]
    }
  ],
  "paths": {
    "/api/seo-repair/v1/handshake": {
      "post": {
        "operationId": "handshake",
        "summary": "Anahtarı doğrula",
        "description": "Anahtarın geçerliliğini denetler ve bağlı olduğu projeyi döner. İstek gövdesi okunmaz. Kurulumda ilk çağrı olarak kullanın.",
        "tags": [
          "Bağlantı"
        ],
        "security": [
          {
            "SpAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "X-SP-Api-Version",
            "in": "header",
            "required": false,
            "description": "Kodunuzun yazıldığı API sürümü, örneğin `1.1.0`. Yalnız sürüm takibi için kaydedilir.",
            "schema": {
              "type": "string"
            },
            "example": "1.1.0"
          }
        ],
        "responses": {
          "200": {
            "description": "Başarılı yanıt.",
            "headers": {
              "X-SP-Api-Version": {
                "description": "Yanıtı üreten API sürümü.",
                "schema": {
                  "type": "string"
                },
                "example": "1.1.0"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Handshake"
                },
                "example": {
                  "success": true,
                  "ok": true,
                  "projectId": "cm4example000project00001",
                  "domain": "example.com"
                }
              }
            }
          },
          "401": {
            "description": "`SP_API_NO_KEY`: Anahtar gönderilmedi.\n\n`SP_API_INVALID_KEY`: Anahtar geçersiz, iptal edilmiş ya da süresi dolmuş.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_NO_KEY": {
                    "summary": "SP_API_NO_KEY",
                    "value": {
                      "success": false,
                      "error": "API anahtarı gerekli. Anahtarı X-SP-Auth başlığıyla ya da Authorization: Bearer ile gönderin.",
                      "code": "SP_API_NO_KEY"
                    }
                  },
                  "SP_API_INVALID_KEY": {
                    "summary": "SP_API_INVALID_KEY",
                    "value": {
                      "success": false,
                      "error": "API anahtarı geçersiz.",
                      "code": "SP_API_INVALID_KEY"
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "`SP_API_IP_DENIED`: İstek, anahtarın IP izin listesinde olmayan bir adresten geldi.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_IP_DENIED": {
                    "summary": "SP_API_IP_DENIED",
                    "value": {
                      "success": false,
                      "error": "Bu API anahtarı yalnız izin verilen IP adreslerinden kullanılabilir; istek 203.0.113.7 adresinden geldi ve listede yok. Adresi panelde API erişimi bölümündeki IP izin listesine ekleyebilirsiniz.",
                      "code": "SP_API_IP_DENIED"
                    }
                  }
                }
              }
            }
          },
          "413": {
            "description": "`SP_API_BODY_TOO_LARGE`: İstek gövdesi sınırı aştı.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_BODY_TOO_LARGE": {
                    "summary": "SP_API_BODY_TOO_LARGE",
                    "value": {
                      "success": false,
                      "error": "İstek gövdesi çok büyük (en fazla 256 KB).",
                      "code": "SP_API_BODY_TOO_LARGE"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "`SP_API_RATE_LIMITED`: Hız sınırı aşıldı; `Retry-After` kadar bekleyin.",
            "headers": {
              "Retry-After": {
                "description": "Yeniden denemeden önce beklenecek saniye.",
                "schema": {
                  "type": "integer"
                },
                "example": 60
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_RATE_LIMITED": {
                    "summary": "SP_API_RATE_LIMITED",
                    "value": {
                      "success": false,
                      "error": "Çok fazla istek. Biraz sonra tekrar dene.",
                      "code": "SP_API_RATE_LIMITED"
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "`SP_API_INTERNAL`: Beklenmeyen sunucu hatası.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_INTERNAL": {
                    "summary": "SP_API_INTERNAL",
                    "value": {
                      "success": false,
                      "error": "Beklenmeyen bir hata oluştu.",
                      "code": "SP_API_INTERNAL"
                    }
                  }
                }
              }
            }
          }
        },
        "x-requires-repair-enabled": false
      }
    },
    "/api/seo-repair/v1/status": {
      "get": {
        "operationId": "status",
        "summary": "Senkron durumunu oku",
        "description": "SEO Düzeltme durumunu, son çekim zamanını, duruma göre düzeltme sayılarını ve bildirdiğiniz API sürümünün güncelliğini döner.",
        "tags": [
          "Bağlantı"
        ],
        "security": [
          {
            "SpAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "X-SP-Api-Version",
            "in": "header",
            "required": false,
            "description": "Kodunuzun yazıldığı API sürümü, örneğin `1.1.0`. Yalnız sürüm takibi için kaydedilir.",
            "schema": {
              "type": "string"
            },
            "example": "1.1.0"
          }
        ],
        "responses": {
          "200": {
            "description": "Başarılı yanıt.",
            "headers": {
              "X-SP-Api-Version": {
                "description": "Yanıtı üreten API sürümü.",
                "schema": {
                  "type": "string"
                },
                "example": "1.1.0"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SyncStatus"
                },
                "example": {
                  "success": true,
                  "enabled": true,
                  "mode": "FULL",
                  "activeChannel": "KAF_API",
                  "lastPullAt": "2026-11-01T09:30:00.000Z",
                  "delivering": true,
                  "fixCounts": {
                    "PULLED": 4,
                    "APPLIED": 12,
                    "VERIFIED": 30
                  },
                  "declaredVersion": "1.1.0",
                  "updatesAvailable": 0
                }
              }
            }
          },
          "401": {
            "description": "`SP_API_NO_KEY`: Anahtar gönderilmedi.\n\n`SP_API_INVALID_KEY`: Anahtar geçersiz, iptal edilmiş ya da süresi dolmuş.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_NO_KEY": {
                    "summary": "SP_API_NO_KEY",
                    "value": {
                      "success": false,
                      "error": "API anahtarı gerekli. Anahtarı X-SP-Auth başlığıyla ya da Authorization: Bearer ile gönderin.",
                      "code": "SP_API_NO_KEY"
                    }
                  },
                  "SP_API_INVALID_KEY": {
                    "summary": "SP_API_INVALID_KEY",
                    "value": {
                      "success": false,
                      "error": "API anahtarı geçersiz.",
                      "code": "SP_API_INVALID_KEY"
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "`SP_API_IP_DENIED`: İstek, anahtarın IP izin listesinde olmayan bir adresten geldi.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_IP_DENIED": {
                    "summary": "SP_API_IP_DENIED",
                    "value": {
                      "success": false,
                      "error": "Bu API anahtarı yalnız izin verilen IP adreslerinden kullanılabilir; istek 203.0.113.7 adresinden geldi ve listede yok. Adresi panelde API erişimi bölümündeki IP izin listesine ekleyebilirsiniz.",
                      "code": "SP_API_IP_DENIED"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "`SP_API_RATE_LIMITED`: Hız sınırı aşıldı; `Retry-After` kadar bekleyin.",
            "headers": {
              "Retry-After": {
                "description": "Yeniden denemeden önce beklenecek saniye.",
                "schema": {
                  "type": "integer"
                },
                "example": 60
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_RATE_LIMITED": {
                    "summary": "SP_API_RATE_LIMITED",
                    "value": {
                      "success": false,
                      "error": "Çok fazla istek. Biraz sonra tekrar dene.",
                      "code": "SP_API_RATE_LIMITED"
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "`SP_API_INTERNAL`: Beklenmeyen sunucu hatası.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_INTERNAL": {
                    "summary": "SP_API_INTERNAL",
                    "value": {
                      "success": false,
                      "error": "Beklenmeyen bir hata oluştu.",
                      "code": "SP_API_INTERNAL"
                    }
                  }
                }
              }
            }
          }
        },
        "x-requires-repair-enabled": false
      }
    },
    "/api/integrations/v1/me": {
      "get": {
        "operationId": "me",
        "summary": "Anahtar bilgisini oku",
        "description": "Anahtarın projesini, açık izinlerini ve sitede etkin modülleri döner.",
        "tags": [
          "Bağlantı"
        ],
        "security": [
          {
            "SpAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "X-SP-Api-Version",
            "in": "header",
            "required": false,
            "description": "Kodunuzun yazıldığı API sürümü, örneğin `1.1.0`. Yalnız sürüm takibi için kaydedilir.",
            "schema": {
              "type": "string"
            },
            "example": "1.1.0"
          }
        ],
        "responses": {
          "200": {
            "description": "Başarılı yanıt.",
            "headers": {
              "X-SP-Api-Version": {
                "description": "Yanıtı üreten API sürümü.",
                "schema": {
                  "type": "string"
                },
                "example": "1.1.0"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MeResult"
                },
                "example": {
                  "success": true,
                  "data": {
                    "project": {
                      "id": "cm4example000project00001",
                      "domain": "example.com"
                    },
                    "scopes": [
                      "bookings:read",
                      "bookings:write"
                    ],
                    "modules": [
                      "bookings"
                    ],
                    "events": []
                  }
                }
              }
            }
          },
          "401": {
            "description": "`SP_API_NO_KEY`: Anahtar gönderilmedi.\n\n`SP_API_INVALID_KEY`: Anahtar geçersiz, iptal edilmiş ya da süresi dolmuş.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_NO_KEY": {
                    "summary": "SP_API_NO_KEY",
                    "value": {
                      "success": false,
                      "error": "API anahtarı gerekli. Anahtarı X-SP-Auth başlığıyla ya da Authorization: Bearer ile gönderin.",
                      "code": "SP_API_NO_KEY"
                    }
                  },
                  "SP_API_INVALID_KEY": {
                    "summary": "SP_API_INVALID_KEY",
                    "value": {
                      "success": false,
                      "error": "API anahtarı geçersiz.",
                      "code": "SP_API_INVALID_KEY"
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "`SP_API_IP_DENIED`: İstek, anahtarın IP izin listesinde olmayan bir adresten geldi.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_IP_DENIED": {
                    "summary": "SP_API_IP_DENIED",
                    "value": {
                      "success": false,
                      "error": "Bu API anahtarı yalnız izin verilen IP adreslerinden kullanılabilir; istek 203.0.113.7 adresinden geldi ve listede yok. Adresi panelde API erişimi bölümündeki IP izin listesine ekleyebilirsiniz.",
                      "code": "SP_API_IP_DENIED"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "`SP_API_RATE_LIMITED`: Hız sınırı aşıldı; `Retry-After` kadar bekleyin.",
            "headers": {
              "Retry-After": {
                "description": "Yeniden denemeden önce beklenecek saniye.",
                "schema": {
                  "type": "integer"
                },
                "example": 60
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_RATE_LIMITED": {
                    "summary": "SP_API_RATE_LIMITED",
                    "value": {
                      "success": false,
                      "error": "Çok fazla istek. Biraz sonra tekrar dene.",
                      "code": "SP_API_RATE_LIMITED"
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "`SP_API_INTERNAL`: Beklenmeyen sunucu hatası.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_INTERNAL": {
                    "summary": "SP_API_INTERNAL",
                    "value": {
                      "success": false,
                      "error": "Beklenmeyen bir hata oluştu.",
                      "code": "SP_API_INTERNAL"
                    }
                  }
                }
              }
            }
          }
        },
        "x-requires-repair-enabled": false
      }
    },
    "/api/seo-repair/v1/rules/{projectId}": {
      "get": {
        "operationId": "rules",
        "summary": "Düzeltmeleri çek",
        "description": "Sitenize uygulanacak düzeltmeleri ve teslime hazır içerikleri döner. Dönen `READY` düzeltmeler çekildi olarak işaretlenir. İlk başarılı çekim, panelde seçilen API kanalını etkinleştirir.\n\nProjede SEO Düzeltme açık ve proje etkin olmalıdır.",
        "tags": [
          "SEO Düzeltmeleri"
        ],
        "security": [
          {
            "SpAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "description": "Proje kimliği. Anahtarın ait olduğu proje olmalıdır.",
            "schema": {
              "type": "string"
            },
            "example": "cm4example000project00001"
          },
          {
            "name": "since",
            "in": "query",
            "required": false,
            "description": "Önceki yanıttaki `cursor` değeri (ISO 8601). Yalnız bu tarihten sonra değişen düzeltmeler döner; ilk çağrıda göndermeyin.",
            "schema": {
              "type": "string",
              "format": "date-time"
            },
            "example": "2026-11-01T09:30:00.000Z"
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Sayfadaki en fazla düzeltme sayısı. Aynı zaman damgasını taşıyan kayıtlar bölünmediği için yanıt bu sayıyı aşabilir.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 500,
              "default": 100
            },
            "example": 50
          },
          {
            "name": "url",
            "in": "query",
            "required": false,
            "description": "Yalnız bu sayfanın düzeltmelerini getirir.",
            "schema": {
              "type": "string"
            },
            "example": "https://example.com/hizmetler"
          },
          {
            "name": "contentSince",
            "in": "query",
            "required": false,
            "description": "Önceki yanıttaki `contentCursor` değeri; ilk çağrıda göndermeyin.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "contentLimit",
            "in": "query",
            "required": false,
            "description": "Sayfadaki en fazla içerik sayısı.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 50,
              "default": 20
            }
          },
          {
            "name": "X-SP-Api-Version",
            "in": "header",
            "required": false,
            "description": "Kodunuzun yazıldığı API sürümü, örneğin `1.1.0`. Yalnız sürüm takibi için kaydedilir.",
            "schema": {
              "type": "string"
            },
            "example": "1.1.0"
          }
        ],
        "responses": {
          "200": {
            "description": "Başarılı yanıt.",
            "headers": {
              "X-SP-Api-Version": {
                "description": "Yanıtı üreten API sürümü.",
                "schema": {
                  "type": "string"
                },
                "example": "1.1.0"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FixFeed"
                },
                "example": {
                  "success": true,
                  "mutations": [
                    {
                      "id": "cm4example000fix000000001",
                      "url": "https://example.com/hizmetler",
                      "updatedAt": "2026-11-01T09:30:00.000Z",
                      "rules": [
                        {
                          "action": "set_attribute",
                          "selector": "head > title",
                          "attribute": "text",
                          "value": "Kurumsal Hizmetlerimiz | Örnek Şirket"
                        }
                      ]
                    }
                  ],
                  "removedIds": [],
                  "textFixes": [],
                  "removedTextFixIds": [],
                  "cursor": "2026-11-01T09:30:00.000Z",
                  "hasMore": false,
                  "mode": "full",
                  "emptyReason": null,
                  "contentItems": [
                    {
                      "id": "cm4example000article00001",
                      "op": "create_post",
                      "title": "Kurumsal Web Sitesi Nasıl Hazırlanır?",
                      "slug": "kurumsal-web-sitesi-nasil-hazirlanir",
                      "html": "<h2>Planlama</h2><p>İlk adım hedefleri belirlemektir.</p>",
                      "excerpt": "Kurumsal site hazırlarken izlenecek adımlar.",
                      "metaTitle": "Kurumsal Web Sitesi Rehberi",
                      "metaDescription": "Kurumsal web sitesi hazırlarken izlenecek adımları öğrenin.",
                      "faqJsonLd": null,
                      "tags": [
                        "web tasarım"
                      ],
                      "categoryId": "12",
                      "categoryName": "Rehberler",
                      "authorId": null,
                      "status": "publish",
                      "featuredImage": {
                        "url": "https://example.com/gorsel/kapak.jpg",
                        "alt": "Dizüstü bilgisayarda çalışan ekip"
                      },
                      "inlineImages": [],
                      "targetUrl": null,
                      "sectionId": "cm4example000article00001"
                    }
                  ],
                  "contentCursor": "MjAyNi0xMS0wMVQwOTozMDowMC4wMDBafGV4YW1wbGU",
                  "contentHasMore": false
                }
              }
            }
          },
          "400": {
            "description": "`SP_API_SINCE_INVALID`: `since` değeri geçersiz.\n\n`SP_API_LIMIT_INVALID`: `limit` değeri izin verilen aralıkta değil.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_SINCE_INVALID": {
                    "summary": "SP_API_SINCE_INVALID",
                    "value": {
                      "success": false,
                      "error": "Geçersiz \"since\" — ISO 8601 tarih bekleniyor.",
                      "code": "SP_API_SINCE_INVALID"
                    }
                  },
                  "SP_API_LIMIT_INVALID": {
                    "summary": "SP_API_LIMIT_INVALID",
                    "value": {
                      "success": false,
                      "error": "Geçersiz \"limit\" — 1 ile 500 arasında bir tam sayı bekleniyor.",
                      "code": "SP_API_LIMIT_INVALID"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "`SP_API_NO_KEY`: Anahtar gönderilmedi.\n\n`SP_API_INVALID_KEY`: Anahtar geçersiz, iptal edilmiş ya da süresi dolmuş.\n\n`SP_API_KEY_PROJECT_MISMATCH`: Anahtar yoldaki projeye ait değil.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_NO_KEY": {
                    "summary": "SP_API_NO_KEY",
                    "value": {
                      "success": false,
                      "error": "API anahtarı gerekli. Anahtarı X-SP-Auth başlığıyla ya da Authorization: Bearer ile gönderin.",
                      "code": "SP_API_NO_KEY"
                    }
                  },
                  "SP_API_INVALID_KEY": {
                    "summary": "SP_API_INVALID_KEY",
                    "value": {
                      "success": false,
                      "error": "API anahtarı geçersiz.",
                      "code": "SP_API_INVALID_KEY"
                    }
                  },
                  "SP_API_KEY_PROJECT_MISMATCH": {
                    "summary": "SP_API_KEY_PROJECT_MISMATCH",
                    "value": {
                      "success": false,
                      "error": "Anahtar bu projeye ait değil.",
                      "code": "SP_API_KEY_PROJECT_MISMATCH"
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "`SP_API_IP_DENIED`: İstek, anahtarın IP izin listesinde olmayan bir adresten geldi.\n\n`PROJECT_INACTIVE`: Proje etkin değil.\n\n`SEO_REPAIR_DISABLED`: Projede SEO Düzeltme kapalı.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_IP_DENIED": {
                    "summary": "SP_API_IP_DENIED",
                    "value": {
                      "success": false,
                      "error": "Bu API anahtarı yalnız izin verilen IP adreslerinden kullanılabilir; istek 203.0.113.7 adresinden geldi ve listede yok. Adresi panelde API erişimi bölümündeki IP izin listesine ekleyebilirsiniz.",
                      "code": "SP_API_IP_DENIED"
                    }
                  },
                  "PROJECT_INACTIVE": {
                    "summary": "PROJECT_INACTIVE",
                    "value": {
                      "success": false,
                      "error": "Proje etkin değil.",
                      "code": "PROJECT_INACTIVE"
                    }
                  },
                  "SEO_REPAIR_DISABLED": {
                    "summary": "SEO_REPAIR_DISABLED",
                    "value": {
                      "success": false,
                      "error": "Bu proje için SEO Hata Düzeltme açık değil.",
                      "code": "SEO_REPAIR_DISABLED"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "`SP_API_RATE_LIMITED`: Hız sınırı aşıldı; `Retry-After` kadar bekleyin.",
            "headers": {
              "Retry-After": {
                "description": "Yeniden denemeden önce beklenecek saniye.",
                "schema": {
                  "type": "integer"
                },
                "example": 60
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_RATE_LIMITED": {
                    "summary": "SP_API_RATE_LIMITED",
                    "value": {
                      "success": false,
                      "error": "Çok fazla istek. Biraz sonra tekrar dene.",
                      "code": "SP_API_RATE_LIMITED"
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "`SP_API_INTERNAL`: Beklenmeyen sunucu hatası.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_INTERNAL": {
                    "summary": "SP_API_INTERNAL",
                    "value": {
                      "success": false,
                      "error": "Beklenmeyen bir hata oluştu.",
                      "code": "SP_API_INTERNAL"
                    }
                  }
                }
              }
            }
          }
        },
        "x-requires-repair-enabled": true
      }
    },
    "/api/seo-repair/v1/rules/{projectId}/applied": {
      "post": {
        "operationId": "applied",
        "summary": "Uygulanan düzeltmeleri bildir",
        "description": "Uyguladığınız düzeltmeleri işaretler; doğrulama bu bildirimden sonra başlar. Yeni sayfa ya da yazı oluşturan düzeltmelerde yayın adresini `urls` alanıyla gönderin. Geçersiz kimlikler hata vermez, yanıtta sayılır.\n\nProjede SEO Düzeltme açık ve proje etkin olmalıdır.",
        "tags": [
          "SEO Düzeltmeleri"
        ],
        "security": [
          {
            "SpAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "description": "Proje kimliği. Anahtarın ait olduğu proje olmalıdır.",
            "schema": {
              "type": "string"
            },
            "example": "cm4example000project00001"
          },
          {
            "name": "X-SP-Api-Version",
            "in": "header",
            "required": false,
            "description": "Kodunuzun yazıldığı API sürümü, örneğin `1.1.0`. Yalnız sürüm takibi için kaydedilir.",
            "schema": {
              "type": "string"
            },
            "example": "1.1.0"
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "Bu isteği tekilleştiren, sizin ürettiğiniz anahtar (en çok 128 karakter).",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 128
            },
            "example": "ornek-istek-0001"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AppliedBody"
              },
              "example": {
                "ids": [
                  "cm4example000fix000000001",
                  "cm4example000fix000000002"
                ],
                "urls": {
                  "cm4example000fix000000002": "https://example.com/blog/yeni-yazi"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Başarılı yanıt.",
            "headers": {
              "X-SP-Api-Version": {
                "description": "Yanıtı üreten API sürümü.",
                "schema": {
                  "type": "string"
                },
                "example": "1.1.0"
              },
              "Idempotent-Replayed": {
                "description": "Yanıt, aynı `Idempotency-Key` ile yapılmış önceki istekten geliyorsa `true`.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AppliedResult"
                },
                "example": {
                  "success": true,
                  "acknowledged": 2,
                  "requested": 2,
                  "invalid": 0,
                  "ignored": 0
                }
              }
            }
          },
          "400": {
            "description": "`INTEGRATION_IDEMPOTENCY_KEY_INVALID`: `Idempotency-Key` boş ya da fazla uzun.\n\n`SP_API_APPLIED_IDS_REQUIRED`: Gövde eksik ya da biçimi geçersiz.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "INTEGRATION_IDEMPOTENCY_KEY_INVALID": {
                    "summary": "INTEGRATION_IDEMPOTENCY_KEY_INVALID",
                    "value": {
                      "success": false,
                      "error": "Idempotency-Key boş olamaz ve en çok 128 karakter olabilir.",
                      "code": "INTEGRATION_IDEMPOTENCY_KEY_INVALID"
                    }
                  },
                  "SP_API_APPLIED_IDS_REQUIRED": {
                    "summary": "SP_API_APPLIED_IDS_REQUIRED",
                    "value": {
                      "success": false,
                      "error": "Uygulanan düzeltme kimlikleri gerekli — gövde: { \"ids\": [\"...\"] }.",
                      "code": "SP_API_APPLIED_IDS_REQUIRED"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "`SP_API_NO_KEY`: Anahtar gönderilmedi.\n\n`SP_API_INVALID_KEY`: Anahtar geçersiz, iptal edilmiş ya da süresi dolmuş.\n\n`SP_API_KEY_PROJECT_MISMATCH`: Anahtar yoldaki projeye ait değil.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_NO_KEY": {
                    "summary": "SP_API_NO_KEY",
                    "value": {
                      "success": false,
                      "error": "API anahtarı gerekli. Anahtarı X-SP-Auth başlığıyla ya da Authorization: Bearer ile gönderin.",
                      "code": "SP_API_NO_KEY"
                    }
                  },
                  "SP_API_INVALID_KEY": {
                    "summary": "SP_API_INVALID_KEY",
                    "value": {
                      "success": false,
                      "error": "API anahtarı geçersiz.",
                      "code": "SP_API_INVALID_KEY"
                    }
                  },
                  "SP_API_KEY_PROJECT_MISMATCH": {
                    "summary": "SP_API_KEY_PROJECT_MISMATCH",
                    "value": {
                      "success": false,
                      "error": "Anahtar bu projeye ait değil.",
                      "code": "SP_API_KEY_PROJECT_MISMATCH"
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "`SP_API_IP_DENIED`: İstek, anahtarın IP izin listesinde olmayan bir adresten geldi.\n\n`PROJECT_INACTIVE`: Proje etkin değil.\n\n`SEO_REPAIR_DISABLED`: Projede SEO Düzeltme kapalı.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_IP_DENIED": {
                    "summary": "SP_API_IP_DENIED",
                    "value": {
                      "success": false,
                      "error": "Bu API anahtarı yalnız izin verilen IP adreslerinden kullanılabilir; istek 203.0.113.7 adresinden geldi ve listede yok. Adresi panelde API erişimi bölümündeki IP izin listesine ekleyebilirsiniz.",
                      "code": "SP_API_IP_DENIED"
                    }
                  },
                  "PROJECT_INACTIVE": {
                    "summary": "PROJECT_INACTIVE",
                    "value": {
                      "success": false,
                      "error": "Proje etkin değil.",
                      "code": "PROJECT_INACTIVE"
                    }
                  },
                  "SEO_REPAIR_DISABLED": {
                    "summary": "SEO_REPAIR_DISABLED",
                    "value": {
                      "success": false,
                      "error": "Bu proje için SEO Hata Düzeltme açık değil.",
                      "code": "SEO_REPAIR_DISABLED"
                    }
                  }
                }
              }
            }
          },
          "409": {
            "description": "`INTEGRATION_IDEMPOTENCY_CONFLICT`: Aynı `Idempotency-Key` farklı gövdeyle kullanıldı.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "INTEGRATION_IDEMPOTENCY_CONFLICT": {
                    "summary": "INTEGRATION_IDEMPOTENCY_CONFLICT",
                    "value": {
                      "success": false,
                      "error": "Bu Idempotency-Key başka bir istekle kullanılmış.",
                      "code": "INTEGRATION_IDEMPOTENCY_CONFLICT"
                    }
                  }
                }
              }
            }
          },
          "413": {
            "description": "`SP_API_BODY_TOO_LARGE`: İstek gövdesi sınırı aştı.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_BODY_TOO_LARGE": {
                    "summary": "SP_API_BODY_TOO_LARGE",
                    "value": {
                      "success": false,
                      "error": "İstek gövdesi çok büyük (en fazla 256 KB).",
                      "code": "SP_API_BODY_TOO_LARGE"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "`SP_API_RATE_LIMITED`: Hız sınırı aşıldı; `Retry-After` kadar bekleyin.",
            "headers": {
              "Retry-After": {
                "description": "Yeniden denemeden önce beklenecek saniye.",
                "schema": {
                  "type": "integer"
                },
                "example": 60
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_RATE_LIMITED": {
                    "summary": "SP_API_RATE_LIMITED",
                    "value": {
                      "success": false,
                      "error": "Çok fazla istek. Biraz sonra tekrar dene.",
                      "code": "SP_API_RATE_LIMITED"
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "`SP_API_INTERNAL`: Beklenmeyen sunucu hatası.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_INTERNAL": {
                    "summary": "SP_API_INTERNAL",
                    "value": {
                      "success": false,
                      "error": "Beklenmeyen bir hata oluştu.",
                      "code": "SP_API_INTERNAL"
                    }
                  }
                }
              }
            }
          }
        },
        "x-requires-repair-enabled": true
      }
    },
    "/api/seo-repair/v1/content/{projectId}": {
      "get": {
        "operationId": "content",
        "summary": "Yayına hazır içerikleri çek",
        "description": "Sitenizde oluşturulmayı bekleyen içerikleri döner. Sonucu 15 dakika içinde bildirilmeyen içerikler yeniden sıraya alınır.",
        "tags": [
          "İçerik Teslimi"
        ],
        "security": [
          {
            "SpAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "description": "Proje kimliği. Anahtarın ait olduğu proje olmalıdır.",
            "schema": {
              "type": "string"
            },
            "example": "cm4example000project00001"
          },
          {
            "name": "since",
            "in": "query",
            "required": false,
            "description": "Önceki yanıttaki `cursor` değeri (opak metin); ilk çağrıda göndermeyin.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Sayfadaki en fazla içerik sayısı.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 50,
              "default": 20
            },
            "example": 20
          },
          {
            "name": "X-SP-Api-Version",
            "in": "header",
            "required": false,
            "description": "Kodunuzun yazıldığı API sürümü, örneğin `1.1.0`. Yalnız sürüm takibi için kaydedilir.",
            "schema": {
              "type": "string"
            },
            "example": "1.1.0"
          }
        ],
        "responses": {
          "200": {
            "description": "Başarılı yanıt.",
            "headers": {
              "X-SP-Api-Version": {
                "description": "Yanıtı üreten API sürümü.",
                "schema": {
                  "type": "string"
                },
                "example": "1.1.0"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ContentFeed"
                },
                "example": {
                  "success": true,
                  "items": [
                    {
                      "id": "cm4example000article00001",
                      "op": "create_post",
                      "title": "Kurumsal Web Sitesi Nasıl Hazırlanır?",
                      "slug": "kurumsal-web-sitesi-nasil-hazirlanir",
                      "html": "<h2>Planlama</h2><p>İlk adım hedefleri belirlemektir.</p>",
                      "excerpt": "Kurumsal site hazırlarken izlenecek adımlar.",
                      "metaTitle": "Kurumsal Web Sitesi Rehberi",
                      "metaDescription": "Kurumsal web sitesi hazırlarken izlenecek adımları öğrenin.",
                      "faqJsonLd": null,
                      "tags": [
                        "web tasarım"
                      ],
                      "categoryId": "12",
                      "categoryName": "Rehberler",
                      "authorId": null,
                      "status": "publish",
                      "featuredImage": {
                        "url": "https://example.com/gorsel/kapak.jpg",
                        "alt": "Dizüstü bilgisayarda çalışan ekip"
                      },
                      "inlineImages": [],
                      "targetUrl": null,
                      "sectionId": "cm4example000article00001"
                    }
                  ],
                  "cursor": "MjAyNi0xMS0wMVQwOTozMDowMC4wMDBafGV4YW1wbGU",
                  "hasMore": false
                }
              }
            }
          },
          "400": {
            "description": "`SP_API_SINCE_INVALID`: `since` değeri geçersiz.\n\n`SP_API_LIMIT_INVALID`: `limit` değeri izin verilen aralıkta değil.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_SINCE_INVALID": {
                    "summary": "SP_API_SINCE_INVALID",
                    "value": {
                      "success": false,
                      "error": "Geçersiz \"since\" — ISO 8601 tarih bekleniyor.",
                      "code": "SP_API_SINCE_INVALID"
                    }
                  },
                  "SP_API_LIMIT_INVALID": {
                    "summary": "SP_API_LIMIT_INVALID",
                    "value": {
                      "success": false,
                      "error": "Geçersiz \"limit\" — 1 ile 500 arasında bir tam sayı bekleniyor.",
                      "code": "SP_API_LIMIT_INVALID"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "`SP_API_NO_KEY`: Anahtar gönderilmedi.\n\n`SP_API_INVALID_KEY`: Anahtar geçersiz, iptal edilmiş ya da süresi dolmuş.\n\n`SP_API_KEY_PROJECT_MISMATCH`: Anahtar yoldaki projeye ait değil.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_NO_KEY": {
                    "summary": "SP_API_NO_KEY",
                    "value": {
                      "success": false,
                      "error": "API anahtarı gerekli. Anahtarı X-SP-Auth başlığıyla ya da Authorization: Bearer ile gönderin.",
                      "code": "SP_API_NO_KEY"
                    }
                  },
                  "SP_API_INVALID_KEY": {
                    "summary": "SP_API_INVALID_KEY",
                    "value": {
                      "success": false,
                      "error": "API anahtarı geçersiz.",
                      "code": "SP_API_INVALID_KEY"
                    }
                  },
                  "SP_API_KEY_PROJECT_MISMATCH": {
                    "summary": "SP_API_KEY_PROJECT_MISMATCH",
                    "value": {
                      "success": false,
                      "error": "Anahtar bu projeye ait değil.",
                      "code": "SP_API_KEY_PROJECT_MISMATCH"
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "`SP_API_IP_DENIED`: İstek, anahtarın IP izin listesinde olmayan bir adresten geldi.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_IP_DENIED": {
                    "summary": "SP_API_IP_DENIED",
                    "value": {
                      "success": false,
                      "error": "Bu API anahtarı yalnız izin verilen IP adreslerinden kullanılabilir; istek 203.0.113.7 adresinden geldi ve listede yok. Adresi panelde API erişimi bölümündeki IP izin listesine ekleyebilirsiniz.",
                      "code": "SP_API_IP_DENIED"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "`SP_API_RATE_LIMITED`: Hız sınırı aşıldı; `Retry-After` kadar bekleyin.",
            "headers": {
              "Retry-After": {
                "description": "Yeniden denemeden önce beklenecek saniye.",
                "schema": {
                  "type": "integer"
                },
                "example": 60
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_RATE_LIMITED": {
                    "summary": "SP_API_RATE_LIMITED",
                    "value": {
                      "success": false,
                      "error": "Çok fazla istek. Biraz sonra tekrar dene.",
                      "code": "SP_API_RATE_LIMITED"
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "`SP_API_INTERNAL`: Beklenmeyen sunucu hatası.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_INTERNAL": {
                    "summary": "SP_API_INTERNAL",
                    "value": {
                      "success": false,
                      "error": "Beklenmeyen bir hata oluştu.",
                      "code": "SP_API_INTERNAL"
                    }
                  }
                }
              }
            }
          }
        },
        "x-requires-repair-enabled": false
      }
    },
    "/api/seo-repair/v1/content/{projectId}/applied": {
      "post": {
        "operationId": "contentApplied",
        "summary": "İçerik sonucunu bildir",
        "description": "İçeriğin sitede oluşturulup oluşturulmadığını bildirir. Tek kayıt ya da `items` ile en çok 50 kayıt gönderilebilir. `results` içindeki `unknown` sonucu, kaydın bu projede bulunamadığını gösterir.",
        "tags": [
          "İçerik Teslimi"
        ],
        "security": [
          {
            "SpAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "description": "Proje kimliği. Anahtarın ait olduğu proje olmalıdır.",
            "schema": {
              "type": "string"
            },
            "example": "cm4example000project00001"
          },
          {
            "name": "X-SP-Api-Version",
            "in": "header",
            "required": false,
            "description": "Kodunuzun yazıldığı API sürümü, örneğin `1.1.0`. Yalnız sürüm takibi için kaydedilir.",
            "schema": {
              "type": "string"
            },
            "example": "1.1.0"
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "Bu isteği tekilleştiren, sizin ürettiğiniz anahtar (en çok 128 karakter).",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 128
            },
            "example": "ornek-istek-0001"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ContentAppliedBody"
              },
              "examples": {
                "single": {
                  "summary": "İçerik sonucunu bildir",
                  "value": {
                    "id": "cm4example000article00001",
                    "ok": true,
                    "postId": "1042",
                    "url": "https://example.com/blog/kurumsal-web-sitesi-nasil-hazirlanir",
                    "status": "publish"
                  }
                },
                "batch": {
                  "summary": "Toplu bildirim.",
                  "value": {
                    "items": [
                      {
                        "id": "cm4example000article00001",
                        "ok": true,
                        "postId": 1042,
                        "status": "draft"
                      },
                      {
                        "id": "cm4example000article00002",
                        "ok": false,
                        "error": "slug_taken"
                      }
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Başarılı yanıt.",
            "headers": {
              "X-SP-Api-Version": {
                "description": "Yanıtı üreten API sürümü.",
                "schema": {
                  "type": "string"
                },
                "example": "1.1.0"
              },
              "Idempotent-Replayed": {
                "description": "Yanıt, aynı `Idempotency-Key` ile yapılmış önceki istekten geliyorsa `true`.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ContentAppliedResult"
                },
                "example": {
                  "success": true,
                  "accepted": 1,
                  "unknown": 0,
                  "results": [
                    {
                      "id": "cm4example000article00001",
                      "outcome": "publishing"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "`INTEGRATION_IDEMPOTENCY_KEY_INVALID`: `Idempotency-Key` boş ya da fazla uzun.\n\n`SP_API_APPLIED_IDS_REQUIRED`: Gövde eksik ya da biçimi geçersiz.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "INTEGRATION_IDEMPOTENCY_KEY_INVALID": {
                    "summary": "INTEGRATION_IDEMPOTENCY_KEY_INVALID",
                    "value": {
                      "success": false,
                      "error": "Idempotency-Key boş olamaz ve en çok 128 karakter olabilir.",
                      "code": "INTEGRATION_IDEMPOTENCY_KEY_INVALID"
                    }
                  },
                  "SP_API_APPLIED_IDS_REQUIRED": {
                    "summary": "SP_API_APPLIED_IDS_REQUIRED",
                    "value": {
                      "success": false,
                      "error": "Uygulanan düzeltme kimlikleri gerekli — gövde: { \"ids\": [\"...\"] }.",
                      "code": "SP_API_APPLIED_IDS_REQUIRED"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "`SP_API_NO_KEY`: Anahtar gönderilmedi.\n\n`SP_API_INVALID_KEY`: Anahtar geçersiz, iptal edilmiş ya da süresi dolmuş.\n\n`SP_API_KEY_PROJECT_MISMATCH`: Anahtar yoldaki projeye ait değil.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_NO_KEY": {
                    "summary": "SP_API_NO_KEY",
                    "value": {
                      "success": false,
                      "error": "API anahtarı gerekli. Anahtarı X-SP-Auth başlığıyla ya da Authorization: Bearer ile gönderin.",
                      "code": "SP_API_NO_KEY"
                    }
                  },
                  "SP_API_INVALID_KEY": {
                    "summary": "SP_API_INVALID_KEY",
                    "value": {
                      "success": false,
                      "error": "API anahtarı geçersiz.",
                      "code": "SP_API_INVALID_KEY"
                    }
                  },
                  "SP_API_KEY_PROJECT_MISMATCH": {
                    "summary": "SP_API_KEY_PROJECT_MISMATCH",
                    "value": {
                      "success": false,
                      "error": "Anahtar bu projeye ait değil.",
                      "code": "SP_API_KEY_PROJECT_MISMATCH"
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "`SP_API_IP_DENIED`: İstek, anahtarın IP izin listesinde olmayan bir adresten geldi.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_IP_DENIED": {
                    "summary": "SP_API_IP_DENIED",
                    "value": {
                      "success": false,
                      "error": "Bu API anahtarı yalnız izin verilen IP adreslerinden kullanılabilir; istek 203.0.113.7 adresinden geldi ve listede yok. Adresi panelde API erişimi bölümündeki IP izin listesine ekleyebilirsiniz.",
                      "code": "SP_API_IP_DENIED"
                    }
                  }
                }
              }
            }
          },
          "409": {
            "description": "`INTEGRATION_IDEMPOTENCY_CONFLICT`: Aynı `Idempotency-Key` farklı gövdeyle kullanıldı.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "INTEGRATION_IDEMPOTENCY_CONFLICT": {
                    "summary": "INTEGRATION_IDEMPOTENCY_CONFLICT",
                    "value": {
                      "success": false,
                      "error": "Bu Idempotency-Key başka bir istekle kullanılmış.",
                      "code": "INTEGRATION_IDEMPOTENCY_CONFLICT"
                    }
                  }
                }
              }
            }
          },
          "413": {
            "description": "`SP_API_BODY_TOO_LARGE`: İstek gövdesi sınırı aştı.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_BODY_TOO_LARGE": {
                    "summary": "SP_API_BODY_TOO_LARGE",
                    "value": {
                      "success": false,
                      "error": "İstek gövdesi çok büyük (en fazla 256 KB).",
                      "code": "SP_API_BODY_TOO_LARGE"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "`SP_API_RATE_LIMITED`: Hız sınırı aşıldı; `Retry-After` kadar bekleyin.",
            "headers": {
              "Retry-After": {
                "description": "Yeniden denemeden önce beklenecek saniye.",
                "schema": {
                  "type": "integer"
                },
                "example": 60
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_RATE_LIMITED": {
                    "summary": "SP_API_RATE_LIMITED",
                    "value": {
                      "success": false,
                      "error": "Çok fazla istek. Biraz sonra tekrar dene.",
                      "code": "SP_API_RATE_LIMITED"
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "`SP_API_INTERNAL`: Beklenmeyen sunucu hatası.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_INTERNAL": {
                    "summary": "SP_API_INTERNAL",
                    "value": {
                      "success": false,
                      "error": "Beklenmeyen bir hata oluştu.",
                      "code": "SP_API_INTERNAL"
                    }
                  }
                }
              }
            }
          }
        },
        "x-requires-repair-enabled": false
      }
    },
    "/api/seo-repair/v1/bot-visits/{projectId}": {
      "post": {
        "operationId": "botVisits",
        "summary": "Bot ziyaretlerini gönder",
        "description": "Sunucu günlüklerinizdeki istekleri toplu gönderin. Yalnız yapay zekâ ve arama motoru botları kaydedilir, diğer istekler elenir. Projede SEO Düzeltme kapalı olsa da çalışır; paketinizde bot takibi olmalıdır.",
        "tags": [
          "Bot Ziyaretleri"
        ],
        "security": [
          {
            "SpAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "description": "Proje kimliği. Anahtarın ait olduğu proje olmalıdır.",
            "schema": {
              "type": "string"
            },
            "example": "cm4example000project00001"
          },
          {
            "name": "X-SP-Api-Version",
            "in": "header",
            "required": false,
            "description": "Kodunuzun yazıldığı API sürümü, örneğin `1.1.0`. Yalnız sürüm takibi için kaydedilir.",
            "schema": {
              "type": "string"
            },
            "example": "1.1.0"
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "Bu isteği tekilleştiren, sizin ürettiğiniz anahtar (en çok 128 karakter).",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 128
            },
            "example": "ornek-istek-0001"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BotVisitsBody"
              },
              "example": {
                "hits": [
                  {
                    "ua": "Mozilla/5.0 (compatible; GPTBot/1.2; +https://openai.com/gptbot)",
                    "url": "/blog/kurumsal-web-sitesi",
                    "ts": 1793525400000,
                    "ip": "203.0.113.10"
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Başarılı yanıt.",
            "headers": {
              "X-SP-Api-Version": {
                "description": "Yanıtı üreten API sürümü.",
                "schema": {
                  "type": "string"
                },
                "example": "1.1.0"
              },
              "Idempotent-Replayed": {
                "description": "Yanıt, aynı `Idempotency-Key` ile yapılmış önceki istekten geliyorsa `true`.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BotVisitsResult"
                },
                "example": {
                  "success": true,
                  "accepted": 1,
                  "stored": 1
                }
              }
            }
          },
          "400": {
            "description": "`INTEGRATION_IDEMPOTENCY_KEY_INVALID`: `Idempotency-Key` boş ya da fazla uzun.\n\n`SP_API_BAD_REQUEST`: Gövde ya da sorgu parametresi geçersiz.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "INTEGRATION_IDEMPOTENCY_KEY_INVALID": {
                    "summary": "INTEGRATION_IDEMPOTENCY_KEY_INVALID",
                    "value": {
                      "success": false,
                      "error": "Idempotency-Key boş olamaz ve en çok 128 karakter olabilir.",
                      "code": "INTEGRATION_IDEMPOTENCY_KEY_INVALID"
                    }
                  },
                  "SP_API_BAD_REQUEST": {
                    "summary": "SP_API_BAD_REQUEST",
                    "value": {
                      "success": false,
                      "error": "Geçersiz istek.",
                      "code": "SP_API_BAD_REQUEST"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "`SP_API_NO_KEY`: Anahtar gönderilmedi.\n\n`SP_API_INVALID_KEY`: Anahtar geçersiz, iptal edilmiş ya da süresi dolmuş.\n\n`SP_API_KEY_PROJECT_MISMATCH`: Anahtar yoldaki projeye ait değil.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_NO_KEY": {
                    "summary": "SP_API_NO_KEY",
                    "value": {
                      "success": false,
                      "error": "API anahtarı gerekli. Anahtarı X-SP-Auth başlığıyla ya da Authorization: Bearer ile gönderin.",
                      "code": "SP_API_NO_KEY"
                    }
                  },
                  "SP_API_INVALID_KEY": {
                    "summary": "SP_API_INVALID_KEY",
                    "value": {
                      "success": false,
                      "error": "API anahtarı geçersiz.",
                      "code": "SP_API_INVALID_KEY"
                    }
                  },
                  "SP_API_KEY_PROJECT_MISMATCH": {
                    "summary": "SP_API_KEY_PROJECT_MISMATCH",
                    "value": {
                      "success": false,
                      "error": "Anahtar bu projeye ait değil.",
                      "code": "SP_API_KEY_PROJECT_MISMATCH"
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "`SP_API_IP_DENIED`: İstek, anahtarın IP izin listesinde olmayan bir adresten geldi.\n\n`MODULE_DISABLED`: Paketinizde bot takibi kapalı.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_IP_DENIED": {
                    "summary": "SP_API_IP_DENIED",
                    "value": {
                      "success": false,
                      "error": "Bu API anahtarı yalnız izin verilen IP adreslerinden kullanılabilir; istek 203.0.113.7 adresinden geldi ve listede yok. Adresi panelde API erişimi bölümündeki IP izin listesine ekleyebilirsiniz.",
                      "code": "SP_API_IP_DENIED"
                    }
                  },
                  "MODULE_DISABLED": {
                    "summary": "MODULE_DISABLED",
                    "value": {
                      "success": false,
                      "error": "Paketinizde bot takibi kapalı; ziyaretler kaydedilmez.",
                      "code": "MODULE_DISABLED"
                    }
                  }
                }
              }
            }
          },
          "409": {
            "description": "`INTEGRATION_IDEMPOTENCY_CONFLICT`: Aynı `Idempotency-Key` farklı gövdeyle kullanıldı.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "INTEGRATION_IDEMPOTENCY_CONFLICT": {
                    "summary": "INTEGRATION_IDEMPOTENCY_CONFLICT",
                    "value": {
                      "success": false,
                      "error": "Bu Idempotency-Key başka bir istekle kullanılmış.",
                      "code": "INTEGRATION_IDEMPOTENCY_CONFLICT"
                    }
                  }
                }
              }
            }
          },
          "413": {
            "description": "`SP_API_BODY_TOO_LARGE`: İstek gövdesi sınırı aştı.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_BODY_TOO_LARGE": {
                    "summary": "SP_API_BODY_TOO_LARGE",
                    "value": {
                      "success": false,
                      "error": "İstek gövdesi çok büyük (en fazla 256 KB).",
                      "code": "SP_API_BODY_TOO_LARGE"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "`SP_API_RATE_LIMITED`: Hız sınırı aşıldı; `Retry-After` kadar bekleyin.",
            "headers": {
              "Retry-After": {
                "description": "Yeniden denemeden önce beklenecek saniye.",
                "schema": {
                  "type": "integer"
                },
                "example": 60
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_RATE_LIMITED": {
                    "summary": "SP_API_RATE_LIMITED",
                    "value": {
                      "success": false,
                      "error": "Çok fazla istek. Biraz sonra tekrar dene.",
                      "code": "SP_API_RATE_LIMITED"
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "`SP_API_INTERNAL`: Beklenmeyen sunucu hatası.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_INTERNAL": {
                    "summary": "SP_API_INTERNAL",
                    "value": {
                      "success": false,
                      "error": "Beklenmeyen bir hata oluştu.",
                      "code": "SP_API_INTERNAL"
                    }
                  }
                }
              }
            }
          }
        },
        "x-requires-repair-enabled": false
      }
    },
    "/api/integrations/v1/bookings/offerings": {
      "get": {
        "operationId": "bookingsOfferings",
        "summary": "Hizmetleri listele",
        "description": "Randevuya açık hizmetleri ve hizmeti veren personeli döner.\n\nGerekli izin: `bookings:read`.\n\nGerekli modül: Randevu.",
        "tags": [
          "Randevular"
        ],
        "security": [
          {
            "SpAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "X-SP-Api-Version",
            "in": "header",
            "required": false,
            "description": "Kodunuzun yazıldığı API sürümü, örneğin `1.1.0`. Yalnız sürüm takibi için kaydedilir.",
            "schema": {
              "type": "string"
            },
            "example": "1.1.0"
          }
        ],
        "responses": {
          "200": {
            "description": "Başarılı yanıt.",
            "headers": {
              "X-SP-Api-Version": {
                "description": "Yanıtı üreten API sürümü.",
                "schema": {
                  "type": "string"
                },
                "example": "1.1.0"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OfferingList"
                },
                "example": {
                  "success": true,
                  "data": {
                    "items": [
                      {
                        "id": "cm4example000service00001",
                        "title": "Ön Görüşme",
                        "desc": "30 dakikalık tanışma görüşmesi.",
                        "durationMin": 30,
                        "priceKurus": 0,
                        "currency": "TRY",
                        "staff": [
                          {
                            "id": "cm4example000staff0000001",
                            "name": "Mehmet Demir"
                          }
                        ]
                      }
                    ]
                  }
                }
              }
            }
          },
          "401": {
            "description": "`SP_API_NO_KEY`: Anahtar gönderilmedi.\n\n`SP_API_INVALID_KEY`: Anahtar geçersiz, iptal edilmiş ya da süresi dolmuş.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_NO_KEY": {
                    "summary": "SP_API_NO_KEY",
                    "value": {
                      "success": false,
                      "error": "API anahtarı gerekli. Anahtarı X-SP-Auth başlığıyla ya da Authorization: Bearer ile gönderin.",
                      "code": "SP_API_NO_KEY"
                    }
                  },
                  "SP_API_INVALID_KEY": {
                    "summary": "SP_API_INVALID_KEY",
                    "value": {
                      "success": false,
                      "error": "API anahtarı geçersiz.",
                      "code": "SP_API_INVALID_KEY"
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "`SP_API_IP_DENIED`: İstek, anahtarın IP izin listesinde olmayan bir adresten geldi.\n\n`INTEGRATION_SCOPE_MISSING`: Proje anahtarında gerekli izin açık değil.\n\n`INTEGRATION_MODULE_INACTIVE`: Gerekli modül sitede etkin değil.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_IP_DENIED": {
                    "summary": "SP_API_IP_DENIED",
                    "value": {
                      "success": false,
                      "error": "Bu API anahtarı yalnız izin verilen IP adreslerinden kullanılabilir; istek 203.0.113.7 adresinden geldi ve listede yok. Adresi panelde API erişimi bölümündeki IP izin listesine ekleyebilirsiniz.",
                      "code": "SP_API_IP_DENIED"
                    }
                  },
                  "INTEGRATION_SCOPE_MISSING": {
                    "summary": "INTEGRATION_SCOPE_MISSING",
                    "value": {
                      "success": false,
                      "error": "Bu işlem için API anahtarında \"bookings:read\" izni açık değil.",
                      "code": "INTEGRATION_SCOPE_MISSING"
                    }
                  },
                  "INTEGRATION_MODULE_INACTIVE": {
                    "summary": "INTEGRATION_MODULE_INACTIVE",
                    "value": {
                      "success": false,
                      "error": "Bu uç \"bookings\" modülünü gerektirir; modül bu sitede etkin değil.",
                      "code": "INTEGRATION_MODULE_INACTIVE"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "`SP_BOOKING_NOT_FOUND`: Randevu, hizmet ya da randevu sayfası bulunamadı.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_BOOKING_NOT_FOUND": {
                    "summary": "SP_BOOKING_NOT_FOUND",
                    "value": {
                      "success": false,
                      "error": "NOT_FOUND",
                      "code": "SP_BOOKING_NOT_FOUND"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "`SP_API_RATE_LIMITED`: Hız sınırı aşıldı; `Retry-After` kadar bekleyin.",
            "headers": {
              "Retry-After": {
                "description": "Yeniden denemeden önce beklenecek saniye.",
                "schema": {
                  "type": "integer"
                },
                "example": 60
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_RATE_LIMITED": {
                    "summary": "SP_API_RATE_LIMITED",
                    "value": {
                      "success": false,
                      "error": "Çok fazla istek. Biraz sonra tekrar dene.",
                      "code": "SP_API_RATE_LIMITED"
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "`SP_API_INTERNAL`: Beklenmeyen sunucu hatası.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_INTERNAL": {
                    "summary": "SP_API_INTERNAL",
                    "value": {
                      "success": false,
                      "error": "Beklenmeyen bir hata oluştu.",
                      "code": "SP_API_INTERNAL"
                    }
                  }
                }
              }
            }
          }
        },
        "x-scope": "bookings:read",
        "x-module": "bookings",
        "x-requires-repair-enabled": false
      }
    },
    "/api/integrations/v1/bookings/availability": {
      "get": {
        "operationId": "bookingsAvailability",
        "summary": "Boş saatleri listele",
        "description": "Hizmetin verilen tarih aralığındaki boş başlangıç saatlerini döner.\n\nGerekli izin: `bookings:read`.\n\nGerekli modül: Randevu.",
        "tags": [
          "Randevular"
        ],
        "security": [
          {
            "SpAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "serviceId",
            "in": "query",
            "required": true,
            "description": "Hizmet kimliği. `GET /bookings/offerings` ile alınır.",
            "schema": {
              "type": "string",
              "maxLength": 40
            },
            "example": "cm4example000service00001"
          },
          {
            "name": "from",
            "in": "query",
            "required": true,
            "description": "Aralığın ilk günü (YYYY-AA-GG).",
            "schema": {
              "type": "string",
              "format": "date"
            },
            "example": "2026-11-10"
          },
          {
            "name": "to",
            "in": "query",
            "required": true,
            "description": "Aralığın son günü (YYYY-AA-GG). Aralık en çok 62 gün olabilir.",
            "schema": {
              "type": "string",
              "format": "date"
            },
            "example": "2026-11-14"
          },
          {
            "name": "staffId",
            "in": "query",
            "required": false,
            "description": "Yalnız bu personelin boş saatleri.",
            "schema": {
              "type": "string",
              "maxLength": 40
            },
            "example": "cm4example000staff0000001"
          },
          {
            "name": "X-SP-Api-Version",
            "in": "header",
            "required": false,
            "description": "Kodunuzun yazıldığı API sürümü, örneğin `1.1.0`. Yalnız sürüm takibi için kaydedilir.",
            "schema": {
              "type": "string"
            },
            "example": "1.1.0"
          }
        ],
        "responses": {
          "200": {
            "description": "Başarılı yanıt.",
            "headers": {
              "X-SP-Api-Version": {
                "description": "Yanıtı üreten API sürümü.",
                "schema": {
                  "type": "string"
                },
                "example": "1.1.0"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Availability"
                },
                "example": {
                  "success": true,
                  "data": {
                    "timezone": "Europe/Istanbul",
                    "items": [
                      {
                        "startAt": "2026-11-10T07:00:00.000Z",
                        "endAt": "2026-11-10T07:30:00.000Z"
                      }
                    ]
                  }
                }
              }
            }
          },
          "400": {
            "description": "`SP_API_BAD_REQUEST`: Gövde ya da sorgu parametresi geçersiz.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_BAD_REQUEST": {
                    "summary": "SP_API_BAD_REQUEST",
                    "value": {
                      "success": false,
                      "error": "Geçersiz istek.",
                      "code": "SP_API_BAD_REQUEST"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "`SP_API_NO_KEY`: Anahtar gönderilmedi.\n\n`SP_API_INVALID_KEY`: Anahtar geçersiz, iptal edilmiş ya da süresi dolmuş.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_NO_KEY": {
                    "summary": "SP_API_NO_KEY",
                    "value": {
                      "success": false,
                      "error": "API anahtarı gerekli. Anahtarı X-SP-Auth başlığıyla ya da Authorization: Bearer ile gönderin.",
                      "code": "SP_API_NO_KEY"
                    }
                  },
                  "SP_API_INVALID_KEY": {
                    "summary": "SP_API_INVALID_KEY",
                    "value": {
                      "success": false,
                      "error": "API anahtarı geçersiz.",
                      "code": "SP_API_INVALID_KEY"
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "`SP_API_IP_DENIED`: İstek, anahtarın IP izin listesinde olmayan bir adresten geldi.\n\n`INTEGRATION_SCOPE_MISSING`: Proje anahtarında gerekli izin açık değil.\n\n`INTEGRATION_MODULE_INACTIVE`: Gerekli modül sitede etkin değil.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_IP_DENIED": {
                    "summary": "SP_API_IP_DENIED",
                    "value": {
                      "success": false,
                      "error": "Bu API anahtarı yalnız izin verilen IP adreslerinden kullanılabilir; istek 203.0.113.7 adresinden geldi ve listede yok. Adresi panelde API erişimi bölümündeki IP izin listesine ekleyebilirsiniz.",
                      "code": "SP_API_IP_DENIED"
                    }
                  },
                  "INTEGRATION_SCOPE_MISSING": {
                    "summary": "INTEGRATION_SCOPE_MISSING",
                    "value": {
                      "success": false,
                      "error": "Bu işlem için API anahtarında \"bookings:read\" izni açık değil.",
                      "code": "INTEGRATION_SCOPE_MISSING"
                    }
                  },
                  "INTEGRATION_MODULE_INACTIVE": {
                    "summary": "INTEGRATION_MODULE_INACTIVE",
                    "value": {
                      "success": false,
                      "error": "Bu uç \"bookings\" modülünü gerektirir; modül bu sitede etkin değil.",
                      "code": "INTEGRATION_MODULE_INACTIVE"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "`SP_BOOKING_NOT_FOUND`: Randevu, hizmet ya da randevu sayfası bulunamadı.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_BOOKING_NOT_FOUND": {
                    "summary": "SP_BOOKING_NOT_FOUND",
                    "value": {
                      "success": false,
                      "error": "NOT_FOUND",
                      "code": "SP_BOOKING_NOT_FOUND"
                    }
                  }
                }
              }
            }
          },
          "422": {
            "description": "`SP_BOOKING_INVALID`: Tarih aralığı, personel ya da form alanı geçersiz.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_BOOKING_INVALID": {
                    "summary": "SP_BOOKING_INVALID",
                    "value": {
                      "success": false,
                      "error": "INVALID",
                      "code": "SP_BOOKING_INVALID"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "`SP_API_RATE_LIMITED`: Hız sınırı aşıldı; `Retry-After` kadar bekleyin.",
            "headers": {
              "Retry-After": {
                "description": "Yeniden denemeden önce beklenecek saniye.",
                "schema": {
                  "type": "integer"
                },
                "example": 60
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_RATE_LIMITED": {
                    "summary": "SP_API_RATE_LIMITED",
                    "value": {
                      "success": false,
                      "error": "Çok fazla istek. Biraz sonra tekrar dene.",
                      "code": "SP_API_RATE_LIMITED"
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "`SP_API_INTERNAL`: Beklenmeyen sunucu hatası.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_INTERNAL": {
                    "summary": "SP_API_INTERNAL",
                    "value": {
                      "success": false,
                      "error": "Beklenmeyen bir hata oluştu.",
                      "code": "SP_API_INTERNAL"
                    }
                  }
                }
              }
            }
          }
        },
        "x-scope": "bookings:read",
        "x-module": "bookings",
        "x-requires-repair-enabled": false
      }
    },
    "/api/integrations/v1/bookings/appointments": {
      "get": {
        "operationId": "bookingsList",
        "summary": "Randevuları listele",
        "description": "Randevuları başlangıç zamanına göre sıralı döner. Devamı için `nextCursor` değerini `cursor` olarak gönderin.\n\nGerekli izin: `bookings:read`.\n\nGerekli modül: Randevu.",
        "tags": [
          "Randevular"
        ],
        "security": [
          {
            "SpAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "status",
            "in": "query",
            "required": false,
            "description": "Duruma göre süzer.",
            "schema": {
              "type": "string",
              "enum": [
                "PENDING",
                "CONFIRMED",
                "COMPLETED",
                "CANCELLED",
                "FAILED"
              ]
            },
            "example": "CONFIRMED"
          },
          {
            "name": "from",
            "in": "query",
            "required": false,
            "description": "Bu andan sonra başlayan randevular (saat dilimi içeren ISO 8601).",
            "schema": {
              "type": "string",
              "format": "date-time"
            },
            "example": "2026-11-01T00:00:00+03:00"
          },
          {
            "name": "to",
            "in": "query",
            "required": false,
            "description": "Bu andan önce başlayan randevular (saat dilimi içeren ISO 8601).",
            "schema": {
              "type": "string",
              "format": "date-time"
            },
            "example": "2026-12-01T00:00:00+03:00"
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Önceki yanıttaki `nextCursor` değeri.",
            "schema": {
              "type": "string",
              "maxLength": 40
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Sayfadaki en fazla randevu sayısı.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 200,
              "default": 100
            },
            "example": 50
          },
          {
            "name": "X-SP-Api-Version",
            "in": "header",
            "required": false,
            "description": "Kodunuzun yazıldığı API sürümü, örneğin `1.1.0`. Yalnız sürüm takibi için kaydedilir.",
            "schema": {
              "type": "string"
            },
            "example": "1.1.0"
          }
        ],
        "responses": {
          "200": {
            "description": "Başarılı yanıt.",
            "headers": {
              "X-SP-Api-Version": {
                "description": "Yanıtı üreten API sürümü.",
                "schema": {
                  "type": "string"
                },
                "example": "1.1.0"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AppointmentList"
                },
                "example": {
                  "success": true,
                  "data": {
                    "items": [
                      {
                        "id": "apt_Ex4mpleRandevu01",
                        "status": "CONFIRMED",
                        "serviceId": "cm4example000service00001",
                        "staffId": "cm4example000staff0000001",
                        "startAt": "2026-11-10T07:00:00.000Z",
                        "endAt": "2026-11-10T07:30:00.000Z",
                        "timezone": "Europe/Istanbul",
                        "customer": {
                          "name": "Ayşe Yılmaz",
                          "email": "ayse@example.com",
                          "phone": "+905550000000"
                        },
                        "notes": null,
                        "answers": {},
                        "source": "API",
                        "language": "tr",
                        "createdAt": "2026-11-01T09:30:00.000Z",
                        "approvedAt": "2026-11-01T09:30:00.000Z",
                        "cancelledBy": null,
                        "cancelReason": null
                      }
                    ],
                    "nextCursor": null
                  }
                }
              }
            }
          },
          "400": {
            "description": "`SP_API_BAD_REQUEST`: Gövde ya da sorgu parametresi geçersiz.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_BAD_REQUEST": {
                    "summary": "SP_API_BAD_REQUEST",
                    "value": {
                      "success": false,
                      "error": "Geçersiz istek.",
                      "code": "SP_API_BAD_REQUEST"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "`SP_API_NO_KEY`: Anahtar gönderilmedi.\n\n`SP_API_INVALID_KEY`: Anahtar geçersiz, iptal edilmiş ya da süresi dolmuş.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_NO_KEY": {
                    "summary": "SP_API_NO_KEY",
                    "value": {
                      "success": false,
                      "error": "API anahtarı gerekli. Anahtarı X-SP-Auth başlığıyla ya da Authorization: Bearer ile gönderin.",
                      "code": "SP_API_NO_KEY"
                    }
                  },
                  "SP_API_INVALID_KEY": {
                    "summary": "SP_API_INVALID_KEY",
                    "value": {
                      "success": false,
                      "error": "API anahtarı geçersiz.",
                      "code": "SP_API_INVALID_KEY"
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "`SP_API_IP_DENIED`: İstek, anahtarın IP izin listesinde olmayan bir adresten geldi.\n\n`INTEGRATION_SCOPE_MISSING`: Proje anahtarında gerekli izin açık değil.\n\n`INTEGRATION_MODULE_INACTIVE`: Gerekli modül sitede etkin değil.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_IP_DENIED": {
                    "summary": "SP_API_IP_DENIED",
                    "value": {
                      "success": false,
                      "error": "Bu API anahtarı yalnız izin verilen IP adreslerinden kullanılabilir; istek 203.0.113.7 adresinden geldi ve listede yok. Adresi panelde API erişimi bölümündeki IP izin listesine ekleyebilirsiniz.",
                      "code": "SP_API_IP_DENIED"
                    }
                  },
                  "INTEGRATION_SCOPE_MISSING": {
                    "summary": "INTEGRATION_SCOPE_MISSING",
                    "value": {
                      "success": false,
                      "error": "Bu işlem için API anahtarında \"bookings:read\" izni açık değil.",
                      "code": "INTEGRATION_SCOPE_MISSING"
                    }
                  },
                  "INTEGRATION_MODULE_INACTIVE": {
                    "summary": "INTEGRATION_MODULE_INACTIVE",
                    "value": {
                      "success": false,
                      "error": "Bu uç \"bookings\" modülünü gerektirir; modül bu sitede etkin değil.",
                      "code": "INTEGRATION_MODULE_INACTIVE"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "`SP_API_RATE_LIMITED`: Hız sınırı aşıldı; `Retry-After` kadar bekleyin.",
            "headers": {
              "Retry-After": {
                "description": "Yeniden denemeden önce beklenecek saniye.",
                "schema": {
                  "type": "integer"
                },
                "example": 60
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_RATE_LIMITED": {
                    "summary": "SP_API_RATE_LIMITED",
                    "value": {
                      "success": false,
                      "error": "Çok fazla istek. Biraz sonra tekrar dene.",
                      "code": "SP_API_RATE_LIMITED"
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "`SP_API_INTERNAL`: Beklenmeyen sunucu hatası.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_INTERNAL": {
                    "summary": "SP_API_INTERNAL",
                    "value": {
                      "success": false,
                      "error": "Beklenmeyen bir hata oluştu.",
                      "code": "SP_API_INTERNAL"
                    }
                  }
                }
              }
            }
          }
        },
        "x-scope": "bookings:read",
        "x-module": "bookings",
        "x-requires-repair-enabled": false
      },
      "post": {
        "operationId": "bookingsCreate",
        "summary": "Randevu oluştur",
        "description": "Yeni randevu açar. Randevu sayfası onay gerektiriyorsa `PENDING`, gerektirmiyorsa `CONFIRMED` döner. Saat doluysa 409 `SP_BOOKING_SLOT_TAKEN` alırsınız.\n\nGerekli izin: `bookings:write`.\n\nGerekli modül: Randevu.",
        "tags": [
          "Randevular"
        ],
        "security": [
          {
            "SpAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "X-SP-Api-Version",
            "in": "header",
            "required": false,
            "description": "Kodunuzun yazıldığı API sürümü, örneğin `1.1.0`. Yalnız sürüm takibi için kaydedilir.",
            "schema": {
              "type": "string"
            },
            "example": "1.1.0"
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "Bu isteği tekilleştiren, sizin ürettiğiniz anahtar (en çok 128 karakter).",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 128
            },
            "example": "ornek-istek-0001"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AppointmentCreate"
              },
              "example": {
                "serviceId": "cm4example000service00001",
                "startAt": "2026-11-10T10:00:00+03:00",
                "name": "Ayşe Yılmaz",
                "email": "ayse@example.com",
                "phone": "+905550000000",
                "language": "tr"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Başarılı yanıt.",
            "headers": {
              "X-SP-Api-Version": {
                "description": "Yanıtı üreten API sürümü.",
                "schema": {
                  "type": "string"
                },
                "example": "1.1.0"
              },
              "Idempotent-Replayed": {
                "description": "Yanıt, aynı `Idempotency-Key` ile yapılmış önceki istekten geliyorsa `true`.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AppointmentResult"
                },
                "example": {
                  "success": true,
                  "data": {
                    "id": "apt_Ex4mpleRandevu01",
                    "status": "CONFIRMED",
                    "serviceId": "cm4example000service00001",
                    "staffId": "cm4example000staff0000001",
                    "startAt": "2026-11-10T07:00:00.000Z",
                    "endAt": "2026-11-10T07:30:00.000Z",
                    "timezone": "Europe/Istanbul",
                    "customer": {
                      "name": "Ayşe Yılmaz",
                      "email": "ayse@example.com",
                      "phone": "+905550000000"
                    },
                    "notes": null,
                    "answers": {},
                    "source": "API",
                    "language": "tr",
                    "createdAt": "2026-11-01T09:30:00.000Z",
                    "approvedAt": "2026-11-01T09:30:00.000Z",
                    "cancelledBy": null,
                    "cancelReason": null
                  }
                }
              }
            }
          },
          "400": {
            "description": "`INTEGRATION_IDEMPOTENCY_KEY_INVALID`: `Idempotency-Key` boş ya da fazla uzun.\n\n`SP_API_BAD_REQUEST`: Gövde ya da sorgu parametresi geçersiz.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "INTEGRATION_IDEMPOTENCY_KEY_INVALID": {
                    "summary": "INTEGRATION_IDEMPOTENCY_KEY_INVALID",
                    "value": {
                      "success": false,
                      "error": "Idempotency-Key boş olamaz ve en çok 128 karakter olabilir.",
                      "code": "INTEGRATION_IDEMPOTENCY_KEY_INVALID"
                    }
                  },
                  "SP_API_BAD_REQUEST": {
                    "summary": "SP_API_BAD_REQUEST",
                    "value": {
                      "success": false,
                      "error": "Geçersiz istek.",
                      "code": "SP_API_BAD_REQUEST"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "`SP_API_NO_KEY`: Anahtar gönderilmedi.\n\n`SP_API_INVALID_KEY`: Anahtar geçersiz, iptal edilmiş ya da süresi dolmuş.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_NO_KEY": {
                    "summary": "SP_API_NO_KEY",
                    "value": {
                      "success": false,
                      "error": "API anahtarı gerekli. Anahtarı X-SP-Auth başlığıyla ya da Authorization: Bearer ile gönderin.",
                      "code": "SP_API_NO_KEY"
                    }
                  },
                  "SP_API_INVALID_KEY": {
                    "summary": "SP_API_INVALID_KEY",
                    "value": {
                      "success": false,
                      "error": "API anahtarı geçersiz.",
                      "code": "SP_API_INVALID_KEY"
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "`SP_API_IP_DENIED`: İstek, anahtarın IP izin listesinde olmayan bir adresten geldi.\n\n`INTEGRATION_SCOPE_MISSING`: Proje anahtarında gerekli izin açık değil.\n\n`INTEGRATION_MODULE_INACTIVE`: Gerekli modül sitede etkin değil.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_IP_DENIED": {
                    "summary": "SP_API_IP_DENIED",
                    "value": {
                      "success": false,
                      "error": "Bu API anahtarı yalnız izin verilen IP adreslerinden kullanılabilir; istek 203.0.113.7 adresinden geldi ve listede yok. Adresi panelde API erişimi bölümündeki IP izin listesine ekleyebilirsiniz.",
                      "code": "SP_API_IP_DENIED"
                    }
                  },
                  "INTEGRATION_SCOPE_MISSING": {
                    "summary": "INTEGRATION_SCOPE_MISSING",
                    "value": {
                      "success": false,
                      "error": "Bu işlem için API anahtarında \"bookings:read\" izni açık değil.",
                      "code": "INTEGRATION_SCOPE_MISSING"
                    }
                  },
                  "INTEGRATION_MODULE_INACTIVE": {
                    "summary": "INTEGRATION_MODULE_INACTIVE",
                    "value": {
                      "success": false,
                      "error": "Bu uç \"bookings\" modülünü gerektirir; modül bu sitede etkin değil.",
                      "code": "INTEGRATION_MODULE_INACTIVE"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "`SP_BOOKING_NOT_FOUND`: Randevu, hizmet ya da randevu sayfası bulunamadı.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_BOOKING_NOT_FOUND": {
                    "summary": "SP_BOOKING_NOT_FOUND",
                    "value": {
                      "success": false,
                      "error": "NOT_FOUND",
                      "code": "SP_BOOKING_NOT_FOUND"
                    }
                  }
                }
              }
            }
          },
          "409": {
            "description": "`INTEGRATION_IDEMPOTENCY_CONFLICT`: Aynı `Idempotency-Key` farklı gövdeyle kullanıldı.\n\n`SP_BOOKING_CLOSED`: Randevu sayfası kapalı.\n\n`SP_BOOKING_LIMIT`: Paketin randevu sınırına ulaşıldı.\n\n`SP_BOOKING_SLOT_TAKEN`: Seçilen saat dolu.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "INTEGRATION_IDEMPOTENCY_CONFLICT": {
                    "summary": "INTEGRATION_IDEMPOTENCY_CONFLICT",
                    "value": {
                      "success": false,
                      "error": "Bu Idempotency-Key başka bir istekle kullanılmış.",
                      "code": "INTEGRATION_IDEMPOTENCY_CONFLICT"
                    }
                  },
                  "SP_BOOKING_CLOSED": {
                    "summary": "SP_BOOKING_CLOSED",
                    "value": {
                      "success": false,
                      "error": "CLOSED",
                      "code": "SP_BOOKING_CLOSED"
                    }
                  },
                  "SP_BOOKING_LIMIT": {
                    "summary": "SP_BOOKING_LIMIT",
                    "value": {
                      "success": false,
                      "error": "LIMIT",
                      "code": "SP_BOOKING_LIMIT"
                    }
                  },
                  "SP_BOOKING_SLOT_TAKEN": {
                    "summary": "SP_BOOKING_SLOT_TAKEN",
                    "value": {
                      "success": false,
                      "error": "SLOT_TAKEN",
                      "code": "SP_BOOKING_SLOT_TAKEN"
                    }
                  }
                }
              }
            }
          },
          "413": {
            "description": "`SP_API_BODY_TOO_LARGE`: İstek gövdesi sınırı aştı.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_BODY_TOO_LARGE": {
                    "summary": "SP_API_BODY_TOO_LARGE",
                    "value": {
                      "success": false,
                      "error": "İstek gövdesi çok büyük (en fazla 256 KB).",
                      "code": "SP_API_BODY_TOO_LARGE"
                    }
                  }
                }
              }
            }
          },
          "422": {
            "description": "`SP_BOOKING_INVALID`: Tarih aralığı, personel ya da form alanı geçersiz.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_BOOKING_INVALID": {
                    "summary": "SP_BOOKING_INVALID",
                    "value": {
                      "success": false,
                      "error": "INVALID",
                      "code": "SP_BOOKING_INVALID"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "`SP_API_RATE_LIMITED`: Hız sınırı aşıldı; `Retry-After` kadar bekleyin.",
            "headers": {
              "Retry-After": {
                "description": "Yeniden denemeden önce beklenecek saniye.",
                "schema": {
                  "type": "integer"
                },
                "example": 60
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_RATE_LIMITED": {
                    "summary": "SP_API_RATE_LIMITED",
                    "value": {
                      "success": false,
                      "error": "Çok fazla istek. Biraz sonra tekrar dene.",
                      "code": "SP_API_RATE_LIMITED"
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "`SP_API_INTERNAL`: Beklenmeyen sunucu hatası.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_INTERNAL": {
                    "summary": "SP_API_INTERNAL",
                    "value": {
                      "success": false,
                      "error": "Beklenmeyen bir hata oluştu.",
                      "code": "SP_API_INTERNAL"
                    }
                  }
                }
              }
            }
          }
        },
        "x-scope": "bookings:write",
        "x-module": "bookings",
        "x-requires-repair-enabled": false
      }
    },
    "/api/integrations/v1/bookings/appointments/{appointmentId}": {
      "get": {
        "operationId": "bookingsGet",
        "summary": "Randevuyu oku",
        "description": "Tek randevuyu döner.\n\nGerekli izin: `bookings:read`.\n\nGerekli modül: Randevu.",
        "tags": [
          "Randevular"
        ],
        "security": [
          {
            "SpAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "appointmentId",
            "in": "path",
            "required": true,
            "description": "Randevu kimliği (yanıtlardaki `id`).",
            "schema": {
              "type": "string"
            },
            "example": "apt_Ex4mpleRandevu01"
          },
          {
            "name": "X-SP-Api-Version",
            "in": "header",
            "required": false,
            "description": "Kodunuzun yazıldığı API sürümü, örneğin `1.1.0`. Yalnız sürüm takibi için kaydedilir.",
            "schema": {
              "type": "string"
            },
            "example": "1.1.0"
          }
        ],
        "responses": {
          "200": {
            "description": "Başarılı yanıt.",
            "headers": {
              "X-SP-Api-Version": {
                "description": "Yanıtı üreten API sürümü.",
                "schema": {
                  "type": "string"
                },
                "example": "1.1.0"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AppointmentResult"
                },
                "example": {
                  "success": true,
                  "data": {
                    "id": "apt_Ex4mpleRandevu01",
                    "status": "CONFIRMED",
                    "serviceId": "cm4example000service00001",
                    "staffId": "cm4example000staff0000001",
                    "startAt": "2026-11-10T07:00:00.000Z",
                    "endAt": "2026-11-10T07:30:00.000Z",
                    "timezone": "Europe/Istanbul",
                    "customer": {
                      "name": "Ayşe Yılmaz",
                      "email": "ayse@example.com",
                      "phone": "+905550000000"
                    },
                    "notes": null,
                    "answers": {},
                    "source": "API",
                    "language": "tr",
                    "createdAt": "2026-11-01T09:30:00.000Z",
                    "approvedAt": "2026-11-01T09:30:00.000Z",
                    "cancelledBy": null,
                    "cancelReason": null
                  }
                }
              }
            }
          },
          "401": {
            "description": "`SP_API_NO_KEY`: Anahtar gönderilmedi.\n\n`SP_API_INVALID_KEY`: Anahtar geçersiz, iptal edilmiş ya da süresi dolmuş.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_NO_KEY": {
                    "summary": "SP_API_NO_KEY",
                    "value": {
                      "success": false,
                      "error": "API anahtarı gerekli. Anahtarı X-SP-Auth başlığıyla ya da Authorization: Bearer ile gönderin.",
                      "code": "SP_API_NO_KEY"
                    }
                  },
                  "SP_API_INVALID_KEY": {
                    "summary": "SP_API_INVALID_KEY",
                    "value": {
                      "success": false,
                      "error": "API anahtarı geçersiz.",
                      "code": "SP_API_INVALID_KEY"
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "`SP_API_IP_DENIED`: İstek, anahtarın IP izin listesinde olmayan bir adresten geldi.\n\n`INTEGRATION_SCOPE_MISSING`: Proje anahtarında gerekli izin açık değil.\n\n`INTEGRATION_MODULE_INACTIVE`: Gerekli modül sitede etkin değil.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_IP_DENIED": {
                    "summary": "SP_API_IP_DENIED",
                    "value": {
                      "success": false,
                      "error": "Bu API anahtarı yalnız izin verilen IP adreslerinden kullanılabilir; istek 203.0.113.7 adresinden geldi ve listede yok. Adresi panelde API erişimi bölümündeki IP izin listesine ekleyebilirsiniz.",
                      "code": "SP_API_IP_DENIED"
                    }
                  },
                  "INTEGRATION_SCOPE_MISSING": {
                    "summary": "INTEGRATION_SCOPE_MISSING",
                    "value": {
                      "success": false,
                      "error": "Bu işlem için API anahtarında \"bookings:read\" izni açık değil.",
                      "code": "INTEGRATION_SCOPE_MISSING"
                    }
                  },
                  "INTEGRATION_MODULE_INACTIVE": {
                    "summary": "INTEGRATION_MODULE_INACTIVE",
                    "value": {
                      "success": false,
                      "error": "Bu uç \"bookings\" modülünü gerektirir; modül bu sitede etkin değil.",
                      "code": "INTEGRATION_MODULE_INACTIVE"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "`SP_BOOKING_NOT_FOUND`: Randevu, hizmet ya da randevu sayfası bulunamadı.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_BOOKING_NOT_FOUND": {
                    "summary": "SP_BOOKING_NOT_FOUND",
                    "value": {
                      "success": false,
                      "error": "NOT_FOUND",
                      "code": "SP_BOOKING_NOT_FOUND"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "`SP_API_RATE_LIMITED`: Hız sınırı aşıldı; `Retry-After` kadar bekleyin.",
            "headers": {
              "Retry-After": {
                "description": "Yeniden denemeden önce beklenecek saniye.",
                "schema": {
                  "type": "integer"
                },
                "example": 60
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_RATE_LIMITED": {
                    "summary": "SP_API_RATE_LIMITED",
                    "value": {
                      "success": false,
                      "error": "Çok fazla istek. Biraz sonra tekrar dene.",
                      "code": "SP_API_RATE_LIMITED"
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "`SP_API_INTERNAL`: Beklenmeyen sunucu hatası.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_INTERNAL": {
                    "summary": "SP_API_INTERNAL",
                    "value": {
                      "success": false,
                      "error": "Beklenmeyen bir hata oluştu.",
                      "code": "SP_API_INTERNAL"
                    }
                  }
                }
              }
            }
          }
        },
        "x-scope": "bookings:read",
        "x-module": "bookings",
        "x-requires-repair-enabled": false
      }
    },
    "/api/integrations/v1/bookings/appointments/{appointmentId}/approve": {
      "post": {
        "operationId": "bookingsApprove",
        "summary": "Randevuyu onayla",
        "description": "`PENDING` durumundaki, zamanı geçmemiş randevuyu `CONFIRMED` yapar.\n\nGerekli izin: `bookings:write`.\n\nGerekli modül: Randevu.",
        "tags": [
          "Randevular"
        ],
        "security": [
          {
            "SpAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "appointmentId",
            "in": "path",
            "required": true,
            "description": "Randevu kimliği (yanıtlardaki `id`).",
            "schema": {
              "type": "string"
            },
            "example": "apt_Ex4mpleRandevu01"
          },
          {
            "name": "X-SP-Api-Version",
            "in": "header",
            "required": false,
            "description": "Kodunuzun yazıldığı API sürümü, örneğin `1.1.0`. Yalnız sürüm takibi için kaydedilir.",
            "schema": {
              "type": "string"
            },
            "example": "1.1.0"
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "Bu isteği tekilleştiren, sizin ürettiğiniz anahtar (en çok 128 karakter).",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 128
            },
            "example": "ornek-istek-0001"
          }
        ],
        "responses": {
          "200": {
            "description": "Başarılı yanıt.",
            "headers": {
              "X-SP-Api-Version": {
                "description": "Yanıtı üreten API sürümü.",
                "schema": {
                  "type": "string"
                },
                "example": "1.1.0"
              },
              "Idempotent-Replayed": {
                "description": "Yanıt, aynı `Idempotency-Key` ile yapılmış önceki istekten geliyorsa `true`.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AppointmentResult"
                },
                "example": {
                  "success": true,
                  "data": {
                    "id": "apt_Ex4mpleRandevu01",
                    "status": "CONFIRMED",
                    "serviceId": "cm4example000service00001",
                    "staffId": "cm4example000staff0000001",
                    "startAt": "2026-11-10T07:00:00.000Z",
                    "endAt": "2026-11-10T07:30:00.000Z",
                    "timezone": "Europe/Istanbul",
                    "customer": {
                      "name": "Ayşe Yılmaz",
                      "email": "ayse@example.com",
                      "phone": "+905550000000"
                    },
                    "notes": null,
                    "answers": {},
                    "source": "API",
                    "language": "tr",
                    "createdAt": "2026-11-01T09:30:00.000Z",
                    "approvedAt": "2026-11-01T09:30:00.000Z",
                    "cancelledBy": null,
                    "cancelReason": null
                  }
                }
              }
            }
          },
          "400": {
            "description": "`INTEGRATION_IDEMPOTENCY_KEY_INVALID`: `Idempotency-Key` boş ya da fazla uzun.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "INTEGRATION_IDEMPOTENCY_KEY_INVALID": {
                    "summary": "INTEGRATION_IDEMPOTENCY_KEY_INVALID",
                    "value": {
                      "success": false,
                      "error": "Idempotency-Key boş olamaz ve en çok 128 karakter olabilir.",
                      "code": "INTEGRATION_IDEMPOTENCY_KEY_INVALID"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "`SP_API_NO_KEY`: Anahtar gönderilmedi.\n\n`SP_API_INVALID_KEY`: Anahtar geçersiz, iptal edilmiş ya da süresi dolmuş.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_NO_KEY": {
                    "summary": "SP_API_NO_KEY",
                    "value": {
                      "success": false,
                      "error": "API anahtarı gerekli. Anahtarı X-SP-Auth başlığıyla ya da Authorization: Bearer ile gönderin.",
                      "code": "SP_API_NO_KEY"
                    }
                  },
                  "SP_API_INVALID_KEY": {
                    "summary": "SP_API_INVALID_KEY",
                    "value": {
                      "success": false,
                      "error": "API anahtarı geçersiz.",
                      "code": "SP_API_INVALID_KEY"
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "`SP_API_IP_DENIED`: İstek, anahtarın IP izin listesinde olmayan bir adresten geldi.\n\n`INTEGRATION_SCOPE_MISSING`: Proje anahtarında gerekli izin açık değil.\n\n`INTEGRATION_MODULE_INACTIVE`: Gerekli modül sitede etkin değil.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_IP_DENIED": {
                    "summary": "SP_API_IP_DENIED",
                    "value": {
                      "success": false,
                      "error": "Bu API anahtarı yalnız izin verilen IP adreslerinden kullanılabilir; istek 203.0.113.7 adresinden geldi ve listede yok. Adresi panelde API erişimi bölümündeki IP izin listesine ekleyebilirsiniz.",
                      "code": "SP_API_IP_DENIED"
                    }
                  },
                  "INTEGRATION_SCOPE_MISSING": {
                    "summary": "INTEGRATION_SCOPE_MISSING",
                    "value": {
                      "success": false,
                      "error": "Bu işlem için API anahtarında \"bookings:read\" izni açık değil.",
                      "code": "INTEGRATION_SCOPE_MISSING"
                    }
                  },
                  "INTEGRATION_MODULE_INACTIVE": {
                    "summary": "INTEGRATION_MODULE_INACTIVE",
                    "value": {
                      "success": false,
                      "error": "Bu uç \"bookings\" modülünü gerektirir; modül bu sitede etkin değil.",
                      "code": "INTEGRATION_MODULE_INACTIVE"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "`SP_BOOKING_NOT_FOUND`: Randevu, hizmet ya da randevu sayfası bulunamadı.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_BOOKING_NOT_FOUND": {
                    "summary": "SP_BOOKING_NOT_FOUND",
                    "value": {
                      "success": false,
                      "error": "NOT_FOUND",
                      "code": "SP_BOOKING_NOT_FOUND"
                    }
                  }
                }
              }
            }
          },
          "409": {
            "description": "`INTEGRATION_IDEMPOTENCY_CONFLICT`: Aynı `Idempotency-Key` farklı gövdeyle kullanıldı.\n\n`SP_BOOKING_STATE`: Randevunun bu durumunda işlem yapılamaz.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "INTEGRATION_IDEMPOTENCY_CONFLICT": {
                    "summary": "INTEGRATION_IDEMPOTENCY_CONFLICT",
                    "value": {
                      "success": false,
                      "error": "Bu Idempotency-Key başka bir istekle kullanılmış.",
                      "code": "INTEGRATION_IDEMPOTENCY_CONFLICT"
                    }
                  },
                  "SP_BOOKING_STATE": {
                    "summary": "SP_BOOKING_STATE",
                    "value": {
                      "success": false,
                      "error": "STATE",
                      "code": "SP_BOOKING_STATE"
                    }
                  }
                }
              }
            }
          },
          "413": {
            "description": "`SP_API_BODY_TOO_LARGE`: İstek gövdesi sınırı aştı.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_BODY_TOO_LARGE": {
                    "summary": "SP_API_BODY_TOO_LARGE",
                    "value": {
                      "success": false,
                      "error": "İstek gövdesi çok büyük (en fazla 256 KB).",
                      "code": "SP_API_BODY_TOO_LARGE"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "`SP_API_RATE_LIMITED`: Hız sınırı aşıldı; `Retry-After` kadar bekleyin.",
            "headers": {
              "Retry-After": {
                "description": "Yeniden denemeden önce beklenecek saniye.",
                "schema": {
                  "type": "integer"
                },
                "example": 60
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_RATE_LIMITED": {
                    "summary": "SP_API_RATE_LIMITED",
                    "value": {
                      "success": false,
                      "error": "Çok fazla istek. Biraz sonra tekrar dene.",
                      "code": "SP_API_RATE_LIMITED"
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "`SP_API_INTERNAL`: Beklenmeyen sunucu hatası.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_INTERNAL": {
                    "summary": "SP_API_INTERNAL",
                    "value": {
                      "success": false,
                      "error": "Beklenmeyen bir hata oluştu.",
                      "code": "SP_API_INTERNAL"
                    }
                  }
                }
              }
            }
          }
        },
        "x-scope": "bookings:write",
        "x-module": "bookings",
        "x-requires-repair-enabled": false
      }
    },
    "/api/integrations/v1/bookings/appointments/{appointmentId}/cancel": {
      "post": {
        "operationId": "bookingsCancel",
        "summary": "Randevuyu iptal et",
        "description": "Etkin randevuyu `CANCELLED` yapar. İptal nedeni isteğe bağlıdır.\n\nGerekli izin: `bookings:write`.\n\nGerekli modül: Randevu.",
        "tags": [
          "Randevular"
        ],
        "security": [
          {
            "SpAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "appointmentId",
            "in": "path",
            "required": true,
            "description": "Randevu kimliği (yanıtlardaki `id`).",
            "schema": {
              "type": "string"
            },
            "example": "apt_Ex4mpleRandevu01"
          },
          {
            "name": "X-SP-Api-Version",
            "in": "header",
            "required": false,
            "description": "Kodunuzun yazıldığı API sürümü, örneğin `1.1.0`. Yalnız sürüm takibi için kaydedilir.",
            "schema": {
              "type": "string"
            },
            "example": "1.1.0"
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "Bu isteği tekilleştiren, sizin ürettiğiniz anahtar (en çok 128 karakter).",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 128
            },
            "example": "ornek-istek-0001"
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AppointmentCancel"
              },
              "example": {
                "reason": "Müşteri tarihi değiştirmek istedi."
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Başarılı yanıt.",
            "headers": {
              "X-SP-Api-Version": {
                "description": "Yanıtı üreten API sürümü.",
                "schema": {
                  "type": "string"
                },
                "example": "1.1.0"
              },
              "Idempotent-Replayed": {
                "description": "Yanıt, aynı `Idempotency-Key` ile yapılmış önceki istekten geliyorsa `true`.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AppointmentResult"
                },
                "example": {
                  "success": true,
                  "data": {
                    "id": "apt_Ex4mpleRandevu01",
                    "status": "CANCELLED",
                    "serviceId": "cm4example000service00001",
                    "staffId": "cm4example000staff0000001",
                    "startAt": "2026-11-10T07:00:00.000Z",
                    "endAt": "2026-11-10T07:30:00.000Z",
                    "timezone": "Europe/Istanbul",
                    "customer": {
                      "name": "Ayşe Yılmaz",
                      "email": "ayse@example.com",
                      "phone": "+905550000000"
                    },
                    "notes": null,
                    "answers": {},
                    "source": "API",
                    "language": "tr",
                    "createdAt": "2026-11-01T09:30:00.000Z",
                    "approvedAt": "2026-11-01T09:30:00.000Z",
                    "cancelledBy": "api",
                    "cancelReason": "Müşteri tarihi değiştirmek istedi."
                  }
                }
              }
            }
          },
          "400": {
            "description": "`INTEGRATION_IDEMPOTENCY_KEY_INVALID`: `Idempotency-Key` boş ya da fazla uzun.\n\n`SP_API_BAD_REQUEST`: Gövde ya da sorgu parametresi geçersiz.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "INTEGRATION_IDEMPOTENCY_KEY_INVALID": {
                    "summary": "INTEGRATION_IDEMPOTENCY_KEY_INVALID",
                    "value": {
                      "success": false,
                      "error": "Idempotency-Key boş olamaz ve en çok 128 karakter olabilir.",
                      "code": "INTEGRATION_IDEMPOTENCY_KEY_INVALID"
                    }
                  },
                  "SP_API_BAD_REQUEST": {
                    "summary": "SP_API_BAD_REQUEST",
                    "value": {
                      "success": false,
                      "error": "Geçersiz istek.",
                      "code": "SP_API_BAD_REQUEST"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "`SP_API_NO_KEY`: Anahtar gönderilmedi.\n\n`SP_API_INVALID_KEY`: Anahtar geçersiz, iptal edilmiş ya da süresi dolmuş.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_NO_KEY": {
                    "summary": "SP_API_NO_KEY",
                    "value": {
                      "success": false,
                      "error": "API anahtarı gerekli. Anahtarı X-SP-Auth başlığıyla ya da Authorization: Bearer ile gönderin.",
                      "code": "SP_API_NO_KEY"
                    }
                  },
                  "SP_API_INVALID_KEY": {
                    "summary": "SP_API_INVALID_KEY",
                    "value": {
                      "success": false,
                      "error": "API anahtarı geçersiz.",
                      "code": "SP_API_INVALID_KEY"
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "`SP_API_IP_DENIED`: İstek, anahtarın IP izin listesinde olmayan bir adresten geldi.\n\n`INTEGRATION_SCOPE_MISSING`: Proje anahtarında gerekli izin açık değil.\n\n`INTEGRATION_MODULE_INACTIVE`: Gerekli modül sitede etkin değil.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_IP_DENIED": {
                    "summary": "SP_API_IP_DENIED",
                    "value": {
                      "success": false,
                      "error": "Bu API anahtarı yalnız izin verilen IP adreslerinden kullanılabilir; istek 203.0.113.7 adresinden geldi ve listede yok. Adresi panelde API erişimi bölümündeki IP izin listesine ekleyebilirsiniz.",
                      "code": "SP_API_IP_DENIED"
                    }
                  },
                  "INTEGRATION_SCOPE_MISSING": {
                    "summary": "INTEGRATION_SCOPE_MISSING",
                    "value": {
                      "success": false,
                      "error": "Bu işlem için API anahtarında \"bookings:read\" izni açık değil.",
                      "code": "INTEGRATION_SCOPE_MISSING"
                    }
                  },
                  "INTEGRATION_MODULE_INACTIVE": {
                    "summary": "INTEGRATION_MODULE_INACTIVE",
                    "value": {
                      "success": false,
                      "error": "Bu uç \"bookings\" modülünü gerektirir; modül bu sitede etkin değil.",
                      "code": "INTEGRATION_MODULE_INACTIVE"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "`SP_BOOKING_NOT_FOUND`: Randevu, hizmet ya da randevu sayfası bulunamadı.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_BOOKING_NOT_FOUND": {
                    "summary": "SP_BOOKING_NOT_FOUND",
                    "value": {
                      "success": false,
                      "error": "NOT_FOUND",
                      "code": "SP_BOOKING_NOT_FOUND"
                    }
                  }
                }
              }
            }
          },
          "409": {
            "description": "`INTEGRATION_IDEMPOTENCY_CONFLICT`: Aynı `Idempotency-Key` farklı gövdeyle kullanıldı.\n\n`SP_BOOKING_STATE`: Randevunun bu durumunda işlem yapılamaz.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "INTEGRATION_IDEMPOTENCY_CONFLICT": {
                    "summary": "INTEGRATION_IDEMPOTENCY_CONFLICT",
                    "value": {
                      "success": false,
                      "error": "Bu Idempotency-Key başka bir istekle kullanılmış.",
                      "code": "INTEGRATION_IDEMPOTENCY_CONFLICT"
                    }
                  },
                  "SP_BOOKING_STATE": {
                    "summary": "SP_BOOKING_STATE",
                    "value": {
                      "success": false,
                      "error": "STATE",
                      "code": "SP_BOOKING_STATE"
                    }
                  }
                }
              }
            }
          },
          "413": {
            "description": "`SP_API_BODY_TOO_LARGE`: İstek gövdesi sınırı aştı.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_BODY_TOO_LARGE": {
                    "summary": "SP_API_BODY_TOO_LARGE",
                    "value": {
                      "success": false,
                      "error": "İstek gövdesi çok büyük (en fazla 256 KB).",
                      "code": "SP_API_BODY_TOO_LARGE"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "`SP_API_RATE_LIMITED`: Hız sınırı aşıldı; `Retry-After` kadar bekleyin.",
            "headers": {
              "Retry-After": {
                "description": "Yeniden denemeden önce beklenecek saniye.",
                "schema": {
                  "type": "integer"
                },
                "example": 60
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_RATE_LIMITED": {
                    "summary": "SP_API_RATE_LIMITED",
                    "value": {
                      "success": false,
                      "error": "Çok fazla istek. Biraz sonra tekrar dene.",
                      "code": "SP_API_RATE_LIMITED"
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "`SP_API_INTERNAL`: Beklenmeyen sunucu hatası.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_INTERNAL": {
                    "summary": "SP_API_INTERNAL",
                    "value": {
                      "success": false,
                      "error": "Beklenmeyen bir hata oluştu.",
                      "code": "SP_API_INTERNAL"
                    }
                  }
                }
              }
            }
          }
        },
        "x-scope": "bookings:write",
        "x-module": "bookings",
        "x-requires-repair-enabled": false
      }
    },
    "/api/seo-repair/v1/mcp": {
      "post": {
        "operationId": "mcp",
        "summary": "MCP isteği gönder",
        "description": "Model Context Protocol sunucusudur (JSON-RPC 2.0). Tek istek ya da istek dizisi kabul eder. Araçlar: `test_connection`, `get_seo_fixes`, `report_applied`, `get_status`, `get_content`, `report_content_applied`. Araç hataları 200 yanıtında `result.isError: true` ile döner. `id` taşımayan bildirimler 202 alır. Yalnız `POST` desteklenir; `GET`, `PUT` ve `DELETE` 405 `SP_API_METHOD_NOT_ALLOWED` döner.",
        "tags": [
          "MCP"
        ],
        "security": [
          {
            "SpAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "X-SP-Api-Version",
            "in": "header",
            "required": false,
            "description": "Kodunuzun yazıldığı API sürümü, örneğin `1.1.0`. Yalnız sürüm takibi için kaydedilir.",
            "schema": {
              "type": "string"
            },
            "example": "1.1.0"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/JsonRpcRequest"
                  },
                  {
                    "type": "array",
                    "minItems": 1,
                    "items": {
                      "$ref": "#/components/schemas/JsonRpcRequest"
                    }
                  }
                ]
              },
              "example": {
                "jsonrpc": "2.0",
                "id": 1,
                "method": "tools/call",
                "params": {
                  "name": "get_status",
                  "arguments": {}
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Başarılı yanıt.",
            "headers": {
              "X-SP-Api-Version": {
                "description": "Yanıtı üreten API sürümü.",
                "schema": {
                  "type": "string"
                },
                "example": "1.1.0"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "$ref": "#/components/schemas/JsonRpcResponse"
                    },
                    {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/JsonRpcResponse"
                      }
                    }
                  ]
                },
                "example": {
                  "jsonrpc": "2.0",
                  "id": 1,
                  "result": {
                    "content": [
                      {
                        "type": "text",
                        "text": "{ \"success\": true, \"enabled\": true }"
                      }
                    ],
                    "isError": false
                  }
                }
              }
            }
          },
          "202": {
            "description": "İstek bildirim olduğu için yanıt gövdesi yoktur.",
            "headers": {
              "X-SP-Api-Version": {
                "description": "Yanıtı üreten API sürümü.",
                "schema": {
                  "type": "string"
                },
                "example": "1.1.0"
              }
            }
          },
          "400": {
            "description": "JSON ayrıştırılamadı.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JsonRpcResponse"
                },
                "example": {
                  "jsonrpc": "2.0",
                  "id": null,
                  "error": {
                    "code": -32700,
                    "message": "JSON ayrıştırılamadı."
                  }
                }
              }
            }
          },
          "401": {
            "description": "`SP_API_NO_KEY`: Anahtar gönderilmedi.\n\n`SP_API_INVALID_KEY`: Anahtar geçersiz, iptal edilmiş ya da süresi dolmuş.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_NO_KEY": {
                    "summary": "SP_API_NO_KEY",
                    "value": {
                      "success": false,
                      "error": "API anahtarı gerekli. Anahtarı X-SP-Auth başlığıyla ya da Authorization: Bearer ile gönderin.",
                      "code": "SP_API_NO_KEY"
                    }
                  },
                  "SP_API_INVALID_KEY": {
                    "summary": "SP_API_INVALID_KEY",
                    "value": {
                      "success": false,
                      "error": "API anahtarı geçersiz.",
                      "code": "SP_API_INVALID_KEY"
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "`SP_API_IP_DENIED`: İstek, anahtarın IP izin listesinde olmayan bir adresten geldi.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_IP_DENIED": {
                    "summary": "SP_API_IP_DENIED",
                    "value": {
                      "success": false,
                      "error": "Bu API anahtarı yalnız izin verilen IP adreslerinden kullanılabilir; istek 203.0.113.7 adresinden geldi ve listede yok. Adresi panelde API erişimi bölümündeki IP izin listesine ekleyebilirsiniz.",
                      "code": "SP_API_IP_DENIED"
                    }
                  }
                }
              }
            }
          },
          "413": {
            "description": "`SP_API_BODY_TOO_LARGE`: İstek gövdesi sınırı aştı.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_BODY_TOO_LARGE": {
                    "summary": "SP_API_BODY_TOO_LARGE",
                    "value": {
                      "success": false,
                      "error": "İstek gövdesi çok büyük (en fazla 256 KB).",
                      "code": "SP_API_BODY_TOO_LARGE"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "`SP_API_RATE_LIMITED`: Hız sınırı aşıldı; `Retry-After` kadar bekleyin.",
            "headers": {
              "Retry-After": {
                "description": "Yeniden denemeden önce beklenecek saniye.",
                "schema": {
                  "type": "integer"
                },
                "example": 60
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_RATE_LIMITED": {
                    "summary": "SP_API_RATE_LIMITED",
                    "value": {
                      "success": false,
                      "error": "Çok fazla istek. Biraz sonra tekrar dene.",
                      "code": "SP_API_RATE_LIMITED"
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "`SP_API_INTERNAL`: Beklenmeyen sunucu hatası.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_INTERNAL": {
                    "summary": "SP_API_INTERNAL",
                    "value": {
                      "success": false,
                      "error": "Beklenmeyen bir hata oluştu.",
                      "code": "SP_API_INTERNAL"
                    }
                  }
                }
              }
            }
          }
        },
        "x-requires-repair-enabled": false
      }
    },
    "/api/public/v1/me": {
      "get": {
        "operationId": "accountMe",
        "summary": "Hesap bilgisini oku",
        "description": "Anahtarın sahibini, plan kodunu, kredi bakiyesini ve anahtar bilgisini döner.\n\nGerekli izin: `account:read`.",
        "tags": [
          "Hesap"
        ],
        "security": [
          {
            "AccountBearer": []
          },
          {
            "AccountHeader": []
          }
        ],
        "responses": {
          "200": {
            "description": "Başarılı yanıt.",
            "headers": {
              "X-SP-Public-Api-Version": {
                "description": "Yanıtı üreten hesap API sürümü.",
                "schema": {
                  "type": "string"
                },
                "example": "2026-10-31"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AccountMe"
                },
                "example": {
                  "user": {
                    "id": "cm4example000user00000001",
                    "email": "ayse@example.com",
                    "name": "Ayşe Yılmaz",
                    "plan": "PHOENIX"
                  },
                  "balance": {
                    "creditKurus": 150000
                  },
                  "token": {
                    "name": "Yayın entegrasyonu",
                    "scopes": [
                      "account:read",
                      "content:read"
                    ],
                    "expiresAt": null
                  }
                }
              }
            }
          },
          "401": {
            "description": "`SP_API_NO_KEY`: Anahtar gönderilmedi.\n\n`SP_API_INVALID_KEY`: Anahtar geçersiz, iptal edilmiş ya da süresi dolmuş.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_NO_KEY": {
                    "summary": "SP_API_NO_KEY",
                    "value": {
                      "success": false,
                      "error": "API anahtarı gerekli. Anahtarı X-SP-Auth başlığıyla ya da Authorization: Bearer ile gönderin.",
                      "code": "SP_API_NO_KEY"
                    }
                  },
                  "SP_API_INVALID_KEY": {
                    "summary": "SP_API_INVALID_KEY",
                    "value": {
                      "success": false,
                      "error": "API anahtarı geçersiz.",
                      "code": "SP_API_INVALID_KEY"
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "`TOKEN_SCOPE_MISSING`: Hesap anahtarında gerekli izin yok.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "TOKEN_SCOPE_MISSING": {
                    "summary": "TOKEN_SCOPE_MISSING",
                    "value": {
                      "success": false,
                      "error": "Bu işlem için API anahtarında \"content:read\" izni açık değil.",
                      "code": "TOKEN_SCOPE_MISSING"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "`SP_API_RATE_LIMITED`: Hız sınırı aşıldı; `Retry-After` kadar bekleyin.",
            "headers": {
              "Retry-After": {
                "description": "Yeniden denemeden önce beklenecek saniye.",
                "schema": {
                  "type": "integer"
                },
                "example": 60
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_RATE_LIMITED": {
                    "summary": "SP_API_RATE_LIMITED",
                    "value": {
                      "success": false,
                      "error": "Çok fazla istek. Biraz sonra tekrar dene.",
                      "code": "SP_API_RATE_LIMITED"
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "`SP_API_INTERNAL`: Beklenmeyen sunucu hatası.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_INTERNAL": {
                    "summary": "SP_API_INTERNAL",
                    "value": {
                      "success": false,
                      "error": "Beklenmeyen bir hata oluştu.",
                      "code": "SP_API_INTERNAL"
                    }
                  }
                }
              }
            }
          }
        },
        "x-scope": "account:read"
      }
    },
    "/api/public/v1/projects": {
      "get": {
        "operationId": "projectsList",
        "summary": "Projeleri listele",
        "description": "Anahtarın erişebildiği projeleri döner.\n\nGerekli izin: `projects:read`.",
        "tags": [
          "Hesap"
        ],
        "security": [
          {
            "AccountBearer": []
          },
          {
            "AccountHeader": []
          }
        ],
        "responses": {
          "200": {
            "description": "Başarılı yanıt.",
            "headers": {
              "X-SP-Public-Api-Version": {
                "description": "Yanıtı üreten hesap API sürümü.",
                "schema": {
                  "type": "string"
                },
                "example": "2026-10-31"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProjectList"
                },
                "example": {
                  "projects": [
                    {
                      "id": "cm4example000project00001",
                      "name": "Örnek Şirket",
                      "domain": "example.com",
                      "language": "tr"
                    }
                  ]
                }
              }
            }
          },
          "401": {
            "description": "`SP_API_NO_KEY`: Anahtar gönderilmedi.\n\n`SP_API_INVALID_KEY`: Anahtar geçersiz, iptal edilmiş ya da süresi dolmuş.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_NO_KEY": {
                    "summary": "SP_API_NO_KEY",
                    "value": {
                      "success": false,
                      "error": "API anahtarı gerekli. Anahtarı X-SP-Auth başlığıyla ya da Authorization: Bearer ile gönderin.",
                      "code": "SP_API_NO_KEY"
                    }
                  },
                  "SP_API_INVALID_KEY": {
                    "summary": "SP_API_INVALID_KEY",
                    "value": {
                      "success": false,
                      "error": "API anahtarı geçersiz.",
                      "code": "SP_API_INVALID_KEY"
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "`TOKEN_SCOPE_MISSING`: Hesap anahtarında gerekli izin yok.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "TOKEN_SCOPE_MISSING": {
                    "summary": "TOKEN_SCOPE_MISSING",
                    "value": {
                      "success": false,
                      "error": "Bu işlem için API anahtarında \"content:read\" izni açık değil.",
                      "code": "TOKEN_SCOPE_MISSING"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "`SP_API_RATE_LIMITED`: Hız sınırı aşıldı; `Retry-After` kadar bekleyin.",
            "headers": {
              "Retry-After": {
                "description": "Yeniden denemeden önce beklenecek saniye.",
                "schema": {
                  "type": "integer"
                },
                "example": 60
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_RATE_LIMITED": {
                    "summary": "SP_API_RATE_LIMITED",
                    "value": {
                      "success": false,
                      "error": "Çok fazla istek. Biraz sonra tekrar dene.",
                      "code": "SP_API_RATE_LIMITED"
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "`SP_API_INTERNAL`: Beklenmeyen sunucu hatası.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_INTERNAL": {
                    "summary": "SP_API_INTERNAL",
                    "value": {
                      "success": false,
                      "error": "Beklenmeyen bir hata oluştu.",
                      "code": "SP_API_INTERNAL"
                    }
                  }
                }
              }
            }
          }
        },
        "x-scope": "projects:read"
      }
    },
    "/api/public/v1/projects/{projectId}/articles": {
      "get": {
        "operationId": "articlesList",
        "summary": "Yazıları listele",
        "description": "Projenin yazılarını en yeniden eskiye, sayfalı olarak döner.\n\nGerekli izin: `content:read`.",
        "tags": [
          "Yazılar"
        ],
        "security": [
          {
            "AccountBearer": []
          },
          {
            "AccountHeader": []
          }
        ],
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "description": "Proje kimliği. `GET /api/public/v1/projects` ile alınır.",
            "schema": {
              "type": "string"
            },
            "example": "cm4example000project00001"
          },
          {
            "name": "status",
            "in": "query",
            "required": false,
            "description": "Duruma göre süzer.",
            "schema": {
              "type": "string",
              "enum": [
                "QUEUED",
                "GENERATING",
                "GENERATED",
                "DRAFT",
                "DELIVERED",
                "PUBLISHING",
                "PUBLISHED",
                "PUBLISHED_UNVERIFIED",
                "MISSING_ON_SITE",
                "ARCHIVED",
                "FAILED"
              ]
            },
            "example": "PUBLISHED"
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "description": "Sayfa numarası. Her sayfada 20 kayıt bulunur.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 10000,
              "default": 1
            },
            "example": 1
          }
        ],
        "responses": {
          "200": {
            "description": "Başarılı yanıt.",
            "headers": {
              "X-SP-Public-Api-Version": {
                "description": "Yanıtı üreten hesap API sürümü.",
                "schema": {
                  "type": "string"
                },
                "example": "2026-10-31"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ArticleList"
                },
                "example": {
                  "page": 1,
                  "pageSize": 20,
                  "total": 1,
                  "items": [
                    {
                      "id": "cm4example000article00001",
                      "title": "Kurumsal Web Sitesi Nasıl Hazırlanır?",
                      "status": "PUBLISHED",
                      "kind": "BLOG",
                      "wordCount": 840,
                      "externalUrl": "https://example.com/blog/kurumsal-web-sitesi-nasil-hazirlanir",
                      "publishedAt": "2026-11-01T09:30:00.000Z",
                      "createdAt": "2026-11-01T09:30:00.000Z"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "`SP_API_BAD_REQUEST`: Gövde ya da sorgu parametresi geçersiz.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_BAD_REQUEST": {
                    "summary": "SP_API_BAD_REQUEST",
                    "value": {
                      "success": false,
                      "error": "Geçersiz istek.",
                      "code": "SP_API_BAD_REQUEST"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "`SP_API_NO_KEY`: Anahtar gönderilmedi.\n\n`SP_API_INVALID_KEY`: Anahtar geçersiz, iptal edilmiş ya da süresi dolmuş.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_NO_KEY": {
                    "summary": "SP_API_NO_KEY",
                    "value": {
                      "success": false,
                      "error": "API anahtarı gerekli. Anahtarı X-SP-Auth başlığıyla ya da Authorization: Bearer ile gönderin.",
                      "code": "SP_API_NO_KEY"
                    }
                  },
                  "SP_API_INVALID_KEY": {
                    "summary": "SP_API_INVALID_KEY",
                    "value": {
                      "success": false,
                      "error": "API anahtarı geçersiz.",
                      "code": "SP_API_INVALID_KEY"
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "`TOKEN_SCOPE_MISSING`: Hesap anahtarında gerekli izin yok.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "TOKEN_SCOPE_MISSING": {
                    "summary": "TOKEN_SCOPE_MISSING",
                    "value": {
                      "success": false,
                      "error": "Bu işlem için API anahtarında \"content:read\" izni açık değil.",
                      "code": "TOKEN_SCOPE_MISSING"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "`SP_API_NOT_FOUND`: Uç ya da proje bulunamadı veya erişiminiz yok.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_NOT_FOUND": {
                    "summary": "SP_API_NOT_FOUND",
                    "value": {
                      "success": false,
                      "error": "Uç bulunamadı.",
                      "code": "SP_API_NOT_FOUND"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "`SP_API_RATE_LIMITED`: Hız sınırı aşıldı; `Retry-After` kadar bekleyin.",
            "headers": {
              "Retry-After": {
                "description": "Yeniden denemeden önce beklenecek saniye.",
                "schema": {
                  "type": "integer"
                },
                "example": 60
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_RATE_LIMITED": {
                    "summary": "SP_API_RATE_LIMITED",
                    "value": {
                      "success": false,
                      "error": "Çok fazla istek. Biraz sonra tekrar dene.",
                      "code": "SP_API_RATE_LIMITED"
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "`SP_API_INTERNAL`: Beklenmeyen sunucu hatası.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_INTERNAL": {
                    "summary": "SP_API_INTERNAL",
                    "value": {
                      "success": false,
                      "error": "Beklenmeyen bir hata oluştu.",
                      "code": "SP_API_INTERNAL"
                    }
                  }
                }
              }
            }
          }
        },
        "x-scope": "content:read"
      },
      "post": {
        "operationId": "articleCreate",
        "summary": "Yazı üret",
        "description": "Yazı üretimini sıraya alır ve hemen 202 döner; ücret bakiyeden düşülür. Üretim arka planda sürer, durumu `GET /api/public/v1/articles/{articleId}` ile izleyin. Aynı istek için hazır yazı varsa `cached: true` ile o yazı döner.\n\nGerekli izin: `content:write`.",
        "tags": [
          "Yazılar"
        ],
        "security": [
          {
            "AccountBearer": []
          },
          {
            "AccountHeader": []
          }
        ],
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "description": "Proje kimliği. `GET /api/public/v1/projects` ile alınır.",
            "schema": {
              "type": "string"
            },
            "example": "cm4example000project00001"
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "Bu isteği tekilleştiren, sizin ürettiğiniz anahtar (en çok 128 karakter).",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 128
            },
            "example": "ornek-istek-0001"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ArticleCreate"
              },
              "example": {
                "topic": "Kurumsal web sitesi nasıl hazırlanır?",
                "keywords": [
                  "kurumsal web sitesi",
                  "web tasarım"
                ],
                "kind": "BLOG",
                "length": "MEDIUM"
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Başarılı yanıt.",
            "headers": {
              "X-SP-Public-Api-Version": {
                "description": "Yanıtı üreten hesap API sürümü.",
                "schema": {
                  "type": "string"
                },
                "example": "2026-10-31"
              },
              "Idempotent-Replayed": {
                "description": "Yanıt, aynı `Idempotency-Key` ile yapılmış önceki istekten geliyorsa `true`.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ArticleAccepted"
                },
                "example": {
                  "id": "cm4example000article00001",
                  "status": "QUEUED",
                  "cached": false
                }
              }
            }
          },
          "400": {
            "description": "`INTEGRATION_IDEMPOTENCY_KEY_INVALID`: `Idempotency-Key` boş ya da fazla uzun.\n\n`SP_API_BAD_REQUEST`: Gövde ya da sorgu parametresi geçersiz.\n\n`INVALID_MODEL`: İstenen model kullanılamıyor.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "INTEGRATION_IDEMPOTENCY_KEY_INVALID": {
                    "summary": "INTEGRATION_IDEMPOTENCY_KEY_INVALID",
                    "value": {
                      "success": false,
                      "error": "Idempotency-Key boş olamaz ve en çok 128 karakter olabilir.",
                      "code": "INTEGRATION_IDEMPOTENCY_KEY_INVALID"
                    }
                  },
                  "SP_API_BAD_REQUEST": {
                    "summary": "SP_API_BAD_REQUEST",
                    "value": {
                      "success": false,
                      "error": "Geçersiz istek.",
                      "code": "SP_API_BAD_REQUEST"
                    }
                  },
                  "INVALID_MODEL": {
                    "summary": "INVALID_MODEL",
                    "value": {
                      "success": false,
                      "error": "Bu model kullanılamıyor.",
                      "code": "INVALID_MODEL"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "`SP_API_NO_KEY`: Anahtar gönderilmedi.\n\n`SP_API_INVALID_KEY`: Anahtar geçersiz, iptal edilmiş ya da süresi dolmuş.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_NO_KEY": {
                    "summary": "SP_API_NO_KEY",
                    "value": {
                      "success": false,
                      "error": "API anahtarı gerekli. Anahtarı X-SP-Auth başlığıyla ya da Authorization: Bearer ile gönderin.",
                      "code": "SP_API_NO_KEY"
                    }
                  },
                  "SP_API_INVALID_KEY": {
                    "summary": "SP_API_INVALID_KEY",
                    "value": {
                      "success": false,
                      "error": "API anahtarı geçersiz.",
                      "code": "SP_API_INVALID_KEY"
                    }
                  }
                }
              }
            }
          },
          "402": {
            "description": "`AI_CREDITS`: Bakiye yetersiz.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "AI_CREDITS": {
                    "summary": "AI_CREDITS",
                    "value": {
                      "success": false,
                      "error": "Yetersiz kredi. Aylık AI hakkınız doldu; devam etmek için kredi yükleyin.",
                      "code": "AI_CREDITS",
                      "kurus": 2500,
                      "balanceKurus": 1000,
                      "shortfallKurus": 1500
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "`TOKEN_SCOPE_MISSING`: Hesap anahtarında gerekli izin yok.\n\n`ROLE_READ_ONLY`: Ekip rolünüz bu projede yalnız görüntülemeye izin veriyor.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "TOKEN_SCOPE_MISSING": {
                    "summary": "TOKEN_SCOPE_MISSING",
                    "value": {
                      "success": false,
                      "error": "Bu işlem için API anahtarında \"content:read\" izni açık değil.",
                      "code": "TOKEN_SCOPE_MISSING"
                    }
                  },
                  "ROLE_READ_ONLY": {
                    "summary": "ROLE_READ_ONLY",
                    "value": {
                      "success": false,
                      "error": "Bu rol yalnızca görüntüleme yetkisine sahiptir",
                      "code": "ROLE_READ_ONLY"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "`SP_API_NOT_FOUND`: Uç ya da proje bulunamadı veya erişiminiz yok.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_NOT_FOUND": {
                    "summary": "SP_API_NOT_FOUND",
                    "value": {
                      "success": false,
                      "error": "Uç bulunamadı.",
                      "code": "SP_API_NOT_FOUND"
                    }
                  }
                }
              }
            }
          },
          "409": {
            "description": "`INTEGRATION_IDEMPOTENCY_CONFLICT`: Aynı `Idempotency-Key` farklı gövdeyle kullanıldı.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "INTEGRATION_IDEMPOTENCY_CONFLICT": {
                    "summary": "INTEGRATION_IDEMPOTENCY_CONFLICT",
                    "value": {
                      "success": false,
                      "error": "Bu Idempotency-Key başka bir istekle kullanılmış.",
                      "code": "INTEGRATION_IDEMPOTENCY_CONFLICT"
                    }
                  }
                }
              }
            }
          },
          "413": {
            "description": "`SP_API_BODY_TOO_LARGE`: İstek gövdesi sınırı aştı.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_BODY_TOO_LARGE": {
                    "summary": "SP_API_BODY_TOO_LARGE",
                    "value": {
                      "success": false,
                      "error": "İstek gövdesi çok büyük (en fazla 256 KB).",
                      "code": "SP_API_BODY_TOO_LARGE"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "`DAILY_CAP`: Günlük üretim sınırına ulaşıldı.\n\n`SP_API_RATE_LIMITED`: Hız sınırı aşıldı; `Retry-After` kadar bekleyin.",
            "headers": {
              "Retry-After": {
                "description": "Yeniden denemeden önce beklenecek saniye.",
                "schema": {
                  "type": "integer"
                },
                "example": 60
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "DAILY_CAP": {
                    "summary": "DAILY_CAP",
                    "value": {
                      "success": false,
                      "error": "Günlük üretim sınırına ulaşıldı; yarın yeniden deneyin.",
                      "code": "DAILY_CAP"
                    }
                  },
                  "SP_API_RATE_LIMITED": {
                    "summary": "SP_API_RATE_LIMITED",
                    "value": {
                      "success": false,
                      "error": "Çok fazla istek. Biraz sonra tekrar dene.",
                      "code": "SP_API_RATE_LIMITED"
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "`SP_API_INTERNAL`: Beklenmeyen sunucu hatası.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_INTERNAL": {
                    "summary": "SP_API_INTERNAL",
                    "value": {
                      "success": false,
                      "error": "Beklenmeyen bir hata oluştu.",
                      "code": "SP_API_INTERNAL"
                    }
                  }
                }
              }
            }
          },
          "503": {
            "description": "`NOT_CONFIGURED`: Yapay zekâ hizmeti yapılandırılmamış.\n\n`PAUSED`: İçerik üretimi geçici olarak durduruldu.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "NOT_CONFIGURED": {
                    "summary": "NOT_CONFIGURED",
                    "value": {
                      "success": false,
                      "error": "AI özelliği henüz yapılandırılmadı.",
                      "code": "NOT_CONFIGURED"
                    }
                  },
                  "PAUSED": {
                    "summary": "PAUSED",
                    "value": {
                      "success": false,
                      "error": "Üretim geçici olarak durduruldu.",
                      "code": "PAUSED"
                    }
                  }
                }
              }
            }
          }
        },
        "x-scope": "content:write"
      }
    },
    "/api/public/v1/articles/{articleId}": {
      "get": {
        "operationId": "articleGet",
        "summary": "Yazıyı oku",
        "description": "Yazıyı metni, SEO alanları ve denetim sonuçlarıyla döner.\n\nGerekli izin: `content:read`.",
        "tags": [
          "Yazılar"
        ],
        "security": [
          {
            "AccountBearer": []
          },
          {
            "AccountHeader": []
          }
        ],
        "parameters": [
          {
            "name": "articleId",
            "in": "path",
            "required": true,
            "description": "Yazı kimliği.",
            "schema": {
              "type": "string"
            },
            "example": "cm4example000article00001"
          }
        ],
        "responses": {
          "200": {
            "description": "Başarılı yanıt.",
            "headers": {
              "X-SP-Public-Api-Version": {
                "description": "Yanıtı üreten hesap API sürümü.",
                "schema": {
                  "type": "string"
                },
                "example": "2026-10-31"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Article"
                },
                "example": {
                  "id": "cm4example000article00001",
                  "projectId": "cm4example000project00001",
                  "title": "Kurumsal Web Sitesi Nasıl Hazırlanır?",
                  "status": "GENERATED",
                  "kind": "BLOG",
                  "language": "tr",
                  "keywords": [
                    "kurumsal web sitesi"
                  ],
                  "slug": "kurumsal-web-sitesi-nasil-hazirlanir",
                  "excerpt": "Kurumsal site hazırlarken izlenecek adımlar.",
                  "metaTitle": "Kurumsal Web Sitesi Rehberi",
                  "metaDescription": "Kurumsal web sitesi hazırlarken izlenecek adımları öğrenin.",
                  "bodyHtml": "<h2>Planlama</h2><p>İlk adım hedefleri belirlemektir.</p>",
                  "wordCount": 840,
                  "externalUrl": null,
                  "publishedAt": null,
                  "createdAt": "2026-11-01T09:30:00.000Z",
                  "updatedAt": "2026-11-01T09:30:00.000Z",
                  "canEdit": true,
                  "live": null,
                  "checks": [
                    {
                      "id": "body",
                      "ok": true,
                      "level": "block",
                      "value": 840
                    }
                  ],
                  "blocking": []
                }
              }
            }
          },
          "401": {
            "description": "`SP_API_NO_KEY`: Anahtar gönderilmedi.\n\n`SP_API_INVALID_KEY`: Anahtar geçersiz, iptal edilmiş ya da süresi dolmuş.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_NO_KEY": {
                    "summary": "SP_API_NO_KEY",
                    "value": {
                      "success": false,
                      "error": "API anahtarı gerekli. Anahtarı X-SP-Auth başlığıyla ya da Authorization: Bearer ile gönderin.",
                      "code": "SP_API_NO_KEY"
                    }
                  },
                  "SP_API_INVALID_KEY": {
                    "summary": "SP_API_INVALID_KEY",
                    "value": {
                      "success": false,
                      "error": "API anahtarı geçersiz.",
                      "code": "SP_API_INVALID_KEY"
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "`TOKEN_SCOPE_MISSING`: Hesap anahtarında gerekli izin yok.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "TOKEN_SCOPE_MISSING": {
                    "summary": "TOKEN_SCOPE_MISSING",
                    "value": {
                      "success": false,
                      "error": "Bu işlem için API anahtarında \"content:read\" izni açık değil.",
                      "code": "TOKEN_SCOPE_MISSING"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "`NOT_FOUND`: Yazı bulunamadı ya da erişiminiz yok.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "NOT_FOUND": {
                    "summary": "NOT_FOUND",
                    "value": {
                      "success": false,
                      "error": "İçerik bulunamadı.",
                      "code": "NOT_FOUND"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "`SP_API_RATE_LIMITED`: Hız sınırı aşıldı; `Retry-After` kadar bekleyin.",
            "headers": {
              "Retry-After": {
                "description": "Yeniden denemeden önce beklenecek saniye.",
                "schema": {
                  "type": "integer"
                },
                "example": 60
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_RATE_LIMITED": {
                    "summary": "SP_API_RATE_LIMITED",
                    "value": {
                      "success": false,
                      "error": "Çok fazla istek. Biraz sonra tekrar dene.",
                      "code": "SP_API_RATE_LIMITED"
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "`SP_API_INTERNAL`: Beklenmeyen sunucu hatası.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_INTERNAL": {
                    "summary": "SP_API_INTERNAL",
                    "value": {
                      "success": false,
                      "error": "Beklenmeyen bir hata oluştu.",
                      "code": "SP_API_INTERNAL"
                    }
                  }
                }
              }
            }
          }
        },
        "x-scope": "content:read"
      },
      "patch": {
        "operationId": "articleUpdate",
        "summary": "Yazıyı düzenle",
        "description": "Taslak ya da üretilmiş yazıyı günceller. Yayındaki yazıda değişiklik siteye gitmez; göndermek için `sync` ucunu çağırın.\n\nGerekli izin: `content:write`.",
        "tags": [
          "Yazılar"
        ],
        "security": [
          {
            "AccountBearer": []
          },
          {
            "AccountHeader": []
          }
        ],
        "parameters": [
          {
            "name": "articleId",
            "in": "path",
            "required": true,
            "description": "Yazı kimliği.",
            "schema": {
              "type": "string"
            },
            "example": "cm4example000article00001"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ArticlePatch"
              },
              "example": {
                "title": "Kurumsal Web Sitesi Rehberi",
                "metaDescription": "Kurumsal web sitesi hazırlarken izlenecek adımları öğrenin."
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Başarılı yanıt.",
            "headers": {
              "X-SP-Public-Api-Version": {
                "description": "Yanıtı üreten hesap API sürümü.",
                "schema": {
                  "type": "string"
                },
                "example": "2026-10-31"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ArticlePatched"
                },
                "example": {
                  "id": "cm4example000article00001",
                  "status": "GENERATED",
                  "blocking": []
                }
              }
            }
          },
          "400": {
            "description": "`SP_API_BAD_REQUEST`: Gövde ya da sorgu parametresi geçersiz.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_BAD_REQUEST": {
                    "summary": "SP_API_BAD_REQUEST",
                    "value": {
                      "success": false,
                      "error": "Geçersiz istek.",
                      "code": "SP_API_BAD_REQUEST"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "`SP_API_NO_KEY`: Anahtar gönderilmedi.\n\n`SP_API_INVALID_KEY`: Anahtar geçersiz, iptal edilmiş ya da süresi dolmuş.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_NO_KEY": {
                    "summary": "SP_API_NO_KEY",
                    "value": {
                      "success": false,
                      "error": "API anahtarı gerekli. Anahtarı X-SP-Auth başlığıyla ya da Authorization: Bearer ile gönderin.",
                      "code": "SP_API_NO_KEY"
                    }
                  },
                  "SP_API_INVALID_KEY": {
                    "summary": "SP_API_INVALID_KEY",
                    "value": {
                      "success": false,
                      "error": "API anahtarı geçersiz.",
                      "code": "SP_API_INVALID_KEY"
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "`TOKEN_SCOPE_MISSING`: Hesap anahtarında gerekli izin yok.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "TOKEN_SCOPE_MISSING": {
                    "summary": "TOKEN_SCOPE_MISSING",
                    "value": {
                      "success": false,
                      "error": "Bu işlem için API anahtarında \"content:read\" izni açık değil.",
                      "code": "TOKEN_SCOPE_MISSING"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "`NOT_FOUND`: Yazı bulunamadı ya da erişiminiz yok.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "NOT_FOUND": {
                    "summary": "NOT_FOUND",
                    "value": {
                      "success": false,
                      "error": "İçerik bulunamadı.",
                      "code": "NOT_FOUND"
                    }
                  }
                }
              }
            }
          },
          "409": {
            "description": "`INVALID_STATE`: Yazının bu durumunda işlem yapılamaz.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "INVALID_STATE": {
                    "summary": "INVALID_STATE",
                    "value": {
                      "success": false,
                      "error": "İçeriğin bu durumunda bu işlem yapılamaz.",
                      "code": "INVALID_STATE"
                    }
                  }
                }
              }
            }
          },
          "413": {
            "description": "`SP_API_BODY_TOO_LARGE`: İstek gövdesi sınırı aştı.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_BODY_TOO_LARGE": {
                    "summary": "SP_API_BODY_TOO_LARGE",
                    "value": {
                      "success": false,
                      "error": "İstek gövdesi çok büyük (en fazla 256 KB).",
                      "code": "SP_API_BODY_TOO_LARGE"
                    }
                  }
                }
              }
            }
          },
          "422": {
            "description": "`CHECKS_FAILED`: Zorunlu içerik denetimleri geçmedi; `blocking` alanına bakın.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "CHECKS_FAILED": {
                    "summary": "CHECKS_FAILED",
                    "value": {
                      "success": false,
                      "error": "Zorunlu kontroller geçmediği için içerik onaylanamaz.",
                      "code": "CHECKS_FAILED",
                      "blocking": [
                        "body"
                      ]
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "`SP_API_RATE_LIMITED`: Hız sınırı aşıldı; `Retry-After` kadar bekleyin.",
            "headers": {
              "Retry-After": {
                "description": "Yeniden denemeden önce beklenecek saniye.",
                "schema": {
                  "type": "integer"
                },
                "example": 60
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_RATE_LIMITED": {
                    "summary": "SP_API_RATE_LIMITED",
                    "value": {
                      "success": false,
                      "error": "Çok fazla istek. Biraz sonra tekrar dene.",
                      "code": "SP_API_RATE_LIMITED"
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "`SP_API_INTERNAL`: Beklenmeyen sunucu hatası.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_INTERNAL": {
                    "summary": "SP_API_INTERNAL",
                    "value": {
                      "success": false,
                      "error": "Beklenmeyen bir hata oluştu.",
                      "code": "SP_API_INTERNAL"
                    }
                  }
                }
              }
            }
          }
        },
        "x-scope": "content:write"
      }
    },
    "/api/public/v1/articles/{articleId}/publish": {
      "post": {
        "operationId": "articlePublish",
        "summary": "Yazıyı yayınla",
        "description": "Yazıyı projenin bağlı kanalına taslak ya da yayın olarak gönderir. Engelleyen denetimi olan yazı gönderilmez (422 `CHECKS_FAILED`). Sonuç `state` alanındadır.\n\nGerekli izin: `content:publish`.",
        "tags": [
          "Yazılar"
        ],
        "security": [
          {
            "AccountBearer": []
          },
          {
            "AccountHeader": []
          }
        ],
        "parameters": [
          {
            "name": "articleId",
            "in": "path",
            "required": true,
            "description": "Yazı kimliği.",
            "schema": {
              "type": "string"
            },
            "example": "cm4example000article00001"
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "Bu isteği tekilleştiren, sizin ürettiğiniz anahtar (en çok 128 karakter).",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 128
            },
            "example": "ornek-istek-0001"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ArticlePublish"
              },
              "example": {
                "publishMode": "PUBLISH",
                "categoryId": "12"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Başarılı yanıt.",
            "headers": {
              "X-SP-Public-Api-Version": {
                "description": "Yanıtı üreten hesap API sürümü.",
                "schema": {
                  "type": "string"
                },
                "example": "2026-10-31"
              },
              "Idempotent-Replayed": {
                "description": "Yanıt, aynı `Idempotency-Key` ile yapılmış önceki istekten geliyorsa `true`.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublishResult"
                },
                "example": {
                  "state": "publishing",
                  "channel": "WP_PLUGIN"
                }
              }
            }
          },
          "400": {
            "description": "`INTEGRATION_IDEMPOTENCY_KEY_INVALID`: `Idempotency-Key` boş ya da fazla uzun.\n\n`SP_API_BAD_REQUEST`: Gövde ya da sorgu parametresi geçersiz.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "INTEGRATION_IDEMPOTENCY_KEY_INVALID": {
                    "summary": "INTEGRATION_IDEMPOTENCY_KEY_INVALID",
                    "value": {
                      "success": false,
                      "error": "Idempotency-Key boş olamaz ve en çok 128 karakter olabilir.",
                      "code": "INTEGRATION_IDEMPOTENCY_KEY_INVALID"
                    }
                  },
                  "SP_API_BAD_REQUEST": {
                    "summary": "SP_API_BAD_REQUEST",
                    "value": {
                      "success": false,
                      "error": "Geçersiz istek.",
                      "code": "SP_API_BAD_REQUEST"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "`SP_API_NO_KEY`: Anahtar gönderilmedi.\n\n`SP_API_INVALID_KEY`: Anahtar geçersiz, iptal edilmiş ya da süresi dolmuş.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_NO_KEY": {
                    "summary": "SP_API_NO_KEY",
                    "value": {
                      "success": false,
                      "error": "API anahtarı gerekli. Anahtarı X-SP-Auth başlığıyla ya da Authorization: Bearer ile gönderin.",
                      "code": "SP_API_NO_KEY"
                    }
                  },
                  "SP_API_INVALID_KEY": {
                    "summary": "SP_API_INVALID_KEY",
                    "value": {
                      "success": false,
                      "error": "API anahtarı geçersiz.",
                      "code": "SP_API_INVALID_KEY"
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "`TOKEN_SCOPE_MISSING`: Hesap anahtarında gerekli izin yok.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "TOKEN_SCOPE_MISSING": {
                    "summary": "TOKEN_SCOPE_MISSING",
                    "value": {
                      "success": false,
                      "error": "Bu işlem için API anahtarında \"content:read\" izni açık değil.",
                      "code": "TOKEN_SCOPE_MISSING"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "`NOT_FOUND`: Yazı bulunamadı ya da erişiminiz yok.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "NOT_FOUND": {
                    "summary": "NOT_FOUND",
                    "value": {
                      "success": false,
                      "error": "İçerik bulunamadı.",
                      "code": "NOT_FOUND"
                    }
                  }
                }
              }
            }
          },
          "409": {
            "description": "`INTEGRATION_IDEMPOTENCY_CONFLICT`: Aynı `Idempotency-Key` farklı gövdeyle kullanıldı.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "INTEGRATION_IDEMPOTENCY_CONFLICT": {
                    "summary": "INTEGRATION_IDEMPOTENCY_CONFLICT",
                    "value": {
                      "success": false,
                      "error": "Bu Idempotency-Key başka bir istekle kullanılmış.",
                      "code": "INTEGRATION_IDEMPOTENCY_CONFLICT"
                    }
                  }
                }
              }
            }
          },
          "413": {
            "description": "`SP_API_BODY_TOO_LARGE`: İstek gövdesi sınırı aştı.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_BODY_TOO_LARGE": {
                    "summary": "SP_API_BODY_TOO_LARGE",
                    "value": {
                      "success": false,
                      "error": "İstek gövdesi çok büyük (en fazla 256 KB).",
                      "code": "SP_API_BODY_TOO_LARGE"
                    }
                  }
                }
              }
            }
          },
          "422": {
            "description": "`CHECKS_FAILED`: Zorunlu içerik denetimleri geçmedi; `blocking` alanına bakın.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "CHECKS_FAILED": {
                    "summary": "CHECKS_FAILED",
                    "value": {
                      "success": false,
                      "error": "Zorunlu kontroller geçmediği için içerik onaylanamaz.",
                      "code": "CHECKS_FAILED",
                      "blocking": [
                        "body"
                      ]
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "`SP_API_RATE_LIMITED`: Hız sınırı aşıldı; `Retry-After` kadar bekleyin.",
            "headers": {
              "Retry-After": {
                "description": "Yeniden denemeden önce beklenecek saniye.",
                "schema": {
                  "type": "integer"
                },
                "example": 60
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_RATE_LIMITED": {
                    "summary": "SP_API_RATE_LIMITED",
                    "value": {
                      "success": false,
                      "error": "Çok fazla istek. Biraz sonra tekrar dene.",
                      "code": "SP_API_RATE_LIMITED"
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "`SP_API_INTERNAL`: Beklenmeyen sunucu hatası.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_INTERNAL": {
                    "summary": "SP_API_INTERNAL",
                    "value": {
                      "success": false,
                      "error": "Beklenmeyen bir hata oluştu.",
                      "code": "SP_API_INTERNAL"
                    }
                  }
                }
              }
            }
          }
        },
        "x-scope": "content:publish"
      }
    },
    "/api/public/v1/articles/{articleId}/sync": {
      "post": {
        "operationId": "articleSync",
        "summary": "Yayındaki yazıyı güncelle",
        "description": "Yayındaki yazıda yapılan düzenlemeyi siteye gönderir. Bekleyen değişiklik yoksa mevcut durum döner.\n\nGerekli izin: `content:publish`.",
        "tags": [
          "Yazılar"
        ],
        "security": [
          {
            "AccountBearer": []
          },
          {
            "AccountHeader": []
          }
        ],
        "parameters": [
          {
            "name": "articleId",
            "in": "path",
            "required": true,
            "description": "Yazı kimliği.",
            "schema": {
              "type": "string"
            },
            "example": "cm4example000article00001"
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "Bu isteği tekilleştiren, sizin ürettiğiniz anahtar (en çok 128 karakter).",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 128
            },
            "example": "ornek-istek-0001"
          }
        ],
        "responses": {
          "200": {
            "description": "Başarılı yanıt.",
            "headers": {
              "X-SP-Public-Api-Version": {
                "description": "Yanıtı üreten hesap API sürümü.",
                "schema": {
                  "type": "string"
                },
                "example": "2026-10-31"
              },
              "Idempotent-Replayed": {
                "description": "Yanıt, aynı `Idempotency-Key` ile yapılmış önceki istekten geliyorsa `true`.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LiveEditView"
                },
                "example": {
                  "editable": true,
                  "channel": "WP_PLUGIN",
                  "state": "synced",
                  "at": "2026-11-01T09:30:00.000Z",
                  "failKey": null,
                  "canDiscard": false
                }
              }
            }
          },
          "400": {
            "description": "`INTEGRATION_IDEMPOTENCY_KEY_INVALID`: `Idempotency-Key` boş ya da fazla uzun.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "INTEGRATION_IDEMPOTENCY_KEY_INVALID": {
                    "summary": "INTEGRATION_IDEMPOTENCY_KEY_INVALID",
                    "value": {
                      "success": false,
                      "error": "Idempotency-Key boş olamaz ve en çok 128 karakter olabilir.",
                      "code": "INTEGRATION_IDEMPOTENCY_KEY_INVALID"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "`SP_API_NO_KEY`: Anahtar gönderilmedi.\n\n`SP_API_INVALID_KEY`: Anahtar geçersiz, iptal edilmiş ya da süresi dolmuş.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_NO_KEY": {
                    "summary": "SP_API_NO_KEY",
                    "value": {
                      "success": false,
                      "error": "API anahtarı gerekli. Anahtarı X-SP-Auth başlığıyla ya da Authorization: Bearer ile gönderin.",
                      "code": "SP_API_NO_KEY"
                    }
                  },
                  "SP_API_INVALID_KEY": {
                    "summary": "SP_API_INVALID_KEY",
                    "value": {
                      "success": false,
                      "error": "API anahtarı geçersiz.",
                      "code": "SP_API_INVALID_KEY"
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "`TOKEN_SCOPE_MISSING`: Hesap anahtarında gerekli izin yok.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "TOKEN_SCOPE_MISSING": {
                    "summary": "TOKEN_SCOPE_MISSING",
                    "value": {
                      "success": false,
                      "error": "Bu işlem için API anahtarında \"content:read\" izni açık değil.",
                      "code": "TOKEN_SCOPE_MISSING"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "`NOT_FOUND`: Yazı bulunamadı ya da erişiminiz yok.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "NOT_FOUND": {
                    "summary": "NOT_FOUND",
                    "value": {
                      "success": false,
                      "error": "İçerik bulunamadı.",
                      "code": "NOT_FOUND"
                    }
                  }
                }
              }
            }
          },
          "409": {
            "description": "`INTEGRATION_IDEMPOTENCY_CONFLICT`: Aynı `Idempotency-Key` farklı gövdeyle kullanıldı.\n\n`INVALID_STATE`: Yazının bu durumunda işlem yapılamaz.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "INTEGRATION_IDEMPOTENCY_CONFLICT": {
                    "summary": "INTEGRATION_IDEMPOTENCY_CONFLICT",
                    "value": {
                      "success": false,
                      "error": "Bu Idempotency-Key başka bir istekle kullanılmış.",
                      "code": "INTEGRATION_IDEMPOTENCY_CONFLICT"
                    }
                  },
                  "INVALID_STATE": {
                    "summary": "INVALID_STATE",
                    "value": {
                      "success": false,
                      "error": "İçeriğin bu durumunda bu işlem yapılamaz.",
                      "code": "INVALID_STATE"
                    }
                  }
                }
              }
            }
          },
          "413": {
            "description": "`SP_API_BODY_TOO_LARGE`: İstek gövdesi sınırı aştı.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_BODY_TOO_LARGE": {
                    "summary": "SP_API_BODY_TOO_LARGE",
                    "value": {
                      "success": false,
                      "error": "İstek gövdesi çok büyük (en fazla 256 KB).",
                      "code": "SP_API_BODY_TOO_LARGE"
                    }
                  }
                }
              }
            }
          },
          "422": {
            "description": "`CHECKS_FAILED`: Zorunlu içerik denetimleri geçmedi; `blocking` alanına bakın.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "CHECKS_FAILED": {
                    "summary": "CHECKS_FAILED",
                    "value": {
                      "success": false,
                      "error": "Zorunlu kontroller geçmediği için içerik onaylanamaz.",
                      "code": "CHECKS_FAILED",
                      "blocking": [
                        "body"
                      ]
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "`SP_API_RATE_LIMITED`: Hız sınırı aşıldı; `Retry-After` kadar bekleyin.",
            "headers": {
              "Retry-After": {
                "description": "Yeniden denemeden önce beklenecek saniye.",
                "schema": {
                  "type": "integer"
                },
                "example": 60
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_RATE_LIMITED": {
                    "summary": "SP_API_RATE_LIMITED",
                    "value": {
                      "success": false,
                      "error": "Çok fazla istek. Biraz sonra tekrar dene.",
                      "code": "SP_API_RATE_LIMITED"
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "`SP_API_INTERNAL`: Beklenmeyen sunucu hatası.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_INTERNAL": {
                    "summary": "SP_API_INTERNAL",
                    "value": {
                      "success": false,
                      "error": "Beklenmeyen bir hata oluştu.",
                      "code": "SP_API_INTERNAL"
                    }
                  }
                }
              }
            }
          }
        },
        "x-scope": "content:publish"
      }
    },
    "/api/public/v1/projects/{projectId}/report": {
      "get": {
        "operationId": "projectReport",
        "summary": "Proje raporunu oku",
        "description": "Son 30 günün duruma göre yazı sayılarını, harcanan krediyi ve bu ayın blog planını döner.\n\nGerekli izin: `reports:read`.",
        "tags": [
          "Raporlar"
        ],
        "security": [
          {
            "AccountBearer": []
          },
          {
            "AccountHeader": []
          }
        ],
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "description": "Proje kimliği. `GET /api/public/v1/projects` ile alınır.",
            "schema": {
              "type": "string"
            },
            "example": "cm4example000project00001"
          }
        ],
        "responses": {
          "200": {
            "description": "Başarılı yanıt.",
            "headers": {
              "X-SP-Public-Api-Version": {
                "description": "Yanıtı üreten hesap API sürümü.",
                "schema": {
                  "type": "string"
                },
                "example": "2026-10-31"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProjectReport"
                },
                "example": {
                  "days": 30,
                  "byStatus": {
                    "PUBLISHED": 8,
                    "DRAFT": 2
                  },
                  "creditKurus": 42000,
                  "blogPlan": {
                    "month": "2026-11",
                    "planned": 12,
                    "done": 4,
                    "waiting": 7,
                    "review": 1,
                    "failed": 0,
                    "skipped": 0,
                    "left": 8
                  }
                }
              }
            }
          },
          "401": {
            "description": "`SP_API_NO_KEY`: Anahtar gönderilmedi.\n\n`SP_API_INVALID_KEY`: Anahtar geçersiz, iptal edilmiş ya da süresi dolmuş.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_NO_KEY": {
                    "summary": "SP_API_NO_KEY",
                    "value": {
                      "success": false,
                      "error": "API anahtarı gerekli. Anahtarı X-SP-Auth başlığıyla ya da Authorization: Bearer ile gönderin.",
                      "code": "SP_API_NO_KEY"
                    }
                  },
                  "SP_API_INVALID_KEY": {
                    "summary": "SP_API_INVALID_KEY",
                    "value": {
                      "success": false,
                      "error": "API anahtarı geçersiz.",
                      "code": "SP_API_INVALID_KEY"
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "`TOKEN_SCOPE_MISSING`: Hesap anahtarında gerekli izin yok.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "TOKEN_SCOPE_MISSING": {
                    "summary": "TOKEN_SCOPE_MISSING",
                    "value": {
                      "success": false,
                      "error": "Bu işlem için API anahtarında \"content:read\" izni açık değil.",
                      "code": "TOKEN_SCOPE_MISSING"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "`SP_API_NOT_FOUND`: Uç ya da proje bulunamadı veya erişiminiz yok.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_NOT_FOUND": {
                    "summary": "SP_API_NOT_FOUND",
                    "value": {
                      "success": false,
                      "error": "Uç bulunamadı.",
                      "code": "SP_API_NOT_FOUND"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "`SP_API_RATE_LIMITED`: Hız sınırı aşıldı; `Retry-After` kadar bekleyin.",
            "headers": {
              "Retry-After": {
                "description": "Yeniden denemeden önce beklenecek saniye.",
                "schema": {
                  "type": "integer"
                },
                "example": 60
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_RATE_LIMITED": {
                    "summary": "SP_API_RATE_LIMITED",
                    "value": {
                      "success": false,
                      "error": "Çok fazla istek. Biraz sonra tekrar dene.",
                      "code": "SP_API_RATE_LIMITED"
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "`SP_API_INTERNAL`: Beklenmeyen sunucu hatası.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "SP_API_INTERNAL": {
                    "summary": "SP_API_INTERNAL",
                    "value": {
                      "success": false,
                      "error": "Beklenmeyen bir hata oluştu.",
                      "code": "SP_API_INTERNAL"
                    }
                  }
                }
              }
            }
          }
        },
        "x-scope": "reports:read"
      }
    }
  },
  "webhooks": {
    "fix.ready": {
      "post": {
        "operationId": "event_fix_ready",
        "tags": [
          "Webhook Olayları"
        ],
        "summary": "Düzeltme hazır",
        "description": "Yeni düzeltme çekilmeye hazır olduğunda gönderilir. Abone olurken `mutations.updated` takma adı da kabul edilir; gönderimde olay adı `fix.ready` olur.",
        "security": [],
        "parameters": [
          {
            "name": "X-SP-Signature",
            "in": "header",
            "required": true,
            "description": "Olay imzası",
            "schema": {
              "type": "string"
            },
            "example": "t=1793525400,v1=0000000000000000000000000000000000000000000000000000000000000000"
          },
          {
            "name": "X-SP-Event",
            "in": "header",
            "required": true,
            "description": "Olay adı.",
            "schema": {
              "type": "string"
            },
            "example": "fix.ready"
          },
          {
            "name": "X-SP-Event-Id",
            "in": "header",
            "required": true,
            "description": "Olay kimliği.",
            "schema": {
              "type": "string"
            },
            "example": "evt_ornek000000000001"
          },
          {
            "name": "X-SP-Delivery",
            "in": "header",
            "required": true,
            "description": "Olay kimliği.",
            "schema": {
              "type": "string"
            },
            "example": "cm4example000delivery0001"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/EventEnvelope"
              },
              "example": {
                "id": "evt_ornek000000000001",
                "type": "fix.ready",
                "occurredAt": "2026-11-01T09:30:00.000Z",
                "projectId": "cm4example000project00001",
                "data": {
                  "fixId": "cm4example000fix000000001",
                  "pageUrl": "https://example.com/hizmetler",
                  "ruleCount": 2
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Olay alındı. 2xx dışındaki yanıtlarda teslim yeniden denenir."
          }
        }
      }
    },
    "form.submission.created": {
      "post": {
        "operationId": "event_form_submission_created",
        "tags": [
          "Webhook Olayları"
        ],
        "summary": "Form dolduruldu",
        "description": "Sitedeki bir forma yeni kayıt geldiğinde gönderilir. Form modülü gerekir.",
        "security": [],
        "parameters": [
          {
            "name": "X-SP-Signature",
            "in": "header",
            "required": true,
            "description": "Olay imzası",
            "schema": {
              "type": "string"
            },
            "example": "t=1793525400,v1=0000000000000000000000000000000000000000000000000000000000000000"
          },
          {
            "name": "X-SP-Event",
            "in": "header",
            "required": true,
            "description": "Olay adı.",
            "schema": {
              "type": "string"
            },
            "example": "form.submission.created"
          },
          {
            "name": "X-SP-Event-Id",
            "in": "header",
            "required": true,
            "description": "Olay kimliği.",
            "schema": {
              "type": "string"
            },
            "example": "evt_ornek000000000001"
          },
          {
            "name": "X-SP-Delivery",
            "in": "header",
            "required": true,
            "description": "Olay kimliği.",
            "schema": {
              "type": "string"
            },
            "example": "cm4example000delivery0001"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/EventEnvelope"
              },
              "example": {
                "id": "evt_ornek000000000001",
                "type": "form.submission.created",
                "occurredAt": "2026-11-01T09:30:00.000Z",
                "projectId": "cm4example000project00001",
                "data": {
                  "id": "cm4example000form00000001",
                  "createdAt": "2026-11-01T09:30:00.000Z",
                  "status": "new",
                  "site": "example.com",
                  "form": {
                    "id": "frm_ornek",
                    "name": "İletişim Formu"
                  },
                  "contact": {
                    "name": "Ayşe Yılmaz",
                    "email": "ayse@example.com",
                    "phone": null
                  },
                  "answers": [
                    {
                      "fieldId": "mesaj",
                      "label": "Mesajınız",
                      "type": "textarea",
                      "value": "Teklif almak istiyorum."
                    }
                  ],
                  "fields": {
                    "Mesajınız": "Teklif almak istiyorum."
                  },
                  "page": {
                    "url": "https://example.com/hizmetler",
                    "referrer": null
                  },
                  "attribution": {}
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Olay alındı. 2xx dışındaki yanıtlarda teslim yeniden denenir."
          }
        }
      }
    },
    "chat.conversation.started": {
      "post": {
        "operationId": "event_chat_conversation_started",
        "tags": [
          "Webhook Olayları"
        ],
        "summary": "Sohbet başladı",
        "description": "Ziyaretçi yeni sohbet başlattığında gönderilir. Sohbet modülü gerekir.",
        "security": [],
        "parameters": [
          {
            "name": "X-SP-Signature",
            "in": "header",
            "required": true,
            "description": "Olay imzası",
            "schema": {
              "type": "string"
            },
            "example": "t=1793525400,v1=0000000000000000000000000000000000000000000000000000000000000000"
          },
          {
            "name": "X-SP-Event",
            "in": "header",
            "required": true,
            "description": "Olay adı.",
            "schema": {
              "type": "string"
            },
            "example": "chat.conversation.started"
          },
          {
            "name": "X-SP-Event-Id",
            "in": "header",
            "required": true,
            "description": "Olay kimliği.",
            "schema": {
              "type": "string"
            },
            "example": "evt_ornek000000000001"
          },
          {
            "name": "X-SP-Delivery",
            "in": "header",
            "required": true,
            "description": "Olay kimliği.",
            "schema": {
              "type": "string"
            },
            "example": "cm4example000delivery0001"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/EventEnvelope"
              },
              "example": {
                "id": "evt_ornek000000000001",
                "type": "chat.conversation.started",
                "occurredAt": "2026-11-01T09:30:00.000Z",
                "projectId": "cm4example000project00001",
                "data": {
                  "conversation": {
                    "id": "cm4example000chat00000001",
                    "source": "chat",
                    "channel": "website",
                    "state": "bot",
                    "assignedName": null,
                    "contact": {
                      "name": "Ayşe Yılmaz",
                      "email": "ayse@example.com",
                      "phone": null
                    },
                    "fields": [],
                    "language": "tr",
                    "page": {
                      "url": "https://example.com/hizmetler",
                      "firstUrl": "https://example.com/hizmetler",
                      "referrer": null
                    },
                    "country": "TR",
                    "tags": [],
                    "createdAt": "2026-11-01T09:30:00.000Z",
                    "lastMessageAt": "2026-11-01T09:30:00.000Z"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Olay alındı. 2xx dışındaki yanıtlarda teslim yeniden denenir."
          }
        }
      }
    },
    "chat.lead.captured": {
      "post": {
        "operationId": "event_chat_lead_captured",
        "tags": [
          "Webhook Olayları"
        ],
        "summary": "Sohbetten aday geldi",
        "description": "Sohbette iletişim bilgisi alındığında gönderilir. Sohbet modülü gerekir.",
        "security": [],
        "parameters": [
          {
            "name": "X-SP-Signature",
            "in": "header",
            "required": true,
            "description": "Olay imzası",
            "schema": {
              "type": "string"
            },
            "example": "t=1793525400,v1=0000000000000000000000000000000000000000000000000000000000000000"
          },
          {
            "name": "X-SP-Event",
            "in": "header",
            "required": true,
            "description": "Olay adı.",
            "schema": {
              "type": "string"
            },
            "example": "chat.lead.captured"
          },
          {
            "name": "X-SP-Event-Id",
            "in": "header",
            "required": true,
            "description": "Olay kimliği.",
            "schema": {
              "type": "string"
            },
            "example": "evt_ornek000000000001"
          },
          {
            "name": "X-SP-Delivery",
            "in": "header",
            "required": true,
            "description": "Olay kimliği.",
            "schema": {
              "type": "string"
            },
            "example": "cm4example000delivery0001"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/EventEnvelope"
              },
              "example": {
                "id": "evt_ornek000000000001",
                "type": "chat.lead.captured",
                "occurredAt": "2026-11-01T09:30:00.000Z",
                "projectId": "cm4example000project00001",
                "data": {
                  "conversation": {
                    "id": "cm4example000chat00000001",
                    "source": "chat",
                    "channel": "website",
                    "state": "bot",
                    "assignedName": null,
                    "contact": {
                      "name": "Ayşe Yılmaz",
                      "email": "ayse@example.com",
                      "phone": null
                    },
                    "fields": [],
                    "language": "tr",
                    "page": {
                      "url": "https://example.com/hizmetler",
                      "firstUrl": "https://example.com/hizmetler",
                      "referrer": null
                    },
                    "country": "TR",
                    "tags": [],
                    "createdAt": "2026-11-01T09:30:00.000Z",
                    "lastMessageAt": "2026-11-01T09:30:00.000Z"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Olay alındı. 2xx dışındaki yanıtlarda teslim yeniden denenir."
          }
        }
      }
    },
    "chat.handoff.requested": {
      "post": {
        "operationId": "event_chat_handoff_requested",
        "tags": [
          "Webhook Olayları"
        ],
        "summary": "Canlı destek istendi",
        "description": "Sohbet bir temsilciye devredilmek istendiğinde gönderilir. Sohbet modülü gerekir.",
        "security": [],
        "parameters": [
          {
            "name": "X-SP-Signature",
            "in": "header",
            "required": true,
            "description": "Olay imzası",
            "schema": {
              "type": "string"
            },
            "example": "t=1793525400,v1=0000000000000000000000000000000000000000000000000000000000000000"
          },
          {
            "name": "X-SP-Event",
            "in": "header",
            "required": true,
            "description": "Olay adı.",
            "schema": {
              "type": "string"
            },
            "example": "chat.handoff.requested"
          },
          {
            "name": "X-SP-Event-Id",
            "in": "header",
            "required": true,
            "description": "Olay kimliği.",
            "schema": {
              "type": "string"
            },
            "example": "evt_ornek000000000001"
          },
          {
            "name": "X-SP-Delivery",
            "in": "header",
            "required": true,
            "description": "Olay kimliği.",
            "schema": {
              "type": "string"
            },
            "example": "cm4example000delivery0001"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/EventEnvelope"
              },
              "example": {
                "id": "evt_ornek000000000001",
                "type": "chat.handoff.requested",
                "occurredAt": "2026-11-01T09:30:00.000Z",
                "projectId": "cm4example000project00001",
                "data": {
                  "conversation": {
                    "id": "cm4example000chat00000001",
                    "source": "chat",
                    "channel": "website",
                    "state": "bot",
                    "assignedName": null,
                    "contact": {
                      "name": "Ayşe Yılmaz",
                      "email": "ayse@example.com",
                      "phone": null
                    },
                    "fields": [],
                    "language": "tr",
                    "page": {
                      "url": "https://example.com/hizmetler",
                      "firstUrl": "https://example.com/hizmetler",
                      "referrer": null
                    },
                    "country": "TR",
                    "tags": [],
                    "createdAt": "2026-11-01T09:30:00.000Z",
                    "lastMessageAt": "2026-11-01T09:30:00.000Z"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Olay alındı. 2xx dışındaki yanıtlarda teslim yeniden denenir."
          }
        }
      }
    },
    "chat.message.created": {
      "post": {
        "operationId": "event_chat_message_created",
        "tags": [
          "Webhook Olayları"
        ],
        "summary": "Sohbet mesajı",
        "description": "Sohbete yeni mesaj eklendiğinde gönderilir. Sohbet modülü gerekir.",
        "security": [],
        "parameters": [
          {
            "name": "X-SP-Signature",
            "in": "header",
            "required": true,
            "description": "Olay imzası",
            "schema": {
              "type": "string"
            },
            "example": "t=1793525400,v1=0000000000000000000000000000000000000000000000000000000000000000"
          },
          {
            "name": "X-SP-Event",
            "in": "header",
            "required": true,
            "description": "Olay adı.",
            "schema": {
              "type": "string"
            },
            "example": "chat.message.created"
          },
          {
            "name": "X-SP-Event-Id",
            "in": "header",
            "required": true,
            "description": "Olay kimliği.",
            "schema": {
              "type": "string"
            },
            "example": "evt_ornek000000000001"
          },
          {
            "name": "X-SP-Delivery",
            "in": "header",
            "required": true,
            "description": "Olay kimliği.",
            "schema": {
              "type": "string"
            },
            "example": "cm4example000delivery0001"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/EventEnvelope"
              },
              "example": {
                "id": "evt_ornek000000000001",
                "type": "chat.message.created",
                "occurredAt": "2026-11-01T09:30:00.000Z",
                "projectId": "cm4example000project00001",
                "data": {
                  "conversation": {
                    "id": "cm4example000chat00000001",
                    "source": "chat",
                    "channel": "website",
                    "state": "bot",
                    "assignedName": null,
                    "contact": {
                      "name": "Ayşe Yılmaz",
                      "email": "ayse@example.com",
                      "phone": null
                    },
                    "fields": [],
                    "language": "tr",
                    "page": {
                      "url": "https://example.com/hizmetler",
                      "firstUrl": "https://example.com/hizmetler",
                      "referrer": null
                    },
                    "country": "TR",
                    "tags": [],
                    "createdAt": "2026-11-01T09:30:00.000Z",
                    "lastMessageAt": "2026-11-01T09:30:00.000Z"
                  },
                  "message": {
                    "author": "visitor",
                    "text": "Fiyat bilgisi alabilir miyim?",
                    "authorName": null,
                    "via": null,
                    "media": null,
                    "attachment": null,
                    "createdAt": "2026-11-01T09:30:00.000Z"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Olay alındı. 2xx dışındaki yanıtlarda teslim yeniden denenir."
          }
        }
      }
    },
    "chat.conversation.closed": {
      "post": {
        "operationId": "event_chat_conversation_closed",
        "tags": [
          "Webhook Olayları"
        ],
        "summary": "Sohbet kapandı",
        "description": "Sohbet kapatıldığında gönderilir. Sohbet modülü gerekir.",
        "security": [],
        "parameters": [
          {
            "name": "X-SP-Signature",
            "in": "header",
            "required": true,
            "description": "Olay imzası",
            "schema": {
              "type": "string"
            },
            "example": "t=1793525400,v1=0000000000000000000000000000000000000000000000000000000000000000"
          },
          {
            "name": "X-SP-Event",
            "in": "header",
            "required": true,
            "description": "Olay adı.",
            "schema": {
              "type": "string"
            },
            "example": "chat.conversation.closed"
          },
          {
            "name": "X-SP-Event-Id",
            "in": "header",
            "required": true,
            "description": "Olay kimliği.",
            "schema": {
              "type": "string"
            },
            "example": "evt_ornek000000000001"
          },
          {
            "name": "X-SP-Delivery",
            "in": "header",
            "required": true,
            "description": "Olay kimliği.",
            "schema": {
              "type": "string"
            },
            "example": "cm4example000delivery0001"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/EventEnvelope"
              },
              "example": {
                "id": "evt_ornek000000000001",
                "type": "chat.conversation.closed",
                "occurredAt": "2026-11-01T09:30:00.000Z",
                "projectId": "cm4example000project00001",
                "data": {
                  "conversation": {
                    "id": "cm4example000chat00000001",
                    "source": "chat",
                    "channel": "website",
                    "state": "bot",
                    "assignedName": null,
                    "contact": {
                      "name": "Ayşe Yılmaz",
                      "email": "ayse@example.com",
                      "phone": null
                    },
                    "fields": [],
                    "language": "tr",
                    "page": {
                      "url": "https://example.com/hizmetler",
                      "firstUrl": "https://example.com/hizmetler",
                      "referrer": null
                    },
                    "country": "TR",
                    "tags": [],
                    "createdAt": "2026-11-01T09:30:00.000Z",
                    "lastMessageAt": "2026-11-01T09:30:00.000Z"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Olay alındı. 2xx dışındaki yanıtlarda teslim yeniden denenir."
          }
        }
      }
    },
    "booking.appointment.created": {
      "post": {
        "operationId": "event_booking_appointment_created",
        "tags": [
          "Webhook Olayları"
        ],
        "summary": "Randevu oluşturuldu",
        "description": "Yeni randevu açıldığında gönderilir. Randevu modülü gerekir.",
        "security": [],
        "parameters": [
          {
            "name": "X-SP-Signature",
            "in": "header",
            "required": true,
            "description": "Olay imzası",
            "schema": {
              "type": "string"
            },
            "example": "t=1793525400,v1=0000000000000000000000000000000000000000000000000000000000000000"
          },
          {
            "name": "X-SP-Event",
            "in": "header",
            "required": true,
            "description": "Olay adı.",
            "schema": {
              "type": "string"
            },
            "example": "booking.appointment.created"
          },
          {
            "name": "X-SP-Event-Id",
            "in": "header",
            "required": true,
            "description": "Olay kimliği.",
            "schema": {
              "type": "string"
            },
            "example": "evt_ornek000000000001"
          },
          {
            "name": "X-SP-Delivery",
            "in": "header",
            "required": true,
            "description": "Olay kimliği.",
            "schema": {
              "type": "string"
            },
            "example": "cm4example000delivery0001"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/EventEnvelope"
              },
              "example": {
                "id": "evt_ornek000000000001",
                "type": "booking.appointment.created",
                "occurredAt": "2026-11-01T09:30:00.000Z",
                "projectId": "cm4example000project00001",
                "data": {
                  "id": "apt_Ex4mpleRandevu01",
                  "status": "CONFIRMED",
                  "serviceId": "cm4example000service00001",
                  "staffId": "cm4example000staff0000001",
                  "startAt": "2026-11-10T07:00:00.000Z",
                  "endAt": "2026-11-10T07:30:00.000Z",
                  "timezone": "Europe/Istanbul",
                  "customer": {
                    "name": "Ayşe Yılmaz",
                    "email": "ayse@example.com",
                    "phone": "+905550000000"
                  },
                  "notes": null,
                  "answers": {},
                  "source": "API",
                  "language": "tr",
                  "createdAt": "2026-11-01T09:30:00.000Z",
                  "approvedAt": "2026-11-01T09:30:00.000Z",
                  "cancelledBy": null,
                  "cancelReason": null
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Olay alındı. 2xx dışındaki yanıtlarda teslim yeniden denenir."
          }
        }
      }
    },
    "booking.appointment.confirmed": {
      "post": {
        "operationId": "event_booking_appointment_confirmed",
        "tags": [
          "Webhook Olayları"
        ],
        "summary": "Randevu onaylandı",
        "description": "Randevu onaylandığında gönderilir. Randevu modülü gerekir.",
        "security": [],
        "parameters": [
          {
            "name": "X-SP-Signature",
            "in": "header",
            "required": true,
            "description": "Olay imzası",
            "schema": {
              "type": "string"
            },
            "example": "t=1793525400,v1=0000000000000000000000000000000000000000000000000000000000000000"
          },
          {
            "name": "X-SP-Event",
            "in": "header",
            "required": true,
            "description": "Olay adı.",
            "schema": {
              "type": "string"
            },
            "example": "booking.appointment.confirmed"
          },
          {
            "name": "X-SP-Event-Id",
            "in": "header",
            "required": true,
            "description": "Olay kimliği.",
            "schema": {
              "type": "string"
            },
            "example": "evt_ornek000000000001"
          },
          {
            "name": "X-SP-Delivery",
            "in": "header",
            "required": true,
            "description": "Olay kimliği.",
            "schema": {
              "type": "string"
            },
            "example": "cm4example000delivery0001"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/EventEnvelope"
              },
              "example": {
                "id": "evt_ornek000000000001",
                "type": "booking.appointment.confirmed",
                "occurredAt": "2026-11-01T09:30:00.000Z",
                "projectId": "cm4example000project00001",
                "data": {
                  "id": "apt_Ex4mpleRandevu01",
                  "status": "CONFIRMED",
                  "serviceId": "cm4example000service00001",
                  "staffId": "cm4example000staff0000001",
                  "startAt": "2026-11-10T07:00:00.000Z",
                  "endAt": "2026-11-10T07:30:00.000Z",
                  "timezone": "Europe/Istanbul",
                  "customer": {
                    "name": "Ayşe Yılmaz",
                    "email": "ayse@example.com",
                    "phone": "+905550000000"
                  },
                  "notes": null,
                  "answers": {},
                  "source": "API",
                  "language": "tr",
                  "createdAt": "2026-11-01T09:30:00.000Z",
                  "approvedAt": "2026-11-01T09:30:00.000Z",
                  "cancelledBy": null,
                  "cancelReason": null
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Olay alındı. 2xx dışındaki yanıtlarda teslim yeniden denenir."
          }
        }
      }
    },
    "booking.appointment.rescheduled": {
      "post": {
        "operationId": "event_booking_appointment_rescheduled",
        "tags": [
          "Webhook Olayları"
        ],
        "summary": "Randevu ertelendi",
        "description": "Randevunun zamanı değiştiğinde gönderilir. Randevu modülü gerekir.",
        "security": [],
        "parameters": [
          {
            "name": "X-SP-Signature",
            "in": "header",
            "required": true,
            "description": "Olay imzası",
            "schema": {
              "type": "string"
            },
            "example": "t=1793525400,v1=0000000000000000000000000000000000000000000000000000000000000000"
          },
          {
            "name": "X-SP-Event",
            "in": "header",
            "required": true,
            "description": "Olay adı.",
            "schema": {
              "type": "string"
            },
            "example": "booking.appointment.rescheduled"
          },
          {
            "name": "X-SP-Event-Id",
            "in": "header",
            "required": true,
            "description": "Olay kimliği.",
            "schema": {
              "type": "string"
            },
            "example": "evt_ornek000000000001"
          },
          {
            "name": "X-SP-Delivery",
            "in": "header",
            "required": true,
            "description": "Olay kimliği.",
            "schema": {
              "type": "string"
            },
            "example": "cm4example000delivery0001"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/EventEnvelope"
              },
              "example": {
                "id": "evt_ornek000000000001",
                "type": "booking.appointment.rescheduled",
                "occurredAt": "2026-11-01T09:30:00.000Z",
                "projectId": "cm4example000project00001",
                "data": {
                  "id": "apt_Ex4mpleRandevu01",
                  "status": "CONFIRMED",
                  "serviceId": "cm4example000service00001",
                  "staffId": "cm4example000staff0000001",
                  "startAt": "2026-11-10T07:00:00.000Z",
                  "endAt": "2026-11-10T07:30:00.000Z",
                  "timezone": "Europe/Istanbul",
                  "customer": {
                    "name": "Ayşe Yılmaz",
                    "email": "ayse@example.com",
                    "phone": "+905550000000"
                  },
                  "notes": null,
                  "answers": {},
                  "source": "API",
                  "language": "tr",
                  "createdAt": "2026-11-01T09:30:00.000Z",
                  "approvedAt": "2026-11-01T09:30:00.000Z",
                  "cancelledBy": null,
                  "cancelReason": null
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Olay alındı. 2xx dışındaki yanıtlarda teslim yeniden denenir."
          }
        }
      }
    },
    "booking.appointment.cancelled": {
      "post": {
        "operationId": "event_booking_appointment_cancelled",
        "tags": [
          "Webhook Olayları"
        ],
        "summary": "Randevu iptal edildi",
        "description": "Randevu iptal edildiğinde gönderilir. Randevu modülü gerekir.",
        "security": [],
        "parameters": [
          {
            "name": "X-SP-Signature",
            "in": "header",
            "required": true,
            "description": "Olay imzası",
            "schema": {
              "type": "string"
            },
            "example": "t=1793525400,v1=0000000000000000000000000000000000000000000000000000000000000000"
          },
          {
            "name": "X-SP-Event",
            "in": "header",
            "required": true,
            "description": "Olay adı.",
            "schema": {
              "type": "string"
            },
            "example": "booking.appointment.cancelled"
          },
          {
            "name": "X-SP-Event-Id",
            "in": "header",
            "required": true,
            "description": "Olay kimliği.",
            "schema": {
              "type": "string"
            },
            "example": "evt_ornek000000000001"
          },
          {
            "name": "X-SP-Delivery",
            "in": "header",
            "required": true,
            "description": "Olay kimliği.",
            "schema": {
              "type": "string"
            },
            "example": "cm4example000delivery0001"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/EventEnvelope"
              },
              "example": {
                "id": "evt_ornek000000000001",
                "type": "booking.appointment.cancelled",
                "occurredAt": "2026-11-01T09:30:00.000Z",
                "projectId": "cm4example000project00001",
                "data": {
                  "id": "apt_Ex4mpleRandevu01",
                  "status": "CONFIRMED",
                  "serviceId": "cm4example000service00001",
                  "staffId": "cm4example000staff0000001",
                  "startAt": "2026-11-10T07:00:00.000Z",
                  "endAt": "2026-11-10T07:30:00.000Z",
                  "timezone": "Europe/Istanbul",
                  "customer": {
                    "name": "Ayşe Yılmaz",
                    "email": "ayse@example.com",
                    "phone": "+905550000000"
                  },
                  "notes": null,
                  "answers": {},
                  "source": "API",
                  "language": "tr",
                  "createdAt": "2026-11-01T09:30:00.000Z",
                  "approvedAt": "2026-11-01T09:30:00.000Z",
                  "cancelledBy": null,
                  "cancelReason": null
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Olay alındı. 2xx dışındaki yanıtlarda teslim yeniden denenir."
          }
        }
      }
    },
    "social.comment.created": {
      "post": {
        "operationId": "event_social_comment_created",
        "tags": [
          "Webhook Olayları"
        ],
        "summary": "Sosyal yorum",
        "description": "Bağlı Instagram hesabına yeni yorum geldiğinde gönderilir. Sosyal gelen kutusu modülü gerekir.",
        "security": [],
        "parameters": [
          {
            "name": "X-SP-Signature",
            "in": "header",
            "required": true,
            "description": "Olay imzası",
            "schema": {
              "type": "string"
            },
            "example": "t=1793525400,v1=0000000000000000000000000000000000000000000000000000000000000000"
          },
          {
            "name": "X-SP-Event",
            "in": "header",
            "required": true,
            "description": "Olay adı.",
            "schema": {
              "type": "string"
            },
            "example": "social.comment.created"
          },
          {
            "name": "X-SP-Event-Id",
            "in": "header",
            "required": true,
            "description": "Olay kimliği.",
            "schema": {
              "type": "string"
            },
            "example": "evt_ornek000000000001"
          },
          {
            "name": "X-SP-Delivery",
            "in": "header",
            "required": true,
            "description": "Olay kimliği.",
            "schema": {
              "type": "string"
            },
            "example": "cm4example000delivery0001"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/EventEnvelope"
              },
              "example": {
                "id": "evt_ornek000000000001",
                "type": "social.comment.created",
                "occurredAt": "2026-11-01T09:30:00.000Z",
                "projectId": "cm4example000project00001",
                "data": {
                  "id": "cm4example000comment00001",
                  "commentId": "17900000000000000",
                  "mediaId": "17800000000000000",
                  "parentId": null,
                  "text": "Harika olmuş!",
                  "username": "ornek_kullanici",
                  "fromOwner": false,
                  "hidden": false,
                  "dmStatus": null,
                  "dmError": null,
                  "ruleId": null,
                  "createdAt": "2026-11-01T09:30:00.000Z"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Olay alındı. 2xx dışındaki yanıtlarda teslim yeniden denenir."
          }
        }
      }
    },
    "review.created": {
      "post": {
        "operationId": "event_review_created",
        "tags": [
          "Webhook Olayları"
        ],
        "summary": "Yeni yorum",
        "description": "Bağlı yorum kaynağında yeni yorum bulunduğunda gönderilir. Yorumlar modülü gerekir.",
        "security": [],
        "parameters": [
          {
            "name": "X-SP-Signature",
            "in": "header",
            "required": true,
            "description": "Olay imzası",
            "schema": {
              "type": "string"
            },
            "example": "t=1793525400,v1=0000000000000000000000000000000000000000000000000000000000000000"
          },
          {
            "name": "X-SP-Event",
            "in": "header",
            "required": true,
            "description": "Olay adı.",
            "schema": {
              "type": "string"
            },
            "example": "review.created"
          },
          {
            "name": "X-SP-Event-Id",
            "in": "header",
            "required": true,
            "description": "Olay kimliği.",
            "schema": {
              "type": "string"
            },
            "example": "evt_ornek000000000001"
          },
          {
            "name": "X-SP-Delivery",
            "in": "header",
            "required": true,
            "description": "Olay kimliği.",
            "schema": {
              "type": "string"
            },
            "example": "cm4example000delivery0001"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/EventEnvelope"
              },
              "example": {
                "id": "evt_ornek000000000001",
                "type": "review.created",
                "occurredAt": "2026-11-01T09:30:00.000Z",
                "projectId": "cm4example000project00001",
                "data": {
                  "id": "cm4example000review000001",
                  "source": {
                    "key": "google:ornek",
                    "name": "Örnek Şirket"
                  },
                  "author": {
                    "name": "Ayşe Y.",
                    "avatar": null
                  },
                  "rating": 5,
                  "text": "Çok memnun kaldık.",
                  "reply": null,
                  "likes": 0,
                  "publishedAt": "2026-11-01T09:30:00.000Z",
                  "permalink": "https://example.com/yorum/1"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Olay alındı. 2xx dışındaki yanıtlarda teslim yeniden denenir."
          }
        }
      }
    },
    "content.published": {
      "post": {
        "operationId": "event_content_published",
        "tags": [
          "Webhook Olayları"
        ],
        "summary": "İçerik yayınlandı",
        "description": "İçerik yayına alındığında gönderilir. Başlığı, adresi ve HTML gövdeyi içerir.",
        "security": [],
        "parameters": [
          {
            "name": "X-SP-Signature",
            "in": "header",
            "required": true,
            "description": "Olay imzası",
            "schema": {
              "type": "string"
            },
            "example": "t=1793525400,v1=0000000000000000000000000000000000000000000000000000000000000000"
          },
          {
            "name": "X-SP-Event",
            "in": "header",
            "required": true,
            "description": "Olay adı.",
            "schema": {
              "type": "string"
            },
            "example": "content.published"
          },
          {
            "name": "X-SP-Event-Id",
            "in": "header",
            "required": true,
            "description": "Olay kimliği.",
            "schema": {
              "type": "string"
            },
            "example": "evt_ornek000000000001"
          },
          {
            "name": "X-SP-Delivery",
            "in": "header",
            "required": true,
            "description": "Olay kimliği.",
            "schema": {
              "type": "string"
            },
            "example": "cm4example000delivery0001"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/EventEnvelope"
              },
              "example": {
                "id": "evt_ornek000000000001",
                "type": "content.published",
                "occurredAt": "2026-11-01T09:30:00.000Z",
                "projectId": "cm4example000project00001",
                "data": {
                  "contentId": "cm4example000article00001",
                  "op": "new_post",
                  "title": "Kurumsal Web Sitesi Nasıl Hazırlanır?",
                  "slug": "kurumsal-web-sitesi-nasil-hazirlanir",
                  "url": "https://example.com/blog/kurumsal-web-sitesi-nasil-hazirlanir",
                  "status": "PUBLISHED",
                  "language": "tr",
                  "keywords": [
                    "kurumsal web sitesi"
                  ],
                  "excerpt": "Kurumsal site hazırlarken izlenecek adımlar.",
                  "metaTitle": "Kurumsal Web Sitesi Rehberi",
                  "metaDescription": "Kurumsal web sitesi hazırlarken izlenecek adımları öğrenin.",
                  "html": "<h2>Planlama</h2><p>İlk adım hedefleri belirlemektir.</p>",
                  "faqJsonLd": null,
                  "featuredImage": null,
                  "publishedAt": "2026-11-01T09:30:00.000Z"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Olay alındı. 2xx dışındaki yanıtlarda teslim yeniden denenir."
          }
        }
      }
    },
    "content.updated": {
      "post": {
        "operationId": "event_content_updated",
        "tags": [
          "Webhook Olayları"
        ],
        "summary": "İçerik güncellendi",
        "description": "Yayındaki içerik güncellendiğinde gönderilir. Gövdesi `content.published` ile aynıdır.",
        "security": [],
        "parameters": [
          {
            "name": "X-SP-Signature",
            "in": "header",
            "required": true,
            "description": "Olay imzası",
            "schema": {
              "type": "string"
            },
            "example": "t=1793525400,v1=0000000000000000000000000000000000000000000000000000000000000000"
          },
          {
            "name": "X-SP-Event",
            "in": "header",
            "required": true,
            "description": "Olay adı.",
            "schema": {
              "type": "string"
            },
            "example": "content.updated"
          },
          {
            "name": "X-SP-Event-Id",
            "in": "header",
            "required": true,
            "description": "Olay kimliği.",
            "schema": {
              "type": "string"
            },
            "example": "evt_ornek000000000001"
          },
          {
            "name": "X-SP-Delivery",
            "in": "header",
            "required": true,
            "description": "Olay kimliği.",
            "schema": {
              "type": "string"
            },
            "example": "cm4example000delivery0001"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/EventEnvelope"
              },
              "example": {
                "id": "evt_ornek000000000001",
                "type": "content.updated",
                "occurredAt": "2026-11-01T09:30:00.000Z",
                "projectId": "cm4example000project00001",
                "data": {
                  "contentId": "cm4example000article00001",
                  "op": "new_post",
                  "title": "Kurumsal Web Sitesi Nasıl Hazırlanır?",
                  "slug": "kurumsal-web-sitesi-nasil-hazirlanir",
                  "url": "https://example.com/blog/kurumsal-web-sitesi-nasil-hazirlanir",
                  "status": "PUBLISHED",
                  "language": "tr",
                  "keywords": [
                    "kurumsal web sitesi"
                  ],
                  "excerpt": "Kurumsal site hazırlarken izlenecek adımlar.",
                  "metaTitle": "Kurumsal Web Sitesi Rehberi",
                  "metaDescription": "Kurumsal web sitesi hazırlarken izlenecek adımları öğrenin.",
                  "html": "<h2>Planlama</h2><p>İlk adım hedefleri belirlemektir.</p>",
                  "faqJsonLd": null,
                  "featuredImage": null,
                  "publishedAt": "2026-11-01T09:30:00.000Z"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Olay alındı. 2xx dışındaki yanıtlarda teslim yeniden denenir."
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "SpAuth": {
        "type": "apiKey",
        "in": "header",
        "name": "X-SP-Auth",
        "description": "Proje anahtarı (`sp_…`), `X-SP-Auth` başlığıyla."
      },
      "BearerAuth": {
        "type": "http",
        "scheme": "bearer",
        "description": "Proje anahtarı (`sp_…`), `Authorization: Bearer` başlığıyla."
      },
      "AccountBearer": {
        "type": "http",
        "scheme": "bearer",
        "description": "Hesap anahtarı (`spt_…`), `Authorization: Bearer` başlığıyla."
      },
      "AccountHeader": {
        "type": "apiKey",
        "in": "header",
        "name": "X-SP-Auth",
        "description": "Hesap anahtarı (`spt_…`), `X-SP-Auth` başlığıyla."
      }
    },
    "schemas": {
      "Error": {
        "type": "object",
        "required": [
          "success",
          "error",
          "code"
        ],
        "properties": {
          "success": {
            "type": "boolean",
            "enum": [
              false
            ],
            "description": "Hata yanıtlarında her zaman `false`."
          },
          "error": {
            "type": "string",
            "description": "Kullanıcıya gösterilebilecek açıklama. Metni değişebilir."
          },
          "code": {
            "type": "string",
            "description": "Makine okuması için hata kodu."
          },
          "blocking": {
            "type": "array",
            "description": "Yayını engelleyen denetimlerin kimlikleri.",
            "items": {
              "type": "string"
            }
          },
          "kurus": {
            "type": "integer",
            "description": "İşlemin kuruş cinsinden tahmini maliyeti."
          },
          "balanceKurus": {
            "type": "integer",
            "description": "Hesabın kuruş cinsinden bakiyesi."
          },
          "shortfallKurus": {
            "type": "integer",
            "description": "Eksik kalan tutar (kuruş)."
          }
        }
      },
      "Handshake": {
        "type": "object",
        "required": [
          "success",
          "ok",
          "projectId",
          "domain"
        ],
        "properties": {
          "success": {
            "type": "boolean",
            "enum": [
              true
            ],
            "description": "İşlem başarılıysa `true`."
          },
          "ok": {
            "type": "boolean",
            "enum": [
              true
            ],
            "description": "Anahtar geçerliyse `true`."
          },
          "projectId": {
            "type": "string",
            "description": "Anahtarın bağlı olduğu proje."
          },
          "domain": {
            "type": [
              "string",
              "null"
            ],
            "description": "Projenin alan adı."
          }
        },
        "additionalProperties": false
      },
      "SyncStatus": {
        "type": "object",
        "required": [
          "success",
          "enabled",
          "mode",
          "activeChannel",
          "lastPullAt",
          "delivering",
          "fixCounts",
          "declaredVersion",
          "updatesAvailable"
        ],
        "properties": {
          "success": {
            "type": "boolean",
            "enum": [
              true
            ],
            "description": "İşlem başarılıysa `true`."
          },
          "enabled": {
            "type": "boolean",
            "description": "SEO Düzeltme projede açıksa `true`."
          },
          "mode": {
            "type": "string",
            "description": "SEO Düzeltme çalışma biçimi.",
            "enum": [
              "OFF",
              "SEMI",
              "FULL"
            ]
          },
          "activeChannel": {
            "type": [
              "string",
              "null"
            ],
            "description": "Düzeltmeleri teslim eden etkin kanal. API kanalı `KAF_API` olarak görünür."
          },
          "lastPullAt": {
            "type": [
              "string",
              "null"
            ],
            "description": "API ile yapılan son çekim zamanı.",
            "format": "date-time"
          },
          "delivering": {
            "type": "boolean",
            "description": "Son çekim yeterince yakın zamandaysa `true`."
          },
          "fixCounts": {
            "type": "object",
            "description": "Duruma göre düzeltme sayıları.",
            "propertyNames": {
              "enum": [
                "DRAFT",
                "APPROVED",
                "QUEUED",
                "DEPLOYED",
                "READY",
                "PULLED",
                "APPLIED",
                "VERIFIED",
                "FAILED",
                "REVERTED",
                "SUPERSEDED"
              ]
            },
            "additionalProperties": {
              "type": "integer"
            }
          },
          "declaredVersion": {
            "type": [
              "string",
              "null"
            ],
            "description": "`X-SP-Api-Version` ile bildirdiğiniz son sürüm."
          },
          "updatesAvailable": {
            "type": "integer",
            "description": "Bildirdiğiniz sürümden yeni sürüm notu sayısı."
          }
        },
        "additionalProperties": false
      },
      "FeedRule": {
        "type": "object",
        "required": [
          "action"
        ],
        "properties": {
          "action": {
            "type": "string",
            "description": "Talimat türü.",
            "enum": [
              "set_attribute",
              "set_html",
              "replace_html",
              "replace_text",
              "remove_element",
              "add_class",
              "remove_class",
              "remove_attribute",
              "change_tag",
              "create_if_missing",
              "add_redirect",
              "remove_redirect",
              "inject_related_links",
              "create_page",
              "set_http_header",
              "inject_css",
              "put_file",
              "optimize_media",
              "insert_content_block",
              "replace_phrase"
            ]
          },
          "selector": {
            "type": "string",
            "description": "Hedef öğeyi seçen CSS seçicisi."
          },
          "attribute": {
            "type": "string",
            "description": "Değiştirilecek öznitelik."
          },
          "value": {
            "type": "string",
            "description": "Yeni değer."
          },
          "matchText": {
            "type": "string",
            "description": "Aranacak metin."
          },
          "selfRef": {
            "description": "Talimat türüne özgü alan."
          },
          "from": {
            "description": "Talimat türüne özgü alan."
          },
          "to": {
            "description": "Talimat türüne özgü alan."
          },
          "status": {
            "description": "Talimat türüne özgü alan."
          },
          "links": {
            "description": "Talimat türüne özgü alan."
          },
          "createObject": {
            "description": "Talimat türüne özgü alan."
          },
          "position": {
            "description": "Talimat türüne özgü alan."
          },
          "blockId": {
            "description": "Talimat türüne özgü alan."
          },
          "html": {
            "description": "Talimat türüne özgü alan."
          },
          "title": {
            "description": "Talimat türüne özgü alan."
          },
          "content": {
            "description": "Talimat türüne özgü alan."
          },
          "slug": {
            "description": "Talimat türüne özgü alan."
          },
          "excerpt": {
            "description": "Talimat türüne özgü alan."
          },
          "postType": {
            "description": "Talimat türüne özgü alan."
          },
          "tags": {
            "description": "Talimat türüne özgü alan."
          },
          "featuredImageUrl": {
            "description": "Talimat türüne özgü alan."
          },
          "headers": {
            "description": "Talimat türüne özgü alan."
          },
          "css": {
            "description": "Talimat türüne özgü alan."
          },
          "path": {
            "description": "Talimat türüne özgü alan."
          },
          "src": {
            "description": "Talimat türüne özgü alan."
          },
          "maxWidth": {
            "description": "Talimat türüne özgü alan."
          },
          "maxHeight": {
            "description": "Talimat türüne özgü alan."
          }
        },
        "additionalProperties": false
      },
      "FeedMutation": {
        "type": "object",
        "required": [
          "id",
          "url",
          "updatedAt",
          "rules"
        ],
        "properties": {
          "id": {
            "type": "string",
            "description": "Düzeltme kimliği. Uygulandığını bildirirken kullanılır."
          },
          "url": {
            "type": "string",
            "description": "Düzeltmenin uygulanacağı sayfa."
          },
          "updatedAt": {
            "type": "string",
            "description": "Son değişiklik zamanı.",
            "format": "date-time"
          },
          "rules": {
            "type": "array",
            "description": "Sayfaya sırayla uygulanacak talimatlar.",
            "items": {
              "$ref": "#/components/schemas/FeedRule"
            }
          }
        },
        "additionalProperties": false
      },
      "FixFeed": {
        "type": "object",
        "required": [
          "success",
          "mutations",
          "removedIds",
          "textFixes",
          "removedTextFixIds",
          "cursor",
          "hasMore",
          "mode",
          "emptyReason",
          "contentItems",
          "contentCursor",
          "contentHasMore"
        ],
        "properties": {
          "success": {
            "type": "boolean",
            "enum": [
              true
            ],
            "description": "İşlem başarılıysa `true`."
          },
          "mutations": {
            "type": "array",
            "description": "Uygulanacak düzeltmeler.",
            "items": {
              "$ref": "#/components/schemas/FeedMutation"
            }
          },
          "removedIds": {
            "type": "array",
            "description": "Geri alınan ya da yerini başkasına bırakan düzeltmelerin kimlikleri. Bunları sitenizden kaldırın.",
            "items": {
              "type": "string"
            }
          },
          "textFixes": {
            "type": "array",
            "description": "Ayrılmış alan; şu an her zaman boş döner.",
            "items": {},
            "maxItems": 0
          },
          "removedTextFixIds": {
            "type": "array",
            "description": "Ayrılmış alan; şu an her zaman boş döner.",
            "items": {
              "type": "string"
            },
            "maxItems": 0
          },
          "cursor": {
            "type": [
              "string",
              "null"
            ],
            "description": "Sonraki çağrıda `since` olarak gönderilecek imleç (ISO 8601)."
          },
          "hasMore": {
            "type": "boolean",
            "description": "Devamı varsa `true`."
          },
          "mode": {
            "type": "string",
            "description": "Beslemenin çalışma biçimi.",
            "enum": [
              "semi",
              "full",
              "off"
            ]
          },
          "emptyReason": {
            "type": [
              "string",
              "null"
            ],
            "description": "Liste boşsa nedeni; dolu yanıtlarda `null`.",
            "enum": [
              "up_to_date",
              "awaiting_manual_generation",
              "awaiting_approval",
              "in_progress",
              "none_yet",
              "inactive_channel",
              "disabled",
              null
            ]
          },
          "message": {
            "type": "string",
            "description": "Boş listenin nedenini anlatan metin."
          },
          "contentItems": {
            "type": "array",
            "description": "Teslime hazır içerikler; biçimi içerik ucuyla aynıdır. Bağımsız sayfalama için `contentSince` ve `contentLimit` kullanın.",
            "items": {
              "$ref": "#/components/schemas/ContentItem"
            }
          },
          "contentCursor": {
            "type": [
              "string",
              "null"
            ],
            "description": "Sonraki çağrıda `contentSince` olarak gönderilecek imleç."
          },
          "contentHasMore": {
            "type": "boolean",
            "description": "İçerik listesinin devamı varsa `true`."
          }
        },
        "additionalProperties": false
      },
      "AppliedBody": {
        "type": "object",
        "required": [
          "ids"
        ],
        "properties": {
          "ids": {
            "type": "array",
            "description": "Uyguladığınız düzeltmelerin kimlikleri.",
            "items": {
              "type": "string",
              "minLength": 1,
              "maxLength": 64
            },
            "minItems": 1,
            "maxItems": 1000
          },
          "urls": {
            "type": "object",
            "description": "Düzeltme kimliği → yayın adresi eşlemesi. Yeni sayfa ve blog yazısı oluşturan düzeltmeler için gönderin.",
            "additionalProperties": {
              "type": "string",
              "maxLength": 2048
            }
          }
        },
        "additionalProperties": false
      },
      "AppliedResult": {
        "type": "object",
        "required": [
          "success",
          "acknowledged",
          "requested",
          "invalid",
          "ignored"
        ],
        "properties": {
          "success": {
            "type": "boolean",
            "enum": [
              true
            ],
            "description": "İşlem başarılıysa `true`."
          },
          "acknowledged": {
            "type": "integer",
            "description": "Uygulandı olarak işaretlenen düzeltme sayısı."
          },
          "requested": {
            "type": "integer",
            "description": "Gönderilen kimlik sayısı."
          },
          "invalid": {
            "type": "integer",
            "description": "Bu projede bulunamayan kimlik sayısı."
          },
          "ignored": {
            "type": "integer",
            "description": "Daha önce işlenmiş ya da başka kanala ait olduğu için atlanan kimlik sayısı."
          }
        },
        "additionalProperties": false
      },
      "ContentItem": {
        "type": "object",
        "required": [
          "id",
          "op",
          "title",
          "slug",
          "html",
          "excerpt",
          "metaTitle",
          "metaDescription",
          "faqJsonLd",
          "tags",
          "categoryId",
          "categoryName",
          "authorId",
          "status",
          "featuredImage",
          "inlineImages",
          "targetUrl",
          "sectionId"
        ],
        "properties": {
          "id": {
            "type": "string",
            "description": "İçerik kimliği. Sonucu bildirirken kullanılır."
          },
          "op": {
            "type": "string",
            "description": "Yapılacak işlem: yeni yazı (`create_post`), yayındaki yazıyı güncelleme (`update_post`) ya da sayfanın bir bölümünü güncelleme (`update_section`). Betiğiniz uygulamadığı işlemi atlamamalı, `ok: false` ve `error: unsupported_op` ile bildirmelidir. Otomatik plan, bu projede en az bir başarılı `update_section` bildirimi görmeden bölüm işi göndermez; bu bildirim, kullanıcının elle gönderdiği bir güncellemeyle oluşur.",
            "enum": [
              "create_post",
              "update_post",
              "update_section"
            ]
          },
          "title": {
            "type": "string",
            "description": "Başlık."
          },
          "slug": {
            "type": "string",
            "description": "Adres kısa adı."
          },
          "html": {
            "type": "string",
            "description": "Temizlenmiş HTML gövde."
          },
          "excerpt": {
            "type": "string",
            "description": "Kısa özet."
          },
          "metaTitle": {
            "type": "string",
            "description": "Meta başlık."
          },
          "metaDescription": {
            "type": "string",
            "description": "Meta açıklama."
          },
          "faqJsonLd": {
            "type": [
              "string",
              "null"
            ],
            "description": "SSS için JSON-LD betiği."
          },
          "tags": {
            "type": "array",
            "description": "Etiketler.",
            "items": {
              "type": "string"
            }
          },
          "categoryId": {
            "type": [
              "string",
              "null"
            ],
            "description": "Sitenizdeki kategori kimliği."
          },
          "categoryName": {
            "type": [
              "string",
              "null"
            ],
            "description": "Kategori adı."
          },
          "authorId": {
            "type": [
              "string",
              "null"
            ],
            "description": "Sitenizdeki yazar kimliği."
          },
          "status": {
            "type": "string",
            "description": "Sitede taslak ya da yayın olarak oluşturulacağını belirtir.",
            "enum": [
              "draft",
              "publish"
            ]
          },
          "featuredImage": {
            "description": "Öne çıkan görsel.",
            "oneOf": [
              {
                "type": "object",
                "required": [
                  "url",
                  "alt"
                ],
                "properties": {
                  "url": {
                    "type": "string",
                    "description": "Görsel adresi."
                  },
                  "alt": {
                    "type": "string",
                    "description": "Görsel alt metni."
                  },
                  "credit": {
                    "type": "string",
                    "description": "Görsel kaynağı atfı."
                  }
                },
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ]
          },
          "inlineImages": {
            "type": "array",
            "description": "Gövdedeki görseller.",
            "items": {
              "type": "object",
              "required": [
                "url",
                "alt"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "description": "Görsel adresi."
                },
                "alt": {
                  "type": "string",
                  "description": "Görsel alt metni."
                }
              },
              "additionalProperties": false
            }
          },
          "targetUrl": {
            "type": [
              "string",
              "null"
            ],
            "description": "Güncellenecek sayfanın adresi; yeni yazıda `null`."
          },
          "sectionId": {
            "type": "string",
            "description": "Sayfa içi bölüm kimliği."
          },
          "postId": {
            "type": [
              "string",
              "null"
            ],
            "description": "Yayındaki yazının sitenizdeki kimliği. Yalnız `update_post` ve yayındaki güncellemelerde gelir."
          }
        },
        "additionalProperties": false
      },
      "ContentFeed": {
        "type": "object",
        "required": [
          "success",
          "items",
          "cursor",
          "hasMore"
        ],
        "properties": {
          "success": {
            "type": "boolean",
            "enum": [
              true
            ],
            "description": "İşlem başarılıysa `true`."
          },
          "items": {
            "type": "array",
            "description": "Teslime hazır içerikler.",
            "items": {
              "$ref": "#/components/schemas/ContentItem"
            }
          },
          "cursor": {
            "type": [
              "string",
              "null"
            ],
            "description": "Sonraki çağrıda `since` olarak gönderilecek opak imleç."
          },
          "hasMore": {
            "type": "boolean",
            "description": "Devamı varsa `true`."
          }
        },
        "additionalProperties": false
      },
      "ContentReport": {
        "type": "object",
        "required": [
          "id",
          "ok"
        ],
        "properties": {
          "id": {
            "type": "string",
            "description": "İçerik kimliği. Sonucu bildirirken kullanılır.",
            "maxLength": 64
          },
          "ok": {
            "type": "boolean",
            "description": "İçerik sitede oluşturulduysa `true`."
          },
          "postId": {
            "description": "Yazının sitenizdeki kimliği.",
            "oneOf": [
              {
                "type": "string",
                "maxLength": 64
              },
              {
                "type": "number"
              }
            ]
          },
          "url": {
            "type": "string",
            "description": "Yayın adresi. Projenin alan adında olmalıdır, aksi halde kaydedilmez.",
            "maxLength": 2000
          },
          "status": {
            "type": "string",
            "description": "Sitede oluşan durum.",
            "enum": [
              "draft",
              "publish"
            ]
          },
          "error": {
            "type": "string",
            "description": "Başarısızlık kodu. Tanınmayan değerler `temporary` sayılır. Desteklemediğiniz işlem için `unsupported_op` gönderin. Çekilen bir `update_section` kaydı için hiç bildirim gelmezse panel bir saat sonra kaydı `update_not_applied` nedeniyle kapatır ve yeniden sunmaz; kullanıcı yeniden deneyene kadar beslemede görünmez.",
            "maxLength": 80,
            "examples": [
              "blocked",
              "slug_taken",
              "publish_state_failed",
              "site_rejected",
              "plugin_missing",
              "site_unreachable",
              "temporary",
              "unsupported_op",
              "page_not_resolved",
              "category_failed"
            ]
          },
          "before": {
            "type": "string",
            "description": "`update_section` için güncellemeden önceki HTML; geri alma yedeği olarak saklanır."
          }
        }
      },
      "ContentAppliedBody": {
        "oneOf": [
          {
            "$ref": "#/components/schemas/ContentReport"
          },
          {
            "type": "object",
            "required": [
              "items"
            ],
            "properties": {
              "items": {
                "type": "array",
                "description": "Toplu bildirim.",
                "items": {
                  "$ref": "#/components/schemas/ContentReport"
                },
                "minItems": 1,
                "maxItems": 50
              }
            }
          }
        ]
      },
      "ContentAppliedResult": {
        "type": "object",
        "required": [
          "success",
          "accepted",
          "unknown",
          "results"
        ],
        "properties": {
          "success": {
            "type": "boolean",
            "enum": [
              true
            ],
            "description": "İşlem başarılıysa `true`."
          },
          "accepted": {
            "type": "integer",
            "description": "İşlenen kayıt sayısı."
          },
          "unknown": {
            "type": "integer",
            "description": "Bu projede bulunamayan kayıt sayısı."
          },
          "results": {
            "type": "array",
            "description": "Kayıt başına sonuç.",
            "items": {
              "type": "object",
              "required": [
                "id",
                "outcome"
              ],
              "properties": {
                "id": {
                  "type": "string",
                  "description": "İçerik kimliği. Sonucu bildirirken kullanılır."
                },
                "outcome": {
                  "type": "string",
                  "description": "Bildirimin sonucu.",
                  "enum": [
                    "delivered",
                    "draft",
                    "publishing",
                    "unverified",
                    "failed",
                    "duplicate",
                    "unknown"
                  ]
                }
              },
              "additionalProperties": false
            }
          }
        },
        "additionalProperties": false
      },
      "BotVisitsBody": {
        "type": "object",
        "required": [
          "hits"
        ],
        "properties": {
          "hits": {
            "type": "array",
            "description": "Ziyaret kayıtları. İlk 500 kayıt işlenir, fazlası yok sayılır; biçimi geçersiz kayıtlar atlanır.",
            "items": {
              "type": "object",
              "required": [
                "ua"
              ],
              "properties": {
                "ua": {
                  "type": "string",
                  "description": "İsteğin User-Agent değeri.",
                  "minLength": 1,
                  "maxLength": 1024
                },
                "url": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "İstenen adres ya da yol. Yoksa `/` kabul edilir.",
                  "maxLength": 2048
                },
                "ts": {
                  "description": "İstek zamanı: Unix saniye, Unix milisaniye ya da ISO 8601. Yoksa, geçersizse ya da gelecekteyse alındığı an kullanılır.",
                  "oneOf": [
                    {
                      "type": "integer"
                    },
                    {
                      "type": "string",
                      "maxLength": 40
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "ip": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "İstemci IP adresi. Bot doğrulaması için gereklidir.",
                  "maxLength": 64
                }
              }
            }
          }
        }
      },
      "BotVisitsResult": {
        "type": "object",
        "required": [
          "success",
          "accepted",
          "stored"
        ],
        "properties": {
          "success": {
            "type": "boolean",
            "enum": [
              true
            ],
            "description": "İşlem başarılıysa `true`."
          },
          "accepted": {
            "type": "integer",
            "description": "Alınan kayıt sayısı (en çok 500). Biçimi geçersiz olup atlanan kayıtlar da sayılır.",
            "maximum": 500
          },
          "stored": {
            "type": "integer",
            "description": "Bot olarak tanınıp kaydedilen ziyaret sayısı."
          }
        },
        "additionalProperties": false
      },
      "JsonRpcRequest": {
        "type": "object",
        "required": [
          "jsonrpc",
          "method"
        ],
        "properties": {
          "jsonrpc": {
            "type": "string",
            "description": "JSON-RPC sürümü.",
            "enum": [
              "2.0"
            ]
          },
          "id": {
            "description": "İstek kimliği. Bildirimlerde gönderilmez.",
            "oneOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              }
            ]
          },
          "method": {
            "type": "string",
            "description": "Yöntem: `initialize`, `ping`, `tools/list` ya da `tools/call`."
          },
          "params": {
            "type": "object",
            "description": "Yöntem parametreleri.",
            "additionalProperties": true
          }
        }
      },
      "JsonRpcResponse": {
        "type": "object",
        "required": [
          "jsonrpc",
          "id"
        ],
        "properties": {
          "jsonrpc": {
            "type": "string",
            "description": "JSON-RPC sürümü.",
            "enum": [
              "2.0"
            ]
          },
          "id": {
            "description": "İstek kimliği. Bildirimlerde gönderilmez.",
            "oneOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ]
          },
          "result": {
            "description": "Başarılı sonuç."
          },
          "error": {
            "type": "object",
            "description": "Protokol hatası.",
            "required": [
              "code",
              "message"
            ],
            "properties": {
              "code": {
                "type": "integer",
                "description": "JSON-RPC hata kodu."
              },
              "message": {
                "type": "string",
                "description": "Hata açıklaması."
              }
            }
          }
        }
      },
      "Scope": {
        "type": "string",
        "description": "Proje anahtarı izni.",
        "enum": [
          "conversations:read",
          "conversations:write",
          "forms:read",
          "forms:write",
          "bookings:read",
          "bookings:write",
          "comments:read",
          "comments:write",
          "reviews:read"
        ]
      },
      "MeResult": {
        "type": "object",
        "required": [
          "success",
          "data"
        ],
        "properties": {
          "success": {
            "type": "boolean",
            "enum": [
              true
            ],
            "description": "İşlem başarılıysa `true`."
          },
          "data": {
            "type": "object",
            "required": [
              "project",
              "scopes",
              "modules",
              "events"
            ],
            "properties": {
              "project": {
                "type": "object",
                "required": [
                  "id",
                  "domain"
                ],
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "Anahtarın bağlı olduğu proje."
                  },
                  "domain": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Projenin alan adı."
                  }
                },
                "additionalProperties": false,
                "description": "Anahtarın bağlı olduğu proje."
              },
              "scopes": {
                "type": "array",
                "description": "Anahtarda açık izinler.",
                "items": {
                  "$ref": "#/components/schemas/Scope"
                }
              },
              "modules": {
                "type": "array",
                "description": "Sitede etkin modüller.",
                "items": {
                  "type": "string",
                  "enum": [
                    "conversations",
                    "forms",
                    "bookings",
                    "comments",
                    "reviews"
                  ]
                }
              },
              "events": {
                "type": "array",
                "description": "Ayrılmış alan; şu an her zaman boş döner. Olaylar için Webhook Olayları bölümüne bakın.",
                "items": {
                  "type": "string"
                },
                "maxItems": 0
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false
      },
      "Offering": {
        "type": "object",
        "required": [
          "id",
          "title",
          "desc",
          "durationMin",
          "priceKurus",
          "currency",
          "staff"
        ],
        "properties": {
          "id": {
            "type": "string",
            "description": "Hizmet kimliği."
          },
          "title": {
            "type": "string",
            "description": "Hizmet adı."
          },
          "desc": {
            "type": [
              "string",
              "null"
            ],
            "description": "Hizmet açıklaması."
          },
          "durationMin": {
            "type": "integer",
            "description": "Süre (dakika)."
          },
          "priceKurus": {
            "type": "integer",
            "description": "Fiyat (kuruş)."
          },
          "currency": {
            "type": "string",
            "description": "Para birimi."
          },
          "staff": {
            "type": "array",
            "description": "Hizmeti veren personel.",
            "items": {
              "type": "object",
              "required": [
                "id",
                "name"
              ],
              "properties": {
                "id": {
                  "type": "string",
                  "description": "Personel kimliği."
                },
                "name": {
                  "type": "string",
                  "description": "Personel adı."
                }
              },
              "additionalProperties": false
            }
          }
        },
        "additionalProperties": false
      },
      "OfferingList": {
        "type": "object",
        "required": [
          "success",
          "data"
        ],
        "properties": {
          "success": {
            "type": "boolean",
            "enum": [
              true
            ],
            "description": "İşlem başarılıysa `true`."
          },
          "data": {
            "type": "object",
            "required": [
              "items"
            ],
            "properties": {
              "items": {
                "type": "array",
                "description": "Görünür hizmetler.",
                "items": {
                  "$ref": "#/components/schemas/Offering"
                }
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false
      },
      "Availability": {
        "type": "object",
        "required": [
          "success",
          "data"
        ],
        "properties": {
          "success": {
            "type": "boolean",
            "enum": [
              true
            ],
            "description": "İşlem başarılıysa `true`."
          },
          "data": {
            "type": "object",
            "required": [
              "timezone",
              "items"
            ],
            "properties": {
              "timezone": {
                "type": "string",
                "description": "Randevu sayfasının saat dilimi."
              },
              "items": {
                "type": "array",
                "description": "Boş başlangıç saatleri.",
                "items": {
                  "type": "object",
                  "required": [
                    "startAt",
                    "endAt"
                  ],
                  "properties": {
                    "startAt": {
                      "type": "string",
                      "description": "Başlangıç zamanı.",
                      "format": "date-time"
                    },
                    "endAt": {
                      "type": "string",
                      "description": "Bitiş zamanı.",
                      "format": "date-time"
                    }
                  },
                  "additionalProperties": false
                }
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false
      },
      "Appointment": {
        "type": "object",
        "required": [
          "id",
          "status",
          "serviceId",
          "staffId",
          "startAt",
          "endAt",
          "timezone",
          "customer",
          "notes",
          "answers",
          "source",
          "language",
          "createdAt",
          "approvedAt",
          "cancelledBy",
          "cancelReason"
        ],
        "properties": {
          "id": {
            "type": "string",
            "description": "Randevu kimliği."
          },
          "status": {
            "type": "string",
            "description": "Randevu durumu.",
            "enum": [
              "PENDING",
              "CONFIRMED",
              "COMPLETED",
              "CANCELLED",
              "FAILED"
            ]
          },
          "serviceId": {
            "type": "string",
            "description": "Hizmet kimliği."
          },
          "staffId": {
            "type": [
              "string",
              "null"
            ],
            "description": "Personel kimliği."
          },
          "startAt": {
            "type": "string",
            "description": "Başlangıç zamanı.",
            "format": "date-time"
          },
          "endAt": {
            "type": "string",
            "description": "Bitiş zamanı.",
            "format": "date-time"
          },
          "timezone": {
            "type": "string",
            "description": "Randevu sayfasının saat dilimi."
          },
          "customer": {
            "type": "object",
            "required": [
              "name",
              "email",
              "phone"
            ],
            "properties": {
              "name": {
                "type": "string",
                "description": "Ad soyad."
              },
              "email": {
                "type": "string",
                "description": "E-posta adresi."
              },
              "phone": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Telefon."
              }
            },
            "additionalProperties": false,
            "description": "Müşteri bilgileri."
          },
          "notes": {
            "type": [
              "string",
              "null"
            ],
            "description": "Müşteri notu."
          },
          "answers": {
            "type": "object",
            "description": "Ek form alanlarının yanıtları.",
            "additionalProperties": true
          },
          "source": {
            "type": "string",
            "description": "Randevunun geldiği kanal.",
            "enum": [
              "PAGE",
              "EMBED",
              "CHAT",
              "WHATSAPP",
              "SOCIAL",
              "API",
              "PANEL"
            ]
          },
          "language": {
            "type": "string",
            "description": "Randevu dili."
          },
          "createdAt": {
            "type": "string",
            "description": "Oluşturulma zamanı.",
            "format": "date-time"
          },
          "approvedAt": {
            "type": [
              "string",
              "null"
            ],
            "description": "Onay zamanı.",
            "format": "date-time"
          },
          "cancelledBy": {
            "type": [
              "string",
              "null"
            ],
            "description": "İptal eden taraf."
          },
          "cancelReason": {
            "type": [
              "string",
              "null"
            ],
            "description": "İptal nedeni."
          }
        },
        "additionalProperties": false
      },
      "AppointmentResult": {
        "type": "object",
        "required": [
          "success",
          "data"
        ],
        "properties": {
          "success": {
            "type": "boolean",
            "enum": [
              true
            ],
            "description": "İşlem başarılıysa `true`."
          },
          "data": {
            "$ref": "#/components/schemas/Appointment"
          }
        },
        "additionalProperties": false
      },
      "AppointmentList": {
        "type": "object",
        "required": [
          "success",
          "data"
        ],
        "properties": {
          "success": {
            "type": "boolean",
            "enum": [
              true
            ],
            "description": "İşlem başarılıysa `true`."
          },
          "data": {
            "type": "object",
            "required": [
              "items",
              "nextCursor"
            ],
            "properties": {
              "items": {
                "type": "array",
                "description": "Randevular.",
                "items": {
                  "$ref": "#/components/schemas/Appointment"
                }
              },
              "nextCursor": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Sonraki sayfa imleci; son sayfada `null`."
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false
      },
      "AppointmentCreate": {
        "type": "object",
        "required": [
          "serviceId",
          "startAt",
          "name",
          "email"
        ],
        "properties": {
          "serviceId": {
            "type": "string",
            "description": "Hizmet kimliği.",
            "minLength": 1,
            "maxLength": 40
          },
          "staffId": {
            "type": [
              "string",
              "null"
            ],
            "description": "Personel kimliği. Gönderilmezse uygun personel atanır.",
            "minLength": 1,
            "maxLength": 40
          },
          "startAt": {
            "type": "string",
            "description": "Başlangıç zamanı (saat dilimi içeren ISO 8601).",
            "format": "date-time"
          },
          "name": {
            "type": "string",
            "description": "Müşteri adı.",
            "minLength": 1,
            "maxLength": 120
          },
          "email": {
            "type": "string",
            "description": "Müşteri e-postası.",
            "format": "email",
            "maxLength": 200
          },
          "phone": {
            "type": [
              "string",
              "null"
            ],
            "description": "Müşteri telefonu.",
            "maxLength": 40
          },
          "notes": {
            "type": [
              "string",
              "null"
            ],
            "description": "Not.",
            "maxLength": 1000
          },
          "answers": {
            "type": "object",
            "description": "Ek form alanlarının yanıtları (alan kimliği → değer).",
            "additionalProperties": {
              "oneOf": [
                {
                  "type": "string",
                  "maxLength": 500
                },
                {
                  "type": "boolean"
                }
              ]
            }
          },
          "language": {
            "type": "string",
            "description": "Randevu dili.",
            "enum": [
              "tr",
              "en"
            ],
            "default": "tr"
          },
          "captcha": {
            "type": [
              "string",
              "null"
            ],
            "description": "Doğrulama yanıtı. API isteklerinde gerekmez.",
            "maxLength": 4096
          }
        },
        "additionalProperties": false
      },
      "AppointmentCancel": {
        "type": "object",
        "required": [],
        "properties": {
          "reason": {
            "type": "string",
            "description": "İptal nedeni.",
            "maxLength": 500
          }
        },
        "additionalProperties": false
      },
      "AccountMe": {
        "type": "object",
        "required": [
          "user",
          "balance",
          "token"
        ],
        "properties": {
          "user": {
            "type": "object",
            "required": [
              "id",
              "email",
              "name",
              "plan"
            ],
            "properties": {
              "id": {
                "type": "string",
                "description": "Kullanıcı kimliği."
              },
              "email": {
                "type": "string",
                "description": "E-posta adresi."
              },
              "name": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Ad."
              },
              "plan": {
                "type": "string",
                "description": "Plan kodu."
              }
            },
            "additionalProperties": false,
            "description": "Hesap sahibi."
          },
          "balance": {
            "type": "object",
            "required": [
              "creditKurus"
            ],
            "properties": {
              "creditKurus": {
                "type": "integer",
                "description": "Kredi bakiyesi (kuruş)."
              }
            },
            "additionalProperties": false,
            "description": "Bakiye."
          },
          "token": {
            "type": "object",
            "required": [
              "name",
              "scopes",
              "expiresAt"
            ],
            "properties": {
              "name": {
                "type": "string",
                "description": "Anahtar adı."
              },
              "scopes": {
                "type": "array",
                "description": "Anahtarın izinleri.",
                "items": {
                  "type": "string",
                  "enum": [
                    "account:read",
                    "projects:read",
                    "content:read",
                    "content:write",
                    "content:publish",
                    "reports:read"
                  ]
                }
              },
              "expiresAt": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Son kullanma zamanı; süresizse `null`.",
                "format": "date-time"
              }
            },
            "additionalProperties": false,
            "description": "İsteği yapan anahtar."
          }
        },
        "additionalProperties": false
      },
      "ProjectList": {
        "type": "object",
        "required": [
          "projects"
        ],
        "properties": {
          "projects": {
            "type": "array",
            "description": "Erişilebilen projeler.",
            "items": {
              "type": "object",
              "required": [
                "id",
                "name",
                "domain",
                "language"
              ],
              "properties": {
                "id": {
                  "type": "string",
                  "description": "Anahtarın bağlı olduğu proje."
                },
                "name": {
                  "type": "string",
                  "description": "Proje adı."
                },
                "domain": {
                  "type": "string",
                  "description": "Projenin alan adı."
                },
                "language": {
                  "type": "string",
                  "description": "Proje dili."
                }
              },
              "additionalProperties": false
            }
          }
        },
        "additionalProperties": false
      },
      "ArticleList": {
        "type": "object",
        "required": [
          "page",
          "pageSize",
          "total",
          "items"
        ],
        "properties": {
          "page": {
            "type": "integer",
            "description": "Sayfa numarası."
          },
          "pageSize": {
            "type": "integer",
            "description": "Sayfa başına kayıt sayısı."
          },
          "total": {
            "type": "integer",
            "description": "Toplam kayıt sayısı."
          },
          "items": {
            "type": "array",
            "description": "Yazılar.",
            "items": {
              "type": "object",
              "required": [
                "id",
                "title",
                "status",
                "kind",
                "wordCount",
                "externalUrl",
                "publishedAt",
                "createdAt"
              ],
              "properties": {
                "id": {
                  "type": "string",
                  "description": "Yazı kimliği."
                },
                "title": {
                  "type": "string",
                  "description": "Başlık."
                },
                "status": {
                  "type": "string",
                  "description": "Yazının durumu.",
                  "enum": [
                    "QUEUED",
                    "GENERATING",
                    "GENERATED",
                    "DRAFT",
                    "DELIVERED",
                    "PUBLISHING",
                    "PUBLISHED",
                    "PUBLISHED_UNVERIFIED",
                    "MISSING_ON_SITE",
                    "ARCHIVED",
                    "FAILED"
                  ]
                },
                "kind": {
                  "type": "string",
                  "description": "Yazı türü."
                },
                "wordCount": {
                  "type": "integer",
                  "description": "Kelime sayısı."
                },
                "externalUrl": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Sitedeki adres."
                },
                "publishedAt": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Yayın zamanı.",
                  "format": "date-time"
                },
                "createdAt": {
                  "type": "string",
                  "description": "Oluşturulma zamanı.",
                  "format": "date-time"
                }
              },
              "additionalProperties": false
            }
          }
        },
        "additionalProperties": false
      },
      "ArticleCreate": {
        "type": "object",
        "required": [
          "topic",
          "keywords"
        ],
        "properties": {
          "topic": {
            "type": "string",
            "description": "Yazının konusu.",
            "minLength": 3,
            "maxLength": 300
          },
          "keywords": {
            "type": "array",
            "description": "Anahtar kelimeler.",
            "items": {
              "type": "string",
              "minLength": 1,
              "maxLength": 100
            },
            "minItems": 1,
            "maxItems": 10
          },
          "kind": {
            "type": "string",
            "description": "Yazı türü; gönderilmezse `BLOG`.",
            "enum": [
              "BLOG",
              "LANDING",
              "FAQ",
              "PROMO"
            ],
            "default": "BLOG"
          },
          "language": {
            "type": "string",
            "description": "Dil kodu; gönderilmezse proje dili kullanılır.",
            "minLength": 2,
            "maxLength": 5
          },
          "length": {
            "type": "string",
            "description": "Uzunluk; gönderilmezse `SHORT`.",
            "enum": [
              "SHORT",
              "MEDIUM",
              "LONG"
            ],
            "default": "SHORT"
          },
          "model": {
            "type": "string",
            "description": "Üretim modeli; gönderilmezse varsayılan model kullanılır.",
            "maxLength": 40
          }
        },
        "additionalProperties": false
      },
      "ArticleAccepted": {
        "type": "object",
        "required": [
          "id",
          "status",
          "cached"
        ],
        "properties": {
          "id": {
            "type": "string",
            "description": "Yazı kimliği."
          },
          "status": {
            "type": "string",
            "description": "Yazının durumu.",
            "enum": [
              "QUEUED",
              "GENERATING",
              "GENERATED",
              "DRAFT",
              "DELIVERED",
              "PUBLISHING",
              "PUBLISHED",
              "PUBLISHED_UNVERIFIED",
              "MISSING_ON_SITE",
              "ARCHIVED",
              "FAILED"
            ]
          },
          "cached": {
            "type": "boolean",
            "description": "Aynı istek için hazır yazı döndüyse `true`; bu durumda yeni ücret alınmaz."
          }
        },
        "additionalProperties": false
      },
      "LiveEditView": {
        "type": "object",
        "required": [
          "editable",
          "channel",
          "state",
          "at",
          "failKey",
          "canDiscard"
        ],
        "properties": {
          "editable": {
            "type": "boolean",
            "description": "Yayındaki yazı düzenlenebiliyorsa `true`."
          },
          "channel": {
            "type": [
              "string",
              "null"
            ],
            "description": "Teslim kanalı."
          },
          "state": {
            "type": "string",
            "description": "Senkron durumu.",
            "enum": [
              "clean",
              "dirty",
              "pending",
              "synced",
              "failed"
            ]
          },
          "at": {
            "type": [
              "string",
              "null"
            ],
            "description": "Durumun son değiştiği an.",
            "format": "date-time"
          },
          "failKey": {
            "type": [
              "string",
              "null"
            ],
            "description": "Başarısız senkronun metin anahtarı."
          },
          "canDiscard": {
            "type": "boolean",
            "description": "Değişiklik geri alınabiliyorsa `true`."
          }
        },
        "additionalProperties": false
      },
      "Article": {
        "type": "object",
        "required": [
          "id",
          "projectId",
          "title",
          "status",
          "kind",
          "language",
          "keywords",
          "slug",
          "excerpt",
          "metaTitle",
          "metaDescription",
          "bodyHtml",
          "wordCount",
          "externalUrl",
          "publishedAt",
          "createdAt",
          "updatedAt",
          "canEdit",
          "live",
          "checks",
          "blocking"
        ],
        "properties": {
          "id": {
            "type": "string",
            "description": "Yazı kimliği."
          },
          "projectId": {
            "type": [
              "string",
              "null"
            ],
            "description": "Anahtarın bağlı olduğu proje."
          },
          "title": {
            "type": "string",
            "description": "Başlık."
          },
          "status": {
            "type": "string",
            "description": "Yazının durumu.",
            "enum": [
              "QUEUED",
              "GENERATING",
              "GENERATED",
              "DRAFT",
              "DELIVERED",
              "PUBLISHING",
              "PUBLISHED",
              "PUBLISHED_UNVERIFIED",
              "MISSING_ON_SITE",
              "ARCHIVED",
              "FAILED"
            ]
          },
          "kind": {
            "type": "string",
            "description": "Yazı türü."
          },
          "language": {
            "type": "string",
            "description": "Yazının dili."
          },
          "keywords": {
            "type": "array",
            "description": "Anahtar kelimeler.",
            "items": {
              "type": "string"
            }
          },
          "slug": {
            "type": [
              "string",
              "null"
            ],
            "description": "Adres kısa adı. Yayındaki yazıda değişmez."
          },
          "excerpt": {
            "type": [
              "string",
              "null"
            ],
            "description": "Kısa özet."
          },
          "metaTitle": {
            "type": [
              "string",
              "null"
            ],
            "description": "Meta başlık."
          },
          "metaDescription": {
            "type": [
              "string",
              "null"
            ],
            "description": "Meta açıklama."
          },
          "bodyHtml": {
            "type": [
              "string",
              "null"
            ],
            "description": "HTML gövde. Güvenli etiketler dışındakiler temizlenir."
          },
          "wordCount": {
            "type": "integer",
            "description": "Kelime sayısı."
          },
          "externalUrl": {
            "type": [
              "string",
              "null"
            ],
            "description": "Sitedeki adres."
          },
          "publishedAt": {
            "type": [
              "string",
              "null"
            ],
            "description": "Yayın zamanı.",
            "format": "date-time"
          },
          "createdAt": {
            "type": "string",
            "description": "Oluşturulma zamanı.",
            "format": "date-time"
          },
          "updatedAt": {
            "type": "string",
            "description": "Son değişiklik zamanı.",
            "format": "date-time"
          },
          "canEdit": {
            "type": "boolean",
            "description": "Yazı düzenlenebiliyorsa `true`."
          },
          "live": {
            "description": "Yayındaki yazının senkron bilgisi; yayında değilse `null`.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/LiveEditView"
              },
              {
                "type": "null"
              }
            ]
          },
          "checks": {
            "type": "array",
            "description": "İçerik denetimlerinin sonuçları.",
            "items": {
              "type": "object",
              "required": [
                "id",
                "ok",
                "level"
              ],
              "properties": {
                "id": {
                  "type": "string",
                  "description": "Denetim kimliği."
                },
                "ok": {
                  "type": "boolean",
                  "description": "Denetim geçtiyse `true`."
                },
                "level": {
                  "type": "string",
                  "description": "Denetimin önem düzeyi.",
                  "enum": [
                    "block",
                    "warn"
                  ]
                },
                "value": {
                  "description": "Ölçülen değer.",
                  "type": [
                    "number",
                    "string"
                  ]
                },
                "limit": {
                  "type": "string",
                  "description": "Beklenen sınır."
                },
                "items": {
                  "type": "array",
                  "description": "Denetime takılan öğeler.",
                  "items": {
                    "type": "string"
                  }
                }
              },
              "additionalProperties": false
            }
          },
          "blocking": {
            "type": "array",
            "description": "Yayını engelleyen denetimlerin kimlikleri.",
            "items": {
              "type": "string"
            }
          }
        },
        "additionalProperties": false
      },
      "ArticlePatch": {
        "type": "object",
        "required": [],
        "properties": {
          "title": {
            "type": "string",
            "description": "Başlık.",
            "minLength": 1,
            "maxLength": 200
          },
          "bodyHtml": {
            "type": "string",
            "description": "HTML gövde. Güvenli etiketler dışındakiler temizlenir.",
            "maxLength": 200000
          },
          "excerpt": {
            "type": [
              "string",
              "null"
            ],
            "description": "Kısa özet.",
            "maxLength": 600
          },
          "metaTitle": {
            "type": [
              "string",
              "null"
            ],
            "description": "Meta başlık.",
            "maxLength": 200
          },
          "metaDescription": {
            "type": [
              "string",
              "null"
            ],
            "description": "Meta açıklama.",
            "maxLength": 500
          },
          "slug": {
            "type": "string",
            "description": "Adres kısa adı. Yayındaki yazıda değişmez.",
            "maxLength": 160
          }
        },
        "additionalProperties": false
      },
      "ArticlePatched": {
        "type": "object",
        "required": [
          "id",
          "status",
          "blocking"
        ],
        "properties": {
          "id": {
            "type": "string",
            "description": "Yazı kimliği."
          },
          "status": {
            "type": "string",
            "description": "Yazının durumu.",
            "enum": [
              "QUEUED",
              "GENERATING",
              "GENERATED",
              "DRAFT",
              "DELIVERED",
              "PUBLISHING",
              "PUBLISHED",
              "PUBLISHED_UNVERIFIED",
              "MISSING_ON_SITE",
              "ARCHIVED",
              "FAILED"
            ]
          },
          "blocking": {
            "type": "array",
            "description": "Yayını engelleyen denetimlerin kimlikleri.",
            "items": {
              "type": "string"
            }
          }
        },
        "additionalProperties": false
      },
      "ArticlePublish": {
        "type": "object",
        "required": [
          "publishMode"
        ],
        "properties": {
          "publishMode": {
            "type": "string",
            "description": "`DRAFT_REVIEW` sitede taslak oluşturur, `PUBLISH` yayınlar.",
            "enum": [
              "DRAFT_REVIEW",
              "PUBLISH"
            ]
          },
          "categoryId": {
            "type": "string",
            "description": "Sitenizdeki kategori kimliği.",
            "maxLength": 64
          },
          "scheduleAt": {
            "type": "string",
            "description": "İleri tarihli yayın zamanı (saat dilimi içeren ISO 8601).",
            "format": "date-time"
          }
        },
        "additionalProperties": false
      },
      "PublishResult": {
        "type": "object",
        "required": [
          "state"
        ],
        "properties": {
          "state": {
            "type": "string",
            "description": "Teslim sonucu. `failed` da 200 ile döner; `code` nedeni bildirir.",
            "enum": [
              "already_published",
              "not_ready",
              "archived",
              "delivered",
              "draft",
              "publishing",
              "unverified",
              "scheduled",
              "failed"
            ]
          },
          "channel": {
            "type": "string",
            "description": "Teslim kanalı."
          },
          "reason": {
            "type": "string",
            "description": "`archived` durumunda neden.",
            "enum": [
              "manual",
              "noChannel",
              "cannotPublish"
            ]
          },
          "mailed": {
            "type": "boolean",
            "description": "`archived` durumunda bilgilendirme e-postası gittiyse `true`."
          },
          "at": {
            "type": "string",
            "description": "`scheduled` durumunda yayın zamanı.",
            "format": "date-time"
          },
          "code": {
            "type": "string",
            "description": "`failed` durumunda hata kodu."
          }
        },
        "additionalProperties": false
      },
      "ProjectReport": {
        "type": "object",
        "required": [
          "days",
          "byStatus",
          "creditKurus",
          "blogPlan"
        ],
        "properties": {
          "days": {
            "type": "integer",
            "description": "Raporun kapsadığı gün sayısı."
          },
          "byStatus": {
            "type": "object",
            "description": "Duruma göre yazı sayıları.",
            "propertyNames": {
              "enum": [
                "QUEUED",
                "GENERATING",
                "GENERATED",
                "DRAFT",
                "DELIVERED",
                "PUBLISHING",
                "PUBLISHED",
                "PUBLISHED_UNVERIFIED",
                "MISSING_ON_SITE",
                "ARCHIVED",
                "FAILED"
              ]
            },
            "additionalProperties": {
              "type": "integer"
            }
          },
          "creditKurus": {
            "type": "integer",
            "description": "Harcanan kredi (kuruş)."
          },
          "blogPlan": {
            "type": "object",
            "required": [
              "month",
              "planned",
              "done",
              "waiting",
              "review",
              "failed",
              "skipped",
              "left"
            ],
            "properties": {
              "month": {
                "type": "string",
                "description": "Ay (YYYY-AA)."
              },
              "planned": {
                "type": "integer",
                "description": "Planlanan yazı."
              },
              "done": {
                "type": "integer",
                "description": "Tamamlanan yazı."
              },
              "waiting": {
                "type": "integer",
                "description": "Sırada bekleyen yazı."
              },
              "review": {
                "type": "integer",
                "description": "Onay bekleyen yazı."
              },
              "failed": {
                "type": "integer",
                "description": "Başarısız yazı."
              },
              "skipped": {
                "type": "integer",
                "description": "Atlanan yazı."
              },
              "left": {
                "type": "integer",
                "description": "Kalan yazı."
              }
            },
            "additionalProperties": false,
            "description": "Bu ayın blog planı."
          }
        },
        "additionalProperties": false
      },
      "EventEnvelope": {
        "type": "object",
        "required": [
          "id",
          "type",
          "occurredAt",
          "projectId",
          "data"
        ],
        "properties": {
          "id": {
            "type": "string",
            "description": "Olay kimliği."
          },
          "type": {
            "type": "string",
            "description": "Olay adı.",
            "enum": [
              "fix.ready",
              "form.submission.created",
              "chat.conversation.started",
              "chat.lead.captured",
              "chat.handoff.requested",
              "chat.message.created",
              "chat.conversation.closed",
              "booking.appointment.created",
              "booking.appointment.confirmed",
              "booking.appointment.rescheduled",
              "booking.appointment.cancelled",
              "social.comment.created",
              "review.created",
              "content.published",
              "content.updated"
            ]
          },
          "occurredAt": {
            "type": "string",
            "description": "Olayın gerçekleştiği an.",
            "format": "date-time"
          },
          "projectId": {
            "type": "string",
            "description": "Olayın ait olduğu proje."
          },
          "data": {
            "description": "Olaya özgü veri."
          }
        },
        "additionalProperties": false
      }
    }
  }
}
