{
  "openapi": "3.0.0",
  "info": {
    "title": "Depiar B2B API",
    "description": "Depiar Yapay Zeka Stüdyosu REST API Dokümantasyonu. Sektör lideri ses sentezleme (TTS), Video Dublaj Pipeline'ı, Ses Klonlama (Voice Cloning), AI Müzik Cover ve Altyazı Stüdyosu özelliklerini kendi uygulamalarınıza entegre edin.",
    "version": "1.0.0",
    "contact": {
      "name": "Depiar Developer Support",
      "url": "https://depiar.com"
    }
  },
  "servers": [
    {
      "url": "http://localhost:3000",
      "description": "Local Development"
    },
    {
      "url": "https://api.depiar.com",
      "description": "Production API"
    }
  ],
  "components": {
    "securitySchemes": {
      "bearerAuth": {
        "type": "http",
        "scheme": "bearer",
        "bearerFormat": "API_KEY",
        "description": "Yetkilendirme için geçerli bir Depiar API Anahtarı girin (örnek: sk_xxxx...)"
      }
    },
    "schemas": {
      "Error": {
        "type": "object",
        "properties": {
          "error": {
            "type": "object",
            "properties": {
              "code": { "type": "string", "example": "invalid_request_error" },
              "message": { "type": "string", "example": "voiceId parametresi zorunludur." },
              "param": { "type": "string", "example": "voiceId", "nullable": true }
            }
          }
        }
      },
      "Pagination": {
        "type": "object",
        "properties": {
          "total": { "type": "integer" },
          "limit": { "type": "integer" },
          "offset": { "type": "integer" },
          "hasMore": { "type": "boolean" }
        }
      }
    }
  },
  "security": [
    {
      "bearerAuth": []
    }
  ],
  "paths": {
    "/api/tts": {
      "post": {
        "summary": "Metni Sese Dönüştür (TTS)",
        "tags": ["Text to Speech"],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "text": { "type": "string", "description": "Sentezlenecek metin (maks. 5000 karakter)" },
                  "voiceId": { "type": "string", "description": "Ses modelinin ID'si" },
                  "lang": { "type": "string", "description": "Dil kodu (örn: tr, en). Varsayılan: tr" }
                },
                "required": ["text", "voiceId"]
              }
            }
          }
        },
        "responses": {
          "200": { "description": "Ses başarıyla sentezlendi" },
          "400": { "description": "Eksik veya geçersiz parametreler" },
          "402": { "description": "Yetersiz bakiye" },
          "429": { "description": "Rate limit aşıldı" }
        }
      },
      "get": {
        "summary": "TTS Geçmişini Listele",
        "tags": ["Text to Speech"],
        "parameters": [
          { "name": "limit", "in": "query", "schema": { "type": "integer", "default": 20 } },
          { "name": "offset", "in": "query", "schema": { "type": "integer", "default": 0 } }
        ],
        "responses": {
          "200": { "description": "Geçmiş listesi döndürüldü" }
        }
      },
      "delete": {
        "summary": "TTS Kaydını Sil",
        "tags": ["Text to Speech"],
        "parameters": [
          { "name": "id", "in": "query", "required": true, "schema": { "type": "string" } }
        ],
        "responses": {
          "200": { "description": "Kayıt başarıyla silindi" }
        }
      }
    },
    "/api/voices": {
      "get": {
        "summary": "Kullanılabilir Sesleri Listele",
        "tags": ["Ses Kütüphanesi"],
        "parameters": [
          { "name": "limit", "in": "query", "schema": { "type": "integer", "default": 50 } },
          { "name": "offset", "in": "query", "schema": { "type": "integer", "default": 0 } }
        ],
        "responses": {
          "200": { "description": "Ses listesi" }
        }
      },
      "post": {
        "summary": "Yeni Ses Modeli Yükle / Eğit (Voice Cloning)",
        "tags": ["Ses Kütüphanesi"],
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "properties": {
                  "name": { "type": "string" },
                  "type": { "type": "string", "enum": ["STANDARD", "PRO"], "default": "STANDARD" },
                  "webhookUrl": { "type": "string", "description": "Model eğitimi bittiğinde bildirim gönderilecek URL (Sadece PRO modeller için)" },
                  "file": { "type": "string", "format": "binary" }
                },
                "required": ["name", "file"]
              }
            }
          }
        },
        "responses": {
          "201": { "description": "Ses modeli başarıyla eklendi veya eğitim başladı" }
        }
      }
    },
    "/api/voices/{id}": {
      "delete": {
        "summary": "Ses Modelini Sil",
        "tags": ["Ses Kütüphanesi"],
        "parameters": [
          { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }
        ],
        "responses": {
          "200": { "description": "Ses modeli başarıyla silindi" },
          "404": { "description": "Ses modeli bulunamadı" }
        }
      }
    },
    "/api/cover": {
      "post": {
        "summary": "AI Müzik Cover Üret",
        "tags": ["AI Cover Studio"],
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "properties": {
                  "voiceId": { "type": "string" },
                  "pitch": { "type": "integer", "default": 0 },
                  "isolateVocals": { "type": "boolean", "default": true },
                  "webhookUrl": { "type": "string", "description": "İşlem bittiğinde sonuçları alacağınız bildirim URL'si" },
                  "file": { "type": "string", "format": "binary", "description": "Orijinal Şarkı (maks. 20 MB)" }
                },
                "required": ["voiceId", "file"]
              }
            }
          }
        },
        "responses": {
          "200": { "description": "Cover başarıyla oluşturuldu" },
          "402": { "description": "Yetersiz bakiye" }
        }
      },
      "get": {
        "summary": "Cover Geçmişini Listele",
        "tags": ["AI Cover Studio"],
        "parameters": [
          { "name": "limit", "in": "query", "schema": { "type": "integer", "default": 20 } },
          { "name": "offset", "in": "query", "schema": { "type": "integer", "default": 0 } }
        ],
        "responses": {
          "200": { "description": "Geçmiş listelendi" }
        }
      },
      "delete": {
        "summary": "Cover Kaydını Sil",
        "tags": ["AI Cover Studio"],
        "parameters": [
          { "name": "id", "in": "query", "required": true, "schema": { "type": "string" } }
        ],
        "responses": {
          "200": { "description": "Kayıt silindi" }
        }
      }
    },
    "/api/subtitle/extract": {
      "post": {
        "summary": "Adım 1: Video / Altyazı Ayıkla (Extract)",
        "tags": ["Altyazı Stüdyosu"],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "url": { "type": "string", "description": "YouTube video linki" }
                }
              }
            },
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "properties": {
                  "file": { "type": "string", "format": "binary", "description": ".srt veya .vtt dosyası" }
                }
              }
            }
          }
        },
        "responses": {
          "200": { "description": "Zaman damgalı altyazı objesi döndürülür" }
        }
      }
    },
    "/api/subtitle/translate": {
      "post": {
        "summary": "Adım 2: Altyazı Çevir (Translate)",
        "tags": ["Altyazı Stüdyosu"],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "sourceLang": { "type": "string" },
                  "targetLanguages": { "type": "array", "items": { "type": "string" } },
                  "entries": { "type": "array", "items": { "type": "object" }, "description": "Extract adımından dönen entries listesi" }
                },
                "required": ["targetLanguages", "entries"]
              }
            }
          }
        },
        "responses": {
          "200": { "description": "Çevrilmiş altyazı verisi" }
        }
      }
    },
    "/api/subtitle/tts": {
      "post": {
        "summary": "Adım 3: Senkronize Dublaj Oluştur (Time-Aligned TTS)",
        "tags": ["Altyazı Stüdyosu"],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "voiceId": { "type": "string" },
                  "lang": { "type": "string" },
                  "entries": { "type": "array", "items": { "type": "object" } }
                },
                "required": ["voiceId", "entries"]
              }
            }
          }
        },
        "responses": {
          "200": { "description": "Senkronize edilmiş ses (Dublaj) başarıyla oluşturuldu" }
        }
      }
    },
    "/api/subtitle/history": {
      "get": {
        "summary": "Altyazı Geçmişini Listele",
        "tags": ["Altyazı Stüdyosu"],
        "parameters": [
          { "name": "limit", "in": "query", "schema": { "type": "integer", "default": 20 } },
          { "name": "offset", "in": "query", "schema": { "type": "integer", "default": 0 } }
        ],
        "responses": {
          "200": { "description": "Altyazı geçmişi listesi" }
        }
      },
      "post": {
        "summary": "Altyazı Projesi Kaydet",
        "tags": ["Altyazı Stüdyosu"],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "title": { "type": "string" },
                  "targetLang": { "type": "string" },
                  "entriesJson": { "type": "string" }
                },
                "required": ["title", "targetLang", "entriesJson"]
              }
            }
          }
        },
        "responses": {
          "201": { "description": "Altyazı projesi kaydedildi" }
        }
      },
      "delete": {
        "summary": "Altyazı Projesini Sil",
        "tags": ["Altyazı Stüdyosu"],
        "parameters": [
          { "name": "id", "in": "query", "required": true, "schema": { "type": "string" } }
        ],
        "responses": {
          "200": { "description": "Proje silindi" }
        }
      }
    },
    "/api/upload": {
      "post": {
        "summary": "Video/Ses Dosyası Yükle ve Dublajla",
        "tags": ["Video Dublaj"],
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "properties": {
                  "file": { "type": "string", "format": "binary", "description": "Video veya ses dosyası (maks. 500 MB)" },
                  "sourceLang": { "type": "string", "default": "en" },
                  "targetLang": { "type": "string", "default": "tr" },
                  "autoDub": { "type": "string", "default": "false", "description": "'true' ile tam otomatik dublaj" },
                  "projectName": { "type": "string", "default": "Yeni Proje" },
                  "webhookUrl": { "type": "string", "description": "İşlem tamamlandığında bildirim URL'si" },
                  "speakerCount": { "type": "string", "default": "auto" },
                  "voiceId": { "type": "string", "description": "Tek ses modeli ID'si (opsiyonel)" }
                },
                "required": ["file"]
              }
            }
          }
        },
        "responses": {
          "201": { "description": "Dosya yüklendi, işlem başlatıldı" },
          "402": { "description": "Yetersiz bakiye" }
        }
      }
    },
    "/api/projects": {
      "get": {
        "summary": "Projeleri Listele",
        "tags": ["Video Dublaj"],
        "parameters": [
          { "name": "limit", "in": "query", "schema": { "type": "integer", "default": 20 } },
          { "name": "offset", "in": "query", "schema": { "type": "integer", "default": 0 } }
        ],
        "responses": {
          "200": { "description": "Proje listesi" }
        }
      }
    },
    "/api/projects/{id}": {
      "get": {
        "summary": "Proje Detayı",
        "tags": ["Video Dublaj"],
        "parameters": [
          { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }
        ],
        "responses": {
          "200": { "description": "Proje detayları" }
        }
      },
      "delete": {
        "summary": "Proje Sil",
        "tags": ["Video Dublaj"],
        "parameters": [
          { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }
        ],
        "responses": {
          "200": { "description": "Proje silindi" }
        }
      },
      "patch": {
        "summary": "Proje Güncelle (Segment Düzenleme)",
        "tags": ["Video Dublaj"],
        "parameters": [
          { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "segmentsJson": { "type": "string" }
                },
                "required": ["segmentsJson"]
              }
            }
          }
        },
        "responses": {
          "200": { "description": "Proje güncellendi" }
        }
      }
    },
    "/api/synthesize": {
      "post": {
        "summary": "Manuel Sentez Başlat",
        "tags": ["Video Dublaj"],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "projectId": { "type": "string" },
                  "editedSegments": { "type": "array", "items": { "type": "object" } },
                  "forceSynthIndex": { "type": "integer", "nullable": true },
                  "webhookUrl": { "type": "string", "description": "İşlem tamamlandığında bildirim gönderilecek URL" }
                },
                "required": ["projectId", "editedSegments"]
              }
            }
          }
        },
        "responses": {
          "200": { "description": "Sentez işlemi başlatıldı" }
        }
      }
    },
    "/api/user/balance": {
      "get": {
        "summary": "Bakiye Sorgula",
        "tags": ["Hesap"],
        "responses": {
          "200": { "description": "Bakiye ve plan bilgisi" }
        }
      }
    },
    "/api/dictionary": {
      "get": {
        "summary": "Çeviri Sözlüğü Listele",
        "tags": ["Hesap"],
        "responses": {
          "200": { "description": "Sözlük listesi" }
        }
      },
      "post": {
        "summary": "Sözlüğe Kelime Ekle",
        "tags": ["Hesap"],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "word": { "type": "string" },
                  "translation": { "type": "string" }
                },
                "required": ["word", "translation"]
              }
            }
          }
        },
        "responses": {
          "201": { "description": "Kelime eklendi" }
        }
      }
    },
    "/api/dictionary/{id}": {
      "delete": {
        "summary": "Sözlük Kaydını Sil",
        "tags": ["Hesap"],
        "parameters": [
          { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }
        ],
        "responses": {
          "200": { "description": "Kayıt silindi" }
        }
      },
      "put": {
        "summary": "Sözlük Kaydını Güncelle",
        "tags": ["Hesap"],
        "parameters": [
          { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "word": { "type": "string" },
                  "translation": { "type": "string" }
                },
                "required": ["word", "translation"]
              }
            }
          }
        },
        "responses": {
          "200": { "description": "Kayıt güncellendi" }
        }
      }
    },
    "/api/enhance-script": {
      "post": {
        "summary": "Senaryo Zenginleştir (AI)",
        "tags": ["Yardımcılar"],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "text": { "type": "string", "description": "Zenginleştirilecek senaryo metni (min. 5 kelime)" }
                },
                "required": ["text"]
              }
            }
          }
        },
        "responses": {
          "200": { "description": "Zenginleştirilmiş metin" }
        }
      }
    },
    "/api/recordings": {
      "post": {
        "summary": "Ses Kaydı Yükle",
        "tags": ["Yardımcılar"],
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "properties": {
                  "file": { "type": "string", "format": "binary", "description": "Ses kaydı dosyası (maks. 50 MB)" }
                },
                "required": ["file"]
              }
            }
          }
        },
        "responses": {
          "200": { "description": "Ses kaydı yüklendi" }
        }
      }
    }
  }
}
