{
 "openapi": "3.1.0",
 "info": {
  "title": "Gyro Public API",
  "version": "2.30.0",
  "summary": "Manage Gyro cloud servers, SSH keys and billing programmatically.",
  "x-summary-tr": "Gyro bulut sunucularınızı, SSH anahtarlarınızı ve faturalarınızı programla yönetin.",
  "description": "The Gyro Public API lets you automate everything you do in the Gyro client area:\norder and manage cloud servers, keep SSH keys, read invoices and your account balance.\nIt is the API behind the official Terraform provider (`gyro-hosting/gyro`) and `gyroctl`.\n\n* **Base URL** `https://www.gyrohosting.com/api/v1/client`\n* **Authentication** `Authorization: Bearer wck_...` (create keys in *Client area → account menu (top right) → API Credentials*)\n* **Format** JSON in, JSON out. Successful answers are `{\"data\": ..., \"meta\": ...}`; errors are\n  `{\"error\": {\"code\", \"message\", \"details\"}}`.\n\n**v2**: every product line through the generic service bridge (`/cloud/services`), webhooks, sub-account keys, reseller (bayi) end-customers, and the complete core client API (domains, DNS, tickets, orders, invoices, account) under the same key.\n\n**2.10.0**: region `tr-ist-1` (Gyro Cloud Istanbul) on the same `/cloud/servers` endpoints, CLI commands and Terraform resources; `GET /cloud/images?region=`; SSH keys installed after first boot in tr-ist-1 (`ssh_keys` on the server).\n\n**2.11.0**: prepaid hourly billing from the account balance for Gyro Containers (ECS) and Gyro Cloud Istanbul (`billing: prepaid` on products and servers; `/cloud/billing/balance|usage|statement/{month}|estimate|topup-url`); `/cloud/containers` (Gyro Containers).\n\n**2.13.0 (pre-sale)**: plan change for prepaid services through `/cloud/services/{id}/resize` (no invoice, `plan` name accepted); tr-ist-1 reverse DNS create on new addresses + `status`; prepaid snapshot pricing on `/cloud/servers/{id}/snapshots`.\n\n**2.13.1**: Protected Storage (versioning + object lock / WORM): `object_lock` on bucket create, versions list / restore / undelete / delete, bucket default retention, per-version retention and legal hold, old version expiry, lock summary and scan. Standard Object Storage answers 409 `feature_not_available` on these.\n\n**2.14.0**: tr-ist-1 servers on Gyro Compute: SSH keys (up to 10) and `user_data` at creation through cloud-init (~25 s to SSH), `reset` action, rebuild with `user_data`, real snapshot ids, metrics (instant), browser console URL. Request / response shapes unchanged.\n\n**2.15.0**: custom templates for tr-ist-1 servers: capture a server (`POST /cloud/servers/{id}/templates`), list / rename / delete, new server (`POST /cloud/templates/{id}/servers`) or reinstall (`POST /cloud/templates/{id}/rebuild`) from it. 0.05 EUR per GB-month (prepaid, hourly). No image upload.\n\n**2.16.0**: additional IPv4 addresses for tr-ist-1 servers: `GET/POST /cloud/servers/{id}/ips`, `DELETE /cloud/servers/{id}/ips/{ip}` (hourly from the prepaid balance, default 2 EUR per address-month, up to 5 per server; configured on the server automatically).\n\n**2.16.1**: `GET /cloud/apps` returns `min_ram_gb` (fixed), `min_disk_gb`, `min_cpu`, `popular_tr`, `version`, `license` and `description` for each one-click app. Additive change.\n\n**2.17.0**: Gyro Containers: per-service autoscaling (`PUT /cloud/containers/{id}/services/{name}/autoscaling`, also `autoscaling` / `alerts` on create and update), notification channels (`GET/PUT /cloud/containers/{id}/notifications`, `.../notifications/test`, `.../notifications/webhook-secret`: e-mail, SMS, Telegram, signed webhook). Additive.\n\n**2.17.1**: additional IPv4: each added address is billed at least 6 hours (`pricing.minimum_hours`), per-server add limit per hour (`adds_per_hour`, `adds_left_this_hour`). Additive.\n\n**2.17.2**: tr-ist-1 reverse DNS is published automatically: default PTR `<a-b-c-d>.ip.gyrohosting.com` on every address, custom PTR live within seconds (`status: active`, new `default` flag), removed when the server/IP is released. Additive.\n\n**2.17.3**: tr-ist-1 snapshots: every additional snapshot is billed at least 1 hour (a snapshot created and deleted between two hourly counts is billed too). Text only.\n\n**2.17.4**: Gyro Containers Serverless: `GET /cloud/billing/container-sizes` (vCPU / memory pairs and prices), `POST /cloud/billing/estimate` accepts `{\"type\": \"serverless\", \"cpu_m\", \"memory_mi\", \"count\", \"hours\"}` (no monthly cap, `capped` flag on every item). Additive.\n\n**2.17.5**: mount a Gyro Object Storage bucket on a server: `GET/POST /cloud/servers/{id}/storage-mounts`, `GET/DELETE /cloud/servers/{id}/storage-mounts/{mid}`, `POST .../{mid}/command` (one-line installer, automatic on tr-ist-1; one narrow key per mount; free). Additive.\n\n**2.18.0**: projects: `/cloud/projects` (list/create/get/update/delete, move services), `PUT /cloud/services/{id}/project`, `project` on every service, `?project=` filter, optional `project_id` on order endpoints. Additive.\n\n**2.19.0**: additional disks for tr-ist-1 servers: `GET/POST /cloud/servers/{id}/disks`, `PUT/DELETE /cloud/servers/{id}/disks/{disk}` (ssd or hdd class, per GB, hourly from the prepaid balance; up to 4 disks per server, grow only).\n\n**2.19.1**: `POST /cloud/servers/{id}/actions/rebuild` accepts `app` and `app_domain` (one-click app on top of the reinstall; response `app_install_id`); `POST /cloud/servers/{id}/app` also on tr-ist-1. Install status `kaldirildi` = removed by a later reinstall. Additive.\n\n**2.20.0**: Protected Storage buckets can be mounted on servers (`/cloud/servers/{id}/storage-mounts`, read-only by default, read/write needs `accept_versioning: true`, field `protected`) and renamed (`POST /cloud/storage/{id}/buckets/{bucket}/rename`: display name + website address change, S3 name stays, `s3_name` in bucket lists). Additive.\n\n**2.20.1**: documentation only (example values). No functional change.\n\n**2.21.0**: batch create: `POST /cloud/servers` takes `quantity` (N servers in one order), `name` (`{n}` template) / `tags` and `app`; container environments can be ordered through the API: `GET /cloud/containers/plans`, `POST /cloud/containers` (`quantity`, `name`, `tags`, `project_id`). Additive.\n\n**2.22.0**: container image import: `POST /cloud/containers/{id}/registry/imports` copies an image from Docker Hub, GitHub, Quay or another https registry into the environment's Gyro registry (no `docker push`; optional token, never stored), `GET .../registry/imports` shows progress. Additive.\n\n**2.23.0**: Gyro Pipeline for containers: `/cloud/containers/{id}/pipelines` connects a GitHub / GitLab / Gitea / https git repository; a push or tag (webhook) or `POST .../runs` builds the Dockerfile in an isolated build environment, pushes `<registry>/<code>/<image>:<sha7>` and rolls the target services out with health watch and automatic rollback. Runs, live logs, approval and redeploy under `/cloud/containers/{id}/pipeline-runs/{run}`. Additive.\n\n**2.24.0**: Gyro Pipeline: archive builds (`POST .../pipelines/{pipeline}/uploads` gives a presigned upload URL, tar.gz / zip up to 200 MB, kept 24 h; then `POST .../runs {\"upload_id\"}`; provider `archive` = pipelines without a repository) and private repositories over SSH (`PUT .../deploy-key` creates an ed25519 deploy key, only the public key is returned; `GET/PUT .../host-key` shows and confirms the server key; GitHub / GitLab / Bitbucket keys are pinned). Additive.\n\n**2.24.1**: Containers: `command` / `args` also accept a plain string, split like a shell with quotes respected (invalid JSON array / unclosed quote -> 400). Service updates, restarts and rollbacks are seamless even when the node pool is full (the new copy starts on a shared sandboxed pool and moves back); the response carries `rollout`: `seamless` | `brief_interruption`. Service `state` may be `preparing` (the environment's node is being installed) with `eta_s`. Serverless: at most 672 charged hours a calendar month; billing estimate default `hours` 672, `billed_hours`. Additive.\n\n**2.24.2**: Serverless containers are billed for the full month again: no monthly cap (`capped: false`), billing estimate default `hours` 730 (a full month), `monthly_cap` = 730 hours, `total` = `hours` x hourly; `billed_hours` kept (= `hours`). Replaces the 672-hour serverless ceiling announced in 2.24.1. Capped plans (servers, dedicated nodes) unchanged.\n\n**2.24.3**: Security groups: a rule change that removes or narrows SSH/RDP access for a source on an attached server is a 5 minute trial on every path (API included; before only when the caller's own address was cut); the group object has `trial` and `trial_seconds_left` also while `applying`. Deleting a server removes its group attachments, so the group can be deleted. Group changes are written to each attached server's change log.\n\n**2.24.4**: Container services: a replica count (scale, create, update, autoscaling max) outside the plan limit is refused with 422 `invalid_replicas` and the message names the limit (`details.max`). GET /cloud/servers/{id}: Gyro Compute servers in tr-ist-1 show the SSH keys given at creation (`ssh_keys.fingerprints`, `ssh_keys.key_ids`, `method: cloud-init`; `state: none` when no key was given) instead of null.\n\n**2.25.0**: Object Storage and Protected Storage can be ordered through the API: `GET /cloud/storage/plans`, `POST /cloud/storage` (plan, cycle, quantity, extra_traffic, object_lock_buckets, name/tags/project_id; paid from the balance), `GET /cloud/storage`, `GET|DELETE /cloud/storage/{id}`. Plan change: documented data safety, `data_preserved`/`disk`/`restart` in the answer, resize-options marks smaller-disk plans `allowed: false` and a smaller disk is refused with 409 `disk_shrink` already in `dry_run`; clearer `recreate_required` message. Additive.\n\n**Limits**: every account limit and its usage is listed by `GET /cloud/account/limits` (`gyro limits`). **Account limits are raised with a support ticket** (`POST /api/v1/client/tickets`, `gyro ticket create`). Every refusal caused by a limit carries `error.details.limit_exceeded: true`, `limit_key`, `limit`, `current`, `how_to_increase` and a ready `support_ticket` request.\n\n**2.26.0**: `GET /cloud/account/limits`; structured limit hint in limit errors (new-account limit of the prepaid cloud now answers `limit_exceeded` instead of `checkout_blocked`, original code in `details.reason`); dry-run quotes of servers, container environments and templates show `quote.limit_exceeded`; new-account limit raised to 5 servers. Additive.\n\n**2.27.0**: `GET /cloud/containers/{id}` (environment detail: Kubernetes `namespace`, in-cluster addressing `cluster_dns`, `egress_ips`) and `GET /cloud/containers/{id}/egress-ips` (current egress IPv4 addresses for IP allow lists; dedicated = own nodes + shared pool during updates, serverless = shared pool); service detail has `internal` (`<service>.<namespace>.svc.cluster.local:80`), service list `internal_address`; egress IP changes are notified (alert event `egress`). Additive.\n\n**2.27.1**: `PUT /cloud/containers/{id}/services/{name}/env` rejects unknown fields and empty changes with 422 `invalid_env` (was: success without change).\n\n**2.28.0**: Gyro Pipeline `build_target` (create / update / get): build a named stage of a multi-stage Dockerfile (`docker build --target`); empty = last stage; unknown stage = run error `build_target_not_found`; also `build_target:` in gyro-pipeline.yml. Additive.\n\n**2.28.1**: the limit hint (`details.limit_exceeded`, `how_to_increase`, \"This limit can be raised with a support ticket\") is added only to real account / plan limit refusals; input validation errors that mention a maximum length or count (\"at most 64 characters\") no longer get it. Module limits now name their `limit_key` (e.g. `compute.extra_ips`, `s3.max_buckets`, `dns.max_zones`, `gfw.rules_per_server`); plan limits answer `how_to_increase: upgrade_plan`, hourly ones `wait`.\n\n**2.28.2**: pipeline create no longer lists `repo` as required: it is required for git providers and must be left out for `provider: archive`. Container services: `alerts` given on create / update is applied (the service view now also shows it at the top level, `alerts.min_ready`, 0 = off); unknown fields inside `alerts` or `autoscaling` are refused with 422 `invalid_alerts` / `invalid_autoscaling` instead of being ignored.\n\n**2.29.0**: private networks (VPC) for tr-ist-1: `/cloud/vpcs` (create, rename, delete), subnets, the VPC gateway (NAT, port forwards, inter-subnet rule; hourly prepaid while on, 4.99 EUR/month cap), server cards `/cloud/servers/{id}/nics` and turning the public IPv4 off/on `/cloud/servers/{id}/public-ip`. Additive.\n\n**2.30.0**: container extra nodes `PUT /cloud/containers/{id}/nodes` (same price as a plan node, hourly; removal drains first), egress change advance notice (`egress_change`, `pending_egress_ips`) with an optional approval step (`PUT .../egress-approval`, `POST .../egress-change/approve`), and `DELETE /cloud/containers/{id}` (prepaid environment delete, same as the panel). Additive.\n",
  "x-description-tr": "Gyro Public API, müşteri panelinde yaptığınız her işi otomatikleştirmenizi sağlar:\nbulut sunucu siparişi ve yönetimi, SSH anahtarları, fatura ve bakiye okuma.\nResmi Terraform sağlayıcısı (`gyro-hosting/gyro`) ve `gyroctl` bu API'yi kullanır.\n\n* **Taban adres** `https://www.gyrohosting.com/api/v1/client`\n* **Kimlik** `Authorization: Bearer wck_...` (anahtarı *Müşteri paneli → sağ üstteki hesap menüsü → API Kimlik Bilgileri* bölümünden oluşturun)\n* **Biçim** JSON gönderilir, JSON döner. Başarılı yanıt `{\"data\": ..., \"meta\": ...}`, hata\n  `{\"error\": {\"code\", \"message\", \"details\"}}` biçimindedir.\n\n**v2**: genel hizmet köprüsüyle tüm ürün hatları (`/cloud/services`), webhook'lar, alt hesap anahtarları, bayi uç-müşterileri ve aynı anahtarla çekirdek müşteri API'sinin tamamı (alan adı, DNS, destek, sipariş, fatura, hesap).\n\n**2.10.0**: aynı `/cloud/servers` uçları, CLI komutları ve Terraform kaynaklarıyla `tr-ist-1` bölgesi (Gyro Bulut İstanbul); `GET /cloud/images?region=`; tr-ist-1'de SSH anahtarları ilk açılıştan sonra yüklenir (sunucuda `ssh_keys`).\n\n**2.11.0**: Gyro Kapsayıcı (ECS) ve Gyro Bulut İstanbul için bakiyeden saatlik ön ödemeli faturalama (ürün ve sunucularda `billing: prepaid`; `/cloud/billing/balance|usage|statement/{month}|estimate|topup-url`); `/cloud/containers` (Gyro Kapsayıcı).\n\n**2.13.0 (satış öncesi)**: ön ödemeli hizmetlerde `/cloud/services/{id}/resize` ile plan değişikliği (fatura yok, `plan` adı kabul edilir); tr-ist-1'de yeni IP'de ters DNS oluşturma + `status`; ön ödemeli snapshot fiyatı.\n\n**2.13.1**: Korumalı Depolama (sürümleme + nesne kilidi / WORM): kova açılışında `object_lock`, sürüm listele / geri yükle / silme işaretini kaldır / kalıcı sil, kova varsayılan saklaması, sürüm başına saklama ve legal hold, eski sürüm silme süresi, kilit özeti ve tarama. Standart Nesne Depolama bu uçlarda 409 `feature_not_available` döner.\n\n**2.14.0**: tr-ist-1 sunucuları Gyro Compute üzerinde: oluşturmada cloud-init ile SSH anahtarları (en çok 10) ve `user_data` (SSH'a ~25 sn), `reset` eylemi, `user_data` ile yeniden kurulum, gerçek snapshot numaraları, anlık metrikler, tarayıcı konsolu adresi. İstek / yanıt biçimleri değişmedi.\n\n**2.15.0**: tr-ist-1 sunucuları için özel şablonlar: sunucudan şablon (`POST /cloud/servers/{id}/templates`), listele / adlandır / sil, şablondan yeni sunucu (`POST /cloud/templates/{id}/servers`) ya da yeniden kurulum (`POST /cloud/templates/{id}/rebuild`). GB başına aylık 0,05 € (ön ödemeli, saatlik). Dışarıdan imaj yüklenmez.\n\n**2.16.0**: tr-ist-1 sunucularına ek IPv4: `GET/POST /cloud/servers/{id}/ips`, `DELETE /cloud/servers/{id}/ips/{ip}` (ön ödemeli bakiyeden saatlik, varsayılan adres başına aylık 2 €, sunucu başına en çok 5; sunucuya otomatik tanımlanır).\n\n**2.16.1**: `GET /cloud/apps` her tek tık uygulama için `min_ram_gb` (düzeltildi), `min_disk_gb`, `min_cpu`, `popular_tr` (Türkiye'de popüler), `version`, `license` ve `description` döndürür. Geriye uyumlu ekleme.\n\n**2.17.0**: Gyro Kapsayıcı: servis başına otomatik ölçekleme (`PUT /cloud/containers/{id}/services/{name}/autoscaling`, oluştur/güncellemede `autoscaling` / `alerts`), bildirim kanalları (`GET/PUT /cloud/containers/{id}/notifications`, `.../notifications/test`, `.../notifications/webhook-secret`: e-posta, SMS, Telegram, imzalı webhook). Geriye uyumlu.\n\n**2.17.1**: ek IPv4: her eklenen adres en az 6 saat ücretlendirilir (`pricing.minimum_hours`), sunucu başına saatlik ekleme sınırı (`adds_per_hour`, `adds_left_this_hour`). Geriye uyumlu.\n\n**2.17.2**: tr-ist-1 ters DNS otomatik yayında: her adreste varsayılan PTR `<a-b-c-d>.ip.gyrohosting.com`, özel PTR saniyeler içinde (`status: active`, yeni `default` alanı), sunucu/IP bırakılınca silinir. Geriye uyumlu.\n\n**2.17.3**: tr-ist-1 snapshot: her ek snapshot en az 1 saat ücretlenir (iki saatlik sayım arasında oluşturulup silinen de). Yalnız metin.\n\n**2.17.4**: Gyro Kapsayıcı Sunucusuz: `GET /cloud/billing/container-sizes` (vCPU / bellek çiftleri ve fiyatlar), `POST /cloud/billing/estimate` `{\"type\": \"serverless\", \"cpu_m\", \"memory_mi\", \"count\", \"hours\"}` kabul eder (aylık tavan yok, her kalemde `capped`). Geriye uyumlu.\n\n**2.17.5**: Nesne Depolama kovasını sunucuya bağlama: `GET/POST /cloud/servers/{id}/storage-mounts`, `GET/DELETE /cloud/servers/{id}/storage-mounts/{mid}`, `POST .../{mid}/command` (tek satır kurulum, tr-ist-1'de otomatik; bağlantı başına dar anahtar; ücretsiz). Geriye uyumlu.\n\n**2.18.0**: projeler: `/cloud/projects` (listele/oluştur/getir/güncelle/sil, hizmet taşı), `PUT /cloud/services/{id}/project`, her hizmette `project`, `?project=` süzgeci, sipariş uçlarında isteğe bağlı `project_id`. Geriye uyumlu.\n\n**2.19.0**: tr-ist-1 sunucularına ek disk: `GET/POST /cloud/servers/{id}/disks`, `PUT/DELETE /cloud/servers/{id}/disks/{disk}` (ssd ya da hdd sınıfı, GB başına, ön ödemeli bakiyeden saatlik; sunucu başına en çok 4 disk, yalnız büyür).\n\n**2.19.1**: `POST /cloud/servers/{id}/actions/rebuild` `app` ve `app_domain` alır (yeniden kurulum + tek tıkla uygulama; yanıtta `app_install_id`); `POST /cloud/servers/{id}/app` tr-ist-1'de de çalışır. Kurulum durumu `kaldirildi` = sonraki yeniden kurulumla kaldırıldı. Geriye uyumlu.\n\n**2.20.0**: Korumalı Depolama kovaları sunucuya bağlanabilir (varsayılan salt okuma, okuma-yazma `accept_versioning: true` ister, `protected` alanı) ve adı değiştirilebilir (görünen ad + web adresi değişir, S3 adı sabit, kova listelerinde `s3_name`). Geriye uyumlu.\n\n**2.20.1**: yalnız belge (örnek değerler). İşlev değişikliği yok.\n\n**2.21.0**: toplu oluşturma: `POST /cloud/servers` `quantity` (tek siparişte N sunucu), `name` (`{n}` şablonu) / `tags` ve `app` alır; kapsayıcı ortamları API ile açılabilir: `GET /cloud/containers/plans`, `POST /cloud/containers` (`quantity`, `name`, `tags`, `project_id`). Geriye uyumlu.\n\n**2.22.0**: kapsayıcı imaj içe aktarma: `POST /cloud/containers/{id}/registry/imports` Docker Hub, GitHub, Quay ya da başka bir https depodaki imajı ortamın Gyro deposuna kopyalar (`docker push` yok; isteğe bağlı token saklanmaz), `GET .../registry/imports` ilerlemeyi gösterir. Geriye uyumlu.\n\n**2.23.0**: Kapsayıcılar için Gyro Pipeline: `/cloud/containers/{id}/pipelines` GitHub / GitLab / Gitea / https git deposu bağlar; push ya da etiket (webhook) veya `POST .../runs` Dockerfile'ı yalıtılmış ortamda derler, `<depo>/<kod>/<imaj>:<sha7>` olarak yükler ve hedef servisleri sağlık kontrolü + otomatik geri dönüşle yeni sürüme geçirir. Çalıştırmalar, canlı log, onay ve yeniden dağıtım `/cloud/containers/{id}/pipeline-runs/{run}` altında. Geriye uyumlu.\n\n**2.24.0**: Gyro Pipeline: arşivden derleme (`POST .../pipelines/{pipeline}/uploads` ön imzalı yükleme adresi verir, tar.gz / zip en çok 200 MB, 24 saat saklanır; sonra `POST .../runs {\"upload_id\"}`; provider `archive` = depo olmadan) ve SSH ile özel depolar (`PUT .../deploy-key` ed25519 deploy key üretir, yalnız açık anahtar döner; `GET/PUT .../host-key` sunucu anahtarını gösterir ve onaylar; GitHub / GitLab / Bitbucket anahtarları sabit). Geriye uyumlu.\n\n**2.24.1**: Kapsayıcı: `command` / `args` düz metin de kabul eder, tırnaklara uyan kabuk bölmesiyle (geçersiz JSON dizi / kapanmamış tırnak -> 400). Servis güncelleme, yeniden başlatma ve geri alma düğüm havuzu doluyken de kesintisiz (yeni kopya paylaşımlı yalıtılmış alanda başlar, sonra geri döner); yanıtta `rollout`: `seamless` | `brief_interruption`. Servis `state` değeri `preparing` olabilir (ortamın düğümü kuruluyor), `eta_s` ile. Sunucusuz: bir takvim ayında en çok 672 saat ücretlenir; ücret tahmininde varsayılan `hours` 672, `billed_hours`. Geriye uyumlu.\n\n**2.24.2**: Sunucusuz kapsayıcılar yeniden tam ay ücretlenir: aylık tavan yok (`capped: false`), ücret tahmininde varsayılan `hours` 730 (tam ay), `monthly_cap` = 730 saat, `total` = `hours` x saatlik; `billed_hours` korunur (= `hours`). 2.24.1'deki 672 saatlik Sunucusuz tavanının yerine geçer. Tavanlı planlar (sunucu, ayrılmış düğüm) değişmedi.\n\n**2.24.3**: Güvenlik grupları: bağlı bir sunucuda bir kaynağın SSH/RDP erişimini kaldıran ya da daraltan kural değişikliği her yoldan (API dahil; önceden yalnız çağıranın kendi adresi kesilince) 5 dakikalık denemedir; grup nesnesinde `trial` ve `trial_seconds_left` `applying` sırasında da dolu. Sunucu silinince grup bağları kalkar, grup silinebilir. Grup değişiklikleri bağlı her sunucunun değişiklik kaydına yazılır.\n\n**2.24.4**: Kapsayıcı servisleri: plan sınırı dışındaki kopya sayısı (ölçek, oluşturma, güncelleme, otomatik ölçek max) 422 `invalid_replicas` ile reddedilir, mesaj sınırı söyler (`details.max`). GET /cloud/servers/{id}: tr-ist-1 Gyro Compute sunucularında oluşturmada verilen SSH anahtarları görünür (`ssh_keys.fingerprints`, `ssh_keys.key_ids`, `method: cloud-init`; anahtar verilmediyse `state: none`), önceden null idi.\n\n**2.25.0**: Nesne Depolama ve Korumalı Depolama API'den sipariş edilebilir: `GET /cloud/storage/plans`, `POST /cloud/storage` (plan, cycle, quantity, extra_traffic, object_lock_buckets, name/tags/project_id; bakiyeden ödenir), `GET /cloud/storage`, `GET|DELETE /cloud/storage/{id}`. Plan değişikliği: veri güvencesi belgelendi, yanıtta `data_preserved`/`disk`/`restart`, resize-options daha küçük diskli planları `allowed: false` gösterir ve küçük disk `dry_run`'da da 409 `disk_shrink` ile reddedilir; `recreate_required` mesajı netleşti. Geriye uyumlu.\n\n**Sınırlar**: hesabın tüm sınırları ve kullanımı `GET /cloud/account/limits` (`gyro limits`) ile listelenir. **Hesap sınırları destek talebiyle artırılır** (`POST /api/v1/client/tickets`, `gyro ticket create`). Sınır kaynaklı her ret `error.details.limit_exceeded: true`, `limit_key`, `limit`, `current`, `how_to_increase` ve hazır `support_ticket` isteğini taşır.\n\n**2.26.0**: `GET /cloud/account/limits`; sınır hatalarında yapılandırılmış ipucu (ön ödemeli bulutun yeni hesap sınırı artık `checkout_blocked` yerine `limit_exceeded`, eski kod `details.reason`); sunucu, kapsayıcı ortamı ve şablon dry-run tekliflerinde `quote.limit_exceeded`; yeni hesap sınırı 5 sunucu. Geriye uyumlu.\n\n**2.27.0**: `GET /cloud/containers/{id}` (ortam ayrıntısı: Kubernetes `namespace`, iç adresleme `cluster_dns`, `egress_ips`) ve `GET /cloud/containers/{id}/egress-ips` (IP beyaz listesi için güncel çıkış IPv4 adresleri; ayrılmış = kendi düğümleri + güncellemede paylaşımlı havuz, sunucusuz = paylaşımlı havuz); servis ayrıntısında `internal` (`<servis>.<namespace>.svc.cluster.local:80`), servis listesinde `internal_address`; çıkış IP değişikliği bildirilir (uyarı olayı `egress`). Geriye uyumlu.\n\n**2.27.1**: `PUT /cloud/containers/{id}/services/{name}/env` bilinmeyen alanı ve boş değişikliği 422 `invalid_env` ile reddeder (önce: değişiklik olmadan başarı).\n\n**2.28.0**: Gyro Pipeline `build_target` (oluştur / değiştir / oku): çok aşamalı Dockerfile'ın adı verilen aşamasını derler (`docker build --target`); boş = son aşama; olmayan aşama = çalıştırma hatası `build_target_not_found`; gyro-pipeline.yml'de `build_target:`. Geriye uyumlu.\n\n**2.28.1**: sınır ipucu (`details.limit_exceeded`, `how_to_increase`, \"Bu sınır destek talebiyle artırılabilir\") yalnız gerçek hesap / paket sınırı retlerine eklenir; en fazla uzunluk ya da sayı söyleyen girdi doğrulama hataları (\"en fazla 64 karakter\") artık almaz. Modül sınırları `limit_key` adını verir (ör. `compute.extra_ips`, `s3.max_buckets`, `dns.max_zones`, `gfw.rules_per_server`); paket sınırlarında `how_to_increase: upgrade_plan`, saatlik olanlarda `wait`.\n\n**2.28.2**: pipeline oluştururken `repo` artık her zaman zorunlu değil: git sağlayıcıları için zorunlu, `provider: archive` için gönderilmez. Kapsayıcı servisleri: oluştur / güncellemede verilen `alerts` uygulanır (servis görünümünde artık üst düzeyde de `alerts.min_ready` var, 0 = kapalı); `alerts` ya da `autoscaling` içindeki bilinmeyen alan yok sayılmak yerine 422 `invalid_alerts` / `invalid_autoscaling` ile reddedilir.\n\n**2.29.0**: tr-ist-1 için özel ağlar (VPC): `/cloud/vpcs` (oluştur, adlandır, sil), subnetler, VPC kapısı (NAT, port yönlendirme, subnetler arası kural; açıkken saatlik ön ödemeli, ayda en çok 4,99 €), sunucu kartları `/cloud/servers/{id}/nics` ve public IPv4 kapat/aç `/cloud/servers/{id}/public-ip`. Geriye uyumlu.\n\n**2.30.0**: kapsayıcı ek düğüm `PUT /cloud/containers/{id}/nodes` (paketteki düğümle aynı fiyat, saatlik; çıkarma önce boşaltır), çıkış IP değişikliğinin önceden duyurusu (`egress_change`, `pending_egress_ips`) ve isteğe bağlı onay adımı (`PUT .../egress-approval`, `POST .../egress-change/approve`), `DELETE /cloud/containers/{id}` (ön ödemeli ortamı silme, panelle aynı). Geriye uyumlu.\n",
  "contact": {
   "name": "Gyro Hosting",
   "url": "https://www.gyrohosting.com"
  },
  "license": {
   "name": "Proprietary",
   "identifier": "LicenseRef-Gyro-API-Terms"
  }
 },
 "servers": [
  {
   "url": "https://www.gyrohosting.com/api/v1/client",
   "description": "Production"
  }
 ],
 "security": [
  {
   "bearerAuth": []
  }
 ],
 "tags": [
  {
   "name": "Servers",
   "description": "Cloud servers you own. Creating one places an order paid from your account balance.",
   "x-description-tr": "Sahip olduğunuz bulut sunucular. Oluşturma, hesap bakiyesinden ödenen bir sipariştir."
  },
  {
   "name": "Server actions",
   "description": "Power, rebuild, password and rescue operations. Asynchronous; poll the server until `live.locked` is false.",
   "x-description-tr": "Güç, yeniden kurulum, parola ve kurtarma işlemleri. Eşzamansızdır; `live.locked` false olana kadar sunucuyu sorgulayın."
  },
  {
   "name": "Snapshots and backups",
   "description": "Point-in-time images of a server disk. Snapshot space is an add-on quota in GB.",
   "x-description-tr": "Sunucu diskinin anlık görüntüleri. Snapshot alanı GB cinsinden ek hizmet kotasıdır."
  },
  {
   "name": "Networking",
   "description": "Reverse DNS and the inbound firewall of a server.",
   "x-description-tr": "Sunucunun ters DNS kayıtları ve gelen trafik güvenlik duvarı."
  },
  {
   "name": "Monitoring",
   "description": "CPU, disk and network metrics and the provider-side action history.",
   "x-description-tr": "CPU, disk ve ağ ölçümleri ile sunucu işlem geçmişi."
  },
  {
   "name": "SSH keys",
   "description": "Account-level public keys you can install on new servers.",
   "x-description-tr": "Yeni sunuculara kurulabilen, hesap düzeyinde açık anahtarlar."
  },
  {
   "name": "Catalog",
   "description": "Orderable products, locations and operating system images.",
   "x-description-tr": "Sipariş verilebilen ürünler, lokasyonlar ve işletim sistemi imajları."
  },
  {
   "name": "Billing",
   "description": "Invoices and account balance (read-only with the recommended scopes).",
   "x-description-tr": "Faturalar ve hesap bakiyesi (önerilen kapsamlarla salt okunur)."
  },
  {
   "name": "Account",
   "description": "Key introspection and the write log of your API keys.",
   "x-description-tr": "Anahtar bilgisi ve API anahtarlarınızın yazma kaydı."
  },
  {
   "name": "Services (all products)",
   "description": "Generic bridge to every product line (cloud server, VDS, dedicated, mail, monitor, storage, license, ...).\nEverything a customer can do on a service in the client area is a module tool or method and is reachable here.\nStart with `GET /cloud/services/{id}/tools`: it lists the tools, their actions and our safety policy\n(`read`, `confirm`, `secret`) for that very service.\n",
   "x-description-tr": "Tüm ürün hatlarına (bulut sunucu, VDS, fiziksel sunucu, kurumsal mail, izleme, depolama, lisans, ...) genel köprü.\nMüşteri panelinde bir hizmette yapılabilen her şey bir modül aracı ya da metodudur ve burada erişilebilir.\n`GET /cloud/services/{id}/tools` ile başlayın: o hizmetin araçlarını, eylemlerini ve güvenlik politikasını\n(`read`, `confirm`, `secret`) döndürür.\n"
  },
  {
   "name": "Webhooks",
   "description": "Signed HTTPS callbacks for service, invoice, order and ticket events.",
   "x-description-tr": "Hizmet, fatura, sipariş ve talep olayları için imzalı HTTPS geri çağrıları."
  },
  {
   "name": "API keys",
   "description": "Sub-account keys narrowed to services, actions or a reseller end-customer. Only GyroAPI `/cloud` routes accept them.",
   "x-description-tr": "Hizmet, eylem ya da bayi uç-müşterisiyle daraltılmış alt hesap anahtarları. Yalnız GyroAPI `/cloud` uçlarında geçerlidir."
  },
  {
   "name": "Reseller",
   "description": "Reseller (bayi) accounts manage their own end-customers, assign services, mint end-customer keys and read usage reports. Services stay on the reseller account and use its discount.",
   "x-description-tr": "Bayi hesapları kendi uç-müşterilerini yönetir, hizmet atar, uç-müşteri anahtarı üretir ve kullanım raporu okur. Hizmetler bayinin hesabında kalır ve bayi indirimiyle fiyatlanır."
  },
  {
   "name": "Mail",
   "description": "Typed corporate-mail shortcuts (mailboxes, aliases, catch-all, auto-responders, IMAP migrations, DNS, spam, delivery log, quarantine, deleted mail, archive, 2FA). Mailboxes are addressed by local part.",
   "x-description-tr": "Kurumsal mail kısayolları (kutular, takma adlar, catch-all, otomatik yanıt, IMAP taşıma, DNS, spam, teslim kaydı, karantina, silinen posta, arşiv, 2FA). Kutular yerel kısımla (@ öncesi) adreslenir."
  },
  {
   "name": "Object storage",
   "description": "Typed S3 storage shortcuts: buckets, access keys (secret shown once), usage, connection details.",
   "x-description-tr": "S3 depolama kısayolları: kovalar, erişim anahtarları (gizli bir kez), kullanım, bağlantı bilgisi."
  },
  {
   "name": "Monitoring (uptime)",
   "description": "Typed uptime-monitor shortcuts: monitors, channels, heartbeats, status pages.",
   "x-description-tr": "Uptime izleme kısayolları: monitörler, kanallar, heartbeat, durum sayfaları."
  },
  {
   "name": "Licenses",
   "description": "Software license status and IP change.",
   "x-description-tr": "Yazılım lisansı durumu ve IP değişikliği."
  },
  {
   "name": "One-click apps",
   "description": "Install a one-click app on a cloud server (the disk is rebuilt).",
   "x-description-tr": "Bulut sunucuya tek tık uygulama kur (disk yeniden kurulur)."
  },
  {
   "name": "Plan changes and add-ons",
   "description": "Resize (plan upgrade) and add-on purchase, paid from the account balance (dry_run, confirm, Idempotency-Key, daily limit: default 50 paid operations per account, per-account/reseller override, 429 daily_limit).",
   "x-description-tr": "Paket yükseltme ve ek hizmet satın alma; bakiyeden ödenir (dry_run, confirm, Idempotency-Key, günlük sınır: hesap başına varsayılan 50 ücretli işlem, hesap/bayi bazında istisna, 429 daily_limit)."
  },
  {
   "name": "Panel users",
   "description": "Sub-users: extra panel logins with limited permissions (accountant, technical staff). Scope `users`.",
   "x-description-tr": "Alt kullanıcılar: sınırlı izinli ek panel girişleri (muhasebe, teknik ekip). Kapsam `users`."
  },
  {
   "name": "Load balancers",
   "description": "Managed L4/L7 load balancer for your cloud servers: services, health checks, targets, free Let's Encrypt certificates, metrics. EU regions.",
   "x-description-tr": "Bulut sunucularınız için yönetilen L4/L7 yük dengeleyici: servisler, sağlık kontrolü, hedefler, ücretsiz Let's Encrypt sertifikası, ölçümler. AB bölgeleri."
  },
  {
   "name": "Containers",
   "description": "Gyro Containers (ECS), Istanbul tr-ist-1: run Docker images on a node pool dedicated to you (no other customer's containers on your nodes). Services with zero-downtime deploys, revision history and rollback, scaling, environment variables and encrypted secrets, HTTPS address <name>-<code>.gyroapp.net plus your own domains (free certificates), logs and metrics. Order the environment like any product (`/cloud/services` lists it); manage it here.",
   "x-description-tr": "Gyro Kapsayıcı (ECS), İstanbul tr-ist-1: Docker imajlarını size ayrılmış düğüm havuzunda çalıştırın. Kesintisiz dağıtım, sürüm geçmişi ve geri alma, ölçekleme, ortam değişkenleri ve şifreli gizli değerler, <ad>-<kod>.gyroapp.net HTTPS adresi ve kendi alan adlarınız (ücretsiz sertifika), loglar ve grafikler."
  },
  {
   "name": "Managed DNS",
   "description": "Authoritative DNS on ns1.gyrodns.net (Istanbul) + ns2.gyrodns.net (Germany): zones, records (A/AAAA/CNAME/MX/TXT/SRV/CAA/ALIAS/NS/PTR), BIND import/export, one-click DNSSEC, health-checked failover records.",
   "x-description-tr": "ns1.gyrodns.net (İstanbul) + ns2.gyrodns.net (Almanya) yetkili DNS: zone'lar, kayıtlar, BIND içe/dışa aktarma, tek tık DNSSEC, sağlık kontrollü failover kayıtları."
  },
  {
   "name": "Security groups",
   "description": "Reusable allow lists (AWS security group model) for servers with the network firewall add-on. Up to 5 groups per server, evaluated after Gyro rules and your advanced ordered rules; with groups and no advanced rules inbound traffic is denied by default. Rules count against the server's rule allowance. A change that could cut SSH/RDP access runs as a 5 minute trial: confirm it.",
   "x-description-tr": "Ağ güvenlik duvarı ek hizmeti olan sunucular için yeniden kullanılabilir izin listeleri (AWS security group modeli). Sunucu başına en çok 5 grup; Gyro kuralları ve gelişmiş sıralı kurallarınızdan sonra değerlendirilir; grup olup gelişmiş kural yoksa gelen trafik varsayılan olarak kapalıdır. Kurallar sunucunun kural hakkından düşer. SSH/RDP erişimini kesebilecek değişiklik 5 dakikalık deneme olarak uygulanır: onaylayın."
  },
  {
   "name": "Reference data",
   "description": "Countries, states, cities.",
   "x-description-tr": "Ülke, il, ilçe."
  },
  {
   "name": "Services (core)",
   "description": "Core service endpoints: renew, cancel, auto-renew, add-ons, metrics, SSO, password.",
   "x-description-tr": "Çekirdek hizmet uçları: yenileme, iptal, otomatik yenileme, ek hizmetler, ölçümler, SSO, parola."
  },
  {
   "name": "Domains and DNS",
   "description": "Register, transfer, renew, nameservers, DNS records, DNSSEC, lock, EPP code, privacy, WHOIS contacts, forwarding (core WISECP client API).",
   "x-description-tr": "Kayıt, transfer, yenileme, ad sunucuları, DNS kayıtları, DNSSEC, kilit, EPP kodu, gizlilik, WHOIS kişileri, yönlendirme (çekirdek WISECP müşteri API'si)."
  },
  {
   "name": "Orders",
   "description": "Preview (quote) and place orders for any product.",
   "x-description-tr": "Her ürün için teklif ve sipariş."
  },
  {
   "name": "Support tickets",
   "description": "Departments, open, reply, close, reopen, rate, attachments.",
   "x-description-tr": "Departmanlar, aç, yanıtla, kapat, yeniden aç, puanla, ekler."
  },
  {
   "name": "SMS",
   "description": "SMS senders, quote and send.",
   "x-description-tr": "SMS başlıkları, teklif ve gönderim."
  },
  {
   "name": "Affiliate",
   "description": "Affiliate programme.",
   "x-description-tr": "Satış ortaklığı."
  },
  {
   "name": "Templates",
   "description": "Custom templates from your own tr-ist-1 servers (no image upload)",
   "x-description-tr": "Kendi tr-ist-1 sunucularınızdan özel şablonlar (dışarıdan imaj yüklenmez)"
  },
  {
   "name": "Projects",
   "description": "Group your services into projects (e.g. one per business, client or environment). Every service is in exactly one project; services without one are in the default project (id 0). Invoices are not split by project.",
   "x-description-tr": "Hizmetlerinizi projelere ayırın (iş, müşteri ya da ortam başına). Her hizmet tek bir projededir; atanmamış hizmetler varsayılan projededir (id 0). Faturalar projeye göre bölünmez."
  },
  {
   "name": "Account limits",
   "description": "Every limit of your account and its current usage in one place. Limits are raised on request: open a support ticket.",
   "x-description-tr": "Hesabınızın tüm sınırları ve şu anki kullanım tek yerde. Sınırlar talep üzerine artırılır: destek talebi açın."
  },
  {
   "name": "Private networks",
   "description": "Private networks (VPC) for Gyro Cloud Istanbul (tr-ist-1) servers: subnets, private network cards, turning a server's public IPv4 off, and the VPC gateway (NAT internet access, port forwarding, inter-subnet rule). VPCs, subnets and private traffic are free; the gateway is billed hourly from the prepaid balance while it is on (4.99 EUR per month at most).",
   "x-description-tr": "Gyro Bulut İstanbul (tr-ist-1) sunucuları için özel ağlar (VPC): subnetler, özel ağ kartları, sunucunun public IPv4'ünü kapatma ve VPC kapısı (NAT ile internet çıkışı, port yönlendirme, subnetler arası kural). VPC, subnet ve özel trafik ücretsiz; kapı açıkken ön ödemeli bakiyeden saatlik ücretlenir (ayda en çok 4,99 €)."
  }
 ],
 "paths": {
  "/whoami": {
   "get": {
    "tags": [
     "Account"
    ],
    "operationId": "whoami",
    "summary": "Describe the calling API key",
    "x-summary-tr": "Çağıran API anahtarını göster",
    "x-scope": "any",
    "responses": {
     "200": {
      "description": "Key details",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "properties": {
            "id": {
             "type": "integer"
            },
            "type": {
             "type": "string",
             "const": "client"
            },
            "name": {
             "type": "string"
            },
            "permissions": {
             "type": "array",
             "items": {
              "type": "string"
             }
            },
            "owner_id": {
             "type": "integer"
            }
           }
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     }
    }
   }
  },
  "/cloud/activity": {
   "get": {
    "tags": [
     "Account"
    ],
    "operationId": "listActivity",
    "summary": "List write calls made with your API keys",
    "x-summary-tr": "API anahtarlarınızla yapılan yazma çağrılarını listele",
    "description": "Every non-GET call to `/cloud/...` is recorded for 365 days (method, path, scope, HTTP status, IP, key id). Request and response bodies are never stored.",
    "x-description-tr": "`/cloud/...` altındaki her GET dışı çağrı 365 gün saklanır (yöntem, yol, kapsam, HTTP durumu, IP, anahtar no). İstek ve yanıt gövdeleri saklanmaz.",
    "x-scope": "cloud_read",
    "parameters": [
     {
      "$ref": "#/components/parameters/Page"
     },
     {
      "$ref": "#/components/parameters/Limit"
     }
    ],
    "responses": {
     "200": {
      "description": "Activity page",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "array",
           "items": {
            "$ref": "#/components/schemas/ActivityEntry"
           }
          },
          "meta": {
           "$ref": "#/components/schemas/PageMeta"
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     }
    }
   }
  },
  "/cloud/products": {
   "get": {
    "tags": [
     "Catalog"
    ],
    "operationId": "listProducts",
    "summary": "List orderable cloud server products",
    "x-summary-tr": "Sipariş verilebilen bulut sunucu ürünlerini listele",
    "description": "Prices are in the product currency, VAT excluded. `available=false` means temporarily out of stock.",
    "x-description-tr": "Fiyatlar ürün para biriminde ve KDV hariçtir. `available=false` geçici olarak stokta yok demektir.",
    "x-scope": "cloud_read",
    "parameters": [
     {
      "name": "region",
      "in": "query",
      "schema": {
       "type": "string",
       "example": "eu-de-1"
      },
      "description": "Filter by region (see GET /cloud/locations). A city name (falkenstein) also works."
     },
     {
      "name": "plan",
      "in": "query",
      "schema": {
       "type": "string",
       "example": "standart-2-4"
      },
      "description": "Filter by plan name"
     },
     {
      "name": "location",
      "in": "query",
      "deprecated": true,
      "schema": {
       "type": "string"
      },
      "description": "Deprecated alias of region (legacy location code)"
     },
     {
      "name": "server_type",
      "in": "query",
      "deprecated": true,
      "schema": {
       "type": "string"
      },
      "description": "Deprecated alias of plan (legacy type code)"
     },
     {
      "$ref": "#/components/parameters/Page"
     },
     {
      "name": "limit",
      "in": "query",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 100,
       "default": 100
      }
     }
    ],
    "responses": {
     "200": {
      "description": "Products",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "array",
           "items": {
            "$ref": "#/components/schemas/Product"
           }
          },
          "meta": {
           "$ref": "#/components/schemas/PageMeta"
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    }
   }
  },
  "/cloud/locations": {
   "get": {
    "tags": [
     "Catalog"
    ],
    "operationId": "listLocations",
    "summary": "List locations with orderable products",
    "x-summary-tr": "Sipariş verilebilen lokasyonları listele",
    "x-scope": "cloud_read",
    "responses": {
     "200": {
      "description": "Locations",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "array",
           "items": {
            "$ref": "#/components/schemas/Location"
           }
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     }
    }
   }
  },
  "/cloud/images": {
   "get": {
    "tags": [
     "Catalog"
    ],
    "operationId": "listImages",
    "summary": "List operating system images",
    "x-summary-tr": "İşletim sistemi imajlarını listele",
    "x-scope": "cloud_read",
    "responses": {
     "200": {
      "description": "Images",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "array",
           "items": {
            "$ref": "#/components/schemas/Image"
           }
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "parameters": [
     {
      "name": "region",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string",
       "example": "tr-ist-1"
      },
      "description": "Only images offered in this region (e.g. tr-ist-1). Without it: the images of the global cloud catalogue (unchanged).",
      "x-description-tr": "Yalnız bu bölgede sunulan imajlar (ör. tr-ist-1). Verilmezse küresel bulut kataloğunun imajları (değişmedi)."
     },
     {
      "name": "product_id",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer"
      },
      "description": "Only the images offered on this product (implies its region).",
      "x-description-tr": "Yalnız bu üründe sunulan imajlar (ürünün bölgesini de seçer)."
     },
     {
      "name": "plan",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string",
       "example": "standart-2-4"
      },
      "description": "With region: only the images of this plan in that region.",
      "x-description-tr": "region ile: bu bölgedeki bu planın imajları."
     }
    ]
   }
  },
  "/cloud/ssh-keys": {
   "get": {
    "tags": [
     "SSH keys"
    ],
    "operationId": "listSshKeys",
    "summary": "List SSH keys",
    "x-summary-tr": "SSH anahtarlarını listele",
    "x-scope": "cloud_read",
    "parameters": [
     {
      "$ref": "#/components/parameters/Page"
     },
     {
      "$ref": "#/components/parameters/Limit"
     }
    ],
    "responses": {
     "200": {
      "description": "SSH keys",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "array",
           "items": {
            "$ref": "#/components/schemas/SshKey"
           }
          },
          "meta": {
           "$ref": "#/components/schemas/PageMeta"
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     }
    }
   },
   "post": {
    "tags": [
     "SSH keys"
    ],
    "operationId": "createSshKey",
    "summary": "Add an SSH key",
    "x-summary-tr": "SSH anahtarı ekle",
    "description": "Accepts ssh-ed25519, ecdsa-sha2-nistp256/384/521, sk-ssh-ed25519 and ssh-rsa (2048 bit or more). At most 50 keys per account; fingerprints are unique per account.",
    "x-description-tr": "ssh-ed25519, ecdsa-sha2-nistp256/384/521, sk-ssh-ed25519 ve ssh-rsa (en az 2048 bit) kabul edilir. Hesap başına en fazla 50 anahtar; parmak izi hesapta benzersizdir.",
    "x-scope": "cloud_write",
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "required": [
         "name",
         "public_key"
        ],
        "properties": {
         "name": {
          "type": "string",
          "minLength": 1,
          "maxLength": 64,
          "example": "laptop"
         },
         "public_key": {
          "type": "string",
          "example": "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFaA... me@laptop"
         }
        }
       }
      }
     }
    },
    "responses": {
     "201": {
      "description": "Created",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "$ref": "#/components/schemas/SshKey"
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    }
   }
  },
  "/cloud/ssh-keys/{id}": {
   "parameters": [
    {
     "name": "id",
     "in": "path",
     "required": true,
     "schema": {
      "type": "integer"
     }
    }
   ],
   "get": {
    "tags": [
     "SSH keys"
    ],
    "operationId": "getSshKey",
    "summary": "Get an SSH key",
    "x-summary-tr": "SSH anahtarını getir",
    "x-scope": "cloud_read",
    "responses": {
     "200": {
      "description": "SSH key",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "$ref": "#/components/schemas/SshKey"
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     }
    }
   },
   "delete": {
    "tags": [
     "SSH keys"
    ],
    "operationId": "deleteSshKey",
    "summary": "Delete an SSH key",
    "x-summary-tr": "SSH anahtarını sil",
    "description": "Removes the key from your account. Servers that already have it keep it.",
    "x-description-tr": "Anahtarı hesabınızdan siler. Anahtarın kurulu olduğu sunucularda anahtar kalır.",
    "x-scope": "cloud_write",
    "responses": {
     "200": {
      "description": "Deleted",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "properties": {
            "deleted": {
             "type": "boolean"
            },
            "id": {
             "type": "integer"
            }
           }
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     }
    }
   }
  },
  "/cloud/servers": {
   "get": {
    "tags": [
     "Servers"
    ],
    "operationId": "listServers",
    "summary": "List cloud servers",
    "x-summary-tr": "Bulut sunucuları listele",
    "x-scope": "cloud_read",
    "parameters": [
     {
      "name": "status",
      "in": "query",
      "schema": {
       "type": "string",
       "enum": [
        "active",
        "waiting",
        "inprocess",
        "suspended",
        "cancelled"
       ]
      }
     },
     {
      "$ref": "#/components/parameters/Page"
     },
     {
      "name": "limit",
      "in": "query",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 100,
       "default": 25
      }
     }
    ],
    "responses": {
     "200": {
      "description": "Servers (without live state)",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "array",
           "items": {
            "$ref": "#/components/schemas/Server"
           }
          },
          "meta": {
           "$ref": "#/components/schemas/PageMeta"
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     }
    }
   },
   "post": {
    "tags": [
     "Servers"
    ],
    "operationId": "createServer",
    "summary": "Create (order) a cloud server",
    "x-summary-tr": "Bulut sunucu oluştur (sipariş)",
    "description": "Places an order and pays it **from your account balance** (never from a stored card).\nSafety rules:\n* send `\"dry_run\": true` first to get a price quote; nothing is created;\n* a real order needs `\"confirm\": true` **and** an `Idempotency-Key` header — retrying with the\n  same key and body returns the first answer (`Idempotency-Replayed: true`) instead of a second order;\n* the operator may cap the number of servers per account (`409 server_limit`).\nProvisioning is asynchronous (typically under a minute): poll `GET /cloud/servers/{id}` until\n`status` is `active` and `live.power_state` is `running`.\n\n**Prepaid products** (`billing: prepaid`, e.g. tr-ist-1): `cycle` is ignored; the order total is 0 and usage is charged hourly from the balance (at most the monthly price per month). The balance must cover the first 24 hours, otherwise 422 with the amount to top up (GET /cloud/billing/topup-url). During the first 7 days a new account may run at most 5 prepaid servers and 1 container environment (raised by a support ticket; see GET /cloud/account/limits). Over the limit: 422 `limit_exceeded` with `details.how_to_increase`; a `dry_run` quote shows the same as `quote.limit_exceeded`.\n\n**Batch (2.21.0):** `quantity` creates N servers in one order (one invoice), each a separate service; `name` (with `{n}`) and `tags` label them. `app` installs a one-click app on each.",
    "x-description-tr": "Sipariş oluşturur ve **hesap bakiyenizden** öder (kayıtlı karttan asla çekmez).\nGüvenlik kuralları:\n* önce `\"dry_run\": true` ile fiyat teklifi alın; hiçbir şey oluşturulmaz;\n* gerçek sipariş için `\"confirm\": true` **ve** `Idempotency-Key` başlığı zorunludur — aynı anahtar ve\n  gövdeyle tekrar denemek ikinci sipariş yerine ilk yanıtı döndürür (`Idempotency-Replayed: true`);\n* yönetici hesap başına sunucu sınırı koyabilir (`409 server_limit`).\nKurulum eşzamansızdır (genellikle bir dakikadan kısa): `status` `active` ve `live.power_state`\n`running` olana kadar `GET /cloud/servers/{id}` ile sorgulayın.\n\n\n**Toplu (2.21.0):** `quantity` tek siparişte (tek fatura) N sunucu oluşturur, her biri ayrı hizmettir; `name` (`{n}` ile) ve `tags` adlandırır. `app` her birine tek tık uygulama kurar.",
    "x-scope": "cloud_order",
    "parameters": [
     {
      "$ref": "#/components/parameters/IdempotencyKey"
     }
    ],
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/CreateServerRequest"
       },
       "example": {
        "product_id": 723,
        "cycle": "monthly",
        "image": "debian-12",
        "ssh_keys": [
         12
        ],
        "hostname": "web-1.example.com",
        "confirm": true
       }
      }
     }
    },
    "responses": {
     "200": {
      "description": "Dry-run quote (nothing created)",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "properties": {
            "dry_run": {
             "type": "boolean",
             "const": true
            },
            "quote": {
             "$ref": "#/components/schemas/Quote"
            }
           }
          }
         }
        }
       }
      }
     },
     "202": {
      "description": "Order placed and paid; the server is being provisioned",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "$ref": "#/components/schemas/CreateServerResult"
          }
         }
        }
       }
      }
     },
     "400": {
      "$ref": "#/components/responses/BadRequest"
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "402": {
      "$ref": "#/components/responses/PaymentRequired"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "description": "confirm_required | limit_exceeded (new-account limit of the prepaid cloud; details = LimitHint, raise it with a support ticket) | validation errors",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "x-cli": {}
   }
  },
  "/cloud/servers/{id}": {
   "parameters": [
    {
     "$ref": "#/components/parameters/ServerId"
    }
   ],
   "get": {
    "tags": [
     "Servers"
    ],
    "operationId": "getServer",
    "summary": "Get a server with its live state",
    "x-summary-tr": "Sunucuyu canlı durumuyla getir",
    "description": "`live` is read from the platform (cached for 15 seconds) and is `null` while the server is not active.",
    "x-description-tr": "`live` platformdan okunur (15 saniye önbellek) ve sunucu etkin değilken `null` olur.",
    "x-scope": "cloud_read",
    "responses": {
     "200": {
      "description": "Server",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "$ref": "#/components/schemas/ServerDetail"
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     }
    }
   },
   "patch": {
    "tags": [
     "Servers"
    ],
    "operationId": "updateServer",
    "summary": "Rename a server or switch auto-renew",
    "x-summary-tr": "Sunucu adını değiştir veya otomatik yenilemeyi aç/kapat",
    "x-scope": "cloud_write",
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "hostname": {
          "type": "string",
          "description": "Fully qualified host name (max 63 characters)",
          "example": "web-1.example.com"
         },
         "auto_renew": {
          "type": "boolean"
         }
        }
       }
      }
     }
    },
    "responses": {
     "200": {
      "description": "Updated server",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "$ref": "#/components/schemas/ServerDetail"
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    }
   },
   "delete": {
    "tags": [
     "Servers"
    ],
    "operationId": "deleteServer",
    "summary": "Delete (cancel) a server",
    "x-summary-tr": "Sunucuyu sil (iptal)",
    "description": "Requires `confirm=true` (query or body). Two modes:\n* default: files a **cancellation request** (`status: cancellation_requested`). The server keeps running and billing\n  continues until the request is processed by the panel's automation (daily, business hours);\n* `immediate=true`: cancels **now** (`status: cancelling`, becomes `cancelled` within about a minute) - billing stops, the server is powered off at once and destroyed with\n  its data after the grace period (3 days). Same effect as an approved \"cancel now\" request in the panel. The operator can disable this.\nCalling it again is safe.\n",
    "x-description-tr": "`confirm=true` (sorgu veya gövde) zorunludur. İki biçim:\n* varsayılan: **iptal talebi** açar (`status: cancellation_requested`); talep panel otomasyonuyla işlenene kadar (günlük,\n  mesai saatleri) sunucu çalışır ve faturalama sürer;\n* `immediate=true`: **hemen** iptal eder (`status: cancelling`, yaklaşık bir dakikada `cancelled`) - faturalama durur, sunucu hemen kapanır, bekleme süresi (3 gün) sonunda\n  verisiyle silinir. Paneldeki onaylanmış \"hemen iptal\" ile aynı etki. Yönetici kapatabilir.\nTekrar çağırmak güvenlidir.\n",
    "x-scope": "cloud_delete",
    "parameters": [
     {
      "name": "confirm",
      "in": "query",
      "required": true,
      "schema": {
       "type": "boolean"
      }
     },
     {
      "name": "immediate",
      "in": "query",
      "required": false,
      "schema": {
       "type": "boolean",
       "default": false
      },
      "description": "true = cancel now instead of filing a request"
     }
    ],
    "responses": {
     "202": {
      "description": "Cancellation requested (default) or cancelled (immediate)",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "properties": {
            "status": {
             "type": "string",
             "enum": [
              "cancellation_requested",
              "cancelling",
              "cancelled"
             ]
            },
            "server_id": {
             "type": "integer"
            },
            "destroy_after_days": {
             "type": "integer"
            },
            "note": {
             "type": "string"
            }
           }
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    }
   }
  },
  "/cloud/servers/{id}/actions/{action}": {
   "parameters": [
    {
     "$ref": "#/components/parameters/ServerId"
    },
    {
     "name": "action",
     "in": "path",
     "required": true,
     "schema": {
      "type": "string",
      "enum": [
       "poweron",
       "shutdown",
       "reboot",
       "poweroff",
       "reset",
       "rebuild",
       "reset_password",
       "enable_rescue",
       "disable_rescue"
      ]
     },
     "description": "`shutdown` = graceful (ACPI), `poweroff` = hard power cut, `reset` = hard reset (needs confirm),\n`rebuild` = reinstall from `image` (needs confirm, **wipes the disk**), `reset_password` / `enable_rescue`\nreturn a one-time `root_password`.\n"
    }
   ],
   "post": {
    "tags": [
     "Server actions"
    ],
    "operationId": "serverAction",
    "summary": "Run a server action",
    "x-summary-tr": "Sunucu işlemi çalıştır",
    "description": "Heavy actions (rebuild, reset, rescue, snapshot restore, password reset) are limited per server per day.\nA one-time `root_password` is returned only when the request has **no** `Idempotency-Key`\n(idempotent answers are stored for replay, secrets never are; you then get `root_password_withheld: true`).\n\n**Region tr-ist-1**: poweron, shutdown, reboot, poweroff (same as shutdown), rebuild and reset_password are available; reset, enable_rescue and disable_rescue answer 422 `action_not_supported`. rebuild accepts the images of the server's own product (GET /cloud/images?region=tr-ist-1); the SSH keys given at creation are installed again once the rebuilt server is ready (follow `ssh_keys.state`). Prepaid servers: DELETE always cancels at once (no cancellation request).\n\n**2.14.0 (Gyro Compute, tr-ist-1)**: `reset` (hard reset) is available too; `rebuild` accepts `user_data` and installs the server's SSH keys again; `poweroff` is a hard power off (shutdown = graceful). rescue actions answer 422 `action_not_supported`.\n\n**2.19.1 (rebuild + app)**: `rebuild` accepts `app` (+ optional `app_domain`) on cloud servers: the disk is wiped, the new system is installed and the app is set up on it (progress in GET /cloud/servers/{id}/app, `/app/log`; login details once in the app status). A rebuild **without** `app` closes the server's previous app record (its automatic address is removed). What a rebuild keeps: IP addresses (incl. additional IPv4), server name, plan, SSH keys, firewall rules; tr-ist-1 deletes additional disks and snapshots, EU/US/SG keeps volumes, snapshots and backups. Errors: `app_with_user_data`, `invalid_app`, `invalid_app_domain`, `app_not_supported` (legacy VDS), `tool_action_failed` with the reason (app not available for the image, hourly limit).\n\n**rebuild erases data** (needs `\"confirm\": true`): the disk is re-created from the image; on tr-ist-1 additional disks and snapshots are deleted too, IP addresses, SSH keys of the order and the plan stay. A plan change (`/cloud/services/{id}/resize`) never erases data.",
    "x-description-tr": "Ağır işlemler (yeniden kurulum, reset, kurtarma, snapshot'tan dönüş, parola sıfırlama) sunucu başına günlük sınırlıdır.\nTek seferlik `root_password` yalnız istekte `Idempotency-Key` **yoksa** döner (tekrar için saklanan yanıtlara sır yazılmaz;\nbu durumda `root_password_withheld: true` görürsünüz).\n\n**tr-ist-1 bölgesi**: poweron, shutdown, reboot, poweroff (shutdown ile aynı), rebuild ve reset_password var; reset, enable_rescue ve disable_rescue 422 `action_not_supported` döner. rebuild sunucunun kendi ürününün imajlarını kabul eder.\n\n**2.14.0 (Gyro Compute, tr-ist-1)**: `reset` (sert yeniden başlatma) da var; `rebuild` `user_data` kabul eder ve sunucunun SSH anahtarlarını yeniden kurar; `poweroff` sert kapatmadır (shutdown = düzgün kapatma).\n\n**2.19.1 (yeniden kurulum + uygulama)**: bulut sunucularda `rebuild` `app` (+ isteğe bağlı `app_domain`) alır: disk silinir, yeni sistem kurulur ve uygulama üstüne kurulur (ilerleme GET /cloud/servers/{id}/app ve `/app/log`; giriş bilgileri uygulama durumunda bir kez). `app` **olmadan** yeniden kurulum sunucunun önceki uygulama kaydını kapatır (otomatik adresi silinir). Korunanlar: IP adresleri (ek IPv4 dahil), sunucu adı, paket, SSH anahtarları, güvenlik duvarı kuralları; tr-ist-1'de ek diskler ve snapshot'lar silinir, AB/ABD/SG'de volume, snapshot ve yedekler kalır.\n\n**rebuild veriyi siler** (`\"confirm\": true` ister): disk imajdan yeniden oluşur; tr-ist-1'de ek diskler ve snapshot'lar da silinir, IP adresleri, siparişteki SSH anahtarları ve plan kalır. Plan değişikliği (`/cloud/services/{id}/resize`) veriyi asla silmez.",
    "x-scope": "cloud_write",
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "image": {
          "type": "string",
          "description": "rebuild only: image slug from /cloud/images",
          "example": "ubuntu-24.04"
         },
         "confirm": {
          "type": "boolean",
          "description": "required for reset and rebuild"
         },
         "user_data": {
          "type": "string",
          "maxLength": 32768,
          "description": "rebuild only (tr-ist-1 Gyro Compute): cloud-init for the new system; must start with `#cloud-config` or `#!`. Cannot be combined with `app`."
         },
         "app": {
          "type": "string",
          "description": "rebuild only: one-click app id from GET /cloud/apps, installed automatically on top of the new system (cloud servers: Gyro Cloud EU/US/SG and Istanbul). The image must be one the app supports (`os` of the app). Follow the install with GET /cloud/servers/{id}/app and /app/log. Cannot be combined with `user_data`; at most 3 app installs per server per hour.",
          "example": "uptime-kuma"
         },
         "app_domain": {
          "type": "string",
          "maxLength": 190,
          "description": "rebuild with `app` only: your domain for the app (its A record must point to the server); empty = automatic `<ip-with-dashes>.gyroapp.net` address."
         }
        }
       }
      }
     }
    },
    "responses": {
     "202": {
      "description": "Accepted",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "$ref": "#/components/schemas/ActionResult"
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    }
   }
  },
  "/cloud/servers/{id}/snapshots": {
   "parameters": [
    {
     "$ref": "#/components/parameters/ServerId"
    }
   ],
   "get": {
    "tags": [
     "Snapshots and backups"
    ],
    "operationId": "listSnapshots",
    "summary": "List snapshots and the snapshot quota",
    "x-summary-tr": "Snapshot'ları ve kotayı listele",
    "x-scope": "cloud_read",
    "responses": {
     "200": {
      "description": "Snapshots",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "properties": {
            "items": {
             "type": "array",
             "items": {
              "$ref": "#/components/schemas/Snapshot"
             }
            },
            "quota_gb": {
             "type": "integer",
             "description": "Snapshot space bought as an add-on (0 = none)"
            }
           }
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     }
    },
    "description": "**Billing (tr-ist-1, prepaid):** the first snapshot is free; every additional snapshot is its own hourly item and is billed **at least 1 hour**, even if it is deleted within minutes (the oldest snapshot counts as the free one). tr-ist-1: `quota` = number of snapshots allowed on the plan (add-on), snapshot ids are stable numbers derived by the API.\nPrepaid tr-ist-1 servers also return `pricing` {billing, free, extra_monthly_eur, extra_hourly_eur, billable}: the first snapshot(s) are free, each extra snapshot is charged hourly from the balance while it exists. 2.14.0 (Gyro Compute): snapshot ids are the platform's own ids; `name` is returned too.",
    "x-description-tr": "**Ücret (tr-ist-1, ön ödemeli):** ilk snapshot ücretsizdir; her ek snapshot ayrı saatlik kalemdir ve dakikalar içinde silinse de **en az 1 saat** ücretlenir (en eski snapshot ücretsiz sayılır). "
   },
   "post": {
    "tags": [
     "Snapshots and backups"
    ],
    "operationId": "createSnapshot",
    "summary": "Take a snapshot",
    "x-summary-tr": "Snapshot al",
    "x-scope": "cloud_write",
    "responses": {
     "202": {
      "description": "Snapshot is being created (poll the list until status is available)",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "properties": {
            "status": {
             "type": "string",
             "const": "accepted"
            },
            "server_id": {
             "type": "integer"
            }
           }
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "description": "**Billing (tr-ist-1, prepaid):** the first snapshot is free; every additional snapshot is its own hourly item and is billed **at least 1 hour**, even if it is deleted within minutes (the oldest snapshot counts as the free one). ",
    "x-description-tr": "**Ücret (tr-ist-1, ön ödemeli):** ilk snapshot ücretsizdir; her ek snapshot ayrı saatlik kalemdir ve dakikalar içinde silinse de **en az 1 saat** ücretlenir (en eski snapshot ücretsiz sayılır). "
   }
  },
  "/cloud/servers/{id}/snapshots/{sid}/restore": {
   "parameters": [
    {
     "$ref": "#/components/parameters/ServerId"
    },
    {
     "name": "sid",
     "in": "path",
     "required": true,
     "schema": {
      "type": "integer"
     }
    }
   ],
   "post": {
    "tags": [
     "Snapshots and backups"
    ],
    "operationId": "restoreSnapshot",
    "summary": "Restore a snapshot onto the server (overwrites the disk)",
    "x-summary-tr": "Snapshot'ı sunucuya geri yükle (diski ezer)",
    "x-scope": "cloud_write",
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "required": [
         "confirm"
        ],
        "properties": {
         "confirm": {
          "type": "boolean",
          "const": true
         }
        }
       }
      }
     }
    },
    "responses": {
     "202": {
      "description": "Accepted"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    }
   }
  },
  "/cloud/servers/{id}/snapshots/{sid}": {
   "parameters": [
    {
     "$ref": "#/components/parameters/ServerId"
    },
    {
     "name": "sid",
     "in": "path",
     "required": true,
     "schema": {
      "type": "integer"
     }
    }
   ],
   "delete": {
    "tags": [
     "Snapshots and backups"
    ],
    "operationId": "deleteSnapshot",
    "summary": "Delete a snapshot",
    "x-summary-tr": "Snapshot sil",
    "x-scope": "cloud_write",
    "responses": {
     "202": {
      "description": "Accepted"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     }
    },
    "description": "**Billing (tr-ist-1, prepaid):** the first snapshot is free; every additional snapshot is its own hourly item and is billed **at least 1 hour**, even if it is deleted within minutes (the oldest snapshot counts as the free one). ",
    "x-description-tr": "**Ücret (tr-ist-1, ön ödemeli):** ilk snapshot ücretsizdir; her ek snapshot ayrı saatlik kalemdir ve dakikalar içinde silinse de **en az 1 saat** ücretlenir (en eski snapshot ücretsiz sayılır). "
   }
  },
  "/cloud/servers/{id}/backups": {
   "parameters": [
    {
     "$ref": "#/components/parameters/ServerId"
    }
   ],
   "get": {
    "tags": [
     "Snapshots and backups"
    ],
    "operationId": "listBackups",
    "summary": "List automatic backups",
    "x-summary-tr": "Otomatik yedekleri listele",
    "x-scope": "cloud_read",
    "responses": {
     "200": {
      "description": "Backups (enabled=false when the backup add-on is not active)",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "properties": {
            "enabled": {
             "type": "boolean"
            },
            "items": {
             "type": "array",
             "items": {
              "$ref": "#/components/schemas/Snapshot"
             }
            }
           }
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     }
    },
    "description": "tr-ist-1: always `enabled: false`."
   },
   "post": {
    "tags": [
     "Snapshots and backups"
    ],
    "operationId": "createBackup",
    "summary": "Take a manual backup (backup add-on required)",
    "x-summary-tr": "Elle yedek al (yedekleme ek hizmeti gerekir)",
    "x-scope": "cloud_write",
    "responses": {
     "202": {
      "description": "Accepted"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "description": "Not available in tr-ist-1 (422 `not_supported_in_region`; use snapshots)."
   }
  },
  "/cloud/servers/{id}/metrics": {
   "parameters": [
    {
     "$ref": "#/components/parameters/ServerId"
    }
   ],
   "get": {
    "tags": [
     "Monitoring"
    ],
    "operationId": "getMetrics",
    "summary": "CPU, disk and network time series",
    "x-summary-tr": "CPU, disk ve ağ zaman serileri",
    "x-scope": "cloud_read",
    "parameters": [
     {
      "name": "period",
      "in": "query",
      "schema": {
       "type": "string",
       "enum": [
        "24h",
        "7d",
        "30d"
       ],
       "default": "24h"
      }
     }
    ],
    "responses": {
     "200": {
      "description": "Metrics; each line is a list of [unix_time, value]",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "$ref": "#/components/schemas/Metrics"
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     }
    },
    "description": "tr-ist-1 (Gyro Compute): instant values (one point per series: cpu %, memory active/total MB, uptime s) and `instant: true`."
   }
  },
  "/cloud/servers/{id}/activity": {
   "parameters": [
    {
     "$ref": "#/components/parameters/ServerId"
    }
   ],
   "get": {
    "tags": [
     "Monitoring"
    ],
    "operationId": "serverActivity",
    "summary": "Recent platform actions on the server",
    "x-summary-tr": "Sunucudaki son platform işlemleri",
    "x-scope": "cloud_read",
    "responses": {
     "200": {
      "description": "Actions (newest first, max 50)",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "array",
           "items": {
            "type": "object",
            "properties": {
             "command": {
              "type": "string",
              "example": "rebuild_server"
             },
             "status": {
              "type": "string",
              "enum": [
               "success",
               "failed",
               "pending"
              ]
             },
             "started_at": {
              "type": "string",
              "format": "date-time"
             }
            }
           }
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     }
    }
   }
  },
  "/cloud/servers/{id}/rdns": {
   "parameters": [
    {
     "$ref": "#/components/parameters/ServerId"
    }
   ],
   "get": {
    "tags": [
     "Networking"
    ],
    "operationId": "listRdns",
    "summary": "List reverse DNS entries",
    "x-summary-tr": "Ters DNS kayıtlarını listele",
    "x-scope": "cloud_read",
    "responses": {
     "200": {
      "description": "PTR records of the server's addresses",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "array",
           "items": {
            "$ref": "#/components/schemas/RdnsEntry"
           }
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     }
    },
    "description": "**tr-ist-1 (Gyro Bulut İstanbul):** every address (primary and additional IPv4) gets an automatic PTR `<a-b-c-d>.ip.gyrohosting.com` with a matching A record. Set `hostname` to your own FQDN to replace it (published within seconds); an empty value restores the default. Names under Gyro domains and protected brand names are refused (HTTP 422 with an explanatory message); at most 30 changes per server per hour. The A record of your name should point to the address (forward-confirmed reverse DNS) for e-mail delivery; it is not enforced. When the server is deleted or an additional IP is released, its PTR is removed. ",
    "x-description-tr": "**tr-ist-1 (Gyro Bulut İstanbul):** her adres (birincil ve ek IPv4) için otomatik PTR `<a-b-c-d>.ip.gyrohosting.com` ve eşleşen A kaydı vardır. `hostname` ile kendi tam alan adınızı yazın (saniyeler içinde yayında); boş değer varsayılana döndürür. Gyro alan adları altı ve korunan marka adları reddedilir (HTTP 422, açıklayıcı mesaj); sunucu başına saatte en çok 30 değişiklik. E-posta teslimi için adınızın A kaydı bu adresi göstermeli (zorunlu değil). Sunucu silinince ya da ek IP bırakılınca PTR kaldırılır. "
   },
   "put": {
    "tags": [
     "Networking"
    ],
    "operationId": "setRdns",
    "summary": "Set (or reset) the PTR record of one address",
    "x-summary-tr": "Bir adresin PTR kaydını ayarla (veya sıfırla)",
    "x-scope": "cloud_write",
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "required": [
         "ip"
        ],
        "properties": {
         "ip": {
          "type": "string",
          "description": "An address of this server (IPv6 addresses inside the server's /64 are allowed)"
         },
         "hostname": {
          "type": "string",
          "description": "FQDN; empty string resets to the default"
         }
        }
       }
      }
     }
    },
    "responses": {
     "200": {
      "description": "Updated list",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "array",
           "items": {
            "$ref": "#/components/schemas/RdnsEntry"
           }
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "description": "**tr-ist-1 (Gyro Bulut İstanbul):** every address (primary and additional IPv4) gets an automatic PTR `<a-b-c-d>.ip.gyrohosting.com` with a matching A record. Set `hostname` to your own FQDN to replace it (published within seconds); an empty value restores the default. Names under Gyro domains and protected brand names are refused (HTTP 422 with an explanatory message); at most 30 changes per server per hour. The A record of your name should point to the address (forward-confirmed reverse DNS) for e-mail delivery; it is not enforced. When the server is deleted or an additional IP is released, its PTR is removed. `dns_ptr` and `ptr` are accepted as aliases of `hostname`. Legacy Istanbul VDS servers keep the request flow (`status: pending` until applied).",
    "x-description-tr": "**tr-ist-1 (Gyro Bulut İstanbul):** her adres (birincil ve ek IPv4) için otomatik PTR `<a-b-c-d>.ip.gyrohosting.com` ve eşleşen A kaydı vardır. `hostname` ile kendi tam alan adınızı yazın (saniyeler içinde yayında); boş değer varsayılana döndürür. Gyro alan adları altı ve korunan marka adları reddedilir (HTTP 422, açıklayıcı mesaj); sunucu başına saatte en çok 30 değişiklik. E-posta teslimi için adınızın A kaydı bu adresi göstermeli (zorunlu değil). Sunucu silinince ya da ek IP bırakılınca PTR kaldırılır. "
   }
  },
  "/cloud/servers/{id}/firewall": {
   "parameters": [
    {
     "$ref": "#/components/parameters/ServerId"
    }
   ],
   "get": {
    "tags": [
     "Networking"
    ],
    "operationId": "getFirewall",
    "summary": "Inbound firewall rules",
    "x-summary-tr": "Gelen trafik güvenlik duvarı kuralları",
    "description": "Read-only in v1. An empty list means no Gyro firewall is applied (all inbound traffic reaches the server). tr-ist-1: rules come from the network firewall add-on (security groups); without the add-on the list is empty and writes answer 409 `firewall_not_enabled`.",
    "x-description-tr": "v1'de salt okunur. Boş liste Gyro güvenlik duvarı uygulanmadığı (tüm gelen trafiğin sunucuya ulaştığı) anlamına gelir.",
    "x-scope": "cloud_read",
    "responses": {
     "200": {
      "description": "Rules",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "array",
           "items": {
            "$ref": "#/components/schemas/FirewallRule"
           }
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     }
    }
   }
  },
  "/invoices": {
   "get": {
    "tags": [
     "Billing"
    ],
    "operationId": "listInvoices",
    "summary": "List invoices",
    "x-summary-tr": "Faturaları listele",
    "x-scope": "Invoices/GetInvoices",
    "parameters": [
     {
      "name": "status",
      "in": "query",
      "schema": {
       "type": "string"
      },
      "description": "unpaid, paid, cancelled, refund"
     },
     {
      "$ref": "#/components/parameters/Page"
     },
     {
      "name": "limit",
      "in": "query",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 100,
       "default": 25
      }
     }
    ],
    "responses": {
     "200": {
      "description": "Invoices",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "array",
           "items": {
            "$ref": "#/components/schemas/Invoice"
           }
          },
          "meta": {
           "$ref": "#/components/schemas/PageMeta"
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     }
    }
   }
  },
  "/invoices/{id}": {
   "get": {
    "tags": [
     "Billing"
    ],
    "operationId": "getInvoice",
    "summary": "Get an invoice",
    "x-summary-tr": "Faturayı getir",
    "x-scope": "Invoices/GetInvoice",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      }
     }
    ],
    "responses": {
     "200": {
      "description": "Invoice with lines",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "$ref": "#/components/schemas/Invoice"
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     }
    }
   }
  },
  "/balance": {
   "get": {
    "tags": [
     "Billing"
    ],
    "operationId": "getBalance",
    "summary": "Account balance",
    "x-summary-tr": "Hesap bakiyesi",
    "x-scope": "Balance/GetBalance",
    "responses": {
     "200": {
      "description": "Balance",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "properties": {
            "balance": {
             "$ref": "#/components/schemas/Money"
            },
            "low_balance": {
             "type": "boolean"
            }
           }
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     }
    }
   }
  },
  "/balance/transactions": {
   "get": {
    "tags": [
     "Billing"
    ],
    "operationId": "listBalanceTransactions",
    "summary": "Balance ledger",
    "x-summary-tr": "Bakiye hareketleri",
    "x-scope": "Balance/GetBalanceTransactions",
    "parameters": [
     {
      "$ref": "#/components/parameters/Page"
     },
     {
      "$ref": "#/components/parameters/Limit"
     }
    ],
    "responses": {
     "200": {
      "description": "Ledger entries",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "array",
           "items": {
            "type": "object",
            "additionalProperties": true
           }
          },
          "meta": {
           "$ref": "#/components/schemas/PageMeta"
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     }
    }
   }
  },
  "/cloud/services": {
   "get": {
    "tags": [
     "Services (all products)"
    ],
    "operationId": "listServices",
    "summary": "List services of every product line",
    "x-summary-tr": "Tüm ürün hatlarındaki hizmetleri listele",
    "x-scope": "services_read",
    "parameters": [
     {
      "name": "product_line",
      "in": "query",
      "schema": {
       "type": "string",
       "enum": [
        "cloud_server",
        "vds",
        "dedicated_server",
        "mail",
        "monitor",
        "storage",
        "license",
        "app"
       ]
      }
     },
     {
      "name": "status",
      "in": "query",
      "schema": {
       "type": "string"
      }
     },
     {
      "name": "customer_id",
      "in": "query",
      "schema": {
       "type": "integer"
      },
      "description": "Reseller main key only"
     },
     {
      "$ref": "#/components/parameters/Page"
     },
     {
      "$ref": "#/components/parameters/Limit"
     },
     {
      "name": "project",
      "in": "query",
      "schema": {
       "type": "integer",
       "minimum": 0
      },
      "description": "Only services in this project (0 = default project). Unknown project: 404 `project_not_found`."
     }
    ],
    "responses": {
     "200": {
      "description": "Services",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "array",
           "items": {
            "$ref": "#/components/schemas/Service"
           }
          },
          "meta": {
           "$ref": "#/components/schemas/PageMeta"
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     }
    }
   }
  },
  "/cloud/services/{id}": {
   "parameters": [
    {
     "name": "id",
     "in": "path",
     "required": true,
     "schema": {
      "type": "integer"
     }
    }
   ],
   "get": {
    "tags": [
     "Services (all products)"
    ],
    "operationId": "getService",
    "summary": "Get a service (renewal, cancellation, access details)",
    "x-summary-tr": "Hizmeti getir (yenileme, iptal, erişim bilgileri)",
    "x-scope": "services_read",
    "responses": {
     "200": {
      "description": "Service",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "$ref": "#/components/schemas/Service"
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     }
    }
   }
  },
  "/cloud/services/{id}/tools": {
   "parameters": [
    {
     "name": "id",
     "in": "path",
     "required": true,
     "schema": {
      "type": "integer"
     }
    }
   ],
   "get": {
    "tags": [
     "Services (all products)"
    ],
    "operationId": "listServiceTools",
    "summary": "Discover tools, actions and safety policy of a service",
    "x-summary-tr": "Hizmetin araçlarını, eylemlerini ve güvenlik politikasını keşfet",
    "x-scope": "services_read",
    "responses": {
     "200": {
      "description": "Tools",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "$ref": "#/components/schemas/ServiceTools"
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     }
    }
   }
  },
  "/cloud/services/{id}/tools/{tool}": {
   "parameters": [
    {
     "name": "id",
     "in": "path",
     "required": true,
     "schema": {
      "type": "integer"
     }
    },
    {
     "name": "tool",
     "in": "path",
     "required": true,
     "schema": {
      "type": "string",
      "example": "mailboxes"
     }
    }
   ],
   "get": {
    "tags": [
     "Services (all products)"
    ],
    "operationId": "getServiceToolData",
    "summary": "Read a tool (list mailboxes, snapshots, DNS records, ...)",
    "x-summary-tr": "Bir aracı oku (posta kutuları, snapshot'lar, DNS kayıtları, ...)",
    "x-scope": "services_read",
    "responses": {
     "200": {
      "description": "Tool data (module specific)",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     }
    }
   }
  },
  "/cloud/services/{id}/tools/{tool}/{action}": {
   "parameters": [
    {
     "name": "id",
     "in": "path",
     "required": true,
     "schema": {
      "type": "integer"
     }
    },
    {
     "name": "tool",
     "in": "path",
     "required": true,
     "schema": {
      "type": "string",
      "example": "mailboxes"
     }
    },
    {
     "name": "action",
     "in": "path",
     "required": true,
     "schema": {
      "type": "string",
      "example": "create"
     }
    }
   ],
   "post": {
    "tags": [
     "Services (all products)"
    ],
    "operationId": "runServiceToolAction",
    "summary": "Run a tool action (create a mailbox, restore a snapshot, ...)",
    "x-summary-tr": "Bir araç eylemi çalıştır (posta kutusu oluştur, snapshot'tan dön, ...)",
    "description": "Body fields are the tool's own fields (see the tool data and the per-module table in the guide). Actions flagged `confirm` in the discovery answer need `\"confirm\": true`.",
    "x-description-tr": "Gövde alanları aracın kendi alanlarıdır (araç verisine ve rehberdeki modül tablosuna bakın). Keşif yanıtında `confirm` işaretli eylemler `\"confirm\": true` ister.",
    "x-scope": "services_write",
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "additionalProperties": true,
        "properties": {
         "confirm": {
          "type": "boolean"
         }
        }
       },
       "example": {
        "email": "info@example.com",
        "password": "S3cure-pass!",
        "quota": 2048
       }
      }
     }
    },
    "responses": {
     "202": {
      "description": "Accepted",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    }
   }
  },
  "/cloud/services/{id}/methods/{method}": {
   "parameters": [
    {
     "name": "id",
     "in": "path",
     "required": true,
     "schema": {
      "type": "integer"
     }
    },
    {
     "name": "method",
     "in": "path",
     "required": true,
     "schema": {
      "type": "string",
      "example": "change_ip"
     }
    }
   ],
   "post": {
    "tags": [
     "Services (all products)"
    ],
    "operationId": "callServiceMethod",
    "summary": "Call a client-callable module method (e.g. license change_ip)",
    "x-summary-tr": "Müşteri-çağrılabilir modül metodunu çağır (örn. lisans change_ip)",
    "x-scope": "services_write",
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "additionalProperties": true
       },
       "example": {
        "ip": "203.0.113.10"
       }
      }
     }
    },
    "responses": {
     "200": {
      "description": "Result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    }
   }
  },
  "/cloud/services/{id}/label": {
   "parameters": [
    {
     "name": "id",
     "in": "path",
     "required": true,
     "schema": {
      "type": "integer"
     },
     "description": "Service id"
    }
   ],
   "get": {
    "tags": [
     "Services (all products)"
    ],
    "operationId": "getServiceLabel",
    "summary": "Get the nickname and tags of a service",
    "x-summary-tr": "Hizmetin takma adını ve etiketlerini getir",
    "description": "Customer-defined nickname and colour tags of one of your services (any product line). A service without a label answers `\"nickname\": null` and `\"tags\": []`. Labels are private to the service owner; after a transfer the old owner's label is not shown.",
    "x-description-tr": "Hizmetlerinizden birinin (her ürün hattı) müşteri tanımlı takma adı ve renkli etiketleri. Etiketsiz hizmet `\"nickname\": null` ve `\"tags\": []` döner. Etiketler yalnız hizmet sahibine görünür; devirden sonra eski sahibin etiketi gösterilmez.",
    "x-scope": "services_read",
    "responses": {
     "200": {
      "description": "Label",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "$ref": "#/components/schemas/ServiceLabel"
          }
         }
        },
        "example": {
         "data": {
          "service_id": 12345,
          "nickname": "Accounting server",
          "tags": [
           {
            "name": "production",
            "color": "green"
           },
           {
            "name": "customer-A",
            "color": "blue"
           }
          ],
          "updated_at": "2026-11-10T02:30:00+03:00",
          "colors": [
           "gray",
           "blue",
           "green",
           "red",
           "orange",
           "yellow",
           "purple",
           "pink",
           "teal",
           "indigo"
          ]
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "429": {
      "$ref": "#/components/responses/RateLimited"
     }
    }
   },
   "put": {
    "tags": [
     "Services (all products)"
    ],
    "operationId": "updateServiceLabel",
    "summary": "Set the nickname and/or tags of a service",
    "x-summary-tr": "Hizmetin takma adını ve/veya etiketlerini ayarla",
    "description": "Send `nickname`, `tags` or both; a field that is not sent stays unchanged. `nickname` \"\" or null clears it; `tags` replaces all tags and `[]` clears them. A tag is `\"name\"` or `{\"name\", \"color\"}`; an unknown or missing colour gets a stable default. Duplicate names (case-insensitive) are merged. Limit: 30 label writes per minute per key (429 `rate_limited`). Sub-account keys need the `label:edit` action. Errors: 422 `nothing_to_update`, `invalid_nickname`, `invalid_tags`; 404 `service_not_found` (also for services of other accounts) or `feature_unavailable`.",
    "x-description-tr": "`nickname`, `tags` ya da ikisini gönderin; gönderilmeyen alan değişmez. `nickname` \"\" veya null temizler; `tags` tüm etiketlerin yerine geçer, `[]` temizler. Etiket `\"ad\"` ya da `{\"name\", \"color\"}`; bilinmeyen/eksik renk için sabit varsayılan atanır. Aynı adlı (büyük/küçük harf duyarsız) etiketler birleştirilir. Sınır: anahtar başına dakikada 30 etiket yazması (429 `rate_limited`). Alt hesap anahtarı `label:edit` eylemi ister. Hatalar: 422 `nothing_to_update`, `invalid_nickname`, `invalid_tags`; 404 `service_not_found` (başka hesabın hizmeti dahil) veya `feature_unavailable`.",
    "x-scope": "services_write",
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/ServiceLabelUpdate"
       },
       "example": {
        "nickname": "Accounting server",
        "tags": [
         {
          "name": "production",
          "color": "green"
         },
         "customer-A"
        ]
       }
      }
     }
    },
    "responses": {
     "200": {
      "description": "Saved label",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "$ref": "#/components/schemas/ServiceLabel"
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     },
     "429": {
      "$ref": "#/components/responses/RateLimited"
     }
    }
   }
  },
  "/cloud/servers/{id}/firewall/rules": {
   "parameters": [
    {
     "$ref": "#/components/parameters/ServerId"
    }
   ],
   "post": {
    "tags": [
     "Networking"
    ],
    "operationId": "addFirewallRule",
    "summary": "Add a firewall rule",
    "description": "Network firewall add-on: inserts at `priority` (default last) and applies as a trial unless `permanent`. Otherwise the cloud server's simple inbound allow list.",
    "x-summary-tr": "Gelen trafik kuralı ekle",
    "x-scope": "cloud_write",
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/FirewallRuleInput"
       },
       "example": {
        "protocol": "tcp",
        "port": "22",
        "source_ips": [
         "203.0.113.0/24"
        ]
       }
      }
     }
    },
    "responses": {
     "201": {
      "description": "All rules after the change",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "array",
           "items": {
            "$ref": "#/components/schemas/FirewallRule"
           }
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    }
   }
  },
  "/cloud/servers/{id}/firewall/rules/{n}": {
   "parameters": [
    {
     "$ref": "#/components/parameters/ServerId"
    },
    {
     "name": "n",
     "in": "path",
     "required": true,
     "schema": {
      "type": "integer",
      "minimum": 1
     },
     "description": "1-based position from GET /firewall"
    }
   ],
   "delete": {
    "tags": [
     "Networking"
    ],
    "operationId": "deleteFirewallRule",
    "summary": "Remove a firewall rule (the last one needs confirm)",
    "x-summary-tr": "Güvenlik duvarı kuralı sil (son kural confirm ister)",
    "x-scope": "cloud_write",
    "parameters": [
     {
      "name": "confirm",
      "in": "query",
      "schema": {
       "type": "boolean"
      }
     }
    ],
    "responses": {
     "200": {
      "description": "Remaining rules",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "array",
           "items": {
            "$ref": "#/components/schemas/FirewallRule"
           }
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    }
   }
  },
  "/cloud/servers/{id}/firewall/policy": {
   "parameters": [
    {
     "$ref": "#/components/parameters/ServerId"
    }
   ],
   "get": {
    "tags": [
     "Networking"
    ],
    "operationId": "getFirewallPolicy",
    "summary": "Network firewall policy (rules, default action, status)",
    "x-summary-tr": "Ağ güvenlik duvarı politikası (kurallar, varsayılan kural, durum)",
    "x-scope": "cloud_read",
    "x-cli": {
     "command": "firewall get"
    },
    "responses": {
     "200": {
      "description": "Policy",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "$ref": "#/components/schemas/FirewallPolicy"
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "description": "The network firewall add-on is not active on this server (firewall_not_enabled)"
     }
    }
   },
   "put": {
    "tags": [
     "Networking"
    ],
    "operationId": "putFirewallPolicy",
    "summary": "Replace the network firewall policy",
    "x-summary-tr": "Ağ güvenlik duvarı politikasını değiştir",
    "description": "Applies as a 5 minute trial unless `permanent` is true; confirm with POST /firewall/policy/confirm. Warnings return 422 `confirm_warnings_required` with `details.warnings`.",
    "x-scope": "cloud_write",
    "x-cli": {
     "command": "firewall set"
    },
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/FirewallPolicyInput"
       },
       "example": {
        "default_action": "deny",
        "rules": [
         {
          "action": "allow",
          "protocol": "tcp",
          "port": "80,443",
          "source": "any"
         },
         {
          "action": "allow",
          "protocol": "tcp",
          "port": "22",
          "source": "203.0.113.10"
         }
        ]
       }
      }
     }
    },
    "responses": {
     "200": {
      "description": "Policy after the change",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "$ref": "#/components/schemas/FirewallPolicy"
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "description": "firewall_not_enabled"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    }
   },
   "delete": {
    "tags": [
     "Networking"
    ],
    "operationId": "deleteFirewallPolicy",
    "summary": "Remove your firewall rules",
    "x-summary-tr": "Güvenlik duvarı kurallarınızı kaldır",
    "description": "Removes every customer rule of the server (all traffic allowed). Rules applied by Gyro support stay.",
    "x-scope": "cloud_write",
    "x-cli": {
     "command": "firewall delete",
     "confirm": true
    },
    "responses": {
     "200": {
      "description": "Policy after the change",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "$ref": "#/components/schemas/FirewallPolicy"
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "description": "firewall_not_enabled"
     }
    }
   }
  },
  "/cloud/servers/{id}/firewall/policy/confirm": {
   "parameters": [
    {
     "$ref": "#/components/parameters/ServerId"
    }
   ],
   "post": {
    "tags": [
     "Networking"
    ],
    "operationId": "confirmFirewallPolicy",
    "summary": "Make the running firewall trial permanent",
    "x-summary-tr": "Güvenlik duvarı denemesini kalıcı yap",
    "x-scope": "cloud_write",
    "x-cli": {
     "command": "firewall confirm"
    },
    "responses": {
     "200": {
      "description": "Policy",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "$ref": "#/components/schemas/FirewallPolicy"
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    }
   }
  },
  "/cloud/servers/{id}/console": {
   "parameters": [
    {
     "$ref": "#/components/parameters/ServerId"
    }
   ],
   "post": {
    "tags": [
     "Server actions"
    ],
    "operationId": "openConsole",
    "summary": "Open a one-time VNC console ticket",
    "x-summary-tr": "Tek seferlik VNC konsol bileti al",
    "description": "Returns a websocket URL and password valid for about a minute. Never send an Idempotency-Key here (400). In tr-ist-1 the ticket is a WebMKS websocket (`protocol: webmks`, empty password: the URL is the one-time secret).\ntr-ist-1: the WebSocket URL is on konsol.gyrohosting.com (single-use ticket). 2.14.0 (Gyro Compute): `protocol: web`, `url` is a one-time browser page (90 s) with keyboard + screen; `wss_url` carries the same URL for older clients.",
    "x-description-tr": "Yaklaşık bir dakika geçerli websocket adresi ve parola döner. Idempotency-Key göndermeyin (400). tr-ist-1'de bilet WebMKS websocket'idir (`protocol: webmks`, parola boş: adresin kendisi tek seferlik sırdır). 2.14.0 (Gyro Compute): `protocol: web`, `url` tarayıcıda açılan tek kullanımlık konsol sayfasıdır (90 sn); eski istemciler için `wss_url` aynı adresi taşır.",
    "x-scope": "cloud_write",
    "responses": {
     "201": {
      "description": "Ticket",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "properties": {
            "server_id": {
             "type": "integer"
            },
            "wss_url": {
             "type": "string"
            },
            "password": {
             "type": "string"
            },
            "protocol": {
             "type": "string"
            },
            "expires_in": {
             "type": "integer"
            },
            "url": {
             "type": "string",
             "description": "2.14.0, tr-ist-1 Gyro Compute: one-time console page to open in a browser"
            }
           }
          }
         }
        }
       }
      }
     },
     "400": {
      "$ref": "#/components/responses/BadRequest"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     }
    }
   }
  },
  "/cloud/bulk": {
   "post": {
    "tags": [
     "Server actions"
    ],
    "operationId": "bulkServerAction",
    "summary": "Run one action on up to 50 servers",
    "x-summary-tr": "Bir eylemi 50 sunucuya kadar toplu çalıştır",
    "x-scope": "cloud_write",
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "required": [
         "action",
         "server_ids"
        ],
        "properties": {
         "action": {
          "type": "string",
          "enum": [
           "poweron",
           "shutdown",
           "reboot",
           "poweroff",
           "reset",
           "rebuild",
           "disable_rescue"
          ]
         },
         "server_ids": {
          "type": "array",
          "items": {
           "type": "integer"
          },
          "maxItems": 50
         },
         "image": {
          "type": "string"
         },
         "confirm": {
          "type": "boolean"
         }
        }
       }
      }
     }
    },
    "responses": {
     "207": {
      "description": "Per-target results",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "$ref": "#/components/schemas/BulkResult"
          }
         }
        }
       }
      }
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    }
   }
  },
  "/cloud/webhooks": {
   "get": {
    "tags": [
     "Webhooks"
    ],
    "operationId": "listWebhooks",
    "summary": "List webhooks",
    "x-summary-tr": "Webhook'ları listele",
    "x-scope": "webhooks",
    "responses": {
     "200": {
      "description": "Webhooks",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "array",
           "items": {
            "$ref": "#/components/schemas/Webhook"
           }
          }
         }
        }
       }
      }
     }
    }
   },
   "post": {
    "tags": [
     "Webhooks"
    ],
    "operationId": "createWebhook",
    "summary": "Create a webhook (secret returned once)",
    "x-summary-tr": "Webhook oluştur (gizli anahtar bir kez döner)",
    "description": "Deliveries are `POST` JSON with headers `X-Gyro-Event`, `X-Gyro-Delivery`, `X-Gyro-Timestamp` and\n`X-Gyro-Signature: sha256=HMAC_SHA256(secret, timestamp + \".\" + body)` (white-label resellers: `X-Webhook-*`).\nReject requests whose timestamp is older than 5 minutes. Retries: exponential back-off, 8 attempts; 20 consecutive failures disable the webhook.\n",
    "x-description-tr": "Teslimler `POST` JSON'dur; başlıklar `X-Gyro-Event`, `X-Gyro-Delivery`, `X-Gyro-Timestamp` ve\n`X-Gyro-Signature: sha256=HMAC_SHA256(secret, timestamp + \".\" + body)` (beyaz etiketli bayi: `X-Webhook-*`).\nZaman damgası 5 dakikadan eskiyse reddedin. Tekrar: üstel geri çekilme, 8 deneme; 20 ardışık hata webhook'u kapatır.\n",
    "x-scope": "webhooks",
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "required": [
         "url"
        ],
        "properties": {
         "url": {
          "type": "string",
          "format": "uri"
         },
         "events": {
          "type": "array",
          "items": {
           "$ref": "#/components/schemas/WebhookEvent"
          },
          "description": "empty = all"
         },
         "description": {
          "type": "string"
         },
         "customer_id": {
          "type": "integer",
          "description": "Reseller main key only"
         }
        }
       },
       "example": {
        "url": "https://hooks.example.com/gyro",
        "events": [
         "service.active",
         "invoice.paid"
        ]
       }
      }
     }
    },
    "responses": {
     "201": {
      "description": "Created (includes secret)",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "allOf": [
            {
             "$ref": "#/components/schemas/Webhook"
            },
            {
             "type": "object",
             "properties": {
              "secret": {
               "type": "string"
              }
             }
            }
           ]
          }
         }
        }
       }
      }
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    }
   }
  },
  "/cloud/webhooks/{id}": {
   "parameters": [
    {
     "name": "id",
     "in": "path",
     "required": true,
     "schema": {
      "type": "integer"
     }
    }
   ],
   "get": {
    "tags": [
     "Webhooks"
    ],
    "operationId": "getWebhook",
    "summary": "Get a webhook",
    "x-summary-tr": "Webhook'u getir",
    "x-scope": "webhooks",
    "responses": {
     "200": {
      "description": "Webhook",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "$ref": "#/components/schemas/Webhook"
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     }
    }
   },
   "patch": {
    "tags": [
     "Webhooks"
    ],
    "operationId": "updateWebhook",
    "summary": "Update url, events, description or status",
    "x-summary-tr": "Adres, olay, açıklama ya da durumu güncelle",
    "x-scope": "webhooks",
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "url": {
          "type": "string"
         },
         "events": {
          "type": "array",
          "items": {
           "$ref": "#/components/schemas/WebhookEvent"
          }
         },
         "description": {
          "type": "string"
         },
         "status": {
          "type": "string",
          "enum": [
           "active",
           "disabled"
          ]
         }
        }
       }
      }
     }
    },
    "responses": {
     "200": {
      "description": "Webhook",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "$ref": "#/components/schemas/Webhook"
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    }
   },
   "delete": {
    "tags": [
     "Webhooks"
    ],
    "operationId": "deleteWebhook",
    "summary": "Delete a webhook",
    "x-summary-tr": "Webhook'u sil",
    "x-scope": "webhooks",
    "responses": {
     "200": {
      "description": "Deleted"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     }
    }
   }
  },
  "/cloud/webhooks/{id}/test": {
   "parameters": [
    {
     "name": "id",
     "in": "path",
     "required": true,
     "schema": {
      "type": "integer"
     }
    }
   ],
   "post": {
    "tags": [
     "Webhooks"
    ],
    "operationId": "testWebhook",
    "summary": "Send an api.test event now",
    "x-summary-tr": "Şimdi bir api.test olayı gönder",
    "x-scope": "webhooks",
    "responses": {
     "200": {
      "description": "Result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "properties": {
            "delivered": {
             "type": "boolean"
            },
            "delivery_id": {
             "type": "string"
            },
            "http_code": {
             "type": [
              "integer",
              "null"
             ]
            },
            "error": {
             "type": [
              "string",
              "null"
             ]
            }
           }
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     }
    }
   }
  },
  "/cloud/webhooks/{id}/deliveries": {
   "parameters": [
    {
     "name": "id",
     "in": "path",
     "required": true,
     "schema": {
      "type": "integer"
     }
    }
   ],
   "get": {
    "tags": [
     "Webhooks"
    ],
    "operationId": "listWebhookDeliveries",
    "summary": "Last 100 deliveries",
    "x-summary-tr": "Son 100 teslim",
    "x-scope": "webhooks",
    "responses": {
     "200": {
      "description": "Deliveries",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "array",
           "items": {
            "$ref": "#/components/schemas/WebhookDelivery"
           }
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     }
    }
   }
  },
  "/cloud/keys": {
   "get": {
    "tags": [
     "API keys"
    ],
    "operationId": "listApiKeys",
    "summary": "List sub-account keys (never shows tokens)",
    "x-summary-tr": "Alt hesap anahtarlarını listele (token göstermez)",
    "x-scope": "keys",
    "responses": {
     "200": {
      "description": "Keys",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "array",
           "items": {
            "$ref": "#/components/schemas/ApiKey"
           }
          }
         }
        }
       }
      }
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     }
    }
   },
   "post": {
    "tags": [
     "API keys"
    ],
    "operationId": "createApiKey",
    "summary": "Create a sub-account key (token returned once)",
    "x-summary-tr": "Alt hesap anahtarı oluştur (token bir kez döner)",
    "x-scope": "keys",
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/ApiKeyInput"
       },
       "example": {
        "name": "ci-reboot-only",
        "scopes": [
         "cloud_read",
         "cloud_write"
        ],
        "services": [
         47466
        ],
        "actions": [
         "reboot",
         "poweron"
        ],
        "ips": [
         "203.0.113.10"
        ],
        "rate_limit": 30
       }
      }
     }
    },
    "responses": {
     "201": {
      "description": "Created",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "allOf": [
            {
             "$ref": "#/components/schemas/ApiKey"
            },
            {
             "type": "object",
             "properties": {
              "token": {
               "type": "string"
              }
             }
            }
           ]
          }
         }
        }
       }
      }
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    }
   }
  },
  "/cloud/keys/{id}": {
   "parameters": [
    {
     "name": "id",
     "in": "path",
     "required": true,
     "schema": {
      "type": "integer"
     }
    }
   ],
   "delete": {
    "tags": [
     "API keys"
    ],
    "operationId": "deleteApiKey",
    "summary": "Delete a sub-account key",
    "x-summary-tr": "Alt hesap anahtarını sil",
    "x-scope": "keys",
    "responses": {
     "200": {
      "description": "Deleted"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     }
    }
   }
  },
  "/cloud/invoices/{id}/pay": {
   "parameters": [
    {
     "name": "id",
     "in": "path",
     "required": true,
     "schema": {
      "type": "integer"
     }
    }
   ],
   "post": {
    "tags": [
     "Billing"
    ],
    "operationId": "payInvoiceFromBalance",
    "summary": "Pay an invoice from the account balance",
    "x-summary-tr": "Faturayı hesap bakiyesinden öde",
    "description": "Balance only (never a card). Requires `\"confirm\": true` and an `Idempotency-Key` header.",
    "x-description-tr": "Yalnız bakiye (kart asla). `\"confirm\": true` ve `Idempotency-Key` başlığı zorunlu.",
    "x-scope": "billing_pay",
    "parameters": [
     {
      "$ref": "#/components/parameters/IdempotencyKey"
     }
    ],
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "required": [
         "confirm"
        ],
        "properties": {
         "confirm": {
          "type": "boolean",
          "const": true
         }
        }
       }
      }
     }
    },
    "responses": {
     "200": {
      "description": "Paid",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "400": {
      "$ref": "#/components/responses/BadRequest"
     },
     "402": {
      "$ref": "#/components/responses/PaymentRequired"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    }
   }
  },
  "/cloud/reseller/settings": {
   "get": {
    "tags": [
     "Reseller"
    ],
    "operationId": "getResellerSettings",
    "summary": "Reseller settings",
    "x-summary-tr": "Bayi ayarları",
    "x-scope": "reseller",
    "responses": {
     "200": {
      "description": "Settings",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "$ref": "#/components/schemas/ResellerSettings"
          }
         }
        }
       }
      }
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     }
    }
   },
   "put": {
    "tags": [
     "Reseller"
    ],
    "operationId": "saveResellerSettings",
    "summary": "Save reseller settings (white label)",
    "x-summary-tr": "Bayi ayarlarını kaydet (beyaz etiket)",
    "x-scope": "reseller",
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "white_label": {
          "type": "boolean"
         }
        }
       }
      }
     }
    },
    "responses": {
     "200": {
      "description": "Settings",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "$ref": "#/components/schemas/ResellerSettings"
          }
         }
        }
       }
      }
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     }
    }
   }
  },
  "/cloud/reseller/report": {
   "get": {
    "tags": [
     "Reseller"
    ],
    "operationId": "resellerReport",
    "summary": "Usage and billing report per end-customer",
    "x-summary-tr": "Uç-müşteri başına kullanım ve fatura raporu",
    "x-scope": "reseller",
    "parameters": [
     {
      "name": "from",
      "in": "query",
      "schema": {
       "type": "string",
       "format": "date"
      }
     },
     {
      "name": "to",
      "in": "query",
      "schema": {
       "type": "string",
       "format": "date"
      }
     }
    ],
    "responses": {
     "200": {
      "description": "Report",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "$ref": "#/components/schemas/ResellerReport"
          }
         }
        }
       }
      }
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     }
    }
   }
  },
  "/cloud/reseller/assign": {
   "post": {
    "tags": [
     "Reseller"
    ],
    "operationId": "assignService",
    "summary": "Assign a service to an end-customer (customer_id 0 = unassign)",
    "x-summary-tr": "Hizmeti uç-müşteriye ata (customer_id 0 = atamayı kaldır)",
    "x-scope": "reseller",
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "required": [
         "service_id",
         "customer_id"
        ],
        "properties": {
         "service_id": {
          "type": "integer"
         },
         "customer_id": {
          "type": "integer"
         }
        }
       }
      }
     }
    },
    "responses": {
     "200": {
      "description": "Assignment",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "properties": {
            "service_id": {
             "type": "integer"
            },
            "customer_id": {
             "type": [
              "integer",
              "null"
             ]
            }
           }
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     }
    }
   }
  },
  "/cloud/reseller/customers": {
   "get": {
    "tags": [
     "Reseller"
    ],
    "operationId": "listResellerCustomers",
    "summary": "List end-customers",
    "x-summary-tr": "Uç-müşterileri listele",
    "x-scope": "reseller",
    "parameters": [
     {
      "name": "external_ref",
      "in": "query",
      "schema": {
       "type": "string"
      }
     },
     {
      "$ref": "#/components/parameters/Page"
     },
     {
      "$ref": "#/components/parameters/Limit"
     }
    ],
    "responses": {
     "200": {
      "description": "Customers",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "array",
           "items": {
            "$ref": "#/components/schemas/EndCustomer"
           }
          },
          "meta": {
           "$ref": "#/components/schemas/PageMeta"
          }
         }
        }
       }
      }
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     }
    }
   },
   "post": {
    "tags": [
     "Reseller"
    ],
    "operationId": "createResellerCustomer",
    "summary": "Create an end-customer",
    "x-summary-tr": "Uç-müşteri oluştur",
    "x-scope": "reseller",
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/EndCustomerInput"
       },
       "example": {
        "name": "Acme Ltd",
        "external_ref": "acme-001",
        "allow_order": false
       }
      }
     }
    },
    "responses": {
     "201": {
      "description": "Created",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "$ref": "#/components/schemas/EndCustomer"
          }
         }
        }
       }
      }
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    }
   }
  },
  "/cloud/reseller/customers/{id}": {
   "parameters": [
    {
     "name": "id",
     "in": "path",
     "required": true,
     "schema": {
      "type": "integer"
     }
    }
   ],
   "get": {
    "tags": [
     "Reseller"
    ],
    "operationId": "getResellerCustomer",
    "summary": "Get an end-customer",
    "x-summary-tr": "Uç-müşteriyi getir",
    "x-scope": "reseller",
    "responses": {
     "200": {
      "description": "Customer",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "$ref": "#/components/schemas/EndCustomer"
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     }
    }
   },
   "patch": {
    "tags": [
     "Reseller"
    ],
    "operationId": "updateResellerCustomer",
    "summary": "Update an end-customer (suspend = its keys stop working)",
    "x-summary-tr": "Uç-müşteriyi güncelle (askıya alma = anahtarları çalışmaz)",
    "x-scope": "reseller",
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/EndCustomerInput"
       }
      }
     }
    },
    "responses": {
     "200": {
      "description": "Customer",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "$ref": "#/components/schemas/EndCustomer"
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     }
    }
   },
   "delete": {
    "tags": [
     "Reseller"
    ],
    "operationId": "deleteResellerCustomer",
    "summary": "Delete an end-customer (revokes keys and webhooks, unassigns services)",
    "x-summary-tr": "Uç-müşteriyi sil (anahtarlar ve webhook'lar iptal, hizmet ataması kalkar)",
    "x-scope": "reseller",
    "parameters": [
     {
      "name": "confirm",
      "in": "query",
      "required": true,
      "schema": {
       "type": "boolean"
      }
     }
    ],
    "responses": {
     "200": {
      "description": "Deleted"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    }
   }
  },
  "/cloud/reseller/customers/{id}/keys": {
   "parameters": [
    {
     "name": "id",
     "in": "path",
     "required": true,
     "schema": {
      "type": "integer"
     }
    }
   ],
   "get": {
    "tags": [
     "Reseller"
    ],
    "operationId": "listResellerCustomerKeys",
    "summary": "List an end-customer's keys",
    "x-summary-tr": "Uç-müşterinin anahtarlarını listele",
    "x-scope": "reseller",
    "responses": {
     "200": {
      "description": "Keys",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "array",
           "items": {
            "$ref": "#/components/schemas/ApiKey"
           }
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     }
    }
   },
   "post": {
    "tags": [
     "Reseller"
    ],
    "operationId": "createResellerCustomerKey",
    "summary": "Mint a key for an end-customer (token returned once)",
    "x-summary-tr": "Uç-müşteri için anahtar üret (token bir kez döner)",
    "x-scope": "reseller",
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/ApiKeyInput"
       }
      }
     }
    },
    "responses": {
     "201": {
      "description": "Created",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "allOf": [
            {
             "$ref": "#/components/schemas/ApiKey"
            },
            {
             "type": "object",
             "properties": {
              "token": {
               "type": "string"
              }
             }
            }
           ]
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    }
   }
  },
  "/cloud/reseller/customers/{id}/keys/{kid}": {
   "parameters": [
    {
     "name": "id",
     "in": "path",
     "required": true,
     "schema": {
      "type": "integer"
     }
    },
    {
     "name": "kid",
     "in": "path",
     "required": true,
     "schema": {
      "type": "integer"
     }
    }
   ],
   "delete": {
    "tags": [
     "Reseller"
    ],
    "operationId": "deleteResellerCustomerKey",
    "summary": "Revoke an end-customer key",
    "x-summary-tr": "Uç-müşteri anahtarını iptal et",
    "x-scope": "reseller",
    "responses": {
     "200": {
      "description": "Deleted"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     }
    }
   }
  },
  "/cloud/apps": {
   "get": {
    "tags": [
     "One-click apps"
    ],
    "operationId": "listApps",
    "summary": "List installable apps",
    "x-summary-tr": "Kurulabilir uygulamaları listele",
    "x-scope": "services_read",
    "responses": {
     "200": {
      "description": "Apps",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "array",
           "items": {
            "type": "object",
            "properties": {
             "id": {
              "type": "string"
             },
             "name": {
              "type": "string"
             },
             "category": {
              "type": "string"
             },
             "os": {
              "type": "array",
              "items": {
               "type": "string"
              }
             },
             "min_ram_gb": {
              "type": "number",
              "description": "Minimum RAM (GB) the app needs; smaller plans should not be used"
             },
             "min_disk_gb": {
              "type": "integer"
             },
             "min_cpu": {
              "type": "integer"
             },
             "needs_domain": {
              "type": "boolean"
             },
             "popular_tr": {
              "type": "boolean",
              "description": "Listed under \"Popular in Türkiye\" on the order screen",
              "x-description-tr": "Sipariş ekranında \"Türkiye'de popüler\" listesinde"
             },
             "version": {
              "type": "string"
             },
             "license": {
              "type": "string"
             },
             "description": {
              "type": "object",
              "properties": {
               "tr": {
                "type": "string"
               },
               "en": {
                "type": "string"
               }
              }
             }
            }
           }
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     }
    }
   }
  },
  "/cloud/servers/{id}/app": {
   "parameters": [
    {
     "$ref": "#/components/parameters/ServerId"
    }
   ],
   "get": {
    "tags": [
     "One-click apps"
    ],
    "operationId": "getAppInstall",
    "summary": "App install status (credentials shown once when ready)",
    "description": "Since 2.7.0 also `stuck` (open but silent for too long), `stuck_reason` (`no_callback` = the server never reported back), `last_update_at`, `attempt`, `can_retry`, `error_code`, `step_text`. Live log: GET /cloud/servers/{id}/app/log.",
    "x-description-tr": "2.7.0 ile ayrıca `stuck` (açık ama uzun süredir haber yok), `stuck_reason` (`no_callback` = sunucu hiç haber vermedi), `last_update_at`, `attempt`, `can_retry`, `error_code`, `step_text`. Canlı günlük: GET /cloud/servers/{id}/app/log.",
    "x-summary-tr": "Uygulama kurulum durumu (hazır olunca kimlik bir kez)",
    "x-scope": "cloud_read",
    "responses": {
     "200": {
      "description": "Status",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     }
    }
   },
   "post": {
    "tags": [
     "One-click apps"
    ],
    "operationId": "installApp",
    "summary": "Install an app (rebuilds the disk; confirm required; 3 per server per day)",
    "x-summary-tr": "Uygulama kur (diski yeniden kurar; confirm zorunlu; sunucu başına günde 3)",
    "x-scope": "cloud_write",
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "required": [
         "app",
         "confirm"
        ],
        "properties": {
         "app": {
          "type": "string"
         },
         "os": {
          "type": "string"
         },
         "domain": {
          "type": "string"
         },
         "email": {
          "type": "string"
         },
         "confirm": {
          "type": "boolean",
          "const": true
         }
        }
       },
       "example": {
        "app": "wordpress",
        "domain": "blog.example.com",
        "email": "admin@example.com",
        "confirm": true
       }
      }
     }
    },
    "responses": {
     "202": {
      "description": "Started"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     },
     "429": {
      "description": "install_limit"
     }
    },
    "description": "\n\n**2.19.1**: also on tr-ist-1 (Gyro Cloud Istanbul) servers. Equivalent to `POST /cloud/servers/{id}/actions/rebuild` with `app`.",
    "x-description-tr": "\n\n**2.19.1**: tr-ist-1 (Gyro Bulut İstanbul) sunucularında da. `POST /cloud/servers/{id}/actions/rebuild` + `app` ile aynıdır."
   }
  },
  "/cloud/servers/{id}/app/log": {
   "parameters": [
    {
     "$ref": "#/components/parameters/ServerId"
    }
   ],
   "get": {
    "tags": [
     "One-click apps"
    ],
    "operationId": "getAppInstallLog",
    "summary": "Live progress log of the latest app install (step changes, server log tail)",
    "x-summary-tr": "Son uygulama kurulumunun canlı ilerleme günlüğü (adımlar, sunucu günlüğü)",
    "description": "Lines with `id` greater than `after`, oldest first (poll with the last id you have). `source` is step, server, system or staff. Server lines are untrusted text sent by the server (secrets masked); render them as plain text.",
    "x-description-tr": "`after` değerinden büyük kimlikli satırlar, eskiden yeniye (elinizdeki son kimlikle sorgulayın). `source`: step, server, system, staff. Sunucu satırları sunucudan gelen güvenilmez metindir (sırlar maskelenir); düz metin olarak gösterin.",
    "x-scope": "cloud_read",
    "parameters": [
     {
      "name": "after",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 0
      }
     },
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 300
      }
     }
    ],
    "responses": {
     "200": {
      "description": "Log lines",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "properties": {
            "server_id": {
             "type": "integer"
            },
            "install_id": {
             "type": [
              "integer",
              "null"
             ]
            },
            "status": {
             "type": "string"
            },
            "lines": {
             "type": "array",
             "items": {
              "type": "object",
              "properties": {
               "id": {
                "type": "integer"
               },
               "time": {
                "type": "string"
               },
               "source": {
                "type": "string",
                "enum": [
                 "step",
                 "server",
                 "system",
                 "staff"
                ]
               },
               "text": {
                "type": "string"
               },
               "progress": {
                "type": "integer"
               }
              }
             }
            }
           }
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     }
    }
   }
  },
  "/cloud/servers/{id}/app/retry": {
   "parameters": [
    {
     "$ref": "#/components/parameters/ServerId"
    }
   ],
   "post": {
    "tags": [
     "One-click apps"
    ],
    "operationId": "retryAppInstall",
    "summary": "Retry a failed or silent app install (rebuilds the disk; confirm required; 3 per server per hour)",
    "x-summary-tr": "Hata veren ya da yanıt vermeyen kurulumu yeniden dene (diski yeniden kurar; confirm zorunlu; sunucu başına saatte 3)",
    "description": "Allowed when the latest install has `status` hata (failed) or `stuck` = true (no news for too long). On cloud servers the server is rebuilt with the same app, OS and domain; ALL data on the disk is deleted.",
    "x-description-tr": "Son kurulum `hata` durumundaysa ya da `stuck` = true ise (uzun süre haber yok) kullanılabilir. Bulut sunucuda sunucu aynı uygulama, işletim sistemi ve alan adıyla yeniden kurulur; diskteki TÜM veriler silinir.",
    "x-scope": "cloud_write",
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "required": [
         "confirm"
        ],
        "properties": {
         "confirm": {
          "type": "boolean",
          "const": true
         }
        }
       },
       "example": {
        "confirm": true
       }
      }
     }
    },
    "responses": {
     "202": {
      "description": "Started (install_id, attempt)"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     },
     "429": {
      "description": "install_limit"
     }
    }
   }
  },
  "/cloud/invoices/{id}/pdf": {
   "parameters": [
    {
     "name": "id",
     "in": "path",
     "required": true,
     "schema": {
      "type": "integer"
     }
    }
   ],
   "get": {
    "tags": [
     "Billing"
    ],
    "operationId": "getInvoicePdf",
    "summary": "Invoice PDF (base64 in JSON)",
    "x-summary-tr": "Fatura PDF (JSON içinde base64)",
    "x-scope": "billing_read",
    "responses": {
     "200": {
      "description": "PDF",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "properties": {
            "invoice_id": {
             "type": "integer"
            },
            "filename": {
             "type": "string"
            },
            "content_type": {
             "type": "string"
            },
            "size": {
             "type": "integer"
            },
            "sha256": {
             "type": "string"
            },
            "content_base64": {
             "type": "string"
            }
           }
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     }
    }
   }
  },
  "/cloud/balance/top-up": {
   "post": {
    "tags": [
     "Billing"
    ],
    "operationId": "balanceTopUp",
    "summary": "Create a balance top-up invoice and get its payment link",
    "x-summary-tr": "Bakiye yükleme faturası oluştur, ödeme linkini al",
    "x-scope": "billing_pay",
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "required": [
         "amount"
        ],
        "properties": {
         "amount": {
          "type": "number",
          "minimum": 50
         }
        }
       }
      }
     }
    },
    "responses": {
     "201": {
      "description": "Invoice + pay_url",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "properties": {
            "invoice_id": {
             "type": "integer"
            },
            "amount": {
             "$ref": "#/components/schemas/Money"
            },
            "pay_url": {
             "type": "string"
            }
           }
          }
         }
        }
       }
      }
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    }
   }
  },
  "/cloud/services/{id}/resize-options": {
   "parameters": [
    {
     "name": "id",
     "in": "path",
     "required": true,
     "schema": {
      "type": "integer"
     }
    }
   ],
   "get": {
    "tags": [
     "Plan changes and add-ons"
    ],
    "operationId": "getResizeOptions",
    "summary": "Products this service can be upgraded to, with prices",
    "x-summary-tr": "Hizmetin yükseltilebileceği ürünler ve fiyatları",
    "x-scope": "services_read",
    "responses": {
     "200": {
      "description": "Options",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "description": "Prepaid services answer `billing: prepaid`; each option has `plan`, `current` and one `hourly` price with `monthly_cap`.\n\n**Data safety (Gyro Cloud Istanbul, tr-ist-1)**: a plan change keeps the disk and all its data, the IP addresses, additional disks and snapshots. The root disk is enlarged in place and the file system is extended automatically; a disk never shrinks, so a plan with a smaller disk is refused with 409 `disk_shrink` (also in `dry_run`; resize-options marks such plans `allowed: false`). Bigger CPU/RAM is applied live when the hypervisor allows it, otherwise the server is shut down cleanly and started again (measured: 1-2 -> 2-4 restarted, about 12 seconds without SSH; 2-4 -> 4-8 live, no restart). While the server has snapshots the disk cannot grow: 409 `resize_refused` (delete the snapshots first). The answer carries `data_preserved: true`, `disk: grows_only`, `restart: if_needed`. Only a rebuild (`POST /cloud/servers/{id}/actions/rebuild`, needs `confirm: true`) erases data: the disk, additional disks and snapshots are deleted (IP addresses stay). **`recreate_required`** (422, invoiced products only): the target plan would need the service to be re-created on another platform, which deletes its data; the API never does that and nothing is changed or charged. Pick another plan from resize-options, or create a new server, move the data and delete the old one.",
    "x-description-tr": "\n\n**Veri güvencesi (Gyro Bulut İstanbul, tr-ist-1)**: plan değişikliği diski ve içindeki tüm veriyi, IP adreslerini, ek diskleri ve snapshot'ları korur. Kök disk yerinde büyütülür ve dosya sistemi kendiliğinden genişler; disk asla küçülmez, daha küçük diskli plan 409 `disk_shrink` ile reddedilir (`dry_run`'da da; resize-options bu planları `allowed: false` gösterir). Artan CPU/RAM hipervizör izin veriyorsa canlı uygulanır, yoksa sunucu düzgünce kapatılıp yeniden açılır (ölçüm: 1-2 -> 2-4 yeniden başladı, SSH yaklaşık 12 sn yok; 2-4 -> 4-8 canlı, yeniden başlatma yok). Sunucuda snapshot varken disk büyütülemez: 409 `resize_refused` (önce snapshot'ları silin). Yanıtta `data_preserved: true`, `disk: grows_only`, `restart: if_needed`. Veriyi yalnız yeniden kurulum siler (`POST /cloud/servers/{id}/actions/rebuild`, `confirm: true` ister): disk, ek diskler ve snapshot'lar silinir (IP adresleri kalır). **`recreate_required`** (422, yalnız faturalı ürünler): hedef plan hizmetin başka platformda yeniden kurulmasını gerektirir, bu da veriyi siler; API bunu asla yapmaz, hiçbir şey değişmez ve ücret alınmaz. resize-options'tan başka plan seçin ya da yeni sunucu açıp veriyi taşıyın."
   }
  },
  "/cloud/services/{id}/resize": {
   "parameters": [
    {
     "name": "id",
     "in": "path",
     "required": true,
     "schema": {
      "type": "integer"
     }
    }
   ],
   "post": {
    "tags": [
     "Plan changes and add-ons"
    ],
    "operationId": "resizeService",
    "summary": "Upgrade the plan (paid from balance)",
    "x-summary-tr": "Paketi yükselt (bakiyeden ödenir)",
    "x-scope": "cloud_order",
    "description": "dry_run returns the price; a real change needs `\"confirm\": true` + Idempotency-Key. Creates the upgrade invoice and pays it from the balance; if the balance does not cover it the answer is `awaiting_payment` with a pay_url. Plan changes that would re-create the server are refused (`recreate_required`).\n**Prepaid services** (`billing: prepaid`: Gyro Containers, Gyro Cloud Istanbul): no invoice and no confirm/Idempotency-Key; pick `product_id` (or `plan`, e.g. `standart-4-8`, `ecs-pro`) from resize-options (same product family). The module resizes the server / node pool (Istanbul servers: disks never shrink; containers: nodes of another size are replaced one by one, running services must fit a smaller plan). The new hourly price applies from the next hour; answer `status: completed`, `effective: next_hour`, `invoice: null`. A bigger plan needs 24 hours of the price difference in the balance.\n\n**Data safety (Gyro Cloud Istanbul, tr-ist-1)**: a plan change keeps the disk and all its data, the IP addresses, additional disks and snapshots. The root disk is enlarged in place and the file system is extended automatically; a disk never shrinks, so a plan with a smaller disk is refused with 409 `disk_shrink` (also in `dry_run`; resize-options marks such plans `allowed: false`). Bigger CPU/RAM is applied live when the hypervisor allows it, otherwise the server is shut down cleanly and started again (measured: 1-2 -> 2-4 restarted, about 12 seconds without SSH; 2-4 -> 4-8 live, no restart). While the server has snapshots the disk cannot grow: 409 `resize_refused` (delete the snapshots first). The answer carries `data_preserved: true`, `disk: grows_only`, `restart: if_needed`. Only a rebuild (`POST /cloud/servers/{id}/actions/rebuild`, needs `confirm: true`) erases data: the disk, additional disks and snapshots are deleted (IP addresses stay). **`recreate_required`** (422, invoiced products only): the target plan would need the service to be re-created on another platform, which deletes its data; the API never does that and nothing is changed or charged. Pick another plan from resize-options, or create a new server, move the data and delete the old one.",
    "x-description-tr": "dry_run fiyatı döndürür; gerçek değişiklik `\"confirm\": true` + Idempotency-Key ister. Yükseltme faturası oluşturulur ve bakiyeden ödenir; bakiye yetmezse `awaiting_payment` ve pay_url döner. Sunucuyu yeniden kuracak değişiklikler reddedilir (`recreate_required`).\n**Ön ödemeli hizmetler** (Gyro Kapsayıcı, Gyro Bulut İstanbul): fatura yok, confirm/Idempotency-Key gerekmez; resize-options'tan `product_id` ya da `plan` seçin. Yeni saatlik ücret bir sonraki saatten; disk küçülmez; daha büyük plan için bakiye 24 saatlik farkı karşılamalı.\n\n**Veri güvencesi (Gyro Bulut İstanbul, tr-ist-1)**: plan değişikliği diski ve içindeki tüm veriyi, IP adreslerini, ek diskleri ve snapshot'ları korur. Kök disk yerinde büyütülür ve dosya sistemi kendiliğinden genişler; disk asla küçülmez, daha küçük diskli plan 409 `disk_shrink` ile reddedilir (`dry_run`'da da; resize-options bu planları `allowed: false` gösterir). Artan CPU/RAM hipervizör izin veriyorsa canlı uygulanır, yoksa sunucu düzgünce kapatılıp yeniden açılır (ölçüm: 1-2 -> 2-4 yeniden başladı, SSH yaklaşık 12 sn yok; 2-4 -> 4-8 canlı, yeniden başlatma yok). Sunucuda snapshot varken disk büyütülemez: 409 `resize_refused` (önce snapshot'ları silin). Yanıtta `data_preserved: true`, `disk: grows_only`, `restart: if_needed`. Veriyi yalnız yeniden kurulum siler (`POST /cloud/servers/{id}/actions/rebuild`, `confirm: true` ister): disk, ek diskler ve snapshot'lar silinir (IP adresleri kalır). **`recreate_required`** (422, yalnız faturalı ürünler): hedef plan hizmetin başka platformda yeniden kurulmasını gerektirir, bu da veriyi siler; API bunu asla yapmaz, hiçbir şey değişmez ve ücret alınmaz. resize-options'tan başka plan seçin ya da yeni sunucu açıp veriyi taşıyın.",
    "parameters": [
     {
      "$ref": "#/components/parameters/IdempotencyKey"
     }
    ],
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "required": [],
        "properties": {
         "product_id": {
          "type": "integer",
          "description": "target product from resize-options (or give plan for prepaid services)"
         },
         "price_id": {
          "type": "integer"
         },
         "dry_run": {
          "type": "boolean"
         },
         "confirm": {
          "type": "boolean"
         },
         "plan": {
          "type": "string",
          "description": "prepaid services: plan name from resize-options (alternative to product_id)"
         }
        }
       }
      }
     }
    },
    "responses": {
     "202": {
      "description": "Accepted / awaiting_payment (200 for dry_run)",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "422": {
      "description": "recreate_required (invoiced products: would re-create the service - refused, nothing changed) | invalid_product | confirm_required"
     },
     "409": {
      "description": "disk_shrink | resize_refused (has snapshots / busy) | not_actionable"
     }
    }
   }
  },
  "/cloud/services/{id}/addons/available": {
   "parameters": [
    {
     "name": "id",
     "in": "path",
     "required": true,
     "schema": {
      "type": "integer"
     }
    }
   ],
   "get": {
    "tags": [
     "Plan changes and add-ons"
    ],
    "operationId": "listAvailableAddons",
    "summary": "Add-ons offered for this service (with options and prices)",
    "x-summary-tr": "Bu hizmete alınabilecek ek hizmetler",
    "x-scope": "services_read",
    "responses": {
     "200": {
      "description": "Add-ons",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "description": "Prepaid add-on options show `cycle: hourly`, `billing: prepaid` and `price {amount (EUR/hour), monthly_cap}`."
   }
  },
  "/cloud/services/{id}/addons": {
   "parameters": [
    {
     "name": "id",
     "in": "path",
     "required": true,
     "schema": {
      "type": "integer"
     }
    }
   ],
   "post": {
    "tags": [
     "Plan changes and add-ons"
    ],
    "operationId": "buyAddon",
    "summary": "Buy an add-on (paid from balance)",
    "x-summary-tr": "Ek hizmet satın al (bakiyeden ödenir)",
    "x-scope": "cloud_order",
    "parameters": [
     {
      "$ref": "#/components/parameters/IdempotencyKey"
     }
    ],
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "required": [
         "addon_id",
         "option_id"
        ],
        "properties": {
         "addon_id": {
          "type": "integer"
         },
         "option_id": {
          "type": "integer"
         },
         "quantity": {
          "type": "integer",
          "minimum": 1
         },
         "dry_run": {
          "type": "boolean"
         },
         "confirm": {
          "type": "boolean"
         }
        }
       }
      }
     }
    },
    "responses": {
     "202": {
      "description": "Accepted / awaiting_payment (200 for dry_run)",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "description": "Prepaid services + prepaid add-ons: no invoice, the add-on is active at once (`status: active`, `billing: prepaid`) and billed hourly from the balance."
   },
   "get": {
    "tags": [
     "Plan changes and add-ons"
    ],
    "operationId": "listServiceAddons",
    "summary": "Add-ons the service holds",
    "x-summary-tr": "Hizmetin ek hizmetleri",
    "x-scope": "services_read",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      }
     }
    ],
    "description": "Prepaid add-ons (billing: prepaid) carry the hourly price and removable: true.",
    "responses": {
     "200": {
      "description": "Add-ons",
      "content": {
       "application/json": {
        "schema": {
         "type": "object"
        }
       }
      }
     }
    }
   }
  },
  "/cloud/users": {
   "get": {
    "tags": [
     "Panel users"
    ],
    "operationId": "listPanelUsers",
    "summary": "List sub-users",
    "x-summary-tr": "Alt kullanıcıları listele",
    "x-scope": "users",
    "responses": {
     "200": {
      "description": "Users",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "array",
           "items": {
            "type": "object",
            "additionalProperties": true
           }
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    }
   },
   "post": {
    "tags": [
     "Panel users"
    ],
    "operationId": "createPanelUser",
    "summary": "Invite a sub-user",
    "x-summary-tr": "Alt kullanıcı davet et",
    "x-scope": "users",
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "required": [
         "email"
        ],
        "properties": {
         "email": {
          "type": "string"
         },
         "label": {
          "type": "string"
         },
         "permissions": {
          "type": "array",
          "items": {
           "type": "string"
          },
          "description": "e.g. view_services, view_invoices, pay_invoices, view_tickets, open_tickets ..."
         },
         "send_invite": {
          "type": "boolean",
          "default": true
         }
        }
       }
      }
     }
    },
    "responses": {
     "201": {
      "description": "Created",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    }
   }
  },
  "/cloud/users/{id}": {
   "parameters": [
    {
     "name": "id",
     "in": "path",
     "required": true,
     "schema": {
      "type": "integer"
     }
    }
   ],
   "patch": {
    "tags": [
     "Panel users"
    ],
    "operationId": "updatePanelUser",
    "summary": "Update a sub-user (label, status, permissions)",
    "x-summary-tr": "Alt kullanıcıyı güncelle",
    "x-scope": "users",
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "label": {
          "type": "string"
         },
         "status": {
          "type": "string",
          "enum": [
           "active",
           "inactive"
          ]
         },
         "permissions": {
          "type": "array",
          "items": {
           "type": "string"
          }
         }
        }
       }
      }
     }
    },
    "responses": {
     "200": {
      "description": "Updated",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    }
   },
   "delete": {
    "tags": [
     "Panel users"
    ],
    "operationId": "deletePanelUser",
    "summary": "Remove a sub-user",
    "x-summary-tr": "Alt kullanıcıyı sil",
    "x-scope": "users",
    "responses": {
     "200": {
      "description": "Deleted",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    }
   }
  },
  "/cloud/users/{id}/resend-invite": {
   "parameters": [
    {
     "name": "id",
     "in": "path",
     "required": true,
     "schema": {
      "type": "integer"
     }
    }
   ],
   "post": {
    "tags": [
     "Panel users"
    ],
    "operationId": "resendPanelUserInvite",
    "summary": "Resend the invitation e-mail",
    "x-summary-tr": "Daveti yeniden gönder",
    "x-scope": "users",
    "responses": {
     "200": {
      "description": "Sent",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    }
   }
  },
  "/cloud/load-balancer-types": {
   "get": {
    "tags": [
     "Load balancers"
    ],
    "operationId": "listLoadBalancerTypes",
    "summary": "List load balancer sizes and prices",
    "x-summary-tr": "Yük dengeleyici boyutları ve fiyatları",
    "x-scope": "cloud_read",
    "x-cli": {
     "command": "lb types"
    },
    "description": "Orderable sizes (small/medium/large) with limits, regions and EUR prices per cycle (excl. VAT); `list_amount` is the strike-through list price.",
    "x-description-tr": "Sipariş edilebilir boyutlar, sınırlar, bölgeler ve dönem başına EUR fiyatlar (KDV hariç); `list_amount` üstü çizili liste fiyatıdır.",
    "responses": {
     "200": {
      "description": "Sizes",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "array",
           "items": {
            "type": "object",
            "properties": {
             "product_id": {
              "type": "integer"
             },
             "size": {
              "type": "string"
             },
             "name": {
              "type": "string"
             },
             "limits": {
              "type": "object",
              "additionalProperties": true
             },
             "regions": {
              "type": "array",
              "items": {
               "type": "string"
              }
             },
             "prices": {
              "type": "array",
              "items": {
               "type": "object",
               "additionalProperties": true
              }
             }
            }
           }
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     }
    }
   }
  },
  "/cloud/load-balancers": {
   "get": {
    "tags": [
     "Load balancers"
    ],
    "operationId": "listLoadBalancers",
    "summary": "List load balancers",
    "x-summary-tr": "Yük dengeleyicileri listele",
    "x-scope": "cloud_read",
    "x-cli": {
     "command": "lb list"
    },
    "parameters": [
     {
      "$ref": "#/components/parameters/Page"
     },
     {
      "$ref": "#/components/parameters/Limit"
     },
     {
      "name": "status",
      "in": "query",
      "schema": {
       "type": "string"
      }
     }
    ],
    "responses": {
     "200": {
      "description": "Load balancers",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "array",
           "items": {
            "$ref": "#/components/schemas/LoadBalancer"
           }
          },
          "meta": {
           "$ref": "#/components/schemas/PageMeta"
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     }
    }
   },
   "post": {
    "tags": [
     "Load balancers"
    ],
    "operationId": "createLoadBalancer",
    "summary": "Order a load balancer",
    "x-summary-tr": "Yük dengeleyici sipariş et",
    "x-scope": "cloud_order",
    "x-cli": {
     "command": "lb create",
     "money": true
    },
    "description": "Orders and pays from the account balance (same money rules as servers): `\"confirm\": true`, an `Idempotency-Key` header, `dry_run` for a quote. Ready in about a minute; then add services and targets.",
    "x-description-tr": "Bakiyeden sipariş + ödeme (sunucularla aynı para kuralları): `\"confirm\": true`, `Idempotency-Key` başlığı, teklif için `dry_run`. Yaklaşık bir dakikada hazır; sonra servis ve hedef ekleyin.",
    "parameters": [
     {
      "name": "Idempotency-Key",
      "in": "header",
      "required": false,
      "schema": {
       "type": "string",
       "minLength": 8,
       "maxLength": 191
      }
     }
    ],
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "size": {
          "type": "string",
          "enum": [
           "small",
           "medium",
           "large"
          ]
         },
         "product_id": {
          "type": "integer"
         },
         "region": {
          "type": "string",
          "enum": [
           "eu-de-1",
           "eu-de-2",
           "eu-fi-1"
          ],
          "default": "eu-de-1"
         },
         "cycle": {
          "type": "string",
          "default": "monthly"
         },
         "end_customer_id": {
          "type": "integer"
         },
         "dry_run": {
          "type": "boolean"
         },
         "confirm": {
          "type": "boolean"
         },
         "project_id": {
          "type": "integer",
          "minimum": 0,
          "description": "Optional project for the new service(s) (0 = default project). Checked before the order: unknown id = 404 `project_not_found` (GyroAPI order endpoints) or 422 `checkout_blocked` with `[project_not_found]` (POST /orders)."
         }
        }
       }
      }
     }
    },
    "responses": {
     "201": {
      "description": "Ordered",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "200": {
      "description": "Quote (dry_run)",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "400": {
      "$ref": "#/components/responses/BadRequest"
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    }
   }
  },
  "/cloud/load-balancers/{id}": {
   "get": {
    "tags": [
     "Load balancers"
    ],
    "operationId": "getLoadBalancer",
    "summary": "Get a load balancer",
    "x-summary-tr": "Yük dengeleyiciyi getir",
    "x-scope": "cloud_read",
    "x-cli": {
     "command": "lb get"
    },
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      }
     }
    ],
    "responses": {
     "200": {
      "description": "Load balancer",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "$ref": "#/components/schemas/LoadBalancer"
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     }
    }
   },
   "delete": {
    "tags": [
     "Load balancers"
    ],
    "operationId": "deleteLoadBalancer",
    "summary": "Delete (cancel) a load balancer",
    "x-summary-tr": "Yük dengeleyiciyi sil (iptal)",
    "x-scope": "cloud_delete",
    "x-cli": {
     "command": "lb delete",
     "confirm": true
    },
    "description": "`confirm=true` required. `immediate=true` cancels now: traffic and billing stop, the load balancer and its certificates are deleted permanently at once. Without immediate a cancellation request is filed.",
    "x-description-tr": "`confirm=true` gerekir. `immediate=true` hemen iptal eder: trafik ve faturalama durur, yük dengeleyici ve sertifikaları hemen kalıcı olarak silinir. immediate yoksa iptal talebi açılır.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      }
     },
     {
      "name": "confirm",
      "in": "query",
      "schema": {
       "type": "boolean"
      }
     },
     {
      "name": "immediate",
      "in": "query",
      "schema": {
       "type": "boolean"
      }
     }
    ],
    "responses": {
     "202": {
      "description": "Cancelling",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    }
   }
  },
  "/cloud/dns/acme-challenge": {
   "get": {
    "x-scope": "dns_acme",
    "tags": [
     "Managed DNS"
    ],
    "operationId": "acmeChallengeStatus",
    "summary": "Is the challenge record live?",
    "x-summary-tr": "Doğrulama kaydı yayında mı?",
    "x-cli": {
     "command": "dns acme-challenge status"
    },
    "parameters": [
     {
      "name": "name",
      "in": "query",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "_acme-challenge.<domain>",
      "example": "_acme-challenge.example.com"
     },
     {
      "name": "value",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Challenge value (key authorization digest)"
     }
    ],
    "description": "Asks both authoritative name servers (ns1/ns2.gyrodns.net) directly. `ready` is true when both publish `value`. Poll every few seconds after adding (usually < 1 minute).",
    "x-description-tr": "İki yetkili ad sunucusuna (ns1/ns2.gyrodns.net) doğrudan sorar. İkisi de `value` değerini yayınlıyorsa `ready` true. Ekledikten sonra birkaç saniyede bir sorun (genelde < 1 dk).",
    "responses": {
     "200": {
      "description": "Status",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "$ref": "#/components/schemas/AcmeChallenge"
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "description": "zone_not_allowed / action_not_allowed"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    }
   },
   "post": {
    "x-scope": "dns_acme",
    "tags": [
     "Managed DNS"
    ],
    "operationId": "acmeChallengeAdd",
    "summary": "Add an ACME challenge TXT value",
    "x-summary-tr": "ACME doğrulama TXT değeri ekle",
    "x-cli": {
     "command": "dns acme-challenge add"
    },
    "parameters": [],
    "description": "Adds `value` to the TXT record set at `name` (TTL 60); other values stay, so the apex and the wildcard of one certificate can be validated together (max 10 values per name). The service and the zone are found from the name (longest Gyro DNS zone of yours that covers it; hosting/cPanel zones are not supported). Idempotent.",
    "x-description-tr": "`value` değerini `name` adındaki TXT kümesine ekler (TTL 60); diğer değerler kalır, böylece bir sertifikanın kök ve joker adları birlikte doğrulanır (ad başına en çok 10 değer). Hizmet ve zone addan bulunur (adı kapsayan en uzun Gyro DNS zone'unuz; hosting/cPanel zone'ları desteklenmez). Tekrarlanabilir.",
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "name": {
          "type": "string",
          "description": "_acme-challenge.<domain> (for *.example.com: _acme-challenge.example.com)",
          "x-description-tr": "_acme-challenge.<alan adı> (*.ornek.com için: _acme-challenge.ornek.com)",
          "example": "_acme-challenge.example.com"
         },
         "value": {
          "type": "string",
          "description": "Challenge value (base64url, 16-128 characters)",
          "x-description-tr": "Doğrulama değeri (base64url, 16-128 karakter)"
         }
        },
        "required": [
         "name",
         "value"
        ]
       }
      }
     }
    },
    "responses": {
     "202": {
      "description": "Added",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "$ref": "#/components/schemas/AcmeChallenge"
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "description": "zone_not_allowed"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    }
   },
   "delete": {
    "x-scope": "dns_acme",
    "tags": [
     "Managed DNS"
    ],
    "operationId": "acmeChallengeRemove",
    "summary": "Remove an ACME challenge TXT value",
    "x-summary-tr": "ACME doğrulama TXT değerini sil",
    "x-cli": {
     "command": "dns acme-challenge remove"
    },
    "parameters": [
     {
      "name": "name",
      "in": "query",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "_acme-challenge.<domain>",
      "example": "_acme-challenge.example.com"
     },
     {
      "name": "value",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Challenge value (key authorization digest)"
     }
    ],
    "description": "Removes only `value` (query or JSON body); the record set is deleted when it becomes empty.",
    "x-description-tr": "Yalnız `value` değerini siler (sorgu ya da JSON gövde); küme boşalınca kayıt silinir.",
    "responses": {
     "202": {
      "description": "Removed",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "$ref": "#/components/schemas/AcmeChallenge"
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "description": "zone_not_allowed"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    }
   }
  },
  "/cloud/dns/{id}/acme-challenge": {
   "get": {
    "x-scope": "dns_acme",
    "tags": [
     "Managed DNS"
    ],
    "operationId": "acmeChallengeStatusS",
    "summary": "Is the challenge record live? (service)",
    "x-summary-tr": "Doğrulama kaydı yayında mı?",
    "x-cli": {
     "command": "dns acme-challenge status-in-service",
     "hidden": true
    },
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Gyro DNS service id"
     },
     {
      "name": "name",
      "in": "query",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "_acme-challenge.<domain>",
      "example": "_acme-challenge.example.com"
     },
     {
      "name": "value",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Challenge value (key authorization digest)"
     }
    ],
    "description": "Asks both authoritative name servers (ns1/ns2.gyrodns.net) directly. `ready` is true when both publish `value`. Poll every few seconds after adding (usually < 1 minute).",
    "x-description-tr": "İki yetkili ad sunucusuna (ns1/ns2.gyrodns.net) doğrudan sorar. İkisi de `value` değerini yayınlıyorsa `ready` true. Ekledikten sonra birkaç saniyede bir sorun (genelde < 1 dk).",
    "responses": {
     "200": {
      "description": "Status",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "$ref": "#/components/schemas/AcmeChallenge"
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "description": "zone_not_allowed / action_not_allowed"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    }
   },
   "post": {
    "x-scope": "dns_acme",
    "tags": [
     "Managed DNS"
    ],
    "operationId": "acmeChallengeAddS",
    "summary": "Add an ACME challenge TXT value (service)",
    "x-summary-tr": "ACME doğrulama TXT değeri ekle",
    "x-cli": {
     "command": "dns acme-challenge add-in-service",
     "hidden": true
    },
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Gyro DNS service id"
     }
    ],
    "description": "Adds `value` to the TXT record set at `name` (TTL 60); other values stay, so the apex and the wildcard of one certificate can be validated together (max 10 values per name). The service and the zone are found from the name (longest Gyro DNS zone of yours that covers it; hosting/cPanel zones are not supported). Idempotent.",
    "x-description-tr": "`value` değerini `name` adındaki TXT kümesine ekler (TTL 60); diğer değerler kalır, böylece bir sertifikanın kök ve joker adları birlikte doğrulanır (ad başına en çok 10 değer). Hizmet ve zone addan bulunur (adı kapsayan en uzun Gyro DNS zone'unuz; hosting/cPanel zone'ları desteklenmez). Tekrarlanabilir.",
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "name": {
          "type": "string",
          "description": "_acme-challenge.<domain> (for *.example.com: _acme-challenge.example.com)",
          "x-description-tr": "_acme-challenge.<alan adı> (*.ornek.com için: _acme-challenge.ornek.com)",
          "example": "_acme-challenge.example.com"
         },
         "value": {
          "type": "string",
          "description": "Challenge value (base64url, 16-128 characters)",
          "x-description-tr": "Doğrulama değeri (base64url, 16-128 karakter)"
         }
        },
        "required": [
         "name",
         "value"
        ]
       }
      }
     }
    },
    "responses": {
     "202": {
      "description": "Added",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "$ref": "#/components/schemas/AcmeChallenge"
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "description": "zone_not_allowed"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    }
   },
   "delete": {
    "x-scope": "dns_acme",
    "tags": [
     "Managed DNS"
    ],
    "operationId": "acmeChallengeRemoveS",
    "summary": "Remove an ACME challenge TXT value (service)",
    "x-summary-tr": "ACME doğrulama TXT değerini sil",
    "x-cli": {
     "command": "dns acme-challenge remove-in-service",
     "hidden": true
    },
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Gyro DNS service id"
     },
     {
      "name": "name",
      "in": "query",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "_acme-challenge.<domain>",
      "example": "_acme-challenge.example.com"
     },
     {
      "name": "value",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Challenge value (key authorization digest)"
     }
    ],
    "description": "Removes only `value` (query or JSON body); the record set is deleted when it becomes empty.",
    "x-description-tr": "Yalnız `value` değerini siler (sorgu ya da JSON gövde); küme boşalınca kayıt silinir.",
    "responses": {
     "202": {
      "description": "Removed",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "$ref": "#/components/schemas/AcmeChallenge"
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "description": "zone_not_allowed"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    }
   }
  },
  "/cloud/dns/{id}/acme-keys": {
   "parameters": [
    {
     "name": "id",
     "in": "path",
     "required": true,
     "schema": {
      "type": "integer"
     },
     "description": "Gyro DNS service id"
    }
   ],
   "get": {
    "tags": [
     "Managed DNS"
    ],
    "operationId": "listAcmeKeys",
    "summary": "List ACME keys",
    "x-summary-tr": "ACME anahtarlarını listele",
    "x-scope": "services_read",
    "x-cli": {
     "command": "dns acme-key list"
    },
    "responses": {
     "200": {
      "description": "Keys",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "array",
           "items": {
            "$ref": "#/components/schemas/AcmeKey"
           }
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     }
    }
   },
   "post": {
    "tags": [
     "Managed DNS"
    ],
    "operationId": "createAcmeKey",
    "summary": "Create an ACME key",
    "x-summary-tr": "ACME anahtarı oluştur",
    "x-scope": "services_write",
    "x-cli": {
     "command": "dns acme-key create"
    },
    "description": "A key for certificate automation that can only add/remove `_acme-challenge` TXT records (scope `dns_acme`), optionally only in `zones` and only from `ips`. It cannot read zones, change other records or reach any other endpoint. The token is returned once. Max 10 per service.",
    "x-description-tr": "Sertifika otomasyonu için yalnız `_acme-challenge` TXT kaydı ekleyip silebilen anahtar (kapsam `dns_acme`); isteğe bağlı yalnız `zones` içinde ve yalnız `ips` adreslerinden. Zone okuyamaz, başka kayıt değiştiremez, başka uca erişemez. Anahtar bir kez döner. Hizmet başına en çok 10.",
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "name": {
          "type": "string",
          "maxLength": 40,
          "description": "Label (e.g. web-01)"
         },
         "zones": {
          "type": "array",
          "items": {
           "type": "string"
          },
          "description": "Allowed zones (empty = all zones of the service)"
         },
         "ips": {
          "type": "array",
          "items": {
           "type": "string"
          },
          "description": "Allowed client IPs (empty = any)"
         }
        }
       }
      }
     }
    },
    "responses": {
     "201": {
      "description": "Created (token shown once)",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "$ref": "#/components/schemas/AcmeKey"
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "description": "subkey_forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    }
   }
  },
  "/cloud/dns/{id}/acme-keys/{kid}": {
   "parameters": [
    {
     "name": "id",
     "in": "path",
     "required": true,
     "schema": {
      "type": "integer"
     },
     "description": "Gyro DNS service id"
    },
    {
     "name": "kid",
     "in": "path",
     "required": true,
     "schema": {
      "type": "integer"
     },
     "description": "ACME key id"
    }
   ],
   "delete": {
    "tags": [
     "Managed DNS"
    ],
    "operationId": "deleteAcmeKey",
    "summary": "Delete an ACME key",
    "x-summary-tr": "ACME anahtarını sil",
    "x-scope": "services_write",
    "x-cli": {
     "command": "dns acme-key delete",
     "confirm": true
    },
    "description": "Revokes the key at once.",
    "x-description-tr": "Anahtarı hemen iptal eder.",
    "responses": {
     "200": {
      "description": "Deleted",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "properties": {
            "deleted": {
             "type": "boolean"
            },
            "id": {
             "type": "integer"
            }
           }
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     }
    }
   }
  },
  "/cloud/mail/{id}/mailboxes": {
   "get": {
    "tags": [
     "Mail"
    ],
    "operationId": "typed_get_mail__id__mailboxes",
    "summary": "GET mailboxes (GyroMail)",
    "x-summary-tr": "mailboxes (GyroMail)",
    "x-scope": "services_read",
    "description": "Typed shortcut of the generic bridge: tool `mailboxes`. Body fields are the tool's own fields.",
    "x-description-tr": "Genel köprünün kısayolu: araç `mailboxes`. Gövde alanları aracın kendi alanlarıdır.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     }
    ],
    "responses": {
     "200": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    }
   },
   "post": {
    "tags": [
     "Mail"
    ],
    "operationId": "typed_post_mail__id__mailboxes",
    "summary": "POST mailboxes:create (GyroMail)",
    "x-summary-tr": "mailboxes:create (GyroMail)",
    "x-scope": "services_write",
    "description": "Typed shortcut of the generic bridge: tool `mailboxes`, action `create`. Body fields are the tool's own fields.",
    "x-description-tr": "Genel köprünün kısayolu: araç `mailboxes`, eylem `create`. Gövde alanları aracın kendi alanlarıdır.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "additionalProperties": true,
        "properties": {
         "confirm": {
          "type": "boolean"
         }
        }
       }
      }
     }
    }
   }
  },
  "/cloud/mail/{id}/mailboxes/{local}": {
   "patch": {
    "tags": [
     "Mail"
    ],
    "operationId": "typed_patch_mail__id__mailboxes__local",
    "summary": "PATCH mailboxes:edit (GyroMail)",
    "x-summary-tr": "mailboxes:edit (GyroMail)",
    "x-scope": "services_write",
    "description": "Typed shortcut of the generic bridge: tool `mailboxes`, action `edit`. Body fields are the tool's own fields.",
    "x-description-tr": "Genel köprünün kısayolu: araç `mailboxes`, eylem `edit`. Gövde alanları aracın kendi alanlarıdır.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "local",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Mailbox local part (before @)"
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "additionalProperties": true,
        "properties": {
         "confirm": {
          "type": "boolean"
         }
        }
       }
      }
     }
    }
   },
   "delete": {
    "tags": [
     "Mail"
    ],
    "operationId": "typed_delete_mail__id__mailboxes__local",
    "summary": "DELETE mailboxes:delete (GyroMail)",
    "x-summary-tr": "mailboxes:delete (GyroMail)",
    "x-scope": "services_write",
    "description": "Typed shortcut of the generic bridge: tool `mailboxes`, action `delete`. Body fields are the tool's own fields. Needs `\"confirm\": true`.",
    "x-description-tr": "Genel köprünün kısayolu: araç `mailboxes`, eylem `delete`. Gövde alanları aracın kendi alanlarıdır. `\"confirm\": true` gerekir.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "local",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Mailbox local part (before @)"
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "additionalProperties": true,
        "properties": {
         "confirm": {
          "type": "boolean"
         }
        }
       }
      }
     }
    }
   }
  },
  "/cloud/mail/{id}/mailboxes/{local}/password": {
   "post": {
    "tags": [
     "Mail"
    ],
    "operationId": "typed_post_mail__id__mailboxes__local__password",
    "summary": "POST mailboxes:password (GyroMail)",
    "x-summary-tr": "mailboxes:password (GyroMail)",
    "x-scope": "services_write",
    "description": "Typed shortcut of the generic bridge: tool `mailboxes`, action `password`. Body fields are the tool's own fields.",
    "x-description-tr": "Genel köprünün kısayolu: araç `mailboxes`, eylem `password`. Gövde alanları aracın kendi alanlarıdır.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "local",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Mailbox local part (before @)"
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "additionalProperties": true,
        "properties": {
         "confirm": {
          "type": "boolean"
         }
        }
       }
      }
     }
    }
   }
  },
  "/cloud/mail/{id}/aliases": {
   "get": {
    "tags": [
     "Mail"
    ],
    "operationId": "typed_get_mail__id__aliases",
    "summary": "GET aliases (GyroMail)",
    "x-summary-tr": "aliases (GyroMail)",
    "x-scope": "services_read",
    "description": "Typed shortcut of the generic bridge: tool `aliases`. Body fields are the tool's own fields.",
    "x-description-tr": "Genel köprünün kısayolu: araç `aliases`. Gövde alanları aracın kendi alanlarıdır.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     }
    ],
    "responses": {
     "200": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    }
   },
   "post": {
    "tags": [
     "Mail"
    ],
    "operationId": "typed_post_mail__id__aliases",
    "summary": "POST aliases:create (GyroMail)",
    "x-summary-tr": "aliases:create (GyroMail)",
    "x-scope": "services_write",
    "description": "Typed shortcut of the generic bridge: tool `aliases`, action `create`. Body fields are the tool's own fields.",
    "x-description-tr": "Genel köprünün kısayolu: araç `aliases`, eylem `create`. Gövde alanları aracın kendi alanlarıdır.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "additionalProperties": true,
        "properties": {
         "confirm": {
          "type": "boolean"
         }
        }
       }
      }
     }
    }
   }
  },
  "/cloud/mail/{id}/aliases/{aid}": {
   "patch": {
    "tags": [
     "Mail"
    ],
    "operationId": "typed_patch_mail__id__aliases__aid",
    "summary": "PATCH aliases:edit (GyroMail)",
    "x-summary-tr": "aliases:edit (GyroMail)",
    "x-scope": "services_write",
    "description": "Typed shortcut of the generic bridge: tool `aliases`, action `edit`. Body fields are the tool's own fields.",
    "x-description-tr": "Genel köprünün kısayolu: araç `aliases`, eylem `edit`. Gövde alanları aracın kendi alanlarıdır.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "aid",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": ""
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "additionalProperties": true,
        "properties": {
         "confirm": {
          "type": "boolean"
         }
        }
       }
      }
     }
    }
   },
   "delete": {
    "tags": [
     "Mail"
    ],
    "operationId": "typed_delete_mail__id__aliases__aid",
    "summary": "DELETE aliases:delete (GyroMail)",
    "x-summary-tr": "aliases:delete (GyroMail)",
    "x-scope": "services_write",
    "description": "Typed shortcut of the generic bridge: tool `aliases`, action `delete`. Body fields are the tool's own fields. Needs `\"confirm\": true`.",
    "x-description-tr": "Genel köprünün kısayolu: araç `aliases`, eylem `delete`. Gövde alanları aracın kendi alanlarıdır. `\"confirm\": true` gerekir.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "aid",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": ""
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "additionalProperties": true,
        "properties": {
         "confirm": {
          "type": "boolean"
         }
        }
       }
      }
     }
    }
   }
  },
  "/cloud/mail/{id}/catch-all": {
   "get": {
    "tags": [
     "Mail"
    ],
    "operationId": "typed_get_mail__id__catch_all",
    "summary": "GET catch-all (GyroMail)",
    "x-summary-tr": "catch-all (GyroMail)",
    "x-scope": "services_read",
    "description": "Typed shortcut of the generic bridge: tool `catch-all`. Body fields are the tool's own fields.",
    "x-description-tr": "Genel köprünün kısayolu: araç `catch-all`. Gövde alanları aracın kendi alanlarıdır.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     }
    ],
    "responses": {
     "200": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    }
   },
   "put": {
    "tags": [
     "Mail"
    ],
    "operationId": "typed_put_mail__id__catch_all",
    "summary": "PUT catch-all:edit (GyroMail)",
    "x-summary-tr": "catch-all:edit (GyroMail)",
    "x-scope": "services_write",
    "description": "Typed shortcut of the generic bridge: tool `catch-all`, action `edit`. Body fields are the tool's own fields.",
    "x-description-tr": "Genel köprünün kısayolu: araç `catch-all`, eylem `edit`. Gövde alanları aracın kendi alanlarıdır.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "additionalProperties": true,
        "properties": {
         "confirm": {
          "type": "boolean"
         }
        }
       }
      }
     }
    }
   }
  },
  "/cloud/mail/{id}/autoresponders": {
   "get": {
    "tags": [
     "Mail"
    ],
    "operationId": "typed_get_mail__id__autoresponders",
    "summary": "GET autoresponder (GyroMail)",
    "x-summary-tr": "autoresponder (GyroMail)",
    "x-scope": "services_read",
    "description": "Typed shortcut of the generic bridge: tool `autoresponder`. Body fields are the tool's own fields.",
    "x-description-tr": "Genel köprünün kısayolu: araç `autoresponder`. Gövde alanları aracın kendi alanlarıdır.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     }
    ],
    "responses": {
     "200": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    }
   }
  },
  "/cloud/mail/{id}/autoresponders/{local}": {
   "put": {
    "tags": [
     "Mail"
    ],
    "operationId": "typed_put_mail__id__autoresponders__local",
    "summary": "PUT autoresponder:edit (GyroMail)",
    "x-summary-tr": "autoresponder:edit (GyroMail)",
    "x-scope": "services_write",
    "description": "Typed shortcut of the generic bridge: tool `autoresponder`, action `edit`. Body fields are the tool's own fields.",
    "x-description-tr": "Genel köprünün kısayolu: araç `autoresponder`, eylem `edit`. Gövde alanları aracın kendi alanlarıdır.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "local",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Mailbox local part (before @)"
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "additionalProperties": true,
        "properties": {
         "confirm": {
          "type": "boolean"
         }
        }
       }
      }
     }
    }
   },
   "delete": {
    "tags": [
     "Mail"
    ],
    "operationId": "typed_delete_mail__id__autoresponders__local",
    "summary": "DELETE autoresponder:delete (GyroMail)",
    "x-summary-tr": "autoresponder:delete (GyroMail)",
    "x-scope": "services_write",
    "description": "Typed shortcut of the generic bridge: tool `autoresponder`, action `delete`. Body fields are the tool's own fields. Needs `\"confirm\": true`.",
    "x-description-tr": "Genel köprünün kısayolu: araç `autoresponder`, eylem `delete`. Gövde alanları aracın kendi alanlarıdır. `\"confirm\": true` gerekir.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "local",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Mailbox local part (before @)"
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "additionalProperties": true,
        "properties": {
         "confirm": {
          "type": "boolean"
         }
        }
       }
      }
     }
    }
   }
  },
  "/cloud/mail/{id}/migrations": {
   "get": {
    "tags": [
     "Mail"
    ],
    "operationId": "typed_get_mail__id__migrations",
    "summary": "GET sync-jobs (GyroMail)",
    "x-summary-tr": "sync-jobs (GyroMail)",
    "x-scope": "services_read",
    "description": "Typed shortcut of the generic bridge: tool `sync-jobs`. Body fields are the tool's own fields.",
    "x-description-tr": "Genel köprünün kısayolu: araç `sync-jobs`. Gövde alanları aracın kendi alanlarıdır.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     }
    ],
    "responses": {
     "200": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    }
   },
   "post": {
    "tags": [
     "Mail"
    ],
    "operationId": "typed_post_mail__id__migrations",
    "summary": "POST sync-jobs:create (GyroMail)",
    "x-summary-tr": "sync-jobs:create (GyroMail)",
    "x-scope": "services_write",
    "description": "Typed shortcut of the generic bridge: tool `sync-jobs`, action `create`. Body fields are the tool's own fields.",
    "x-description-tr": "Genel köprünün kısayolu: araç `sync-jobs`, eylem `create`. Gövde alanları aracın kendi alanlarıdır.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "additionalProperties": true,
        "properties": {
         "confirm": {
          "type": "boolean"
         }
        }
       }
      }
     }
    }
   }
  },
  "/cloud/mail/{id}/migrations/{jid}/run": {
   "post": {
    "tags": [
     "Mail"
    ],
    "operationId": "typed_post_mail__id__migrations__jid__run",
    "summary": "POST sync-jobs:run (GyroMail)",
    "x-summary-tr": "sync-jobs:run (GyroMail)",
    "x-scope": "services_write",
    "description": "Typed shortcut of the generic bridge: tool `sync-jobs`, action `run`. Body fields are the tool's own fields. Needs `\"confirm\": true`.",
    "x-description-tr": "Genel köprünün kısayolu: araç `sync-jobs`, eylem `run`. Gövde alanları aracın kendi alanlarıdır. `\"confirm\": true` gerekir.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "jid",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": ""
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "additionalProperties": true,
        "properties": {
         "confirm": {
          "type": "boolean"
         }
        }
       }
      }
     }
    }
   }
  },
  "/cloud/mail/{id}/migrations/{jid}": {
   "delete": {
    "tags": [
     "Mail"
    ],
    "operationId": "typed_delete_mail__id__migrations__jid",
    "summary": "DELETE sync-jobs:delete (GyroMail)",
    "x-summary-tr": "sync-jobs:delete (GyroMail)",
    "x-scope": "services_write",
    "description": "Typed shortcut of the generic bridge: tool `sync-jobs`, action `delete`. Body fields are the tool's own fields. Needs `\"confirm\": true`.",
    "x-description-tr": "Genel köprünün kısayolu: araç `sync-jobs`, eylem `delete`. Gövde alanları aracın kendi alanlarıdır. `\"confirm\": true` gerekir.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "jid",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": ""
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "additionalProperties": true,
        "properties": {
         "confirm": {
          "type": "boolean"
         }
        }
       }
      }
     }
    }
   }
  },
  "/cloud/mail/{id}/dns": {
   "get": {
    "tags": [
     "Mail"
    ],
    "operationId": "typed_get_mail__id__dns",
    "summary": "GET dns-setup (GyroMail)",
    "x-summary-tr": "dns-setup (GyroMail)",
    "x-scope": "services_read",
    "description": "Typed shortcut of the generic bridge: tool `dns-setup`. Body fields are the tool's own fields.",
    "x-description-tr": "Genel köprünün kısayolu: araç `dns-setup`. Gövde alanları aracın kendi alanlarıdır.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     }
    ],
    "responses": {
     "200": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    }
   }
  },
  "/cloud/mail/{id}/dns/verify": {
   "post": {
    "tags": [
     "Mail"
    ],
    "operationId": "typed_post_mail__id__dns_verify",
    "summary": "POST dns-setup:verify (GyroMail)",
    "x-summary-tr": "dns-setup:verify (GyroMail)",
    "x-scope": "services_write",
    "description": "Typed shortcut of the generic bridge: tool `dns-setup`, action `verify`. Body fields are the tool's own fields.",
    "x-description-tr": "Genel köprünün kısayolu: araç `dns-setup`, eylem `verify`. Gövde alanları aracın kendi alanlarıdır.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "additionalProperties": true,
        "properties": {
         "confirm": {
          "type": "boolean"
         }
        }
       }
      }
     }
    }
   }
  },
  "/cloud/mail/{id}/spam-filter": {
   "get": {
    "tags": [
     "Mail"
    ],
    "operationId": "typed_get_mail__id__spam_filter",
    "summary": "GET spam-filter (GyroMail)",
    "x-summary-tr": "spam-filter (GyroMail)",
    "x-scope": "services_read",
    "description": "Typed shortcut of the generic bridge: tool `spam-filter`. Body fields are the tool's own fields.",
    "x-description-tr": "Genel köprünün kısayolu: araç `spam-filter`. Gövde alanları aracın kendi alanlarıdır.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     }
    ],
    "responses": {
     "200": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    }
   }
  },
  "/cloud/mail/{id}/delivery-log": {
   "get": {
    "tags": [
     "Mail"
    ],
    "operationId": "typed_get_mail__id__delivery_log",
    "summary": "GET delivery-log (GyroMail)",
    "x-summary-tr": "delivery-log (GyroMail)",
    "x-scope": "services_read",
    "description": "Typed shortcut of the generic bridge: tool `delivery-log`. Body fields are the tool's own fields.",
    "x-description-tr": "Genel köprünün kısayolu: araç `delivery-log`. Gövde alanları aracın kendi alanlarıdır.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     }
    ],
    "responses": {
     "200": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    }
   }
  },
  "/cloud/mail/{id}/quarantine": {
   "get": {
    "tags": [
     "Mail"
    ],
    "operationId": "typed_get_mail__id__quarantine",
    "summary": "GET quarantine (GyroMail)",
    "x-summary-tr": "quarantine (GyroMail)",
    "x-scope": "services_read",
    "description": "Typed shortcut of the generic bridge: tool `quarantine`. Body fields are the tool's own fields.",
    "x-description-tr": "Genel köprünün kısayolu: araç `quarantine`. Gövde alanları aracın kendi alanlarıdır.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     }
    ],
    "responses": {
     "200": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    }
   }
  },
  "/cloud/mail/{id}/deleted": {
   "get": {
    "tags": [
     "Mail"
    ],
    "operationId": "typed_get_mail__id__deleted",
    "summary": "GET deleted-mail (GyroMail)",
    "x-summary-tr": "deleted-mail (GyroMail)",
    "x-scope": "services_read",
    "description": "Typed shortcut of the generic bridge: tool `deleted-mail`. Body fields are the tool's own fields.",
    "x-description-tr": "Genel köprünün kısayolu: araç `deleted-mail`. Gövde alanları aracın kendi alanlarıdır.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     }
    ],
    "responses": {
     "200": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    }
   }
  },
  "/cloud/mail/{id}/archive": {
   "get": {
    "tags": [
     "Mail"
    ],
    "operationId": "typed_get_mail__id__archive",
    "summary": "GET archive (GyroMail)",
    "x-summary-tr": "archive (GyroMail)",
    "x-scope": "services_read",
    "description": "Typed shortcut of the generic bridge: tool `archive`. Body fields are the tool's own fields.",
    "x-description-tr": "Genel köprünün kısayolu: araç `archive`. Gövde alanları aracın kendi alanlarıdır.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     }
    ],
    "responses": {
     "200": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    }
   }
  },
  "/cloud/mail/{id}/two-factor": {
   "get": {
    "tags": [
     "Mail"
    ],
    "operationId": "typed_get_mail__id__two_factor",
    "summary": "GET two-factor (GyroMail)",
    "x-summary-tr": "two-factor (GyroMail)",
    "x-scope": "services_read",
    "description": "Typed shortcut of the generic bridge: tool `two-factor`. Body fields are the tool's own fields.",
    "x-description-tr": "Genel köprünün kısayolu: araç `two-factor`. Gövde alanları aracın kendi alanlarıdır.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     }
    ],
    "responses": {
     "200": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    }
   }
  },
  "/cloud/mail/{id}/plan": {
   "get": {
    "tags": [
     "Mail"
    ],
    "operationId": "typed_get_mail__id__plan",
    "summary": "GET plan-size (GyroMail)",
    "x-summary-tr": "plan-size (GyroMail)",
    "x-scope": "services_read",
    "description": "Typed shortcut of the generic bridge: tool `plan-size`. Body fields are the tool's own fields.",
    "x-description-tr": "Genel köprünün kısayolu: araç `plan-size`. Gövde alanları aracın kendi alanlarıdır.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     }
    ],
    "responses": {
     "200": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    }
   }
  },
  "/cloud/storage/{id}/buckets": {
   "get": {
    "tags": [
     "Object storage"
    ],
    "operationId": "typed_get_storage__id__buckets",
    "summary": "GET buckets (GyroDepolama)",
    "x-summary-tr": "buckets (GyroDepolama)",
    "x-scope": "services_read",
    "description": "Typed shortcut of the generic bridge: tool `buckets`. Body fields are the tool's own fields. Each item has `s3_name` (2.20.0): the name to use in S3 clients. Equal to `name` on Object Storage; on Protected Storage it stays the original name after a rename.",
    "x-description-tr": "Genel köprünün kısayolu: araç `buckets`. Gövde alanları aracın kendi alanlarıdır.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     }
    ],
    "responses": {
     "200": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    }
   },
   "post": {
    "tags": [
     "Object storage"
    ],
    "operationId": "typed_post_storage__id__buckets",
    "summary": "Create a bucket",
    "x-summary-tr": "Kova oluştur",
    "x-scope": "services_write",
    "description": "Creates a bucket. Object Storage: the name is private to the service. Protected Storage: every bucket is versioned and the name gets the service code suffix (`<name>-<code>`); `object_lock: true` creates a WORM bucket (needs a free locked-bucket right: Object Lock add-on, see `GET /cloud/storage/{id}/object-lock`). Object lock can only be chosen at creation and never turned off. `object_lock: true` on a standard Object Storage service answers 409 `feature_not_available`. Needs `\"confirm\": true`.",
    "x-description-tr": "Kova oluşturur. Nesne Depolama: ad hizmete özeldir. Korumalı Depolama: her kova sürümlüdür ve ada hizmet kodu eklenir (`<ad>-<kod>`); `object_lock: true` WORM kovası açar (boş kilitli kova hakkı gerekir: Nesne Kilidi ek hizmeti, bkz. `GET /cloud/storage/{id}/object-lock`). Nesne kilidi yalnız açılışta seçilir, sonradan kapatılamaz. Standart Nesne Depolama'da `object_lock: true` 409 `feature_not_available` döner. `\"confirm\": true` gerekir.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "bucket": {
          "type": "string",
          "description": "Bucket name (3-58, lowercase letters, digits, -)",
          "x-description-tr": "Kova adı (3-58, küçük harf, rakam, -)"
         },
         "object_lock": {
          "type": "boolean",
          "description": "Protected Storage only: create with object lock (WORM). Cannot be changed later",
          "x-description-tr": "Yalnız Korumalı Depolama: nesne kilitli (WORM) aç. Sonradan değiştirilemez"
         },
         "confirm": {
          "type": "boolean"
         }
        },
        "required": [
         "bucket"
        ]
       }
      }
     }
    },
    "x-cli": {
     "command": "storage bucket create",
     "confirm": true
    }
   }
  },
  "/cloud/storage/{id}/buckets/{bucket}": {
   "delete": {
    "tags": [
     "Object storage"
    ],
    "operationId": "typed_delete_storage__id__buckets__bucket",
    "summary": "DELETE buckets:delete (GyroDepolama)",
    "x-summary-tr": "buckets:delete (GyroDepolama)",
    "x-scope": "services_write",
    "description": "Typed shortcut of the generic bridge: tool `buckets`, action `delete`. Body fields are the tool's own fields. Needs `\"confirm\": true`.",
    "x-description-tr": "Genel köprünün kısayolu: araç `buckets`, eylem `delete`. Gövde alanları aracın kendi alanlarıdır. `\"confirm\": true` gerekir.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "bucket",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": ""
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "additionalProperties": true,
        "properties": {
         "confirm": {
          "type": "boolean"
         }
        }
       }
      }
     }
    }
   }
  },
  "/cloud/storage/{id}/keys": {
   "get": {
    "tags": [
     "Object storage"
    ],
    "operationId": "typed_get_storage__id__keys",
    "summary": "GET access-keys (GyroDepolama)",
    "x-summary-tr": "access-keys (GyroDepolama)",
    "x-scope": "services_read",
    "description": "Typed shortcut of the generic bridge: tool `access-keys`. Body fields are the tool's own fields.",
    "x-description-tr": "Genel köprünün kısayolu: araç `access-keys`. Gövde alanları aracın kendi alanlarıdır.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     }
    ],
    "responses": {
     "200": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    }
   },
   "post": {
    "tags": [
     "Object storage"
    ],
    "operationId": "typed_post_storage__id__keys",
    "summary": "POST access-keys:create (GyroDepolama)",
    "x-summary-tr": "access-keys:create (GyroDepolama)",
    "x-scope": "services_write",
    "description": "Typed shortcut of the generic bridge: tool `access-keys`, action `create`. Body fields are the tool's own fields.",
    "x-description-tr": "Genel köprünün kısayolu: araç `access-keys`, eylem `create`. Gövde alanları aracın kendi alanlarıdır.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "additionalProperties": true,
        "properties": {
         "confirm": {
          "type": "boolean"
         }
        }
       }
      }
     }
    }
   }
  },
  "/cloud/storage/{id}/keys/{key}/rotate": {
   "post": {
    "tags": [
     "Object storage"
    ],
    "operationId": "typed_post_storage__id__keys__key__rotate",
    "summary": "POST access-keys:rotate (GyroDepolama)",
    "x-summary-tr": "access-keys:rotate (GyroDepolama)",
    "x-scope": "services_write",
    "description": "Typed shortcut of the generic bridge: tool `access-keys`, action `rotate`. Body fields are the tool's own fields. Needs `\"confirm\": true`.",
    "x-description-tr": "Genel köprünün kısayolu: araç `access-keys`, eylem `rotate`. Gövde alanları aracın kendi alanlarıdır. `\"confirm\": true` gerekir.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "key",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": ""
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "additionalProperties": true,
        "properties": {
         "confirm": {
          "type": "boolean"
         }
        }
       }
      }
     }
    }
   }
  },
  "/cloud/storage/{id}/keys/{key}": {
   "delete": {
    "tags": [
     "Object storage"
    ],
    "operationId": "typed_delete_storage__id__keys__key",
    "summary": "DELETE access-keys:delete (GyroDepolama)",
    "x-summary-tr": "access-keys:delete (GyroDepolama)",
    "x-scope": "services_write",
    "description": "Typed shortcut of the generic bridge: tool `access-keys`, action `delete`. Body fields are the tool's own fields. Needs `\"confirm\": true`.",
    "x-description-tr": "Genel köprünün kısayolu: araç `access-keys`, eylem `delete`. Gövde alanları aracın kendi alanlarıdır. `\"confirm\": true` gerekir.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "key",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": ""
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "additionalProperties": true,
        "properties": {
         "confirm": {
          "type": "boolean"
         }
        }
       }
      }
     }
    }
   }
  },
  "/cloud/storage/{id}/usage": {
   "get": {
    "tags": [
     "Object storage"
    ],
    "operationId": "typed_get_storage__id__usage",
    "summary": "GET usage (GyroDepolama)",
    "x-summary-tr": "usage (GyroDepolama)",
    "x-scope": "services_read",
    "description": "Typed shortcut of the generic bridge: tool `usage`. Body fields are the tool's own fields.",
    "x-description-tr": "Genel köprünün kısayolu: araç `usage`. Gövde alanları aracın kendi alanlarıdır.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     }
    ],
    "responses": {
     "200": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    }
   }
  },
  "/cloud/storage/{id}/buckets/{bucket}/rename": {
   "post": {
    "tags": [
     "Object storage"
    ],
    "operationId": "typed_post_storage__id__buckets__bucket__rename",
    "summary": "Rename a bucket",
    "x-summary-tr": "Kova adını değiştir",
    "x-scope": "services_write",
    "description": "Bucket names are private to the service (other customers may use the same name). Data is not moved. S3 access by the old name stops at once; the website moves to `<new>-<service code>.web.gyro-s3.com` and the old website address redirects (301) for 40 days; share links keep working. Max 5 renames per bucket per day; the old name cannot be reused inside the service for 40 days. Needs `\"confirm\": true`. **Protected Storage (2.20.0):** renaming is supported: the bucket's display name and website address (`<new name>-<service code>.kweb.gyro-s3.com`, old address 301 for 40 days) change; the **S3 name stays the same** (versions and locks are never moved), so S3 tools keep using it. The answer carries `s3_name`; `GET /cloud/storage/{id}/buckets` lists `s3_name` for every bucket.",
    "x-description-tr": "Kova adları hizmete özeldir (aynı adı başka müşteriler de kullanabilir). Veri taşınmaz. Eski adla S3 erişimi hemen durur; web sitesi `<yeni>-<hizmet kodu>.web.gyro-s3.com` olur, eski web adresi 40 gün 301 ile yönlendirilir; paylaşım bağlantıları çalışır. Kova başına günde en çok 5; eski ad 40 gün bu hizmette yeniden kullanılamaz. `\"confirm\": true` gerekir. **Korumalı Depolama (2.20.0):** ad değiştirme desteklenir: kovanın görünen adı ve web adresi (`<yeni ad>-<hizmet kodu>.kweb.gyro-s3.com`, eski adres 40 gün 301) değişir; **S3 adı aynı kalır** (sürüm ve kilitler taşınmaz), S3 araçları onu kullanmaya devam eder.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "bucket",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": ""
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "new_name": {
          "type": "string"
         },
         "confirm": {
          "type": "boolean"
         }
        },
        "required": [
         "new_name"
        ]
       }
      }
     }
    },
    "x-cli": {
     "command": "storage bucket rename",
     "confirm": true
    }
   }
  },
  "/cloud/storage/{id}/buckets/{bucket}/objects": {
   "get": {
    "tags": [
     "Object storage"
    ],
    "operationId": "typed_get_storage__id__buckets__bucket__objects",
    "summary": "List objects in a bucket folder",
    "x-summary-tr": "Kova klasöründeki nesneleri listele",
    "x-scope": "services_read",
    "description": "One page (200) of a folder: `folders` (common prefixes) and `files` (key, size, modified). Pass `next` from the previous page to continue.",
    "x-description-tr": "Bir klasörün bir sayfası (200): `folders` ve `files` (anahtar, boyut, tarih). Devam için önceki sayfanın `next` değerini verin.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "bucket",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": ""
     },
     {
      "name": "prefix",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Folder, ends with / (empty = root)"
     },
     {
      "name": "search",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Name prefix inside the folder"
     },
     {
      "name": "next",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Continuation token"
     }
    ],
    "responses": {
     "200": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "x-cli": {
     "command": "storage object list",
     "confirm": false
    }
   }
  },
  "/cloud/storage/{id}/buckets/{bucket}/objects/upload-url": {
   "post": {
    "tags": [
     "Object storage"
    ],
    "operationId": "typed_post_storage__id__buckets__bucket__objects_upload_url",
    "summary": "Presigned upload URLs",
    "x-summary-tr": "İmzalı yükleme adresleri",
    "x-scope": "services_write",
    "description": "Up to 100 files per call, max 5 GiB each. PUT the file body to each `url` within 15 minutes; data never passes through the API. Larger files: any S3 client (multipart).",
    "x-description-tr": "Çağrı başına en çok 100 dosya, dosya başına 5 GiB. Dosyayı 15 dakika içinde her `url` adresine PUT edin; veri API'den geçmez. Büyük dosyalar: herhangi bir S3 istemcisi (multipart).",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "bucket",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": ""
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "prefix": {
          "type": "string",
          "description": "Target folder (ends with /)"
         },
         "items": {
          "type": "array",
          "items": {
           "type": "object",
           "properties": {
            "name": {
             "type": "string"
            },
            "size": {
             "type": "integer"
            }
           },
           "required": [
            "name",
            "size"
           ]
          }
         },
         "confirm": {
          "type": "boolean"
         }
        },
        "required": [
         "items"
        ]
       }
      }
     }
    },
    "x-cli": {
     "command": "storage object upload-url",
     "confirm": false
    }
   }
  },
  "/cloud/storage/{id}/buckets/{bucket}/objects/download-url": {
   "post": {
    "tags": [
     "Object storage"
    ],
    "operationId": "typed_post_storage__id__buckets__bucket__objects_download_url",
    "summary": "Presigned download URL",
    "x-summary-tr": "İmzalı indirme adresi",
    "x-scope": "services_write",
    "description": "Returns a 15-minute GET URL (Content-Disposition: attachment). Downloads count toward the service's monthly traffic.",
    "x-description-tr": "15 dakikalık GET adresi döner (Content-Disposition: attachment). İndirmeler hizmetin aylık trafiğinden düşer.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "bucket",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": ""
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "key": {
          "type": "string",
          "description": "Object key"
         },
         "confirm": {
          "type": "boolean"
         }
        },
        "required": [
         "key"
        ]
       }
      }
     }
    },
    "x-cli": {
     "command": "storage object download-url",
     "confirm": false
    }
   }
  },
  "/cloud/storage/{id}/buckets/{bucket}/objects/delete": {
   "post": {
    "tags": [
     "Object storage"
    ],
    "operationId": "typed_post_storage__id__buckets__bucket__objects_delete",
    "summary": "Delete objects",
    "x-summary-tr": "Nesneleri sil",
    "x-scope": "services_write",
    "description": "Deletes up to 1000 keys in one call. Needs `\"confirm\": true`.",
    "x-description-tr": "Tek çağrıda en çok 1000 anahtar siler. `\"confirm\": true` gerekir.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "bucket",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": ""
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "keys": {
          "type": "array",
          "items": {
           "type": "string"
          }
         },
         "confirm": {
          "type": "boolean"
         }
        },
        "required": [
         "keys"
        ]
       }
      }
     }
    },
    "x-cli": {
     "command": "storage object delete",
     "confirm": true
    }
   }
  },
  "/cloud/storage/{id}/buckets/{bucket}/folders": {
   "post": {
    "tags": [
     "Object storage"
    ],
    "operationId": "typed_post_storage__id__buckets__bucket__folders",
    "summary": "Create a folder",
    "x-summary-tr": "Klasör oluştur",
    "x-scope": "services_write",
    "description": "Creates an empty folder marker `prefix + name + /`.",
    "x-description-tr": "Boş klasör işareti `prefix + name + /` oluşturur.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "bucket",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": ""
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "prefix": {
          "type": "string"
         },
         "name": {
          "type": "string"
         },
         "confirm": {
          "type": "boolean"
         }
        },
        "required": [
         "name"
        ]
       }
      }
     }
    },
    "x-cli": {
     "command": "storage folder create",
     "confirm": false
    }
   },
   "delete": {
    "tags": [
     "Object storage"
    ],
    "operationId": "typed_delete_storage__id__buckets__bucket__folders",
    "summary": "Delete a folder with its contents",
    "x-summary-tr": "Klasörü içindekilerle sil",
    "x-scope": "services_write",
    "description": "Deletes every object under `prefix` (query). Large folders are deleted in batches: repeat while `more` is true. Needs `\"confirm\": true`.",
    "x-description-tr": "`prefix` (sorgu) altındaki tüm nesneleri siler. Büyük klasörler parça parça silinir: `more` true olduğu sürece tekrarlayın. `\"confirm\": true` gerekir.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "bucket",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": ""
     },
     {
      "name": "prefix",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Folder, ends with /"
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "confirm": {
          "type": "boolean"
         }
        },
        "required": []
       }
      }
     }
    },
    "x-cli": {
     "command": "storage folder delete",
     "confirm": true
    }
   }
  },
  "/cloud/storage/{id}/buckets/{bucket}/folders/count": {
   "get": {
    "tags": [
     "Object storage"
    ],
    "operationId": "typed_get_storage__id__buckets__bucket__folders_count",
    "summary": "Count objects in a folder",
    "x-summary-tr": "Klasördeki nesneleri say",
    "x-scope": "services_read",
    "description": "Number of objects under `prefix` (`more` = over 100000 or time limit).",
    "x-description-tr": "`prefix` altındaki nesne sayısı (`more` = 100000 üstü ya da süre sınırı).",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "bucket",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": ""
     },
     {
      "name": "prefix",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Folder, ends with /"
     }
    ],
    "responses": {
     "200": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "x-cli": {
     "command": "storage folder count",
     "confirm": false
    }
   }
  },
  "/cloud/storage/{id}/connect": {
   "get": {
    "tags": [
     "Object storage"
    ],
    "operationId": "typed_get_storage__id__connect",
    "summary": "GET connect (GyroDepolama)",
    "x-summary-tr": "connect (GyroDepolama)",
    "x-scope": "services_read",
    "description": "Typed shortcut of the generic bridge: tool `connect`. Body fields are the tool's own fields.",
    "x-description-tr": "Genel köprünün kısayolu: araç `connect`. Gövde alanları aracın kendi alanlarıdır.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     }
    ],
    "responses": {
     "200": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    }
   }
  },
  "/cloud/storage/{id}/buckets/{bucket}/website": {
   "get": {
    "tags": [
     "Object storage"
    ],
    "operationId": "typed_get_storage__id__buckets__bucket__website",
    "summary": "Static website settings of a bucket",
    "x-summary-tr": "Kovanın statik web sitesi ayarları",
    "x-scope": "services_read",
    "description": "`enabled`, `url`, `index_document` (entry file, default index.html), `error_document` (404 page) and `spa` (single-page app fallback).",
    "x-description-tr": "`enabled`, `url`, `index_document` (giriş dosyası, varsayılan index.html), `error_document` (404 sayfası) ve `spa` (tek sayfa uygulama yönlendirmesi).",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "bucket",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": ""
     }
    ],
    "responses": {
     "200": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "x-cli": {
     "command": "storage website get",
     "confirm": false
    }
   },
   "put": {
    "tags": [
     "Object storage"
    ],
    "operationId": "typed_put_storage__id__buckets__bucket__website",
    "summary": "Enable / update the static website",
    "x-summary-tr": "Statik web sitesini aç / güncelle",
    "x-scope": "services_write",
    "description": "Full replace: omitted fields fall back to the defaults (index.html, no error page, SPA off). `index_document` is a file name (no `/`), served at the root and in every folder. `spa: true` answers every missing path with the entry file and status 200 (React/Vue/Angular routing, page reloads); real files are served as they are and the error page is not used while SPA is on. Enabling a disabled website needs `accept: true` (abuse rules: everything in the bucket becomes public). Address: `https://<bucket>-<service code>.web.gyro-s3.com` and connected custom domains.",
    "x-description-tr": "Tam değiştirme: verilmeyen alanlar varsayılana döner (index.html, 404 sayfası yok, SPA kapalı). `index_document` bir dosya adıdır (`/` yok); kökte ve her klasörde açılır. `spa: true` bulunmayan her yolu giriş dosyasıyla ve 200 koduyla yanıtlar (React/Vue/Angular yönlendirme, sayfa yenileme); gerçek dosyalar olduğu gibi gelir, SPA açıkken 404 sayfası kullanılmaz. Kapalı siteyi açmak `accept: true` ister (kötüye kullanım kuralları: kovadaki her şey herkese açılır).",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "bucket",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": ""
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "index_document": {
          "type": "string",
          "description": "Entry file name, default index.html (e.g. app.html)",
          "x-description-tr": "Giriş dosyası adı, varsayılan index.html (ör. app.html)"
         },
         "error_document": {
          "type": "string",
          "description": "Object key of the 404 page (e.g. 404.html or errors/404.html), empty = none",
          "x-description-tr": "404 sayfasının nesne anahtarı (ör. 404.html), boş = yok"
         },
         "spa": {
          "type": "boolean",
          "description": "Route missing sub-paths to the entry file with status 200",
          "x-description-tr": "Bulunmayan alt yolları giriş dosyasına 200 ile yönlendir"
         },
         "accept": {
          "type": "boolean",
          "description": "Accept the abuse rules (needed when the website is off)",
          "x-description-tr": "Kötüye kullanım kurallarını kabul et (site kapalıyken gerekli)"
         },
         "confirm": {
          "type": "boolean"
         }
        },
        "required": []
       }
      }
     }
    },
    "x-cli": {
     "command": "storage website set",
     "confirm": false
    }
   },
   "delete": {
    "tags": [
     "Object storage"
    ],
    "operationId": "typed_delete_storage__id__buckets__bucket__website",
    "summary": "Disable the static website",
    "x-summary-tr": "Statik web sitesini kapat",
    "x-scope": "services_write",
    "description": "The bucket stays; settings (entry file, error page, SPA) are kept for the next enable. Needs `\"confirm\": true`.",
    "x-description-tr": "Kova durur; ayarlar (giriş dosyası, 404, SPA) sonraki açılış için saklanır. `\"confirm\": true` gerekir.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "bucket",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": ""
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "confirm": {
          "type": "boolean"
         }
        },
        "required": []
       }
      }
     }
    },
    "x-cli": {
     "command": "storage website disable",
     "confirm": true
    }
   }
  },
  "/cloud/storage/{id}/buckets/{bucket}/cors": {
   "get": {
    "tags": [
     "Object storage"
    ],
    "operationId": "typed_get_storage__id__buckets__bucket__cors",
    "summary": "CORS rules of a bucket",
    "x-summary-tr": "Kovanın CORS kuralları",
    "x-scope": "services_read",
    "description": "`rules` (snake_case) and `json` (the same rules in AWS S3 format, pretty printed).",
    "x-description-tr": "`rules` (snake_case) ve `json` (aynı kurallar AWS S3 biçiminde).",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "bucket",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": ""
     }
    ],
    "responses": {
     "200": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "x-cli": {
     "command": "storage cors get",
     "confirm": false
    }
   },
   "put": {
    "tags": [
     "Object storage"
    ],
    "operationId": "typed_put_storage__id__buckets__bucket__cors",
    "summary": "Replace the CORS rules of a bucket",
    "x-summary-tr": "Kovanın CORS kurallarını değiştir",
    "x-scope": "services_write",
    "description": "Replaces every rule. Send `rules` (array), `CORSRules` (an AWS `put-bucket-cors` file works as is: `gyro storage cors set ID BUCKET --data @cors.json`) or `cors_json` (the JSON as text). Field names may be AWS style (`AllowedOrigins`) or snake_case (`allowed_origins`). Limits: 100 rules, 50 origins/headers per rule, 16 KB, methods GET/PUT/POST/DELETE/HEAD, `MaxAgeSeconds` 0-86400, at most one `*` per origin. An empty list removes the rules. Rules apply to the S3 endpoint and to the static website (and custom domains).",
    "x-description-tr": "Tüm kuralların yerine geçer. `rules` (dizi), `CORSRules` (AWS `put-bucket-cors` dosyası olduğu gibi: `--data @cors.json`) ya da `cors_json` (metin) gönderin. Alan adları AWS (`AllowedOrigins`) ya da snake_case olabilir. Sınırlar: 100 kural, kural başına 50 köken/başlık, 16 KB, yöntemler GET/PUT/POST/DELETE/HEAD, `MaxAgeSeconds` 0-86400, kökende en çok bir `*`. Boş liste kuralları kaldırır. Kurallar S3 adresinde ve statik web sitesinde (özel alan adları dahil) geçerlidir.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "bucket",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": ""
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "rules": {
          "allOf": [
           {
            "type": "array",
            "maxItems": 100,
            "items": {
             "$ref": "#/components/schemas/StorageCorsRule"
            }
           }
          ],
          "description": "CORS rules as a JSON array",
          "x-description-tr": "CORS kuralları (JSON dizi)"
         },
         "cors_json": {
          "type": "string",
          "description": "Alternative: the rules as JSON text ({\"CORSRules\":[...]} or [...])",
          "x-description-tr": "Alternatif: kurallar JSON metni olarak"
         },
         "confirm": {
          "type": "boolean"
         }
        },
        "required": []
       }
      }
     }
    },
    "x-cli": {
     "command": "storage cors set",
     "confirm": false
    }
   },
   "delete": {
    "tags": [
     "Object storage"
    ],
    "operationId": "typed_delete_storage__id__buckets__bucket__cors",
    "summary": "Remove every CORS rule of a bucket",
    "x-summary-tr": "Kovanın tüm CORS kurallarını kaldır",
    "x-scope": "services_write",
    "description": "Browsers can no longer read the bucket cross-origin. Needs `\"confirm\": true`.",
    "x-description-tr": "Tarayıcılar kovayı başka kökenden okuyamaz. `\"confirm\": true` gerekir.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "bucket",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": ""
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "confirm": {
          "type": "boolean"
         }
        },
        "required": []
       }
      }
     }
    },
    "x-cli": {
     "command": "storage cors delete",
     "confirm": true
    }
   }
  },
  "/cloud/monitors/{id}/monitors": {
   "get": {
    "tags": [
     "Monitoring (uptime)"
    ],
    "operationId": "typed_get_monitors__id__monitors",
    "summary": "GET monitors (GyroMonitor)",
    "x-summary-tr": "monitors (GyroMonitor)",
    "x-scope": "services_read",
    "description": "Typed shortcut of the generic bridge: tool `monitors`. Body fields are the tool's own fields.",
    "x-description-tr": "Genel köprünün kısayolu: araç `monitors`. Gövde alanları aracın kendi alanlarıdır.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     }
    ],
    "responses": {
     "200": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    }
   },
   "post": {
    "tags": [
     "Monitoring (uptime)"
    ],
    "operationId": "typed_post_monitors__id__monitors",
    "summary": "POST monitors:create (GyroMonitor)",
    "x-summary-tr": "monitors:create (GyroMonitor)",
    "x-scope": "services_write",
    "description": "Typed shortcut of the generic bridge: tool `monitors`, action `create`. Body fields are the tool's own fields.",
    "x-description-tr": "Genel köprünün kısayolu: araç `monitors`, eylem `create`. Gövde alanları aracın kendi alanlarıdır.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "additionalProperties": true,
        "properties": {
         "confirm": {
          "type": "boolean"
         }
        }
       }
      }
     }
    }
   }
  },
  "/cloud/monitors/{id}/monitors/{mid}": {
   "patch": {
    "tags": [
     "Monitoring (uptime)"
    ],
    "operationId": "typed_patch_monitors__id__monitors__mid",
    "summary": "PATCH monitors:edit (GyroMonitor)",
    "x-summary-tr": "monitors:edit (GyroMonitor)",
    "x-scope": "services_write",
    "description": "Typed shortcut of the generic bridge: tool `monitors`, action `edit`. Body fields are the tool's own fields.",
    "x-description-tr": "Genel köprünün kısayolu: araç `monitors`, eylem `edit`. Gövde alanları aracın kendi alanlarıdır.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "mid",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": ""
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "additionalProperties": true,
        "properties": {
         "confirm": {
          "type": "boolean"
         }
        }
       }
      }
     }
    }
   },
   "delete": {
    "tags": [
     "Monitoring (uptime)"
    ],
    "operationId": "typed_delete_monitors__id__monitors__mid",
    "summary": "DELETE monitors:delete (GyroMonitor)",
    "x-summary-tr": "monitors:delete (GyroMonitor)",
    "x-scope": "services_write",
    "description": "Typed shortcut of the generic bridge: tool `monitors`, action `delete`. Body fields are the tool's own fields. Needs `\"confirm\": true`.",
    "x-description-tr": "Genel köprünün kısayolu: araç `monitors`, eylem `delete`. Gövde alanları aracın kendi alanlarıdır. `\"confirm\": true` gerekir.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "mid",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": ""
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "additionalProperties": true,
        "properties": {
         "confirm": {
          "type": "boolean"
         }
        }
       }
      }
     }
    }
   }
  },
  "/cloud/monitors/{id}/monitors/{mid}/pause": {
   "post": {
    "tags": [
     "Monitoring (uptime)"
    ],
    "operationId": "typed_post_monitors__id__monitors__mid__pause",
    "summary": "POST monitors:pause (GyroMonitor)",
    "x-summary-tr": "monitors:pause (GyroMonitor)",
    "x-scope": "services_write",
    "description": "Typed shortcut of the generic bridge: tool `monitors`, action `pause`. Body fields are the tool's own fields.",
    "x-description-tr": "Genel köprünün kısayolu: araç `monitors`, eylem `pause`. Gövde alanları aracın kendi alanlarıdır.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "mid",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": ""
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "additionalProperties": true,
        "properties": {
         "confirm": {
          "type": "boolean"
         }
        }
       }
      }
     }
    }
   }
  },
  "/cloud/monitors/{id}/monitors/{mid}/resume": {
   "post": {
    "tags": [
     "Monitoring (uptime)"
    ],
    "operationId": "typed_post_monitors__id__monitors__mid__resume",
    "summary": "POST monitors:resume (GyroMonitor)",
    "x-summary-tr": "monitors:resume (GyroMonitor)",
    "x-scope": "services_write",
    "description": "Typed shortcut of the generic bridge: tool `monitors`, action `resume`. Body fields are the tool's own fields.",
    "x-description-tr": "Genel köprünün kısayolu: araç `monitors`, eylem `resume`. Gövde alanları aracın kendi alanlarıdır.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "mid",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": ""
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "additionalProperties": true,
        "properties": {
         "confirm": {
          "type": "boolean"
         }
        }
       }
      }
     }
    }
   }
  },
  "/cloud/monitors/{id}/channels": {
   "get": {
    "tags": [
     "Monitoring (uptime)"
    ],
    "operationId": "typed_get_monitors__id__channels",
    "summary": "GET channels (GyroMonitor)",
    "x-summary-tr": "channels (GyroMonitor)",
    "x-scope": "services_read",
    "description": "Typed shortcut of the generic bridge: tool `channels`. Body fields are the tool's own fields.",
    "x-description-tr": "Genel köprünün kısayolu: araç `channels`. Gövde alanları aracın kendi alanlarıdır.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     }
    ],
    "responses": {
     "200": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    }
   },
   "post": {
    "tags": [
     "Monitoring (uptime)"
    ],
    "operationId": "typed_post_monitors__id__channels",
    "summary": "POST channels:create (GyroMonitor)",
    "x-summary-tr": "channels:create (GyroMonitor)",
    "x-scope": "services_write",
    "description": "Typed shortcut of the generic bridge: tool `channels`, action `create`. Body fields are the tool's own fields.",
    "x-description-tr": "Genel köprünün kısayolu: araç `channels`, eylem `create`. Gövde alanları aracın kendi alanlarıdır.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "additionalProperties": true,
        "properties": {
         "confirm": {
          "type": "boolean"
         }
        }
       }
      }
     }
    }
   }
  },
  "/cloud/monitors/{id}/channels/{cid}": {
   "delete": {
    "tags": [
     "Monitoring (uptime)"
    ],
    "operationId": "typed_delete_monitors__id__channels__cid",
    "summary": "DELETE channels:delete (GyroMonitor)",
    "x-summary-tr": "channels:delete (GyroMonitor)",
    "x-scope": "services_write",
    "description": "Typed shortcut of the generic bridge: tool `channels`, action `delete`. Body fields are the tool's own fields. Needs `\"confirm\": true`.",
    "x-description-tr": "Genel köprünün kısayolu: araç `channels`, eylem `delete`. Gövde alanları aracın kendi alanlarıdır. `\"confirm\": true` gerekir.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "cid",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Certificate id"
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "additionalProperties": true,
        "properties": {
         "confirm": {
          "type": "boolean"
         }
        }
       }
      }
     }
    }
   }
  },
  "/cloud/monitors/{id}/heartbeats": {
   "get": {
    "tags": [
     "Monitoring (uptime)"
    ],
    "operationId": "typed_get_monitors__id__heartbeats",
    "summary": "GET heartbeats (GyroMonitor)",
    "x-summary-tr": "heartbeats (GyroMonitor)",
    "x-scope": "services_read",
    "description": "Typed shortcut of the generic bridge: tool `heartbeats`. Body fields are the tool's own fields.",
    "x-description-tr": "Genel köprünün kısayolu: araç `heartbeats`. Gövde alanları aracın kendi alanlarıdır.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     }
    ],
    "responses": {
     "200": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    }
   },
   "post": {
    "tags": [
     "Monitoring (uptime)"
    ],
    "operationId": "typed_post_monitors__id__heartbeats",
    "summary": "POST heartbeats:create (GyroMonitor)",
    "x-summary-tr": "heartbeats:create (GyroMonitor)",
    "x-scope": "services_write",
    "description": "Typed shortcut of the generic bridge: tool `heartbeats`, action `create`. Body fields are the tool's own fields.",
    "x-description-tr": "Genel köprünün kısayolu: araç `heartbeats`, eylem `create`. Gövde alanları aracın kendi alanlarıdır.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "additionalProperties": true,
        "properties": {
         "confirm": {
          "type": "boolean"
         }
        }
       }
      }
     }
    }
   }
  },
  "/cloud/monitors/{id}/status-pages": {
   "get": {
    "tags": [
     "Monitoring (uptime)"
    ],
    "operationId": "typed_get_monitors__id__status_pages",
    "summary": "GET status-pages (GyroMonitor)",
    "x-summary-tr": "status-pages (GyroMonitor)",
    "x-scope": "services_read",
    "description": "Typed shortcut of the generic bridge: tool `status-pages`. Body fields are the tool's own fields.",
    "x-description-tr": "Genel köprünün kısayolu: araç `status-pages`. Gövde alanları aracın kendi alanlarıdır.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     }
    ],
    "responses": {
     "200": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    }
   }
  },
  "/cloud/load-balancers/{id}/services": {
   "get": {
    "tags": [
     "Load balancers"
    ],
    "operationId": "typed_get_load_balancers__id__services",
    "summary": "List services (ports) of a load balancer",
    "x-summary-tr": "Yük dengeleyicinin servislerini (portlarını) listele",
    "x-scope": "services_read",
    "description": "Services with health check and HTTP options, plus the certificates of this load balancer and its limits.",
    "x-description-tr": "Servisler, sağlık kontrolü ve HTTP seçenekleriyle; ayrıca sertifikalar ve sınırlar.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     }
    ],
    "responses": {
     "200": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "x-cli": {
     "command": "lb service list",
     "confirm": false
    }
   },
   "post": {
    "tags": [
     "Load balancers"
    ],
    "operationId": "typed_post_load_balancers__id__services",
    "summary": "Add a service",
    "x-summary-tr": "Servis ekle",
    "x-scope": "services_write",
    "description": "Adds a listener. HTTPS needs at least one certificate of this load balancer; TLS ends at the load balancer and targets get HTTP. Use TCP 443 for passthrough.",
    "x-description-tr": "Dinleyici ekler. HTTPS en az bir sertifika ister; TLS yük dengeleyicide sonlanır, hedeflere HTTP gider. Şifreli geçiş için TCP 443.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "protocol": {
          "type": "string",
          "enum": [
           "tcp",
           "http",
           "https"
          ]
         },
         "listen_port": {
          "type": "integer",
          "description": "Port the load balancer listens on"
         },
         "destination_port": {
          "type": "integer",
          "description": "Port on the targets"
         },
         "proxyprotocol": {
          "type": "boolean",
          "description": "Send PROXY protocol header to targets"
         },
         "hc_protocol": {
          "type": "string",
          "enum": [
           "tcp",
           "http"
          ],
          "description": "Health check type"
         },
         "hc_port": {
          "type": "integer"
         },
         "hc_interval": {
          "type": "integer",
          "description": "3-60 s"
         },
         "hc_timeout": {
          "type": "integer",
          "description": "1-30 s, below interval"
         },
         "hc_retries": {
          "type": "integer",
          "description": "0-5"
         },
         "hc_path": {
          "type": "string",
          "description": "HTTP check path (starts with /)"
         },
         "hc_domain": {
          "type": "string",
          "description": "HTTP check Host header"
         },
         "hc_status_codes": {
          "type": "string",
          "description": "Comma separated, e.g. 2??,3??"
         },
         "hc_tls": {
          "type": "boolean",
          "description": "HTTP check over TLS"
         },
         "sticky": {
          "type": "boolean",
          "description": "Sticky sessions (cookie)"
         },
         "cookie_name": {
          "type": "string"
         },
         "cookie_lifetime": {
          "type": "integer"
         },
         "idle_timeout": {
          "type": "integer",
          "description": "Idle timeout (s)"
         },
         "certificates": {
          "type": "string",
          "description": "HTTPS: comma separated certificate ids of this load balancer"
         },
         "redirect_http": {
          "type": "boolean",
          "description": "HTTPS: redirect port 80 to HTTPS (port 80 must be free)"
         },
         "confirm": {
          "type": "boolean"
         }
        },
        "required": [
         "protocol",
         "listen_port",
         "destination_port"
        ]
       }
      }
     }
    },
    "x-cli": {
     "command": "lb service add",
     "confirm": false
    }
   }
  },
  "/cloud/load-balancers/{id}/services/{port}": {
   "patch": {
    "tags": [
     "Load balancers"
    ],
    "operationId": "typed_patch_load_balancers__id__services__port",
    "summary": "Update a service",
    "x-summary-tr": "Servisi güncelle",
    "x-scope": "services_write",
    "description": "Changes options of the service on {port}. The protocol cannot change (delete and add).",
    "x-description-tr": "{port} servisinin seçeneklerini değiştirir. Protokol değişmez (silip ekleyin).",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "port",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Listen port"
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "destination_port": {
          "type": "integer",
          "description": "Port on the targets"
         },
         "proxyprotocol": {
          "type": "boolean",
          "description": "Send PROXY protocol header to targets"
         },
         "hc_protocol": {
          "type": "string",
          "enum": [
           "tcp",
           "http"
          ],
          "description": "Health check type"
         },
         "hc_port": {
          "type": "integer"
         },
         "hc_interval": {
          "type": "integer",
          "description": "3-60 s"
         },
         "hc_timeout": {
          "type": "integer",
          "description": "1-30 s, below interval"
         },
         "hc_retries": {
          "type": "integer",
          "description": "0-5"
         },
         "hc_path": {
          "type": "string",
          "description": "HTTP check path (starts with /)"
         },
         "hc_domain": {
          "type": "string",
          "description": "HTTP check Host header"
         },
         "hc_status_codes": {
          "type": "string",
          "description": "Comma separated, e.g. 2??,3??"
         },
         "hc_tls": {
          "type": "boolean",
          "description": "HTTP check over TLS"
         },
         "sticky": {
          "type": "boolean",
          "description": "Sticky sessions (cookie)"
         },
         "cookie_name": {
          "type": "string"
         },
         "cookie_lifetime": {
          "type": "integer"
         },
         "idle_timeout": {
          "type": "integer",
          "description": "Idle timeout (s)"
         },
         "certificates": {
          "type": "string",
          "description": "HTTPS: comma separated certificate ids of this load balancer"
         },
         "redirect_http": {
          "type": "boolean",
          "description": "HTTPS: redirect port 80 to HTTPS (port 80 must be free)"
         },
         "confirm": {
          "type": "boolean"
         }
        },
        "required": []
       }
      }
     }
    },
    "x-cli": {
     "command": "lb service update",
     "confirm": false
    }
   },
   "delete": {
    "tags": [
     "Load balancers"
    ],
    "operationId": "typed_delete_load_balancers__id__services__port",
    "summary": "Delete a service",
    "x-summary-tr": "Servisi sil",
    "x-scope": "services_write",
    "description": "Stops listening on {port}. Needs `\"confirm\": true`.",
    "x-description-tr": "{port} portundaki dinlemeyi durdurur. `\"confirm\": true` gerekir.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "port",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Listen port"
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "additionalProperties": true,
        "properties": {
         "confirm": {
          "type": "boolean"
         }
        }
       }
      }
     }
    },
    "x-cli": {
     "command": "lb service delete",
     "confirm": true
    }
   }
  },
  "/cloud/load-balancers/{id}/targets": {
   "get": {
    "tags": [
     "Load balancers"
    ],
    "operationId": "typed_get_load_balancers__id__targets",
    "summary": "List targets with health",
    "x-summary-tr": "Hedefleri sağlık durumuyla listele",
    "x-scope": "services_read",
    "description": "Targets, per-service health (healthy/unhealthy/unknown), and the cloud servers / dedicated IPs that can be added.",
    "x-description-tr": "Hedefler, servis başına sağlık durumu ve eklenebilecek bulut sunucular / fiziksel sunucu IP'leri.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     }
    ],
    "responses": {
     "200": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "x-cli": {
     "command": "lb target list",
     "confirm": false
    }
   },
   "post": {
    "tags": [
     "Load balancers"
    ],
    "operationId": "typed_post_load_balancers__id__targets",
    "summary": "Add a target",
    "x-summary-tr": "Hedef ekle",
    "x-scope": "services_write",
    "description": "type=server (server = your cloud server id, same region), type=all (all your cloud servers, new ones join automatically) or type=ip (your dedicated server IP). use_private_ip needs a private network attached.",
    "x-description-tr": "type=server (server = bulut sunucu hizmet no, aynı bölge), type=all (tüm bulut sunucularınız, yeniler otomatik) ya da type=ip (fiziksel sunucu IP'niz). use_private_ip için özel ağ bağlı olmalı.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "type": {
          "type": "string",
          "enum": [
           "server",
           "all",
           "ip"
          ]
         },
         "server": {
          "type": "integer",
          "description": "Cloud server id (type=server)"
         },
         "ip": {
          "type": "string",
          "description": "Dedicated server IP (type=ip)"
         },
         "use_private_ip": {
          "type": "boolean"
         },
         "confirm": {
          "type": "boolean"
         }
        },
        "required": [
         "type"
        ]
       }
      }
     }
    },
    "x-cli": {
     "command": "lb target add",
     "confirm": false
    }
   },
   "delete": {
    "tags": [
     "Load balancers"
    ],
    "operationId": "typed_delete_load_balancers__id__targets",
    "summary": "Remove a target",
    "x-summary-tr": "Hedefi çıkar",
    "x-scope": "services_write",
    "description": "Same fields as add, in the query string (?type=server&server=123&confirm=true) or the JSON body. Needs `\"confirm\": true`.",
    "x-description-tr": "Eklemedeki alanlar; sorguda (?type=server&server=123&confirm=true) ya da JSON gövdede. `\"confirm\": true` gerekir.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "type",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "server | all | ip"
     },
     {
      "name": "server",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Cloud server id"
     },
     {
      "name": "ip",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Dedicated server IP"
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "type": {
          "type": "string"
         },
         "server": {
          "type": "integer"
         },
         "ip": {
          "type": "string"
         },
         "confirm": {
          "type": "boolean"
         }
        },
        "required": []
       }
      }
     }
    },
    "x-cli": {
     "command": "lb target remove",
     "confirm": true
    }
   }
  },
  "/cloud/load-balancers/{id}/certificates": {
   "get": {
    "tags": [
     "Load balancers"
    ],
    "operationId": "typed_get_load_balancers__id__certificates",
    "summary": "List certificates",
    "x-summary-tr": "Sertifikaları listele",
    "x-scope": "services_read",
    "description": "Uploaded and Let's Encrypt certificates (Let's Encrypt ones renew automatically), a pending Let's Encrypt request and the validation redirect base URL.",
    "x-description-tr": "Yüklenen ve Let's Encrypt sertifikaları (Let's Encrypt kendiliğinden yenilenir), bekleyen istek ve doğrulama yönlendirme adresi.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     }
    ],
    "responses": {
     "200": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "x-cli": {
     "command": "lb cert list",
     "confirm": false
    }
   },
   "post": {
    "tags": [
     "Load balancers"
    ],
    "operationId": "typed_post_load_balancers__id__certificates",
    "summary": "Upload a certificate",
    "x-summary-tr": "Sertifika yükle",
    "x-scope": "services_write",
    "description": "PEM certificate chain + unencrypted private key. The key is sent to the load balancer only; it is never stored or logged by the panel.",
    "x-description-tr": "PEM sertifika zinciri + şifresiz özel anahtar. Anahtar yalnız yük dengeleyiciye gönderilir; panelde saklanmaz, loglanmaz.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "name": {
          "type": "string"
         },
         "certificate": {
          "type": "string",
          "description": "PEM chain"
         },
         "private_key": {
          "type": "string",
          "description": "PEM key (unencrypted)"
         },
         "confirm": {
          "type": "boolean"
         }
        },
        "required": [
         "certificate",
         "private_key"
        ]
       }
      }
     }
    },
    "x-cli": {
     "command": "lb cert upload",
     "confirm": false
    }
   }
  },
  "/cloud/load-balancers/{id}/certificates/letsencrypt": {
   "post": {
    "tags": [
     "Load balancers"
    ],
    "operationId": "typed_post_load_balancers__id__certificates_letsencrypt",
    "summary": "Request a free Let's Encrypt certificate",
    "x-summary-tr": "Ücretsiz Let's Encrypt sertifikası iste",
    "x-scope": "services_write",
    "description": "Up to 10 names whose A record points to this load balancer. Your targets must redirect /.well-known/acme-challenge/<token> to the redirect base shown in GET certificates; answer `acme=waiting` lists the per-name check, fix the redirect and call verify.",
    "x-description-tr": "A kaydı bu yük dengeleyiciye yönlenmiş en çok 10 ad. Hedefleriniz /.well-known/acme-challenge/<token> isteklerini GET certificates'taki adrese yönlendirmeli; `acme=waiting` yanıtı ad başına kontrolü verir, yönlendirmeyi düzeltip verify çağırın.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "domains": {
          "type": "string",
          "description": "Comma separated names"
         },
         "confirm": {
          "type": "boolean"
         }
        },
        "required": [
         "domains"
        ]
       }
      }
     }
    },
    "x-cli": {
     "command": "lb cert letsencrypt",
     "confirm": false
    }
   },
   "delete": {
    "tags": [
     "Load balancers"
    ],
    "operationId": "typed_delete_load_balancers__id__certificates_letsencrypt",
    "summary": "Cancel a pending Let's Encrypt request",
    "x-summary-tr": "Bekleyen Let's Encrypt isteğini iptal et",
    "x-scope": "services_write",
    "description": "Drops the pending order. Needs `\"confirm\": true`.",
    "x-description-tr": "Bekleyen isteği bırakır. `\"confirm\": true` gerekir.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "additionalProperties": true,
        "properties": {
         "confirm": {
          "type": "boolean"
         }
        }
       }
      }
     }
    },
    "x-cli": {
     "command": "lb cert cancel",
     "confirm": true
    }
   }
  },
  "/cloud/load-balancers/{id}/certificates/letsencrypt/verify": {
   "post": {
    "tags": [
     "Load balancers"
    ],
    "operationId": "typed_post_load_balancers__id__certificates_letsencrypt_verify",
    "summary": "Continue a pending Let's Encrypt request",
    "x-summary-tr": "Bekleyen Let's Encrypt isteğini sürdür",
    "x-scope": "services_write",
    "description": "Re-checks the redirect, lets the CA validate and uploads the certificate (`acme=issued`).",
    "x-description-tr": "Yönlendirmeyi yeniden dener, doğrulatır ve sertifikayı yükler (`acme=issued`).",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "additionalProperties": true,
        "properties": {
         "confirm": {
          "type": "boolean"
         }
        }
       }
      }
     }
    },
    "x-cli": {
     "command": "lb cert verify",
     "confirm": false
    }
   }
  },
  "/cloud/load-balancers/{id}/certificates/{cid}": {
   "delete": {
    "tags": [
     "Load balancers"
    ],
    "operationId": "typed_delete_load_balancers__id__certificates__cid",
    "summary": "Delete a certificate",
    "x-summary-tr": "Sertifikayı sil",
    "x-scope": "services_write",
    "description": "Only certificates not used by a service. Needs `\"confirm\": true`.",
    "x-description-tr": "Yalnız bir serviste kullanılmayan sertifikalar. `\"confirm\": true` gerekir.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "cid",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Certificate id"
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "additionalProperties": true,
        "properties": {
         "confirm": {
          "type": "boolean"
         }
        }
       }
      }
     }
    },
    "x-cli": {
     "command": "lb cert delete",
     "confirm": true
    }
   }
  },
  "/cloud/load-balancers/{id}/settings": {
   "get": {
    "tags": [
     "Load balancers"
    ],
    "operationId": "typed_get_load_balancers__id__settings",
    "summary": "Algorithm, reverse DNS, private network",
    "x-summary-tr": "Algoritma, ters DNS, özel ağ",
    "x-scope": "services_read",
    "description": "Current algorithm, PTR records, your private networks in the same region (attached or not) and limits.",
    "x-description-tr": "Algoritma, PTR kayıtları, aynı bölgedeki özel ağlarınız ve sınırlar.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     }
    ],
    "responses": {
     "200": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "x-cli": {
     "command": "lb settings",
     "confirm": false
    }
   }
  },
  "/cloud/load-balancers/{id}/algorithm": {
   "put": {
    "tags": [
     "Load balancers"
    ],
    "operationId": "typed_put_load_balancers__id__algorithm",
    "summary": "Change the balancing algorithm",
    "x-summary-tr": "Dağıtım algoritmasını değiştir",
    "x-scope": "services_write",
    "description": "round_robin or least_connections.",
    "x-description-tr": "round_robin ya da least_connections.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "algorithm": {
          "type": "string",
          "enum": [
           "round_robin",
           "least_connections"
          ]
         },
         "confirm": {
          "type": "boolean"
         }
        },
        "required": [
         "algorithm"
        ]
       }
      }
     }
    },
    "x-cli": {
     "command": "lb algorithm set",
     "confirm": false
    }
   }
  },
  "/cloud/load-balancers/{id}/rdns": {
   "put": {
    "tags": [
     "Load balancers"
    ],
    "operationId": "typed_put_load_balancers__id__rdns",
    "summary": "Set reverse DNS",
    "x-summary-tr": "Ters DNS ayarla",
    "x-scope": "services_write",
    "description": "PTR for one of the load balancer's IPs; empty ptr restores the default.",
    "x-description-tr": "Yük dengeleyici IP'lerinden biri için PTR; boş değer varsayılana döndürür.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "ip": {
          "type": "string"
         },
         "ptr": {
          "type": "string"
         },
         "confirm": {
          "type": "boolean"
         }
        },
        "required": [
         "ip"
        ]
       }
      }
     }
    },
    "x-cli": {
     "command": "lb rdns set",
     "confirm": false
    }
   }
  },
  "/cloud/load-balancers/{id}/network": {
   "post": {
    "tags": [
     "Load balancers"
    ],
    "operationId": "typed_post_load_balancers__id__network",
    "summary": "Attach to a private network",
    "x-summary-tr": "Özel ağa bağla",
    "x-scope": "services_write",
    "description": "One of your private networks in the same region (GET settings).",
    "x-description-tr": "Aynı bölgedeki özel ağlarınızdan biri (GET settings).",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "network": {
          "type": "integer"
         },
         "confirm": {
          "type": "boolean"
         }
        },
        "required": [
         "network"
        ]
       }
      }
     }
    },
    "x-cli": {
     "command": "lb network attach",
     "confirm": false
    }
   }
  },
  "/cloud/load-balancers/{id}/network/{nid}": {
   "delete": {
    "tags": [
     "Load balancers"
    ],
    "operationId": "typed_delete_load_balancers__id__network__nid",
    "summary": "Detach from a private network",
    "x-summary-tr": "Özel ağdan ayır",
    "x-scope": "services_write",
    "description": "Targets that use private IPs must be removed first. Needs `\"confirm\": true`.",
    "x-description-tr": "Özel IP kullanan hedefler önce çıkarılmalı. `\"confirm\": true` gerekir.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "nid",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Private network id"
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "additionalProperties": true,
        "properties": {
         "confirm": {
          "type": "boolean"
         }
        }
       }
      }
     }
    },
    "x-cli": {
     "command": "lb network detach",
     "confirm": true
    }
   }
  },
  "/cloud/load-balancers/{id}/metrics": {
   "get": {
    "tags": [
     "Load balancers"
    ],
    "operationId": "typed_get_load_balancers__id__metrics",
    "summary": "Load balancer metrics",
    "x-summary-tr": "Yük dengeleyici ölçümleri",
    "x-scope": "services_read",
    "description": "Open connections, new connections/s, requests/s, bandwidth in/out (Mbit/s).",
    "x-description-tr": "Açık bağlantı, yeni bağlantı/sn, istek/sn, bant genişliği (Mbit/s).",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "period",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "24h | 7d | 30d"
     }
    ],
    "responses": {
     "200": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "x-cli": {
     "command": "lb metrics",
     "confirm": false
    }
   }
  },
  "/cloud/dns/{id}/zones": {
   "get": {
    "tags": [
     "Managed DNS"
    ],
    "operationId": "typed_get_dns__id__zones",
    "summary": "List DNS zones",
    "x-summary-tr": "DNS zone'larını listele",
    "x-scope": "services_read",
    "description": "Zones of this DNS service (`items`, state active|pending with the TXT verification token), read-only zones copied from your cPanel hosting (`cpanel`), plan limits and our name servers.",
    "x-description-tr": "Bu DNS hizmetinin zone'ları (`items`, durum active|pending ve TXT doğrulama değeri), cPanel hosting'inizden kopyalanan salt okunur zone'lar (`cpanel`), paket sınırları ve ad sunucularımız.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     }
    ],
    "responses": {
     "200": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "x-cli": {
     "command": "dns zone list",
     "confirm": false
    }
   },
   "post": {
    "tags": [
     "Managed DNS"
    ],
    "operationId": "typed_post_dns__id__zones",
    "summary": "Add a zone",
    "x-summary-tr": "Zone ekle",
    "x-scope": "services_write",
    "description": "Claims a domain. It is published on ns1/ns2.gyrodns.net after ownership is verified: delegation to our name servers (immediate when already delegated) or the TXT record `_gyrodns-dogrulama.<zone>` = `txt_value` at your current DNS. Optional `bind` (zone file) is imported on activation (SOA and apex NS are ignored).",
    "x-description-tr": "Alan adını talep eder. Sahiplik doğrulanınca ns1/ns2.gyrodns.net'te yayınlanır: ad sunucularımıza devir (zaten devredilmişse hemen) ya da mevcut DNS'inizde `_gyrodns-dogrulama.<zone>` = `txt_value` TXT kaydı. İsteğe bağlı `bind` (zone dosyası) etkinleşince içe aktarılır (SOA ve kök NS yok sayılır).",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "name": {
          "type": "string",
          "description": "Zone name (IDN allowed)"
         },
         "bind": {
          "type": "string",
          "description": "Optional BIND zone file (max 2 MB)"
         },
         "confirm": {
          "type": "boolean"
         }
        },
        "required": [
         "name"
        ]
       }
      }
     }
    },
    "x-cli": {
     "command": "dns zone create",
     "confirm": false
    }
   }
  },
  "/cloud/dns/{id}/zones/{zone}": {
   "get": {
    "tags": [
     "Managed DNS"
    ],
    "operationId": "typed_get_dns__id__zones__zone",
    "summary": "Get a zone with its records",
    "x-summary-tr": "Zone'u kayıtlarıyla getir",
    "x-scope": "services_read",
    "description": "Zone state, serial, DNSSEC flag (+DS) and all record sets. Pending zones return the verification details.",
    "x-description-tr": "Zone durumu, seri, DNSSEC (+DS) ve tüm kayıt kümeleri. Bekleyen zone'larda doğrulama bilgisi döner.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "zone",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Zone name"
     }
    ],
    "responses": {
     "200": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "x-cli": {
     "command": "dns zone get",
     "confirm": false
    }
   },
   "delete": {
    "tags": [
     "Managed DNS"
    ],
    "operationId": "typed_delete_dns__id__zones__zone",
    "summary": "Delete a zone",
    "x-summary-tr": "Zone'u sil",
    "x-scope": "services_write",
    "description": "Removes the zone and its health checks from our name servers at once. Needs `\"confirm\": true`.",
    "x-description-tr": "Zone'u ve sağlık kontrollerini ad sunucularımızdan hemen kaldırır. `\"confirm\": true` gerekir.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "zone",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Zone name"
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "additionalProperties": true,
        "properties": {
         "confirm": {
          "type": "boolean"
         }
        }
       }
      }
     }
    },
    "x-cli": {
     "command": "dns zone delete",
     "confirm": true
    }
   }
  },
  "/cloud/dns/{id}/zones/{zone}/verify": {
   "post": {
    "tags": [
     "Managed DNS"
    ],
    "operationId": "typed_post_dns__id__zones__zone__verify",
    "summary": "Verify ownership now",
    "x-summary-tr": "Sahipliği şimdi doğrula",
    "x-scope": "services_write",
    "description": "Checks delegation / TXT now (the system also re-checks automatically for 14 days).",
    "x-description-tr": "Devri / TXT'yi şimdi kontrol eder (sistem 14 gün boyunca kendiliğinden de kontrol eder).",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "zone",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Zone name"
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "additionalProperties": true,
        "properties": {
         "confirm": {
          "type": "boolean"
         }
        }
       }
      }
     }
    },
    "x-cli": {
     "command": "dns zone verify",
     "confirm": false
    }
   }
  },
  "/cloud/dns/{id}/zones/{zone}/import": {
   "post": {
    "tags": [
     "Managed DNS"
    ],
    "operationId": "typed_post_dns__id__zones__zone__import",
    "summary": "Import a BIND zone file",
    "x-summary-tr": "BIND zone dosyası içe aktar",
    "x-scope": "services_write",
    "description": "`merge` replaces record sets present in the file and keeps the others; `replace` also deletes record sets not in the file. SOA and apex NS are ignored; unsupported types are listed in `skipped`. Needs `\"confirm\": true`.",
    "x-description-tr": "`merge` dosyadaki kayıt kümelerini değiştirir, diğerlerini korur; `replace` dosyada olmayanları da siler. SOA ve kök NS yok sayılır; desteklenmeyen tipler `skipped` içinde. `\"confirm\": true` gerekir.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "zone",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Zone name"
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "bind": {
          "type": "string"
         },
         "mode": {
          "type": "string",
          "enum": [
           "merge",
           "replace"
          ],
          "default": "merge"
         },
         "confirm": {
          "type": "boolean"
         }
        },
        "required": [
         "bind"
        ]
       }
      }
     }
    },
    "x-cli": {
     "command": "dns zone import",
     "confirm": true
    }
   }
  },
  "/cloud/dns/{id}/zones/{zone}/export": {
   "get": {
    "tags": [
     "Managed DNS"
    ],
    "operationId": "typed_get_dns__id__zones__zone__export",
    "summary": "Export the zone file",
    "x-summary-tr": "Zone dosyasını dışa aktar",
    "x-scope": "services_read",
    "description": "Returns the zone in BIND format (`bind`).",
    "x-description-tr": "Zone'u BIND biçiminde döner (`bind`).",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "zone",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Zone name"
     }
    ],
    "responses": {
     "200": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "x-cli": {
     "command": "dns zone export",
     "confirm": false
    }
   }
  },
  "/cloud/dns/{id}/zones/{zone}/records": {
   "get": {
    "tags": [
     "Managed DNS"
    ],
    "operationId": "typed_get_dns__id__zones__zone__records",
    "summary": "List record sets",
    "x-summary-tr": "Kayıt kümelerini listele",
    "x-scope": "services_read",
    "description": "All record sets (`rrsets`: name, type, ttl, records, read_only, health_check). `source=cpanel` reads a zone of your cPanel hosting (read only).",
    "x-description-tr": "Tüm kayıt kümeleri (`rrsets`). `source=cpanel` cPanel hosting zone'unuzu okur (salt okunur).",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "zone",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Zone name"
     },
     {
      "name": "source",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "gyrodns (default) | cpanel"
     }
    ],
    "responses": {
     "200": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "x-cli": {
     "command": "dns rrset list",
     "confirm": false
    }
   },
   "put": {
    "tags": [
     "Managed DNS"
    ],
    "operationId": "typed_put_dns__id__zones__zone__records",
    "summary": "Create or replace a record set",
    "x-summary-tr": "Kayıt kümesi oluştur ya da değiştir",
    "x-scope": "services_write",
    "description": "Upserts one record set (name + type). CNAME and ALIAS take one value; no CNAME at the apex (use ALIAS); apex NS and SOA are managed by us.",
    "x-description-tr": "Bir kayıt kümesini (ad + tip) yazar. CNAME ve ALIAS tek değer alır; kökte CNAME olmaz (ALIAS kullanın); kök NS ve SOA bizde.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "zone",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Zone name"
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "name": {
          "type": "string",
          "description": "Record name relative to the zone (@ = apex, * = wildcard) or FQDN with trailing dot"
         },
         "type": {
          "type": "string",
          "enum": [
           "A",
           "AAAA",
           "CNAME",
           "MX",
           "TXT",
           "SRV",
           "CAA",
           "ALIAS",
           "NS",
           "PTR"
          ]
         },
         "ttl": {
          "type": "integer",
          "description": "60-86400 s"
         },
         "records": {
          "type": "array",
          "items": {
           "type": "string"
          },
          "description": "Values in zone file syntax, one per item (TXT quotes optional)"
         },
         "confirm": {
          "type": "boolean"
         }
        },
        "required": [
         "name",
         "type",
         "records"
        ]
       }
      }
     }
    },
    "x-cli": {
     "command": "dns rrset set",
     "confirm": false
    }
   },
   "delete": {
    "tags": [
     "Managed DNS"
    ],
    "operationId": "typed_delete_dns__id__zones__zone__records",
    "summary": "Delete a record set",
    "x-summary-tr": "Kayıt kümesini sil",
    "x-scope": "services_write",
    "description": "Deletes the record set given by `name` and `type` (query). Needs `\"confirm\": true`.",
    "x-description-tr": "`name` ve `type` (sorgu) ile verilen kayıt kümesini siler. `\"confirm\": true` gerekir.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "zone",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Zone name"
     },
     {
      "name": "name",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Record name"
     },
     {
      "name": "type",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Record type"
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "confirm": {
          "type": "boolean"
         }
        },
        "required": []
       }
      }
     }
    },
    "x-cli": {
     "command": "dns rrset delete",
     "confirm": true
    }
   }
  },
  "/cloud/dns/{id}/zones/{zone}/dnssec": {
   "get": {
    "tags": [
     "Managed DNS"
    ],
    "operationId": "typed_get_dns__id__zones__zone__dnssec",
    "summary": "DNSSEC status and DS records",
    "x-summary-tr": "DNSSEC durumu ve DS kayıtları",
    "x-scope": "services_read",
    "description": "`dnssec` flag and `ds` (enter at your registrar).",
    "x-description-tr": "`dnssec` ve `ds` (kayıt firmasına girilecek).",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "zone",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Zone name"
     }
    ],
    "responses": {
     "200": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "x-cli": {
     "command": "dns dnssec status",
     "confirm": false
    }
   },
   "post": {
    "tags": [
     "Managed DNS"
    ],
    "operationId": "typed_post_dns__id__zones__zone__dnssec",
    "summary": "Enable DNSSEC",
    "x-summary-tr": "DNSSEC aç",
    "x-scope": "services_write",
    "description": "Signs the zone (ECDSA P-256) and returns the DS records. No effect until the DS is at the registrar. Not with ALIAS records.",
    "x-description-tr": "Zone'u imzalar (ECDSA P-256), DS kayıtlarını döner. DS kayıt firmasına girilene kadar etkisizdir. ALIAS ile kullanılamaz.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "zone",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Zone name"
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "additionalProperties": true,
        "properties": {
         "confirm": {
          "type": "boolean"
         }
        }
       }
      }
     }
    },
    "x-cli": {
     "command": "dns dnssec enable",
     "confirm": false
    }
   },
   "delete": {
    "tags": [
     "Managed DNS"
    ],
    "operationId": "typed_delete_dns__id__zones__zone__dnssec",
    "summary": "Disable DNSSEC",
    "x-summary-tr": "DNSSEC kapat",
    "x-scope": "services_write",
    "description": "Remove the DS at your registrar and wait for its TTL first, otherwise validating resolvers fail. Needs `\"confirm\": true`.",
    "x-description-tr": "Önce kayıt firmasındaki DS'yi silip TTL kadar bekleyin, yoksa doğrulayan çözümleyiciler hata verir. `\"confirm\": true` gerekir.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "zone",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Zone name"
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "confirm": {
          "type": "boolean"
         }
        },
        "required": []
       }
      }
     }
    },
    "x-cli": {
     "command": "dns dnssec disable",
     "confirm": true
    }
   }
  },
  "/cloud/dns/{id}/health-checks": {
   "get": {
    "tags": [
     "Managed DNS"
    ],
    "operationId": "typed_get_dns__id__health_checks",
    "summary": "List health-checked records",
    "x-summary-tr": "Sağlık kontrollü kayıtları listele",
    "x-scope": "services_read",
    "description": "Checks with primary/backup IP, which one is active and the last state (gmon majority of 3 locations).",
    "x-description-tr": "Ana/yedek IP, etkin olan ve son durum (3 lokasyon çoğunluğu).",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     }
    ],
    "responses": {
     "200": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "x-cli": {
     "command": "dns health list",
     "confirm": false
    }
   },
   "post": {
    "tags": [
     "Managed DNS"
    ],
    "operationId": "typed_post_dns__id__health_checks",
    "summary": "Create a health-checked record",
    "x-summary-tr": "Sağlık kontrollü kayıt oluştur",
    "x-scope": "services_write",
    "description": "Points `name` (A/AAAA) to `primary`; when the check fails from the majority of locations the record switches to `backup`, and back after 3 good passes. Uses one health-check add-on unit.",
    "x-description-tr": "`name` kaydını `primary`'ye yönlendirir; kontrol çoğunluk lokasyondan düşerse `backup`'a geçer, 3 başarılı turdan sonra geri döner. Bir sağlık kontrolü ek hizmet birimi kullanır.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "zone": {
          "type": "string"
         },
         "name": {
          "type": "string"
         },
         "type": {
          "type": "string",
          "enum": [
           "A",
           "AAAA"
          ]
         },
         "primary": {
          "type": "string"
         },
         "backup": {
          "type": "string"
         },
         "check": {
          "type": "string",
          "enum": [
           "http",
           "https",
           "tcp",
           "ping"
          ]
         },
         "port": {
          "type": "integer"
         },
         "path": {
          "type": "string"
         },
         "ttl": {
          "type": "integer",
          "description": "30-300 s"
         },
         "confirm": {
          "type": "boolean"
         }
        },
        "required": [
         "zone",
         "name",
         "type",
         "primary",
         "backup",
         "check"
        ]
       }
      }
     }
    },
    "x-cli": {
     "command": "dns health create",
     "confirm": false
    }
   }
  },
  "/cloud/dns/{id}/health-checks/{hid}": {
   "delete": {
    "tags": [
     "Managed DNS"
    ],
    "operationId": "typed_delete_dns__id__health_checks__hid",
    "summary": "Delete a health check",
    "x-summary-tr": "Sağlık kontrolünü sil",
    "x-scope": "services_write",
    "description": "Stops checking; the record keeps its current value. Needs `\"confirm\": true`.",
    "x-description-tr": "Kontrol durur; kayıt mevcut değerinde kalır. `\"confirm\": true` gerekir.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "hid",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Health check id"
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "confirm": {
          "type": "boolean"
         }
        },
        "required": []
       }
      }
     }
    },
    "x-cli": {
     "command": "dns health delete",
     "confirm": true
    }
   }
  },
  "/cloud/containers/{id}/services": {
   "get": {
    "tags": [
     "Containers"
    ],
    "operationId": "typed_get_containers__id__services",
    "summary": "List container services",
    "x-summary-tr": "Kapsayıcı servislerini listele",
    "x-scope": "services_read",
    "description": "Services of the environment with state (running, deploying, failing, pending, stopped, suspended), ready/desired instances, size and public URL. Each item carries `internal_address` (services with a port); the list carries `namespace` and `cluster_dns`. Each service has `alerts` = {\"min_ready\": N} at the top level (0 = off; the same value as `spec.alerts`).",
    "x-description-tr": "Ortamdaki servisler: durum, hazır/istenen örnek, boyut, genel adres. Her öğede `internal_address` (portu olan servisler), listede `namespace` ve `cluster_dns` bulunur. Her serviste üst düzeyde `alerts` = {\"min_ready\": N} vardır (0 = kapalı; `spec.alerts` ile aynı).",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     }
    ],
    "responses": {
     "200": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "x-cli": {
     "command": "container service list",
     "confirm": false
    }
   },
   "post": {
    "tags": [
     "Containers"
    ],
    "operationId": "typed_post_containers__id__services",
    "summary": "Create a container service",
    "x-summary-tr": "Kapsayıcı servisi oluştur",
    "x-scope": "services_write",
    "description": "Starts a new service on your dedicated node pool. Name: lowercase letters, digits and '-', max 40. Fails with 409 `quota_exceeded` when the pool has no room. Secret values are set separately (PUT .../secrets). **Serverless environments:** `cpu_m` / `memory_mi` must be one of the pairs from `GET /cloud/billing/container-sizes` (0.25-4 vCPU); billing is per running copy per hour (`POST /cloud/billing/estimate` with `type: serverless`). Refused with 422 `invalid_replicas` (`details.max` = your plan's limit) when the count is outside 0..max copies per service. `alerts` takes one field, `min_ready` (0 = off); `autoscaling` takes enabled, min, max, cpu_percent, memory_percent. Any other field inside them is refused with 422 `invalid_alerts` / `invalid_autoscaling` (it used to be dropped silently).",
    "x-description-tr": "Size ayrılmış düğüm havuzunda yeni servis başlatır. Ad: küçük harf, rakam, '-', en çok 40. Havuzda yer yoksa 409 `quota_exceeded`. Gizli değerler ayrıca (PUT .../secrets). **Sunucusuz ortam:** `cpu_m` / `memory_mi` `GET /cloud/billing/container-sizes` çiftlerinden biri olmalı (0,25-4 vCPU); ücret çalışan kopya başına saatliktir (`POST /cloud/billing/estimate`, `type: serverless`). Sayı servis başına 0..en fazla kopya aralığı dışındaysa 422 `invalid_replicas` (`details.max` = planınızın sınırı). `alerts` tek alan alır, `min_ready` (0 = kapalı); `autoscaling` enabled, min, max, cpu_percent, memory_percent alır. İçlerindeki başka alan 422 `invalid_alerts` / `invalid_autoscaling` ile reddedilir (eskiden sessizce düşüyordu).",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "name": {
          "type": "string",
          "description": "Service name",
          "x-description-tr": "Servis adı"
         },
         "image": {
          "type": "string",
          "description": "Image reference, e.g. ghcr.io/acme/web:1.4 (public registries or your private registry)",
          "x-description-tr": "İmaj, ör. ghcr.io/firma/web:1.4"
         },
         "port": {
          "type": "integer",
          "description": "Container port (0 = no network port). Containers run as a non-root user: use a port >= 1024",
          "x-description-tr": "Kapsayıcı portu (0 = port yok). Kök olmayan kullanıcı: 1024 üstü port"
         },
         "replicas": {
          "type": "integer",
          "description": "Number of instances (default 1)",
          "x-description-tr": "Örnek sayısı (varsayılan 1)"
         },
         "cpu_m": {
          "type": "integer",
          "description": "CPU per instance in millicores (250 = 0.25 vCPU)",
          "x-description-tr": "Örnek başına işlemci (milicore, 250 = 0,25 vCPU)"
         },
         "memory_mi": {
          "type": "integer",
          "description": "Memory per instance in MiB",
          "x-description-tr": "Örnek başına bellek (MiB)"
         },
         "public": {
          "type": "boolean",
          "description": "HTTPS address <name>-<code>.gyroapp.net (and your domains)",
          "x-description-tr": "HTTPS adres <ad>-<kod>.gyroapp.net"
         },
         "health_path": {
          "type": "string",
          "description": "HTTP health check path (empty = TCP check)",
          "x-description-tr": "HTTP sağlık yolu (boş = TCP)"
         },
         "args": {
          "type": "array",
          "items": {
           "type": "string"
          },
          "description": "Arguments for the image's default command. A JSON array of strings, e.g. [\"sh\",\"-c\",\"echo a && npm start\"]. A plain string is accepted too and split like a shell: whitespace separates, quotes keep text together (\"...\" with \\\" escapes, '...' literal): `sh -c \"echo a && npm start\"` -> [\"sh\",\"-c\",\"echo a && npm start\"]. A string starting with [ must be a valid JSON array; an unclosed quote is an error.",
          "x-description-tr": "İmajın komutuna argümanlar. JSON metin dizisi, ör. [\"sh\",\"-c\",\"echo a && npm start\"]. Düz metin de olur, kabuk gibi bölünür: boşluk ayırır, tırnak birleştirir (\"...\" içinde \\\" kaçışı, '...' olduğu gibi): `sh -c \"echo a && npm start\"`. [ ile başlayan metin geçerli JSON dizi olmalı; kapanmamış tırnak hata verir."
         },
         "command": {
          "type": "array",
          "items": {
           "type": "string"
          },
          "description": "Override the image entrypoint. A JSON array of strings, e.g. [\"sh\",\"-c\",\"echo a && npm start\"]. A plain string is accepted too and split like a shell: whitespace separates, quotes keep text together (\"...\" with \\\" escapes, '...' literal): `sh -c \"echo a && npm start\"` -> [\"sh\",\"-c\",\"echo a && npm start\"]. A string starting with [ must be a valid JSON array; an unclosed quote is an error.",
          "x-description-tr": "İmajın giriş komutunu değiştir. JSON metin dizisi, ör. [\"sh\",\"-c\",\"echo a && npm start\"]. Düz metin de olur, kabuk gibi bölünür: boşluk ayırır, tırnak birleştirir (\"...\" içinde \\\" kaçışı, '...' olduğu gibi): `sh -c \"echo a && npm start\"`. [ ile başlayan metin geçerli JSON dizi olmalı; kapanmamış tırnak hata verir."
         },
         "env": {
          "type": "object",
          "additionalProperties": {
           "type": "string"
          },
          "description": "Plain environment variables (replaces the whole set on update)",
          "x-description-tr": "Ortam değişkenleri (güncellemede tamamı değişir)"
         },
         "run_as_user": {
          "type": "integer",
          "description": "User id inside the container (default 10001)",
          "x-description-tr": "Kapsayıcı içi kullanıcı kimliği (varsayılan 10001)"
         },
         "autoscaling": {
          "type": "object",
          "description": "Autoscaling (horizontal): replicas follow the average CPU (and optionally memory) use of the reserved size. `enabled:false` = off (fixed replicas).",
          "x-description-tr": "Otomatik ölçekleme: kopya sayısı ayrılan boyutun ortalama CPU (isteğe bağlı bellek) kullanımına göre değişir. `enabled:false` = kapalı.",
          "properties": {
           "enabled": {
            "type": "boolean"
           },
           "min": {
            "type": "integer",
            "minimum": 1
           },
           "max": {
            "type": "integer",
            "description": "<= plan replica limit"
           },
           "cpu_percent": {
            "type": "integer",
            "minimum": 10,
            "maximum": 95,
            "default": 70
           },
           "memory_percent": {
            "type": "integer",
            "description": "0 = off, else 10-95"
           }
          }
         },
         "alerts": {
          "type": "object",
          "description": "Alert threshold: notify when fewer replicas are ready (0 = off). Channels: PUT /cloud/containers/{id}/notifications.",
          "x-description-tr": "Uyarı eşiği: hazır kopya bu sayının altına düşerse bildirim (0 = kapalı).",
          "properties": {
           "min_ready": {
            "type": "integer"
           }
          }
         },
         "confirm": {
          "type": "boolean"
         }
        },
        "required": [
         "name",
         "image"
        ]
       }
      }
     }
    },
    "x-cli": {
     "command": "container service create",
     "confirm": false
    }
   }
  },
  "/cloud/containers/{id}/services/{name}": {
   "get": {
    "tags": [
     "Containers"
    ],
    "operationId": "typed_get_containers__id__services__name",
    "summary": "Get a container service",
    "x-summary-tr": "Kapsayıcı servisini getir",
    "x-scope": "services_read",
    "description": "Spec, state, problem code (ImagePullBackOff, CrashLoopBackOff, OOMKilled, Unschedulable ...), instances, revision, domains and the names of secrets (values are never returned). `autoscaling` = settings + live status (current/desired replicas, current CPU/memory %, at_max), `capacity` = {blocked, fits}. The answer carries `namespace` and, for services with a port, `internal` = `{host, short, port: 80, target_port, address, url}`: other services of the same environment reach it at `internal.address` (`<name>.<namespace>.svc.cluster.local:80`) or `<name>:80`. Each service has `alerts` = {\"min_ready\": N} at the top level (0 = off; the same value as `spec.alerts`).",
    "x-description-tr": "Tanım, durum, sorun kodu, örnekler, sürüm, alan adları ve gizli değer adları (değerler asla dönmez). Yanıtta `namespace` ve portu olan servislerde `internal` = `{host, short, port: 80, target_port, address, url}` bulunur: aynı ortamdaki servisler `internal.address` (`<ad>.<namespace>.svc.cluster.local:80`) ya da `<ad>:80` ile ulaşır. Her serviste üst düzeyde `alerts` = {\"min_ready\": N} vardır (0 = kapalı; `spec.alerts` ile aynı).",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "name",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Service name"
     }
    ],
    "responses": {
     "200": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "x-cli": {
     "command": "container service get",
     "confirm": false
    }
   },
   "patch": {
    "tags": [
     "Containers"
    ],
    "operationId": "typed_patch_containers__id__services__name",
    "summary": "Deploy a new version / change settings",
    "x-summary-tr": "Yeni sürüm dağıt / ayar değiştir",
    "x-scope": "services_write",
    "description": "Send only the fields to change (e.g. `image`). Every change except `replicas` creates a new revision and rolls out instance by instance without downtime. With autoscaling on, `replicas` is ignored (the autoscaler owns it). `autoscaling` / `alerts` are settings, not revisions. **Serverless environments:** `cpu_m` / `memory_mi` must be one of the pairs from `GET /cloud/billing/container-sizes` (0.25-4 vCPU); billing is per running copy per hour (`POST /cloud/billing/estimate` with `type: serverless`). Refused with 422 `invalid_replicas` (`details.max` = your plan's limit) when the count is outside 0..max copies per service. `alerts` takes one field, `min_ready` (0 = off); `autoscaling` takes enabled, min, max, cpu_percent, memory_percent. Any other field inside them is refused with 422 `invalid_alerts` / `invalid_autoscaling` (it used to be dropped silently).",
    "x-description-tr": "Yalnız değişecek alanları gönderin (ör. `image`). `replicas` dışındaki her değişiklik yeni sürüm oluşturur ve kesintisiz dağıtılır. **Sunucusuz ortam:** `cpu_m` / `memory_mi` `GET /cloud/billing/container-sizes` çiftlerinden biri olmalı (0,25-4 vCPU); ücret çalışan kopya başına saatliktir (`POST /cloud/billing/estimate`, `type: serverless`). Sayı servis başına 0..en fazla kopya aralığı dışındaysa 422 `invalid_replicas` (`details.max` = planınızın sınırı). `alerts` tek alan alır, `min_ready` (0 = kapalı); `autoscaling` enabled, min, max, cpu_percent, memory_percent alır. İçlerindeki başka alan 422 `invalid_alerts` / `invalid_autoscaling` ile reddedilir (eskiden sessizce düşüyordu).",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "name",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Service name"
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "image": {
          "type": "string",
          "description": "Image reference, e.g. ghcr.io/acme/web:1.4 (public registries or your private registry)",
          "x-description-tr": "İmaj, ör. ghcr.io/firma/web:1.4"
         },
         "port": {
          "type": "integer",
          "description": "Container port (0 = no network port). Containers run as a non-root user: use a port >= 1024",
          "x-description-tr": "Kapsayıcı portu (0 = port yok). Kök olmayan kullanıcı: 1024 üstü port"
         },
         "replicas": {
          "type": "integer",
          "description": "Number of instances (default 1)",
          "x-description-tr": "Örnek sayısı (varsayılan 1)"
         },
         "cpu_m": {
          "type": "integer",
          "description": "CPU per instance in millicores (250 = 0.25 vCPU)",
          "x-description-tr": "Örnek başına işlemci (milicore, 250 = 0,25 vCPU)"
         },
         "memory_mi": {
          "type": "integer",
          "description": "Memory per instance in MiB",
          "x-description-tr": "Örnek başına bellek (MiB)"
         },
         "public": {
          "type": "boolean",
          "description": "HTTPS address <name>-<code>.gyroapp.net (and your domains)",
          "x-description-tr": "HTTPS adres <ad>-<kod>.gyroapp.net"
         },
         "health_path": {
          "type": "string",
          "description": "HTTP health check path (empty = TCP check)",
          "x-description-tr": "HTTP sağlık yolu (boş = TCP)"
         },
         "args": {
          "type": "array",
          "items": {
           "type": "string"
          },
          "description": "Arguments for the image's default command. A JSON array of strings, e.g. [\"sh\",\"-c\",\"echo a && npm start\"]. A plain string is accepted too and split like a shell: whitespace separates, quotes keep text together (\"...\" with \\\" escapes, '...' literal): `sh -c \"echo a && npm start\"` -> [\"sh\",\"-c\",\"echo a && npm start\"]. A string starting with [ must be a valid JSON array; an unclosed quote is an error.",
          "x-description-tr": "İmajın komutuna argümanlar. JSON metin dizisi, ör. [\"sh\",\"-c\",\"echo a && npm start\"]. Düz metin de olur, kabuk gibi bölünür: boşluk ayırır, tırnak birleştirir (\"...\" içinde \\\" kaçışı, '...' olduğu gibi): `sh -c \"echo a && npm start\"`. [ ile başlayan metin geçerli JSON dizi olmalı; kapanmamış tırnak hata verir."
         },
         "command": {
          "type": "array",
          "items": {
           "type": "string"
          },
          "description": "Override the image entrypoint. A JSON array of strings, e.g. [\"sh\",\"-c\",\"echo a && npm start\"]. A plain string is accepted too and split like a shell: whitespace separates, quotes keep text together (\"...\" with \\\" escapes, '...' literal): `sh -c \"echo a && npm start\"` -> [\"sh\",\"-c\",\"echo a && npm start\"]. A string starting with [ must be a valid JSON array; an unclosed quote is an error.",
          "x-description-tr": "İmajın giriş komutunu değiştir. JSON metin dizisi, ör. [\"sh\",\"-c\",\"echo a && npm start\"]. Düz metin de olur, kabuk gibi bölünür: boşluk ayırır, tırnak birleştirir (\"...\" içinde \\\" kaçışı, '...' olduğu gibi): `sh -c \"echo a && npm start\"`. [ ile başlayan metin geçerli JSON dizi olmalı; kapanmamış tırnak hata verir."
         },
         "env": {
          "type": "object",
          "additionalProperties": {
           "type": "string"
          },
          "description": "Plain environment variables (replaces the whole set on update)",
          "x-description-tr": "Ortam değişkenleri (güncellemede tamamı değişir)"
         },
         "run_as_user": {
          "type": "integer",
          "description": "User id inside the container (default 10001)",
          "x-description-tr": "Kapsayıcı içi kullanıcı kimliği (varsayılan 10001)"
         },
         "reason": {
          "type": "string",
          "description": "Free text shown in the revision history (e.g. a git sha)"
         },
         "autoscaling": {
          "type": "object",
          "description": "Autoscaling (horizontal): replicas follow the average CPU (and optionally memory) use of the reserved size. `enabled:false` = off (fixed replicas).",
          "x-description-tr": "Otomatik ölçekleme: kopya sayısı ayrılan boyutun ortalama CPU (isteğe bağlı bellek) kullanımına göre değişir. `enabled:false` = kapalı.",
          "properties": {
           "enabled": {
            "type": "boolean"
           },
           "min": {
            "type": "integer",
            "minimum": 1
           },
           "max": {
            "type": "integer",
            "description": "<= plan replica limit"
           },
           "cpu_percent": {
            "type": "integer",
            "minimum": 10,
            "maximum": 95,
            "default": 70
           },
           "memory_percent": {
            "type": "integer",
            "description": "0 = off, else 10-95"
           }
          }
         },
         "alerts": {
          "type": "object",
          "description": "Alert threshold: notify when fewer replicas are ready (0 = off). Channels: PUT /cloud/containers/{id}/notifications.",
          "x-description-tr": "Uyarı eşiği: hazır kopya bu sayının altına düşerse bildirim (0 = kapalı).",
          "properties": {
           "min_ready": {
            "type": "integer"
           }
          }
         },
         "confirm": {
          "type": "boolean"
         }
        },
        "required": []
       }
      }
     }
    },
    "x-cli": {
     "command": "container service update",
     "confirm": false
    }
   },
   "delete": {
    "tags": [
     "Containers"
    ],
    "operationId": "typed_delete_containers__id__services__name",
    "summary": "Delete a container service",
    "x-summary-tr": "Kapsayıcı servisini sil",
    "x-scope": "services_write",
    "description": "Deletes the service, its address, secrets, revision history and certificates. Needs `\"confirm\": true`.",
    "x-description-tr": "Servisi, adresini, gizli değerlerini, sürüm geçmişini ve sertifikalarını siler. `\"confirm\": true` gerekir.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "name",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Service name"
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "confirm": {
          "type": "boolean"
         }
        },
        "required": []
       }
      }
     }
    },
    "x-cli": {
     "command": "container service delete",
     "confirm": true
    }
   }
  },
  "/cloud/containers/{id}/services/{name}/scale": {
   "post": {
    "tags": [
     "Containers"
    ],
    "operationId": "typed_post_containers__id__services__name__scale",
    "summary": "Scale a service",
    "x-summary-tr": "Servisi ölçekle",
    "x-scope": "services_write",
    "description": "Sets the number of instances (0 = stop, settings kept). Does not create a revision. Refused with 409 `autoscaling_enabled` while autoscaling is on (change min/max instead). Refused with 422 `invalid_replicas` (`details.max` = your plan's limit) when the count is outside 0..max copies per service.",
    "x-description-tr": "Örnek sayısını ayarlar (0 = durdur). Sürüm oluşturmaz. Sayı servis başına 0..en fazla kopya aralığı dışındaysa 422 `invalid_replicas` (`details.max` = planınızın sınırı).",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "name",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Service name"
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "replicas": {
          "type": "integer"
         },
         "confirm": {
          "type": "boolean"
         }
        },
        "required": [
         "replicas"
        ]
       }
      }
     }
    },
    "x-cli": {
     "command": "container service scale",
     "confirm": false
    }
   }
  },
  "/cloud/containers/{id}/services/{name}/restart": {
   "post": {
    "tags": [
     "Containers"
    ],
    "operationId": "typed_post_containers__id__services__name__restart",
    "summary": "Restart a service",
    "x-summary-tr": "Servisi yeniden başlat",
    "x-scope": "services_write",
    "description": "Replaces the instances one by one (rolling restart).",
    "x-description-tr": "Örnekleri tek tek yeniler.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "name",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Service name"
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "additionalProperties": true,
        "properties": {
         "confirm": {
          "type": "boolean"
         }
        }
       }
      }
     }
    },
    "x-cli": {
     "command": "container service restart",
     "confirm": false
    }
   }
  },
  "/cloud/containers/{id}/services/{name}/rollback": {
   "post": {
    "tags": [
     "Containers"
    ],
    "operationId": "typed_post_containers__id__services__name__rollback",
    "summary": "Roll back to an earlier revision",
    "x-summary-tr": "Önceki sürüme dön",
    "x-scope": "services_write",
    "description": "Restores image, size, command and variables of `revision` (default: the previous one) as a new revision. Replicas and secrets stay as they are. Needs `\"confirm\": true`.",
    "x-description-tr": "`revision` sürümünün (varsayılan bir önceki) imaj, boyut, komut ve değişkenlerini yeni sürüm olarak geri getirir. Kopya sayısı ve gizli değerler değişmez. `\"confirm\": true` gerekir.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "name",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Service name"
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "revision": {
          "type": "integer",
          "description": "Revision number (empty = previous)"
         },
         "confirm": {
          "type": "boolean"
         }
        },
        "required": []
       }
      }
     }
    },
    "x-cli": {
     "command": "container service rollback",
     "confirm": true
    }
   }
  },
  "/cloud/containers/{id}/services/{name}/revisions": {
   "get": {
    "tags": [
     "Containers"
    ],
    "operationId": "typed_get_containers__id__services__name__revisions",
    "summary": "Revision history",
    "x-summary-tr": "Sürüm geçmişi",
    "x-scope": "services_read",
    "description": "Last 15 revisions, newest first, with image, size, variable names and reason.",
    "x-description-tr": "Son 15 sürüm (yeniden eskiye): imaj, boyut, değişken adları, neden.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "name",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Service name"
     }
    ],
    "responses": {
     "200": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "x-cli": {
     "command": "container service revisions",
     "confirm": false
    }
   }
  },
  "/cloud/containers/{id}/services/{name}/env": {
   "put": {
    "tags": [
     "Containers"
    ],
    "operationId": "typed_put_containers__id__services__name__env",
    "summary": "Set environment variables",
    "x-summary-tr": "Ortam değişkenlerini ayarla",
    "x-scope": "services_write",
    "description": "`set` merges variables (`{\"KEY\": \"value\"}` or KEY=VALUE lines), `unset` removes names, `replace: 1` replaces the whole set. Creates a revision and restarts the service. Only `set`, `unset` and `replace` are accepted: an unknown field (e.g. `env`) or a body that changes nothing (no `set`, no `unset`, no `replace: 1`) is rejected with **422 `invalid_env`** (`details.expected` lists the fields); nothing is saved and the service does not restart.",
    "x-description-tr": "`set` değişken ekler/günceller (`{\"KEY\":\"değer\"}` ya da KEY=VALUE satırları), `unset` siler, `replace: 1` tümünü değiştirir. Sürüm oluşturur, servis yeniden başlar. Yalnız `set`, `unset` ve `replace` kabul edilir: bilinmeyen alan (ör. `env`) ya da hiçbir şeyi değiştirmeyen gövde (`set`, `unset`, `replace: 1` yok) **422 `invalid_env`** ile reddedilir (`details.expected` beklenen alanları verir); hiçbir şey kaydedilmez, servis yeniden başlamaz.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "name",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Service name"
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "description": "invalid_env: unknown field or nothing to change (details.expected lists set / unset / replace)"
     }
    },
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "set": {
          "type": "object",
          "additionalProperties": {
           "type": "string"
          }
         },
         "unset": {
          "type": "array",
          "items": {
           "type": "string"
          }
         },
         "replace": {
          "type": "integer",
          "enum": [
           0,
           1
          ]
         },
         "confirm": {
          "type": "boolean"
         }
        },
        "required": [],
        "additionalProperties": false
       }
      }
     }
    },
    "x-cli": {
     "command": "container env set",
     "confirm": false
    }
   }
  },
  "/cloud/containers/{id}/services/{name}/secrets": {
   "put": {
    "tags": [
     "Containers"
    ],
    "operationId": "typed_put_containers__id__services__name__secrets",
    "summary": "Set secret values",
    "x-summary-tr": "Gizli değer ayarla",
    "x-scope": "services_write",
    "description": "Stored encrypted, passed to the container as environment variables, never returned. The service restarts.",
    "x-description-tr": "Şifreli saklanır, ortam değişkeni olarak verilir, asla geri dönmez. Servis yeniden başlar.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "name",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Service name"
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "set": {
          "type": "object",
          "additionalProperties": {
           "type": "string"
          }
         },
         "confirm": {
          "type": "boolean"
         }
        },
        "required": [
         "set"
        ]
       }
      }
     }
    },
    "x-cli": {
     "command": "container secret set",
     "confirm": false
    }
   },
   "delete": {
    "tags": [
     "Containers"
    ],
    "operationId": "typed_delete_containers__id__services__name__secrets",
    "summary": "Delete secret values",
    "x-summary-tr": "Gizli değer sil",
    "x-scope": "services_write",
    "description": "`keys` (comma separated in the query). The service restarts. Needs `\"confirm\": true`.",
    "x-description-tr": "`keys` (sorguda virgülle). Servis yeniden başlar. `\"confirm\": true` gerekir.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "name",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Service name"
     },
     {
      "name": "keys",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Secret names, comma separated"
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "confirm": {
          "type": "boolean"
         }
        },
        "required": []
       }
      }
     }
    },
    "x-cli": {
     "command": "container secret delete",
     "confirm": true
    }
   }
  },
  "/cloud/containers/{id}/services/{name}/logs": {
   "get": {
    "tags": [
     "Containers"
    ],
    "operationId": "typed_get_containers__id__services__name__logs",
    "summary": "Service logs",
    "x-summary-tr": "Servis logları",
    "x-scope": "services_read",
    "description": "Lines `{time, instance, text}` oldest first. `since_minutes` (default 60, max 10080), `filter` (plain text), `limit` (max 2000), `previous=1` = last crashed instance.",
    "x-description-tr": "Satırlar `{time, instance, text}` eskiden yeniye. `since_minutes` (varsayılan 60), `filter`, `limit` (en çok 2000), `previous=1` = son çöken örnek.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "name",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Service name"
     },
     {
      "name": "since_minutes",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Time range in minutes"
     },
     {
      "name": "filter",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Plain text filter"
     },
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Max lines"
     },
     {
      "name": "previous",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "1 = previous (crashed) instance"
     }
    ],
    "responses": {
     "200": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "x-cli": {
     "command": "container logs",
     "confirm": false
    }
   }
  },
  "/cloud/containers/{id}/services/{name}/metrics": {
   "get": {
    "tags": [
     "Containers"
    ],
    "operationId": "typed_get_containers__id__services__name__metrics",
    "summary": "Service CPU / memory",
    "x-summary-tr": "Servis işlemci / bellek",
    "x-scope": "services_read",
    "description": "`source=history`: series (cpu_m, memory_mi, restarts) for `hours`; `source=current`: current usage only.",
    "x-description-tr": "`source=history`: `hours` boyunca seriler; `source=current`: anlık kullanım.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "name",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Service name"
     },
     {
      "name": "hours",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "History length in hours (default 24)"
     }
    ],
    "responses": {
     "200": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "x-cli": {
     "command": "container metrics",
     "confirm": false
    }
   }
  },
  "/cloud/containers/{id}/services/{name}/domains": {
   "get": {
    "tags": [
     "Containers"
    ],
    "operationId": "typed_get_containers__id__services__name__domains",
    "summary": "Domains of a service",
    "x-summary-tr": "Servisin alan adları",
    "x-scope": "services_read",
    "description": "Status `active` or `pending` (waiting for DNS).",
    "x-description-tr": "Durum `active` ya da `pending` (DNS bekleniyor).",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "name",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Service name"
     }
    ],
    "responses": {
     "200": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "x-cli": {
     "command": "container domain list",
     "confirm": false
    }
   },
   "post": {
    "tags": [
     "Containers"
    ],
    "operationId": "typed_post_containers__id__services__name__domains",
    "summary": "Attach a domain",
    "x-summary-tr": "Alan adı bağla",
    "x-scope": "services_write",
    "description": "Point a CNAME to the service host (`<name>-<code>.gyroapp.net`) first; the domain is activated (with a free certificate) once its DNS points to us, checked hourly or with .../domains/verify.",
    "x-description-tr": "Önce CNAME kaydını servis adresine (`<ad>-<kod>.gyroapp.net`) yönlendirin; DNS bize gösterince ücretsiz sertifikayla etkinleşir (saatlik ya da .../domains/verify ile).",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "name",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Service name"
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "domain": {
          "type": "string"
         },
         "confirm": {
          "type": "boolean"
         }
        },
        "required": [
         "domain"
        ]
       }
      }
     }
    },
    "x-cli": {
     "command": "container domain add",
     "confirm": false
    }
   }
  },
  "/cloud/containers/{id}/services/{name}/domains/verify": {
   "post": {
    "tags": [
     "Containers"
    ],
    "operationId": "typed_post_containers__id__services__name__domains_verify",
    "summary": "Re-check pending domains",
    "x-summary-tr": "Bekleyen alan adlarını kontrol et",
    "x-scope": "services_write",
    "description": "Checks DNS now and activates domains that point here.",
    "x-description-tr": "DNS'i şimdi kontrol eder, bize gösterenleri etkinleştirir.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "name",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Service name"
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "additionalProperties": true,
        "properties": {
         "confirm": {
          "type": "boolean"
         }
        }
       }
      }
     }
    },
    "x-cli": {
     "command": "container domain verify",
     "confirm": false
    }
   }
  },
  "/cloud/containers/{id}/services/{name}/domains/{domain}": {
   "delete": {
    "tags": [
     "Containers"
    ],
    "operationId": "typed_delete_containers__id__services__name__domains__domain",
    "summary": "Detach a domain",
    "x-summary-tr": "Alan adını kaldır",
    "x-scope": "services_write",
    "description": "Removes the domain and its certificate. Needs `\"confirm\": true`.",
    "x-description-tr": "Alan adını ve sertifikasını kaldırır. `\"confirm\": true` gerekir.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "name",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Service name"
     },
     {
      "name": "domain",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Domain name"
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "confirm": {
          "type": "boolean"
         }
        },
        "required": []
       }
      }
     }
    },
    "x-cli": {
     "command": "container domain remove",
     "confirm": true
    }
   }
  },
  "/cloud/containers/{id}/services/{name}/autoscaling": {
   "put": {
    "tags": [
     "Containers"
    ],
    "operationId": "typed_put_containers__id__services__name__autoscaling",
    "summary": "Autoscaling / alert threshold of a service",
    "x-summary-tr": "Servisin otomatik ölçekleme / uyarı eşiği",
    "x-scope": "services_write",
    "description": "Body `{\"autoscaling\": {\"enabled\": true, \"min\": 1, \"max\": 5, \"cpu_percent\": 70, \"memory_percent\": 0}, \"alerts\": {\"min_ready\": 2}}`. Replicas are added when the average use exceeds the target (at most double per 30 s) and removed one per minute after 3 calm minutes. Max cannot exceed the plan replica limit; replicas that do not fit in the node pool wait (`warnings: max_exceeds_capacity`, alert `capacity`). Not a revision. Switching off keeps the current replica count (or `replicas`). Refused with 422 `invalid_replicas` (`details.max` = your plan's limit) when the count is outside 0..max copies per service. `alerts` takes one field, `min_ready` (0 = off); `autoscaling` takes enabled, min, max, cpu_percent, memory_percent. Any other field inside them is refused with 422 `invalid_alerts` / `invalid_autoscaling` (it used to be dropped silently).",
    "x-description-tr": "Gövde `{\"autoscaling\": {...}, \"alerts\": {\"min_ready\": 2}}`. Ortalama kullanım hedefi aşınca kopya eklenir (30 sn'de en çok iki katı), 3 dakika sakin kalınca dakikada bir azaltılır. En çok kopya paket sınırını aşamaz; havuza sığmayan kopyalar bekler. Sürüm oluşturmaz. Kapatınca mevcut kopya sayısı (ya da `replicas`) kalır. Sayı servis başına 0..en fazla kopya aralığı dışındaysa 422 `invalid_replicas` (`details.max` = planınızın sınırı). `alerts` tek alan alır, `min_ready` (0 = kapalı); `autoscaling` enabled, min, max, cpu_percent, memory_percent alır. İçlerindeki başka alan 422 `invalid_alerts` / `invalid_autoscaling` ile reddedilir (eskiden sessizce düşüyordu).",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "name",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Service name"
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "autoscaling": {
          "type": "object",
          "description": "Autoscaling (horizontal): replicas follow the average CPU (and optionally memory) use of the reserved size. `enabled:false` = off (fixed replicas).",
          "x-description-tr": "Otomatik ölçekleme: kopya sayısı ayrılan boyutun ortalama CPU (isteğe bağlı bellek) kullanımına göre değişir. `enabled:false` = kapalı.",
          "properties": {
           "enabled": {
            "type": "boolean"
           },
           "min": {
            "type": "integer",
            "minimum": 1
           },
           "max": {
            "type": "integer",
            "description": "<= plan replica limit"
           },
           "cpu_percent": {
            "type": "integer",
            "minimum": 10,
            "maximum": 95,
            "default": 70
           },
           "memory_percent": {
            "type": "integer",
            "description": "0 = off, else 10-95"
           }
          }
         },
         "alerts": {
          "type": "object",
          "description": "Alert threshold: notify when fewer replicas are ready (0 = off). Channels: PUT /cloud/containers/{id}/notifications.",
          "x-description-tr": "Uyarı eşiği: hazır kopya bu sayının altına düşerse bildirim (0 = kapalı).",
          "properties": {
           "min_ready": {
            "type": "integer"
           }
          }
         },
         "replicas": {
          "type": "integer",
          "description": "Fixed replicas when switching autoscaling off"
         },
         "confirm": {
          "type": "boolean"
         }
        },
        "required": []
       }
      }
     }
    },
    "x-cli": {
     "command": "container service autoscale",
     "confirm": false
    }
   }
  },
  "/cloud/containers/{id}/notifications": {
   "get": {
    "tags": [
     "Containers"
    ],
    "operationId": "typed_get_containers__id__notifications",
    "summary": "Notification settings and current alerts",
    "x-summary-tr": "Bildirim ayarları ve süren uyarılar",
    "x-scope": "services_read",
    "description": "`settings` (channels, events, cooldown; the webhook secret is never returned), `conditions` = what is wrong right now, `history` = last 30 alerts. Events: down (no ready replica for >3 min), crashloop (keeps restarting / image pull fails / out of memory), replicas_low (below alerts.min_ready), scale_max (autoscaling wants more than max), capacity (replicas wait for room in the node pool), egress (the egress IPs of the environment changed; one message, no resolved). An event is announced after ~2 minutes, at most once per cooldown per service + event (flapping included), with a 'resolved' message.",
    "x-description-tr": "`settings` (kanallar, olaylar, tekrar aralığı; webhook anahtarı dönmez), `conditions` = şu an süren sorunlar, `history` = son 30 uyarı. Olaylar: down, crashloop, replicas_low, scale_max, capacity, egress (çıkış IP'leri değişti). Olay ~2 dakika sürünce bildirilir; aynı servis + olay tekrar aralığında bir kez (gidip gelenler dahil), düzelince 'düzeldi' mesajı.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     }
    ],
    "responses": {
     "200": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "x-cli": {
     "command": "container notifications get",
     "confirm": false
    }
   },
   "put": {
    "tags": [
     "Containers"
    ],
    "operationId": "typed_put_containers__id__notifications",
    "summary": "Set notification channels",
    "x-summary-tr": "Bildirim kanallarını ayarla",
    "x-scope": "services_write",
    "description": "Send only the fields to change. A webhook secret is generated when a webhook URL is first set (POST .../notifications/webhook-secret returns it). No WhatsApp.",
    "x-description-tr": "Yalnız değişecek alanları gönderin. Webhook adresi ilk kez girilince imza anahtarı üretilir (POST .../notifications/webhook-secret ile alınır).",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "email": {
          "type": "boolean",
          "description": "Account e-mail (default on)"
         },
         "sms": {
          "type": "boolean",
          "description": "Account phone"
         },
         "telegram": {
          "type": "string",
          "description": "Telegram chat id (send /start to the platform bot, e.g. @gyrouptime_bot); empty = off"
         },
         "webhook_url": {
          "type": "string",
          "description": "https URL of a public server; JSON POST signed with X-Gyro-Signature: sha256=HMAC(secret, X-Gyro-Timestamp + '.' + body)"
         },
         "events": {
          "type": "string",
          "description": "Comma separated: down, crashloop, replicas_low, scale_max, capacity, egress"
         },
         "cooldown": {
          "type": "integer",
          "description": "Minutes between two announcements of the same service + event (5-1440, default 30)"
         },
         "resolved": {
          "type": "boolean",
          "description": "Send a 'resolved' message (default on)"
         },
         "confirm": {
          "type": "boolean"
         }
        },
        "required": []
       }
      }
     }
    },
    "x-cli": {
     "command": "container notifications set",
     "confirm": false
    }
   }
  },
  "/cloud/containers/{id}/notifications/test": {
   "post": {
    "tags": [
     "Containers"
    ],
    "operationId": "typed_post_containers__id__notifications_test",
    "summary": "Send a test notification",
    "x-summary-tr": "Test bildirimi gönder",
    "x-scope": "services_write",
    "description": "Sends a test message to every enabled channel; `channels` = per channel result. At most 5 per 10 minutes.",
    "x-description-tr": "Açık her kanala test mesajı; `channels` kanal başına sonuç. 10 dakikada en çok 5.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "additionalProperties": true,
        "properties": {
         "confirm": {
          "type": "boolean"
         }
        }
       }
      }
     }
    },
    "x-cli": {
     "command": "container notifications test",
     "confirm": false
    }
   }
  },
  "/cloud/containers/{id}/notifications/webhook-secret": {
   "post": {
    "tags": [
     "Containers"
    ],
    "operationId": "typed_post_containers__id__notifications_webhook_secret",
    "summary": "Webhook signing secret",
    "x-summary-tr": "Webhook imza anahtarı",
    "x-scope": "services_write",
    "description": "Returns the signing secret (`rotate: true` makes a new one; not returned when the request carries an Idempotency-Key).",
    "x-description-tr": "İmza anahtarını döndürür (`rotate: true` yenisini üretir).",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "rotate": {
          "type": "boolean"
         },
         "confirm": {
          "type": "boolean"
         }
        },
        "required": []
       }
      }
     }
    },
    "x-cli": {
     "command": "container notifications webhook-secret",
     "confirm": false
    }
   }
  },
  "/cloud/containers/{id}/nodes": {
   "get": {
    "tags": [
     "Containers"
    ],
    "operationId": "typed_get_containers__id__nodes",
    "summary": "Node pool",
    "x-summary-tr": "Düğüm havuzu",
    "x-scope": "services_read",
    "description": "Your dedicated nodes (aliases node-1..n), pool capacity and usage, ingress IPs for apex A records, private registry (user only). Also `namespace`, `cluster_dns` and `egress` (schema ContainerEgress).",
    "x-description-tr": "Size ayrılmış düğümler, havuz kapasitesi/kullanımı, kök alan adı A kaydı için IP'ler, özel depo (yalnız kullanıcı). Ayrıca `namespace`, `cluster_dns` ve `egress` (ContainerEgress şeması).",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     }
    ],
    "responses": {
     "200": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "x-cli": {
     "command": "container nodes",
     "confirm": false
    }
   },
   "put": {
    "tags": [
     "Containers"
    ],
    "operationId": "setContainerNodes",
    "summary": "Set the extra node count",
    "x-summary-tr": "Ek düğüm sayısını ayarla",
    "x-scope": "services_write",
    "description": "Adds or removes extra nodes of the plan's node size (absolute `extra_nodes`, 0 = plan only; at most 20 nodes per environment in total, GyroKota may lower it). An extra node costs the same as a plan node, billed hourly from the prepaid balance. Removing drains first: replicas move to the remaining nodes (services restart one by one, health checked), then the node is deleted; it is not billed while drained. Refused with 409 `quota_in_use` when the remaining nodes cannot hold the running services. Serverless environments have no nodes. Needs `\"confirm\": true`. Every change of a dedicated environment's node set (plan change, extra node added or removed) is announced BEFORE the old nodes go: as soon as the new nodes' addresses are known (usually under a minute) the owner is notified (Alerts channels, event `egress`) and `egress_change` / `pending_egress_ips` show them. With the approval step on (`PUT /cloud/containers/{id}/egress-approval`, 1-72 hours, 24 recommended) the new nodes take no traffic and the old nodes keep serving until `POST /cloud/containers/{id}/egress-change/approve` or the deadline (then it continues by itself). A removal only never waits.",
    "x-description-tr": "Paketin düğüm boyutunda ek düğüm ekler ya da çıkarır (mutlak `extra_nodes`, 0 = yalnız paket; ortam başına toplam en çok 20 düğüm, GyroKota düşürebilir). Ek düğüm paketteki düğümle aynı fiyattır, ön ödemeli bakiyeden saatlik düşer. Çıkarma önce boşaltır: kopyalar kalan düğümlere taşınır (servisler sırayla, sağlık kontrollü yeniden başlar), sonra düğüm silinir; boşaltılırken ücretlenmez. Kalan düğümler çalışan servislere yetmiyorsa 409 `quota_in_use`. Sunucusuz ortamlarda düğüm yoktur. `\"confirm\": true` gerekir. Ayrılmış ortamın düğüm takımı her değiştiğinde (paket değişikliği, ek düğüm ekleme / çıkarma) değişiklik eski düğümler kapanmadan ÖNCE duyurulur: yeni düğümlerin adresleri belli olur olmaz (genellikle bir dakikadan kısa) ortam sahibine bildirim gider (Uyarılar kanalları, `egress` olayı), `egress_change` / `pending_egress_ips` alanlarında görünür. Onay adımı açıksa (`PUT /cloud/containers/{id}/egress-approval`, 1-72 saat, önerilen 24) yeni düğümler trafik almaz, eski düğümler çalışmaya devam eder; `POST /cloud/containers/{id}/egress-change/approve` ya da süre dolunca geçiş devam eder. Yalnız düğüm çıkarma onay beklemez.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "extra_nodes": {
          "type": "integer",
          "minimum": 0,
          "maximum": 19,
          "example": 1
         },
         "confirm": {
          "type": "boolean"
         }
        },
        "required": [
         "extra_nodes"
        ]
       }
      }
     }
    },
    "x-cli": {
     "command": "container nodes set",
     "confirm": true,
     "money": true
    }
   }
  },
  "/cloud/containers/{id}": {
   "get": {
    "tags": [
     "Containers"
    ],
    "operationId": "getContainerEnvironment",
    "summary": "Container environment detail (namespace, internal addressing, egress IPs)",
    "x-summary-tr": "Kapsayıcı ortamı ayrıntısı (namespace, iç adresleme, çıkış IP'leri)",
    "x-scope": "services_read",
    "description": "Environment code, Kubernetes **namespace**, in-cluster addressing (`cluster_dns`), plan limits, nodes, quota, ingress IPs and the current **egress IPs**. Egress IPs of a **dedicated** environment = the public IPs of its own nodes + the shared pool node(s) used while an update rolls out (the new copy starts there for about a minute, then moves back to your node). **Serverless** = the shared sandboxed pool nodes (the pool can grow: a new address can appear). Build machines of Gyro Pipeline are listed separately (`build_ips`). The list changes when the nodes change (plan change, node replacement, pool scaling); the owner is notified (Alerts channels, event `egress`). No IPv6 egress; outbound TCP 25 is closed. A fixed egress address is not offered yet.",
    "x-description-tr": "Ortam kodu, Kubernetes **namespace** adı, iç adresleme (`cluster_dns`), paket sınırları, düğümler, kota, giriş IP'leri ve güncel **çıkış IP'leri**. **Ayrılmış** ortamın çıkış IP'leri = kendi düğümlerinin IP'leri + güncelleme sırasında kullanılan paylaşımlı havuz düğümü (yeni kopya yaklaşık bir dakika orada başlar, sonra düğümünüze döner). **Sunucusuz** = paylaşımlı yalıtılmış havuz düğümleri (havuz büyürse yeni adres eklenebilir). Gyro Pipeline derleme makineleri ayrı listelenir (`build_ips`). Düğümler değişince (paket değişimi, düğüm yenileme, havuz ölçeklemesi) liste değişir ve ortam sahibine bildirim gider (Uyarılar kanalları, `egress` olayı). IPv6 çıkışı yok; TCP 25 kapalı.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "$ref": "#/components/schemas/ContainerEnvironment"
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     }
    },
    "x-cli": {
     "command": "container get",
     "confirm": false
    }
   },
   "delete": {
    "tags": [
     "Containers"
    ],
    "operationId": "deleteContainerEnvironment",
    "summary": "Delete a container environment (prepaid)",
    "x-summary-tr": "Kapsayıcı ortamını sil (ön ödemeli)",
    "x-scope": "cloud_delete",
    "x-cli": {
     "command": "container delete",
     "confirm": true
    },
    "description": "Same as the panel's Spending > Delete: hourly charges stop at once and the environment is deleted right away with every service, node, registry image, pipeline and custom domain binding (no retention period). Needs `\"confirm\": true` (body or query) and an `Idempotency-Key` header; repeating returns 202 `deleted`. Environments billed by invoice answer 409 `not_prepaid`. Terraform: destroying `gyro_container_environment` calls this.",
    "x-description-tr": "Paneldeki Harcamalar > Sil ile aynı: saatlik ücret hemen durur, ortam tüm servis, düğüm, imaj deposu, pipeline ve özel alan adı bağlarıyla hemen silinir (saklama süresi yok). `\"confirm\": true` (gövde ya da sorgu) ve `Idempotency-Key` başlığı gerekir; tekrar çağrı 202 `deleted` döner. Faturalı ortamlar 409 `not_prepaid`. Terraform: `gyro_container_environment` silinince bu çağrılır.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "Idempotency-Key",
      "in": "header",
      "required": true,
      "schema": {
       "type": "string",
       "minLength": 8,
       "maxLength": 191
      }
     },
     {
      "name": "confirm",
      "in": "query",
      "required": false,
      "schema": {
       "type": "boolean"
      }
     }
    ],
    "requestBody": {
     "required": false,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "confirm": {
          "type": "boolean"
         }
        }
       }
      }
     }
    },
    "responses": {
     "202": {
      "description": "Deleting",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "properties": {
            "status": {
             "type": "string",
             "enum": [
              "deleting",
              "deleted"
             ]
            },
            "container_id": {
             "type": "integer"
            },
            "already_deleted": {
             "type": "boolean"
            },
            "note": {
             "type": "string"
            }
           }
          }
         }
        }
       }
      }
     },
     "400": {
      "description": "idempotency_key_required",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    }
   }
  },
  "/cloud/containers/{id}/egress-ips": {
   "get": {
    "tags": [
     "Containers"
    ],
    "operationId": "getContainerEgressIps",
    "summary": "Egress IPs of a container environment",
    "x-summary-tr": "Kapsayıcı ortamının çıkış IP'leri",
    "x-scope": "services_read",
    "description": "Current public IPv4 addresses the containers reach the internet from - add them to the IP allow list of an external service. Egress IPs of a **dedicated** environment = the public IPs of its own nodes + the shared pool node(s) used while an update rolls out (the new copy starts there for about a minute, then moves back to your node). **Serverless** = the shared sandboxed pool nodes (the pool can grow: a new address can appear). Build machines of Gyro Pipeline are listed separately (`build_ips`). The list changes when the nodes change (plan change, node replacement, pool scaling); the owner is notified (Alerts channels, event `egress`). No IPv6 egress; outbound TCP 25 is closed. A fixed egress address is not offered yet.",
    "x-description-tr": "Kapsayıcıların internete çıktığı güncel IPv4 adresleri - harici bir servisin IP beyaz listesine ekleyin. **Ayrılmış** ortamın çıkış IP'leri = kendi düğümlerinin IP'leri + güncelleme sırasında kullanılan paylaşımlı havuz düğümü (yeni kopya yaklaşık bir dakika orada başlar, sonra düğümünüze döner). **Sunucusuz** = paylaşımlı yalıtılmış havuz düğümleri (havuz büyürse yeni adres eklenebilir). Gyro Pipeline derleme makineleri ayrı listelenir (`build_ips`). Düğümler değişince (paket değişimi, düğüm yenileme, havuz ölçeklemesi) liste değişir ve ortam sahibine bildirim gider (Uyarılar kanalları, `egress` olayı). IPv6 çıkışı yok; TCP 25 kapalı.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "allOf": [
            {
             "$ref": "#/components/schemas/ContainerEgress"
            },
            {
             "type": "object",
             "properties": {
              "namespace": {
               "type": "string"
              }
             }
            }
           ]
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     }
    },
    "x-cli": {
     "command": "container egress-ips",
     "confirm": false
    }
   }
  },
  "/cloud/containers/{id}/events": {
   "get": {
    "tags": [
     "Containers"
    ],
    "operationId": "typed_get_containers__id__events",
    "summary": "Recent warnings",
    "x-summary-tr": "Son uyarılar",
    "x-scope": "services_read",
    "description": "Last 50 platform warnings of the environment (pull errors, crashes, capacity).",
    "x-description-tr": "Ortamın son 50 platform uyarısı.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     }
    ],
    "responses": {
     "200": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "x-cli": {
     "command": "container events",
     "confirm": false
    }
   }
  },
  "/cloud/containers/{id}/egress-approval": {
   "put": {
    "tags": [
     "Containers"
    ],
    "operationId": "setContainerEgressApproval",
    "summary": "Approval step for egress changes",
    "x-summary-tr": "Çıkış IP değişikliği onay adımı",
    "x-scope": "services_write",
    "description": "`hours` 1-72 turns the approval step on (24 recommended), 0 turns it off. Every change of a dedicated environment's node set (plan change, extra node added or removed) is announced BEFORE the old nodes go: as soon as the new nodes' addresses are known (usually under a minute) the owner is notified (Alerts channels, event `egress`) and `egress_change` / `pending_egress_ips` show them. With the approval step on (`PUT /cloud/containers/{id}/egress-approval`, 1-72 hours, 24 recommended) the new nodes take no traffic and the old nodes keep serving until `POST /cloud/containers/{id}/egress-change/approve` or the deadline (then it continues by itself). A removal only never waits.",
    "x-description-tr": "`hours` 1-72 onay adımını açar (önerilen 24), 0 kapatır. Ayrılmış ortamın düğüm takımı her değiştiğinde (paket değişikliği, ek düğüm ekleme / çıkarma) değişiklik eski düğümler kapanmadan ÖNCE duyurulur: yeni düğümlerin adresleri belli olur olmaz (genellikle bir dakikadan kısa) ortam sahibine bildirim gider (Uyarılar kanalları, `egress` olayı), `egress_change` / `pending_egress_ips` alanlarında görünür. Onay adımı açıksa (`PUT /cloud/containers/{id}/egress-approval`, 1-72 saat, önerilen 24) yeni düğümler trafik almaz, eski düğümler çalışmaya devam eder; `POST /cloud/containers/{id}/egress-change/approve` ya da süre dolunca geçiş devam eder. Yalnız düğüm çıkarma onay beklemez.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "hours": {
          "type": "integer",
          "minimum": 0,
          "maximum": 72,
          "example": 24
         },
         "confirm": {
          "type": "boolean"
         }
        },
        "required": [
         "hours"
        ]
       }
      }
     }
    },
    "x-cli": {
     "command": "container egress-approval set",
     "confirm": true
    }
   }
  },
  "/cloud/containers/{id}/egress-change/approve": {
   "post": {
    "tags": [
     "Containers"
    ],
    "operationId": "approveContainerEgressChange",
    "summary": "Approve the pending egress change",
    "x-summary-tr": "Bekleyen çıkış IP değişikliğini onayla",
    "x-scope": "services_write",
    "description": "Continue now: the new nodes start taking traffic, the old ones are drained and removed. `id` (optional) must match `egress_change.id` (409 `change_mismatch` when a newer change replaced it). 409 `no_pending_change` / `change_preparing`. Every change of a dedicated environment's node set (plan change, extra node added or removed) is announced BEFORE the old nodes go: as soon as the new nodes' addresses are known (usually under a minute) the owner is notified (Alerts channels, event `egress`) and `egress_change` / `pending_egress_ips` show them. With the approval step on (`PUT /cloud/containers/{id}/egress-approval`, 1-72 hours, 24 recommended) the new nodes take no traffic and the old nodes keep serving until `POST /cloud/containers/{id}/egress-change/approve` or the deadline (then it continues by itself). A removal only never waits.",
    "x-description-tr": "Şimdi devam et: yeni düğümler trafik almaya başlar, eskiler boşaltılıp kaldırılır. `id` (isteğe bağlı) `egress_change.id` ile aynı olmalı (yenisi geldiyse 409 `change_mismatch`). 409 `no_pending_change` / `change_preparing`. Ayrılmış ortamın düğüm takımı her değiştiğinde (paket değişikliği, ek düğüm ekleme / çıkarma) değişiklik eski düğümler kapanmadan ÖNCE duyurulur: yeni düğümlerin adresleri belli olur olmaz (genellikle bir dakikadan kısa) ortam sahibine bildirim gider (Uyarılar kanalları, `egress` olayı), `egress_change` / `pending_egress_ips` alanlarında görünür. Onay adımı açıksa (`PUT /cloud/containers/{id}/egress-approval`, 1-72 saat, önerilen 24) yeni düğümler trafik almaz, eski düğümler çalışmaya devam eder; `POST /cloud/containers/{id}/egress-change/approve` ya da süre dolunca geçiş devam eder. Yalnız düğüm çıkarma onay beklemez.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "id": {
          "type": "string"
         },
         "confirm": {
          "type": "boolean"
         }
        },
        "required": []
       }
      }
     }
    },
    "x-cli": {
     "command": "container egress-change approve",
     "confirm": true
    }
   }
  },
  "/cloud/containers/{id}/external-registry": {
   "put": {
    "tags": [
     "Containers"
    ],
    "operationId": "typed_put_containers__id__external_registry",
    "summary": "External private registry credentials",
    "x-summary-tr": "Harici özel depo bilgisi",
    "x-scope": "services_write",
    "description": "One private registry per environment (e.g. ghcr.io + a pull-only token). The token is stored encrypted and never returned.",
    "x-description-tr": "Ortam başına bir özel depo (ör. ghcr.io + yalnız çekme izinli token). Token şifreli saklanır, geri dönmez.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "server": {
          "type": "string"
         },
         "username": {
          "type": "string"
         },
         "password": {
          "type": "string",
          "format": "password"
         },
         "confirm": {
          "type": "boolean"
         }
        },
        "required": [
         "server",
         "username",
         "password"
        ]
       }
      }
     }
    },
    "x-cli": {
     "command": "container external-registry set",
     "confirm": false
    }
   },
   "delete": {
    "tags": [
     "Containers"
    ],
    "operationId": "typed_delete_containers__id__external_registry",
    "summary": "Remove external registry credentials",
    "x-summary-tr": "Özel depo bilgisini sil",
    "x-scope": "services_write",
    "description": "Private images can no longer be pulled. Needs `\"confirm\": true`.",
    "x-description-tr": "Özel imajlar artık çekilemez. `\"confirm\": true` gerekir.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "confirm": {
          "type": "boolean"
         }
        },
        "required": []
       }
      }
     }
    },
    "x-cli": {
     "command": "container external-registry delete",
     "confirm": true
    }
   }
  },
  "/cloud/containers/{id}/registry": {
   "get": {
    "tags": [
     "Containers"
    ],
    "operationId": "typed_get_containers__id__registry",
    "summary": "Gyro image registry of the environment",
    "x-summary-tr": "Ortamın Gyro imaj deposu",
    "x-scope": "services_read",
    "description": "Host, image prefix `<host>/<code>/`, username, usage (`used_gb`, `free_gb` = 2, `billable_gb`, `cap_gb` = 50), `push_allowed` and the clean-up policy. Only this environment can push/pull its repositories. Above 2 GB: €0.05 per GB per month, charged hourly from the prepaid balance. The password is returned only by POST .../registry/credentials.",
    "x-description-tr": "Depo adresi, imaj öneki `<host>/<kod>/`, kullanıcı adı, kullanım (2 GB ücretsiz, üst sınır 50 GB), gönderim izni ve temizlik ayarı. Yalnız bu ortam kendi depolarına erişir. 2 GB üstü GB başına aylık 0,05 € (saatlik bakiyeden). Parola yalnız POST .../registry/credentials ile döner.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     }
    ],
    "responses": {
     "200": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "x-cli": {
     "command": "container registry get",
     "confirm": false
    }
   }
  },
  "/cloud/containers/{id}/registry/credentials": {
   "post": {
    "tags": [
     "Containers"
    ],
    "operationId": "typed_post_containers__id__registry_credentials",
    "summary": "Registry password",
    "x-summary-tr": "Depo parolası",
    "x-scope": "services_write",
    "description": "Returns username and password for `docker login` (not returned when the request carries an Idempotency-Key).",
    "x-description-tr": "`docker login` için kullanıcı adı ve parola.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "additionalProperties": true,
        "properties": {
         "confirm": {
          "type": "boolean"
         }
        }
       }
      }
     }
    },
    "x-cli": {
     "command": "container registry credentials",
     "confirm": false
    }
   }
  },
  "/cloud/containers/{id}/registry/rotate": {
   "post": {
    "tags": [
     "Containers"
    ],
    "operationId": "typed_post_containers__id__registry_rotate",
    "summary": "Rotate the registry password",
    "x-summary-tr": "Depo parolasını yenile",
    "x-scope": "services_write",
    "description": "The old password stops working at once; running services are not affected (their pull secret is updated). Needs `\"confirm\": true`.",
    "x-description-tr": "Eski parola hemen geçersiz olur; çalışan servisler etkilenmez. `\"confirm\": true` gerekir.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "confirm": {
          "type": "boolean"
         }
        },
        "required": []
       }
      }
     }
    },
    "x-cli": {
     "command": "container registry rotate",
     "confirm": true
    }
   }
  },
  "/cloud/containers/{id}/registry/policy": {
   "put": {
    "tags": [
     "Containers"
    ],
    "operationId": "typed_put_containers__id__registry_policy",
    "summary": "Image clean-up policy",
    "x-summary-tr": "İmaj temizlik ayarı",
    "x-scope": "services_write",
    "description": "`enabled` (default true), `keep` 1-50 (images of the last N revisions of every service are kept, default 10), `untagged_days` 1-90 (images used by no revision are deleted after, default 7).",
    "x-description-tr": "`enabled`, `keep` 1-50 (varsayılan 10), `untagged_days` 1-90 (varsayılan 7).",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "enabled": {
          "type": "boolean"
         },
         "keep": {
          "type": "integer"
         },
         "untagged_days": {
          "type": "integer"
         },
         "confirm": {
          "type": "boolean"
         }
        },
        "required": []
       }
      }
     }
    },
    "x-cli": {
     "command": "container registry policy",
     "confirm": false
    }
   }
  },
  "/cloud/containers/{id}/registry/images": {
   "get": {
    "tags": [
     "Containers"
    ],
    "operationId": "typed_get_containers__id__registry_images",
    "summary": "Images in the registry",
    "x-summary-tr": "Depodaki imajlar",
    "x-scope": "services_read",
    "description": "`images`: repo, tag, digest, bytes, created, in_use; `total_bytes` (unique layers).",
    "x-description-tr": "`images`: depo, etiket, boyut, tarih, kullanımda mı; `total_bytes`.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     }
    ],
    "responses": {
     "200": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "x-cli": {
     "command": "container registry images",
     "confirm": false
    }
   },
   "delete": {
    "tags": [
     "Containers"
    ],
    "operationId": "typed_delete_containers__id__registry_images",
    "summary": "Delete an image tag",
    "x-summary-tr": "İmaj etiketini sil",
    "x-scope": "services_write",
    "description": "Query `repo` (without the code prefix) and `tag`. Images used by a service are refused (409 image_in_use). Needs `\"confirm\": true`.",
    "x-description-tr": "Sorgu `repo` ve `tag`. Bir servisin kullandığı imaj silinemez. `\"confirm\": true` gerekir.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "repo",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Repository, e.g. web"
     },
     {
      "name": "tag",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Tag, e.g. 1.4"
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "confirm": {
          "type": "boolean"
         }
        },
        "required": []
       }
      }
     }
    },
    "x-cli": {
     "command": "container registry image-delete",
     "confirm": true
    }
   }
  },
  "/cloud/containers/{id}/registry/imports": {
   "post": {
    "tags": [
     "Containers"
    ],
    "operationId": "importContainerImage",
    "summary": "Import an image from another registry",
    "x-summary-tr": "Başka bir depodan imaj içe aktar",
    "x-scope": "services_write",
    "x-cli": {
     "command": "container registry import"
    },
    "description": "Copies an image (e.g. `nginx:1.27`, `docker.io/library/redis:7`, `ghcr.io/gyro-ornek/uygulama:1.0`) into the environment's Gyro registry without `docker push`. HTTPS registries only; only the linux/amd64 variant of multi-platform images is copied. `repo` (default: last part of the source name) and `tag` (default: source tag) name the copy under `<host>/<code>/`; an existing name:tag needs `overwrite: true`. Private images: `username` + `password` (token) are used only for this copy, never stored or returned, and redacted in the API log. Runs in the background: poll GET .../registry/imports. Limits: 1 running import per environment (409 `import_running`), 10 per hour (429 `import_rate_limited`), 15 minutes, 128 layers, size within the free registry space (50 GB cap, 2 GB free, then the usual €0.05/GB-month). Sources that resolve to private, internal or Gyro infrastructure addresses are refused (`source_blocked`).",
    "x-description-tr": "Bir imajı (ör. `nginx:1.27`, `ghcr.io/gyro-ornek/uygulama:1.0`) `docker push` gerekmeden ortamın Gyro imaj deposuna kopyalar. Yalnız https depolar; çok mimarili imajlarda yalnız linux/amd64 kopyalanır. `repo` (varsayılan: kaynak adının son parçası) ve `tag` (varsayılan: kaynak etiketi) kopyanın adıdır; var olan ad:etiket için `overwrite: true` gerekir. Özel imaj: `username` + `password` (token) yalnız bu kopya için kullanılır, saklanmaz, geri dönmez, API günlüğünde karartılır. Arka planda çalışır: GET .../registry/imports ile izleyin. Sınırlar: ortam başına aynı anda 1 (409 `import_running`), saatte 10 (429 `import_rate_limited`), 15 dakika, 128 katman, boyut deponuzdaki boş alanı aşamaz. İç/özel/Gyro altyapı adreslerine çözülen kaynaklar reddedilir (`source_blocked`).",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Container environment (service) id"
     }
    ],
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "required": [
         "source"
        ],
        "properties": {
         "source": {
          "type": "string",
          "example": "nginx:1.27",
          "description": "source image (host/repo:tag or @sha256:...); docker.io when no host",
          "x-description-tr": "kaynak imaj (host/depo:etiket ya da @sha256:...); host yoksa docker.io"
         },
         "repo": {
          "type": "string",
          "example": "nginx",
          "description": "target name under your prefix (lowercase, max 3 levels)",
          "x-description-tr": "hedef ad (küçük harf, en çok 3 seviye)"
         },
         "tag": {
          "type": "string",
          "example": "1.27",
          "description": "target tag (default: source tag, `latest` for a digest)",
          "x-description-tr": "hedef etiket"
         },
         "username": {
          "type": "string",
          "description": "private source: username (not stored)",
          "x-description-tr": "özel kaynak: kullanıcı adı (saklanmaz)"
         },
         "password": {
          "type": "string",
          "format": "password",
          "description": "private source: token / password (not stored, redacted in logs)",
          "x-description-tr": "özel kaynak: token / parola (saklanmaz)"
         },
         "overwrite": {
          "type": "boolean",
          "default": false,
          "description": "replace an existing name:tag",
          "x-description-tr": "var olan ad:etiketin üzerine yaz"
         }
        }
       },
       "example": {
        "source": "ghcr.io/gyro-ornek/uygulama:1.0",
        "repo": "uygulama",
        "tag": "1.0"
       }
      }
     }
    },
    "responses": {
     "202": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "properties": {
            "job": {
             "$ref": "#/components/schemas/ContainerImageImport"
            },
            "limits": {
             "type": "object"
            }
           }
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     },
     "429": {
      "description": "import_rate_limited",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    }
   },
   "get": {
    "tags": [
     "Containers"
    ],
    "operationId": "listContainerImageImports",
    "summary": "Image imports (progress and history)",
    "x-summary-tr": "İmaj içe aktarmaları (ilerleme ve geçmiş)",
    "x-scope": "services_read",
    "x-cli": {
     "command": "container registry imports"
    },
    "description": "`active` = the running import (or null) with `phase`, `bytes_done`/`bytes_total`, `layers_done`/`layers`; `jobs` = the last 20 imports (newest first) with `state` and, when failed, `error` + `message`; `limits`.",
    "x-description-tr": "`active` = süren içe aktarma (ya da null): `phase`, bayt ve katman ilerlemesi; `jobs` = son 20 içe aktarma (yeniden eskiye), başarısızsa `error` + `message`; `limits`.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Container environment (service) id"
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "properties": {
            "active": {
             "oneOf": [
              {
               "$ref": "#/components/schemas/ContainerImageImport"
              },
              {
               "type": "null"
              }
             ]
            },
            "jobs": {
             "type": "array",
             "items": {
              "$ref": "#/components/schemas/ContainerImageImport"
             }
            },
            "limits": {
             "type": "object"
            }
           }
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    }
   }
  },
  "/cloud/containers/{id}/pipelines": {
   "get": {
    "tags": [
     "Containers"
    ],
    "operationId": "pipeline_list",
    "summary": "List pipelines",
    "x-summary-tr": "Pipeline'ları listele",
    "x-scope": "services_read",
    "description": "Pipelines of the environment with the last run, plan limits (`concurrent`, `monthly_minutes`, `max_timeout`, `max_cpu_m`, `max_memory_mi`, `max_pipelines`) and this month's build minutes. ",
    "x-description-tr": "Ortamın pipeline'ları (son çalıştırma ile), paket sınırları ve bu ayın derleme dakikası. ",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "properties": {
            "pipelines": {
             "type": "array",
             "items": {
              "$ref": "#/components/schemas/ContainerPipeline"
             }
            },
            "limits": {
             "type": "object"
            },
            "month_minutes": {
             "type": "number"
            },
            "free_minutes": {
             "type": "integer"
            }
           }
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "x-cli": {
     "command": "container pipeline list",
     "confirm": false
    }
   },
   "post": {
    "tags": [
     "Containers"
    ],
    "operationId": "pipeline_create",
    "summary": "Create a pipeline",
    "x-summary-tr": "Pipeline oluştur",
    "x-scope": "services_write",
    "description": "Connects a repository. The answer contains `webhook_url` and (only here and in GET .../webhook) `webhook_secret`: add both to the repository's webhook (GitHub: application/json + Secret, push event; GitLab: Secret token, push + tag push; Gitea: secret; other: X-Gyro-Signature HMAC). Optional `token` for a private repository.  `repo` is required unless `provider` is `archive` (archive pipelines build only uploaded archives: POST .../uploads, then a run with `upload_id`).",
    "x-description-tr": "Depoyu bağlar. Yanıtta `webhook_url` ve `webhook_secret` (yalnız burada ve GET .../webhook) vardır; ikisini deponun webhook ayarına ekleyin. Özel depo için `token`.  `provider` `archive` değilse `repo` zorunludur (arşiv pipeline'ı yalnız yüklenen arşivi derler: POST .../uploads, ardından `upload_id` ile çalıştırma).",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "properties": {
            "pipeline": {
             "$ref": "#/components/schemas/ContainerPipeline"
            }
           }
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "name": {
          "type": "string",
          "description": "Display name (1-48)",
          "x-description-tr": "Görünen ad (1-48)"
         },
         "provider": {
          "type": "string",
          "enum": [
           "github",
           "gitlab",
           "gitea",
           "git",
           "archive"
          ],
          "default": "github"
         },
         "repo": {
          "type": "string",
          "description": "Required for github / gitlab / gitea / git: https clone URL (no credentials) or SSH address git@host:org/repo.git / ssh://user@host[:port]/path (needs a deploy key). Leave it out for provider `archive` (an archive pipeline has no repository; a value sent with `archive` is ignored and the answer shows `repo` empty).",
          "x-description-tr": "github / gitlab / gitea / git için zorunlu: https klon adresi (kimlik bilgisi yok) ya da SSH adresi git@sunucu:kurum/depo.git / ssh://kullanici@sunucu[:port]/yol (deploy key gerekir). provider `archive` için göndermeyin (arşiv pipeline deposuz çalışır; `archive` ile gönderilen değer yok sayılır, yanıtta `repo` boş görünür).",
          "example": "https://github.com/gyro-ornek/uygulama"
         },
         "token": {
          "type": "string",
          "format": "password",
          "description": "Read-only access token for a private repository (stored encrypted, never returned; \"-\" on update removes it)",
          "x-description-tr": "Özel depo için yalnız okuma erişim belirteci (şifreli saklanır, geri dönmez; güncellemede \"-\" siler)"
         },
         "git_user": {
          "type": "string",
          "description": "User name for the token (default: x-access-token / oauth2 / git)"
         },
         "branch": {
          "type": "string",
          "description": "Branches whose pushes build (comma separated globs, empty = none)",
          "x-description-tr": "Push'u derlenen dallar (virgüllü glob, boş = yok)",
          "default": "main"
         },
         "tags": {
          "type": "string",
          "description": "Tags that build (globs, e.g. v*)",
          "x-description-tr": "Derlenen etiketler (glob, ör. v*)"
         },
         "auto": {
          "type": "boolean",
          "default": true,
          "description": "Webhook pushes start runs"
         },
         "repo_file": {
          "type": "boolean",
          "default": true,
          "description": "Read gyro-pipeline.yml from the repository (GitHub, GitLab, Gitea)"
         },
         "image": {
          "type": "string",
          "description": "Image name in the environment registry (<registry>/<code>/<image>:<sha7> + :latest)",
          "x-description-tr": "Ortam deposundaki imaj adı"
         },
         "dockerfile": {
          "type": "string",
          "default": "Dockerfile"
         },
         "context": {
          "type": "string",
          "description": "Build folder (empty = repository root)"
         },
         "build_target": {
          "type": "string",
          "pattern": "^[A-Za-z0-9._-]{0,64}$",
          "example": "production",
          "description": "Stage of a multi-stage Dockerfile to build (`FROM node:20 AS production` -> `production`, same as `docker build --target`). Empty = the last stage. Stage names are case-insensitive (stored lowercase). A stage the Dockerfile does not have fails the run with `build_target_not_found`. gyro-pipeline.yml: `build_target:` overrides it per run. CLI: `--target` (or `--build-target`).",
          "x-description-tr": "Çok aşamalı Dockerfile'da derlenecek aşama (`FROM node:20 AS production` -> `production`, `docker build --target` ile aynı). Boş = son aşama. Aşama adı büyük/küçük harf duyarsızdır (küçük harfle saklanır). Dockerfile'da olmayan aşama `build_target_not_found` hatasıyla çalıştırmayı durdurur. gyro-pipeline.yml: `build_target:` çalıştırma için bunu ezer. CLI: `--target` (ya da `--build-target`)."
         },
         "targets": {
          "type": "array",
          "items": {
           "type": "string"
          },
          "description": "Services that get the new image (empty = build only)",
          "x-description-tr": "Yeni imaja geçecek servisler (boş = yalnız derle)"
         },
         "approval": {
          "type": "boolean",
          "default": false,
          "description": "Wait for approval before deploying (24 h)"
         },
         "auto_rollback": {
          "type": "boolean",
          "default": true,
          "description": "Roll back when the new version is unhealthy"
         },
         "build_image": {
          "type": "string",
          "description": "Image that runs `commands` (e.g. node:22-alpine)"
         },
         "commands": {
          "type": "array",
          "items": {
           "type": "string"
          },
          "description": "Shell commands run in the repository root before the Dockerfile (tests, npm ci ...); build secrets are environment variables here"
         },
         "build_env": {
          "type": "object",
          "additionalProperties": {
           "type": "string"
          },
          "description": "Variables for `commands`"
         },
         "build_args": {
          "type": "object",
          "additionalProperties": {
           "type": "string"
          },
          "description": "Dockerfile ARG values (visible in the image history)"
         },
         "cpu_m": {
          "type": "integer",
          "description": "Build CPU (millicores, plan limit)"
         },
         "memory_mi": {
          "type": "integer",
          "description": "Build memory (MiB, plan limit)"
         },
         "timeout_min": {
          "type": "integer",
          "description": "Build time limit (minutes, plan limit)"
         },
         "verify_min": {
          "type": "integer",
          "description": "Health wait after deploy (1-30 minutes)"
         },
         "notify": {
          "type": "array",
          "items": {
           "type": "string",
           "enum": [
            "failed",
            "succeeded",
            "approval",
            "rolled_back"
           ]
          },
          "description": "Notifications (channels: the environment's alert settings)"
         },
         "confirm": {
          "type": "boolean"
         }
        },
        "required": [
         "name",
         "image"
        ]
       }
      }
     }
    },
    "x-cli": {
     "command": "container pipeline create",
     "confirm": false
    }
   }
  },
  "/cloud/containers/{id}/pipelines/{pipeline}": {
   "get": {
    "tags": [
     "Containers"
    ],
    "operationId": "pipeline_get",
    "summary": "Get a pipeline",
    "x-summary-tr": "Pipeline'ı getir",
    "x-scope": "services_read",
    "description": "Settings, webhook address, build secret names (values never returned). ",
    "x-description-tr": "Ayarlar, webhook adresi, gizli değer adları (değerler dönmez). ",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "pipeline",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Pipeline id (p + 8)"
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "$ref": "#/components/schemas/ContainerPipeline"
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "x-cli": {
     "command": "container pipeline get",
     "confirm": false
    }
   },
   "patch": {
    "tags": [
     "Containers"
    ],
    "operationId": "pipeline_update",
    "summary": "Change a pipeline",
    "x-summary-tr": "Pipeline'ı değiştir",
    "x-scope": "services_write",
    "description": "Send only the fields to change. `token`: new value, or \"-\" to remove. ",
    "x-description-tr": "Yalnız değişecek alanları gönderin. `token`: yeni değer ya da silmek için \"-\". ",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "pipeline",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Pipeline id (p + 8)"
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "properties": {
            "pipeline": {
             "$ref": "#/components/schemas/ContainerPipeline"
            }
           }
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "required": false,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "name": {
          "type": "string",
          "description": "Display name (1-48)",
          "x-description-tr": "Görünen ad (1-48)"
         },
         "provider": {
          "type": "string",
          "enum": [
           "github",
           "gitlab",
           "gitea",
           "git",
           "archive"
          ],
          "default": "github"
         },
         "repo": {
          "type": "string",
          "description": "Required for github / gitlab / gitea / git: https clone URL (no credentials) or SSH address git@host:org/repo.git / ssh://user@host[:port]/path (needs a deploy key). Leave it out for provider `archive` (an archive pipeline has no repository; a value sent with `archive` is ignored and the answer shows `repo` empty).",
          "x-description-tr": "github / gitlab / gitea / git için zorunlu: https klon adresi (kimlik bilgisi yok) ya da SSH adresi git@sunucu:kurum/depo.git / ssh://kullanici@sunucu[:port]/yol (deploy key gerekir). provider `archive` için göndermeyin (arşiv pipeline deposuz çalışır; `archive` ile gönderilen değer yok sayılır, yanıtta `repo` boş görünür).",
          "example": "https://github.com/gyro-ornek/uygulama"
         },
         "token": {
          "type": "string",
          "format": "password",
          "description": "Read-only access token for a private repository (stored encrypted, never returned; \"-\" on update removes it)",
          "x-description-tr": "Özel depo için yalnız okuma erişim belirteci (şifreli saklanır, geri dönmez; güncellemede \"-\" siler)"
         },
         "git_user": {
          "type": "string",
          "description": "User name for the token (default: x-access-token / oauth2 / git)"
         },
         "branch": {
          "type": "string",
          "description": "Branches whose pushes build (comma separated globs, empty = none)",
          "x-description-tr": "Push'u derlenen dallar (virgüllü glob, boş = yok)",
          "default": "main"
         },
         "tags": {
          "type": "string",
          "description": "Tags that build (globs, e.g. v*)",
          "x-description-tr": "Derlenen etiketler (glob, ör. v*)"
         },
         "auto": {
          "type": "boolean",
          "default": true,
          "description": "Webhook pushes start runs"
         },
         "repo_file": {
          "type": "boolean",
          "default": true,
          "description": "Read gyro-pipeline.yml from the repository (GitHub, GitLab, Gitea)"
         },
         "image": {
          "type": "string",
          "description": "Image name in the environment registry (<registry>/<code>/<image>:<sha7> + :latest)",
          "x-description-tr": "Ortam deposundaki imaj adı"
         },
         "dockerfile": {
          "type": "string",
          "default": "Dockerfile"
         },
         "context": {
          "type": "string",
          "description": "Build folder (empty = repository root)"
         },
         "build_target": {
          "type": "string",
          "pattern": "^[A-Za-z0-9._-]{0,64}$",
          "example": "production",
          "description": "Stage of a multi-stage Dockerfile to build (`FROM node:20 AS production` -> `production`, same as `docker build --target`). Empty = the last stage. Stage names are case-insensitive (stored lowercase). A stage the Dockerfile does not have fails the run with `build_target_not_found`. gyro-pipeline.yml: `build_target:` overrides it per run. CLI: `--target` (or `--build-target`).",
          "x-description-tr": "Çok aşamalı Dockerfile'da derlenecek aşama (`FROM node:20 AS production` -> `production`, `docker build --target` ile aynı). Boş = son aşama. Aşama adı büyük/küçük harf duyarsızdır (küçük harfle saklanır). Dockerfile'da olmayan aşama `build_target_not_found` hatasıyla çalıştırmayı durdurur. gyro-pipeline.yml: `build_target:` çalıştırma için bunu ezer. CLI: `--target` (ya da `--build-target`)."
         },
         "targets": {
          "type": "array",
          "items": {
           "type": "string"
          },
          "description": "Services that get the new image (empty = build only)",
          "x-description-tr": "Yeni imaja geçecek servisler (boş = yalnız derle)"
         },
         "approval": {
          "type": "boolean",
          "default": false,
          "description": "Wait for approval before deploying (24 h)"
         },
         "auto_rollback": {
          "type": "boolean",
          "default": true,
          "description": "Roll back when the new version is unhealthy"
         },
         "build_image": {
          "type": "string",
          "description": "Image that runs `commands` (e.g. node:22-alpine)"
         },
         "commands": {
          "type": "array",
          "items": {
           "type": "string"
          },
          "description": "Shell commands run in the repository root before the Dockerfile (tests, npm ci ...); build secrets are environment variables here"
         },
         "build_env": {
          "type": "object",
          "additionalProperties": {
           "type": "string"
          },
          "description": "Variables for `commands`"
         },
         "build_args": {
          "type": "object",
          "additionalProperties": {
           "type": "string"
          },
          "description": "Dockerfile ARG values (visible in the image history)"
         },
         "cpu_m": {
          "type": "integer",
          "description": "Build CPU (millicores, plan limit)"
         },
         "memory_mi": {
          "type": "integer",
          "description": "Build memory (MiB, plan limit)"
         },
         "timeout_min": {
          "type": "integer",
          "description": "Build time limit (minutes, plan limit)"
         },
         "verify_min": {
          "type": "integer",
          "description": "Health wait after deploy (1-30 minutes)"
         },
         "notify": {
          "type": "array",
          "items": {
           "type": "string",
           "enum": [
            "failed",
            "succeeded",
            "approval",
            "rolled_back"
           ]
          },
          "description": "Notifications (channels: the environment's alert settings)"
         },
         "confirm": {
          "type": "boolean"
         }
        }
       }
      }
     }
    },
    "x-cli": {
     "command": "container pipeline update",
     "confirm": false
    }
   },
   "delete": {
    "tags": [
     "Containers"
    ],
    "operationId": "pipeline_delete",
    "summary": "Delete a pipeline",
    "x-summary-tr": "Pipeline'ı sil",
    "x-scope": "services_write",
    "description": "Stops its running runs and deletes its history, webhook secret, token and build secrets. Images stay in the registry. Needs `\"confirm\": true`.",
    "x-description-tr": "Süren çalıştırmalarını durdurur; geçmişini, webhook anahtarını, belirteci ve gizli değerlerini siler. İmajlar depoda kalır. `\"confirm\": true` gerekir.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "pipeline",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Pipeline id (p + 8)"
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object"
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "required": false,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "confirm": {
          "type": "boolean"
         }
        }
       }
      }
     }
    },
    "x-cli": {
     "command": "container pipeline delete",
     "confirm": true
    }
   }
  },
  "/cloud/containers/{id}/pipelines/{pipeline}/webhook": {
   "get": {
    "tags": [
     "Containers"
    ],
    "operationId": "pipeline_webhook",
    "summary": "Webhook address and secret",
    "x-summary-tr": "Webhook adresi ve gizli anahtar",
    "x-scope": "services_read",
    "description": "Returns `webhook_url` and `webhook_secret`. ",
    "x-description-tr": "`webhook_url` ve `webhook_secret` döner. ",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "pipeline",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Pipeline id (p + 8)"
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "properties": {
            "webhook_url": {
             "type": "string"
            },
            "webhook_secret": {
             "type": "string"
            }
           }
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "x-cli": {
     "command": "container pipeline webhook",
     "confirm": false
    }
   }
  },
  "/cloud/containers/{id}/pipelines/{pipeline}/webhook/rotate": {
   "post": {
    "tags": [
     "Containers"
    ],
    "operationId": "pipeline_rotate_secret",
    "summary": "Rotate the webhook secret",
    "x-summary-tr": "Webhook gizli anahtarını yenile",
    "x-scope": "services_write",
    "description": "The old secret stops working at once: update the repository's webhook. Needs `\"confirm\": true`.",
    "x-description-tr": "Eski anahtar hemen geçersiz olur: depodaki webhook'u güncelleyin. `\"confirm\": true` gerekir.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "pipeline",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Pipeline id (p + 8)"
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "properties": {
            "webhook_url": {
             "type": "string"
            },
            "webhook_secret": {
             "type": "string"
            }
           }
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "required": false,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "confirm": {
          "type": "boolean"
         }
        }
       }
      }
     }
    },
    "x-cli": {
     "command": "container pipeline rotate-secret",
     "confirm": true
    }
   }
  },
  "/cloud/containers/{id}/pipelines/{pipeline}/test": {
   "post": {
    "tags": [
     "Containers"
    ],
    "operationId": "pipeline_test",
    "summary": "Test repository access",
    "x-summary-tr": "Depo erişimini test et",
    "x-scope": "services_write",
    "description": "Reads the branches and tags (ls-remote) with the stored token. ",
    "x-description-tr": "Kayıtlı belirteçle dalları ve etiketleri okur. ",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "pipeline",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Pipeline id (p + 8)"
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "properties": {
            "branches": {
             "type": "array",
             "items": {
              "type": "string"
             }
            },
            "tags": {
             "type": "array",
             "items": {
              "type": "string"
             }
            }
           }
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "required": false,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "confirm": {
          "type": "boolean"
         }
        }
       }
      }
     }
    },
    "x-cli": {
     "command": "container pipeline test",
     "confirm": false
    }
   }
  },
  "/cloud/containers/{id}/pipelines/{pipeline}/secrets": {
   "put": {
    "tags": [
     "Containers"
    ],
    "operationId": "pipeline_secret_set",
    "summary": "Set build secrets",
    "x-summary-tr": "Derleme gizli değeri ayarla",
    "x-scope": "services_write",
    "description": "`set`: {NAME: value} (A-Z0-9_). Given only to `commands` as environment variables, masked as **** in logs, never returned. ",
    "x-description-tr": "`set`: {AD: değer}. Yalnız `commands` adımına ortam değişkeni olarak verilir, loglarda ****, geri dönmez. ",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "pipeline",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Pipeline id (p + 8)"
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object"
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "set": {
          "type": "object",
          "additionalProperties": {
           "type": "string"
          }
         },
         "confirm": {
          "type": "boolean"
         }
        },
        "required": [
         "set"
        ]
       }
      }
     }
    },
    "x-cli": {
     "command": "container pipeline secret set",
     "confirm": false
    }
   }
  },
  "/cloud/containers/{id}/pipelines/{pipeline}/secrets/{secret}": {
   "delete": {
    "tags": [
     "Containers"
    ],
    "operationId": "pipeline_secret_delete",
    "summary": "Delete a build secret",
    "x-summary-tr": "Derleme gizli değerini sil",
    "x-scope": "services_write",
    "description": "Needs `\"confirm\": true`.",
    "x-description-tr": "`\"confirm\": true` gerekir.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "pipeline",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Pipeline id (p + 8)"
     },
     {
      "name": "secret",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Build secret name"
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object"
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "required": false,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "confirm": {
          "type": "boolean"
         }
        }
       }
      }
     }
    },
    "x-cli": {
     "command": "container pipeline secret delete",
     "confirm": true
    }
   }
  },
  "/cloud/containers/{id}/pipelines/{pipeline}/runs": {
   "get": {
    "tags": [
     "Containers"
    ],
    "operationId": "pipeline_runs",
    "summary": "Runs of a pipeline",
    "x-summary-tr": "Pipeline çalıştırmaları",
    "x-scope": "services_read",
    "description": "Last 50 runs, newest first. ",
    "x-description-tr": "Son 50 çalıştırma, yeniden eskiye. ",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "pipeline",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Pipeline id (p + 8)"
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "properties": {
            "runs": {
             "type": "array",
             "items": {
              "$ref": "#/components/schemas/ContainerPipelineRun"
             }
            }
           }
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "x-cli": {
     "command": "container pipeline runs",
     "confirm": false
    }
   },
   "post": {
    "tags": [
     "Containers"
    ],
    "operationId": "pipeline_run",
    "summary": "Start a run",
    "x-summary-tr": "Çalıştırma başlat",
    "x-scope": "services_write",
    "description": "`ref`: branch (`main`), tag (`tag:v1.2.0`) or full ref; `sha`: optional 40 character commit. Without both the first branch of the rule builds. Queued runs start when the environment's parallel build limit allows.  With `upload_id` the uploaded archive is built (gyro-pipeline.yml is not read for archives).",
    "x-description-tr": "`ref`: dal (`main`), etiket (`tag:v1.2.0`) ya da tam ref; `sha`: isteğe bağlı 40 karakter commit. İkisi yoksa kuraldaki ilk dal derlenir.  `upload_id` verilirse yüklenen arşiv derlenir (arşivlerde gyro-pipeline.yml okunmaz).",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "pipeline",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Pipeline id (p + 8)"
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "properties": {
            "run": {
             "$ref": "#/components/schemas/ContainerPipelineRun"
            }
           }
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "required": false,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "ref": {
          "type": "string",
          "example": "main"
         },
         "sha": {
          "type": "string"
         },
         "confirm": {
          "type": "boolean"
         },
         "upload_id": {
          "type": "string",
          "example": "u3k9x0abc12de",
          "description": "Build an uploaded archive (from POST .../uploads) instead of a git ref",
          "x-description-tr": "Git ref yerine yüklenen arşivi derle (POST .../uploads yanıtındaki kimlik)"
         },
         "archive_name": {
          "type": "string",
          "example": "site.tar.gz",
          "description": "Shown in the run list"
         }
        }
       }
      }
     }
    },
    "x-cli": {
     "command": "container pipeline run",
     "confirm": false
    }
   }
  },
  "/cloud/containers/{id}/pipeline-runs/{run}": {
   "get": {
    "tags": [
     "Containers"
    ],
    "operationId": "pipeline_run_get",
    "summary": "Get a run",
    "x-summary-tr": "Çalıştırmayı getir",
    "x-scope": "services_read",
    "description": "",
    "x-description-tr": "",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "run",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Run id"
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "$ref": "#/components/schemas/ContainerPipelineRun"
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "x-cli": {
     "command": "container pipeline run-get",
     "confirm": false
    }
   }
  },
  "/cloud/containers/{id}/pipeline-runs/{run}/logs": {
   "get": {
    "tags": [
     "Containers"
    ],
    "operationId": "pipeline_logs",
    "summary": "Run log",
    "x-summary-tr": "Çalıştırma logu",
    "x-scope": "services_read",
    "description": "Live while building (clone / commands / build sections, secrets masked), saved afterwards (max 512 KB). `tail`: last N lines. ",
    "x-description-tr": "Derlenirken canlı, sonra kayıtlı (en çok 512 KB). `tail`: son N satır. ",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "run",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Run id"
     },
     {
      "name": "tail",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer"
      },
      "description": "last N lines (default 3000)"
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "properties": {
            "state": {
             "type": "string"
            },
            "step": {
             "type": "string"
            },
            "live": {
             "type": "boolean"
            },
            "log": {
             "type": "string"
            }
           }
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "x-cli": {
     "command": "container pipeline logs",
     "confirm": false
    }
   }
  },
  "/cloud/containers/{id}/pipeline-runs/{run}/cancel": {
   "post": {
    "tags": [
     "Containers"
    ],
    "operationId": "pipeline_cancel",
    "summary": "Stop a run",
    "x-summary-tr": "Çalıştırmayı durdur",
    "x-scope": "services_write",
    "description": "",
    "x-description-tr": "",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "run",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Run id"
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object"
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "required": false,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "confirm": {
          "type": "boolean"
         }
        }
       }
      }
     }
    },
    "x-cli": {
     "command": "container pipeline cancel",
     "confirm": false
    }
   }
  },
  "/cloud/containers/{id}/pipeline-runs/{run}/approve": {
   "post": {
    "tags": [
     "Containers"
    ],
    "operationId": "pipeline_approve",
    "summary": "Approve the deployment",
    "x-summary-tr": "Dağıtımı onayla",
    "x-scope": "services_write",
    "description": "Only for a run in `awaiting_approval`. ",
    "x-description-tr": "Yalnız `awaiting_approval` durumundaki çalıştırma. ",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "run",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Run id"
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "properties": {
            "run": {
             "$ref": "#/components/schemas/ContainerPipelineRun"
            }
           }
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "required": false,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "confirm": {
          "type": "boolean"
         }
        }
       }
      }
     }
    },
    "x-cli": {
     "command": "container pipeline approve",
     "confirm": false
    }
   }
  },
  "/cloud/containers/{id}/pipeline-runs/{run}/reject": {
   "post": {
    "tags": [
     "Containers"
    ],
    "operationId": "pipeline_reject",
    "summary": "Reject the deployment",
    "x-summary-tr": "Dağıtımı reddet",
    "x-scope": "services_write",
    "description": "",
    "x-description-tr": "",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "run",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Run id"
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "properties": {
            "run": {
             "$ref": "#/components/schemas/ContainerPipelineRun"
            }
           }
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "required": false,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "confirm": {
          "type": "boolean"
         }
        }
       }
      }
     }
    },
    "x-cli": {
     "command": "container pipeline reject",
     "confirm": false
    }
   }
  },
  "/cloud/containers/{id}/pipeline-runs/{run}/redeploy": {
   "post": {
    "tags": [
     "Containers"
    ],
    "operationId": "pipeline_redeploy",
    "summary": "Deploy this run's image again (rollback)",
    "x-summary-tr": "Bu çalıştırmanın imajını yeniden dağıt (geri dönüş)",
    "x-scope": "services_write",
    "description": "Starts a new run that deploys the image of an earlier run to the target services (with health watch). Needs `\"confirm\": true`.",
    "x-description-tr": "Önceki bir çalıştırmanın imajını hedef servislere dağıtan yeni çalıştırma başlatır. `\"confirm\": true` gerekir.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "run",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Run id"
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "properties": {
            "run": {
             "$ref": "#/components/schemas/ContainerPipelineRun"
            }
           }
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "required": false,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "targets": {
          "type": "array",
          "items": {
           "type": "string"
          }
         },
         "confirm": {
          "type": "boolean"
         }
        }
       }
      }
     }
    },
    "x-cli": {
     "command": "container pipeline redeploy",
     "confirm": true
    }
   }
  },
  "/cloud/containers/{id}/pipelines/{pipeline}/uploads": {
   "post": {
    "tags": [
     "Containers"
    ],
    "operationId": "pipeline_upload",
    "summary": "Upload URL for an archive build",
    "x-summary-tr": "Arşiv derlemesi için yükleme adresi",
    "x-scope": "services_write",
    "description": "Returns a presigned `url` (valid 15 minutes) for one `PUT` of exactly `size` bytes (tar.gz / tgz / zip, max 200 MB; send `Content-Length: size`, e.g. `curl -T site.tar.gz \"<url>\"`). Then start the build with `POST .../runs {\"upload_id\": ...}`. Archives are deleted after 24 hours. Do not send an Idempotency-Key here (the URL would be withheld from the replayed answer). ",
    "x-description-tr": "15 dakika geçerli, tam `size` bayt için tek `PUT` adresi (`url`) döner (tar.gz / tgz / zip, en çok 200 MB; ör. `curl -T site.tar.gz \"<url>\"`). Sonra `POST .../runs {\"upload_id\": ...}` ile derleyin. Arşivler 24 saatte silinir. ",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "pipeline",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Pipeline id (p + 8)"
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "properties": {
            "upload_id": {
             "type": "string"
            },
            "url": {
             "type": "string"
            },
            "method": {
             "type": "string",
             "example": "PUT"
            },
            "headers": {
             "type": "object"
            },
            "expires_in": {
             "type": "integer",
             "example": 900
            },
            "max_bytes": {
             "type": "integer"
            },
            "retention_hours": {
             "type": "integer",
             "example": 24
            }
           }
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "size": {
          "type": "integer",
          "description": "archive size in bytes (1 - 209715200)"
         },
         "confirm": {
          "type": "boolean"
         }
        },
        "required": [
         "size"
        ]
       }
      }
     }
    },
    "x-cli": {
     "command": "container pipeline upload",
     "confirm": false
    }
   }
  },
  "/cloud/containers/{id}/pipelines/{pipeline}/deploy-key": {
   "put": {
    "tags": [
     "Containers"
    ],
    "operationId": "pipeline_deploy_key_create",
    "summary": "Create the SSH deploy key",
    "x-summary-tr": "SSH deploy key oluştur",
    "x-scope": "services_write",
    "description": "Creates an ed25519 key pair for an SSH repository and returns only the public key (add it to the repository as a read-only deploy key). The private key is stored encrypted and never returned. A pipeline has one key; `\"rotate\": true` replaces it (the old key stops working). ",
    "x-description-tr": "SSH deposu için ed25519 anahtar çifti üretir, yalnız açık anahtarı döner (depoya salt okuma deploy key olarak ekleyin). Özel anahtar şifreli saklanır, hiç dönmez. `\"rotate\": true` yeniler. ",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "pipeline",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Pipeline id (p + 8)"
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "properties": {
            "deploy_key": {
             "type": "object",
             "nullable": true,
             "properties": {
              "public_key": {
               "type": "string",
               "example": "ssh-ed25519 AAAAC3Nza... gyro-pipeline"
              },
              "fingerprint": {
               "type": "string"
              },
              "type": {
               "type": "string",
               "example": "ed25519"
              }
             }
            }
           }
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "required": false,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "rotate": {
          "type": "boolean",
          "default": false
         },
         "confirm": {
          "type": "boolean"
         }
        }
       }
      }
     }
    },
    "x-cli": {
     "command": "container pipeline deploy-key create",
     "confirm": false
    }
   },
   "delete": {
    "tags": [
     "Containers"
    ],
    "operationId": "pipeline_deploy_key_delete",
    "summary": "Delete the SSH deploy key",
    "x-summary-tr": "SSH deploy key'i sil",
    "x-scope": "services_write",
    "description": "The pipeline can no longer reach its SSH repository. Needs `\"confirm\": true`.",
    "x-description-tr": "Pipeline SSH deposuna artık erişemez. `\"confirm\": true` gerekir.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "pipeline",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Pipeline id (p + 8)"
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object"
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "required": false,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "confirm": {
          "type": "boolean"
         }
        }
       }
      }
     }
    },
    "x-cli": {
     "command": "container pipeline deploy-key delete",
     "confirm": true
    }
   }
  },
  "/cloud/containers/{id}/pipelines/{pipeline}/host-key": {
   "get": {
    "tags": [
     "Containers"
    ],
    "operationId": "pipeline_host_key_scan",
    "summary": "SSH server host key",
    "x-summary-tr": "SSH sunucu anahtarı",
    "x-scope": "services_read",
    "description": "Connects to the repository's SSH server (public addresses only) and returns the host key fingerprint. GitHub / GitLab / Bitbucket keys are pinned (`pinned: true`). Other servers: compare the fingerprint with your own record, then confirm it with PUT. ",
    "x-description-tr": "Deponun SSH sunucusuna bağlanıp anahtar parmak izini döner. GitHub / GitLab / Bitbucket anahtarları sabittir. Diğer sunucularda parmak izini kendi kaydınızla karşılaştırıp PUT ile onaylayın. ",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "pipeline",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Pipeline id (p + 8)"
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "properties": {
            "host": {
             "type": "string"
            },
            "port": {
             "type": "integer"
            },
            "pinned": {
             "type": "boolean"
            },
            "trusted": {
             "type": "boolean"
            },
            "keys": {
             "type": "array",
             "items": {
              "type": "object",
              "properties": {
               "type": {
                "type": "string"
               },
               "fingerprint": {
                "type": "string"
               }
              }
             }
            }
           }
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "x-cli": {
     "command": "container pipeline host-key scan",
     "confirm": false
    }
   },
   "put": {
    "tags": [
     "Containers"
    ],
    "operationId": "pipeline_host_key_trust",
    "summary": "Confirm (or forget) the SSH host key",
    "x-summary-tr": "SSH sunucu anahtarını onayla (ya da kaldır)",
    "x-scope": "services_write",
    "description": "`fingerprint`: the SHA256 fingerprint you verified (the server is scanned again and must present it); `forget: true` removes the confirmation. Builds stop if the server key changes later. ",
    "x-description-tr": "`fingerprint`: doğruladığınız SHA256 parmak izi (sunucu yeniden taranır, aynısını göstermelidir); `forget: true` onayı kaldırır. Anahtar sonradan değişirse derleme durur. ",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     },
     {
      "name": "pipeline",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Pipeline id (p + 8)"
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "properties": {
            "trusted": {
             "type": "boolean"
            },
            "fingerprint": {
             "type": "string"
            }
           }
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "required": false,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "fingerprint": {
          "type": "string",
          "example": "SHA256:abc..."
         },
         "forget": {
          "type": "boolean"
         },
         "confirm": {
          "type": "boolean"
         }
        }
       }
      }
     }
    },
    "x-cli": {
     "command": "container pipeline host-key trust",
     "confirm": false
    }
   }
  },
  "/cloud/licenses/{id}": {
   "get": {
    "tags": [
     "Licenses"
    ],
    "operationId": "typed_get_licenses__id",
    "summary": "GET method license_status (LisansAPP)",
    "x-summary-tr": "method license_status (LisansAPP)",
    "x-scope": "services_read",
    "description": "Typed shortcut of the generic bridge: tool `license_status`. Body fields are the tool's own fields.",
    "x-description-tr": "Genel köprünün kısayolu: araç `license_status`. Gövde alanları aracın kendi alanlarıdır.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     }
    ],
    "responses": {
     "200": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    }
   }
  },
  "/cloud/licenses/{id}/change-ip": {
   "post": {
    "tags": [
     "Licenses"
    ],
    "operationId": "typed_post_licenses__id__change_ip",
    "summary": "POST method change_ip (LisansAPP)",
    "x-summary-tr": "method change_ip (LisansAPP)",
    "x-scope": "services_write",
    "description": "Typed shortcut of the generic bridge: tool `change_ip`. Body fields are the tool's own fields.",
    "x-description-tr": "Genel köprünün kısayolu: araç `change_ip`. Gövde alanları aracın kendi alanlarıdır.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id"
     }
    ],
    "responses": {
     "202": {
      "description": "Tool data / result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "additionalProperties": true,
        "properties": {
         "confirm": {
          "type": "boolean"
         }
        }
       }
      }
     }
    }
   }
  },
  "/cloud/security-groups": {
   "get": {
    "tags": [
     "Security groups"
    ],
    "operationId": "listSecurityGroups",
    "summary": "List security groups",
    "x-summary-tr": "Güvenlik gruplarını listele",
    "x-scope": "cloud_read",
    "x-cli": {
     "command": "security-group list"
    },
    "responses": {
     "200": {
      "description": "Groups",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "array",
           "items": {
            "$ref": "#/components/schemas/SecurityGroup"
           }
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     }
    }
   },
   "post": {
    "tags": [
     "Security groups"
    ],
    "operationId": "createSecurityGroup",
    "summary": "Create a security group",
    "x-summary-tr": "Güvenlik grubu oluştur",
    "x-scope": "cloud_write",
    "x-cli": {
     "command": "security-group create"
    },
    "description": "Name unique per account (2-64 characters). Without `rules` the group has one outbound rule (all traffic) and no inbound rule.",
    "x-description-tr": "Ad hesap içinde benzersiz (2-64 karakter). `rules` verilmezse grupta tek giden kural (tüm trafik) olur, gelen kural olmaz.",
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "name": {
          "type": "string"
         },
         "description": {
          "type": "string"
         },
         "rules": {
          "type": "array",
          "items": {
           "$ref": "#/components/schemas/SecurityGroupRule"
          }
         }
        },
        "required": [
         "name"
        ]
       }
      }
     }
    },
    "responses": {
     "201": {
      "description": "Created",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "$ref": "#/components/schemas/SecurityGroup"
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    }
   }
  },
  "/cloud/security-groups/{sg}": {
   "parameters": [
    {
     "name": "sg",
     "in": "path",
     "required": true,
     "schema": {
      "type": "string",
      "pattern": "^sg-[a-f0-9]{8}$"
     }
    }
   ],
   "get": {
    "tags": [
     "Security groups"
    ],
    "operationId": "getSecurityGroup",
    "summary": "Get a security group",
    "x-summary-tr": "Güvenlik grubunu getir",
    "x-scope": "cloud_read",
    "x-cli": {
     "command": "security-group get"
    },
    "responses": {
     "200": {
      "description": "Group",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "$ref": "#/components/schemas/SecurityGroup"
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     }
    }
   },
   "patch": {
    "tags": [
     "Security groups"
    ],
    "operationId": "updateSecurityGroup",
    "summary": "Rename / describe a security group",
    "x-summary-tr": "Güvenlik grubunun adını / açıklamasını değiştir",
    "x-scope": "cloud_write",
    "x-cli": {
     "command": "security-group update"
    },
    "description": "Only the display name and description change; the group id and its rules stay.",
    "x-description-tr": "Yalnız görünen ad ve açıklama değişir; grup kimliği ve kuralları aynı kalır.",
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "name": {
          "type": "string"
         },
         "description": {
          "type": "string"
         }
        }
       }
      }
     }
    },
    "responses": {
     "200": {
      "description": "Group",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "$ref": "#/components/schemas/SecurityGroup"
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    }
   },
   "delete": {
    "tags": [
     "Security groups"
    ],
    "operationId": "deleteSecurityGroup",
    "summary": "Delete a security group",
    "x-summary-tr": "Güvenlik grubunu sil",
    "x-scope": "cloud_write",
    "x-cli": {
     "command": "security-group delete",
     "confirm": true
    },
    "description": "Only a group that is attached to no server (422 err_sg_attached).",
    "x-description-tr": "Yalnız hiçbir sunucuya bağlı olmayan grup (422 err_sg_attached).",
    "responses": {
     "200": {
      "description": "Deleted",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "properties": {
            "deleted": {
             "type": "boolean"
            },
            "id": {
             "type": "string"
            }
           }
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    }
   }
  },
  "/cloud/security-groups/{sg}/rules": {
   "parameters": [
    {
     "name": "sg",
     "in": "path",
     "required": true,
     "schema": {
      "type": "string",
      "pattern": "^sg-[a-f0-9]{8}$"
     }
    }
   ],
   "put": {
    "tags": [
     "Security groups"
    ],
    "operationId": "putSecurityGroupRules",
    "summary": "Replace the rules of a security group",
    "x-summary-tr": "Güvenlik grubunun kurallarını değiştir",
    "x-scope": "cloud_write",
    "x-cli": {
     "command": "security-group rules set"
    },
    "description": "Full replace (inbound + outbound), max 60 rules. Applied to every attached server. If the change removes or narrows SSH (22) / RDP (3389) access for any source on an attached server, or cuts the calling address, it runs as a 5 minute trial (`trial: true`, `trial_seconds_left`) - the same rule as the panel, CLI and Terraform: confirm with POST .../confirm, otherwise the previous rules return. A server's rules (own + all attached groups) must fit its allowance (422 err_sg_quota).",
    "x-description-tr": "Tam değiştirme (gelen + giden), en çok 60 kural. Bağlı tüm sunuculara uygulanır. Bağlı bir sunucuda herhangi bir kaynağın SSH (22) / RDP (3389) erişimini kaldırıyor ya da daraltıyorsa veya çağıran adresi kesiyorsa 5 dakikalık deneme olur (`trial: true`, `trial_seconds_left`) - panel, CLI ve Terraform ile aynı kural: .../confirm ile onaylayın, yoksa önceki kurallar döner. Sunucunun kuralları (kendi + bağlı tüm gruplar) hakkına sığmalı (422 err_sg_quota).",
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "required": [
         "rules"
        ],
        "properties": {
         "rules": {
          "type": "array",
          "items": {
           "$ref": "#/components/schemas/SecurityGroupRule"
          }
         }
        }
       },
       "example": {
        "rules": [
         {
          "type": "https",
          "source": [
           "0.0.0.0/0"
          ]
         },
         {
          "type": "ssh",
          "source": [
           "203.0.113.10/32"
          ],
          "description": "office"
         },
         {
          "direction": "out",
          "type": "all",
          "source": [
           "0.0.0.0/0"
          ]
         }
        ]
       }
      }
     }
    },
    "responses": {
     "200": {
      "description": "Group (trial, corrections)",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "$ref": "#/components/schemas/SecurityGroup"
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    }
   }
  },
  "/cloud/security-groups/{sg}/confirm": {
   "parameters": [
    {
     "name": "sg",
     "in": "path",
     "required": true,
     "schema": {
      "type": "string",
      "pattern": "^sg-[a-f0-9]{8}$"
     }
    }
   ],
   "post": {
    "tags": [
     "Security groups"
    ],
    "operationId": "confirmSecurityGroup",
    "summary": "Make the running rule trial permanent",
    "x-summary-tr": "Kural denemesini kalıcı yap",
    "x-scope": "cloud_write",
    "x-cli": {
     "command": "security-group confirm"
    },
    "responses": {
     "200": {
      "description": "Group",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "$ref": "#/components/schemas/SecurityGroup"
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    }
   }
  },
  "/cloud/servers/{id}/security-groups": {
   "parameters": [
    {
     "$ref": "#/components/parameters/ServerId"
    }
   ],
   "get": {
    "tags": [
     "Security groups"
    ],
    "operationId": "listServerSecurityGroups",
    "summary": "Security groups attached to a server",
    "x-summary-tr": "Sunucuya bağlı güvenlik grupları",
    "x-scope": "cloud_read",
    "x-cli": {
     "command": "security-group server list"
    },
    "responses": {
     "200": {
      "description": "Attached groups",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "$ref": "#/components/schemas/ServerSecurityGroups"
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "description": "firewall_not_enabled"
     }
    }
   },
   "put": {
    "tags": [
     "Security groups"
    ],
    "operationId": "setServerSecurityGroups",
    "summary": "Set the exact list of attached groups",
    "x-summary-tr": "Bağlı grupları tam liste olarak ayarla",
    "x-scope": "cloud_write",
    "x-cli": {
     "command": "security-group server set"
    },
    "description": "Attaches / detaches in one change (order = evaluation order, max 5). Answers 422 err_busy while the previous change of the server is being applied: retry after a few seconds.",
    "x-description-tr": "Tek değişiklikte bağlar / ayırır (sıra = değerlendirme sırası, en çok 5). Sunucunun önceki değişikliği uygulanırken 422 err_busy döner: birkaç saniye sonra tekrar deneyin.",
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "security_groups": {
          "type": "array",
          "maxItems": 5,
          "items": {
           "type": "string"
          }
         }
        },
        "required": [
         "security_groups"
        ]
       }
      }
     }
    },
    "responses": {
     "200": {
      "description": "Attached groups",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "$ref": "#/components/schemas/ServerSecurityGroups"
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "description": "firewall_not_enabled"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    }
   }
  },
  "/cloud/servers/{id}/security-groups/{sg}": {
   "parameters": [
    {
     "$ref": "#/components/parameters/ServerId"
    },
    {
     "name": "sg",
     "in": "path",
     "required": true,
     "schema": {
      "type": "string",
      "pattern": "^sg-[a-f0-9]{8}$"
     }
    }
   ],
   "post": {
    "tags": [
     "Security groups"
    ],
    "operationId": "attachSecurityGroup",
    "summary": "Attach a security group to a server",
    "x-summary-tr": "Güvenlik grubunu sunucuya bağla",
    "x-scope": "cloud_write",
    "x-cli": {
     "command": "security-group attach"
    },
    "responses": {
     "200": {
      "description": "Attached groups",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "$ref": "#/components/schemas/ServerSecurityGroups"
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "description": "firewall_not_enabled"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    }
   },
   "delete": {
    "tags": [
     "Security groups"
    ],
    "operationId": "detachSecurityGroup",
    "summary": "Detach a security group from a server",
    "x-summary-tr": "Güvenlik grubunu sunucudan ayır",
    "x-scope": "cloud_write",
    "x-cli": {
     "command": "security-group detach"
    },
    "responses": {
     "200": {
      "description": "Attached groups",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "$ref": "#/components/schemas/ServerSecurityGroups"
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "description": "firewall_not_enabled"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    }
   }
  },
  "/ping": {
   "get": {
    "tags": [
     "Account"
    ],
    "operationId": "corePing",
    "summary": "Ping",
    "x-summary-tr": "Ping",
    "x-scope": "System/Ping",
    "x-generated": "core-catalog",
    "description": "Ping. \n\nCore WISECP client endpoint.",
    "x-description-tr": "",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     }
    }
   }
  },
  "/reference/countries": {
   "get": {
    "tags": [
     "Reference data"
    ],
    "operationId": "coreGetCountries",
    "summary": "List countries",
    "x-summary-tr": "Get countries",
    "x-scope": "Reference/GetCountries",
    "x-generated": "core-catalog",
    "description": "List countries. \n\nCore WISECP client endpoint.",
    "x-description-tr": "",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "array",
           "items": {
            "type": "object",
            "additionalProperties": true
           }
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     }
    }
   }
  },
  "/reference/countries/{code}/states": {
   "get": {
    "tags": [
     "Reference data"
    ],
    "operationId": "coreGetStates",
    "summary": "List states (path: {code})",
    "x-summary-tr": "Get states",
    "x-scope": "Reference/GetStates",
    "x-generated": "core-catalog",
    "description": "List states (path: {code}). \n\nCore WISECP client endpoint.",
    "x-description-tr": "",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "array",
           "items": {
            "type": "object",
            "additionalProperties": true
           }
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     }
    },
    "parameters": [
     {
      "name": "code",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      }
     }
    ]
   }
  },
  "/reference/states/{id}/cities": {
   "get": {
    "tags": [
     "Reference data"
    ],
    "operationId": "coreGetCities",
    "summary": "List cities (path: {id})",
    "x-summary-tr": "Get cities",
    "x-scope": "Reference/GetCities",
    "x-generated": "core-catalog",
    "description": "List cities (path: {id}). \n\nCore WISECP client endpoint.",
    "x-description-tr": "",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "array",
           "items": {
            "type": "object",
            "additionalProperties": true
           }
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     }
    },
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      }
     }
    ]
   }
  },
  "/me": {
   "get": {
    "tags": [
     "Account"
    ],
    "operationId": "coreGetMe",
    "summary": "Get me",
    "x-summary-tr": "Profili Okuma",
    "x-scope": "Account/GetMe",
    "x-generated": "core-catalog",
    "description": "Get me. \n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/anahtarin-hesabi).",
    "x-description-tr": "Anahtarın sahibi olan müşterinin profilini döndürür. — anahtarın sahibi",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "description": "not_found",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    }
   },
   "patch": {
    "tags": [
     "Account"
    ],
    "operationId": "coreUpdateMe",
    "summary": "Update me",
    "x-summary-tr": "Profili Güncelleme",
    "x-scope": "Account/UpdateMe",
    "x-generated": "core-catalog",
    "description": "Update me. \n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/anahtarin-hesabi).",
    "x-description-tr": "Gönderdiğiniz profil alanlarını değiştirir. — operatör kapısı",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "422": {
      "description": "avatar_url_not_allowed, birthday_required, company_name_required, company_requires_corporate, custom_field_required, field_not_editable, field_too_long, kind_invalid, language_invalid, name_required, nothing_to_update",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "name": {
          "type": "string",
          "description": "Adı. Boşaltılamaz."
         },
         "surname": {
          "type": "string",
          "description": "Soyadı. Boşaltılamaz."
         },
         "kind": {
          "type": "string",
          "description": "Hesap türü. Bireysele geçmek şirket bilgilerini temizler."
         },
         "company": {
          "type": "object",
          "description": "Şirket bilgileri. Hesabın kurumsal olmasını gerektirir."
         },
         "birthday": {
          "type": "string",
          "description": "Doğum tarihi."
         },
         "identity": {
          "type": "string",
          "description": "Kimlik numarası."
         },
         "landline_phone": {
          "type": "string",
          "description": "Sabit telefon."
         },
         "language": {
          "type": "string",
          "description": "Dil kodu. Kurulumda bulunmalıdır."
         },
         "country": {
          "type": "string",
          "description": "Ülke kodu."
         },
         "currency": {
          "type": "string",
          "description": "Görüntü para birimi kodu."
         },
         "timezone": {
          "type": "string",
          "description": "Saat dilimi. Boş göndermek hesabın kendi seçimini siler."
         },
         "date_format": {
          "type": "string",
          "description": "Tarih biçimi. Boş göndermek hesabın kendi seçimini siler."
         },
         "custom_fields": {
          "type": "object",
          "description": "Ek alanların değerleri. Kutu tipli alanlar dizi alır."
         },
         "avatar": {
          "type": "string",
          "description": "Profil görseli. Yalnız kodlanmış içerik kabul edilir; adres reddedilir."
         },
         "email": {
          "type": "string",
          "description": ""
         },
         "phone": {
          "type": "string",
          "description": ""
         }
        }
       }
      }
     }
    }
   }
  },
  "/me/security": {
   "get": {
    "tags": [
     "Account"
    ],
    "operationId": "coreGetSecurity",
    "summary": "Get security",
    "x-summary-tr": "Güvenlik Özetini Okuma",
    "x-scope": "Account/GetSecurity",
    "x-generated": "core-catalog",
    "description": "Get security. \n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/anahtarin-hesabi).",
    "x-description-tr": "Doğrulama durumunu, iki adımlı girişi ve son oturumları döndürür. — değiştirilemez",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     }
    }
   }
  },
  "/me/notifications": {
   "get": {
    "tags": [
     "Account"
    ],
    "operationId": "coreGetNotifications",
    "summary": "Get notifications",
    "x-summary-tr": "Bildirim Tercihlerini Okuma",
    "x-scope": "Account/GetNotifications",
    "x-generated": "core-catalog",
    "description": "Get notifications. \n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/anahtarin-hesabi).",
    "x-description-tr": "Hesabın hangi bildirimleri hangi kanaldan aldığını döndürür.",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     }
    }
   },
   "put": {
    "tags": [
     "Account"
    ],
    "operationId": "coreUpdateNotifications",
    "summary": "Update notifications",
    "x-summary-tr": "Bildirim Tercihlerini Yazma",
    "x-scope": "Account/UpdateNotifications",
    "x-generated": "core-catalog",
    "description": "Update notifications. \n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/anahtarin-hesabi).",
    "x-description-tr": "Bildirim tercihlerinin tamamını yeniden yazar. — tam değiştirme",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     }
    },
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "invoices": {
          "type": "object",
          "description": "Fatura bildirimleri. E-posta ve kısa mesaj kanallarını taşır; eksik kanal kapalı sayılır."
         },
         "support": {
          "type": "object",
          "description": "Destek bildirimleri."
         },
         "product": {
          "type": "object",
          "description": "Ürün ve hizmet bildirimleri."
         },
         "domain": {
          "type": "object",
          "description": "Alan adı bildirimleri."
         },
         "marketing": {
          "type": "object",
          "description": "Pazarlama bildirimleri."
         },
         "general": {
          "type": "string",
          "description": ""
         }
        }
       }
      }
     }
    }
   }
  },
  "/addresses": {
   "get": {
    "tags": [
     "Account"
    ],
    "operationId": "coreGetAddresses",
    "summary": "List addresses",
    "x-summary-tr": "Adresleri Listeleme",
    "x-scope": "Addresses/GetAddresses",
    "x-generated": "core-catalog",
    "description": "List addresses. \n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/adres-defteri).",
    "x-description-tr": "Hesabın fatura profillerini döndürür. — anahtarın sahibi",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "array",
           "items": {
            "type": "object",
            "additionalProperties": true
           }
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     }
    }
   },
   "post": {
    "tags": [
     "Account"
    ],
    "operationId": "coreCreateAddress",
    "summary": "Create address",
    "x-summary-tr": "Adres Ekleme",
    "x-scope": "Addresses/CreateAddress",
    "x-generated": "core-catalog",
    "description": "Create address. \n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/adres-defteri).",
    "x-description-tr": "Hesaba yeni bir fatura profili ekler. — fatura profili",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "422": {
      "description": "company_name_required, contact_rejected, field_too_long, name_required, notifications_invalid",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "500": {
      "description": "address_add_failed",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "name": {
          "type": "string",
          "description": "İlgili kişinin adı."
         },
         "surname": {
          "type": "string",
          "description": "Soyadı."
         },
         "email": {
          "type": "string",
          "description": "Geçerli bir e-posta."
         },
         "country": {
          "type": "string",
          "description": "Ülke kodu. Başvuru ucundan alınır."
         },
         "state": {
          "type": "string",
          "description": "İl. Listeden numara, liste boşsa serbest metin."
         },
         "city": {
          "type": "string",
          "description": "Şehir. Listeden numara, liste boşsa serbest metin."
         },
         "address": {
          "type": "string",
          "description": "Açık adres."
         },
         "zipcode": {
          "type": "string",
          "description": "Posta kodu. En çok yirmi karakter."
         },
         "kind": {
          "type": "string",
          "description": "Kişi türü. Öntanımlı olarak bireysel."
         },
         "company": {
          "type": "object",
          "description": "Şirket bilgileri. Kurumsal kişide ad zorunludur."
         },
         "label": {
          "type": "string",
          "description": "Serbest etiket."
         },
         "phone": {
          "type": "string",
          "description": "Kişinin telefonu."
         },
         "identity": {
          "type": "string",
          "description": "Kimlik numarası."
         },
         "notifications": {
          "type": "object",
          "description": "Kanal matrisi. Tam değiştirmedir; hiç gönderilmezse hepsi açılır."
         },
         "is_default": {
          "type": "boolean",
          "description": "Bunu varsayılan profil yap."
         },
         "overwrite_invoices": {
          "type": "boolean",
          "description": "Açık faturaları bu adrese yeniden yaz."
         }
        },
        "required": [
         "address",
         "city",
         "country",
         "email",
         "name",
         "state",
         "surname",
         "zipcode"
        ]
       }
      }
     }
    }
   }
  },
  "/addresses/{id}": {
   "get": {
    "tags": [
     "Account"
    ],
    "operationId": "coreGetAddress",
    "summary": "Get address (path: {id})",
    "x-summary-tr": "Tek Adresi Okuma",
    "x-scope": "Addresses/GetAddress",
    "x-generated": "core-catalog",
    "description": "Get address (path: {id}). \n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/adres-defteri).",
    "x-description-tr": "Hesabın adreslerinden birini döndürür. — anahtarın sahibi",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "description": "not_found",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      }
     }
    ]
   },
   "put": {
    "tags": [
     "Account"
    ],
    "operationId": "coreUpdateAddress",
    "summary": "Update address (path: {id})",
    "x-summary-tr": "Adresi Güncelleme",
    "x-scope": "Addresses/UpdateAddress",
    "x-generated": "core-catalog",
    "description": "Update address (path: {id}). \n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/adres-defteri).",
    "x-description-tr": "Adresin tamamını yeniden yazar. — tam gövde",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "description": "not_found",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "description": "company_name_required, contact_rejected, field_too_long, name_required",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      }
     }
    ],
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "name": {
          "type": "string",
          "description": "İlgili kişinin adı."
         },
         "surname": {
          "type": "string",
          "description": "Soyadı."
         },
         "email": {
          "type": "string",
          "description": "Geçerli bir e-posta."
         },
         "country": {
          "type": "string",
          "description": "Ülke kodu. Başvuru ucundan alınır."
         },
         "state": {
          "type": "string",
          "description": "İl. Listeden numara, liste boşsa serbest metin."
         },
         "city": {
          "type": "string",
          "description": "Şehir. Listeden numara, liste boşsa serbest metin."
         },
         "address": {
          "type": "string",
          "description": "Açık adres."
         },
         "zipcode": {
          "type": "string",
          "description": "Posta kodu. En çok yirmi karakter."
         },
         "kind": {
          "type": "string",
          "description": "Kişi türü. Öntanımlı olarak bireysel."
         },
         "company": {
          "type": "object",
          "description": "Şirket bilgileri. Kurumsal kişide ad zorunludur."
         },
         "label": {
          "type": "string",
          "description": "Serbest etiket."
         },
         "phone": {
          "type": "string",
          "description": "Kişinin telefonu."
         },
         "identity": {
          "type": "string",
          "description": "Kimlik numarası."
         },
         "notifications": {
          "type": "object",
          "description": "Kanal matrisi. Tam değiştirmedir; hiç gönderilmezse hepsi açılır."
         },
         "is_default": {
          "type": "boolean",
          "description": "Bunu varsayılan profil yap."
         },
         "overwrite_invoices": {
          "type": "boolean",
          "description": "Açık faturaları bu adrese yeniden yaz."
         }
        },
        "required": [
         "address",
         "city",
         "country",
         "email",
         "name",
         "state",
         "surname",
         "zipcode"
        ]
       }
      }
     }
    }
   },
   "delete": {
    "tags": [
     "Account"
    ],
    "operationId": "coreDeleteAddress",
    "summary": "Delete address (path: {id})",
    "x-summary-tr": "Adresi Silme",
    "x-scope": "Addresses/DeleteAddress",
    "x-generated": "core-catalog",
    "description": "Delete address (path: {id}). \n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/adres-defteri).",
    "x-description-tr": "Adresi siler ve gerekiyorsa varsayılanı devreder. — anahtarın sahibi",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "description": "not_found",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      }
     }
    ]
   }
  },
  "/addresses/{id}/default": {
   "post": {
    "tags": [
     "Account"
    ],
    "operationId": "coreSetDefaultAddress",
    "summary": "Set default address (path: {id})",
    "x-summary-tr": "Varsayılanı Taşıma",
    "x-scope": "Addresses/SetDefaultAddress",
    "x-generated": "core-catalog",
    "description": "Set default address (path: {id}). \n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/adres-defteri).",
    "x-description-tr": "Bu adresi varsayılan fatura profili yapar. — hesabın ülkesi izler",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "description": "not_found",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      }
     }
    ]
   }
  },
  "/services": {
   "get": {
    "tags": [
     "Services (core)"
    ],
    "operationId": "coreGetServices",
    "summary": "List services",
    "x-summary-tr": "Hizmetleri Listeleme",
    "x-scope": "Services/GetServices",
    "x-generated": "core-catalog",
    "description": "List services. Service of the calling account (any product line).\n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/sahip-olunan-hizmetler).",
    "x-description-tr": "Hesabın sahip olduğu hizmetleri döndürür. — anahtarın sahibi",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "array",
           "items": {
            "type": "object",
            "additionalProperties": true
           }
          },
          "meta": {
           "$ref": "#/components/schemas/PageMeta"
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     }
    },
    "parameters": [
     {
      "name": "page",
      "in": "query",
      "schema": {
       "type": "integer"
      },
      "description": "Kaçıncı sayfa."
     },
     {
      "name": "limit",
      "in": "query",
      "schema": {
       "type": "integer"
      },
      "description": "Sayfa başına satır. En çok 100."
     },
     {
      "name": "status",
      "in": "query",
      "schema": {
       "type": "string"
      },
      "description": "Durum süzgeci. Rozet gruplarını alır: bekleyen hem kurulumdakini hem işlemdekini kapsar, iptal ise tamamlananı da içerir."
     },
     {
      "name": "type",
      "in": "query",
      "schema": {
       "type": "string"
      },
      "description": "Ürün türü süzgeci."
     },
     {
      "name": "search",
      "in": "query",
      "schema": {
       "type": "string"
      },
      "description": "Hizmet adında ve bağlı alan adında arar."
     }
    ]
   }
  },
  "/services/{id}": {
   "get": {
    "tags": [
     "Services (core)"
    ],
    "operationId": "coreGetService",
    "summary": "Get service (path: {id})",
    "x-summary-tr": "Hizmeti Okuma",
    "x-scope": "Services/GetService",
    "x-generated": "core-catalog",
    "description": "Get service (path: {id}). Service of the calling account (any product line).\n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/sahip-olunan-hizmetler).",
    "x-description-tr": "Hizmetin ayarlarını, erişim bilgilerini ve yenileme durumunu döndürür. — anahtarın sahibi",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "description": "not_found",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      }
     }
    ]
   },
   "patch": {
    "tags": [
     "Services (core)"
    ],
    "operationId": "coreUpdateService",
    "summary": "Update service (path: {id})",
    "x-summary-tr": "Hizmet Tercihlerini Değiştirme",
    "x-scope": "Services/UpdateService",
    "x-generated": "core-catalog",
    "description": "Update service (path: {id}). Service of the calling account (any product line).\n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/sahip-olunan-hizmetler).",
    "x-description-tr": "Otomatik yenilemeyi ve fatura profilini değiştirir. — iki alan",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "description": "not_found",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "description": "autorenew_locked, no_auto_pay_source, not_actionable, nothing_to_update",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      }
     }
    ],
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "auto_renew": {
          "type": "boolean",
          "description": "Hizmet bazlı otomatik yenileme. Hesap geneli otomatik ödeme açıkken değiştirilemez."
         },
         "billing_profile_id": {
          "type": "integer",
          "description": "Fatura profilinin numarası. Sıfır hesabın varsayılanına döner."
         }
        }
       }
      }
     }
    }
   }
  },
  "/services/{id}/renew": {
   "post": {
    "tags": [
     "Services (core)"
    ],
    "operationId": "coreRenewService",
    "summary": "Renew service (path: {id})",
    "x-summary-tr": "Yenileme Faturası Kesme",
    "x-scope": "Services/RenewService",
    "x-generated": "core-catalog",
    "description": "Renew service (path: {id}). Service of the calling account (any product line).\n\n**Spends money / creates an invoice.** Money rules apply (AK-40): `\"confirm\": true` in the body, an `Idempotency-Key` header, account balance only (no stored card), daily limit of paid API operations per account (default 50, operator can override per account/reseller, resets 00:00 Europe/Istanbul); violations answer 422 with `[confirm_required]`, `[idempotency_key_required]`, `[balance_only]` or `[daily_limit]` in the message. \n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/sahip-olunan-hizmetler).",
    "x-description-tr": "**Para harcar / fatura oluşturur.** Para kuralları (AK-40): gövdede `\"confirm\": true`, `Idempotency-Key` başlığı, yalnız bakiye (kayıtlı kart yok), hesap başına günlük ücretli işlem sınırı (varsayılan 50, hesap/bayi bazında değiştirilebilir, 00:00 TR'de sıfırlanır). Hizmet için bir yenileme faturası keser. — fatura üretir",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "description": "not_found",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "description": "already_invoiced, cycle_invalid, not_renewable, renew_blocked_subscription, renew_disabled",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      }
     },
     {
      "name": "Idempotency-Key",
      "in": "header",
      "required": true,
      "schema": {
       "type": "string",
       "minLength": 8,
       "maxLength": 191
      }
     }
    ],
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "cycle": {
          "type": "string",
          "description": "Yenileme döngüsü. Hizmet detayındaki döngü listesinden seçilir; verilmezse mevcut döngü kullanılır."
         }
        }
       }
      }
     }
    }
   }
  },
  "/services/{id}/invoices": {
   "get": {
    "tags": [
     "Services (core)"
    ],
    "operationId": "coreGetServiceInvoices",
    "summary": "List service invoices (path: {id})",
    "x-summary-tr": "Hizmetin Faturalarını Okuma",
    "x-scope": "Services/GetServiceInvoices",
    "x-generated": "core-catalog",
    "description": "List service invoices (path: {id}). Service of the calling account (any product line).\n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/sahip-olunan-hizmetler).",
    "x-description-tr": "Bu hizmeti faturalayan belgeleri döndürür. — anahtarın sahibi",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "array",
           "items": {
            "type": "object",
            "additionalProperties": true
           }
          },
          "meta": {
           "$ref": "#/components/schemas/PageMeta"
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "description": "not_found",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      }
     },
     {
      "name": "limit",
      "in": "query",
      "schema": {
       "type": "integer"
      },
      "description": "En çok satır. En çok 100."
     },
     {
      "$ref": "#/components/parameters/Page"
     }
    ]
   }
  },
  "/services/{id}/addons": {
   "get": {
    "tags": [
     "Services (core)"
    ],
    "operationId": "coreGetServiceAddons",
    "summary": "List service addons (path: {id})",
    "x-summary-tr": "Hizmet Eklentilerini Okuma",
    "x-scope": "Services/GetServiceAddons",
    "x-generated": "core-catalog",
    "description": "List service addons (path: {id}). Service of the calling account (any product line).\n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/sahip-olunan-hizmetler).",
    "x-description-tr": "Hizmete bağlı ek hizmetleri döndürür. — anahtarın sahibi",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "array",
           "items": {
            "type": "object",
            "additionalProperties": true
           }
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "description": "not_found",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      }
     }
    ]
   }
  },
  "/services/{id}/cancellation": {
   "post": {
    "tags": [
     "Services (core)"
    ],
    "operationId": "coreCreateCancellation",
    "summary": "Create cancellation (path: {id})",
    "x-summary-tr": "İptal Talebi Açma",
    "x-scope": "Services/CreateCancellation",
    "x-generated": "core-catalog",
    "description": "Create cancellation (path: {id}). Service of the calling account (any product line).\n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/sahip-olunan-hizmetler).",
    "x-description-tr": "Hizmetin iptali için bir talep açar. — aynı anda tek talep",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "description": "not_found",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "description": "cancellation_exists, not_actionable, one_time_service, reason_detail_required",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      }
     }
    ],
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "urgency": {
          "type": "string",
          "description": "Ne zaman iptal edilsin: hemen ya da dönem sonunda."
         },
         "reason": {
          "type": "string",
          "description": "Gerekçe. Beş değerden biri: gerek kalmadı, pahalı, başka yere geçiliyor, özellik eksik ya da diğer."
         },
         "reason_detail": {
          "type": "string",
          "description": "Serbest açıklama. Gerekçe diğer ise zorunludur."
         },
         "note": {
          "type": "string",
          "description": "Operatöre not."
         }
        },
        "required": [
         "reason",
         "urgency"
        ]
       }
      }
     }
    }
   },
   "delete": {
    "tags": [
     "Services (core)"
    ],
    "operationId": "coreRevokeCancellation",
    "summary": "Revoke cancellation (path: {id})",
    "x-summary-tr": "İptal Talebini Geri Çekme",
    "x-scope": "Services/RevokeCancellation",
    "x-generated": "core-catalog",
    "description": "Revoke cancellation (path: {id}). Service of the calling account (any product line).\n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/sahip-olunan-hizmetler).",
    "x-description-tr": "Açık bir iptal talebini geri çeker. — anahtarın sahibi",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "description": "not_found",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      }
     }
    ]
   }
  },
  "/services/{id}/metrics": {
   "get": {
    "tags": [
     "Services (core)"
    ],
    "operationId": "coreGetServiceMetrics",
    "summary": "Get service metrics (path: {id})",
    "x-summary-tr": "Ölçümleri Okuma",
    "x-scope": "Services/GetServiceMetrics",
    "x-generated": "core-catalog",
    "description": "Get service metrics (path: {id}). Service of the calling account (any product line).\n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/sahip-olunan-hizmetler).",
    "x-description-tr": "Kullanıma göre ücretlenen ölçümleri ve tahmini bedeli döndürür. — kullanıma göre ücret",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "description": "not_found",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      }
     }
    ]
   }
  },
  "/services/{id}/metrics/billing": {
   "get": {
    "tags": [
     "Services (core)"
    ],
    "operationId": "coreGetServiceMetricBilling",
    "summary": "List service metric billing (path: {id})",
    "x-summary-tr": "Kullanım Fatura Geçmişi",
    "x-scope": "Services/GetServiceMetricBilling",
    "x-generated": "core-catalog",
    "description": "List service metric billing (path: {id}). Service of the calling account (any product line).\n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/sahip-olunan-hizmetler).",
    "x-description-tr": "Ölçümlerin dönem dönem faturalanmış kullanımını döndürür. — anahtarın sahibi",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "array",
           "items": {
            "type": "object",
            "additionalProperties": true
           }
          },
          "meta": {
           "$ref": "#/components/schemas/PageMeta"
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "description": "not_found",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      }
     },
     {
      "name": "page",
      "in": "query",
      "schema": {
       "type": "integer"
      },
      "description": "Kaçıncı sayfa."
     },
     {
      "name": "limit",
      "in": "query",
      "schema": {
       "type": "integer"
      },
      "description": "Sayfa başına satır. En çok 100."
     },
     {
      "name": "metric",
      "in": "query",
      "schema": {
       "type": "string"
      },
      "description": "Tek bir ölçüme daraltır."
     }
    ]
   }
  },
  "/services/{id}/metrics/{key}": {
   "patch": {
    "tags": [
     "Services (core)"
    ],
    "operationId": "coreUpdateServiceMetric",
    "summary": "Update service metric (path: {id}, {key})",
    "x-summary-tr": "Ölçümü Açma ve Kapatma",
    "x-scope": "Services/UpdateServiceMetric",
    "x-generated": "core-catalog",
    "description": "Update service metric (path: {id}, {key}). Service of the calling account (any product line).\n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/sahip-olunan-hizmetler).",
    "x-description-tr": "Bir ölçümü açar ya da kapatır. — ödenmemiş fatura kilitler",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "description": "not_found",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "description": "enabled_invalid, metric_module_rejected, metric_not_priced, metric_unpaid_lock, not_actionable",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      }
     },
     {
      "name": "key",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      }
     }
    ],
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "enabled": {
          "type": "boolean",
          "description": "İstenen durum."
         }
        },
        "required": [
         "enabled"
        ]
       }
      }
     }
    }
   }
  },
  "/services/{id}/dashboard": {
   "get": {
    "tags": [
     "Services (core)"
    ],
    "operationId": "coreGetServiceDashboard",
    "summary": "Get service dashboard (path: {id})",
    "x-summary-tr": "Panel Özetini Okuma",
    "x-scope": "Services/GetServiceDashboard",
    "x-generated": "core-catalog",
    "description": "Get service dashboard (path: {id}). Service of the calling account (any product line).\n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/hizmetin-icine-erisim).",
    "x-description-tr": "Hizmetin arkasındaki panelin özetini ve yeteneklerini döndürür. — modüle canlı sorar",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "description": "not_found",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "description": "module_unavailable, not_actionable",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      }
     }
    ]
   }
  },
  "/services/{id}/tools": {
   "get": {
    "tags": [
     "Services (core)"
    ],
    "operationId": "coreGetServiceTools",
    "summary": "Get service tools (path: {id})",
    "x-summary-tr": "Araçları Listeleme",
    "x-scope": "Services/GetServiceTools",
    "x-generated": "core-catalog",
    "description": "Get service tools (path: {id}). Service of the calling account (any product line).\n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/hizmetin-icine-erisim).",
    "x-description-tr": "Hizmet üzerinde kullanılabilecek panel araçlarını döndürür. — modüle canlı sorar",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "description": "not_found",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "description": "tools_not_supported",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      }
     }
    ]
   }
  },
  "/services/{id}/tools/{tool}": {
   "get": {
    "tags": [
     "Services (core)"
    ],
    "operationId": "coreGetServiceToolData",
    "summary": "Get service tool data (path: {id}, {tool})",
    "x-summary-tr": "Araç Verisini Okuma",
    "x-scope": "Services/GetServiceToolData",
    "x-generated": "core-catalog",
    "description": "Get service tool data (path: {id}, {tool}). Service of the calling account (any product line).\n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/hizmetin-icine-erisim).",
    "x-description-tr": "Bir aracın listelediği veriyi panelden çeker. — modüle canlı sorar",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "description": "not_found",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "description": "tool_rejected, tools_not_supported",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "500": {
      "description": "tool_data_failed",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      }
     },
     {
      "name": "tool",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      }
     },
     {
      "name": "action",
      "in": "query",
      "schema": {
       "type": "string"
      },
      "description": "Okuma eylemi. Verilmezse aracın varsayılan listesi alınır."
     }
    ]
   }
  },
  "/services/{id}/tools/{tool}/{action}": {
   "post": {
    "tags": [
     "Services (core)"
    ],
    "operationId": "coreRunServiceToolAction",
    "summary": "Run service tool action (path: {id}, {tool}, {action})",
    "x-summary-tr": "Araç Eylemi Çalıştırma",
    "x-scope": "Services/RunServiceToolAction",
    "x-generated": "core-catalog",
    "description": "Run service tool action (path: {id}, {tool}, {action}). Service of the calling account (any product line).\n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/hizmetin-icine-erisim).",
    "x-description-tr": "Bir araç üzerinde oluşturma, düzenleme ya da silme çalıştırır. DNS kaydı düzenlemesi (`dns-zone-editor/edit`) yalnız gönderdiğinizi değiştirir: gönderilmeyen ad, TTL ya da öncelik kaydın mevcut değerini korur. — sunucuda değişiklik",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "description": "not_found",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "description": "tool_action_failed, tool_rejected, tools_not_supported",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "500": {
      "description": "tool_action_failed",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      }
     },
     {
      "name": "tool",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      }
     },
     {
      "name": "action",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      }
     }
    ],
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "current_path": {
          "type": "string",
          "description": ""
         },
         "file": {
          "type": "string",
          "description": ""
         },
         "name": {
          "type": "string",
          "description": ""
         },
         "new_name": {
          "type": "string",
          "description": ""
         },
         "items": {
          "type": "string",
          "description": ""
         }
        }
       }
      }
     }
    }
   }
  },
  "/services/{id}/module-method": {
   "post": {
    "tags": [
     "Services (core)"
    ],
    "operationId": "coreUseServiceModuleMethod",
    "summary": "Use service module method (path: {id})",
    "x-summary-tr": "Modül Metodu Çalıştırma",
    "x-scope": "Services/UseServiceModuleMethod",
    "x-generated": "core-catalog",
    "description": "Use service module method (path: {id}). Service of the calling account (any product line).\n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/hizmetin-icine-erisim).",
    "x-description-tr": "Modülün müşteriye açtığı bir metodu çalıştırır. — beyanlı metotlar",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "description": "not_found",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "description": "invalid_method, method_required, module_unavailable, tool_rejected",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "500": {
      "description": "module_method_failed",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      }
     }
    ],
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "method": {
          "type": "string",
          "description": "Çalıştırılacak metot. Panel özetindeki metot listesinden alınır."
         }
        },
        "required": [
         "method"
        ]
       }
      }
     }
    }
   }
  },
  "/services/{id}/sso": {
   "post": {
    "tags": [
     "Services (core)"
    ],
    "operationId": "coreGetServiceSso",
    "summary": "Get service sso (path: {id})",
    "x-summary-tr": "Panele Tek Oturum Açma",
    "x-scope": "Services/GetServiceSso",
    "x-generated": "core-catalog",
    "description": "Get service sso (path: {id}). Service of the calling account (any product line).\n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/hizmetin-icine-erisim).",
    "x-description-tr": "Panele parolasız giriş için tek kullanımlık bir adres üretir. — kısa ömürlü adres",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "description": "not_found",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "description": "sso_not_supported, tool_rejected",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "500": {
      "description": "sso_failed",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      }
     }
    ]
   }
  },
  "/services/{id}/password": {
   "post": {
    "tags": [
     "Services (core)"
    ],
    "operationId": "coreChangeServicePassword",
    "summary": "Change service password (path: {id})",
    "x-summary-tr": "Panel Parolasını Değiştirme",
    "x-scope": "Services/ChangeServicePassword",
    "x-generated": "core-catalog",
    "description": "Change service password (path: {id}). Service of the calling account (any product line).\n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/hizmetin-icine-erisim).",
    "x-description-tr": "Hizmetin panel parolasını değiştirir. — barındırma ve sunucu",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "description": "not_found",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "description": "password_change_failed, password_not_supported, password_too_short",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      }
     }
    ],
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "password": {
          "type": "string",
          "description": "Yeni panel parolası. Operatörün asgari uzunluğunu karşılamalıdır."
         }
        },
        "required": [
         "password"
        ]
       }
      }
     }
    }
   }
  },
  "/domains/tlds": {
   "get": {
    "tags": [
     "Domains and DNS"
    ],
    "operationId": "coreGetTlds",
    "summary": "List tlds",
    "x-summary-tr": "Uzantı Fiyatlarını Okuma",
    "x-scope": "Domains/GetTlds",
    "x-generated": "core-catalog",
    "description": "List tlds. Domain operations run against the registrar module of the domain.\n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/alan-adi-edinme).",
    "x-description-tr": "Satıştaki uzantıları süreleri ve fiyatlarıyla döndürür. — cüzdan para birimi",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "array",
           "items": {
            "type": "object",
            "additionalProperties": true
           }
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "description": "not_found",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "description": "domains_not_offered",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "parameters": [
     {
      "name": "tld",
      "in": "query",
      "schema": {
       "type": "string"
      },
      "description": "Tek bir uzantı. Listeyi daraltır ve süre başına fiyat tablosunu ekler."
     }
    ]
   }
  },
  "/domains/check": {
   "post": {
    "tags": [
     "Domains and DNS"
    ],
    "operationId": "coreCheckDomain",
    "summary": "Check domain",
    "x-summary-tr": "Alan Adının Boş Olup Olmadığını Sorma",
    "x-scope": "Domains/CheckDomain",
    "x-generated": "core-catalog",
    "description": "Check domain. Domain operations run against the registrar module of the domain.\n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/alan-adi-edinme).",
    "x-description-tr": "Bir alan adının alınabilirliğini canlı sorar. — kayıt kuruluşuna sorar",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "422": {
      "description": "domain_check_throttled, domain_invalid, domain_required, domains_not_offered, tld_not_offered",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "domain": {
          "type": "string",
          "description": "Sorulacak tam alan adı."
         }
        },
        "required": [
         "domain"
        ]
       }
      }
     }
    }
   }
  },
  "/domains/register": {
   "post": {
    "tags": [
     "Domains and DNS"
    ],
    "operationId": "coreRegisterDomain",
    "summary": "Register domain",
    "x-summary-tr": "Alan Adı Kaydetme",
    "x-scope": "Domains/RegisterDomain",
    "x-generated": "core-catalog",
    "description": "Register domain. Domain operations run against the registrar module of the domain.\n\n**Spends money / creates an invoice.** Money rules apply (AK-40): `\"confirm\": true` in the body, an `Idempotency-Key` header, account balance only (no stored card), daily limit of paid API operations per account (default 50, operator can override per account/reseller, resets 00:00 Europe/Istanbul); violations answer 422 with `[confirm_required]`, `[idempotency_key_required]`, `[balance_only]` or `[daily_limit]` in the message. \n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/alan-adi-edinme).",
    "x-description-tr": "**Para harcar / fatura oluşturur.** Para kuralları (AK-40): gövdede `\"confirm\": true`, `Idempotency-Key` başlığı, yalnız bakiye (kayıtlı kart yok), hesap başına günlük ücretli işlem sınırı (varsayılan 50, hesap/bayi bazında değiştirilebilir, 00:00 TR'de sıfırlanır). Yeni bir alan adı sipariş eder ve tahsil eder. — bakiye ya da kayıtlı kart",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "description": "not_found",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "description": "addon_not_offered, contact_field_invalid, contact_field_required, domains_not_offered, insufficient_balance, nameservers_invalid, terms_required, tld_not_offered, verification_required, years_invalid",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "terms": {
          "type": "boolean",
          "description": "Şartların kabulü. Doğru gönderilmelidir."
         },
         "domain": {
          "type": "string",
          "description": "Tam alan adı."
         },
         "years": {
          "type": "integer",
          "description": "Kayıt süresi. Uzantının penceresi içinde olmalı; özel fiyatlı adlar ne gönderilirse gönderilsin bir yıl kaydedilir."
         },
         "accept_premium": {
          "type": "boolean",
          "description": "Özel fiyatlı adın fiyatını kabul. Böyle bir adda zorunludur."
         },
         "addons": {
          "type": "string",
          "description": "Birlikte alınacak ek hizmetler. Alan adı yönetimi, kayıt gizliliği ve yönlendirme; yalnız uzantı sunuyorsa."
         },
         "nameservers": {
          "type": "string",
          "description": "Ad sunucuları. İkiden dörde; verilmezse hesabın varsayılanları uygulanır."
         },
         "whois_profile_id": {
          "type": "integer",
          "description": "Kayıtlı kayıt sahibi profili. Dört rolü birden doldurur."
         },
         "contacts": {
          "type": "object",
          "description": "Rol bazında kişiler. Her rol ya kayıtlı bir profil numarası ya da satır içi bir kişi taşır ve o rol için profili ezer."
         },
         "coupons": {
          "type": "string",
          "description": "Kupon kodları."
         },
         "billing_profile_id": {
          "type": "integer",
          "description": "Fatura profilinin numarası."
         },
         "notes": {
          "type": "string",
          "description": "Sipariş notu."
         },
         "payment": {
          "type": "object",
          "description": "Ödeme kaynağı. Hesap bakiyesi ya da kayıtlı kart."
         },
         "auth_code": {
          "type": "string",
          "description": ""
         },
         "method": {
          "type": "string",
          "description": ""
         },
         "card_id": {
          "type": "string",
          "description": ""
         }
        },
        "required": [
         "domain",
         "terms"
        ]
       }
      }
     }
    },
    "parameters": [
     {
      "name": "Idempotency-Key",
      "in": "header",
      "required": true,
      "schema": {
       "type": "string",
       "minLength": 8,
       "maxLength": 191
      }
     }
    ]
   }
  },
  "/domains/transfer": {
   "post": {
    "tags": [
     "Domains and DNS"
    ],
    "operationId": "coreTransferDomain",
    "summary": "Transfer domain",
    "x-summary-tr": "Alan Adı Transferi",
    "x-scope": "Domains/TransferDomain",
    "x-generated": "core-catalog",
    "description": "Transfer domain. Domain operations run against the registrar module of the domain.\n\n**Spends money / creates an invoice.** Money rules apply (AK-40): `\"confirm\": true` in the body, an `Idempotency-Key` header, account balance only (no stored card), daily limit of paid API operations per account (default 50, operator can override per account/reseller, resets 00:00 Europe/Istanbul); violations answer 422 with `[confirm_required]`, `[idempotency_key_required]`, `[balance_only]` or `[daily_limit]` in the message. \n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/alan-adi-edinme).",
    "x-description-tr": "**Para harcar / fatura oluşturur.** Para kuralları (AK-40): gövdede `\"confirm\": true`, `Idempotency-Key` başlığı, yalnız bakiye (kayıtlı kart yok), hesap başına günlük ücretli işlem sınırı (varsayılan 50, hesap/bayi bazında değiştirilebilir, 00:00 TR'de sıfırlanır). Başka bir sağlayıcıdaki alan adını buraya taşır. — kod gerekebilir",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "422": {
      "description": "auth_code_required, checkout_blocked, domain_not_registered, domain_transfer_locked, domains_not_offered, terms_required, transfer_not_offered",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "terms": {
          "type": "boolean",
          "description": "Şartların kabulü. Doğru gönderilmelidir."
         },
         "domain": {
          "type": "string",
          "description": "Tam alan adı."
         },
         "auth_code": {
          "type": "string",
          "description": "Mevcut sağlayıcıdan alınan transfer kodu. Uzantı işaretliyse zorunludur ve her durumda hizmete yazılır."
         },
         "addons": {
          "type": "string",
          "description": "Birlikte alınacak ek hizmetler. Alan adı yönetimi, kayıt gizliliği ve yönlendirme; yalnız uzantı sunuyorsa."
         },
         "nameservers": {
          "type": "string",
          "description": "Ad sunucuları. İkiden dörde; verilmezse hesabın varsayılanları uygulanır."
         },
         "whois_profile_id": {
          "type": "integer",
          "description": "Kayıtlı kayıt sahibi profili. Dört rolü birden doldurur."
         },
         "contacts": {
          "type": "object",
          "description": "Rol bazında kişiler. Her rol ya kayıtlı bir profil numarası ya da satır içi bir kişi taşır ve o rol için profili ezer."
         },
         "coupons": {
          "type": "string",
          "description": "Kupon kodları."
         },
         "billing_profile_id": {
          "type": "integer",
          "description": "Fatura profilinin numarası."
         },
         "notes": {
          "type": "string",
          "description": "Sipariş notu."
         },
         "payment": {
          "type": "object",
          "description": "Ödeme kaynağı. Hesap bakiyesi ya da kayıtlı kart."
         },
         "years": {
          "type": "string",
          "description": ""
         },
         "accept_premium": {
          "type": "string",
          "description": ""
         },
         "method": {
          "type": "string",
          "description": ""
         },
         "card_id": {
          "type": "string",
          "description": ""
         }
        },
        "required": [
         "domain",
         "terms"
        ]
       }
      }
     }
    },
    "parameters": [
     {
      "name": "Idempotency-Key",
      "in": "header",
      "required": true,
      "schema": {
       "type": "string",
       "minLength": 8,
       "maxLength": 191
      }
     }
    ]
   }
  },
  "/domains/whois-profiles": {
   "get": {
    "tags": [
     "Domains and DNS"
    ],
    "operationId": "coreGetWhoisProfiles",
    "summary": "List whois profiles",
    "x-summary-tr": "Kayıtlı Profilleri Listeleme",
    "x-scope": "Domains/GetWhoisProfiles",
    "x-generated": "core-catalog",
    "description": "List whois profiles. Domain operations run against the registrar module of the domain.\n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/alan-adi-kisileri-ve-gizlilik).",
    "x-description-tr": "Hesabın kayıtlı kişi profillerini döndürür. — hesap geneli",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "array",
           "items": {
            "type": "object",
            "additionalProperties": true
           }
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     }
    }
   },
   "post": {
    "tags": [
     "Domains and DNS"
    ],
    "operationId": "coreCreateWhoisProfile",
    "summary": "Create whois profile",
    "x-summary-tr": "Profil Oluşturma",
    "x-scope": "Domains/CreateWhoisProfile",
    "x-generated": "core-catalog",
    "description": "Create whois profile. Domain operations run against the registrar module of the domain.\n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/alan-adi-kisileri-ve-gizlilik).",
    "x-description-tr": "Yeniden kullanılabilir bir kişi profili kaydeder. — hesap geneli",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "422": {
      "description": "contact_email_invalid, contact_field_invalid, contact_field_required, contact_name_required, name_required, profile_rejected",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "500": {
      "description": "profile_failed",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "name": {
          "type": "string",
          "description": "Profilin etiketi."
         },
         "contact": {
          "type": "object",
          "description": "contactKaydedilecek kişi. İl burada zorunlu değildir."
         },
         "first_name": {
          "type": "string",
          "description": "Kişinin adı."
         },
         "last_name": {
          "type": "string",
          "description": "Kişinin soyadı."
         },
         "company": {
          "type": "string",
          "description": "Kurum adı. Tek isteğe bağlı alandır."
         },
         "email": {
          "type": "string",
          "description": "Geçerli bir e-posta."
         },
         "phone": {
          "type": "string",
          "description": "Telefon."
         },
         "address": {
          "type": "string",
          "description": "Adres satırı."
         },
         "address2": {
          "type": "string",
          "description": "İkinci adres satırı. İsteğe bağlı; anahtar yoksa boş satır kaydedilir."
         },
         "city": {
          "type": "string",
          "description": "Şehir."
         },
         "state": {
          "type": "string",
          "description": "İl ya da eyalet. Alan adı kişilerinde zorunludur, kayıtlı profillerde değildir."
         },
         "zip": {
          "type": "string",
          "description": "Posta kodu."
         },
         "country": {
          "type": "string",
          "description": "Ülke kodu. Büyük harfe çevrilir."
         },
         "postal_code": {
          "type": "string",
          "description": ""
         }
        },
        "required": [
         "address",
         "city",
         "contact",
         "country",
         "email",
         "first_name",
         "last_name",
         "name",
         "phone",
         "zip"
        ]
       }
      }
     }
    }
   }
  },
  "/domains/whois-profiles/{pid}": {
   "put": {
    "tags": [
     "Domains and DNS"
    ],
    "operationId": "coreUpdateWhoisProfile",
    "summary": "Update whois profile (path: {pid})",
    "x-summary-tr": "Profili Güncelleme",
    "x-scope": "Domains/UpdateWhoisProfile",
    "x-generated": "core-catalog",
    "description": "Update whois profile (path: {pid}). Domain operations run against the registrar module of the domain.\n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/alan-adi-kisileri-ve-gizlilik).",
    "x-description-tr": "Kayıtlı bir profili yeniden yazar. — tam kişi",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "description": "not_found",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "description": "contact_email_invalid, contact_field_invalid, contact_field_required, contact_name_required, name_required, profile_rejected",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "parameters": [
     {
      "name": "pid",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      }
     }
    ],
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "name": {
          "type": "string",
          "description": "Yeni etiket."
         },
         "contact": {
          "type": "object",
          "description": "contactTam kişi. Kayıtlı kişi bütünüyle değiştirilir."
         },
         "first_name": {
          "type": "string",
          "description": "Kişinin adı."
         },
         "last_name": {
          "type": "string",
          "description": "Kişinin soyadı."
         },
         "company": {
          "type": "string",
          "description": "Kurum adı. Tek isteğe bağlı alandır."
         },
         "email": {
          "type": "string",
          "description": "Geçerli bir e-posta."
         },
         "phone": {
          "type": "string",
          "description": "Telefon."
         },
         "address": {
          "type": "string",
          "description": "Adres satırı."
         },
         "address2": {
          "type": "string",
          "description": "İkinci adres satırı. Profil bütün olarak değiştirilir; anahtar yoksa boş satır kaydedilir."
         },
         "city": {
          "type": "string",
          "description": "Şehir."
         },
         "state": {
          "type": "string",
          "description": "İl ya da eyalet. Alan adı kişilerinde zorunludur, kayıtlı profillerde değildir."
         },
         "zip": {
          "type": "string",
          "description": "Posta kodu."
         },
         "country": {
          "type": "string",
          "description": "Ülke kodu. Büyük harfe çevrilir."
         },
         "postal_code": {
          "type": "string",
          "description": ""
         }
        },
        "required": [
         "address",
         "city",
         "contact",
         "country",
         "email",
         "first_name",
         "last_name",
         "name",
         "phone",
         "zip"
        ]
       }
      }
     }
    }
   },
   "delete": {
    "tags": [
     "Domains and DNS"
    ],
    "operationId": "coreDeleteWhoisProfile",
    "summary": "Delete whois profile (path: {pid})",
    "x-summary-tr": "Profili Silme",
    "x-scope": "Domains/DeleteWhoisProfile",
    "x-generated": "core-catalog",
    "description": "Delete whois profile (path: {pid}). Domain operations run against the registrar module of the domain.\n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/alan-adi-kisileri-ve-gizlilik).",
    "x-description-tr": "Kayıtlı bir kişi profilini siler. — hesap geneli",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "description": "not_found",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "parameters": [
     {
      "name": "pid",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      }
     }
    ]
   }
  },
  "/domains/whois-profiles/{pid}/default": {
   "post": {
    "tags": [
     "Domains and DNS"
    ],
    "operationId": "coreSetDefaultWhoisProfile",
    "summary": "Set default whois profile (path: {pid})",
    "x-summary-tr": "Profili Varsayılan Yapma",
    "x-scope": "Domains/SetDefaultWhoisProfile",
    "x-generated": "core-catalog",
    "description": "Set default whois profile (path: {pid}). Domain operations run against the registrar module of the domain.\n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/alan-adi-kisileri-ve-gizlilik).",
    "x-description-tr": "Yeni kayıtlarda kendiliğinden uygulanacak profili belirler. — hesap geneli",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "description": "not_found",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "parameters": [
     {
      "name": "pid",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      }
     }
    ]
   }
  },
  "/domains/default-nameservers": {
   "get": {
    "tags": [
     "Domains and DNS"
    ],
    "operationId": "coreGetDefaultNameservers",
    "summary": "Get default nameservers",
    "x-summary-tr": "Varsayılan Ad Sunucularını Okuma",
    "x-scope": "Domains/GetDefaultNameservers",
    "x-generated": "core-catalog",
    "description": "Get default nameservers. Domain operations run against the registrar module of the domain.\n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/ad-sunuculari-ve-kayitlar).",
    "x-description-tr": "Hesabın yeni alan adlarına uygulanan varsayılan setini döndürür. — hesap geneli",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     }
    }
   },
   "put": {
    "tags": [
     "Domains and DNS"
    ],
    "operationId": "coreUpdateDefaultNameservers",
    "summary": "Update default nameservers",
    "x-summary-tr": "Varsayılan Ad Sunucularını Kaydetme",
    "x-scope": "Domains/UpdateDefaultNameservers",
    "x-generated": "core-catalog",
    "description": "Update default nameservers. Domain operations run against the registrar module of the domain.\n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/ad-sunuculari-ve-kayitlar).",
    "x-description-tr": "Yeni alan adlarına uygulanacak varsayılan seti kaydeder. — hesap geneli",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "422": {
      "description": "nameservers_invalid",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "nameservers": {
          "type": "string",
          "description": "Varsayılan set. İkiden dörde kadar geçerli sunucu adı; boşluklar kırpılır ve küçük harfe çevrilir."
         }
        },
        "required": [
         "nameservers"
        ]
       }
      }
     }
    }
   }
  },
  "/domains": {
   "get": {
    "tags": [
     "Domains and DNS"
    ],
    "operationId": "coreGetDomains",
    "summary": "List domains",
    "x-summary-tr": "Alan Adlarını Listeleme",
    "x-scope": "Domains/GetDomains",
    "x-generated": "core-catalog",
    "description": "List domains. Domain operations run against the registrar module of the domain.\n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/sahip-olunan-alan-adlari).",
    "x-description-tr": "Hesabın alan adlarını döndürür. — anahtarın sahibi",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "array",
           "items": {
            "type": "object",
            "additionalProperties": true
           }
          },
          "meta": {
           "$ref": "#/components/schemas/PageMeta"
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     }
    },
    "parameters": [
     {
      "name": "page",
      "in": "query",
      "schema": {
       "type": "integer"
      },
      "description": "Kaçıncı sayfa."
     },
     {
      "name": "limit",
      "in": "query",
      "schema": {
       "type": "integer"
      },
      "description": "Sayfa başına satır. En çok 100."
     },
     {
      "name": "status",
      "in": "query",
      "schema": {
       "type": "string"
      },
      "description": "Durum süzgeci. Rozet gruplarını alır."
     },
     {
      "name": "tld",
      "in": "query",
      "schema": {
       "type": "string"
      },
      "description": "Yalnız bu uzantının alan adları."
     },
     {
      "name": "search",
      "in": "query",
      "schema": {
       "type": "string"
      },
      "description": "Alan adında arar."
     }
    ]
   }
  },
  "/domains/{domain}": {
   "get": {
    "tags": [
     "Domains and DNS"
    ],
    "operationId": "coreGetDomain",
    "summary": "Get domain (path: {domain})",
    "x-summary-tr": "Alan Adını Okuma",
    "x-scope": "Domains/GetDomain",
    "x-generated": "core-catalog",
    "description": "Get domain (path: {domain}). Domain operations run against the registrar module of the domain.\n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/sahip-olunan-alan-adlari).",
    "x-description-tr": "Alan adını, sağlayıcının yeteneklerini ve yenileme seçeneklerini döndürür. — yetenek sondası",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "description": "not_found",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "parameters": [
     {
      "name": "domain",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      }
     }
    ]
   },
   "patch": {
    "tags": [
     "Domains and DNS"
    ],
    "operationId": "coreUpdateDomain",
    "summary": "Update domain (path: {domain})",
    "x-summary-tr": "Alan Adı Tercihlerini Değiştirme",
    "x-scope": "Domains/UpdateDomain",
    "x-generated": "core-catalog",
    "description": "Update domain (path: {domain}). Domain operations run against the registrar module of the domain.\n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/sahip-olunan-alan-adlari).",
    "x-description-tr": "Otomatik yenilemeyi ve fatura profilini değiştirir. — iki alan",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "description": "not_found",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "description": "auto_renew_invalid, autorenew_locked, billing_profile_rejected, no_auto_pay_source, not_actionable, nothing_to_update",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "parameters": [
     {
      "name": "domain",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      }
     }
    ],
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "auto_renew": {
          "type": "boolean",
          "description": "Alan adı bazlı otomatik yenileme. Yalnız etkin alan adlarında ve gerçek bir mantıksal değerle."
         },
         "billing_profile_id": {
          "type": "integer",
          "description": "Fatura profilinin numarası. Sıfır hesabın varsayılanına döner."
         }
        }
       }
      }
     }
    }
   }
  },
  "/domains/{domain}/renew": {
   "post": {
    "tags": [
     "Domains and DNS"
    ],
    "operationId": "coreRenewDomain",
    "summary": "Renew domain (path: {domain})",
    "x-summary-tr": "Yenileme Faturası Kesme",
    "x-scope": "Domains/RenewDomain",
    "x-generated": "core-catalog",
    "description": "Renew domain (path: {domain}). Domain operations run against the registrar module of the domain.\n\n**Spends money / creates an invoice.** Money rules apply (AK-40): `\"confirm\": true` in the body, an `Idempotency-Key` header, account balance only (no stored card), daily limit of paid API operations per account (default 50, operator can override per account/reseller, resets 00:00 Europe/Istanbul); violations answer 422 with `[confirm_required]`, `[idempotency_key_required]`, `[balance_only]` or `[daily_limit]` in the message. \n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/sahip-olunan-alan-adlari).",
    "x-description-tr": "**Para harcar / fatura oluşturur.** Para kuralları (AK-40): gövdede `\"confirm\": true`, `Idempotency-Key` başlığı, yalnız bakiye (kayıtlı kart yok), hesap başına günlük ücretli işlem sınırı (varsayılan 50, hesap/bayi bazında değiştirilebilir, 00:00 TR'de sıfırlanır). Alan adı için istenen yıl sayısı kadar yenileme faturası keser. — fatura üretir",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "description": "not_found",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "description": "not_renewable, years_invalid",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "parameters": [
     {
      "name": "domain",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      }
     },
     {
      "name": "Idempotency-Key",
      "in": "header",
      "required": true,
      "schema": {
       "type": "string",
       "minLength": 8,
       "maxLength": 191
      }
     }
    ],
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "years": {
          "type": "integer",
          "description": "Yenileme süresi. Detaydaki fiyatlı süre satırlarından biri olmalıdır."
         }
        },
        "required": [
         "years"
        ]
       }
      }
     }
    }
   }
  },
  "/domains/{domain}/transfer-status": {
   "get": {
    "tags": [
     "Domains and DNS"
    ],
    "operationId": "coreGetTransferStatus",
    "summary": "Get transfer status (path: {domain})",
    "x-summary-tr": "Transferin Nerede Olduğunu Sorma",
    "x-scope": "Domains/GetTransferStatus",
    "x-generated": "core-catalog",
    "description": "Get transfer status (path: {domain}). Domain operations run against the registrar module of the domain.\n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/alan-adi-edinme).",
    "x-description-tr": "Devam eden bir transferin durumunu sağlayıcıdan okur. — canlı sorar",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "description": "not_found",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "description": "not_a_transfer",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "parameters": [
     {
      "name": "domain",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      }
     }
    ]
   }
  },
  "/domains/{domain}/nameservers": {
   "get": {
    "tags": [
     "Domains and DNS"
    ],
    "operationId": "coreGetNameservers",
    "summary": "Get nameservers (path: {domain})",
    "x-summary-tr": "Ad Sunucularını Okuma",
    "x-scope": "Domains/GetNameservers",
    "x-generated": "core-catalog",
    "description": "Get nameservers (path: {domain}). Domain operations run against the registrar module of the domain.\n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/ad-sunuculari-ve-kayitlar).",
    "x-description-tr": "Alan adının ad sunucularını ve hesabın varsayılan setini döndürür. — anahtarın sahibi",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "description": "not_found",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "parameters": [
     {
      "name": "domain",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      }
     }
    ]
   },
   "put": {
    "tags": [
     "Domains and DNS"
    ],
    "operationId": "coreUpdateNameservers",
    "summary": "Update nameservers (path: {domain})",
    "x-summary-tr": "Ad Sunucularını Değiştirme",
    "x-scope": "Domains/UpdateNameservers",
    "x-generated": "core-catalog",
    "description": "Update nameservers (path: {domain}). Domain operations run against the registrar module of the domain.\n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/ad-sunuculari-ve-kayitlar).",
    "x-description-tr": "Alan adının ad sunucularını sağlayıcıda değiştirir. — siteyi taşır",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "description": "not_found",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "description": "nameservers_failed, nameservers_invalid, nameservers_not_supported, nameservers_rejected, not_actionable",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "500": {
      "description": "nameservers_failed",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "parameters": [
     {
      "name": "domain",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      }
     }
    ],
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "nameservers": {
          "type": "string",
          "description": "Yeni set. İkiden dörde kadar geçerli sunucu adı; boş girişler sayımdan önce düşer."
         }
        },
        "required": [
         "nameservers"
        ]
       }
      }
     }
    }
   }
  },
  "/domains/{domain}/child-nameservers": {
   "get": {
    "tags": [
     "Domains and DNS"
    ],
    "operationId": "coreGetChildNameservers",
    "summary": "Get child nameservers (path: {domain})",
    "x-summary-tr": "Kendi Ad Sunucularını Listeleme",
    "x-scope": "Domains/GetChildNameservers",
    "x-generated": "core-catalog",
    "description": "Get child nameservers (path: {domain}). Domain operations run against the registrar module of the domain.\n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/ad-sunuculari-ve-kayitlar).",
    "x-description-tr": "Alan adının altında tanımlı ad sunucularını döndürür. — sağlayıcıdan okur",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "description": "not_found",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "description": "child_ns_failed, child_ns_not_supported",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "500": {
      "description": "child_ns_failed",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "parameters": [
     {
      "name": "domain",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      }
     }
    ]
   },
   "post": {
    "tags": [
     "Domains and DNS"
    ],
    "operationId": "coreCreateChildNameserver",
    "summary": "Create child nameserver (path: {domain})",
    "x-summary-tr": "Kendi Ad Sunucusunu Tanımlama",
    "x-scope": "Domains/CreateChildNameserver",
    "x-generated": "core-catalog",
    "description": "Create child nameserver (path: {domain}). Domain operations run against the registrar module of the domain.\n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/ad-sunuculari-ve-kayitlar).",
    "x-description-tr": "Alan adının altında bir ad sunucusu tanımlar. — sicile yazar",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "description": "not_found",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "description": "child_ns_failed, child_ns_fields, child_ns_host_invalid, child_ns_ip_invalid, child_ns_not_supported, child_ns_rejected, not_actionable",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "500": {
      "description": "child_ns_failed",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "parameters": [
     {
      "name": "domain",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      }
     }
    ],
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "host": {
          "type": "string",
          "description": "Sunucunun tam adı. Küçük harfe çevrilir."
         },
         "ip": {
          "type": "string",
          "description": "Sunucunun adresi. Biçimi doğrulanır."
         },
         "ns": {
          "type": "string",
          "description": ""
         }
        },
        "required": [
         "host",
         "ip"
        ]
       }
      }
     }
    }
   },
   "delete": {
    "tags": [
     "Domains and DNS"
    ],
    "operationId": "coreDeleteChildNameserver",
    "summary": "Delete child nameserver (path: {domain})",
    "x-summary-tr": "Kendi Ad Sunucusunu Kaldırma",
    "x-scope": "Domains/DeleteChildNameserver",
    "x-generated": "core-catalog",
    "description": "Delete child nameserver (path: {domain}). Domain operations run against the registrar module of the domain.\n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/ad-sunuculari-ve-kayitlar).",
    "x-description-tr": "Alan adının altındaki bir ad sunucusu tanımını kaldırır. — sicile yazar",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "description": "not_found",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "description": "child_ns_failed, child_ns_fields, child_ns_not_supported, child_ns_rejected, not_actionable",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "500": {
      "description": "child_ns_failed",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "parameters": [
     {
      "name": "domain",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      }
     }
    ]
   }
  },
  "/domains/{domain}/transfer-lock": {
   "get": {
    "tags": [
     "Domains and DNS"
    ],
    "operationId": "coreGetTransferLock",
    "summary": "Get transfer lock (path: {domain})",
    "x-summary-tr": "Transfer Kilidini Okuma",
    "x-scope": "Domains/GetTransferLock",
    "x-generated": "core-catalog",
    "description": "Get transfer lock (path: {domain}). Domain operations run against the registrar module of the domain.\n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/alan-adi-edinme).",
    "x-description-tr": "Alan adının transfere kapalı olup olmadığını sağlayıcıdan okur. — canlı okur",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "description": "not_found",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "parameters": [
     {
      "name": "domain",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      }
     }
    ]
   },
   "put": {
    "tags": [
     "Domains and DNS"
    ],
    "operationId": "coreUpdateTransferLock",
    "summary": "Update transfer lock (path: {domain})",
    "x-summary-tr": "Transfer Kilidini Değiştirme",
    "x-scope": "Domains/UpdateTransferLock",
    "x-generated": "core-catalog",
    "description": "Update transfer lock (path: {domain}). Domain operations run against the registrar module of the domain.\n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/alan-adi-edinme).",
    "x-description-tr": "Alan adını transfere kapatır ya da açar. — sağlayıcıya yazar",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "description": "not_found",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "description": "lock_failed, lock_not_supported, lock_rejected, locked_invalid, not_actionable",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "500": {
      "description": "lock_failed",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "parameters": [
     {
      "name": "domain",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      }
     }
    ],
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "locked": {
          "type": "boolean",
          "description": "Yeni kilit durumu. Gerçek bir mantıksal değer olmalıdır; metin ve sayı reddedilir."
         }
        },
        "required": [
         "locked"
        ]
       }
      }
     }
    }
   }
  },
  "/domains/{domain}/auth-code": {
   "post": {
    "tags": [
     "Domains and DNS"
    ],
    "operationId": "coreSendAuthCode",
    "summary": "Send auth code (path: {domain})",
    "x-summary-tr": "Transfer Kodunu İsteme",
    "x-scope": "Domains/SendAuthCode",
    "x-generated": "core-catalog",
    "description": "Send auth code (path: {domain}). Domain operations run against the registrar module of the domain.\n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/alan-adi-edinme).",
    "x-description-tr": "Transfer kodunu alan adı sahibinin e-postasına gönderir. — yanıtta kod yok",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "description": "not_found",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "description": "auth_code_failed, auth_code_not_supported, auth_code_rejected, not_actionable",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "500": {
      "description": "auth_code_failed",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "parameters": [
     {
      "name": "domain",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      }
     }
    ]
   },
   "put": {
    "tags": [
     "Domains and DNS"
    ],
    "operationId": "coreSaveAuthCode",
    "summary": "Save auth code (path: {domain})",
    "x-summary-tr": "Gelen Transfer Kodunu Kaydetme",
    "x-scope": "Domains/SaveAuthCode",
    "x-generated": "core-catalog",
    "description": "Save auth code (path: {domain}). Domain operations run against the registrar module of the domain.\n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/alan-adi-edinme).",
    "x-description-tr": "Devam eden bir transfer için kodu günceller. — anahtarın sahibi",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "description": "not_found",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "description": "code_required, not_actionable",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "parameters": [
     {
      "name": "domain",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      }
     }
    ],
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "code": {
          "type": "string",
          "description": "Yeni transfer kodu. İşaretleme ayıklanır ve boşluklar kırpılır."
         }
        },
        "required": [
         "code"
        ]
       }
      }
     }
    }
   }
  },
  "/domains/{domain}/dns-records": {
   "get": {
    "tags": [
     "Domains and DNS"
    ],
    "operationId": "coreGetDnsRecords",
    "summary": "List dns records (path: {domain})",
    "x-summary-tr": "DNS Kayıtlarını Listeleme",
    "x-scope": "Domains/GetDnsRecords",
    "x-generated": "core-catalog",
    "description": "List dns records (path: {domain}). Domain operations run against the registrar module of the domain.\n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/ad-sunuculari-ve-kayitlar).",
    "x-description-tr": "Alan adının DNS kayıtlarını sağlayıcıdan okur. — ek hizmet gerekir",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "array",
           "items": {
            "type": "object",
            "additionalProperties": true
           }
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "description": "not_found",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "description": "addon_pending, addon_required, dns_failed, dns_not_supported, dns_rejected",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "500": {
      "description": "dns_failed",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "parameters": [
     {
      "name": "domain",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      }
     }
    ]
   },
   "post": {
    "tags": [
     "Domains and DNS"
    ],
    "operationId": "coreCreateDnsRecord",
    "summary": "Create dns record (path: {domain})",
    "x-summary-tr": "DNS Kaydı Ekleme",
    "x-scope": "Domains/CreateDnsRecord",
    "x-generated": "core-catalog",
    "description": "Create dns record (path: {domain}). Domain operations run against the registrar module of the domain.\n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/ad-sunuculari-ve-kayitlar).",
    "x-description-tr": "Alan adına yeni bir DNS kaydı ekler. — ek hizmet gerekir",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "description": "not_found",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "description": "addon_required, dns_failed, dns_fields, dns_not_supported, dns_rejected, not_actionable",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "500": {
      "description": "dns_failed",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "parameters": [
     {
      "name": "domain",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      }
     }
    ],
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "type": {
          "type": "string",
          "description": "Kayıt türü."
         },
         "name": {
          "type": "string",
          "description": "Kaydın yanıtlayacağı ad. Kabul edilen biçim sağlayıcıya göre değişir."
         },
         "value": {
          "type": "string",
          "description": "Kaydın içeriği."
         },
         "ttl": {
          "type": "integer",
          "description": "Yaşam süresi. Verilmezse sağlayıcının varsayılanı kullanılır."
         },
         "priority": {
          "type": "integer",
          "description": "Öncelik. Posta ve hizmet kayıtları dışında yok sayılır."
         },
         "identity": {
          "type": "string",
          "description": ""
         }
        },
        "required": [
         "name",
         "type",
         "value"
        ]
       }
      }
     }
    }
   },
   "put": {
    "tags": [
     "Domains and DNS"
    ],
    "operationId": "coreUpdateDnsRecord",
    "summary": "Update dns record (path: {domain})",
    "x-summary-tr": "DNS Kaydını Düzenleme",
    "x-scope": "Domains/UpdateDnsRecord",
    "x-generated": "core-catalog",
    "description": "Update dns record (path: {domain}). Domain operations run against the registrar module of the domain.\n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/ad-sunuculari-ve-kayitlar).",
    "x-description-tr": "Var olan bir DNS kaydını değiştirir. — numara ile eşleşir",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "description": "not_found",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "description": "addon_required, dns_edit_not_supported, dns_failed, dns_fields, dns_rejected, not_actionable",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "500": {
      "description": "dns_failed",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "parameters": [
     {
      "name": "domain",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      }
     }
    ],
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "identity": {
          "type": "string",
          "description": "Listeden gelen kayıt numarası. Liste bir numara döndürdüyse mutlaka gönderin."
         },
         "type": {
          "type": "string",
          "description": "Kayıt türü."
         },
         "name": {
          "type": "string",
          "description": "Kaydın adı."
         },
         "value": {
          "type": "string",
          "description": "Yeni içerik."
         },
         "ttl": {
          "type": "integer",
          "description": "Yaşam süresi. Verilmezse kayıt mevcut yaşam süresini korur."
         },
         "priority": {
          "type": "integer",
          "description": "Öncelik. Verilmezse kayıt, türü değişmediği sürece mevcut önceliğini korur."
         }
        },
        "required": [
         "name",
         "type",
         "value"
        ]
       }
      }
     }
    }
   },
   "delete": {
    "tags": [
     "Domains and DNS"
    ],
    "operationId": "coreDeleteDnsRecord",
    "summary": "Delete dns record (path: {domain})",
    "x-summary-tr": "DNS Kaydını Silme",
    "x-scope": "Domains/DeleteDnsRecord",
    "x-generated": "core-catalog",
    "description": "Delete dns record (path: {domain}). Domain operations run against the registrar module of the domain.\n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/ad-sunuculari-ve-kayitlar).",
    "x-description-tr": "Bir DNS kaydını kaldırır. — eşleşme daraltılır",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "description": "not_found",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "description": "addon_required, dns_failed, dns_fields, dns_rejected, not_actionable",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "500": {
      "description": "dns_failed",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "parameters": [
     {
      "name": "domain",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      }
     }
    ]
   }
  },
  "/domains/{domain}/dnssec": {
   "get": {
    "tags": [
     "Domains and DNS"
    ],
    "operationId": "coreGetDnssecRecords",
    "summary": "List dnssec records (path: {domain})",
    "x-summary-tr": "İmza Kayıtlarını Listeleme",
    "x-scope": "Domains/GetDnssecRecords",
    "x-generated": "core-catalog",
    "description": "List dnssec records (path: {domain}). Domain operations run against the registrar module of the domain.\n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/ad-sunuculari-ve-kayitlar).",
    "x-description-tr": "Alan adının imza doğrulama kayıtlarını döndürür. — sağlayıcıdan okur",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "array",
           "items": {
            "type": "object",
            "additionalProperties": true
           }
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "description": "not_found",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "description": "dnssec_failed, dnssec_not_supported",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "500": {
      "description": "dnssec_failed",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "parameters": [
     {
      "name": "domain",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      }
     }
    ]
   },
   "post": {
    "tags": [
     "Domains and DNS"
    ],
    "operationId": "coreCreateDnssecRecord",
    "summary": "Create dnssec record (path: {domain})",
    "x-summary-tr": "İmza Kaydı Ekleme",
    "x-scope": "Domains/CreateDnssecRecord",
    "x-generated": "core-catalog",
    "description": "Create dnssec record (path: {domain}). Domain operations run against the registrar module of the domain.\n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/ad-sunuculari-ve-kayitlar).",
    "x-description-tr": "Alan adına bir imza doğrulama kaydı ekler. — algoritma denetlenir",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "description": "not_found",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "description": "dnssec_algorithm_invalid, dnssec_digest_type_invalid, dnssec_failed, dnssec_fields, dnssec_not_supported, dnssec_rejected, not_actionable",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "500": {
      "description": "dnssec_failed",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "parameters": [
     {
      "name": "domain",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      }
     }
    ],
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "key_tag": {
          "type": "integer",
          "description": "Anahtarın etiketi. `dnskey-keytag-flags`'te anahtar bayrağını taşır."
         },
         "algorithm": {
          "type": "integer",
          "description": "Anahtar algoritmasının numarası. Modülün bildirdiği kümede olmalıdır."
         },
         "digest_type": {
          "type": "integer",
          "description": "Özet algoritmasının numarası ya da `meta.dnssec_fields`'in adlandırdığı anahtar bayrağı veya protokol. Modülün bildirdiği kümede olmalıdır."
         },
         "digest": {
          "type": "string",
          "description": "İmza özeti. DNSKEY isteyen servis sağlayıcı burada açık anahtarı (base64) alır."
         }
        },
        "required": [
         "algorithm",
         "digest",
         "digest_type",
         "key_tag"
        ]
       }
      }
     }
    }
   },
   "delete": {
    "tags": [
     "Domains and DNS"
    ],
    "operationId": "coreDeleteDnssecRecord",
    "summary": "Delete dnssec record (path: {domain})",
    "x-summary-tr": "İmza Kaydını Silme",
    "x-scope": "Domains/DeleteDnssecRecord",
    "x-generated": "core-catalog",
    "description": "Delete dnssec record (path: {domain}). Domain operations run against the registrar module of the domain.\n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/ad-sunuculari-ve-kayitlar).",
    "x-description-tr": "Bir imza doğrulama kaydını kaldırır. — siteyi kırabilir",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "description": "not_found",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "description": "dnssec_failed, dnssec_fields, dnssec_not_supported, dnssec_rejected, not_actionable",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "500": {
      "description": "dnssec_failed",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "parameters": [
     {
      "name": "domain",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      }
     }
    ]
   }
  },
  "/domains/{domain}/whois": {
   "get": {
    "tags": [
     "Domains and DNS"
    ],
    "operationId": "coreGetWhoisContacts",
    "summary": "Get whois contacts (path: {domain})",
    "x-summary-tr": "Alan Adı Kişilerini Okuma",
    "x-scope": "Domains/GetWhoisContacts",
    "x-generated": "core-catalog",
    "description": "Get whois contacts (path: {domain}). Domain operations run against the registrar module of the domain.\n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/alan-adi-kisileri-ve-gizlilik).",
    "x-description-tr": "Alan adının dört rolündeki kişi bilgilerini döndürür. — sağlayıcıdan okur",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "description": "not_found",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "description": "whois_not_supported, whois_rejected",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "parameters": [
     {
      "name": "domain",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      }
     }
    ]
   },
   "put": {
    "tags": [
     "Domains and DNS"
    ],
    "operationId": "coreUpdateWhoisContacts",
    "summary": "Update whois contacts (path: {domain})",
    "x-summary-tr": "Alan Adı Kişilerini Yazma",
    "x-scope": "Domains/UpdateWhoisContacts",
    "x-generated": "core-catalog",
    "description": "Update whois contacts (path: {domain}). Domain operations run against the registrar module of the domain.\n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/alan-adi-kisileri-ve-gizlilik).",
    "x-description-tr": "Bir kişiyi seçilen role ya da dört role birden yazar. — sicile yazar",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "description": "not_found",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "description": "contact_email_invalid, contact_field_invalid, contact_field_required, contact_name_required, not_actionable, role_invalid, whois_failed, whois_not_supported, whois_rejected",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "500": {
      "description": "whois_failed",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "parameters": [
     {
      "name": "domain",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      }
     }
    ],
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "role": {
          "type": "string",
          "description": "Hangi rollere yazılacağı. Verilmezse dört rolün hepsine yazılır."
         },
         "contact": {
          "type": "object",
          "description": "contactYazılacak kişi."
         },
         "first_name": {
          "type": "string",
          "description": "Kişinin adı."
         },
         "last_name": {
          "type": "string",
          "description": "Kişinin soyadı."
         },
         "company": {
          "type": "string",
          "description": "Kurum adı. Tek isteğe bağlı alandır."
         },
         "email": {
          "type": "string",
          "description": "Geçerli bir e-posta."
         },
         "phone": {
          "type": "string",
          "description": "Telefon."
         },
         "address": {
          "type": "string",
          "description": "Adres satırı."
         },
         "address2": {
          "type": "string",
          "description": "İkinci adres satırı (daire, kat, blok). Anahtar gönderilmezse sağlayıcıdaki satır korunur; boş metin satırı siler."
         },
         "city": {
          "type": "string",
          "description": "Şehir."
         },
         "state": {
          "type": "string",
          "description": "İl ya da eyalet. Alan adı kişilerinde zorunludur, kayıtlı profillerde değildir."
         },
         "zip": {
          "type": "string",
          "description": "Posta kodu."
         },
         "country": {
          "type": "string",
          "description": "Ülke kodu. Büyük harfe çevrilir."
         },
         "postal_code": {
          "type": "string",
          "description": ""
         }
        },
        "required": [
         "address",
         "city",
         "contact",
         "country",
         "email",
         "first_name",
         "last_name",
         "phone",
         "zip"
        ]
       }
      }
     }
    }
   }
  },
  "/domains/{domain}/whois/apply": {
   "post": {
    "tags": [
     "Domains and DNS"
    ],
    "operationId": "coreApplyWhoisProfile",
    "summary": "Apply whois profile (path: {domain})",
    "x-summary-tr": "Kayıtlı Profili Uygulama",
    "x-scope": "Domains/ApplyWhoisProfile",
    "x-generated": "core-catalog",
    "description": "Apply whois profile (path: {domain}). Domain operations run against the registrar module of the domain.\n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/alan-adi-kisileri-ve-gizlilik).",
    "x-description-tr": "Kayıtlı bir kişi profilini alan adının dört rolüne birden yazar. — dört rolü doldurur",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "description": "not_found",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "description": "not_actionable, whois_failed, whois_not_supported, whois_rejected",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "500": {
      "description": "whois_failed",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "parameters": [
     {
      "name": "domain",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      }
     }
    ],
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "profile_id": {
          "type": "integer",
          "description": "Uygulanacak profilin numarası."
         }
        },
        "required": [
         "profile_id"
        ]
       }
      }
     }
    }
   }
  },
  "/domains/{domain}/whois-privacy": {
   "put": {
    "tags": [
     "Domains and DNS"
    ],
    "operationId": "coreUpdateWhoisPrivacy",
    "summary": "Update whois privacy (path: {domain})",
    "x-summary-tr": "Kayıt Gizliliğini Değiştirme",
    "x-scope": "Domains/UpdateWhoisPrivacy",
    "x-generated": "core-catalog",
    "description": "Update whois privacy (path: {domain}). Domain operations run against the registrar module of the domain.\n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/alan-adi-kisileri-ve-gizlilik).",
    "x-description-tr": "Kişi bilgilerinin herkese açık sorguda gizlenmesini açar ya da kapatır. — ücretli olabilir",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "description": "not_found",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "description": "addon_required, enabled_invalid, not_actionable, privacy_failed, privacy_not_supported, privacy_rejected",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "500": {
      "description": "privacy_failed",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "parameters": [
     {
      "name": "domain",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      }
     }
    ],
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "enabled": {
          "type": "boolean",
          "description": "Gizlilik açık mı. Gerçek bir mantıksal değer olmalıdır."
         }
        },
        "required": [
         "enabled"
        ]
       }
      }
     }
    }
   }
  },
  "/domains/{domain}/email-forwards": {
   "get": {
    "tags": [
     "Domains and DNS"
    ],
    "operationId": "coreGetEmailForwards",
    "summary": "List email forwards (path: {domain})",
    "x-summary-tr": "E-posta Yönlendirmelerini Listeleme",
    "x-scope": "Domains/GetEmailForwards",
    "x-generated": "core-catalog",
    "description": "List email forwards (path: {domain}). Domain operations run against the registrar module of the domain.\n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/yonlendirme-kurma).",
    "x-description-tr": "Alan adında tanımlı e-posta yönlendirmelerini döndürür. — ek hizmet gerekir",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "array",
           "items": {
            "type": "object",
            "additionalProperties": true
           }
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "description": "not_found",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "description": "addon_pending, addon_required, email_forwarding_failed, email_forwarding_not_supported",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "500": {
      "description": "email_forwarding_failed",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "parameters": [
     {
      "name": "domain",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      }
     }
    ]
   },
   "post": {
    "tags": [
     "Domains and DNS"
    ],
    "operationId": "coreCreateEmailForward",
    "summary": "Create email forward (path: {domain})",
    "x-summary-tr": "E-posta Yönlendirmesi Ekleme",
    "x-scope": "Domains/CreateEmailForward",
    "x-generated": "core-catalog",
    "description": "Create email forward (path: {domain}). Domain operations run against the registrar module of the domain.\n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/yonlendirme-kurma).",
    "x-description-tr": "Alan adına gelen postayı başka bir kutuya taşıyan bir kural ekler. — ek hizmet gerekir",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "description": "not_found",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "description": "addon_required, email_forward_fields, email_forward_rejected, email_forward_target_invalid, email_forwarding_failed, email_forwarding_not_supported, not_actionable",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "500": {
      "description": "email_forwarding_failed",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "parameters": [
     {
      "name": "domain",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      }
     }
    ],
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "prefix": {
          "type": "string",
          "description": "Alan adındaki yerel kısım. Yönlendirme bu kısım ile alan adının birleşimine yanıt verir."
         },
         "target": {
          "type": "string",
          "description": "Hedef posta kutusu. Geçerli bir e-posta adresi olmalıdır."
         }
        },
        "required": [
         "prefix",
         "target"
        ]
       }
      }
     }
    }
   },
   "delete": {
    "tags": [
     "Domains and DNS"
    ],
    "operationId": "coreDeleteEmailForward",
    "summary": "Delete email forward (path: {domain})",
    "x-summary-tr": "E-posta Yönlendirmesini Silme",
    "x-scope": "Domains/DeleteEmailForward",
    "x-generated": "core-catalog",
    "description": "Delete email forward (path: {domain}). Domain operations run against the registrar module of the domain.\n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/yonlendirme-kurma).",
    "x-description-tr": "Bir e-posta yönlendirme kuralını kaldırır. — eşleşme daraltılır",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "description": "not_found",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "description": "addon_required, email_forward_fields, email_forwarding_failed, email_forwarding_not_supported, not_actionable",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "500": {
      "description": "email_forwarding_failed",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "parameters": [
     {
      "name": "domain",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      }
     }
    ]
   }
  },
  "/domains/{domain}/forwarding": {
   "get": {
    "tags": [
     "Domains and DNS"
    ],
    "operationId": "coreGetUrlForwarding",
    "summary": "Get url forwarding (path: {domain})",
    "x-summary-tr": "Adres Yönlendirmesini Okuma",
    "x-scope": "Domains/GetUrlForwarding",
    "x-generated": "core-catalog",
    "description": "Get url forwarding (path: {domain}). Domain operations run against the registrar module of the domain.\n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/yonlendirme-kurma).",
    "x-description-tr": "Alan adının başka bir adrese yönlendirilip yönlendirilmediğini döndürür. — ek hizmet gerekir",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "description": "not_found",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "description": "addon_pending, addon_required, url_forwarding_failed, url_forwarding_not_supported",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "500": {
      "description": "url_forwarding_failed",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "parameters": [
     {
      "name": "domain",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      }
     }
    ]
   },
   "put": {
    "tags": [
     "Domains and DNS"
    ],
    "operationId": "coreUpdateUrlForwarding",
    "summary": "Update url forwarding (path: {domain})",
    "x-summary-tr": "Adres Yönlendirmesi Kurma",
    "x-scope": "Domains/UpdateUrlForwarding",
    "x-generated": "core-catalog",
    "description": "Update url forwarding (path: {domain}). Domain operations run against the registrar module of the domain.\n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/yonlendirme-kurma).",
    "x-description-tr": "Alan adına gelen ziyaretçiyi başka bir adrese gönderir. — ek hizmet gerekir",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "description": "not_found",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "description": "addon_required, not_actionable, url_forwarding_failed, url_forwarding_not_supported, url_forwarding_rejected, url_required",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "500": {
      "description": "url_forwarding_failed",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "parameters": [
     {
      "name": "domain",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      }
     }
    ],
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "url": {
          "type": "string",
          "description": "Tam hedef adres. Şeması yönlendirmenin şeması olur; yazılmazsa güvensiz şema kullanılır."
         },
         "method": {
          "type": "integer",
          "description": "Yönlendirme türü. Kalıcı olan varsayılandır; başka bir değer ona düşer."
         }
        },
        "required": [
         "url"
        ]
       }
      }
     }
    }
   },
   "delete": {
    "tags": [
     "Domains and DNS"
    ],
    "operationId": "coreDeleteUrlForwarding",
    "summary": "Delete url forwarding (path: {domain})",
    "x-summary-tr": "Adres Yönlendirmesini Kaldırma",
    "x-scope": "Domains/DeleteUrlForwarding",
    "x-generated": "core-catalog",
    "description": "Delete url forwarding (path: {domain}). Domain operations run against the registrar module of the domain.\n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/yonlendirme-kurma).",
    "x-description-tr": "Alan adının adres yönlendirmesini kaldırır. — ek hizmet gerekir",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "description": "not_found",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "description": "addon_required, not_actionable, url_forwarding_failed, url_forwarding_not_supported, url_forwarding_rejected",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "500": {
      "description": "url_forwarding_failed",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "parameters": [
     {
      "name": "domain",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      }
     }
    ]
   }
  },
  "/domains/{domain}/addons/{key}": {
   "post": {
    "tags": [
     "Domains and DNS"
    ],
    "operationId": "coreBuyDomainAddon",
    "summary": "Buy domain addon (path: {domain}, {key})",
    "x-summary-tr": "Alan Adı Ek Hizmeti Alma",
    "x-scope": "Domains/BuyDomainAddon",
    "x-generated": "core-catalog",
    "description": "Buy domain addon (path: {domain}, {key}). Domain operations run against the registrar module of the domain.\n\n**Spends money / creates an invoice.** Money rules apply (AK-40): `\"confirm\": true` in the body, an `Idempotency-Key` header, account balance only (no stored card), daily limit of paid API operations per account (default 50, operator can override per account/reseller, resets 00:00 Europe/Istanbul); violations answer 422 with `[confirm_required]`, `[idempotency_key_required]`, `[balance_only]` or `[daily_limit]` in the message. \n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/sahip-olunan-alan-adlari).",
    "x-description-tr": "**Para harcar / fatura oluşturur.** Para kuralları (AK-40): gövdede `\"confirm\": true`, `Idempotency-Key` başlığı, yalnız bakiye (kayıtlı kart yok), hesap başına günlük ücretli işlem sınırı (varsayılan 50, hesap/bayi bazında değiştirilebilir, 00:00 TR'de sıfırlanır). Alan adı yönetimi, gizlilik ya da yönlendirme ek hizmetini satın alır. — oranlı ilk dönem",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "description": "not_found",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "description": "addon_active, addon_free, addon_not_offered, addon_not_supported, addon_pending, addon_rejected, addon_term_invalid, not_actionable",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "500": {
      "description": "addon_failed",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "parameters": [
     {
      "name": "domain",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      }
     },
     {
      "name": "key",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      }
     },
     {
      "name": "Idempotency-Key",
      "in": "header",
      "required": true,
      "schema": {
       "type": "string",
       "minLength": 8,
       "maxLength": 191
      }
     }
    ]
   }
  },
  "/products": {
   "get": {
    "tags": [
     "Catalog"
    ],
    "operationId": "coreGetProducts",
    "summary": "List products",
    "x-summary-tr": "Ürünleri Listeleme",
    "x-scope": "Products/GetProducts",
    "x-generated": "core-catalog",
    "description": "List products. \n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/satistaki-urunler).",
    "x-description-tr": "Sipariş edilebilecek ürünleri vitrin sırasıyla döndürür. — cüzdan para birimi",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "array",
           "items": {
            "type": "object",
            "additionalProperties": true
           }
          },
          "meta": {
           "$ref": "#/components/schemas/PageMeta"
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "422": {
      "description": "type_invalid",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "parameters": [
     {
      "name": "page",
      "in": "query",
      "schema": {
       "type": "integer"
      },
      "description": "Kaçıncı sayfa."
     },
     {
      "name": "limit",
      "in": "query",
      "schema": {
       "type": "integer"
      },
      "description": "Sayfa başına satır. En çok 100."
     },
     {
      "name": "type",
      "in": "query",
      "schema": {
       "type": "string"
      },
      "description": "Tek bir ürün türü. Bilinmeyen tür reddedilir ve geçerli liste yanıtın ayrıntısında gelir."
     },
     {
      "name": "category",
      "in": "query",
      "schema": {
       "type": "integer"
      },
      "description": "Kategori numarası. Ana kategoriyle de ek atamalarla da eşleşir."
     },
     {
      "name": "search",
      "in": "query",
      "schema": {
       "type": "string"
      },
      "description": "Ürün başlığında arar."
     }
    ]
   }
  },
  "/products/categories": {
   "get": {
    "tags": [
     "Catalog"
    ],
    "operationId": "coreGetProductCategories",
    "summary": "List product categories",
    "x-summary-tr": "Kategorileri Listeleme",
    "x-scope": "Products/GetProductCategories",
    "x-generated": "core-catalog",
    "description": "List product categories. \n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/satistaki-urunler).",
    "x-description-tr": "Vitrinde görünen ürün kategorilerini düz bir liste olarak döndürür. — sayfalama yok",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "array",
           "items": {
            "type": "object",
            "additionalProperties": true
           }
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     }
    },
    "parameters": [
     {
      "name": "type",
      "in": "query",
      "schema": {
       "type": "string"
      },
      "description": "Yalnız bu türün kategorileri. Bilinmeyen değer boş liste verir, hata değil."
     }
    ]
   }
  },
  "/products/{id}": {
   "get": {
    "tags": [
     "Catalog"
    ],
    "operationId": "coreGetProduct",
    "summary": "Get product (path: {id})",
    "x-summary-tr": "Ürün Detayı ve Sipariş Şeması",
    "x-scope": "Products/GetProduct",
    "x-generated": "core-catalog",
    "description": "Get product (path: {id}). \n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/satistaki-urunler).",
    "x-description-tr": "Bir ürünü, sipariş gövdesini kurmak için gereken her şeyle döndürür. — sipariş girdisi",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "description": "not_found",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      }
     }
    ]
   }
  },
  "/orders": {
   "get": {
    "tags": [
     "Orders"
    ],
    "operationId": "coreGetOrders",
    "summary": "List orders",
    "x-summary-tr": "Siparişleri Listeleme",
    "x-scope": "Orders/GetOrders",
    "x-generated": "core-catalog",
    "description": "List orders. Orders of the calling account.\n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/musteri-olarak-siparis).",
    "x-description-tr": "Hesabın siparişlerini en yeniden başlayarak döndürür. — anahtarın sahibi",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "array",
           "items": {
            "type": "object",
            "additionalProperties": true
           }
          },
          "meta": {
           "$ref": "#/components/schemas/PageMeta"
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "422": {
      "description": "status_invalid",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "parameters": [
     {
      "name": "page",
      "in": "query",
      "schema": {
       "type": "integer"
      },
      "description": "Kaçıncı sayfa."
     },
     {
      "name": "limit",
      "in": "query",
      "schema": {
       "type": "integer"
      },
      "description": "Sayfa başına satır. En çok 100."
     },
     {
      "name": "status",
      "in": "query",
      "schema": {
       "type": "string"
      },
      "description": "Durum süzgeci: bekliyor, işlemde, etkin ya da iptal."
     }
    ]
   },
   "post": {
    "tags": [
     "Orders"
    ],
    "operationId": "coreCreateOrder",
    "summary": "Create order",
    "x-summary-tr": "Sipariş Verme",
    "x-scope": "Orders/CreateOrder",
    "x-generated": "core-catalog",
    "description": "Create order. Orders of the calling account.\n\n**Spends money / creates an invoice.** Money rules apply (AK-40): `\"confirm\": true` in the body, an `Idempotency-Key` header, account balance only (no stored card), daily limit of paid API operations per account (default 50, operator can override per account/reseller, resets 00:00 Europe/Istanbul); violations answer 422 with `[confirm_required]`, `[idempotency_key_required]`, `[balance_only]` or `[daily_limit]` in the message. \n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/musteri-olarak-siparis).",
    "x-description-tr": "**Para harcar / fatura oluşturur.** Para kuralları (AK-40): gövdede `\"confirm\": true`, `Idempotency-Key` başlığı, yalnız bakiye (kayıtlı kart yok), hesap başına günlük ücretli işlem sınırı (varsayılan 50, hesap/bayi bazında değiştirilebilir, 00:00 TR'de sıfırlanır). Siparişi verir ve aynı çağrıda tahsil eder. — bakiye ya da kayıtlı kart",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "422": {
      "description": "card_not_chargeable, checkout_blocked, insufficient_balance, no_stored_card, payment_method_restricted, terms_required, verification_required",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "404": {
      "description": "not_found",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "terms": {
          "type": "boolean",
          "description": "Şartların kabulü. Doğru gönderilmelidir."
         },
         "items": {
          "type": "string",
          "description": "items[]Sipariş satırları. Birden yirmiye kadar."
         },
         "product_id": {
          "type": "integer",
          "description": "Sipariş edilecek ürünün numarası."
         },
         "cycle": {
          "type": "string",
          "description": "Ödeme döngüsü. Ürünün fiyatlı döngülerinden biri olmalıdır."
         },
         "quantity": {
          "type": "integer",
          "description": "Adet. Yalnız ürün çoklu alıma izin veriyorsa dikkate alınır."
         },
         "addons": {
          "type": "object",
          "description": "Seçilen ek hizmetler. Ek hizmet numarasını seçenek numarasına eşler. Ürünün ilk dönemi ücretsiz dahil ettiği ek hizmet gönderilmese de siparişe eklenir. İlk dönem tutarı 0 olur, yenilemeler ek hizmet fiyatından faturalanır ve siparişten çıkarılamaz."
         },
         "addons_qty": {
          "type": "object",
          "description": "Adetli ek hizmetlerin sayısı."
         },
         "requirements": {
          "type": "object",
          "description": "Ürünün sorduğu alanların yanıtları. Zorunlu işaretlenen her alan gönderilmelidir."
         },
         "requirement_files": {
          "type": "object",
          "description": "Dosya isteyen alanların içeriği. Kodlanmış içerik olarak gönderilir; adres kabul edilmez."
         },
         "metrics": {
          "type": "string",
          "description": "Açılacak ölçümlerin numaraları."
         },
         "domain": {
          "type": "object",
          "description": "Satırın alan adı ekseni. Seçim, ad, alt alan adı kökü ve lisans alanlarını taşır."
         },
         "coupons": {
          "type": "string",
          "description": "Kupon kodları. Operatörün kendiliğinden uygulanan kuponları da katılır."
         },
         "billing_profile_id": {
          "type": "integer",
          "description": "Fatura profilinin numarası."
         },
         "notes": {
          "type": "string",
          "description": "Sipariş notu. Bin karakterden uzunu kırpılır."
         },
         "payment": {
          "type": "object",
          "description": "paymentÖdeme kaynağı. Toplam sıfırın üstündeyse zorunludur."
         },
         "method": {
          "type": "string",
          "description": "Ödeme yolu: hesap bakiyesi ya da kayıtlı kart."
         },
         "card_id": {
          "type": "integer",
          "description": "Çekilecek kartın numarası. Verilmezse hesabın varsayılan kartı çekilir."
         },
         "project_id": {
          "type": "integer",
          "minimum": 0,
          "description": "Optional project for the new service(s) (0 = default project). Checked before the order: unknown id = 404 `project_not_found` (GyroAPI order endpoints) or 422 `checkout_blocked` with `[project_not_found]` (POST /orders)."
         }
        },
        "required": [
         "cycle",
         "items",
         "product_id",
         "terms"
        ]
       }
      }
     }
    },
    "parameters": [
     {
      "name": "Idempotency-Key",
      "in": "header",
      "required": true,
      "schema": {
       "type": "string",
       "minLength": 8,
       "maxLength": 191
      }
     }
    ]
   }
  },
  "/orders/preview": {
   "post": {
    "tags": [
     "Orders"
    ],
    "operationId": "corePreviewOrder",
    "summary": "Preview order",
    "x-summary-tr": "Siparişi Fiyatlandırma",
    "x-scope": "Orders/PreviewOrder",
    "x-generated": "core-catalog",
    "description": "Preview order. Orders of the calling account.\n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/musteri-olarak-siparis).",
    "x-description-tr": "Sipariş gövdesini fiyatlandırır ve tek satır bile yazmaz. — hiçbir şey yazılmaz",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "422": {
      "description": "coupon_invalid, cycle_invalid, domain_acquisition_not_here, items_required, product_not_orderable, requirement_missing",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "404": {
      "description": "not_found",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "items": {
          "type": "string",
          "description": "items[]Sipariş satırları. Birden yirmiye kadar; şekli sipariş ucuyla aynıdır."
         },
         "product_id": {
          "type": "integer",
          "description": "Sipariş edilecek ürünün numarası."
         },
         "cycle": {
          "type": "string",
          "description": "Ödeme döngüsü. Ürünün fiyatlı döngülerinden biri olmalıdır."
         },
         "quantity": {
          "type": "integer",
          "description": "Adet. Yalnız ürün çoklu alıma izin veriyorsa dikkate alınır."
         },
         "addons": {
          "type": "object",
          "description": "Seçilen ek hizmetler. Ek hizmet numarasını seçenek numarasına eşler. Ürünün ilk dönemi ücretsiz dahil ettiği ek hizmet gönderilmese de siparişe eklenir. İlk dönem tutarı 0 olur, yenilemeler ek hizmet fiyatından faturalanır ve siparişten çıkarılamaz."
         },
         "addons_qty": {
          "type": "object",
          "description": "Adetli ek hizmetlerin sayısı."
         },
         "requirements": {
          "type": "object",
          "description": "Ürünün sorduğu alanların yanıtları. Zorunlu işaretlenen her alan gönderilmelidir."
         },
         "requirement_files": {
          "type": "object",
          "description": "Dosya isteyen alanların içeriği. Kodlanmış içerik olarak gönderilir; adres kabul edilmez."
         },
         "metrics": {
          "type": "string",
          "description": "Açılacak ölçümlerin numaraları."
         },
         "domain": {
          "type": "object",
          "description": "Satırın alan adı ekseni. Seçim, ad, alt alan adı kökü ve lisans alanlarını taşır."
         },
         "coupons": {
          "type": "string",
          "description": "Denenecek kupon kodları."
         },
         "billing_profile_id": {
          "type": "integer",
          "description": "Fatura profilinin numarası. Vergi bağlamını belirler; verilmezse varsayılan profil, hesapta kayıtlı profil yoksa hesabın ülkesi kullanılır."
         },
         "payment": {
          "type": "object",
          "description": "Ödeme bloğu. Verilirse yöntemin komisyonu toplama eklenir; bakiye yeterliliği burada denetlenmez."
         },
         "method": {
          "type": "string",
          "description": ""
         },
         "card_id": {
          "type": "string",
          "description": ""
         }
        },
        "required": [
         "cycle",
         "items",
         "product_id"
        ]
       }
      }
     }
    }
   }
  },
  "/orders/{id}": {
   "get": {
    "tags": [
     "Orders"
    ],
    "operationId": "coreGetOrder",
    "summary": "Get order (path: {id})",
    "x-summary-tr": "Sipariş Detayını Okuma",
    "x-scope": "Orders/GetOrder",
    "x-generated": "core-catalog",
    "description": "Get order (path: {id}). Orders of the calling account.\n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/musteri-olarak-siparis).",
    "x-description-tr": "Siparişin satırlarını, doğan hizmetlerini ve faturasını döndürür. — anahtarın sahibi",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "description": "not_found",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      }
     }
    ]
   }
  },
  "/invoices/{id}/pay": {
   "post": {
    "tags": [
     "Billing"
    ],
    "operationId": "corePayInvoice",
    "summary": "Pay invoice (path: {id})",
    "x-summary-tr": "Faturayı Ödeme",
    "x-scope": "Invoices/PayInvoice",
    "x-generated": "core-catalog",
    "description": "Pay invoice (path: {id}). Invoices of the calling account.\n\n**Spends money / creates an invoice.** Money rules apply (AK-40): `\"confirm\": true` in the body, an `Idempotency-Key` header, account balance only (no stored card), daily limit of paid API operations per account (default 50, operator can override per account/reseller, resets 00:00 Europe/Istanbul); violations answer 422 with `[confirm_required]`, `[idempotency_key_required]`, `[balance_only]` or `[daily_limit]` in the message. \n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/fatura-odeme-api).",
    "x-description-tr": "**Para harcar / fatura oluşturur.** Para kuralları (AK-40): gövdede `\"confirm\": true`, `Idempotency-Key` başlığı, yalnız bakiye (kayıtlı kart yok), hesap başına günlük ücretli işlem sınırı (varsayılan 50, hesap/bayi bazında değiştirilebilir, 00:00 TR'de sıfırlanır). Açık bir faturayı bakiyeyle ya da kayıtlı kartla kapatır. — bakiye ya da kayıtlı kart",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "description": "not_found",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "description": "balance_not_allowed, card_expired, card_not_chargeable, insufficient_balance, invoice_not_payable, no_stored_card, payment_method_invalid, subscription_collects",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      }
     },
     {
      "name": "Idempotency-Key",
      "in": "header",
      "required": true,
      "schema": {
       "type": "string",
       "minLength": 8,
       "maxLength": 191
      }
     }
    ],
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "payment": {
          "type": "object",
          "description": "paymentÖdeme kaynağı."
         },
         "method": {
          "type": "string",
          "description": "Ödeme yolu: hesap bakiyesi ya da kayıtlı kart."
         },
         "card_id": {
          "type": "integer",
          "description": "Çekilecek kartın numarası. Verilmezse hesabın varsayılan kartı çekilir."
         }
        },
        "required": [
         "method",
         "payment"
        ]
       }
      }
     }
    }
   }
  },
  "/invoices/{id}/coupon": {
   "post": {
    "tags": [
     "Billing"
    ],
    "operationId": "coreApplyInvoiceCoupon",
    "summary": "Apply invoice coupon (path: {id})",
    "x-summary-tr": "Faturaya Kupon Uygulama",
    "x-scope": "Invoices/ApplyInvoiceCoupon",
    "x-generated": "core-catalog",
    "description": "Apply invoice coupon (path: {id}). Invoices of the calling account.\n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/fatura-odeme-api).",
    "x-description-tr": "Açık bir faturaya kupon uygular ve belgeyi yeniden fiyatlar. — belge başına tek kupon",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "description": "not_found",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "description": "coupon_code_required, coupon_invalid, coupon_not_invoice, coupon_rejected, coupon_scope, coupon_used, invoice_not_payable",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      }
     }
    ],
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "code": {
          "type": "string",
          "description": "Kupon kodu."
         }
        },
        "required": [
         "code"
        ]
       }
      }
     }
    }
   }
  },
  "/tickets/departments": {
   "get": {
    "tags": [
     "Support tickets"
    ],
    "operationId": "coreGetTicketDepartments",
    "summary": "List ticket departments",
    "x-summary-tr": "Departmanları Listeleme",
    "x-scope": "Tickets/GetTicketDepartments",
    "x-generated": "core-catalog",
    "description": "List ticket departments. Support ticket of the calling account.\n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/destek-isteme).",
    "x-description-tr": "Talep açılabilecek departmanları kendi alan şemalarıyla döndürür. — açılış şeması",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "array",
           "items": {
            "type": "object",
            "additionalProperties": true
           }
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "422": {
      "description": "ticket_system_disabled",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    }
   }
  },
  "/tickets/access-groups": {
   "get": {
    "tags": [
     "Support tickets"
    ],
    "operationId": "coreGetTicketAccessGroups",
    "summary": "List ticket access groups",
    "x-summary-tr": "Erişim Gruplarını Listeleme",
    "x-scope": "Tickets/GetTicketAccessGroups",
    "x-generated": "core-catalog",
    "description": "List ticket access groups. Support ticket of the calling account.\n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/destek-isteme).",
    "x-description-tr": "Mesaja eklenebilecek erişim bilgisi gruplarını şemalarıyla döndürür. — şifreli alanlar",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "array",
           "items": {
            "type": "object",
            "additionalProperties": true
           }
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "422": {
      "description": "ticket_system_disabled",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    }
   }
  },
  "/tickets": {
   "get": {
    "tags": [
     "Support tickets"
    ],
    "operationId": "coreGetTickets",
    "summary": "List tickets",
    "x-summary-tr": "Talepleri Listeleme",
    "x-scope": "Tickets/GetTickets",
    "x-generated": "core-catalog",
    "description": "List tickets. Support ticket of the calling account.\n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/destek-isteme).",
    "x-description-tr": "Hesabın destek taleplerini durum sırasıyla döndürür. — durum sırası",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "array",
           "items": {
            "type": "object",
            "additionalProperties": true
           }
          },
          "meta": {
           "$ref": "#/components/schemas/PageMeta"
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "422": {
      "description": "status_invalid, ticket_system_disabled",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "parameters": [
     {
      "name": "page",
      "in": "query",
      "schema": {
       "type": "integer"
      },
      "description": "Kaçıncı sayfa."
     },
     {
      "name": "limit",
      "in": "query",
      "schema": {
       "type": "integer"
      },
      "description": "Sayfa başına satır. En çok 100."
     },
     {
      "name": "status",
      "in": "query",
      "schema": {
       "type": "string"
      },
      "description": "Durum süzgeci. Müşteriye gösterilen durum sözlüğünü kabul eder."
     },
     {
      "name": "department",
      "in": "query",
      "schema": {
       "type": "integer"
      },
      "description": "Departman süzgeci."
     },
     {
      "name": "search",
      "in": "query",
      "schema": {
       "type": "string"
      },
      "description": "Konu, referans ve departman adında arar."
     }
    ]
   },
   "post": {
    "tags": [
     "Support tickets"
    ],
    "operationId": "coreCreateTicket",
    "summary": "Create ticket",
    "x-summary-tr": "Talep Açma",
    "x-scope": "Tickets/CreateTicket",
    "x-generated": "core-catalog",
    "description": "Create ticket. Support ticket of the calling account.\n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/destek-isteme).\n\n**Limit increase**: account limits (GET /cloud/account/limits) are raised through a ticket: department_id 3, subject `Limit increase: <limit_key>`, message with the requested number and what you are building. CLI: `gyro ticket create --department-id 3 --subject ... --message ...`.",
    "x-description-tr": "Yeni bir destek talebi açar. — ek kabul eder\n\n**Sınır artırma**: hesap sınırları (GET /cloud/account/limits) talep ile artırılır: department_id 3, konu `Limit increase: <limit_key>`, mesajda istenen sayı ve ne yaptığınız. CLI: `gyro ticket create --department-id 3 --subject ... --message ...`.",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "description": "not_found",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "description": "access_group_invalid, attachment_invalid, credential_field_required, custom_field_required, department_invalid, message_too_short, subject_required, ticket_rejected, ticket_system_disabled",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "department_id": {
          "type": "integer",
          "description": "Departmanın numarası."
         },
         "subject": {
          "type": "string",
          "description": "Konu."
         },
         "message": {
          "type": "string",
          "description": "Açılış mesajı. En az beş karakter; düz metindir ve işaretleme ayıklanır."
         },
         "priority": {
          "type": "integer",
          "description": "Öncelik. Verilmezse orta alınır."
         },
         "service_id": {
          "type": "integer",
          "description": "Talebi bir hizmete bağlar."
         },
         "custom_fields": {
          "type": "object",
          "description": "Departman alanlarının yanıtları. Alan numarasını değere eşler; kutu tipli alanlar dizi alır."
         },
         "credentials": {
          "type": "string",
          "description": "Erişim bilgileri. Her satır bir grup numarası ve alan haritası taşır; mesaja şifreli işlenir."
         },
         "attachments": {
          "type": "array",
          "description": "Ekler. Kodlanmış içerik olarak gönderilir; adres reddedilir."
         },
         "encrypt_message": {
          "type": "boolean",
          "description": "Mesaj gövdesi şifreli saklansın mı."
         }
        },
        "required": [
         "department_id",
         "message",
         "subject"
        ]
       }
      }
     }
    }
   }
  },
  "/tickets/{id}": {
   "get": {
    "tags": [
     "Support tickets"
    ],
    "operationId": "coreGetTicket",
    "summary": "Get ticket (path: {id})",
    "x-summary-tr": "Talebi ve Mesajları Okuma",
    "x-scope": "Tickets/GetTicket",
    "x-generated": "core-catalog",
    "description": "Get ticket (path: {id}). Support ticket of the calling account.\n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/destek-isteme).",
    "x-description-tr": "Talebin üst bilgilerini ve bütün mesaj dizisini döndürür. — okundu işaretler",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "description": "not_found",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "description": "ticket_system_disabled",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      }
     }
    ]
   }
  },
  "/tickets/{id}/reply": {
   "post": {
    "tags": [
     "Support tickets"
    ],
    "operationId": "coreReplyTicket",
    "summary": "Reply ticket (path: {id})",
    "x-summary-tr": "Yanıt Yazma",
    "x-scope": "Tickets/ReplyTicket",
    "x-generated": "core-catalog",
    "description": "Reply ticket (path: {id}). Support ticket of the calling account.\n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/destek-isteme).",
    "x-description-tr": "Açık bir talebe yanıt ekler. — ek kabul eder",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "description": "not_found",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "description": "access_group_invalid, attachment_invalid, message_too_short, reply_rejected, ticket_not_open, ticket_system_disabled",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      }
     }
    ],
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "message": {
          "type": "string",
          "description": "Yanıt metni. En az beş karakter."
         },
         "credentials": {
          "type": "string",
          "description": "Erişim bilgileri."
         },
         "attachments": {
          "type": "array",
          "description": "Ekler."
         },
         "encrypt_message": {
          "type": "boolean",
          "description": "Gövde şifreli saklansın mı."
         }
        },
        "required": [
         "message"
        ]
       }
      }
     }
    }
   }
  },
  "/tickets/{id}/close": {
   "post": {
    "tags": [
     "Support tickets"
    ],
    "operationId": "coreCloseTicket",
    "summary": "Close ticket (path: {id})",
    "x-summary-tr": "Talebi Kapatma",
    "x-scope": "Tickets/CloseTicket",
    "x-generated": "core-catalog",
    "description": "Close ticket (path: {id}). Support ticket of the calling account.\n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/destek-isteme).",
    "x-description-tr": "Talebi çözüldü olarak kapatır. — puan verilebilir",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "description": "not_found",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "description": "ticket_system_disabled",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      }
     }
    ],
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "rating": {
          "type": "integer",
          "description": "Kapatırken verilen puan. Yalnız talep henüz puansızken işlenir."
         }
        }
       }
      }
     }
    }
   }
  },
  "/tickets/{id}/reopen": {
   "post": {
    "tags": [
     "Support tickets"
    ],
    "operationId": "coreReopenTicket",
    "summary": "Reopen ticket (path: {id})",
    "x-summary-tr": "Talebi Yeniden Açma",
    "x-scope": "Tickets/ReopenTicket",
    "x-generated": "core-catalog",
    "description": "Reopen ticket (path: {id}). Support ticket of the calling account.\n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/destek-isteme).",
    "x-description-tr": "Kapalı bir talebi yeniden açar. — kilitliyse olmaz",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "description": "not_found",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "description": "ticket_locked, ticket_system_disabled",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      }
     }
    ]
   }
  },
  "/tickets/{id}/rating": {
   "post": {
    "tags": [
     "Support tickets"
    ],
    "operationId": "coreRateTicket",
    "summary": "Rate ticket (path: {id})",
    "x-summary-tr": "Talebi Puanlama",
    "x-scope": "Tickets/RateTicket",
    "x-generated": "core-catalog",
    "description": "Rate ticket (path: {id}). Support ticket of the calling account.\n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/destek-isteme).",
    "x-description-tr": "Talebe bir ile beş arasında puan verir. — bir kez",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "description": "not_found",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "description": "already_rated, rating_invalid, ticket_system_disabled",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      }
     }
    ],
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "rating": {
          "type": "integer",
          "description": "Verilen puan. Birden beşe."
         }
        },
        "required": [
         "rating"
        ]
       }
      }
     }
    }
   }
  },
  "/tickets/{id}/replies/{rid}/rating": {
   "post": {
    "tags": [
     "Support tickets"
    ],
    "operationId": "coreRateTicketReply",
    "summary": "Rate ticket reply (path: {id}, {rid})",
    "x-summary-tr": "Personel Yanıtını Puanlama",
    "x-scope": "Tickets/RateTicketReply",
    "x-generated": "core-catalog",
    "description": "Rate ticket reply (path: {id}, {rid}). Support ticket of the calling account.\n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/destek-isteme).",
    "x-description-tr": "Tek bir personel yanıtına puan verir. — bir kez",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "description": "not_found",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "description": "already_rated, rating_invalid, ticket_system_disabled",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      }
     },
     {
      "name": "rid",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      }
     }
    ],
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "rating": {
          "type": "integer",
          "description": "Verilen puan. Birden beşe."
         }
        },
        "required": [
         "rating"
        ]
       }
      }
     }
    }
   }
  },
  "/tickets/{id}/attachments/{aid}": {
   "get": {
    "tags": [
     "Support tickets"
    ],
    "operationId": "coreGetTicketAttachment",
    "summary": "Get ticket attachment (path: {id}, {aid})",
    "x-summary-tr": "Eki İndirme",
    "x-scope": "Tickets/GetTicketAttachment",
    "x-generated": "core-catalog",
    "description": "Get ticket attachment (path: {id}, {aid}). Support ticket of the calling account.\n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/destek-isteme).",
    "x-description-tr": "Bir mesaj ekini içeriğiyle birlikte döndürür. — kodlanmış içerik",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "description": "not_found",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "description": "ticket_system_disabled",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      }
     },
     {
      "name": "aid",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      }
     }
    ]
   }
  },
  "/sms/senders": {
   "get": {
    "tags": [
     "SMS"
    ],
    "operationId": "coreGetSmsSenders",
    "summary": "List sms senders",
    "x-summary-tr": "Başlıkları Listeleme",
    "x-scope": "Sms/GetSmsSenders",
    "x-generated": "core-catalog",
    "description": "List sms senders. \n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/mesaj-gonderme).",
    "x-description-tr": "Gönderimde kullanılabilecek başlıkları ve ülke kayıtlarını döndürür. — anahtarın sahibi",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "array",
           "items": {
            "type": "object",
            "additionalProperties": true
           }
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "422": {
      "description": "sms_api_disabled, sms_disabled",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    }
   }
  },
  "/sms/quote": {
   "post": {
    "tags": [
     "SMS"
    ],
    "operationId": "coreQuoteSms",
    "summary": "Quote sms",
    "x-summary-tr": "Fiyat Alma",
    "x-scope": "Sms/QuoteSms",
    "x-generated": "core-catalog",
    "description": "Quote sms. \n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/mesaj-gonderme).",
    "x-description-tr": "Gönderimin ne kadar tutacağını ve neyin eleneceğini söyler. — gönderim yok",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "422": {
      "description": "message_required, numbers_required, sender_invalid, sms_api_disabled, sms_disabled",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "sender": {
          "type": "string",
          "description": "Gönderen başlığı. Hesabın etkin başlıklarından biri olmalıdır."
         },
         "message": {
          "type": "string",
          "description": "Mesaj metni. Parça tavanını aşan metin kırpılır ve kırpıldığı bildirilir."
         },
         "numbers": {
          "type": "array",
          "description": "Alıcı numaralar. Uluslararası biçimde; tek bir metin olarak gönderilirse satır, virgül ve noktalı virgülden bölünür."
         }
        },
        "required": [
         "message",
         "numbers",
         "sender"
        ]
       }
      }
     }
    }
   }
  },
  "/sms/send": {
   "post": {
    "tags": [
     "SMS"
    ],
    "operationId": "coreSendSms",
    "summary": "Send sms",
    "x-summary-tr": "Toplu Gönderim",
    "x-scope": "Sms/SendSms",
    "x-generated": "core-catalog",
    "description": "Send sms. \n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/mesaj-gonderme).",
    "x-description-tr": "Mesajı gönderir ve tutarı cüzdandan keser. — cüzdandan keser",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "422": {
      "description": "insufficient_balance, no_recipients, price_unavailable, send_rejected, sender_invalid, sms_api_disabled, sms_disabled, sms_module_unavailable",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "500": {
      "description": "send_failed",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "sender": {
          "type": "string",
          "description": "Gönderen başlığı. Hesabın etkin başlıklarından biri olmalıdır."
         },
         "message": {
          "type": "string",
          "description": "Mesaj metni. Parça tavanını aşan metin kırpılır ve kırpıldığı bildirilir."
         },
         "numbers": {
          "type": "array",
          "description": "Alıcı numaralar. Uluslararası biçimde; tek bir metin olarak gönderilirse satır, virgül ve noktalı virgülden bölünür."
         }
        },
        "required": [
         "message",
         "numbers",
         "sender"
        ]
       }
      }
     }
    }
   }
  },
  "/sms/messages": {
   "get": {
    "tags": [
     "SMS"
    ],
    "operationId": "coreGetSmsMessages",
    "summary": "List sms messages",
    "x-summary-tr": "Gönderim Geçmişi",
    "x-scope": "Sms/GetSmsMessages",
    "x-generated": "core-catalog",
    "description": "List sms messages. \n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/mesaj-gonderme).",
    "x-description-tr": "Yapılmış gönderimleri en yeniden başlayarak döndürür. — anahtarın sahibi",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "array",
           "items": {
            "type": "object",
            "additionalProperties": true
           }
          },
          "meta": {
           "$ref": "#/components/schemas/PageMeta"
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "422": {
      "description": "sms_api_disabled, sms_disabled",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "parameters": [
     {
      "name": "page",
      "in": "query",
      "schema": {
       "type": "integer"
      },
      "description": "Kaçıncı sayfa."
     },
     {
      "name": "limit",
      "in": "query",
      "schema": {
       "type": "integer"
      },
      "description": "Sayfa başına satır. En çok 100."
     }
    ]
   }
  },
  "/sms/messages/{id}": {
   "get": {
    "tags": [
     "SMS"
    ],
    "operationId": "coreGetSmsMessage",
    "summary": "Get sms message (path: {id})",
    "x-summary-tr": "Tek Gönderimi Okuma",
    "x-scope": "Sms/GetSmsMessage",
    "x-generated": "core-catalog",
    "description": "Get sms message (path: {id}). \n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/mesaj-gonderme).",
    "x-description-tr": "Bir gönderimi alıcı numaralarıyla birlikte döndürür. — anahtarın sahibi",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "description": "not_found",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "description": "sms_api_disabled, sms_disabled",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      }
     }
    ]
   }
  },
  "/balance/settings": {
   "patch": {
    "tags": [
     "Billing"
    ],
    "operationId": "coreUpdateBalanceSettings",
    "summary": "Update balance settings",
    "x-summary-tr": "Cüzdan Ayarlarını Değiştirme",
    "x-scope": "Balance/UpdateBalanceSettings",
    "x-generated": "core-catalog",
    "description": "Update balance settings. \n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/hesap-bakiyesi-api).",
    "x-description-tr": "Otomatik ödemeyi ve düşük bakiye uyarısını ayarlar. — faturaları etkiler",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "description": "not_found",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "description": "alert_invalid, auto_pay_invalid, card_expired, nothing_to_update",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "auto_pay_from_balance": {
          "type": "boolean",
          "description": "Yenilemeler cüzdandan tahsil edilsin mi. Bu değiştiğinde açık yenileme faturaları yeni tercihe göre yeniden ele alınır."
         },
         "backup_card_id": {
          "type": "integer",
          "description": "Cüzdan yetmediğinde çekilecek kart. Sıfır göndermek kart zincirini tümüyle kaldırır."
         },
         "alert": {
          "type": "object",
          "description": "Uyarı bloğu. Açık ve eşik alanlarını taşır; açarken pozitif bir eşik gerekir."
         },
         "alert_recipients": {
          "type": "string",
          "description": "Uyarıyı alacak fatura adresi numaraları. Liste yerine geçer; hesabın sahibi burada yer almaz, her zaman alır."
         }
        }
       }
      }
     }
    }
   }
  },
  "/affiliate": {
   "get": {
    "tags": [
     "Affiliate"
    ],
    "operationId": "coreGetAffiliate",
    "summary": "Get affiliate",
    "x-summary-tr": "Program Durumunu Okuma",
    "x-scope": "Affiliate/GetAffiliate",
    "x-generated": "core-catalog",
    "description": "Get affiliate. \n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/satis-ortakligi-kazanci).",
    "x-description-tr": "Programı, kazancı ve ödeme durumunu tek çağrıda döndürür. — olgunlaşanı taşır",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "422": {
      "description": "affiliate_disabled",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    }
   }
  },
  "/affiliate/commissions": {
   "get": {
    "tags": [
     "Affiliate"
    ],
    "operationId": "coreGetAffiliateCommissions",
    "summary": "List affiliate commissions",
    "x-summary-tr": "Komisyonları Listeleme",
    "x-scope": "Affiliate/GetAffiliateCommissions",
    "x-generated": "core-catalog",
    "description": "List affiliate commissions. \n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/satis-ortakligi-kazanci).",
    "x-description-tr": "Kazanılan komisyonları en yeniden başlayarak döndürür. — anahtarın sahibi",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "array",
           "items": {
            "type": "object",
            "additionalProperties": true
           }
          },
          "meta": {
           "$ref": "#/components/schemas/PageMeta"
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "422": {
      "description": "affiliate_disabled, not_enrolled",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "parameters": [
     {
      "name": "page",
      "in": "query",
      "schema": {
       "type": "integer"
      },
      "description": "Kaçıncı sayfa."
     },
     {
      "name": "limit",
      "in": "query",
      "schema": {
       "type": "integer"
      },
      "description": "Sayfa başına satır. En çok 100."
     }
    ]
   }
  },
  "/affiliate/enroll": {
   "post": {
    "tags": [
     "Affiliate"
    ],
    "operationId": "coreEnrollAffiliate",
    "summary": "Enroll affiliate",
    "x-summary-tr": "Programa Katılma",
    "x-scope": "Affiliate/EnrollAffiliate",
    "x-generated": "core-catalog",
    "description": "Enroll affiliate. \n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/satis-ortakligi-kazanci).",
    "x-description-tr": "Hesabı satış ortaklığı programına kaydeder. — hesabın para birimi",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "422": {
      "description": "affiliate_disabled",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    }
   }
  },
  "/affiliate/withdraw": {
   "post": {
    "tags": [
     "Affiliate"
    ],
    "operationId": "coreWithdrawAffiliate",
    "summary": "Withdraw affiliate",
    "x-summary-tr": "Ödeme Talebi Açma",
    "x-scope": "Affiliate/WithdrawAffiliate",
    "x-generated": "core-catalog",
    "description": "Withdraw affiliate. \n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/satis-ortakligi-kazanci).",
    "x-description-tr": "Kullanılabilir kazancın ödenmesini ister. — aynı anda tek talep",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "422": {
      "description": "affiliate_disabled, affiliate_disabled_account, amount_invalid, below_minimum, gateway_info_required, gateway_invalid, not_enrolled, withdrawal_pending, withdrawal_rejected",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "amount": {
          "type": "number",
          "description": "İstenen tutar. Alt sınır ile kullanılabilir bakiye arasında olmalıdır."
         },
         "gateway": {
          "type": "string",
          "description": "Ödeme yolu. Operatörün sunduklarından biri olmalıdır."
         },
         "gateway_info": {
          "type": "string",
          "description": "Hedef bilgisi. Kayıtlı bir hedef varsa atlanabilir."
         },
         "save_default": {
          "type": "boolean",
          "description": "Bu hedefi sonraki talepler için kaydet."
         }
        },
        "required": [
         "amount",
         "gateway"
        ]
       }
      }
     }
    }
   }
  },
  "/affiliate/payment-method": {
   "put": {
    "tags": [
     "Affiliate"
    ],
    "operationId": "coreSaveAffiliatePayoutMethod",
    "summary": "Save affiliate payout method",
    "x-summary-tr": "Ödeme Hedefini Kaydetme",
    "x-scope": "Affiliate/SaveAffiliatePayoutMethod",
    "x-generated": "core-catalog",
    "description": "Save affiliate payout method. \n\nCore WISECP client endpoint (Turkish reference: https://dev.wisecp.com/tr/satis-ortakligi-kazanci).",
    "x-description-tr": "Bir ödeme yolunun hedef bilgisini kaydeder ya da siler. — anahtarın sahibi",
    "responses": {
     "200": {
      "description": "Success",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "additionalProperties": true
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "422": {
      "description": "affiliate_disabled, gateway_invalid, not_enrolled",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "gateway": {
          "type": "string",
          "description": "Ödeme yolu."
         },
         "info": {
          "type": "string",
          "description": "Hedef bilgisi. Boş göndermek kaydı siler."
         }
        },
        "required": [
         "gateway"
        ]
       }
      }
     }
    }
   }
  },
  "/cloud/billing/balance": {
   "get": {
    "operationId": "getPrepaidBalance",
    "tags": [
     "Billing"
    ],
    "summary": "Balance, hourly cost of running prepaid services and estimated time left",
    "x-gyro-cli": [
     "billing",
     "balance"
    ],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "$ref": "#/components/schemas/PrepaidBalance"
          }
         }
        }
       }
      }
     },
     "403": {
      "description": "insufficient_scope | subkey_forbidden"
     }
    },
    "x-scope": "billing_read",
    "x-provided-by": "GyroKredi",
    "description": "Prepaid (hourly, from the account balance) services: Gyro Containers (ECS) and Gyro Cloud Istanbul (tr-ist-1). Times are Europe/Istanbul. Usage is never invoiced: invoices are issued for balance top-ups."
   }
  },
  "/cloud/billing/usage": {
   "get": {
    "operationId": "listPrepaidUsage",
    "tags": [
     "Billing"
    ],
    "summary": "Hour-by-hour usage ledger (or daily/monthly totals). Times are Europe/Istanbul.",
    "x-gyro-cli": [
     "billing",
     "usage"
    ],
    "parameters": [
     {
      "name": "from",
      "in": "query",
      "schema": {
       "type": "string",
       "format": "date"
      },
      "description": "first day (default: 1st of this month)"
     },
     {
      "name": "to",
      "in": "query",
      "schema": {
       "type": "string",
       "format": "date"
      },
      "description": "last day (default: today); at most 400 days"
     },
     {
      "name": "service_id",
      "in": "query",
      "schema": {
       "type": "integer"
      }
     },
     {
      "name": "status",
      "in": "query",
      "schema": {
       "type": "string",
       "enum": [
        "ucretli",
        "tavan",
        "kismi",
        "odenmedi",
        "ucretsiz"
       ]
      }
     },
     {
      "name": "granularity",
      "in": "query",
      "schema": {
       "type": "string",
       "enum": [
        "hour",
        "day",
        "month"
       ],
       "default": "hour"
      }
     },
     {
      "name": "format",
      "in": "query",
      "schema": {
       "type": "string",
       "enum": [
        "json",
        "csv"
       ]
      },
      "description": "csv = base64 file in data.content_base64 (max 5000 rows)"
     },
     {
      "name": "page",
      "in": "query",
      "schema": {
       "type": "integer",
       "default": 1
      }
     },
     {
      "name": "limit",
      "in": "query",
      "schema": {
       "type": "integer",
       "default": 100,
       "maximum": 100
      }
     }
    ],
    "responses": {
     "200": {
      "description": "OK (meta = total, page, limit, next_page)",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "properties": {
            "items": {
             "type": "array",
             "items": {
              "oneOf": [
               {
                "$ref": "#/components/schemas/UsageHour"
               },
               {
                "$ref": "#/components/schemas/UsagePeriod"
               }
              ]
             }
            },
            "filters": {
             "type": "object"
            },
            "totals": {
             "type": "array",
             "items": {
              "$ref": "#/components/schemas/MoneyEur"
             }
            },
            "by_service": {
             "type": "array",
             "items": {
              "$ref": "#/components/schemas/ServiceTotal"
             }
            }
           }
          },
          "meta": {
           "type": "object"
          }
         }
        }
       }
      }
     }
    },
    "x-scope": "billing_read",
    "x-provided-by": "GyroKredi",
    "description": "Prepaid (hourly, from the account balance) services: Gyro Containers (ECS) and Gyro Cloud Istanbul (tr-ist-1). Times are Europe/Istanbul. Usage is never invoiced: invoices are issued for balance top-ups."
   }
  },
  "/cloud/billing/statement/{month}": {
   "get": {
    "operationId": "getPrepaidStatement",
    "tags": [
     "Billing"
    ],
    "summary": "Monthly usage statement (not an invoice); JSON, PDF or CSV",
    "x-gyro-cli": [
     "billing",
     "statement"
    ],
    "parameters": [
     {
      "name": "month",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string",
       "pattern": "^\\d{4}-(0[1-9]|1[0-2])$"
      }
     },
     {
      "name": "format",
      "in": "query",
      "schema": {
       "type": "string",
       "enum": [
        "json",
        "pdf",
        "csv"
       ],
       "default": "json"
      }
     },
     {
      "name": "lang",
      "in": "query",
      "schema": {
       "type": "string",
       "enum": [
        "tr",
        "en"
       ],
       "default": "en"
      }
     }
    ],
    "responses": {
     "200": {
      "description": "json: totals/by_service/by_day; pdf|csv: filename, content_type, content_base64"
     },
     "422": {
      "description": "invalid_month"
     }
    },
    "x-scope": "billing_read",
    "x-provided-by": "GyroKredi",
    "description": "Prepaid (hourly, from the account balance) services: Gyro Containers (ECS) and Gyro Cloud Istanbul (tr-ist-1). Times are Europe/Istanbul. Usage is never invoiced: invoices are issued for balance top-ups."
   }
  },
  "/cloud/billing/estimate": {
   "post": {
    "operationId": "estimatePrepaidCost",
    "tags": [
     "Billing"
    ],
    "summary": "Hourly / daily / monthly cost of prepaid plans and serverless containers, and how long the balance lasts",
    "x-gyro-cli": [
     "billing",
     "estimate"
    ],
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "items": {
          "type": "array",
          "maxItems": 50,
          "items": {
           "type": "object",
           "properties": {
            "plan": {
             "type": "string",
             "example": "standart-2-4"
            },
            "product_id": {
             "type": "integer"
            },
            "region": {
             "type": "string",
             "example": "tr-ist-1",
             "description": "prepaid is tr-ist-1 only"
            },
            "count": {
             "type": "integer",
             "default": 1,
             "maximum": 100
            },
            "type": {
             "type": "string",
             "enum": [
              "serverless"
             ],
             "description": "serverless = a Gyro Containers Serverless container copy (send cpu_m + memory_mi instead of plan)"
            },
            "cpu_m": {
             "type": "integer",
             "enum": [
              250,
              500,
              1000,
              2000,
              4000
             ],
             "description": "serverless: CPU per copy in millicores"
            },
            "memory_mi": {
             "type": "integer",
             "example": 512,
             "description": "serverless: memory per copy in MiB (allowed values per cpu_m: GET /cloud/billing/container-sizes)"
            },
            "hours": {
             "type": "integer",
             "minimum": 1,
             "maximum": 744,
             "default": 730,
             "description": "serverless: running hours for `total` (default 730 = a full month; no monthly cap)"
            }
           }
          }
         },
         "plan": {
          "type": "string",
          "description": "single-item shortcut"
         },
         "count": {
          "type": "integer"
         },
         "cpu_m": {
          "type": "integer",
          "description": "serverless single-item shortcut"
         },
         "memory_mi": {
          "type": "integer"
         },
         "hours": {
          "type": "integer"
         },
         "type": {
          "type": "string",
          "enum": [
           "serverless"
          ]
         }
        }
       }
      }
     }
    },
    "responses": {
     "200": {
      "description": "items[], hourly, daily, monthly_cap, eur_rate, balance, hours_covered, order_requires (first 24 h), can_order"
     },
     "422": {
      "description": "unknown_plan | region_not_prepaid | too_many_items | invalid_cpu | invalid_memory | serverless_not_available"
     }
    },
    "x-scope": "billing_read",
    "x-provided-by": "GyroKredi",
    "description": "Prepaid (hourly, from the account balance) services: Gyro Containers (ECS) and Gyro Cloud Istanbul (tr-ist-1). Times are Europe/Istanbul. Usage is never invoiced: invoices are issued for balance top-ups. Server and dedicated-node plans: hourly = monthly / 672, capped at the monthly price (`capped: true`). Serverless containers (`{\"type\": \"serverless\", \"cpu_m\": 250, \"memory_mi\": 512, \"count\": 2, \"hours\": 730}`): charged by measured use with no monthly cap (`capped: false`), `monthly_cap` = a full month (730 hours) of running time, `total` = `hours` x hourly (`billed_hours` = `hours`). Errors 422: `unknown_plan`, `region_not_prepaid`, `too_many_items`, `invalid_cpu`, `invalid_memory`, `serverless_not_available`.",
    "x-description-tr": " Sunucu ve ayrılmış düğüm planları: saatlik = aylık / 672, aylık fiyatla sınırlı (`capped: true`). Sunucusuz kapsayıcı (`type: serverless`, `cpu_m`, `memory_mi`, `count`, `hours`): ölçülen kullanıma göre, aylık tavan yok (`capped: false`), `monthly_cap` = tam ay (730 saat) çalışma, `total` = `hours` x saatlik (`billed_hours` = `hours`)."
   }
  },
  "/cloud/billing/topup-url": {
   "get": {
    "operationId": "getPrepaidTopupUrl",
    "tags": [
     "Billing"
    ],
    "summary": "Browser link of the balance top-up page (top-ups are invoiced with VAT; usage is not)",
    "responses": {
     "200": {
      "description": "url, minimum"
     }
    },
    "x-scope": "billing_read",
    "x-provided-by": "GyroKredi",
    "description": "Prepaid (hourly, from the account balance) services: Gyro Containers (ECS) and Gyro Cloud Istanbul (tr-ist-1). Times are Europe/Istanbul. Usage is never invoiced: invoices are issued for balance top-ups."
   }
  },
  "/cloud/services/{id}/addons/{aid}": {
   "delete": {
    "tags": [
     "Plan changes and add-ons"
    ],
    "operationId": "removeServiceAddon",
    "summary": "Remove a prepaid add-on at once",
    "x-summary-tr": "Ön ödemeli ek hizmeti hemen kaldır",
    "x-scope": "cloud_write",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      }
     },
     {
      "name": "aid",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "add-on record id (GET .../addons)"
     },
     {
      "name": "confirm",
      "in": "query",
      "required": true,
      "schema": {
       "type": "boolean"
      }
     }
    ],
    "description": "Prepaid add-ons only (invoiced add-ons are cancelled in the panel at the end of their term). Billing of the item stops at once.",
    "responses": {
     "200": {
      "description": "Removed",
      "content": {
       "application/json": {
        "schema": {
         "type": "object"
        }
       }
      }
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    }
   }
  },
  "/cloud/storage/{id}/object-lock": {
   "get": {
    "tags": [
     "Object storage"
    ],
    "operationId": "getStorageObjectLock",
    "summary": "Protected Storage: object lock summary",
    "x-summary-tr": "Korumalı Depolama: nesne kilidi özeti",
    "x-scope": "services_read",
    "x-cli": {
     "command": "storage object-lock status",
     "confirm": false
    },
    "description": "Locked-bucket rights (Object Lock add-on) and use, the default retention of every bucket, and the last lock scan (number of COMPLIANCE / GOVERNANCE / legal hold versions and the latest end date). Protected Storage only: a standard Object Storage service answers 409 `feature_not_available`.",
    "x-description-tr": "Kilitli kova hakkı (Nesne Kilidi ek hizmeti) ve kullanımı, kovaların varsayılan saklaması ve son kilit taraması (COMPLIANCE / GOVERNANCE / legal hold sürüm sayısı, en geç bitiş). Yalnız Korumalı Depolama: standart Nesne Depolama hizmeti 409 `feature_not_available` döner.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id (Protected Storage)"
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "$ref": "#/components/schemas/StorageObjectLockSummary"
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "description": "feature_not_available (standard Object Storage service) or not_actionable",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    }
   }
  },
  "/cloud/storage/{id}/object-lock/scan": {
   "post": {
    "tags": [
     "Object storage"
    ],
    "operationId": "scanStorageObjectLock",
    "summary": "Scan locked versions now",
    "x-summary-tr": "Kilitli sürümleri şimdi tara",
    "x-scope": "services_write",
    "x-cli": {
     "command": "storage object-lock scan",
     "confirm": false
    },
    "description": "Counts locked versions in every locked bucket (up to 25 s / 5000 versions; `complete: false` when cut short).",
    "x-description-tr": "Kilitli kovalardaki kilitli sürümleri sayar (en çok 25 sn / 5000 sürüm; yarım kalırsa `complete: false`).",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id (Protected Storage)"
     }
    ],
    "responses": {
     "202": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "properties": {
            "service_id": {
             "type": "integer"
            },
            "scan": {
             "$ref": "#/components/schemas/StorageLockScan"
            }
           }
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "description": "feature_not_available (standard Object Storage service) or not_actionable",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    }
   }
  },
  "/cloud/storage/{id}/buckets/{bucket}/versions": {
   "get": {
    "tags": [
     "Object storage"
    ],
    "operationId": "listStorageVersions",
    "summary": "List object versions",
    "x-summary-tr": "Nesne sürümlerini listele",
    "x-scope": "services_read",
    "x-cli": {
     "command": "storage versions list",
     "confirm": false
    },
    "description": "Versions and delete markers of one folder (50 per page, `/` delimiter; sub-folders in `folders`). Continue with `key_marker` + `version_id_marker` from the previous page while `truncated` is true. In locked buckets each version carries `lock_mode`, `retain_until` and `legal_hold`.",
    "x-description-tr": "Bir klasördeki sürümler ve silme işaretleri (sayfa 50, ayraç `/`; alt klasörler `folders`). `truncated` true iken önceki sayfanın `key_marker` + `version_id_marker` değerleriyle devam edin. Kilitli kovalarda her sürümde `lock_mode`, `retain_until`, `legal_hold` bulunur.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id (Protected Storage)"
     },
     {
      "name": "bucket",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Bucket name (full name, with the -code suffix)"
     },
     {
      "name": "prefix",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Folder or key prefix (empty = root)"
     },
     {
      "name": "key_marker",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Continuation: next_key_marker of the previous page"
     },
     {
      "name": "version_id_marker",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Continuation: next_version_id_marker of the previous page"
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "$ref": "#/components/schemas/StorageVersionList"
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "description": "feature_not_available (standard Object Storage service) or not_actionable",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    }
   },
   "delete": {
    "tags": [
     "Object storage"
    ],
    "operationId": "deleteStorageVersion",
    "summary": "Permanently delete a version",
    "x-summary-tr": "Sürümü kalıcı sil",
    "x-scope": "services_write",
    "x-cli": {
     "command": "storage versions delete",
     "confirm": true
    },
    "description": "Permanently deletes one version or delete marker (cannot be undone). Versions under GOVERNANCE / COMPLIANCE retention or legal hold are refused with the end date. Needs `confirm=true`.",
    "x-description-tr": "Bir sürümü ya da silme işaretini kalıcı siler (geri alınamaz). GOVERNANCE / COMPLIANCE saklamasında ya da legal hold'daki sürüm bitiş tarihiyle reddedilir. `confirm=true` gerekir.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id (Protected Storage)"
     },
     {
      "name": "bucket",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Bucket name (full name, with the -code suffix)"
     },
     {
      "name": "key",
      "in": "query",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Object key"
     },
     {
      "name": "version_id",
      "in": "query",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Version id"
     },
     {
      "name": "confirm",
      "in": "query",
      "required": true,
      "schema": {
       "type": "boolean"
      }
     }
    ],
    "responses": {
     "202": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "properties": {
            "bucket": {
             "type": "string"
            },
            "key": {
             "type": "string"
            },
            "version_id": {
             "type": "string"
            },
            "deleted": {
             "type": "boolean"
            },
            "message": {
             "type": "string"
            }
           }
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "description": "feature_not_available (standard Object Storage service) or not_actionable",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    }
   }
  },
  "/cloud/storage/{id}/buckets/{bucket}/versions/restore": {
   "post": {
    "tags": [
     "Object storage"
    ],
    "operationId": "restoreStorageVersion",
    "summary": "Restore an older version",
    "x-summary-tr": "Eski sürümü geri yükle",
    "x-scope": "services_write",
    "x-cli": {
     "command": "storage versions restore",
     "confirm": false
    },
    "description": "Copies the version as the new current version (the old one stays). Max 5 GB; delete markers cannot be restored (use undelete).",
    "x-description-tr": "Sürümü yeni güncel sürüm olarak kopyalar (eskisi durur). En çok 5 GB; silme işareti geri yüklenmez (undelete kullanın).",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id (Protected Storage)"
     },
     {
      "name": "bucket",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Bucket name (full name, with the -code suffix)"
     }
    ],
    "responses": {
     "202": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "properties": {
            "bucket": {
             "type": "string"
            },
            "key": {
             "type": "string"
            },
            "restored_from": {
             "type": "string"
            },
            "version_id": {
             "type": "string",
             "description": "New current version"
            },
            "message": {
             "type": "string"
            }
           }
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "description": "feature_not_available (standard Object Storage service) or not_actionable",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "key": {
          "type": "string",
          "description": "Object key"
         },
         "version_id": {
          "type": "string",
          "description": "Version id (from versions list)"
         }
        },
        "required": [
         "key",
         "version_id"
        ]
       }
      }
     }
    }
   }
  },
  "/cloud/storage/{id}/buckets/{bucket}/versions/undelete": {
   "post": {
    "tags": [
     "Object storage"
    ],
    "operationId": "undeleteStorageObject",
    "summary": "Remove a delete marker",
    "x-summary-tr": "Silme işaretini kaldır",
    "x-scope": "services_write",
    "x-cli": {
     "command": "storage versions undelete",
     "confirm": false
    },
    "description": "Removes the latest delete marker of the key, so the previous version becomes current again. `version_id` must be that delete marker.",
    "x-description-tr": "Anahtarın en güncel silme işaretini kaldırır; önceki sürüm yeniden güncel olur. `version_id` o silme işareti olmalıdır.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id (Protected Storage)"
     },
     {
      "name": "bucket",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Bucket name (full name, with the -code suffix)"
     }
    ],
    "responses": {
     "202": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "properties": {
            "bucket": {
             "type": "string"
            },
            "key": {
             "type": "string"
            },
            "removed_delete_marker": {
             "type": "string"
            },
            "message": {
             "type": "string"
            }
           }
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "description": "feature_not_available (standard Object Storage service) or not_actionable",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "key": {
          "type": "string",
          "description": "Object key"
         },
         "version_id": {
          "type": "string",
          "description": "Version id (from versions list)"
         }
        },
        "required": [
         "key",
         "version_id"
        ]
       }
      }
     }
    }
   }
  },
  "/cloud/storage/{id}/buckets/{bucket}/object-lock": {
   "get": {
    "tags": [
     "Object storage"
    ],
    "operationId": "getStorageBucketObjectLock",
    "summary": "Default retention of a bucket",
    "x-summary-tr": "Kovanın varsayılan saklaması",
    "x-scope": "services_read",
    "x-cli": {
     "command": "storage object-lock get",
     "confirm": false
    },
    "description": "`object_lock` (set at creation, cannot change) and `default_retention` (null = none): new objects get this retention automatically.",
    "x-description-tr": "`object_lock` (açılışta seçilir, değişmez) ve `default_retention` (null = yok): yeni nesneler bu saklamayı kendiliğinden alır.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id (Protected Storage)"
     },
     {
      "name": "bucket",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Bucket name (full name, with the -code suffix)"
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "$ref": "#/components/schemas/StorageBucketObjectLock"
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "description": "feature_not_available (standard Object Storage service) or not_actionable",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    }
   },
   "put": {
    "tags": [
     "Object storage"
    ],
    "operationId": "setStorageBucketObjectLock",
    "summary": "Set the default retention of a bucket",
    "x-summary-tr": "Kovanın varsayılan saklamasını ayarla",
    "x-scope": "services_write",
    "x-cli": {
     "command": "storage object-lock set",
     "confirm": true
    },
    "description": "Locked buckets only. `mode` GOVERNANCE or COMPLIANCE with `days` 1-3650, or OFF (new objects get no automatic retention; existing locks stay). GOVERNANCE: only Gyro staff can bypass it on request. COMPLIANCE cannot be shortened, switched to GOVERNANCE or removed by anyone (Gyro included) until it expires; the data is kept and the service keeps being billed until then, even after cancellation. Send `\"confirm\": true` and `\"acknowledge\": \"COMPLIANCE\"`.",
    "x-description-tr": "Yalnız kilitli kovalar. `mode` GOVERNANCE ya da COMPLIANCE ve `days` 1-3650, ya da OFF (yeni nesnelere otomatik saklama yok; mevcut kilitler sürer). GOVERNANCE: yalnız Gyro personeli talep üzerine aşabilir. COMPLIANCE kilidi süresi dolana kadar kimse (Gyro dahil) kısaltamaz, GOVERNANCE'a çeviremez, kaldıramaz; veri saklanır ve iptalde bile süre sonuna kadar ücret sürer. `\"confirm\": true` ve `\"acknowledge\": \"COMPLIANCE\"` gönderin.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id (Protected Storage)"
     },
     {
      "name": "bucket",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Bucket name (full name, with the -code suffix)"
     }
    ],
    "responses": {
     "202": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "$ref": "#/components/schemas/StorageBucketObjectLock"
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "description": "feature_not_available (standard Object Storage service) or not_actionable",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "mode": {
          "type": "string",
          "enum": [
           "GOVERNANCE",
           "COMPLIANCE",
           "OFF"
          ]
         },
         "days": {
          "type": "integer",
          "minimum": 1,
          "maximum": 3650,
          "description": "Retention days (not with OFF)"
         },
         "acknowledge": {
          "type": "string",
          "enum": [
           "COMPLIANCE"
          ],
          "description": "COMPLIANCE only: type COMPLIANCE to accept that it cannot be removed",
          "x-description-tr": "Yalnız COMPLIANCE: kaldırılamayacağını kabul için COMPLIANCE yazın"
         },
         "confirm": {
          "type": "boolean"
         }
        },
        "required": [
         "mode"
        ]
       }
      }
     }
    }
   }
  },
  "/cloud/storage/{id}/buckets/{bucket}/objects/retention": {
   "get": {
    "tags": [
     "Object storage"
    ],
    "operationId": "getStorageObjectRetention",
    "summary": "Retention of an object version",
    "x-summary-tr": "Nesne sürümünün saklaması",
    "x-scope": "services_read",
    "x-cli": {
     "command": "storage object retention get",
     "confirm": false
    },
    "description": "Lock mode, end date and legal hold of one version (`version_id` empty = current version).",
    "x-description-tr": "Bir sürümün kilit kipi, bitiş tarihi ve legal hold durumu (`version_id` boş = güncel sürüm).",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id (Protected Storage)"
     },
     {
      "name": "bucket",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Bucket name (full name, with the -code suffix)"
     },
     {
      "name": "key",
      "in": "query",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Object key"
     },
     {
      "name": "version_id",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Version id (empty = current)"
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "$ref": "#/components/schemas/StorageObjectRetention"
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "description": "feature_not_available (standard Object Storage service) or not_actionable",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    }
   },
   "put": {
    "tags": [
     "Object storage"
    ],
    "operationId": "setStorageObjectRetention",
    "summary": "Lock an object version",
    "x-summary-tr": "Nesne sürümünü kilitle",
    "x-scope": "services_write",
    "x-cli": {
     "command": "storage object retention set",
     "confirm": true
    },
    "description": "Sets or extends the retention of one version (`version_id` empty = current) for `days` 1-3650 from now. Retention can only be extended; COMPLIANCE cannot be switched to GOVERNANCE. COMPLIANCE cannot be shortened, switched to GOVERNANCE or removed by anyone (Gyro included) until it expires; the data is kept and the service keeps being billed until then, even after cancellation. Send `\"confirm\": true` and `\"acknowledge\": \"COMPLIANCE\"`.",
    "x-description-tr": "Bir sürümün saklamasını şimdiden itibaren `days` (1-3650) gün olarak koyar ya da uzatır (`version_id` boş = güncel). Saklama yalnız uzatılabilir; COMPLIANCE GOVERNANCE'a çevrilemez. COMPLIANCE kilidi süresi dolana kadar kimse (Gyro dahil) kısaltamaz, GOVERNANCE'a çeviremez, kaldıramaz; veri saklanır ve iptalde bile süre sonuna kadar ücret sürer. `\"confirm\": true` ve `\"acknowledge\": \"COMPLIANCE\"` gönderin.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id (Protected Storage)"
     },
     {
      "name": "bucket",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Bucket name (full name, with the -code suffix)"
     }
    ],
    "responses": {
     "202": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "$ref": "#/components/schemas/StorageObjectRetention"
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "description": "feature_not_available (standard Object Storage service) or not_actionable",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "key": {
          "type": "string"
         },
         "version_id": {
          "type": "string",
          "description": "Empty = current version"
         },
         "mode": {
          "type": "string",
          "enum": [
           "GOVERNANCE",
           "COMPLIANCE"
          ]
         },
         "days": {
          "type": "integer",
          "minimum": 1,
          "maximum": 3650
         },
         "acknowledge": {
          "type": "string",
          "enum": [
           "COMPLIANCE"
          ],
          "description": "COMPLIANCE only: type COMPLIANCE",
          "x-description-tr": "Yalnız COMPLIANCE: COMPLIANCE yazın"
         },
         "confirm": {
          "type": "boolean"
         }
        },
        "required": [
         "key",
         "mode",
         "days"
        ]
       }
      }
     }
    }
   }
  },
  "/cloud/storage/{id}/buckets/{bucket}/objects/legal-hold": {
   "get": {
    "tags": [
     "Object storage"
    ],
    "operationId": "getStorageObjectLegalHold",
    "summary": "Legal hold of an object version",
    "x-summary-tr": "Nesne sürümünün legal hold durumu",
    "x-scope": "services_read",
    "x-cli": {
     "command": "storage object legal-hold get",
     "confirm": false
    },
    "description": "`legal_hold` true = the version cannot be deleted until the hold is removed (no end date).",
    "x-description-tr": "`legal_hold` true = kaldırılana kadar sürüm silinemez (bitiş tarihi yok).",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id (Protected Storage)"
     },
     {
      "name": "bucket",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Bucket name (full name, with the -code suffix)"
     },
     {
      "name": "key",
      "in": "query",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Object key"
     },
     {
      "name": "version_id",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Version id (empty = current)"
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "properties": {
            "bucket": {
             "type": "string"
            },
            "key": {
             "type": "string"
            },
            "version_id": {
             "type": "string"
            },
            "legal_hold": {
             "type": "boolean"
            }
           }
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "description": "feature_not_available (standard Object Storage service) or not_actionable",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    }
   },
   "put": {
    "tags": [
     "Object storage"
    ],
    "operationId": "setStorageObjectLegalHold",
    "summary": "Place or remove a legal hold",
    "x-summary-tr": "Legal hold koy / kaldır",
    "x-scope": "services_write",
    "x-cli": {
     "command": "storage object legal-hold set",
     "confirm": false
    },
    "description": "`status` on / off (locked buckets only). A legal hold blocks deletion with no end date, independent of retention; you can remove it yourself.",
    "x-description-tr": "`status` on / off (yalnız kilitli kovalar). Legal hold, saklamadan bağımsız ve bitiş tarihsiz silmeyi engeller; kendiniz kaldırabilirsiniz.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id (Protected Storage)"
     },
     {
      "name": "bucket",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Bucket name (full name, with the -code suffix)"
     }
    ],
    "responses": {
     "202": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "properties": {
            "bucket": {
             "type": "string"
            },
            "key": {
             "type": "string"
            },
            "version_id": {
             "type": "string"
            },
            "legal_hold": {
             "type": "boolean"
            }
           }
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "description": "feature_not_available (standard Object Storage service) or not_actionable",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "key": {
          "type": "string"
         },
         "version_id": {
          "type": "string",
          "description": "Empty = current version"
         },
         "status": {
          "type": "string",
          "enum": [
           "on",
           "off"
          ]
         }
        },
        "required": [
         "key",
         "status"
        ]
       }
      }
     }
    }
   }
  },
  "/cloud/storage/{id}/buckets/{bucket}/lifecycle/noncurrent": {
   "get": {
    "tags": [
     "Object storage"
    ],
    "operationId": "getStorageNoncurrentExpiration",
    "summary": "Old version expiry of a bucket",
    "x-summary-tr": "Kovanın eski sürüm silme kuralı",
    "x-scope": "services_read",
    "x-cli": {
     "command": "storage lifecycle noncurrent get",
     "confirm": false
    },
    "description": "Days after which non-current versions are deleted (new buckets: 30). 0 / null = kept until you delete them (they count toward the quota).",
    "x-description-tr": "Eski (güncel olmayan) sürümlerin kaç gün sonra silineceği (yeni kovalarda 30). 0 / null = siz silene kadar durur (kotadan düşer).",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id (Protected Storage)"
     },
     {
      "name": "bucket",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Bucket name (full name, with the -code suffix)"
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "$ref": "#/components/schemas/StorageNoncurrentExpiration"
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "description": "feature_not_available (standard Object Storage service) or not_actionable",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    }
   },
   "put": {
    "tags": [
     "Object storage"
    ],
    "operationId": "setStorageNoncurrentExpiration",
    "summary": "Set old version expiry",
    "x-summary-tr": "Eski sürüm silme süresini ayarla",
    "x-scope": "services_write",
    "x-cli": {
     "command": "storage lifecycle noncurrent set",
     "confirm": false
    },
    "description": "`days` 1-3650, or 0 to keep old versions. Locked versions are deleted only after their retention ends. Other lifecycle rules of the bucket are kept.",
    "x-description-tr": "`days` 1-3650 ya da 0 (eski sürümler durur). Kilitli sürümler saklaması bitince silinir. Kovanın diğer yaşam döngüsü kuralları korunur.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Service id (Protected Storage)"
     },
     {
      "name": "bucket",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Bucket name (full name, with the -code suffix)"
     }
    ],
    "responses": {
     "202": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "$ref": "#/components/schemas/StorageNoncurrentExpiration"
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "description": "feature_not_available (standard Object Storage service) or not_actionable",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "days": {
          "type": "integer",
          "minimum": 0,
          "maximum": 3650
         }
        },
        "required": [
         "days"
        ]
       }
      }
     }
    }
   }
  },
  "/cloud/templates": {
   "get": {
    "tags": [
     "Templates"
    ],
    "operationId": "listTemplates",
    "summary": "List your templates",
    "x-summary-tr": "Şablonlarınızı listele",
    "x-scope": "cloud_read",
    "x-cli": {
     "command": "template list"
    },
    "description": "Billed 0.05 EUR per GB-month of the space the template really uses, hourly from the prepaid balance (through the account's template storage service, opened with the first template). Deleting a template stops its charge. At most 10 templates; visible only in your account. `meta` carries count, max, total_gb and pricing.",
    "x-description-tr": "Şablonun gerçekten kullandığı alan üzerinden GB başına aylık 0,05 € (ön ödemeli bakiyeden saatlik; ilk şablonla açılan şablon deposu hizmeti üzerinden). Silince ücret durur. En çok 10 şablon; yalnız sizin hesabınızda görünür. `meta`: adet, sınır, toplam GB, fiyat.",
    "parameters": [
     {
      "name": "page",
      "in": "query",
      "schema": {
       "type": "integer"
      }
     },
     {
      "name": "limit",
      "in": "query",
      "schema": {
       "type": "integer"
      }
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "array",
           "items": {
            "$ref": "#/components/schemas/Template"
           }
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "description": "template_limit, template_not_ready, busy",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    }
   }
  },
  "/cloud/templates/{id}": {
   "get": {
    "tags": [
     "Templates"
    ],
    "operationId": "getTemplate",
    "summary": "Get a template",
    "x-summary-tr": "Şablonu getir",
    "x-scope": "cloud_read",
    "x-cli": {
     "command": "template get"
    },
    "description": "Another account's template answers 404.",
    "x-description-tr": "Başka hesabın şablonu 404 döner.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Template id"
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "$ref": "#/components/schemas/Template"
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "description": "template_limit, template_not_ready, busy",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    }
   },
   "patch": {
    "tags": [
     "Templates"
    ],
    "operationId": "updateTemplate",
    "summary": "Rename a template",
    "x-summary-tr": "Şablonu yeniden adlandır",
    "x-scope": "cloud_write",
    "x-cli": {
     "command": "template update"
    },
    "description": "Name 1-60 characters (letters, digits, space . _ -).",
    "x-description-tr": "Ad 1-60 karakter (harf, rakam, boşluk . _ -).",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Template id"
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "$ref": "#/components/schemas/Template"
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "description": "template_limit, template_not_ready, busy",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "required": false,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "name": {
          "type": "string",
          "maxLength": 60
         },
         "description": {
          "type": "string",
          "maxLength": 200
         }
        },
        "required": []
       }
      }
     }
    }
   },
   "delete": {
    "tags": [
     "Templates"
    ],
    "operationId": "deleteTemplate",
    "summary": "Delete a template",
    "x-summary-tr": "Şablonu sil",
    "x-scope": "cloud_write",
    "x-cli": {
     "command": "template delete",
     "confirm": true
    },
    "description": "Permanent. Servers created from it are not affected; the charge stops from the next hour.",
    "x-description-tr": "Kalıcıdır. Şablondan açılmış sunucular etkilenmez; ücret sonraki saatten durur.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Template id"
     }
    ],
    "responses": {
     "202": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "properties": {
            "status": {
             "type": "string"
            },
            "template_id": {
             "type": "integer"
            }
           }
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "description": "template_limit, template_not_ready, busy",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    }
   }
  },
  "/cloud/servers/{id}/templates": {
   "post": {
    "tags": [
     "Templates"
    ],
    "operationId": "createTemplate",
    "summary": "Capture a server as a template",
    "x-summary-tr": "Sunucudan şablon oluştur",
    "x-scope": "cloud_write",
    "x-cli": {
     "command": "template create"
    },
    "description": "Billed 0.05 EUR per GB-month of the space the template really uses, hourly from the prepaid balance (through the account's template storage service, opened with the first template). Deleting a template stops its charge. At most 10 templates; visible only in your account. Only the root disk is copied. `mode: snapshot` (default) keeps the server running (file system frozen briefly via a temporary snapshot); `mode: shutdown` stops the server, copies it and starts it again. Servers created from the template get a new host name, IP, root password, SSH host keys and machine id (cloud-init); your users, files and settings stay. Linux servers only. Ready in about a minute (`status` creating -> ready).",
    "x-description-tr": "Şablonun gerçekten kullandığı alan üzerinden GB başına aylık 0,05 € (ön ödemeli bakiyeden saatlik; ilk şablonla açılan şablon deposu hizmeti üzerinden). Silince ücret durur. En çok 10 şablon; yalnız sizin hesabınızda görünür. Yalnız kök disk alınır. `mode: snapshot` (varsayılan) sunucu açık kalır (geçici anlık görüntü, dosya sistemi kısa süre dondurulur); `mode: shutdown` sunucuyu kapatıp kopyalar ve yeniden açar. Şablondan açılan sunucularda sunucu adı, IP, root parolası, SSH sunucu anahtarları ve makine kimliği yenilenir; kullanıcılarınız, dosyalarınız ve ayarlarınız kalır. Yalnız Linux. Yaklaşık bir dakikada hazır.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Server id (tr-ist-1)"
     }
    ],
    "responses": {
     "202": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "properties": {
            "status": {
             "type": "string"
            },
            "server_id": {
             "type": "integer"
            },
            "template": {
             "$ref": "#/components/schemas/Template"
            }
           }
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "description": "template_limit, template_not_ready, busy",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "required": false,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "name": {
          "type": "string",
          "maxLength": 60
         },
         "description": {
          "type": "string",
          "maxLength": 200
         },
         "mode": {
          "type": "string",
          "enum": [
           "snapshot",
           "shutdown"
          ]
         }
        },
        "required": []
       }
      }
     }
    }
   }
  },
  "/cloud/templates/{id}/servers": {
   "post": {
    "tags": [
     "Templates"
    ],
    "operationId": "createServerFromTemplate",
    "summary": "New server from a template",
    "x-summary-tr": "Şablondan yeni sunucu",
    "x-scope": "cloud_order",
    "x-cli": {
     "command": "template deploy",
     "money": true
    },
    "description": "A normal prepaid tr-ist-1 order (24-hour balance rule, account limits) installed from the template. `product_id` (or `plan`) from GET /cloud/products?region=tr-ist-1; its disk must be at least the template `min_disk_gb`. Send `\"confirm\": true` and an `Idempotency-Key` header (`dry_run` for a quote).",
    "x-description-tr": "Şablondan kurulan normal ön ödemeli tr-ist-1 siparişi (24 saat bakiye kuralı, hesap sınırları). `product_id` (ya da `plan`) GET /cloud/products?region=tr-ist-1'den; diski şablonun `min_disk_gb` değerinden küçük olamaz. `\"confirm\": true` ve `Idempotency-Key` başlığı gerekir (teklif için `dry_run`).",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Template id"
     }
    ],
    "responses": {
     "202": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "$ref": "#/components/schemas/CreateServerResult"
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "description": "template_limit, template_not_ready, busy",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "description": "confirm_required | limit_exceeded (new-account limit of the prepaid cloud; details = LimitHint, raise it with a support ticket) | validation errors",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "requestBody": {
     "required": false,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "product_id": {
          "type": "integer"
         },
         "plan": {
          "type": "string"
         },
         "hostname": {
          "type": "string"
         },
         "ssh_keys": {
          "type": "array",
          "items": {
           "type": "integer"
          }
         },
         "user_data": {
          "type": "string"
         },
         "confirm": {
          "type": "boolean"
         },
         "dry_run": {
          "type": "boolean"
         },
         "project_id": {
          "type": "integer",
          "minimum": 0,
          "description": "Optional project for the new service(s) (0 = default project). Checked before the order: unknown id = 404 `project_not_found` (GyroAPI order endpoints) or 422 `checkout_blocked` with `[project_not_found]` (POST /orders)."
         }
        },
        "required": []
       }
      }
     }
    }
   }
  },
  "/cloud/templates/{id}/rebuild": {
   "post": {
    "tags": [
     "Templates"
    ],
    "operationId": "rebuildFromTemplate",
    "summary": "Reinstall a server from a template",
    "x-summary-tr": "Sunucuyu şablonla yeniden kur",
    "x-scope": "cloud_write",
    "x-cli": {
     "command": "template rebuild",
     "confirm": true
    },
    "description": "Overwrites the root disk of one of your tr-ist-1 servers with the template (its disk must be at least `min_disk_gb`); the server's SSH keys are installed again and a new root password is returned (withheld when an Idempotency-Key is sent). Needs `\"confirm\": true`.",
    "x-description-tr": "tr-ist-1 sunucunuzun kök diskini şablonla değiştirir (disk en az `min_disk_gb` olmalı); sunucunun SSH anahtarları yeniden kurulur, yeni root parolası döner (Idempotency-Key gönderilirse dönmez). `\"confirm\": true` gerekir.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Template id"
     }
    ],
    "responses": {
     "202": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "properties": {
            "action": {
             "type": "string"
            },
            "status": {
             "type": "string"
            },
            "server_id": {
             "type": "integer"
            },
            "template_id": {
             "type": "integer"
            },
            "root_password": {
             "type": "string"
            },
            "root_password_withheld": {
             "type": "boolean"
            }
           }
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "description": "template_limit, template_not_ready, busy",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    },
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "server_id": {
          "type": "integer"
         },
         "user_data": {
          "type": "string"
         },
         "confirm": {
          "type": "boolean"
         }
        },
        "required": [
         "server_id",
         "confirm"
        ]
       }
      }
     }
    }
   }
  },
  "/cloud/servers/{id}/ips": {
   "get": {
    "tags": [
     "Networking"
    ],
    "operationId": "listServerIps",
    "summary": "List the server's IPv4 addresses",
    "x-summary-tr": "Sunucunun IPv4 adresleri",
    "x-scope": "cloud_read",
    "x-cli": {
     "command": "server ip list"
    },
    "description": "**Minimum charge:** each added IP is billed for at least 6 hours (`pricing.minimum_hours`): releasing it earlier still bills the minimum (debited at release), and taking the same address again starts a new minimum. At most `adds_per_hour` addresses (default 10) can be added to a server per 60 minutes. Additional IPv4 addresses are billed per address hourly from the prepaid balance (default 2 EUR per address-month, `pricing` shows the current price), from the hour they are added until they are released. Up to `max` per server (default 5). Each address is configured on the server automatically (/32 on the primary interface, kept across reboots and reinstalls); reverse DNS: PUT /cloud/servers/{id}/rdns. ",
    "x-description-tr": "**Asgari ücret:** her eklenen IP en az 6 saat ücretlendirilir (`pricing.minimum_hours`): daha erken bırakılsa da asgari süre (bırakırken) düşülür; aynı adresi yeniden almak yeni bir asgari süre başlatır. Bir sunucuya 60 dakikada en çok `adds_per_hour` (varsayılan 10) adres eklenebilir. Ek IPv4 adresleri adres başına ön ödemeli bakiyeden saatlik ücretlendirilir (varsayılan adres başına aylık 2 €, güncel fiyat `pricing` alanında); eklendiği saatten çıkarıldığı saate kadar. Sunucu başına en çok `max` (varsayılan 5). Adres sunucuya otomatik tanımlanır (birincil arayüze /32, yeniden başlatma ve yeniden kurulumda korunur); ters DNS: PUT /cloud/servers/{id}/rdns. ",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Server id (tr-ist-1)"
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "$ref": "#/components/schemas/ServerIps"
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "description": "not_actionable (suspended / busy)",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     },
     "501": {
      "description": "not_supported (not a tr-ist-1 Gyro Compute server)",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    }
   },
   "post": {
    "tags": [
     "Networking"
    ],
    "operationId": "addServerIps",
    "summary": "Add additional IPv4 addresses",
    "x-summary-tr": "Ek IPv4 adresi ekle",
    "x-scope": "cloud_write",
    "x-cli": {
     "command": "server ip add",
     "money": true
    },
    "description": "**Minimum charge:** each added IP is billed for at least 6 hours (`pricing.minimum_hours`): releasing it earlier still bills the minimum (debited at release), and taking the same address again starts a new minimum. At most `adds_per_hour` addresses (default 10) can be added to a server per 60 minutes. Additional IPv4 addresses are billed per address hourly from the prepaid balance (default 2 EUR per address-month, `pricing` shows the current price), from the hour they are added until they are released. Up to `max` per server (default 5). Each address is configured on the server automatically (/32 on the primary interface, kept across reboots and reinstalls); reverse DNS: PUT /cloud/servers/{id}/rdns. Prepaid tr-ist-1 servers only; not while the server is suspended.",
    "x-description-tr": "**Asgari ücret:** her eklenen IP en az 6 saat ücretlendirilir (`pricing.minimum_hours`): daha erken bırakılsa da asgari süre (bırakırken) düşülür; aynı adresi yeniden almak yeni bir asgari süre başlatır. Bir sunucuya 60 dakikada en çok `adds_per_hour` (varsayılan 10) adres eklenebilir. Ek IPv4 adresleri adres başına ön ödemeli bakiyeden saatlik ücretlendirilir (varsayılan adres başına aylık 2 €, güncel fiyat `pricing` alanında); eklendiği saatten çıkarıldığı saate kadar. Sunucu başına en çok `max` (varsayılan 5). Adres sunucuya otomatik tanımlanır (birincil arayüze /32, yeniden başlatma ve yeniden kurulumda korunur); ters DNS: PUT /cloud/servers/{id}/rdns. Yalnız ön ödemeli tr-ist-1 sunucuları; askıdayken eklenemez.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Server id (tr-ist-1)"
     }
    ],
    "requestBody": {
     "required": false,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "count": {
          "type": "integer",
          "minimum": 1,
          "maximum": 16,
          "default": 1
         }
        }
       }
      }
     }
    },
    "responses": {
     "201": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "$ref": "#/components/schemas/ServerIps"
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "description": "not_actionable (suspended / busy)",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     },
     "501": {
      "description": "not_supported (not a tr-ist-1 Gyro Compute server)",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    }
   }
  },
  "/cloud/servers/{id}/ips/{ip}": {
   "delete": {
    "tags": [
     "Networking"
    ],
    "operationId": "removeServerIp",
    "summary": "Release an additional IPv4 address",
    "x-summary-tr": "Ek IPv4 adresini bırak",
    "x-scope": "cloud_write",
    "x-cli": {
     "command": "server ip remove",
     "confirm": true
    },
    "description": "**Minimum charge:** each added IP is billed for at least 6 hours (`pricing.minimum_hours`): releasing it earlier still bills the minimum (debited at release), and taking the same address again starts a new minimum. At most `adds_per_hour` addresses (default 10) can be added to a server per 60 minutes. The address is removed from the server and returns to the pool (getting the same address back is not guaranteed); billing stops at release (the minimum still applies). Needs `confirm=true`.",
    "x-description-tr": "**Asgari ücret:** her eklenen IP en az 6 saat ücretlendirilir (`pricing.minimum_hours`): daha erken bırakılsa da asgari süre (bırakırken) düşülür; aynı adresi yeniden almak yeni bir asgari süre başlatır. Bir sunucuya 60 dakikada en çok `adds_per_hour` (varsayılan 10) adres eklenebilir. Adres sunucudan kaldırılır ve havuza döner (aynı adresi geri alma garantisi yok); ücret bırakınca durur (asgari süre yine uygulanır). `confirm=true` gerekir.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Server id (tr-ist-1)"
     },
     {
      "name": "ip",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      }
     },
     {
      "name": "confirm",
      "in": "query",
      "required": true,
      "schema": {
       "type": "boolean"
      }
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "$ref": "#/components/schemas/ServerIps"
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "description": "not_actionable (suspended / busy)",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     },
     "501": {
      "description": "not_supported (not a tr-ist-1 Gyro Compute server)",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    }
   }
  },
  "/cloud/billing/container-sizes": {
   "get": {
    "operationId": "getContainerSizes",
    "tags": [
     "Billing"
    ],
    "summary": "Serverless container sizes (vCPU / memory pairs) and prices",
    "x-summary-tr": "Sunucusuz kapsayıcı boyutları (vCPU / bellek) ve fiyatları",
    "description": "Gyro Containers Serverless bills each running container copy per hour: `cpu_m/1000` x vCPU-hour + `memory_mi/1024` x GB-hour, from the prepaid balance, no monthly cap. Only the `cpu_m` / `memory_mi` pairs listed here are accepted on `POST /cloud/containers/{id}/services` of a serverless environment (422 `invalid_cpu` / `invalid_memory`). 404 `serverless_not_available` when the product is not offered.",
    "x-description-tr": "Gyro Kapsayıcı Sunucusuz her çalışan kopyayı saatlik ücretlendirir: `cpu_m/1000` x vCPU-saat + `memory_mi/1024` x GB-saat, ön ödemeli bakiyeden, aylık tavan yok. Sunucusuz ortamda `POST /cloud/containers/{id}/services` yalnız burada listelenen `cpu_m` / `memory_mi` çiftlerini kabul eder (422 `invalid_cpu` / `invalid_memory`).",
    "x-scope": "billing_read",
    "x-provided-by": "GyroKredi",
    "x-cli": {
     "command": "container sizes"
    },
    "responses": {
     "200": {
      "description": "Sizes",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "$ref": "#/components/schemas/ContainerSizes"
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     }
    }
   }
  },
  "/cloud/servers/{id}/storage-mounts": {
   "get": {
    "tags": [
     "Object storage"
    ],
    "operationId": "listStorageMounts",
    "summary": "List object storage mounts of a server",
    "x-summary-tr": "Sunucuya bağlı kovalar",
    "x-scope": "cloud_read",
    "x-cli": {
     "command": "server storage-mount list"
    },
    "description": "Mount a bucket of your Gyro Object Storage service on a Linux server (systemd) as a folder (rclone FUSE mount with a local write cache, starts on boot, reconnects). Each mount gets its own access key limited to that one bucket (read-only or read/write); it does not use your key limit and is deleted with the mount. Gyro Cloud Istanbul (tr-ist-1) servers apply it automatically (`automatic: true`); other servers run `install_command` once. Free; S3 traffic counts towards the storage service. Protected Storage buckets: read-only by default (2.20.0). Supported servers: Gyro Cloud (Istanbul and EU), Turkey VDS, dedicated servers.",
    "x-description-tr": "Nesne Depolama hizmetinizdeki bir kovayı Linux sunucunuza (systemd) klasör olarak bağlar (rclone FUSE, yerel yazma önbelleği, açılışta başlar, kopunca yeniden bağlanır). Her bağlantının yalnız o kovaya yetkili (salt okuma ya da okuma/yazma) ayrı bir erişim anahtarı vardır; anahtar sınırınızdan düşmez, bağlantıyla birlikte silinir. Gyro Bulut İstanbul (tr-ist-1) sunucularında otomatik uygulanır (`automatic: true`); diğer sunucularda `install_command` bir kez çalıştırılır. Ücretsizdir; S3 trafiği depolama hizmetinden sayılır. Korumalı Depolama kovaları: varsayılan salt okuma (2.20.0).",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Server service id"
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "properties": {
            "storage_mounts": {
             "type": "array",
             "items": {
              "$ref": "#/components/schemas/StorageMount"
             }
            }
           }
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "description": "server_not_active | storage_not_active | limit | mount_point_in_use | mount_point_nested | not_live",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     },
     "429": {
      "description": "rate_limited"
     },
     "503": {
      "description": "storage_mount_unavailable"
     }
    }
   },
   "post": {
    "tags": [
     "Object storage"
    ],
    "operationId": "createStorageMount",
    "summary": "Mount a bucket on the server",
    "x-summary-tr": "Kovayı sunucuya bağla",
    "x-scope": "cloud_write",
    "x-cli": {
     "command": "server storage-mount create"
    },
    "description": "Mount a bucket of your Gyro Object Storage service on a Linux server (systemd) as a folder (rclone FUSE mount with a local write cache, starts on boot, reconnects). Each mount gets its own access key limited to that one bucket (read-only or read/write); it does not use your key limit and is deleted with the mount. Gyro Cloud Istanbul (tr-ist-1) servers apply it automatically (`automatic: true`); other servers run `install_command` once. Free; S3 traffic counts towards the storage service. Supported servers: Gyro Cloud (Istanbul and EU), Turkey VDS, dedicated servers. The answer carries `install_command` (single use, 60 minutes). **Protected Storage (2.20.0):** supported; read-only unless `read_only: false` together with `accept_versioning: true`.",
    "x-description-tr": "Nesne Depolama hizmetinizdeki bir kovayı Linux sunucunuza (systemd) klasör olarak bağlar (rclone FUSE, yerel yazma önbelleği, açılışta başlar, kopunca yeniden bağlanır). Her bağlantının yalnız o kovaya yetkili (salt okuma ya da okuma/yazma) ayrı bir erişim anahtarı vardır; anahtar sınırınızdan düşmez, bağlantıyla birlikte silinir. Gyro Bulut İstanbul (tr-ist-1) sunucularında otomatik uygulanır (`automatic: true`); diğer sunucularda `install_command` bir kez çalıştırılır. Ücretsizdir; S3 trafiği depolama hizmetinden sayılır.  Yanıtta `install_command` döner (tek kullanımlık, 60 dakika). **Korumalı Depolama (2.20.0):** desteklenir; `read_only: false` ve `accept_versioning: true` verilmedikçe salt okuma bağlanır.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Server service id"
     }
    ],
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "required": [
         "storage_service_id",
         "bucket"
        ],
        "properties": {
         "storage_service_id": {
          "type": "integer",
          "description": "your active Object Storage service"
         },
         "bucket": {
          "type": "string",
          "description": "bucket name in that service",
          "example": "backups"
         },
         "mount_point": {
          "type": "string",
          "description": "absolute path under /mnt, /srv, /data, /media, /opt, /home or /var/www; default /mnt/<bucket>. Must be empty or missing on the server.",
          "example": "/mnt/backups"
         },
         "read_only": {
          "type": "boolean",
          "description": "Default: false on Object Storage, **true on Protected Storage**."
         },
         "accept_versioning": {
          "type": "boolean",
          "default": false,
          "description": "Protected Storage read/write only: confirms that every write/overwrite creates a new version, deletes only add a delete marker, locked files cannot be deleted and used space/cost grow. Without it: 422 versioning_ack_required."
         }
        }
       }
      }
     }
    },
    "responses": {
     "202": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "properties": {
            "storage_mount": {
             "$ref": "#/components/schemas/StorageMount"
            }
           }
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "description": "server_not_active | storage_not_active | limit | mount_point_in_use | mount_point_nested | not_live",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "description": "invalid_bucket | invalid_mount_point | versioning_ack_required (Protected Storage read/write without accept_versioning) | storage_error"
     },
     "429": {
      "description": "rate_limited"
     },
     "503": {
      "description": "storage_mount_unavailable"
     }
    }
   }
  },
  "/cloud/servers/{id}/storage-mounts/{mid}": {
   "get": {
    "tags": [
     "Object storage"
    ],
    "operationId": "getStorageMount",
    "summary": "Get one storage mount",
    "x-summary-tr": "Bağlantı ayrıntısı",
    "x-scope": "cloud_read",
    "x-cli": {
     "command": "server storage-mount get"
    },
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Server service id"
     },
     {
      "name": "mid",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Storage mount id"
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "properties": {
            "storage_mount": {
             "$ref": "#/components/schemas/StorageMount"
            }
           }
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "description": "server_not_active | storage_not_active | limit | mount_point_in_use | mount_point_nested | not_live",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     },
     "429": {
      "description": "rate_limited"
     },
     "503": {
      "description": "storage_mount_unavailable"
     }
    }
   },
   "delete": {
    "tags": [
     "Object storage"
    ],
    "operationId": "deleteStorageMount",
    "summary": "Remove a storage mount",
    "x-summary-tr": "Bağlantıyı kaldır",
    "x-scope": "cloud_write",
    "x-cli": {
     "command": "server storage-mount remove",
     "confirm": true
    },
    "description": "The mount key is deleted at once (the server can no longer reach the bucket; files in the bucket are kept). tr-ist-1 servers remove the unit automatically; on others run `remove_command`.",
    "x-description-tr": "Bağlantı anahtarı hemen silinir (sunucu kovaya erişemez; kovadaki dosyalar silinmez). tr-ist-1 sunucularında birim otomatik kaldırılır; diğerlerinde `remove_command` çalıştırın.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Server service id"
     },
     {
      "name": "mid",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Storage mount id"
     }
    ],
    "responses": {
     "202": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "properties": {
            "storage_mount": {
             "$ref": "#/components/schemas/StorageMount"
            }
           }
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "description": "server_not_active | storage_not_active | limit | mount_point_in_use | mount_point_nested | not_live",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     },
     "429": {
      "description": "rate_limited"
     },
     "503": {
      "description": "storage_mount_unavailable"
     }
    }
   }
  },
  "/cloud/servers/{id}/storage-mounts/{mid}/command": {
   "post": {
    "tags": [
     "Object storage"
    ],
    "operationId": "renewStorageMountCommand",
    "summary": "New install command (rotates the mount key)",
    "x-summary-tr": "Yeni kurulum komutu (bağlantı anahtarı yenilenir)",
    "x-scope": "cloud_write",
    "x-cli": {
     "command": "server storage-mount command"
    },
    "description": "Creates a new access key for the mount and a new single-use install command (the old key stops at once). Use after reinstalling the server or when the command expired.",
    "x-description-tr": "Bağlantı için yeni erişim anahtarı ve yeni tek kullanımlık komut üretir (eski anahtar hemen durur). Sunucu yeniden kurulduğunda ya da komutun süresi dolduğunda kullanın.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Server service id"
     },
     {
      "name": "mid",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Storage mount id"
     }
    ],
    "responses": {
     "202": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "properties": {
            "storage_mount": {
             "$ref": "#/components/schemas/StorageMount"
            }
           }
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "description": "server_not_active | storage_not_active | limit | mount_point_in_use | mount_point_nested | not_live",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     },
     "429": {
      "description": "rate_limited"
     },
     "503": {
      "description": "storage_mount_unavailable"
     }
    }
   }
  },
  "/cloud/projects": {
   "get": {
    "tags": [
     "Projects"
    ],
    "operationId": "listProjects",
    "summary": "List projects",
    "x-summary-tr": "Projeleri listele",
    "x-scope": "services_read",
    "description": "Your projects; the default project (id 0) is always first. Counts follow the key's service scope.",
    "x-description-tr": "Projeleriniz; varsayılan proje (id 0) her zaman ilk sırada. Sayılar anahtarın hizmet kapsamına göredir.",
    "responses": {
     "200": {
      "description": "Projects",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "array",
           "items": {
            "$ref": "#/components/schemas/Project"
           }
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     }
    },
    "x-cli": {
     "command": "project list"
    }
   },
   "post": {
    "tags": [
     "Projects"
    ],
    "operationId": "createProject",
    "summary": "Create a project",
    "x-summary-tr": "Proje oluştur",
    "x-scope": "services_write",
    "description": "At most 50 projects per account (409 `project_limit`). Optional `service_ids` move services in at once. Writes: 60 per minute per key (429 `rate_limited`). Sub-account keys cannot create, rename or delete projects (403 `subkey_forbidden`). Errors: 422 `invalid_name`, `name_reserved`, `invalid_color`, `invalid_icon`, `invalid_description`, `invalid_service_ids`; 409 `name_taken`; 404 `service_not_found`.",
    "x-description-tr": "Hesap başına en çok 50 proje (409 `project_limit`). İsteğe bağlı `service_ids` hizmetleri hemen taşır. Yazma: anahtar başına dakikada 60 (429 `rate_limited`). Alt hesap anahtarları proje oluşturamaz, yeniden adlandıramaz, silemez (403 `subkey_forbidden`).",
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/ProjectCreate"
       },
       "example": {
        "name": "Gyro Proje",
        "color": "blue",
        "icon": "rocket-takeoff",
        "service_ids": [
         12345
        ]
       }
      }
     }
    },
    "responses": {
     "201": {
      "description": "Created",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "$ref": "#/components/schemas/Project"
          }
         }
        }
       }
      }
     },
     "409": {
      "description": "name_taken / project_limit"
     },
     "422": {
      "description": "Validation error"
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "429": {
      "$ref": "#/components/responses/RateLimited"
     }
    },
    "x-cli": {
     "command": "project create"
    }
   }
  },
  "/cloud/projects/{id}": {
   "parameters": [
    {
     "name": "id",
     "in": "path",
     "required": true,
     "schema": {
      "type": "integer",
      "minimum": 0
     },
     "description": "Project id (0 = default project)"
    }
   ],
   "get": {
    "tags": [
     "Projects"
    ],
    "operationId": "getProject",
    "summary": "Get a project with its service ids",
    "x-summary-tr": "Projeyi hizmet numaralarıyla getir",
    "x-scope": "services_read",
    "description": "Another account's project answers 404 `project_not_found`.",
    "x-description-tr": "Başka hesabın projesi 404 `project_not_found` döner.",
    "responses": {
     "200": {
      "description": "Project",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "$ref": "#/components/schemas/Project"
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "429": {
      "$ref": "#/components/responses/RateLimited"
     }
    },
    "x-cli": {
     "command": "project get"
    }
   },
   "patch": {
    "tags": [
     "Projects"
    ],
    "operationId": "updateProject",
    "summary": "Rename / recolour a project",
    "x-summary-tr": "Projeyi yeniden adlandır / renklendir",
    "x-scope": "services_write",
    "description": "Send any of name, description, color, icon. The default project cannot be changed (409 `default_project`). Writes: 60 per minute per key (429 `rate_limited`). Sub-account keys cannot create, rename or delete projects (403 `subkey_forbidden`).",
    "x-description-tr": "name, description, color, icon alanlarından istediğinizi gönderin. Varsayılan proje değiştirilemez (409 `default_project`). Yazma: anahtar başına dakikada 60 (429 `rate_limited`). Alt hesap anahtarları proje oluşturamaz, yeniden adlandıramaz, silemez (403 `subkey_forbidden`).",
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/ProjectUpdate"
       }
      }
     }
    },
    "responses": {
     "200": {
      "description": "Updated",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "$ref": "#/components/schemas/Project"
          }
         }
        }
       }
      }
     },
     "409": {
      "description": "name_taken / default_project"
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "429": {
      "$ref": "#/components/responses/RateLimited"
     }
    },
    "x-cli": {
     "command": "project rename"
    }
   },
   "delete": {
    "tags": [
     "Projects"
    ],
    "operationId": "deleteProject",
    "summary": "Delete a project",
    "x-summary-tr": "Projeyi sil",
    "x-scope": "services_write",
    "description": "Only the project is deleted: its services go back to the default project, nothing else changes. Writes: 60 per minute per key (429 `rate_limited`). Sub-account keys cannot create, rename or delete projects (403 `subkey_forbidden`).",
    "x-description-tr": "Yalnız proje silinir: hizmetleri varsayılan projeye döner, başka hiçbir şey değişmez. Yazma: anahtar başına dakikada 60 (429 `rate_limited`). Alt hesap anahtarları proje oluşturamaz, yeniden adlandıramaz, silemez (403 `subkey_forbidden`).",
    "responses": {
     "200": {
      "description": "Deleted",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "properties": {
            "id": {
             "type": "integer"
            },
            "deleted": {
             "type": "boolean"
            },
            "moved_to_default": {
             "type": "integer"
            }
           }
          }
         }
        }
       }
      }
     },
     "409": {
      "description": "default_project"
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "429": {
      "$ref": "#/components/responses/RateLimited"
     }
    },
    "x-cli": {
     "command": "project delete",
     "confirm": true
    }
   }
  },
  "/cloud/projects/{id}/services": {
   "parameters": [
    {
     "name": "id",
     "in": "path",
     "required": true,
     "schema": {
      "type": "integer",
      "minimum": 0
     },
     "description": "Project id (0 = default project)"
    }
   ],
   "post": {
    "tags": [
     "Projects"
    ],
    "operationId": "moveServicesToProject",
    "summary": "Move services into a project",
    "x-summary-tr": "Hizmetleri projeye taşı",
    "x-scope": "services_write",
    "description": "All ids must be your services within the key's scope, else 404 `service_not_found` and nothing moves. Up to 500 per call; id 0 = default project. Sub-account keys need the `project:move` action. Writes: 60 per minute per key (429 `rate_limited`).",
    "x-description-tr": "Tüm numaralar anahtarın kapsamındaki hizmetleriniz olmalı, yoksa 404 `service_not_found` ve hiçbir şey taşınmaz. Çağrı başına en çok 500; id 0 = varsayılan proje. Alt hesap anahtarı `project:move` eylemi ister.",
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "required": [
         "service_ids"
        ],
        "properties": {
         "service_ids": {
          "type": "array",
          "maxItems": 500,
          "items": {
           "type": "integer"
          }
         }
        }
       },
       "example": {
        "service_ids": [
         12345,
         12346
        ]
       }
      }
     }
    },
    "responses": {
     "200": {
      "description": "Moved",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "properties": {
            "project_id": {
             "type": "integer"
            },
            "moved": {
             "type": "integer"
            },
            "service_ids": {
             "type": "array",
             "items": {
              "type": "integer"
             }
            }
           }
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "429": {
      "$ref": "#/components/responses/RateLimited"
     }
    },
    "x-cli": {
     "command": "project move"
    }
   }
  },
  "/cloud/services/{id}/project": {
   "parameters": [
    {
     "name": "id",
     "in": "path",
     "required": true,
     "schema": {
      "type": "integer"
     },
     "description": "Service id"
    }
   ],
   "put": {
    "tags": [
     "Projects"
    ],
    "operationId": "setServiceProject",
    "summary": "Set the project of a service",
    "x-summary-tr": "Hizmetin projesini ayarla",
    "x-scope": "services_write",
    "description": "`project_id` 0 = default project. Answers the service (with `project`). Sub-account keys need the `project:move` action.",
    "x-description-tr": "`project_id` 0 = varsayılan proje. Hizmeti (`project` ile) döner. Alt hesap anahtarı `project:move` eylemi ister.",
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "required": [
         "project_id"
        ],
        "properties": {
         "project_id": {
          "type": "integer",
          "minimum": 0
         }
        }
       }
      }
     }
    },
    "responses": {
     "200": {
      "description": "Service",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "$ref": "#/components/schemas/Service"
          }
         }
        }
       }
      }
     },
     "422": {
      "description": "project_id_required / invalid_project_id"
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "429": {
      "$ref": "#/components/responses/RateLimited"
     }
    },
    "x-cli": {
     "command": "service project set"
    }
   }
  },
  "/cloud/servers/{id}/disks": {
   "get": {
    "tags": [
     "Servers"
    ],
    "operationId": "listServerDisks",
    "summary": "List the server's additional disks",
    "x-summary-tr": "Sunucunun ek diskleri",
    "x-scope": "cloud_read",
    "x-cli": {
     "command": "server disk list"
    },
    "description": "Two classes: `ssd` (fast) and `hdd` (large storage for backups, archives and media; do not run databases on it). Additional disks are billed per GB hourly from the prepaid balance (`classes.<class>.per_gb_monthly_eur`, monthly / 672), from the hour they are added until they are removed; each disk at least `pricing.minimum_hours`. Up to 4 disks per server and `classes.<class>.max_gb` GB per class; sizes are multiples of `step_gb`. A new disk is empty (partition, format and mount it inside the server). Reinstalling the server removes the additional disks. ",
    "x-description-tr": "İki sınıf: `ssd` (hızlı) ve `hdd` (yedek, arşiv, medya için büyük depolama; veritabanı için kullanmayın). Ek diskler GB başına ön ödemeli bakiyeden saatlik ücretlendirilir (`classes.<sınıf>.per_gb_monthly_eur`, aylık / 672); eklendiği saatten silindiği saate kadar, her disk en az `pricing.minimum_hours` saat. Sunucu başına en çok 4 disk ve sınıf başına `classes.<sınıf>.max_gb` GB; boyutlar `step_gb` katları. Yeni disk boştur (sunucu içinde bölümlendirip biçimlendirin ve bağlayın). Yeniden kurulum ek diskleri siler. ",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Server id (tr-ist-1)"
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "$ref": "#/components/schemas/ServerDisks"
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "description": "not_actionable (suspended / busy / snapshots exist)",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     },
     "501": {
      "description": "not_supported (not a tr-ist-1 Gyro Compute server)",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    }
   },
   "post": {
    "tags": [
     "Servers"
    ],
    "operationId": "addServerDisk",
    "summary": "Add an additional disk",
    "x-summary-tr": "Ek disk ekle",
    "x-scope": "cloud_write",
    "x-cli": {
     "command": "server disk add",
     "money": true
    },
    "description": "Two classes: `ssd` (fast) and `hdd` (large storage for backups, archives and media; do not run databases on it). Additional disks are billed per GB hourly from the prepaid balance (`classes.<class>.per_gb_monthly_eur`, monthly / 672), from the hour they are added until they are removed; each disk at least `pricing.minimum_hours`. Up to 4 disks per server and `classes.<class>.max_gb` GB per class; sizes are multiples of `step_gb`. A new disk is empty (partition, format and mount it inside the server). Reinstalling the server removes the additional disks. Prepaid tr-ist-1 servers only; not while the server is suspended.",
    "x-description-tr": "İki sınıf: `ssd` (hızlı) ve `hdd` (yedek, arşiv, medya için büyük depolama; veritabanı için kullanmayın). Ek diskler GB başına ön ödemeli bakiyeden saatlik ücretlendirilir (`classes.<sınıf>.per_gb_monthly_eur`, aylık / 672); eklendiği saatten silindiği saate kadar, her disk en az `pricing.minimum_hours` saat. Sunucu başına en çok 4 disk ve sınıf başına `classes.<sınıf>.max_gb` GB; boyutlar `step_gb` katları. Yeni disk boştur (sunucu içinde bölümlendirip biçimlendirin ve bağlayın). Yeniden kurulum ek diskleri siler. Yalnız ön ödemeli tr-ist-1 sunucuları; askıdayken eklenemez.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Server id (tr-ist-1)"
     }
    ],
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "required": [
         "size_gb"
        ],
        "properties": {
         "size_gb": {
          "type": "integer",
          "minimum": 10,
          "maximum": 4000,
          "multipleOf": 10
         },
         "class": {
          "type": "string",
          "enum": [
           "ssd",
           "hdd"
          ],
          "default": "ssd",
          "description": "ssd (fast) or hdd (large storage; see classes.hdd.on_sale)"
         }
        }
       }
      }
     }
    },
    "responses": {
     "201": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "$ref": "#/components/schemas/ServerDisks"
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "description": "not_actionable (suspended / busy / snapshots exist)",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     },
     "501": {
      "description": "not_supported (not a tr-ist-1 Gyro Compute server)",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    }
   }
  },
  "/cloud/servers/{id}/disks/{disk}": {
   "put": {
    "tags": [
     "Servers"
    ],
    "operationId": "resizeServerDisk",
    "summary": "Grow an additional disk",
    "x-summary-tr": "Ek diski büyüt",
    "x-scope": "cloud_write",
    "x-cli": {
     "command": "server disk resize",
     "money": true
    },
    "description": "Grows the disk to `size_gb` (never shrinks; not while snapshots exist). Extend the partition / file system inside the server afterwards.",
    "x-description-tr": "Diski `size_gb` boyutuna büyütür (küçültmez; snapshot varken olmaz). Sonra sunucu içinde bölümü / dosya sistemini genişletin.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Server id (tr-ist-1)"
     },
     {
      "name": "disk",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Disk id (from GET /cloud/servers/{id}/disks)"
     }
    ],
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "required": [
         "size_gb"
        ],
        "properties": {
         "size_gb": {
          "type": "integer",
          "minimum": 10,
          "maximum": 4000,
          "multipleOf": 10
         }
        }
       }
      }
     }
    },
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "$ref": "#/components/schemas/ServerDisks"
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "description": "not_actionable (suspended / busy / snapshots exist)",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     },
     "501": {
      "description": "not_supported (not a tr-ist-1 Gyro Compute server)",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    }
   },
   "delete": {
    "tags": [
     "Servers"
    ],
    "operationId": "removeServerDisk",
    "summary": "Remove an additional disk (with its data)",
    "x-summary-tr": "Ek diski sil (verisiyle)",
    "x-scope": "cloud_write",
    "x-cli": {
     "command": "server disk remove",
     "confirm": true
    },
    "description": "Detaches and deletes the disk with all its data (cannot be undone); billing stops after the current hour (minimum hours apply). Needs `confirm=true`.",
    "x-description-tr": "Diski tüm verisiyle siler (geri alınamaz); ücret içinde bulunulan saatten sonra durur (asgari süre geçerli). `confirm=true` gerekir.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Server id (tr-ist-1)"
     },
     {
      "name": "disk",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Disk id (from GET /cloud/servers/{id}/disks)"
     },
     {
      "name": "confirm",
      "in": "query",
      "required": true,
      "schema": {
       "type": "boolean"
      }
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "$ref": "#/components/schemas/ServerDisks"
          }
         }
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "description": "not_actionable (suspended / busy / snapshots exist)",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     },
     "501": {
      "description": "not_supported (not a tr-ist-1 Gyro Compute server)",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    }
   }
  },
  "/cloud/containers/plans": {
   "get": {
    "tags": [
     "Containers"
    ],
    "operationId": "listContainerPlans",
    "summary": "List container environment plans",
    "x-summary-tr": "Kapsayıcı ortam paketlerini listele",
    "x-scope": "cloud_read",
    "x-cli": {
     "command": "container plans"
    },
    "description": "Orderable Gyro Container (ECS) environment plans with prepaid prices. A plan is ONE environment (a dedicated node pool); `max_services` is the most apps you can define, `max_replicas` the most replicas per service; all of them share the pool.",
    "x-description-tr": "Sipariş edilebilir Gyro Kapsayıcı (ECS) ortam paketleri ve ön ödemeli fiyatlar. Paket = 1 ortam (size ayrılmış düğüm havuzu); `max_services` tanımlanabilecek en fazla uygulama, `max_replicas` servis başına en fazla kopya; hepsi havuzu paylaşır.",
    "parameters": [],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "array",
           "items": {
            "$ref": "#/components/schemas/ContainerPlan"
           }
          }
         }
        }
       }
      }
     }
    }
   }
  },
  "/cloud/containers": {
   "post": {
    "tags": [
     "Containers"
    ],
    "operationId": "createContainerEnvironments",
    "summary": "Create container environments (batch)",
    "x-summary-tr": "Kapsayıcı ortamı oluştur (toplu)",
    "x-scope": "cloud_order",
    "x-cli": {
     "command": "container create",
     "money": true
    },
    "description": "Orders 1..N environments of a plan in ONE order (`quantity`, default 1, max 25 per request). Prepaid: the order is 0 and usage is charged hourly from the balance; the balance must cover the first 24 hours of every environment and new accounts are limited in their first days. `name` (with `{n}`) and `tags` label every environment; `project_id` puts them in a project. Send `\"dry_run\": true` for a quote; a real order needs `\"confirm\": true` and an `Idempotency-Key` header.",
    "x-description-tr": "Bir paketten 1..N ortamı TEK siparişte açar (`quantity`, varsayılan 1, istek başına en çok 25). Ön ödemeli: sipariş 0'dır, kullanım saatlik bakiyeden düşer; bakiye her ortamın ilk 24 saatini karşılamalıdır, yeni hesaplar ilk günlerde sınırlıdır. `name` (`{n}` ile) ve `tags` her ortamı adlandırır; `project_id` projeye koyar. Teklif için `\"dry_run\": true`; gerçek sipariş `\"confirm\": true` ve `Idempotency-Key` başlığı ister.",
    "parameters": [
     {
      "$ref": "#/components/parameters/IdempotencyKey"
     }
    ],
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "plan": {
          "type": "string",
          "example": "mini-1-1",
          "description": "plan from GET /cloud/containers/plans (mini-1-1, small-1-2, starter, standart, pro, serverless)",
          "x-description-tr": "GET /cloud/containers/plans paketi"
         },
         "product_id": {
          "type": "integer",
          "description": "product id instead of plan",
          "x-description-tr": "plan yerine ürün kimliği"
         },
         "quantity": {
          "type": "integer",
          "minimum": 1,
          "default": 1,
          "description": "environments to create in one order (--count), default 1, max 25",
          "x-description-tr": "tek siparişte açılacak ortam (--count), varsayılan 1, en çok 25"
         },
         "name": {
          "type": "string",
          "maxLength": 60,
          "example": "gyro-ecs-{n}",
          "description": "name (nickname); {n} = number in a batch",
          "x-description-tr": "ad (takma ad); toplu oluşturmada {n} = sıra no"
         },
         "tags": {
          "type": "array",
          "items": {
           "type": "string"
          },
          "maxItems": 10,
          "description": "tags (max 10)",
          "x-description-tr": "etiketler (en çok 10)"
         },
         "project_id": {
          "type": [
           "integer",
           "null"
          ],
          "description": "project (0 = default project)",
          "x-description-tr": "proje (0 = Genel)"
         },
         "confirm": {
          "type": "boolean"
         },
         "dry_run": {
          "type": "boolean"
         }
        }
       },
       "example": {
        "plan": "mini-1-1",
        "quantity": 3,
        "name": "gyro-ecs-{n}",
        "tags": [
         "gyro-test"
        ],
        "confirm": true
       }
      }
     }
    },
    "responses": {
     "200": {
      "description": "Dry-run quote"
     },
     "202": {
      "description": "Ordered; environments are being set up",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "properties": {
            "environments": {
             "type": "array",
             "items": {
              "type": "object"
             }
            },
            "quantity": {
             "type": "integer"
            },
            "plan": {
             "type": "string"
            },
            "order": {
             "type": "object"
            },
            "payment": {
             "type": [
              "object",
              "null"
             ]
            },
            "invoice": {
             "type": [
              "object",
              "null"
             ]
            }
           }
          }
         }
        }
       }
      }
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "422": {
      "description": "confirm_required | limit_exceeded (new-account limit of the prepaid cloud; details = LimitHint, raise it with a support ticket) | validation errors",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    }
   }
  },
  "/cloud/storage/plans": {
   "get": {
    "tags": [
     "Object storage"
    ],
    "operationId": "listStoragePlans",
    "summary": "List Object Storage plans",
    "x-summary-tr": "Nesne depolama paketlerini listele",
    "x-scope": "cloud_read",
    "x-cli": {
     "command": "storage plans"
    },
    "description": "Orderable Object Storage (`standard-*`) and Protected Storage (`protected-*`) plans with limits, prices per billing cycle (fixed EUR, VAT excluded) and add-ons: extra traffic packs (`1tb`, `5tb`, one-time, this calendar month) and object lock buckets (protected plans). `available: false` = no capacity right now.",
    "x-description-tr": "Sipariş edilebilir Nesne Depolama (`standard-*`) ve Korumalı Depolama (`protected-*`) paketleri: sınırlar, dönem başına fiyat (sabit EUR, KDV hariç) ve ek hizmetler: ek trafik paketi (`1tb`, `5tb`, tek seferlik, bu takvim ayı) ve nesne kilitli kova hakkı (korumalı paketler). `available: false` = şu an kapasite yok.",
    "parameters": [],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "array",
           "items": {
            "$ref": "#/components/schemas/StoragePlan"
           }
          }
         }
        }
       }
      }
     }
    }
   }
  },
  "/cloud/storage": {
   "get": {
    "tags": [
     "Object storage"
    ],
    "operationId": "listStorageServices",
    "summary": "List storage services",
    "x-summary-tr": "Depolama hizmetlerini listele",
    "x-scope": "services_read",
    "x-cli": {
     "command": "storage list"
    },
    "description": "Object Storage and Protected Storage services of the account (same filters and paging as GET /cloud/services).",
    "x-description-tr": "Hesabın Nesne Depolama ve Korumalı Depolama hizmetleri (GET /cloud/services ile aynı süzgeç ve sayfalama).",
    "parameters": [],
    "responses": {
     "200": {
      "description": "OK"
     }
    }
   },
   "post": {
    "tags": [
     "Object storage"
    ],
    "operationId": "createStorageServices",
    "summary": "Order Object Storage (S3)",
    "x-summary-tr": "Nesne depolama (S3) sipariş et",
    "x-scope": "cloud_order",
    "x-cli": {
     "command": "storage create",
     "money": true
    },
    "description": "Orders 1..N storage services of a plan in ONE order (`quantity`, default 1, max 25) and pays from the account balance (never a stored card). Billed per `cycle` (monthly | quarterly | semiannually | annually; fixed EUR prices charged in the account currency) and renewed from the balance like other services. `extra_traffic` (`1tb` | `5tb`) adds a one-time traffic pack for this month; `object_lock_buckets` (protected plans, 1-50) buys object lock rights (billed every cycle). `name` (with `{n}`), `tags` and `project_id` label the services. Send `\"dry_run\": true` for a quote; a real order needs `\"confirm\": true` and an `Idempotency-Key` header. The first bucket and the first access key are created automatically within about a minute (status `inprocess` -> `active`); then use `/cloud/storage/{id}/buckets`, `/cloud/storage/{id}/keys` and `/cloud/storage/{id}/connect`. Errors: 402 `insufficient_balance`, 409 `capacity_unavailable`, 422 `confirm_required` (with `quote`), `product_not_orderable`, `cycle_invalid`, `invalid_extra_traffic`, `invalid_object_lock`, `invalid_quantity`; 429 `daily_limit`.",
    "x-description-tr": "Bir paketten 1..N depolama hizmetini TEK siparişte açar (`quantity`, varsayılan 1, en çok 25) ve hesap bakiyesinden öder (kayıtlı kart asla). `cycle` dönemine göre ücretlendirilir (monthly | quarterly | semiannually | annually; sabit EUR fiyat hesap para biriminde) ve diğer hizmetler gibi bakiyeden yenilenir. `extra_traffic` (`1tb` | `5tb`) bu ay için tek seferlik trafik paketi ekler; `object_lock_buckets` (korumalı paketler, 1-50) nesne kilidi hakkı alır (her dönem ücretlenir). `name` (`{n}` ile), `tags` ve `project_id` hizmetleri adlandırır. Teklif için `\"dry_run\": true`; gerçek sipariş `\"confirm\": true` ve `Idempotency-Key` başlığı ister. İlk kova ve ilk erişim anahtarı yaklaşık bir dakikada kendiliğinden oluşur (durum `inprocess` -> `active`); sonra `/cloud/storage/{id}/buckets`, `/keys`, `/connect`.",
    "parameters": [
     {
      "$ref": "#/components/parameters/IdempotencyKey"
     }
    ],
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "plan": {
          "type": "string",
          "example": "standard-1tb",
          "description": "plan from GET /cloud/storage/plans",
          "x-description-tr": "GET /cloud/storage/plans paketi"
         },
         "product_id": {
          "type": "integer",
          "description": "product id instead of plan",
          "x-description-tr": "plan yerine ürün kimliği"
         },
         "cycle": {
          "type": "string",
          "enum": [
           "monthly",
           "quarterly",
           "semiannually",
           "annually"
          ],
          "default": "monthly",
          "description": "billing cycle",
          "x-description-tr": "fatura dönemi"
         },
         "quantity": {
          "type": "integer",
          "minimum": 1,
          "default": 1,
          "description": "services to create in one order (--count), max 25",
          "x-description-tr": "tek siparişte açılacak hizmet (--count), en çok 25"
         },
         "extra_traffic": {
          "type": "string",
          "enum": [
           "1tb",
           "5tb"
          ],
          "description": "one-time traffic pack for this calendar month",
          "x-description-tr": "bu takvim ayı için tek seferlik trafik paketi"
         },
         "object_lock_buckets": {
          "type": "integer",
          "minimum": 1,
          "maximum": 50,
          "description": "protected plans: object lock bucket rights (billed every cycle)",
          "x-description-tr": "korumalı paketler: nesne kilitli kova hakkı (her dönem)"
         },
         "name": {
          "type": "string",
          "maxLength": 60,
          "example": "gyro-yedek-{n}",
          "description": "name (nickname); {n} = number in a batch",
          "x-description-tr": "ad (takma ad); toplu siparişte {n} = sıra no"
         },
         "tags": {
          "type": "array",
          "items": {
           "type": "string"
          },
          "maxItems": 10
         },
         "project_id": {
          "type": [
           "integer",
           "null"
          ],
          "description": "project (0 = default project)",
          "x-description-tr": "proje (0 = Genel)"
         },
         "end_customer_id": {
          "type": "integer",
          "description": "reseller main key: assign to this end-customer"
         },
         "confirm": {
          "type": "boolean"
         },
         "dry_run": {
          "type": "boolean"
         }
        }
       },
       "example": {
        "plan": "standard-1tb",
        "cycle": "monthly",
        "name": "gyro-proje-s3",
        "extra_traffic": "1tb",
        "confirm": true
       }
      }
     }
    },
    "responses": {
     "200": {
      "description": "Dry-run quote"
     },
     "201": {
      "description": "Ordered and paid; services are being set up",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "properties": {
            "storage": {
             "type": "object",
             "description": "first service"
            },
            "services": {
             "type": "array",
             "items": {
              "type": "object"
             }
            },
            "quantity": {
             "type": "integer"
            },
            "plan": {
             "type": "string"
            },
            "cycle": {
             "type": "string"
            },
            "order": {
             "type": "object"
            },
            "payment": {
             "type": [
              "object",
              "null"
             ]
            },
            "invoice": {
             "type": [
              "object",
              "null"
             ]
            }
           }
          }
         }
        }
       }
      }
     },
     "402": {
      "$ref": "#/components/responses/PaymentRequired"
     },
     "403": {
      "$ref": "#/components/responses/Forbidden"
     },
     "409": {
      "$ref": "#/components/responses/Conflict"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     },
     "429": {
      "$ref": "#/components/responses/RateLimited"
     }
    }
   }
  },
  "/cloud/storage/{id}": {
   "get": {
    "tags": [
     "Object storage"
    ],
    "operationId": "getStorageService",
    "summary": "Get a storage service",
    "x-summary-tr": "Depolama hizmeti ayrıntısı",
    "x-scope": "services_read",
    "x-cli": {
     "command": "storage get"
    },
    "description": "Service row plus `storage` (plan, kind, limits, S3 endpoint, region).",
    "x-description-tr": "Hizmet satırı ve `storage` (paket, tür, sınırlar, S3 uç noktası, bölge).",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Storage service id"
     }
    ],
    "responses": {
     "200": {
      "description": "OK"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     }
    }
   },
   "delete": {
    "tags": [
     "Object storage"
    ],
    "operationId": "deleteStorageService",
    "summary": "Cancel a storage service",
    "x-summary-tr": "Depolama hizmetini iptal et",
    "x-scope": "cloud_delete",
    "x-cli": {
     "command": "storage delete",
     "confirm": true
    },
    "description": "`confirm=true` is required. `immediate=true` cancels now: access keys, website and custom domains stop within about a minute and every bucket and object is deleted permanently within minutes (cannot be undone; Protected Storage versions under a COMPLIANCE lock or legal hold are kept until the lock ends and stay billable). Without `immediate` a cancellation request is filed and the service keeps running until it is processed.",
    "x-description-tr": "`confirm=true` zorunlu. `immediate=true` hemen iptal eder: erişim anahtarları, web sitesi ve özel alan adları yaklaşık bir dakikada durur, tüm kovalar ve nesneler dakikalar içinde kalıcı olarak silinir (geri alınamaz; Korumalı Depolama'da COMPLIANCE kilidi ya da legal hold altındaki sürümler kilit bitene kadar kalır ve ücretlenir). `immediate` olmadan iptal talebi açılır, işlenene kadar hizmet çalışır.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Storage service id"
     },
     {
      "name": "confirm",
      "in": "query",
      "required": true,
      "schema": {
       "type": "boolean"
      }
     },
     {
      "name": "immediate",
      "in": "query",
      "schema": {
       "type": "boolean"
      }
     }
    ],
    "responses": {
     "202": {
      "description": "cancelling | cancellation_requested"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     }
    }
   }
  },
  "/cloud/account/limits": {
   "get": {
    "tags": [
     "Account limits"
    ],
    "operationId": "getAccountLimits",
    "summary": "Account limits and usage",
    "x-summary-tr": "Hesap sınırları ve kullanım",
    "x-scope": "cloud_read",
    "x-cli": {
     "command": "limits"
    },
    "description": "Every limit that applies to your account with the current usage: the new-account limit of the prepaid cloud (first 7 days: 5 Gyro Cloud Istanbul servers and 1 container environment), Gyro Cloud Istanbul servers, templates, additional IPv4 / disks per server, API order caps (servers, batch size, paid operations per day), API keys, SSH keys, webhooks, firewall rules and security groups, storage buckets and keys, DNS zones, container plan limits, Gyro Pipeline, uptime monitors and projects. **Limits are raised on request: open a support ticket** (`POST /api/v1/client/tickets` with `department_id` 3, or `gyro ticket create`); `how_to_increase.support_ticket` is a ready request. Plan limits also grow with a bigger plan or an add-on. Answers are cached for 60 seconds (`fresh=1` reads again). Every refusal caused by a limit carries the same hint in `error.details` (schema LimitHint).",
    "x-description-tr": "Hesabınıza uygulanan tüm sınırlar ve şu anki kullanım: ön ödemeli bulutta yeni hesap sınırı (ilk 7 gün: 5 Gyro Bulut İstanbul sunucusu ve 1 kapsayıcı ortamı), Gyro Bulut İstanbul sunucuları, şablonlar, sunucu başına ek IPv4 / disk, API sipariş sınırları (sunucu, toplu adet, günlük ücretli işlem), API anahtarları, SSH anahtarları, webhook'lar, güvenlik duvarı kuralları ve güvenlik grupları, depolama kovaları ve anahtarları, DNS zone'ları, kapsayıcı paket sınırları, Gyro Pipeline, uptime izleyicileri ve projeler. **Sınırlar talep üzerine artırılır: destek talebi açın** (`POST /api/v1/client/tickets`, `department_id` 3 ya da `gyro ticket create`); `how_to_increase.support_ticket` hazır istektir. Paket sınırları paketi yükselterek ya da ek hizmetle de büyür. Yanıt 60 sn önbelleklidir (`fresh=1` yeniden okur). Sınır kaynaklı her ret `error.details` içinde aynı ipucunu taşır (LimitHint).",
    "parameters": [
     {
      "name": "fresh",
      "in": "query",
      "schema": {
       "type": "boolean"
      },
      "description": "bypass the 60 second cache"
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "properties": {
            "account_id": {
             "type": "integer"
            },
            "how_to_increase": {
             "type": "object",
             "properties": {
              "summary": {
               "type": "string"
              },
              "summary_tr": {
               "type": "string"
              },
              "support_ticket": {
               "type": "object"
              }
             }
            },
            "new_account": {
             "type": [
              "object",
              "null"
             ],
             "description": "prepaid cloud new-account limit (null = not offered)",
             "properties": {
              "applies": {
               "type": "boolean",
               "description": "true while the account is in its first period_days days"
              },
              "unlimited": {
               "type": "boolean"
              },
              "custom": {
               "type": "boolean"
              },
              "period_days": {
               "type": "integer",
               "example": 7
              },
              "account_age_days": {
               "type": [
                "number",
                "null"
               ]
              },
              "ends_at": {
               "type": [
                "string",
                "null"
               ],
               "description": "Europe/Istanbul"
              },
              "servers": {
               "type": "object",
               "properties": {
                "limit": {
                 "type": "integer",
                 "example": 5
                },
                "used": {
                 "type": "integer"
                }
               }
              },
              "container_environments": {
               "type": "object",
               "properties": {
                "limit": {
                 "type": "integer",
                 "example": 1
                },
                "used": {
                 "type": "integer"
                }
               }
              }
             }
            },
            "limits": {
             "type": "array",
             "items": {
              "$ref": "#/components/schemas/AccountLimit"
             }
            }
           }
          }
         }
        }
       }
      }
     },
     "401": {
      "$ref": "#/components/responses/Unauthorized"
     }
    }
   }
  },
  "/cloud/vpcs": {
   "get": {
    "tags": [
     "Private networks"
    ],
    "operationId": "listVpcs",
    "summary": "List private networks",
    "x-summary-tr": "Özel ağları listele",
    "x-scope": "cloud_read",
    "x-cli": {
     "command": "vpc list"
    },
    "description": "tr-ist-1 only. Limits (GET /cloud/vpcs `limits`, raised with a support ticket): 3 VPCs per account, 4 subnets per VPC, 3 private cards per server, 20 port forwards per VPC; a server is attached to one VPC at a time (to several of its subnets). Another account's object answers 404. Also returns `limits` and `pricing`.",
    "x-description-tr": "Yalnız tr-ist-1. Sınırlar (GET /cloud/vpcs `limits`, destek talebiyle artırılır): hesap başına 3 VPC, VPC başına 4 subnet, sunucu başına 3 özel kart, VPC başına 20 port yönlendirme; bir sunucu aynı anda tek VPC'ye (o VPC'nin birden çok subnetine) bağlanır. Başka hesabın nesnesi 404 döner. `limits` ve `pricing` de döner.",
    "parameters": [],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "properties": {
            "vpcs": {
             "type": "array",
             "items": {
              "$ref": "#/components/schemas/Vpc"
             }
            },
            "count": {
             "type": "integer"
            },
            "limits": {
             "type": "object",
             "properties": {
              "max_vpcs": {
               "type": "integer"
              },
              "max_subnets_per_vpc": {
               "type": "integer"
              },
              "max_nics_per_server": {
               "type": "integer"
              },
              "max_port_forwards": {
               "type": "integer"
              }
             }
            },
            "pricing": {
             "type": "object",
             "properties": {
              "billing": {
               "type": "string"
              },
              "gateway_monthly_eur": {
               "type": "number"
              },
              "gateway_hourly_eur": {
               "type": "number"
              },
              "minimum_hours": {
               "type": "integer"
              }
             }
            }
           }
          }
         }
        }
       }
      }
     },
     "403": {
      "description": "not_available (private networks are not enabled for this account yet) / forbidden (key limited to some servers)",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "description": "conflict: limit_exceeded, vpc_in_use, subnet_in_use, last_subnet, gateway_disabled, gateway_in_use, port_in_use, already_attached, other_vpc, extra_ips, no_private_network, no_egress, already_off, already_on, last_network, no_billing_server, suspended, busy",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     },
     "503": {
      "description": "capacity / pool_exhausted (try again later)",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    }
   },
   "post": {
    "tags": [
     "Private networks"
    ],
    "operationId": "createVpc",
    "summary": "Create a private network",
    "x-summary-tr": "Özel ağ oluştur",
    "x-scope": "cloud_write",
    "x-cli": {
     "command": "vpc create"
    },
    "description": "tr-ist-1 only. Limits (GET /cloud/vpcs `limits`, raised with a support ticket): 3 VPCs per account, 4 subnets per VPC, 3 private cards per server, 20 port forwards per VPC; a server is attached to one VPC at a time (to several of its subnets). Another account's object answers 404. Private range /16 to /24 inside 10.0.0.0/8, 172.16.0.0/12 or 192.168.0.0/16; the network address must be given (10.10.0.0/16, not 10.10.0.5/16). Reserved by the platform: 10.42.0.0/16, 10.43.0.0/16, 10.200.0.0/16, 10.250.0.0/16, 10.255.0.0/16. The first subnet is created with it: `subnet.cidr` or, when left out, the first /24 of the range (name `default`). Free.",
    "x-description-tr": "Yalnız tr-ist-1. Sınırlar (GET /cloud/vpcs `limits`, destek talebiyle artırılır): hesap başına 3 VPC, VPC başına 4 subnet, sunucu başına 3 özel kart, VPC başına 20 port yönlendirme; bir sunucu aynı anda tek VPC'ye (o VPC'nin birden çok subnetine) bağlanır. Başka hesabın nesnesi 404 döner. 10.0.0.0/8, 172.16.0.0/12 ya da 192.168.0.0/16 içinde /16 - /24 özel aralık; ağ adresi yazılır (10.10.0.0/16, 10.10.0.5/16 değil). Platforma ayrılmış: 10.42.0.0/16, 10.43.0.0/16, 10.200.0.0/16, 10.250.0.0/16, 10.255.0.0/16. İlk subnet birlikte açılır: `subnet.cidr` ya da verilmezse aralığın ilk /24'ü (ad `default`). Ücretsiz.",
    "parameters": [],
    "responses": {
     "201": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "$ref": "#/components/schemas/Vpc"
          }
         }
        }
       }
      }
     },
     "403": {
      "description": "not_available (private networks are not enabled for this account yet) / forbidden (key limited to some servers)",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "description": "conflict: limit_exceeded, vpc_in_use, subnet_in_use, last_subnet, gateway_disabled, gateway_in_use, port_in_use, already_attached, other_vpc, extra_ips, no_private_network, no_egress, already_off, already_on, last_network, no_billing_server, suspended, busy",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     },
     "503": {
      "description": "capacity / pool_exhausted (try again later)",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "name": {
          "type": "string",
          "maxLength": 48
         },
         "cidr": {
          "type": "string",
          "example": "10.10.0.0/16"
         },
         "project_id": {
          "type": "integer"
         },
         "subnet": {
          "type": "object",
          "properties": {
           "name": {
            "type": "string",
            "maxLength": 48
           },
           "cidr": {
            "type": "string",
            "example": "10.10.1.0/24"
           }
          }
         }
        },
        "required": [
         "name",
         "cidr"
        ]
       }
      }
     }
    }
   }
  },
  "/cloud/vpcs/{vpc_id}": {
   "get": {
    "tags": [
     "Private networks"
    ],
    "operationId": "getVpc",
    "summary": "Get a private network",
    "x-summary-tr": "Özel ağı getir",
    "x-scope": "cloud_read",
    "x-cli": {
     "command": "vpc get"
    },
    "description": "Subnets, attached servers and the gateway.",
    "x-description-tr": "Subnetler, bağlı sunucular ve kapı.",
    "parameters": [
     {
      "name": "vpc_id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "VPC id (from GET /cloud/vpcs)"
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "$ref": "#/components/schemas/Vpc"
          }
         }
        }
       }
      }
     },
     "403": {
      "description": "not_available (private networks are not enabled for this account yet) / forbidden (key limited to some servers)",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "description": "conflict: limit_exceeded, vpc_in_use, subnet_in_use, last_subnet, gateway_disabled, gateway_in_use, port_in_use, already_attached, other_vpc, extra_ips, no_private_network, no_egress, already_off, already_on, last_network, no_billing_server, suspended, busy",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     },
     "503": {
      "description": "capacity / pool_exhausted (try again later)",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    }
   },
   "patch": {
    "tags": [
     "Private networks"
    ],
    "operationId": "updateVpc",
    "summary": "Rename a private network",
    "x-summary-tr": "Özel ağın adını değiştir",
    "x-scope": "cloud_write",
    "x-cli": {
     "command": "vpc update"
    },
    "description": "Only the name changes (the range never changes).",
    "x-description-tr": "Yalnız ad değişir (aralık değişmez).",
    "parameters": [
     {
      "name": "vpc_id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "VPC id (from GET /cloud/vpcs)"
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "$ref": "#/components/schemas/Vpc"
          }
         }
        }
       }
      }
     },
     "403": {
      "description": "not_available (private networks are not enabled for this account yet) / forbidden (key limited to some servers)",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "description": "conflict: limit_exceeded, vpc_in_use, subnet_in_use, last_subnet, gateway_disabled, gateway_in_use, port_in_use, already_attached, other_vpc, extra_ips, no_private_network, no_egress, already_off, already_on, last_network, no_billing_server, suspended, busy",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     },
     "503": {
      "description": "capacity / pool_exhausted (try again later)",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "name": {
          "type": "string",
          "maxLength": 48
         }
        },
        "required": [
         "name"
        ]
       }
      }
     }
    }
   },
   "delete": {
    "tags": [
     "Private networks"
    ],
    "operationId": "deleteVpc",
    "summary": "Delete a private network",
    "x-summary-tr": "Özel ağı sil",
    "x-scope": "cloud_write",
    "x-cli": {
     "command": "vpc delete",
     "confirm": true
    },
    "description": "Permanent. Detach the server cards and delete the port forwards first (409 `vpc_in_use`); an open gateway is turned off. Needs `\"confirm\": true` (body or query).",
    "x-description-tr": "Kalıcıdır. Önce sunucu kartlarını çıkarın ve port yönlendirmelerini silin (409 `vpc_in_use`); açık kapı kapatılır. `\"confirm\": true` gerekir (gövde ya da sorgu).",
    "parameters": [
     {
      "name": "vpc_id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "VPC id (from GET /cloud/vpcs)"
     },
     {
      "name": "confirm",
      "in": "query",
      "schema": {
       "type": "boolean"
      }
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "properties": {
            "id": {
             "type": "string"
            },
            "deleted": {
             "type": "boolean"
            }
           }
          }
         }
        }
       }
      }
     },
     "403": {
      "description": "not_available (private networks are not enabled for this account yet) / forbidden (key limited to some servers)",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "description": "conflict: limit_exceeded, vpc_in_use, subnet_in_use, last_subnet, gateway_disabled, gateway_in_use, port_in_use, already_attached, other_vpc, extra_ips, no_private_network, no_egress, already_off, already_on, last_network, no_billing_server, suspended, busy",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     },
     "503": {
      "description": "capacity / pool_exhausted (try again later)",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "requestBody": {
     "required": false,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "confirm": {
          "type": "boolean"
         }
        },
        "required": []
       }
      }
     }
    }
   }
  },
  "/cloud/vpcs/{vpc_id}/subnets": {
   "get": {
    "tags": [
     "Private networks"
    ],
    "operationId": "listVpcSubnets",
    "summary": "List subnets",
    "x-summary-tr": "Subnetleri listele",
    "x-scope": "cloud_read",
    "x-cli": {
     "command": "vpc subnet list"
    },
    "description": "",
    "x-description-tr": "",
    "parameters": [
     {
      "name": "vpc_id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "VPC id (from GET /cloud/vpcs)"
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "properties": {
            "subnets": {
             "type": "array",
             "items": {
              "$ref": "#/components/schemas/VpcSubnet"
             }
            },
            "count": {
             "type": "integer"
            }
           }
          }
         }
        }
       }
      }
     },
     "403": {
      "description": "not_available (private networks are not enabled for this account yet) / forbidden (key limited to some servers)",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "description": "conflict: limit_exceeded, vpc_in_use, subnet_in_use, last_subnet, gateway_disabled, gateway_in_use, port_in_use, already_attached, other_vpc, extra_ips, no_private_network, no_egress, already_off, already_on, last_network, no_billing_server, suspended, busy",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     },
     "503": {
      "description": "capacity / pool_exhausted (try again later)",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    }
   },
   "post": {
    "tags": [
     "Private networks"
    ],
    "operationId": "createVpcSubnet",
    "summary": "Add a subnet",
    "x-summary-tr": "Subnet ekle",
    "x-scope": "cloud_write",
    "x-cli": {
     "command": "vpc subnet create"
    },
    "description": "/20 to /28 inside the VPC range, not overlapping another subnet. Give `cidr`, or `prefix` (default 24) for the next free range. In every subnet .1 is the gateway; .0-.4 and the last address are reserved.",
    "x-description-tr": "VPC aralığı içinde /20 - /28, başka subnetle çakışmadan. `cidr` verin ya da sıradaki boş aralık için `prefix` (varsayılan 24). Her subnette .1 kapıdır; .0-.4 ve son adres ayrılmıştır.",
    "parameters": [
     {
      "name": "vpc_id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "VPC id (from GET /cloud/vpcs)"
     }
    ],
    "responses": {
     "201": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "$ref": "#/components/schemas/VpcSubnet"
          }
         }
        }
       }
      }
     },
     "403": {
      "description": "not_available (private networks are not enabled for this account yet) / forbidden (key limited to some servers)",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "description": "conflict: limit_exceeded, vpc_in_use, subnet_in_use, last_subnet, gateway_disabled, gateway_in_use, port_in_use, already_attached, other_vpc, extra_ips, no_private_network, no_egress, already_off, already_on, last_network, no_billing_server, suspended, busy",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     },
     "503": {
      "description": "capacity / pool_exhausted (try again later)",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "name": {
          "type": "string",
          "maxLength": 48
         },
         "cidr": {
          "type": "string"
         },
         "prefix": {
          "type": "integer",
          "minimum": 20,
          "maximum": 28
         }
        },
        "required": [
         "name"
        ]
       }
      }
     }
    }
   }
  },
  "/cloud/vpcs/{vpc_id}/subnets/{subnet_id}": {
   "delete": {
    "tags": [
     "Private networks"
    ],
    "operationId": "deleteVpcSubnet",
    "summary": "Delete a subnet",
    "x-summary-tr": "Subneti sil",
    "x-scope": "cloud_write",
    "x-cli": {
     "command": "vpc subnet delete"
    },
    "description": "Refused while cards are attached or a port forward targets it (409 `subnet_in_use`); the last subnet cannot be deleted (delete the VPC).",
    "x-description-tr": "Bağlı kart ya da ona yönlenen port yönlendirme varken reddedilir (409 `subnet_in_use`); son subnet silinmez (VPC'yi silin).",
    "parameters": [
     {
      "name": "vpc_id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "VPC id (from GET /cloud/vpcs)"
     },
     {
      "name": "subnet_id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Subnet id"
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "properties": {
            "id": {
             "type": "string"
            },
            "deleted": {
             "type": "boolean"
            }
           }
          }
         }
        }
       }
      }
     },
     "403": {
      "description": "not_available (private networks are not enabled for this account yet) / forbidden (key limited to some servers)",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "description": "conflict: limit_exceeded, vpc_in_use, subnet_in_use, last_subnet, gateway_disabled, gateway_in_use, port_in_use, already_attached, other_vpc, extra_ips, no_private_network, no_egress, already_off, already_on, last_network, no_billing_server, suspended, busy",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     },
     "503": {
      "description": "capacity / pool_exhausted (try again later)",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    }
   }
  },
  "/cloud/vpcs/{vpc_id}/gateway": {
   "get": {
    "tags": [
     "Private networks"
    ],
    "operationId": "getVpcGateway",
    "summary": "Get the VPC gateway",
    "x-summary-tr": "VPC kapısını getir",
    "x-scope": "cloud_read",
    "x-cli": {
     "command": "vpc gateway get"
    },
    "description": "The gateway gives private-only servers internet access (NAT), port forwarding and the inter-subnet rule. While it is on it is billed hourly from the prepaid balance (`monthly_eur` / 672, at least 1 hour, never more than `monthly_eur` a month) and needs at least one prepaid tr-ist-1 server on the account (409 `no_billing_server`). Turning it off releases its public IP; refused while port forwards exist, or while private-only servers use it (409 `gateway_in_use`, repeat with `allow_no_egress: true`). Outgoing connections are logged as required by Turkish Law No. 5651 (2 years). ",
    "x-description-tr": "Kapı; public IP'si kapalı sunucuların internete çıkışını (NAT), port yönlendirmeyi ve subnetler arası kuralı sağlar. Açıkken ön ödemeli bakiyeden saatlik ücretlenir (`monthly_eur` / 672, en az 1 saat, ayda en çok `monthly_eur`) ve hesapta en az bir ön ödemeli tr-ist-1 sunucusu gerekir (409 `no_billing_server`). Kapatınca public IP bırakılır; port yönlendirme varken ya da public IP'si kapalı sunucular kullanırken reddedilir (409 `gateway_in_use`, `allow_no_egress: true` ile tekrarlayın). Dışarı çıkan bağlantılar 5651 sayılı Kanun gereği kaydedilir (2 yıl). ",
    "parameters": [
     {
      "name": "vpc_id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "VPC id (from GET /cloud/vpcs)"
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "$ref": "#/components/schemas/VpcGateway"
          }
         }
        }
       }
      }
     },
     "403": {
      "description": "not_available (private networks are not enabled for this account yet) / forbidden (key limited to some servers)",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "description": "conflict: limit_exceeded, vpc_in_use, subnet_in_use, last_subnet, gateway_disabled, gateway_in_use, port_in_use, already_attached, other_vpc, extra_ips, no_private_network, no_egress, already_off, already_on, last_network, no_billing_server, suspended, busy",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     },
     "503": {
      "description": "capacity / pool_exhausted (try again later)",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    }
   },
   "put": {
    "tags": [
     "Private networks"
    ],
    "operationId": "setVpcGateway",
    "summary": "Turn the VPC gateway on/off and change its settings",
    "x-summary-tr": "VPC kapısını aç/kapat, ayarla",
    "x-scope": "cloud_write",
    "x-cli": {
     "command": "vpc gateway set",
     "money": true
    },
    "description": "The gateway gives private-only servers internet access (NAT), port forwarding and the inter-subnet rule. While it is on it is billed hourly from the prepaid balance (`monthly_eur` / 672, at least 1 hour, never more than `monthly_eur` a month) and needs at least one prepaid tr-ist-1 server on the account (409 `no_billing_server`). Turning it off releases its public IP; refused while port forwards exist, or while private-only servers use it (409 `gateway_in_use`, repeat with `allow_no_egress: true`). Outgoing connections are logged as required by Turkish Law No. 5651 (2 years). Only the given fields change.",
    "x-description-tr": "Kapı; public IP'si kapalı sunucuların internete çıkışını (NAT), port yönlendirmeyi ve subnetler arası kuralı sağlar. Açıkken ön ödemeli bakiyeden saatlik ücretlenir (`monthly_eur` / 672, en az 1 saat, ayda en çok `monthly_eur`) ve hesapta en az bir ön ödemeli tr-ist-1 sunucusu gerekir (409 `no_billing_server`). Kapatınca public IP bırakılır; port yönlendirme varken ya da public IP'si kapalı sunucular kullanırken reddedilir (409 `gateway_in_use`, `allow_no_egress: true` ile tekrarlayın). Dışarı çıkan bağlantılar 5651 sayılı Kanun gereği kaydedilir (2 yıl). Yalnız verilen alanlar değişir.",
    "parameters": [
     {
      "name": "vpc_id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "VPC id (from GET /cloud/vpcs)"
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "$ref": "#/components/schemas/VpcGateway"
          }
         }
        }
       }
      }
     },
     "403": {
      "description": "not_available (private networks are not enabled for this account yet) / forbidden (key limited to some servers)",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "description": "conflict: limit_exceeded, vpc_in_use, subnet_in_use, last_subnet, gateway_disabled, gateway_in_use, port_in_use, already_attached, other_vpc, extra_ips, no_private_network, no_egress, already_off, already_on, last_network, no_billing_server, suspended, busy",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     },
     "503": {
      "description": "capacity / pool_exhausted (try again later)",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "requestBody": {
     "required": false,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "enabled": {
          "type": "boolean"
         },
         "nat": {
          "type": "boolean"
         },
         "inter_subnet": {
          "type": "string",
          "enum": [
           "allow",
           "deny"
          ]
         },
         "allow_no_egress": {
          "type": "boolean"
         }
        },
        "required": []
       }
      }
     }
    }
   }
  },
  "/cloud/vpcs/{vpc_id}/port-forwards": {
   "get": {
    "tags": [
     "Private networks"
    ],
    "operationId": "listVpcPortForwards",
    "summary": "List port forwards",
    "x-summary-tr": "Port yönlendirmeleri listele",
    "x-scope": "cloud_read",
    "x-cli": {
     "command": "vpc port-forward list"
    },
    "description": "",
    "x-description-tr": "",
    "parameters": [
     {
      "name": "vpc_id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "VPC id (from GET /cloud/vpcs)"
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "properties": {
            "port_forwards": {
             "type": "array",
             "items": {
              "$ref": "#/components/schemas/VpcPortForward"
             }
            },
            "count": {
             "type": "integer"
            }
           }
          }
         }
        }
       }
      }
     },
     "403": {
      "description": "not_available (private networks are not enabled for this account yet) / forbidden (key limited to some servers)",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "description": "conflict: limit_exceeded, vpc_in_use, subnet_in_use, last_subnet, gateway_disabled, gateway_in_use, port_in_use, already_attached, other_vpc, extra_ips, no_private_network, no_egress, already_off, already_on, last_network, no_billing_server, suspended, busy",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     },
     "503": {
      "description": "capacity / pool_exhausted (try again later)",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    }
   },
   "post": {
    "tags": [
     "Private networks"
    ],
    "operationId": "createVpcPortForward",
    "summary": "Forward a public port of the gateway",
    "x-summary-tr": "Kapının dış portunu yönlendir",
    "x-scope": "cloud_write",
    "x-cli": {
     "command": "vpc port-forward add"
    },
    "description": "public_ip:public_port of the gateway -> target_ip:target_port inside the VPC. The gateway must be on (409 `gateway_disabled`); one forward per protocol + public port; at most 20.",
    "x-description-tr": "Kapının public_ip:public_port adresi -> VPC içinde target_ip:target_port. Kapı açık olmalı (409 `gateway_disabled`); protokol + dış port başına bir yönlendirme; en çok 20.",
    "parameters": [
     {
      "name": "vpc_id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "VPC id (from GET /cloud/vpcs)"
     }
    ],
    "responses": {
     "201": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "$ref": "#/components/schemas/VpcPortForward"
          }
         }
        }
       }
      }
     },
     "403": {
      "description": "not_available (private networks are not enabled for this account yet) / forbidden (key limited to some servers)",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "description": "conflict: limit_exceeded, vpc_in_use, subnet_in_use, last_subnet, gateway_disabled, gateway_in_use, port_in_use, already_attached, other_vpc, extra_ips, no_private_network, no_egress, already_off, already_on, last_network, no_billing_server, suspended, busy",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     },
     "503": {
      "description": "capacity / pool_exhausted (try again later)",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "protocol": {
          "type": "string",
          "enum": [
           "tcp",
           "udp"
          ]
         },
         "public_port": {
          "type": "integer",
          "minimum": 1,
          "maximum": 65535
         },
         "target_ip": {
          "type": "string"
         },
         "target_port": {
          "type": "integer",
          "minimum": 1,
          "maximum": 65535
         }
        },
        "required": [
         "protocol",
         "public_port",
         "target_ip",
         "target_port"
        ]
       }
      }
     }
    }
   }
  },
  "/cloud/vpcs/{vpc_id}/port-forwards/{pf_id}": {
   "delete": {
    "tags": [
     "Private networks"
    ],
    "operationId": "deleteVpcPortForward",
    "summary": "Delete a port forward",
    "x-summary-tr": "Port yönlendirmeyi sil",
    "x-scope": "cloud_write",
    "x-cli": {
     "command": "vpc port-forward remove"
    },
    "description": "",
    "x-description-tr": "",
    "parameters": [
     {
      "name": "vpc_id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "VPC id (from GET /cloud/vpcs)"
     },
     {
      "name": "pf_id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Port forward id"
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "properties": {
            "id": {
             "type": "string"
            },
            "deleted": {
             "type": "boolean"
            }
           }
          }
         }
        }
       }
      }
     },
     "403": {
      "description": "not_available (private networks are not enabled for this account yet) / forbidden (key limited to some servers)",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "description": "conflict: limit_exceeded, vpc_in_use, subnet_in_use, last_subnet, gateway_disabled, gateway_in_use, port_in_use, already_attached, other_vpc, extra_ips, no_private_network, no_egress, already_off, already_on, last_network, no_billing_server, suspended, busy",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     },
     "503": {
      "description": "capacity / pool_exhausted (try again later)",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    }
   }
  },
  "/cloud/servers/{id}/nics": {
   "get": {
    "tags": [
     "Private networks"
    ],
    "operationId": "listServerNics",
    "summary": "List the server's private network cards",
    "x-summary-tr": "Sunucunun özel ağ kartları",
    "x-scope": "cloud_read",
    "x-cli": {
     "command": "server nic list"
    },
    "description": "Private network cards of a tr-ist-1 server. Attaching is hot (no restart): the card is ready in about 10-60 s on a running server (`state` attaching -> ready); on a stopped server the settings apply at boot. A server can join one VPC at a time (409 `other_vpc`), at most 3 cards. `ip` empty = automatic. ",
    "x-description-tr": "tr-ist-1 sunucusunun özel ağ kartları. Takma sıcak yapılır (yeniden başlatma yok): açık sunucuda yaklaşık 10-60 sn'de hazır (`state` attaching -> ready); kapalı sunucuda ayarlar açılışta uygulanır. Bir sunucu aynı anda tek VPC'ye bağlanır (409 `other_vpc`), en çok 3 kart. `ip` boş = otomatik. ",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Server id (tr-ist-1)"
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "properties": {
            "server_id": {
             "type": "integer"
            },
            "nics": {
             "type": "array",
             "items": {
              "$ref": "#/components/schemas/ServerNic"
             }
            },
            "count": {
             "type": "integer"
            },
            "max_nics": {
             "type": "integer"
            },
            "public_ip": {
             "type": "string"
            },
            "public_enabled": {
             "type": "boolean"
            },
            "applied": {
             "type": "boolean",
             "description": "the server applied the latest network settings"
            }
           }
          }
         }
        }
       }
      }
     },
     "403": {
      "description": "not_available (private networks are not enabled for this account yet) / forbidden (key limited to some servers)",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "description": "conflict: limit_exceeded, vpc_in_use, subnet_in_use, last_subnet, gateway_disabled, gateway_in_use, port_in_use, already_attached, other_vpc, extra_ips, no_private_network, no_egress, already_off, already_on, last_network, no_billing_server, suspended, busy",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     },
     "503": {
      "description": "capacity / pool_exhausted (try again later)",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    }
   },
   "post": {
    "tags": [
     "Private networks"
    ],
    "operationId": "attachServerNic",
    "summary": "Attach the server to a subnet",
    "x-summary-tr": "Sunucuyu subnete bağla",
    "x-scope": "cloud_write",
    "x-cli": {
     "command": "server nic attach"
    },
    "description": "Private network cards of a tr-ist-1 server. Attaching is hot (no restart): the card is ready in about 10-60 s on a running server (`state` attaching -> ready); on a stopped server the settings apply at boot. A server can join one VPC at a time (409 `other_vpc`), at most 3 cards. `ip` empty = automatic. ",
    "x-description-tr": "tr-ist-1 sunucusunun özel ağ kartları. Takma sıcak yapılır (yeniden başlatma yok): açık sunucuda yaklaşık 10-60 sn'de hazır (`state` attaching -> ready); kapalı sunucuda ayarlar açılışta uygulanır. Bir sunucu aynı anda tek VPC'ye bağlanır (409 `other_vpc`), en çok 3 kart. `ip` boş = otomatik. ",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Server id (tr-ist-1)"
     }
    ],
    "responses": {
     "202": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "properties": {
            "server_id": {
             "type": "integer"
            },
            "nic": {
             "$ref": "#/components/schemas/ServerNic"
            },
            "task_id": {
             "type": "integer"
            }
           }
          }
         }
        }
       }
      }
     },
     "403": {
      "description": "not_available (private networks are not enabled for this account yet) / forbidden (key limited to some servers)",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "description": "conflict: limit_exceeded, vpc_in_use, subnet_in_use, last_subnet, gateway_disabled, gateway_in_use, port_in_use, already_attached, other_vpc, extra_ips, no_private_network, no_egress, already_off, already_on, last_network, no_billing_server, suspended, busy",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     },
     "503": {
      "description": "capacity / pool_exhausted (try again later)",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "subnet_id": {
          "type": "string"
         },
         "ip": {
          "type": "string"
         }
        },
        "required": [
         "subnet_id"
        ]
       }
      }
     }
    }
   }
  },
  "/cloud/servers/{id}/nics/{nic_id}": {
   "delete": {
    "tags": [
     "Private networks"
    ],
    "operationId": "detachServerNic",
    "summary": "Detach a private network card",
    "x-summary-tr": "Özel ağ kartını çıkar",
    "x-scope": "cloud_write",
    "x-cli": {
     "command": "server nic detach"
    },
    "description": "The address is held for 10 minutes. While the public IP is off the last card cannot be detached (409 `last_network`).",
    "x-description-tr": "Adres 10 dakika başka sunucuya verilmez. Public IP kapalıyken son kart çıkarılamaz (409 `last_network`).",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Server id (tr-ist-1)"
     },
     {
      "name": "nic_id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Network card id (from GET /cloud/servers/{id}/nics)"
     }
    ],
    "responses": {
     "202": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "properties": {
            "server_id": {
             "type": "integer"
            },
            "id": {
             "type": "string"
            },
            "state": {
             "type": "string"
            },
            "task_id": {
             "type": "integer"
            }
           }
          }
         }
        }
       }
      }
     },
     "403": {
      "description": "not_available (private networks are not enabled for this account yet) / forbidden (key limited to some servers)",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "description": "conflict: limit_exceeded, vpc_in_use, subnet_in_use, last_subnet, gateway_disabled, gateway_in_use, port_in_use, already_attached, other_vpc, extra_ips, no_private_network, no_egress, already_off, already_on, last_network, no_billing_server, suspended, busy",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     },
     "503": {
      "description": "capacity / pool_exhausted (try again later)",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    }
   }
  },
  "/cloud/servers/{id}/public-ip": {
   "get": {
    "tags": [
     "Private networks"
    ],
    "operationId": "getServerPublicIp",
    "summary": "Public IPv4 state",
    "x-summary-tr": "Public IPv4 durumu",
    "x-scope": "cloud_read",
    "x-cli": {
     "command": "server public-ip get"
    },
    "description": "Turning the public IPv4 off makes the server reachable only from its VPC, through a gateway port forward or with the web console (which always works). Confirm with the server's current IP (`confirm_ip`). Needs a ready private card (409 `no_private_network`) and no additional IPv4 (409 `extra_ips`). If the VPC gateway (NAT) is off the server loses internet access: refused with 409 `no_egress` unless `allow_no_egress: true`. The address stays reserved for the server; turning it on brings the same IP. ",
    "x-description-tr": "Public IPv4 kapanınca sunucuya yalnız VPC'den, kapı port yönlendirmesinden ya da web konsoldan (her zaman çalışır) erişilir. Onay için sunucunun mevcut IP'si (`confirm_ip`) yazılır. Hazır bir özel kart (409 `no_private_network`) gerekir ve ek IPv4 olmamalı (409 `extra_ips`). VPC kapısı (NAT) kapalıysa sunucu internete çıkamaz: `allow_no_egress: true` verilmezse 409 `no_egress`. Adres sunucuya ayrılmış kalır; açınca aynı IP gelir. ",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Server id (tr-ist-1)"
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "properties": {
            "server_id": {
             "type": "integer"
            },
            "ip": {
             "type": "string"
            },
            "enabled": {
             "type": "boolean"
            },
            "extra_ips": {
             "type": "integer"
            },
            "private_ready": {
             "type": "boolean"
            },
            "task_id": {
             "type": "integer"
            }
           }
          }
         }
        }
       }
      }
     },
     "403": {
      "description": "not_available (private networks are not enabled for this account yet) / forbidden (key limited to some servers)",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "description": "conflict: limit_exceeded, vpc_in_use, subnet_in_use, last_subnet, gateway_disabled, gateway_in_use, port_in_use, already_attached, other_vpc, extra_ips, no_private_network, no_egress, already_off, already_on, last_network, no_billing_server, suspended, busy",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     },
     "503": {
      "description": "capacity / pool_exhausted (try again later)",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    }
   },
   "delete": {
    "tags": [
     "Private networks"
    ],
    "operationId": "disableServerPublicIp",
    "summary": "Turn the public IPv4 off",
    "x-summary-tr": "Public IPv4'ü kapat",
    "x-scope": "cloud_write",
    "x-cli": {
     "command": "server public-ip off",
     "confirm": true
    },
    "description": "Turning the public IPv4 off makes the server reachable only from its VPC, through a gateway port forward or with the web console (which always works). Confirm with the server's current IP (`confirm_ip`). Needs a ready private card (409 `no_private_network`) and no additional IPv4 (409 `extra_ips`). If the VPC gateway (NAT) is off the server loses internet access: refused with 409 `no_egress` unless `allow_no_egress: true`. The address stays reserved for the server; turning it on brings the same IP. ",
    "x-description-tr": "Public IPv4 kapanınca sunucuya yalnız VPC'den, kapı port yönlendirmesinden ya da web konsoldan (her zaman çalışır) erişilir. Onay için sunucunun mevcut IP'si (`confirm_ip`) yazılır. Hazır bir özel kart (409 `no_private_network`) gerekir ve ek IPv4 olmamalı (409 `extra_ips`). VPC kapısı (NAT) kapalıysa sunucu internete çıkamaz: `allow_no_egress: true` verilmezse 409 `no_egress`. Adres sunucuya ayrılmış kalır; açınca aynı IP gelir. ",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Server id (tr-ist-1)"
     }
    ],
    "responses": {
     "202": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "properties": {
            "server_id": {
             "type": "integer"
            },
            "ip": {
             "type": "string"
            },
            "enabled": {
             "type": "boolean"
            },
            "extra_ips": {
             "type": "integer"
            },
            "private_ready": {
             "type": "boolean"
            },
            "task_id": {
             "type": "integer"
            }
           }
          }
         }
        }
       }
      }
     },
     "403": {
      "description": "not_available (private networks are not enabled for this account yet) / forbidden (key limited to some servers)",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "description": "conflict: limit_exceeded, vpc_in_use, subnet_in_use, last_subnet, gateway_disabled, gateway_in_use, port_in_use, already_attached, other_vpc, extra_ips, no_private_network, no_egress, already_off, already_on, last_network, no_billing_server, suspended, busy",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     },
     "503": {
      "description": "capacity / pool_exhausted (try again later)",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "confirm_ip": {
          "type": "string"
         },
         "allow_no_egress": {
          "type": "boolean"
         }
        },
        "required": [
         "confirm_ip"
        ]
       }
      }
     }
    }
   },
   "post": {
    "tags": [
     "Private networks"
    ],
    "operationId": "enableServerPublicIp",
    "summary": "Turn the public IPv4 on",
    "x-summary-tr": "Public IPv4'ü aç",
    "x-scope": "cloud_write",
    "x-cli": {
     "command": "server public-ip on"
    },
    "description": "Brings the same address back.",
    "x-description-tr": "Aynı adres geri gelir.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "integer"
      },
      "description": "Server id (tr-ist-1)"
     }
    ],
    "responses": {
     "202": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "object",
           "properties": {
            "server_id": {
             "type": "integer"
            },
            "ip": {
             "type": "string"
            },
            "enabled": {
             "type": "boolean"
            },
            "extra_ips": {
             "type": "integer"
            },
            "private_ready": {
             "type": "boolean"
            },
            "task_id": {
             "type": "integer"
            }
           }
          }
         }
        }
       }
      }
     },
     "403": {
      "description": "not_available (private networks are not enabled for this account yet) / forbidden (key limited to some servers)",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     },
     "409": {
      "description": "conflict: limit_exceeded, vpc_in_use, subnet_in_use, last_subnet, gateway_disabled, gateway_in_use, port_in_use, already_attached, other_vpc, extra_ips, no_private_network, no_egress, already_off, already_on, last_network, no_billing_server, suspended, busy",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "$ref": "#/components/responses/Validation"
     },
     "503": {
      "description": "capacity / pool_exhausted (try again later)",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    }
   }
  }
 },
 "components": {
  "securitySchemes": {
   "bearerAuth": {
    "type": "http",
    "scheme": "bearer",
    "bearerFormat": "wck_ + 32 characters",
    "description": "Client API key. Scopes: `Module:Addons/GyroAPI/cloud_read`, `.../cloud_write`, `.../cloud_order` (spends balance),\n`.../cloud_delete`, plus core scopes such as `Invoices/GetInvoices`, `Balance/GetBalance`. Optional IP allow list per key.\nDefault limit 60 requests per minute per key (`X-RateLimit-*` headers, `429` with `Retry-After`).\n v2 scopes: `services_read`, `services_write`, `webhooks`, `keys`, `reseller`, `billing_pay`, `billing_read`, `users` (all under `Module:Addons/GyroAPI/`). ACME keys carry only `dns_acme`."
   }
  },
  "parameters": {
   "ServerId": {
    "name": "id",
    "in": "path",
    "required": true,
    "schema": {
     "type": "integer"
    },
    "description": "Server id (= service id in the client area)"
   },
   "Page": {
    "name": "page",
    "in": "query",
    "schema": {
     "type": "integer",
     "minimum": 1,
     "default": 1
    }
   },
   "Limit": {
    "name": "limit",
    "in": "query",
    "schema": {
     "type": "integer",
     "minimum": 1,
     "maximum": 100,
     "default": 50
    }
   },
   "IdempotencyKey": {
    "name": "Idempotency-Key",
    "in": "header",
    "required": true,
    "schema": {
     "type": "string",
     "minLength": 8,
     "maxLength": 191
    },
    "description": "Unique per logical request (e.g. a UUID). Replays within 24 hours return the stored answer."
   }
  },
  "responses": {
   "BadRequest": {
    "description": "Malformed request (e.g. missing Idempotency-Key)",
    "content": {
     "application/json": {
      "schema": {
       "$ref": "#/components/schemas/Error"
      }
     }
    }
   },
   "Unauthorized": {
    "description": "Missing, invalid or revoked key",
    "content": {
     "application/json": {
      "schema": {
       "$ref": "#/components/schemas/Error"
      }
     }
    }
   },
   "PaymentRequired": {
    "description": "Account balance does not cover the order (`insufficient_balance`)",
    "content": {
     "application/json": {
      "schema": {
       "$ref": "#/components/schemas/Error"
      }
     }
    }
   },
   "Forbidden": {
    "description": "Key lacks the scope, IP not allowed, or feature disabled",
    "content": {
     "application/json": {
      "schema": {
       "$ref": "#/components/schemas/Error"
      }
     }
    }
   },
   "NotFound": {
    "description": "Not found — also returned for objects owned by someone else",
    "content": {
     "application/json": {
      "schema": {
       "$ref": "#/components/schemas/Error"
      }
     }
    }
   },
   "Conflict": {
    "description": "State conflict (`server_locked`, `not_actionable`, `ssh_key_exists`, `server_limit`, `idempotency_in_flight`)",
    "content": {
     "application/json": {
      "schema": {
       "$ref": "#/components/schemas/Error"
      }
     }
    }
   },
   "Validation": {
    "description": "Validation or business rule failure (`confirm_required`, `invalid_image`, `tool_action_failed` ...)",
    "content": {
     "application/json": {
      "schema": {
       "$ref": "#/components/schemas/Error"
      }
     }
    }
   },
   "RateLimited": {
    "description": "Too many requests (`rate_limited`); see the `Retry-After` and `X-RateLimit-*` headers",
    "headers": {
     "Retry-After": {
      "description": "Seconds to wait",
      "schema": {
       "type": "integer"
      }
     }
    },
    "content": {
     "application/json": {
      "schema": {
       "$ref": "#/components/schemas/Error"
      }
     }
    }
   }
  },
  "schemas": {
   "Error": {
    "type": "object",
    "required": [
     "error"
    ],
    "properties": {
     "error": {
      "type": "object",
      "required": [
       "code",
       "message"
      ],
      "properties": {
       "code": {
        "type": "string",
        "example": "server_not_found"
       },
       "message": {
        "type": "string"
       },
       "details": {
        "type": "object",
        "additionalProperties": true,
        "description": "Extra data. Limit refusals add the LimitHint fields (`limit_exceeded: true`, `limit_key`, `limit`, `current`, `how_to_increase`, `support_ticket`, `hint`): account limits are raised with a support ticket. Validation errors (length, format) never carry the limit hint.",
        "x-description-tr": "Ek veri. Sınır retlerinde LimitHint alanları gelir: hesap sınırları destek talebiyle artırılır. Doğrulama hataları (uzunluk, biçim) sınır ipucu taşımaz."
       }
      }
     }
    }
   },
   "PageMeta": {
    "type": "object",
    "properties": {
     "total": {
      "type": "integer"
     },
     "page": {
      "type": "integer"
     },
     "limit": {
      "type": "integer"
     },
     "next_page": {
      "type": "integer",
      "description": "0 when this is the last page"
     }
    }
   },
   "Money": {
    "type": "object",
    "properties": {
     "amount": {
      "type": "number"
     },
     "currency": {
      "type": [
       "string",
       "null"
      ],
      "example": "TRY"
     }
    }
   },
   "Price": {
    "type": "object",
    "properties": {
     "cycle": {
      "type": "string",
      "example": "monthly"
     },
     "amount": {
      "type": "number"
     },
     "setup": {
      "type": "number"
     },
     "currency": {
      "type": "string"
     },
     "monthly_cap": {
      "type": "number",
      "description": "prepaid only: most charged per calendar month (Europe/Istanbul)"
     },
     "billing": {
      "type": "string",
      "enum": [
       "prepaid"
      ],
      "description": "prepaid only"
     }
    }
   },
   "Product": {
    "type": "object",
    "properties": {
     "id": {
      "type": "integer",
      "example": 723
     },
     "name": {
      "type": "string",
      "example": "Gyro Bulut Standart 2-4"
     },
     "plan": {
      "type": "string",
      "example": "standart-2-4",
      "description": "Plan name (use it with region when ordering)"
     },
     "region": {
      "type": "string",
      "example": "eu-de-1",
      "description": "Gyro region"
     },
     "server_type": {
      "type": "string",
      "deprecated": true,
      "description": "Legacy type code (kept for backward compatibility; use plan)"
     },
     "location": {
      "type": "string",
      "deprecated": true,
      "description": "Legacy location code (kept for backward compatibility; use region)"
     },
     "cores": {
      "type": [
       "integer",
       "null"
      ]
     },
     "memory_gb": {
      "type": [
       "number",
       "null"
      ]
     },
     "disk_gb": {
      "type": [
       "integer",
       "null"
      ]
     },
     "cpu_type": {
      "type": [
       "string",
       "null"
      ],
      "enum": [
       "shared",
       "dedicated",
       null
      ]
     },
     "architecture": {
      "type": [
       "string",
       "null"
      ],
      "example": "x86"
     },
     "traffic_tb": {
      "type": [
       "number",
       "null"
      ]
     },
     "ipv4": {
      "type": "boolean"
     },
     "ipv6": {
      "type": "boolean"
     },
     "available": {
      "type": "boolean"
     },
     "prices": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/Price"
      }
     },
     "product_line": {
      "type": "string",
      "enum": [
       "cloud_server",
       "vds"
      ],
      "description": "cloud_server (Gyro Cloud: global regions and tr-ist-1) or vds (Istanbul VDS line)"
     },
     "billing": {
      "type": "string",
      "enum": [
       "invoice",
       "prepaid"
      ],
      "description": "invoice = paid per billing cycle (invoice). prepaid = charged hourly from the account balance (no invoice); `prices` then holds one `hourly` entry with `monthly_cap` (at most this much per calendar month)."
     }
    }
   },
   "Location": {
    "type": "object",
    "properties": {
     "region": {
      "type": "string",
      "example": "eu-de-1",
      "description": "Gyro region name"
     },
     "code": {
      "type": "string",
      "deprecated": true,
      "description": "Legacy location code (use region)"
     },
     "city": {
      "type": "string",
      "example": "Falkenstein"
     },
     "country": {
      "type": "string",
      "example": "DE"
     },
     "zone": {
      "type": "string",
      "example": "eu-central"
     },
     "products": {
      "type": "integer"
     }
    }
   },
   "Image": {
    "type": "object",
    "properties": {
     "slug": {
      "type": "string",
      "example": "debian-12"
     },
     "name": {
      "type": "string",
      "example": "Debian 12"
     },
     "os_flavor": {
      "type": "string",
      "example": "debian"
     }
    }
   },
   "SshKey": {
    "type": "object",
    "properties": {
     "id": {
      "type": "integer"
     },
     "name": {
      "type": "string"
     },
     "fingerprint": {
      "type": "string",
      "example": "SHA256:d2FI8h473Y+uh+dzu6cIeVKqX0Ckx7WUeXp5mII515A"
     },
     "public_key": {
      "type": "string"
     },
     "created_at": {
      "type": "string",
      "format": "date-time"
     }
    }
   },
   "Server": {
    "type": "object",
    "properties": {
     "id": {
      "type": "integer",
      "example": 47466
     },
     "name": {
      "type": "string",
      "description": "Product name"
     },
     "hostname": {
      "type": [
       "string",
       "null"
      ]
     },
     "status": {
      "type": "string",
      "enum": [
       "waiting",
       "inprocess",
       "active",
       "suspended",
       "cancelled"
      ],
      "description": "Billing / service status"
     },
     "product_id": {
      "type": "integer"
     },
     "plan": {
      "type": [
       "string",
       "null"
      ],
      "example": "standart-2-4"
     },
     "region": {
      "type": [
       "string",
       "null"
      ],
      "example": "eu-de-1"
     },
     "server_type": {
      "type": [
       "string",
       "null"
      ],
      "deprecated": true,
      "description": "Legacy type code (use plan)"
     },
     "location": {
      "type": [
       "string",
       "null"
      ],
      "deprecated": true,
      "description": "Legacy location code (use region)"
     },
     "ipv4": {
      "type": [
       "string",
       "null"
      ]
     },
     "ipv6": {
      "type": [
       "string",
       "null"
      ],
      "description": "IPv6 network (/64)"
     },
     "provisioned": {
      "type": "boolean",
      "description": "true once the machine exists"
     },
     "cycle": {
      "type": "string",
      "example": "monthly"
     },
     "price": {
      "$ref": "#/components/schemas/Money"
     },
     "auto_renew": {
      "type": "boolean"
     },
     "created_at": {
      "type": [
       "string",
       "null"
      ],
      "format": "date-time"
     },
     "due_date": {
      "type": [
       "string",
       "null"
      ],
      "format": "date"
     },
     "cancellation": {
      "type": [
       "string",
       "null"
      ],
      "enum": [
       "pending",
       "approved",
       null
      ]
     },
     "customer_id": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Reseller end-customer (main key only)"
     },
     "product_line": {
      "type": "string",
      "enum": [
       "cloud_server",
       "vds"
      ]
     },
     "billing": {
      "type": "string",
      "enum": [
       "invoice",
       "prepaid"
      ],
      "description": "prepaid: `cycle` is `hourly`, `price.amount` is the hourly EUR price, `due_date` is null."
     }
    }
   },
   "ServerLive": {
    "type": [
     "object",
     "null"
    ],
    "properties": {
     "power_state": {
      "type": "string",
      "enum": [
       "running",
       "stopped",
       "starting",
       "stopping",
       "suspended",
       "deleting",
       "unknown"
      ]
     },
     "locked": {
      "type": "boolean",
      "description": "An action is running; writes return 409 server_locked"
     },
     "rescue_enabled": {
      "type": "boolean"
     },
     "backups_enabled": {
      "type": "boolean"
     },
     "ipv4": {
      "type": [
       "string",
       "null"
      ]
     },
     "ipv6_network": {
      "type": [
       "string",
       "null"
      ]
     },
     "cores": {
      "type": "integer"
     },
     "memory_gb": {
      "type": "number"
     },
     "disk_gb": {
      "type": "integer"
     },
     "image": {
      "type": [
       "string",
       "null"
      ],
      "description": "System image slug (null after a snapshot restore)"
     },
     "image_name": {
      "type": [
       "string",
       "null"
      ]
     },
     "region": {
      "type": [
       "string",
       "null"
      ],
      "example": "eu-de-1"
     },
     "location": {
      "type": [
       "string",
       "null"
      ],
      "deprecated": true,
      "description": "Legacy location code (use region)"
     },
     "traffic": {
      "type": "object",
      "properties": {
       "outgoing_bytes": {
        "type": "integer"
       },
       "included_bytes": {
        "type": "integer"
       }
      }
     },
     "checked_at": {
      "type": "string",
      "format": "date-time"
     }
    }
   },
   "ServerDetail": {
    "allOf": [
     {
      "$ref": "#/components/schemas/Server"
     },
     {
      "type": "object",
      "properties": {
       "live": {
        "$ref": "#/components/schemas/ServerLive"
       },
       "ssh_keys": {
        "$ref": "#/components/schemas/ServerSshKeys"
       }
      }
     }
    ]
   },
   "CreateServerRequest": {
    "type": "object",
    "properties": {
     "product_id": {
      "type": "integer",
      "description": "From GET /cloud/products (or give plan + region)"
     },
     "plan": {
      "type": "string",
      "example": "standart-2-4",
      "description": "Plan name from GET /cloud/products"
     },
     "region": {
      "type": "string",
      "example": "eu-de-1",
      "description": "Region from GET /cloud/locations"
     },
     "server_type": {
      "type": "string",
      "deprecated": true,
      "description": "Deprecated alias of plan"
     },
     "location": {
      "type": "string",
      "deprecated": true,
      "description": "Deprecated alias of region"
     },
     "cycle": {
      "type": "string",
      "default": "monthly",
      "enum": [
       "monthly",
       "quarterly",
       "semiannually",
       "annually"
      ]
     },
     "image": {
      "type": "string",
      "example": "debian-12"
     },
     "ssh_keys": {
      "type": "array",
      "items": {
       "type": "integer"
      },
      "maxItems": 10,
      "description": "Ids from /cloud/ssh-keys. Global regions: one key, installed at creation. tr-ist-1: up to 10 keys, installed for root at creation through cloud-init (`ssh_keys` on GET /cloud/servers/{id} lists their fingerprints and key ids)."
     },
     "hostname": {
      "type": "string",
      "example": "web-1.example.com",
      "description": " In a batch `{n}` is replaced with 1..N (e.g. `web-{n}.example.com`); without `{n}` `-1`, `-2`... is appended."
     },
     "user_data": {
      "type": "string",
      "maxLength": 32768,
      "description": "cloud-init user data: `#cloud-config` or a `#!` script, max 32 KiB. Accepted in every region (tr-ist-1 since 2.14.0). Ignored when a one-click application is chosen on the product.",
      "x-description-tr": "cloud-init kullanıcı verisi: `#cloud-config` ya da `#!` betiği, en çok 32 KiB. Tüm bölgelerde (tr-ist-1'de 2.14.0'dan beri) kabul edilir. Üründe tek tıkla uygulama seçilirse kullanılmaz."
     },
     "dry_run": {
      "type": "boolean",
      "default": false
     },
     "confirm": {
      "type": "boolean",
      "description": "Must be true to place a paid order"
     },
     "end_customer_id": {
      "type": "integer",
      "description": "Reseller main key: assign the new server to this end-customer"
     },
     "project_id": {
      "type": "integer",
      "minimum": 0,
      "description": "Optional project for the new service(s) (0 = default project). Checked before the order: unknown id = 404 `project_not_found` (GyroAPI order endpoints) or 422 `checkout_blocked` with `[project_not_found]` (POST /orders)."
     },
     "quantity": {
      "type": "integer",
      "minimum": 1,
      "maximum": 100,
      "default": 1,
      "description": "Create N identical servers in ONE order (default 1). Upper limit per request: 25 by default (operator setting / per-account override; 422 invalid_quantity above it). The server cap and the prepaid 24-hour balance rule count all N."
     },
     "name": {
      "type": "string",
      "maxLength": 60,
      "example": "gyro-web-{n}",
      "description": "Service name (nickname, shown in the panel, console and API as `nickname`). `{n}` is replaced with 1..N in a batch; without `{n}` a batch appends `-1`, `-2`..."
     },
     "tags": {
      "type": "array",
      "maxItems": 10,
      "items": {
       "oneOf": [
        {
         "type": "string"
        },
        {
         "type": "object",
         "properties": {
          "name": {
           "type": "string"
          },
          "color": {
           "type": "string"
          }
         }
        }
       ]
      },
      "description": "Labels for every new server (max 10, 24 characters each)."
     },
     "app": {
      "type": "string",
      "description": "One-click app id from GET /cloud/apps, installed when the server is up (products that offer apps). Not with `user_data`."
     },
     "app_domain": {
      "type": "string",
      "description": "Domain of the app (its A record must point to the new server); quantity 1 only."
     }
    }
   },
   "Quote": {
    "type": "object",
    "properties": {
     "product_id": {
      "type": "integer"
     },
     "cycle": {
      "type": "string"
     },
     "total": {
      "$ref": "#/components/schemas/Money"
     },
     "tax": {
      "$ref": "#/components/schemas/Money"
     },
     "balance": {
      "$ref": "#/components/schemas/Money"
     }
    }
   },
   "CreateServerResult": {
    "type": "object",
    "properties": {
     "server": {
      "$ref": "#/components/schemas/Server"
     },
     "order": {
      "type": "object",
      "properties": {
       "id": {
        "type": "integer"
       },
       "number": {
        "type": "string"
       },
       "status": {
        "type": "string"
       },
       "total": {
        "$ref": "#/components/schemas/Money"
       }
      }
     },
     "payment": {
      "type": "object",
      "properties": {
       "method": {
        "type": "string",
        "const": "balance"
       },
       "status": {
        "type": "string",
        "enum": [
         "paid",
         "failed",
         "unpaid"
        ]
       },
       "error": {
        "type": "string"
       }
      }
     },
     "invoice": {
      "$ref": "#/components/schemas/Invoice"
     },
     "end_customer_id": {
      "type": [
       "integer",
       "null"
      ]
     },
     "servers": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/Server"
      },
      "description": "All servers of the order (2.21.0); `server` = the first one."
     },
     "quantity": {
      "type": "integer"
     }
    }
   },
   "ActionResult": {
    "type": "object",
    "properties": {
     "action": {
      "type": "string"
     },
     "status": {
      "type": "string",
      "const": "accepted"
     },
     "server_id": {
      "type": "integer"
     },
     "message": {
      "type": "string",
      "description": "Human readable, in the account language"
     },
     "root_password": {
      "type": "string",
      "description": "One-time secret (rebuild without SSH key, reset_password, enable_rescue)"
     },
     "root_password_withheld": {
      "type": "boolean"
     },
     "app_install_id": {
      "type": "integer",
      "description": "rebuild with `app`: id of the started app install (GET /cloud/servers/{id}/app)"
     }
    }
   },
   "Snapshot": {
    "type": "object",
    "properties": {
     "id": {
      "type": "integer"
     },
     "description": {
      "type": "string"
     },
     "status": {
      "type": "string",
      "enum": [
       "creating",
       "available"
      ]
     },
     "size_bytes": {
      "type": "integer"
     },
     "created_at": {
      "type": [
       "string",
       "null"
      ],
      "format": "date-time"
     },
     "type": {
      "type": [
       "string",
       "null"
      ],
      "enum": [
       "manual",
       "auto",
       null
      ]
     }
    }
   },
   "Metrics": {
    "type": "object",
    "properties": {
     "period": {
      "type": "string"
     },
     "series": {
      "type": "object",
      "additionalProperties": {
       "type": "object",
       "properties": {
        "unit": {
         "type": "string"
        },
        "lines": {
         "type": "object",
         "additionalProperties": {
          "type": "array",
          "items": {
           "type": "array",
           "prefixItems": [
            {
             "type": "integer"
            },
            {
             "type": "number"
            }
           ],
           "minItems": 2,
           "maxItems": 2
          }
         }
        }
       }
      }
     }
    }
   },
   "RdnsEntry": {
    "type": "object",
    "properties": {
     "ip": {
      "type": "string"
     },
     "hostname": {
      "type": [
       "string",
       "null"
      ]
     },
     "version": {
      "type": "string",
      "enum": [
       "ipv4",
       "ipv6"
      ]
     },
     "status": {
      "type": "string",
      "enum": [
       "none",
       "pending",
       "active",
       "rejected"
      ],
      "description": "tr-ist-1: `active` = published on our name servers (Gyro Bulut İstanbul publishes within seconds); `pending` only on legacy VDS servers"
     },
     "default": {
      "type": "boolean",
      "description": "tr-ist-1: true when the address uses the automatic default name `<a-b-c-d>.ip.gyrohosting.com` (forward A record exists, FCrDNS passes)"
     }
    }
   },
   "FirewallRule": {
    "type": "object",
    "properties": {
     "direction": {
      "type": "string",
      "enum": [
       "in",
       "out"
      ]
     },
     "priority": {
      "type": "integer",
      "description": "Position (first match wins) - network firewall"
     },
     "type": {
      "type": "string",
      "enum": [
       "rule",
       "brute_force",
       "port_scan"
      ]
     },
     "action": {
      "type": "string",
      "enum": [
       "allow",
       "deny"
      ]
     },
     "source": {
      "type": "string",
      "description": "any | CIDR list | country:XX | not-country:XX"
     },
     "destination": {
      "type": "string",
      "description": "any or one IP of the server"
     },
     "description": {
      "type": "string"
     },
     "threshold": {
      "type": [
       "integer",
       "null"
      ]
     },
     "read_only": {
      "type": "boolean"
     },
     "protocol": {
      "type": "string",
      "example": "tcp"
     },
     "port": {
      "type": [
       "string",
       "null"
      ],
      "example": "22"
     },
     "source_ips": {
      "type": "array",
      "items": {
       "type": "string"
      }
     }
    }
   },
   "Invoice": {
    "type": "object",
    "additionalProperties": true,
    "properties": {
     "invoice_id": {
      "type": "integer"
     },
     "number": {
      "type": "string"
     },
     "status": {
      "type": "string"
     },
     "state": {
      "type": "string",
      "enum": [
       "paid",
       "unpaid",
       "overdue",
       "refunded",
       "cancelled",
       "waiting"
      ]
     },
     "total": {
      "$ref": "#/components/schemas/Money"
     },
     "created_at": {
      "type": [
       "string",
       "null"
      ],
      "format": "date"
     },
     "paid_at": {
      "type": [
       "string",
       "null"
      ],
      "format": "date"
     },
     "due_date": {
      "type": [
       "string",
       "null"
      ],
      "format": "date"
     }
    }
   },
   "ActivityEntry": {
    "type": "object",
    "properties": {
     "id": {
      "type": "integer"
     },
     "method": {
      "type": "string"
     },
     "path": {
      "type": "string"
     },
     "scope": {
      "type": "string",
      "enum": [
       "cloud_read",
       "cloud_write",
       "cloud_order",
       "cloud_delete"
      ]
     },
     "object": {
      "type": [
       "object",
       "null"
      ],
      "properties": {
       "type": {
        "type": "string"
       },
       "id": {
        "type": "integer"
       }
      }
     },
     "status_code": {
      "type": "integer"
     },
     "ip": {
      "type": "string"
     },
     "key_id": {
      "type": "integer"
     },
     "created_at": {
      "type": "string",
      "format": "date-time"
     },
     "customer_id": {
      "type": [
       "integer",
       "null"
      ]
     }
    }
   },
   "Service": {
    "type": "object",
    "properties": {
     "id": {
      "type": "integer"
     },
     "type": {
      "type": "string",
      "example": "server"
     },
     "product_line": {
      "type": "string",
      "example": "mail"
     },
     "module": {
      "type": [
       "string",
       "null"
      ],
      "description": "Omitted for white-label resellers"
     },
     "name": {
      "type": "string"
     },
     "status": {
      "type": "string"
     },
     "product_id": {
      "type": "integer"
     },
     "host": {
      "type": [
       "string",
       "null"
      ]
     },
     "ip": {
      "type": [
       "string",
       "null"
      ]
     },
     "cycle": {
      "type": "string"
     },
     "price": {
      "$ref": "#/components/schemas/Money"
     },
     "auto_renew": {
      "type": "boolean"
     },
     "due_date": {
      "type": [
       "string",
       "null"
      ],
      "format": "date"
     },
     "customer_id": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Reseller end-customer the service is assigned to"
     },
     "nickname": {
      "type": [
       "string",
       "null"
      ],
      "description": "Customer-defined nickname (see `/cloud/services/{id}/label`); null when not set"
     },
     "tags": {
      "type": "array",
      "description": "Customer-defined colour tags (see `/cloud/services/{id}/label`); empty when not set",
      "items": {
       "$ref": "#/components/schemas/ServiceLabelTag"
      }
     },
     "project": {
      "$ref": "#/components/schemas/ProjectRef"
     }
    }
   },
   "ServiceLabelTag": {
    "type": "object",
    "required": [
     "name"
    ],
    "properties": {
     "name": {
      "type": "string",
      "minLength": 1,
      "maxLength": 24,
      "description": "Letter or digit first; then letters, digits, space and . _ - / + # &",
      "example": "production"
     },
     "color": {
      "type": "string",
      "enum": [
       "gray",
       "blue",
       "green",
       "red",
       "orange",
       "yellow",
       "purple",
       "pink",
       "teal",
       "indigo"
      ],
      "example": "green"
     }
    }
   },
   "ServiceLabel": {
    "type": "object",
    "properties": {
     "service_id": {
      "type": "integer"
     },
     "nickname": {
      "type": [
       "string",
       "null"
      ],
      "maxLength": 60,
      "description": "Shown next to the product name in the client area"
     },
     "tags": {
      "type": "array",
      "maxItems": 10,
      "items": {
       "$ref": "#/components/schemas/ServiceLabelTag"
      }
     },
     "updated_at": {
      "type": [
       "string",
       "null"
      ],
      "format": "date-time"
     },
     "colors": {
      "type": "array",
      "description": "Allowed colour keys (palette)",
      "items": {
       "type": "string"
      }
     }
    }
   },
   "ServiceLabelUpdate": {
    "type": "object",
    "minProperties": 1,
    "properties": {
     "nickname": {
      "type": [
       "string",
       "null"
      ],
      "maxLength": 60,
      "description": "\"\" or null clears the nickname. No control characters.",
      "x-description-tr": "\"\" veya null takma adı temizler. Kontrol karakteri içeremez."
     },
     "tags": {
      "type": [
       "array",
       "null"
      ],
      "maxItems": 10,
      "description": "Replaces all tags; [] or null clears them. Item: a tag name, or {\"name\", \"color\"} (CLI: use --data for colours).",
      "x-description-tr": "Tüm etiketlerin yerine geçer; [] veya null temizler. Öğe: etiket adı ya da {\"name\", \"color\"} (CLI: renk için --data kullanın).",
      "items": {
       "oneOf": [
        {
         "type": "string",
         "minLength": 1,
         "maxLength": 24
        },
        {
         "$ref": "#/components/schemas/ServiceLabelTag"
        }
       ]
      }
     }
    }
   },
   "ServiceTools": {
    "type": "object",
    "properties": {
     "service_id": {
      "type": "integer"
     },
     "product_line": {
      "type": "string"
     },
     "tools": {
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "tool": {
         "type": "string",
         "example": "snapshots"
        },
        "group": {
         "type": "string"
        },
        "label": {
         "type": "string"
        },
        "actions": {
         "type": "array",
         "items": {
          "type": "object",
          "properties": {
           "action": {
            "type": "string"
           },
           "read": {
            "type": "boolean"
           },
           "confirm": {
            "type": "boolean"
           },
           "secret": {
            "type": "boolean"
           }
          }
         }
        }
       }
      }
     },
     "methods": {
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "method": {
         "type": "string"
        },
        "confirm": {
         "type": "boolean"
        }
       }
      }
     }
    }
   },
   "FirewallRuleInput": {
    "type": "object",
    "description": "One firewall rule. New schema (v2.8, network firewall add-on): action, protocol, source, destination, port, priority, direction, description. Legacy fields (protocol tcp|udp|icmp + port + source_ips) are still accepted.",
    "properties": {
     "priority": {
      "type": "integer",
      "minimum": 1,
      "description": "Position (1 = evaluated first). Default = last. First matching rule wins."
     },
     "direction": {
      "type": "string",
      "enum": [
       "in",
       "out"
      ],
      "default": "in",
      "description": "in = inbound to the server, out = new outbound connections (network firewall only)"
     },
     "action": {
      "type": "string",
      "enum": [
       "allow",
       "deny"
      ],
      "default": "allow"
     },
     "protocol": {
      "type": "string",
      "enum": [
       "tcp",
       "udp",
       "tcp_udp",
       "icmp",
       "all"
      ],
      "default": "tcp"
     },
     "source": {
      "type": "string",
      "description": "any | IPv4/CIDR list (comma separated, max 10). For direction out: the remote address. Country sources (country:XX / not-country:XX) are accepted only when capabilities.country_filter is true (currently not offered).",
      "example": "203.0.113.0/24"
     },
     "destination": {
      "type": "string",
      "description": "any (all IPs of the server) or one IP address of the server",
      "default": "any"
     },
     "port": {
      "type": "string",
      "description": "any | 22 | 80,443 | 1000-2000 (not for icmp/all)",
      "example": "22"
     },
     "description": {
      "type": "string",
      "maxLength": 60
     },
     "source_ips": {
      "type": "array",
      "items": {
       "type": "string"
      },
      "maxItems": 20,
      "description": "Legacy - CIDRs (use source)"
     },
     "permanent": {
      "type": "boolean",
      "description": "Network firewall - skip the 5 minute trial and make the change permanent at once"
     },
     "confirm_warnings": {
      "type": "boolean",
      "description": "Apply even when the change has warnings (lock-out risk, shadowed or duplicate rules, private sources)"
     }
    }
   },
   "FirewallPolicy": {
    "type": "object",
    "description": "Network firewall of a server (AWS network ACL / ufw model). Rules are evaluated top to bottom, the first match wins; default_action applies to inbound traffic that matches no rule.",
    "properties": {
     "server_id": {
      "type": "integer"
     },
     "engine": {
      "type": "string",
      "enum": [
       "network",
       "cloud"
      ],
      "description": "network = Istanbul core network (allow + deny, inbound + outbound, stateless - see capabilities); cloud = provider firewall (allow rules only, default deny, inbound only)"
     },
     "default_action": {
      "type": "string",
      "enum": [
       "allow",
       "deny"
      ]
     },
     "ping": {
      "type": "boolean"
     },
     "status": {
      "type": "string",
      "enum": [
       "none",
       "applying",
       "trial",
       "active",
       "open",
       "removing"
      ]
     },
     "permanent": {
      "type": "boolean"
     },
     "trial_seconds_left": {
      "type": "integer"
     },
     "busy": {
      "type": "boolean"
     },
     "locked": {
      "type": "boolean",
      "description": "Settings locked by Gyro support"
     },
     "rules": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/FirewallRule"
      }
     },
     "operator_rules": {
      "type": "array",
      "description": "Rules applied by Gyro (read only, evaluated before yours)",
      "items": {
       "$ref": "#/components/schemas/FirewallRule"
      }
     },
     "corrections": {
      "type": "array",
      "items": {
       "type": "string"
      },
      "description": "Network addresses corrected on save (e.g. 10.1.2.3/24 -> 10.1.2.0/24)"
     },
     "capabilities": {
      "$ref": "#/components/schemas/FirewallCapabilities"
     }
    }
   },
   "FirewallCapabilities": {
    "type": "object",
    "description": "Features of the firewall platform behind this server. A request that uses a feature marked false is rejected with 422 err_feature_off.",
    "properties": {
     "backend": {
      "type": "string",
      "enum": [
       "stateful",
       "stateless",
       "cloud"
      ],
      "description": "stateless = hardware ACL at the network edge: with default_action deny, replies to connections the server opened are let through automatically (TCP replies, UDP from port 53/123, UDP to udp_return_ports, ICMP replies)."
     },
     "country_filter": {
      "type": "boolean"
     },
     "brute_force": {
      "type": "boolean"
     },
     "port_scan": {
      "type": "boolean"
     },
     "rate_limit": {
      "type": "boolean"
     },
     "outbound_rules": {
      "type": "boolean"
     },
     "security_groups": {
      "type": "boolean"
     },
     "trial": {
      "type": "boolean"
     },
     "counters": {
      "type": "boolean"
     },
     "udp_return_ports": {
      "type": "string",
      "nullable": true,
      "example": "32768-65535"
     }
    }
   },
   "FirewallPolicyInput": {
    "type": "object",
    "required": [
     "rules"
    ],
    "properties": {
     "default_action": {
      "type": "string",
      "enum": [
       "allow",
       "deny"
      ],
      "default": "allow"
     },
     "ping": {
      "type": "boolean",
      "default": true
     },
     "rules": {
      "type": "array",
      "maxItems": 70,
      "items": {
       "$ref": "#/components/schemas/FirewallRuleInput"
      }
     },
     "permanent": {
      "type": "boolean",
      "description": "Skip the 5 minute trial (otherwise call POST /firewall/policy/confirm within 5 minutes or the change is reverted)"
     },
     "confirm_warnings": {
      "type": "boolean"
     }
    }
   },
   "BulkResult": {
    "type": "object",
    "properties": {
     "action": {
      "type": "string"
     },
     "succeeded": {
      "type": "integer"
     },
     "failed": {
      "type": "integer"
     },
     "results": {
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "server_id": {
         "type": "integer"
        },
        "ok": {
         "type": "boolean"
        },
        "status": {
         "type": "string"
        },
        "error": {
         "type": "object",
         "properties": {
          "code": {
           "type": "string"
          },
          "message": {
           "type": "string"
          }
         }
        }
       }
      }
     }
    }
   },
   "WebhookEvent": {
    "type": "string",
    "enum": [
     "service.created",
     "service.active",
     "service.suspended",
     "service.unsuspended",
     "service.cancelled",
     "service.status_changed",
     "invoice.created",
     "invoice.paid",
     "order.created",
     "ticket.replied",
     "ticket.status_changed",
     "api.test"
    ]
   },
   "Webhook": {
    "type": "object",
    "properties": {
     "id": {
      "type": "integer"
     },
     "url": {
      "type": "string"
     },
     "events": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/WebhookEvent"
      }
     },
     "description": {
      "type": [
       "string",
       "null"
      ]
     },
     "customer_id": {
      "type": [
       "integer",
       "null"
      ]
     },
     "status": {
      "type": "string",
      "enum": [
       "active",
       "disabled"
      ]
     },
     "consecutive_failures": {
      "type": "integer"
     },
     "created_at": {
      "type": "string",
      "format": "date-time"
     }
    }
   },
   "WebhookDelivery": {
    "type": "object",
    "properties": {
     "id": {
      "type": "integer"
     },
     "delivery_id": {
      "type": "string"
     },
     "event": {
      "type": "string"
     },
     "status": {
      "type": "string",
      "enum": [
       "pending",
       "sent",
       "failed"
      ]
     },
     "attempts": {
      "type": "integer"
     },
     "http_code": {
      "type": [
       "integer",
       "null"
      ]
     },
     "error": {
      "type": [
       "string",
       "null"
      ]
     },
     "created_at": {
      "type": "string",
      "format": "date-time"
     },
     "sent_at": {
      "type": [
       "string",
       "null"
      ],
      "format": "date-time"
     }
    }
   },
   "ApiKeyInput": {
    "type": "object",
    "required": [
     "name"
    ],
    "properties": {
     "name": {
      "type": "string",
      "maxLength": 48
     },
     "scopes": {
      "type": "array",
      "items": {
       "type": "string",
       "enum": [
        "cloud_read",
        "cloud_write",
        "cloud_order",
        "cloud_delete",
        "services_read",
        "services_write",
        "webhooks"
       ]
      },
      "default": [
       "cloud_read"
      ]
     },
     "services": {
      "type": "array",
      "items": {
       "type": "integer"
      },
      "description": "Optional service allow list"
     },
     "actions": {
      "type": "array",
      "items": {
       "type": "string"
      },
      "description": "Optional action allow list: server actions (reboot) or tool:action / tool:* / method:name"
     },
     "ips": {
      "type": "array",
      "items": {
       "type": "string"
      }
     },
     "rate_limit": {
      "type": "integer",
      "description": "Requests per minute (<= your own limit; 0 = default)"
     }
    }
   },
   "ApiKey": {
    "type": "object",
    "properties": {
     "id": {
      "type": "integer"
     },
     "name": {
      "type": "string"
     },
     "token_prefix": {
      "type": "string"
     },
     "customer_id": {
      "type": [
       "integer",
       "null"
      ]
     },
     "scopes": {
      "type": "array",
      "items": {
       "type": "string"
      }
     },
     "services": {
      "type": [
       "array",
       "null"
      ],
      "items": {
       "type": "integer"
      }
     },
     "actions": {
      "type": [
       "array",
       "null"
      ],
      "items": {
       "type": "string"
      }
     },
     "ips": {
      "type": "array",
      "items": {
       "type": "string"
      }
     },
     "rate_limit": {
      "type": [
       "integer",
       "null"
      ]
     },
     "status": {
      "type": "string",
      "enum": [
       "active",
       "revoked"
      ]
     },
     "created_at": {
      "type": "string",
      "format": "date-time"
     },
     "last_used_at": {
      "type": [
       "string",
       "null"
      ],
      "format": "date-time"
     }
    }
   },
   "EndCustomerInput": {
    "type": "object",
    "properties": {
     "name": {
      "type": "string",
      "maxLength": 128
     },
     "email": {
      "type": "string"
     },
     "external_ref": {
      "type": "string",
      "maxLength": 64,
      "description": "Your own customer id (unique per reseller)"
     },
     "note": {
      "type": "string",
      "maxLength": 500
     },
     "status": {
      "type": "string",
      "enum": [
       "active",
       "suspended"
      ]
     },
     "allow_order": {
      "type": "boolean",
      "description": "May this customer's keys order servers (paid from YOUR balance)?"
     }
    }
   },
   "EndCustomer": {
    "type": "object",
    "properties": {
     "id": {
      "type": "integer"
     },
     "name": {
      "type": "string"
     },
     "email": {
      "type": [
       "string",
       "null"
      ]
     },
     "external_ref": {
      "type": [
       "string",
       "null"
      ]
     },
     "note": {
      "type": [
       "string",
       "null"
      ]
     },
     "status": {
      "type": "string"
     },
     "allow_order": {
      "type": "boolean"
     },
     "services": {
      "type": "integer"
     },
     "created_at": {
      "type": "string",
      "format": "date-time"
     }
    }
   },
   "ResellerSettings": {
    "type": "object",
    "properties": {
     "white_label": {
      "type": "boolean"
     },
     "is_reseller": {
      "type": "boolean"
     }
    }
   },
   "ResellerReport": {
    "type": "object",
    "properties": {
     "from": {
      "type": "string",
      "format": "date"
     },
     "to": {
      "type": "string",
      "format": "date"
     },
     "customers": {
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "customer_id": {
         "type": [
          "integer",
          "null"
         ]
        },
        "services": {
         "type": "integer"
        },
        "by_status": {
         "type": "object",
         "additionalProperties": {
          "type": "integer"
         }
        },
        "recurring": {
         "type": "object",
         "additionalProperties": {
          "type": "number"
         },
         "description": "\"<cycle> <currency>\" -> amount"
        },
        "paid_in_period": {
         "type": "object",
         "additionalProperties": {
          "type": "number"
         },
         "description": "currency -> amount"
        }
       }
      }
     }
    }
   },
   "LoadBalancer": {
    "type": "object",
    "properties": {
     "id": {
      "type": "integer"
     },
     "name": {
      "type": "string"
     },
     "status": {
      "type": "string"
     },
     "product_id": {
      "type": "integer"
     },
     "cycle": {
      "type": "string"
     },
     "price": {
      "type": "object",
      "properties": {
       "amount": {
        "type": "number"
       },
       "currency": {
        "type": [
         "string",
         "null"
        ]
       }
      }
     },
     "due_date": {
      "type": [
       "string",
       "null"
      ]
     },
     "nickname": {
      "type": [
       "string",
       "null"
      ]
     },
     "load_balancer": {
      "type": [
       "object",
       "null"
      ],
      "description": "Live state (detail only)",
      "properties": {
       "name": {
        "type": "string"
       },
       "status": {
        "type": "string",
        "enum": [
         "running",
         "stopped",
         "suspended",
         "deleting"
        ]
       },
       "size": {
        "type": [
         "string",
         "null"
        ],
        "enum": [
         "small",
         "medium",
         "large",
         null
        ]
       },
       "region": {
        "type": "string"
       },
       "location": {
        "type": "string"
       },
       "ipv4": {
        "type": [
         "string",
         "null"
        ]
       },
       "ipv6": {
        "type": [
         "string",
         "null"
        ]
       },
       "algorithm": {
        "type": "string"
       },
       "limits": {
        "type": "object",
        "additionalProperties": true
       },
       "traffic": {
        "type": "object",
        "additionalProperties": true
       },
       "services": {
        "type": "array",
        "items": {
         "type": "object",
         "additionalProperties": true
        }
       },
       "targets": {
        "type": "array",
        "items": {
         "type": "object",
         "additionalProperties": true
        }
       },
       "certificates": {
        "type": "array",
        "items": {
         "type": "object",
         "additionalProperties": true
        }
       },
       "private_network": {
        "type": "boolean"
       }
      }
     }
    }
   },
   "AcmeKey": {
    "type": "object",
    "properties": {
     "id": {
      "type": "integer"
     },
     "name": {
      "type": "string"
     },
     "token_prefix": {
      "type": "string"
     },
     "service_id": {
      "type": "integer"
     },
     "zones": {
      "type": [
       "array",
       "null"
      ],
      "items": {
       "type": "string"
      },
      "description": "Allowed zones (null = every zone of the service)"
     },
     "ips": {
      "type": "array",
      "items": {
       "type": "string"
      }
     },
     "status": {
      "type": "string"
     },
     "created_at": {
      "type": "string"
     },
     "last_used_at": {
      "type": [
       "string",
       "null"
      ]
     },
     "token": {
      "type": "string",
      "description": "Only in the create answer, shown once",
      "x-description-tr": "Yalnız oluşturma yanıtında, bir kez"
     }
    }
   },
   "AcmeChallenge": {
    "type": "object",
    "properties": {
     "service_id": {
      "type": "integer"
     },
     "zone": {
      "type": "string"
     },
     "name": {
      "type": "string"
     },
     "status": {
      "type": "string",
      "description": "accepted (add/remove)"
     },
     "values": {
      "type": "integer",
      "description": "Values now at the name"
     },
     "changed": {
      "type": "boolean"
     },
     "ready": {
      "type": "boolean",
      "description": "Status: both name servers publish `value`"
     },
     "nameservers": {
      "type": "object",
      "additionalProperties": {
       "type": [
        "array",
        "null"
       ],
       "items": {
        "type": "string"
       }
      }
     },
     "ttl": {
      "type": "integer"
     }
    }
   },
   "StorageCorsRule": {
    "type": "object",
    "additionalProperties": false,
    "required": [
     "AllowedOrigins",
     "AllowedMethods"
    ],
    "properties": {
     "ID": {
      "type": "string",
      "maxLength": 64
     },
     "AllowedOrigins": {
      "type": "array",
      "maxItems": 50,
      "items": {
       "type": "string"
      },
      "description": "https://www.example.com, https://*.example.com, http://localhost:3000 or *"
     },
     "AllowedMethods": {
      "type": "array",
      "items": {
       "type": "string",
       "enum": [
        "GET",
        "PUT",
        "POST",
        "DELETE",
        "HEAD"
       ]
      }
     },
     "AllowedHeaders": {
      "type": "array",
      "maxItems": 50,
      "items": {
       "type": "string"
      }
     },
     "ExposeHeaders": {
      "type": "array",
      "maxItems": 50,
      "items": {
       "type": "string"
      }
     },
     "MaxAgeSeconds": {
      "type": "integer",
      "minimum": 0,
      "maximum": 86400
     }
    }
   },
   "SecurityGroupRule": {
    "type": "object",
    "required": [
     "type"
    ],
    "description": "Allow rule (security groups never deny; stateful: replies pass automatically).",
    "x-description-tr": "İzin kuralı (güvenlik grupları engellemez; bağlantı durumu izlenir, yanıtlar kendiliğinden geçer).",
    "properties": {
     "id": {
      "type": "string",
      "pattern": "^gfr-[a-f0-9]{8}$",
      "description": "Rule id (keep it when you edit a rule; omit for a new rule)"
     },
     "direction": {
      "type": "string",
      "enum": [
       "in",
       "out"
      ],
      "default": "in",
      "description": "in = to your servers; out = new connections from your servers (network servers only)"
     },
     "type": {
      "type": "string",
      "enum": [
       "ssh",
       "http",
       "https",
       "rdp",
       "mysql",
       "postgresql",
       "mssql",
       "redis",
       "mongodb",
       "smtp",
       "smtps",
       "imaps",
       "dns_udp",
       "dns_tcp",
       "all_tcp",
       "all_udp",
       "all_icmp",
       "all",
       "custom_tcp",
       "custom_udp"
      ],
      "description": "Fixes protocol and port; custom_tcp / custom_udp take `port`"
     },
     "protocol": {
      "type": "string",
      "readOnly": true,
      "enum": [
       "tcp",
       "udp",
       "icmp",
       "all"
      ]
     },
     "port": {
      "type": "string",
      "description": "For custom_tcp / custom_udp: 8080 or 8000-8100. Read: the port of the type, `all` for all ports",
      "example": "8080"
     },
     "source": {
      "type": "array",
      "items": {
       "type": "string"
      },
      "maxItems": 50,
      "description": "IPv4 / CIDR list; [\"0.0.0.0/0\"] = anywhere. For out: the remote address",
      "example": [
       "203.0.113.10/32"
      ]
     },
     "description": {
      "type": "string",
      "maxLength": 60
     }
    }
   },
   "SecurityGroup": {
    "type": "object",
    "properties": {
     "id": {
      "type": "string",
      "example": "sg-1a2b3c4d"
     },
     "name": {
      "type": "string"
     },
     "description": {
      "type": "string"
     },
     "status": {
      "type": "string",
      "enum": [
       "unused",
       "applying",
       "active",
       "trial"
      ]
     },
     "trial_seconds_left": {
      "type": "integer",
      "description": "Seconds until an unconfirmed trial reverts (also during `applying`), else 0"
     },
     "rules": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/SecurityGroupRule"
      }
     },
     "servers": {
      "type": "array",
      "items": {
       "type": "integer"
      },
      "description": "Your servers the group is attached to"
     },
     "created_at": {
      "type": "string"
     },
     "trial": {
      "type": "boolean",
      "description": "A rule change is running as a 5 minute trial (also while it is still being applied, `status: applying`); confirm with POST .../confirm"
     }
    }
   },
   "ServerSecurityGroups": {
    "type": "object",
    "properties": {
     "server_id": {
      "type": "integer"
     },
     "max": {
      "type": "integer"
     },
     "rule_allowance": {
      "type": "integer"
     },
     "security_groups": {
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "id": {
         "type": "string"
        },
        "name": {
         "type": "string"
        }
       }
      }
     },
     "trial": {
      "type": "boolean"
     }
    }
   },
   "ServerSshKeys": {
    "type": [
     "object",
     "null"
    ],
    "description": "tr-ist-1: SSH keys given at creation. Gyro Compute servers (installed with cloud-init at creation): `state` installed | none, `method: cloud-init`, `fingerprints`, `key_ids` (matching keys of your account). Older tr-ist-1 servers: install state of the guest job.",
    "properties": {
     "state": {
      "type": "string",
      "enum": [
       "pending",
       "sent",
       "installed",
       "failed",
       "cancelled",
       "none"
      ]
     },
     "fingerprints": {
      "type": "array",
      "items": {
       "type": "string"
      }
     },
     "attempts": {
      "type": "integer"
     },
     "message": {
      "type": [
       "string",
       "null"
      ]
     },
     "updated_at": {
      "type": [
       "string",
       "null"
      ],
      "format": "date-time"
     },
     "method": {
      "type": "string",
      "description": "cloud-init (installed at creation) or guest-job"
     },
     "key_ids": {
      "type": "array",
      "items": {
       "type": "integer"
      },
      "description": "Ids of your account keys (/cloud/ssh-keys) with these fingerprints"
     }
    }
   },
   "MoneyEur": {
    "allOf": [
     {
      "$ref": "#/components/schemas/Money"
     },
     {
      "type": "object",
      "properties": {
       "amount_eur": {
        "type": "number"
       }
      }
     }
    ]
   },
   "PrepaidBalance": {
    "type": "object",
    "properties": {
     "balance": {
      "$ref": "#/components/schemas/Money"
     },
     "hourly_cost": {
      "$ref": "#/components/schemas/Money"
     },
     "daily_cost": {
      "$ref": "#/components/schemas/Money"
     },
     "upcoming_invoices_7d": {
      "$ref": "#/components/schemas/Money"
     },
     "hours_left": {
      "type": "number",
      "nullable": true
     },
     "runs_out_at": {
      "type": "string",
      "format": "date-time",
      "nullable": true
     },
     "level": {
      "type": "string",
      "enum": [
       "ok",
       "low",
       "critical"
      ]
     },
     "services": {
      "type": "object",
      "properties": {
       "active": {
        "type": "integer"
       },
       "suspended": {
        "type": "integer"
       },
       "deleted": {
        "type": "integer"
       }
      }
     },
     "suspended_hourly_cost": {
      "$ref": "#/components/schemas/Money"
     },
     "eur_rate": {
      "type": "number"
     },
     "computed_at": {
      "type": "string",
      "format": "date-time"
     },
     "topup_url": {
      "type": "string"
     },
     "note": {
      "type": "string"
     }
    }
   },
   "UsageHour": {
    "type": "object",
    "properties": {
     "hour": {
      "type": "string",
      "format": "date-time"
     },
     "service_id": {
      "type": "integer"
     },
     "item": {
      "type": "string"
     },
     "description": {
      "type": "string"
     },
     "status": {
      "type": "string",
      "enum": [
       "ucretli",
       "tavan",
       "kismi",
       "odenmedi",
       "ucretsiz"
      ]
     },
     "power": {
      "type": "string",
      "nullable": true,
      "enum": [
       "calisiyor",
       "kapali",
       "bilinmiyor"
      ]
     },
     "quantity": {
      "type": "object",
      "nullable": true,
      "properties": {
       "used": {
        "type": "number"
       },
       "free": {
        "type": "number"
       },
       "unit": {
        "type": "string"
       }
      }
     },
     "unit_price_eur": {
      "type": "number"
     },
     "eur_rate": {
      "type": "number"
     },
     "unit_price": {
      "$ref": "#/components/schemas/Money"
     },
     "amount": {
      "$ref": "#/components/schemas/Money"
     },
     "amount_eur": {
      "type": "number"
     }
    }
   },
   "UsagePeriod": {
    "type": "object",
    "properties": {
     "period": {
      "type": "string"
     },
     "hours": {
      "type": "integer"
     },
     "amount": {
      "$ref": "#/components/schemas/Money"
     },
     "amount_eur": {
      "type": "number"
     }
    }
   },
   "ServiceTotal": {
    "type": "object",
    "properties": {
     "service_id": {
      "type": "integer"
     },
     "description": {
      "type": "string"
     },
     "hours": {
      "type": "integer"
     },
     "line_items": {
      "type": "integer"
     },
     "amount": {
      "$ref": "#/components/schemas/Money"
     }
    }
   },
   "StorageVersion": {
    "type": "object",
    "properties": {
     "key": {
      "type": "string"
     },
     "version_id": {
      "type": "string"
     },
     "is_latest": {
      "type": "boolean"
     },
     "delete_marker": {
      "type": "boolean"
     },
     "size": {
      "type": "integer"
     },
     "modified": {
      "type": "string",
      "format": "date-time"
     },
     "lock_mode": {
      "type": [
       "string",
       "null"
      ],
      "enum": [
       "GOVERNANCE",
       "COMPLIANCE",
       null
      ]
     },
     "retain_until": {
      "type": [
       "string",
       "null"
      ],
      "format": "date-time"
     },
     "legal_hold": {
      "type": "boolean"
     }
    }
   },
   "StorageVersionList": {
    "type": "object",
    "properties": {
     "bucket": {
      "type": "string"
     },
     "prefix": {
      "type": "string"
     },
     "object_lock": {
      "type": "boolean"
     },
     "folders": {
      "type": "array",
      "items": {
       "type": "string"
      }
     },
     "items": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/StorageVersion"
      },
      "description": "Versions and delete markers"
     },
     "next_key_marker": {
      "type": [
       "string",
       "null"
      ]
     },
     "next_version_id_marker": {
      "type": [
       "string",
       "null"
      ]
     },
     "truncated": {
      "type": "boolean"
     }
    }
   },
   "StorageDefaultRetention": {
    "type": [
     "object",
     "null"
    ],
    "properties": {
     "mode": {
      "type": "string",
      "enum": [
       "GOVERNANCE",
       "COMPLIANCE"
      ]
     },
     "days": {
      "type": [
       "integer",
       "null"
      ]
     },
     "years": {
      "type": [
       "integer",
       "null"
      ]
     }
    }
   },
   "StorageBucketObjectLock": {
    "type": "object",
    "properties": {
     "bucket": {
      "type": "string"
     },
     "object_lock": {
      "type": "boolean"
     },
     "default_retention": {
      "$ref": "#/components/schemas/StorageDefaultRetention"
     }
    }
   },
   "StorageLockScan": {
    "type": "object",
    "properties": {
     "complete": {
      "type": "boolean"
     },
     "versions": {
      "type": "integer"
     },
     "compliance": {
      "type": "integer"
     },
     "governance": {
      "type": "integer"
     },
     "legal_hold": {
      "type": "integer"
     },
     "latest_until": {
      "type": [
       "string",
       "null"
      ]
     },
     "latest_compliance_until": {
      "type": [
       "string",
       "null"
      ]
     },
     "scanned_at": {
      "type": [
       "string",
       "null"
      ]
     }
    }
   },
   "StorageObjectLockSummary": {
    "type": "object",
    "properties": {
     "service_id": {
      "type": "integer"
     },
     "product": {
      "type": "string",
      "enum": [
       "protected_storage"
      ]
     },
     "versioning": {
      "type": "boolean"
     },
     "locked_bucket_rights": {
      "type": "integer"
     },
     "locked_buckets_used": {
      "type": "integer"
     },
     "max_retention_days": {
      "type": "integer"
     },
     "buckets": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/StorageBucketObjectLock"
      }
     },
     "scan": {
      "oneOf": [
       {
        "$ref": "#/components/schemas/StorageLockScan"
       },
       {
        "type": "null"
       }
      ]
     }
    }
   },
   "StorageObjectRetention": {
    "type": "object",
    "properties": {
     "bucket": {
      "type": "string"
     },
     "key": {
      "type": "string"
     },
     "version_id": {
      "type": "string"
     },
     "size": {
      "type": "integer"
     },
     "mode": {
      "type": [
       "string",
       "null"
      ],
      "enum": [
       "GOVERNANCE",
       "COMPLIANCE",
       null
      ]
     },
     "retain_until": {
      "type": [
       "string",
       "null"
      ],
      "format": "date-time"
     },
     "retention_active": {
      "type": "boolean"
     },
     "legal_hold": {
      "type": "boolean"
     }
    }
   },
   "StorageNoncurrentExpiration": {
    "type": "object",
    "properties": {
     "bucket": {
      "type": "string"
     },
     "noncurrent_days": {
      "type": [
       "integer",
       "null"
      ]
     },
     "enabled": {
      "type": "boolean"
     },
     "default_days": {
      "type": "integer"
     }
    }
   },
   "Template": {
    "type": "object",
    "properties": {
     "id": {
      "type": "integer"
     },
     "image": {
      "type": "string",
      "description": "Image slug to use for installs: custom:<id>"
     },
     "name": {
      "type": "string"
     },
     "description": {
      "type": "string"
     },
     "status": {
      "type": "string",
      "enum": [
       "creating",
       "ready",
       "error",
       "deleting",
       "suspended"
      ],
      "description": "suspended = template storage suspended (balance)"
     },
     "size_gb": {
      "type": "number",
      "description": "Space the template really uses (GB, billed)"
     },
     "size_bytes": {
      "type": "integer"
     },
     "min_disk_gb": {
      "type": "integer",
      "description": "Smallest disk a server from this template can have"
     },
     "base_image": {
      "type": "string"
     },
     "base_image_name": {
      "type": "string"
     },
     "source_server_id": {
      "type": [
       "integer",
       "null"
      ]
     },
     "region": {
      "type": "string"
     },
     "mode": {
      "type": "string",
      "enum": [
       "snapshot",
       "shutdown"
      ],
      "description": "How the template was copied"
     },
     "warnings": {
      "type": "array",
      "items": {
       "type": "string"
      },
      "description": "crash_consistent | extra_disks_excluded"
     },
     "created_at": {
      "type": [
       "string",
       "null"
      ],
      "format": "date-time"
     },
     "ready_at": {
      "type": [
       "string",
       "null"
      ],
      "format": "date-time"
     },
     "pricing": {
      "type": "object",
      "properties": {
       "billing": {
        "type": "string"
       },
       "per_gb_monthly_eur": {
        "type": "number"
       },
       "monthly_eur": {
        "type": "number"
       },
       "hourly_eur": {
        "type": "number"
       }
      }
     }
    }
   },
   "ServerIps": {
    "type": "object",
    "properties": {
     "server_id": {
      "type": "integer"
     },
     "primary_ip": {
      "type": [
       "string",
       "null"
      ]
     },
     "extra_ips": {
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "ip": {
         "type": "string"
        },
        "prefix": {
         "type": "integer",
         "description": "always 32 (configured as /32 on the primary interface)"
        },
        "added_at": {
         "type": [
          "string",
          "null"
         ]
        },
        "reverse_dns": {
         "type": [
          "string",
          "null"
         ]
        }
       }
      }
     },
     "count": {
      "type": "integer"
     },
     "max": {
      "type": "integer",
      "description": "per-server limit (default 5)"
     },
     "available": {
      "type": "integer"
     },
     "applied_on_server": {
      "type": "boolean",
      "description": "false = the server's guest agent did not confirm yet (see manual_commands)"
     },
     "pending": {
      "type": "boolean",
      "description": "true while the address list is being applied on the server (a few seconds)"
     },
     "manual_commands": {
      "type": "array",
      "items": {
       "type": "string"
      }
     },
     "pricing": {
      "type": "object",
      "properties": {
       "billing": {
        "type": "string"
       },
       "per_ip_monthly_eur": {
        "type": "number"
       },
       "per_ip_hourly_eur": {
        "type": "number"
       },
       "per_ip_monthly_text": {
        "type": [
         "string",
         "null"
        ],
        "description": "TL (EUR) at the panel rate"
       },
       "minimum_hours": {
        "type": "integer",
        "description": "every added address is billed at least this many hours (default 6), even if released earlier; taking an address again starts a new minimum"
       }
      }
     },
     "added": {
      "type": "array",
      "items": {
       "type": "string"
      }
     },
     "released": {
      "type": "string"
     },
     "adds_per_hour": {
      "type": [
       "integer",
       "null"
      ],
      "description": "addresses that can be added to this server per rolling 60 minutes (default 10)"
     },
     "adds_left_this_hour": {
      "type": [
       "integer",
       "null"
      ]
     }
    }
   },
   "ContainerSizes": {
    "type": "object",
    "properties": {
     "product_id": {
      "type": "integer"
     },
     "plan": {
      "type": [
       "string",
       "null"
      ],
      "example": "ecs-sunucusuz"
     },
     "billing": {
      "type": "string",
      "example": "prepaid"
     },
     "currency": {
      "type": "string",
      "example": "EUR"
     },
     "vcpu_hour_eur": {
      "type": "number",
      "example": 0.0212
     },
     "gb_hour_eur": {
      "type": "number",
      "example": 0.0017
     },
     "vcpu_hour_list_eur": {
      "type": "number"
     },
     "gb_hour_list_eur": {
      "type": "number"
     },
     "environment_limit": {
      "type": "object",
      "properties": {
       "vcpu": {
        "type": "integer"
       },
       "memory_gb": {
        "type": "integer"
       }
      },
      "description": "Default limit of containers running at once per environment (account limits may differ)"
     },
     "eur_rate": {
      "type": "number"
     },
     "local_currency": {
      "type": "string"
     },
     "sizes": {
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "cpu_m": {
         "type": "integer"
        },
        "vcpu": {
         "type": "number"
        },
        "memory_mi": {
         "type": "array",
         "items": {
          "type": "integer"
         }
        },
        "hourly_eur_min": {
         "type": "number"
        },
        "hourly_eur_max": {
         "type": "number"
        },
        "hourly_min": {
         "type": "object",
         "properties": {
          "amount": {
           "type": "number"
          },
          "currency": {
           "type": "string"
          }
         }
        },
        "hourly_max": {
         "type": "object",
         "properties": {
          "amount": {
           "type": "number"
          },
          "currency": {
           "type": "string"
          }
         }
        }
       }
      }
     },
     "note": {
      "type": "string"
     }
    }
   },
   "StorageMount": {
    "type": "object",
    "properties": {
     "id": {
      "type": "integer"
     },
     "server_id": {
      "type": "integer"
     },
     "storage_service_id": {
      "type": "integer"
     },
     "bucket": {
      "type": "string",
      "description": "bucket name at the time of mounting (renaming the bucket later does not break the mount)"
     },
     "mount_point": {
      "type": "string",
      "example": "/mnt/backups"
     },
     "read_only": {
      "type": "boolean"
     },
     "name": {
      "type": "string",
      "description": "systemd unit instance: gyro-s3mount@<name>"
     },
     "state": {
      "type": "string",
      "enum": [
       "pending",
       "installing",
       "active",
       "error",
       "expired",
       "removed",
       "ended"
      ],
      "description": "pending = waiting for the install command; installing = command/agent running; active = mounted (reported by the server); expired = command not used within 60 minutes (key removed, request a new command)"
     },
     "automatic": {
      "type": "boolean",
      "description": "true = applied by the Gyro Compute guest agent (tr-ist-1); otherwise run install_command on the server"
     },
     "message": {
      "type": "string"
     },
     "last_report_at": {
      "type": [
       "string",
       "null"
      ]
     },
     "created_at": {
      "type": "string"
     },
     "token_expires_at": {
      "type": [
       "string",
       "null"
      ]
     },
     "install_command": {
      "type": "string",
      "description": "only in create / command answers: one-line command (valid 60 minutes, single use; the script checksum is verified before it runs). Treat as a secret."
     },
     "remove_command": {
      "type": "string",
      "example": "sudo gyro-s3mount remove backups"
     },
     "protected": {
      "type": "boolean",
      "description": "true = Protected Storage (versioned / lockable) bucket: every write on a read/write mount becomes a new version, deletes only add a delete marker"
     }
    }
   },
   "Project": {
    "type": "object",
    "properties": {
     "id": {
      "type": "integer",
      "description": "0 = default project"
     },
     "name": {
      "type": "string",
      "maxLength": 40
     },
     "description": {
      "type": [
       "string",
       "null"
      ],
      "maxLength": 255
     },
     "color": {
      "type": "string",
      "enum": [
       "gray",
       "blue",
       "green",
       "red",
       "orange",
       "yellow",
       "purple",
       "pink",
       "teal",
       "indigo"
      ]
     },
     "icon": {
      "type": "string",
      "description": "Bootstrap Icons name (without the bi- prefix)"
     },
     "is_default": {
      "type": "boolean"
     },
     "service_count": {
      "type": "integer",
      "description": "Live services (active, suspended, in process, waiting) visible to this key"
     },
     "service_total": {
      "type": "integer",
      "description": "All services incl. cancelled ones visible to this key"
     },
     "service_ids": {
      "type": "array",
      "items": {
       "type": "integer"
      },
      "description": "Only on GET /cloud/projects/{id} and create/update responses"
     },
     "created_at": {
      "type": [
       "string",
       "null"
      ],
      "format": "date-time"
     },
     "updated_at": {
      "type": [
       "string",
       "null"
      ],
      "format": "date-time"
     }
    },
    "example": {
     "id": 6,
     "name": "Gyro Test",
     "description": "Mobile app backend",
     "color": "purple",
     "icon": "controller",
     "is_default": false,
     "service_count": 12,
     "service_total": 13,
     "created_at": "2026-11-13T02:00:00+03:00",
     "updated_at": "2026-11-13T02:00:00+03:00"
    }
   },
   "ProjectCreate": {
    "type": "object",
    "required": [
     "name"
    ],
    "properties": {
     "name": {
      "type": "string",
      "minLength": 1,
      "maxLength": 40,
      "description": "Letter or digit first; then letters, digits, space and . _ - / + # & ( ). Unique per account (case-insensitive). Reserved: Genel, General, Default."
     },
     "description": {
      "type": [
       "string",
       "null"
      ],
      "maxLength": 255
     },
     "color": {
      "type": "string",
      "enum": [
       "gray",
       "blue",
       "green",
       "red",
       "orange",
       "yellow",
       "purple",
       "pink",
       "teal",
       "indigo"
      ],
      "default": "blue"
     },
     "icon": {
      "type": "string",
      "enum": [
       "folder",
       "briefcase",
       "building",
       "cart3",
       "cloud",
       "code-slash",
       "controller",
       "globe2",
       "heart",
       "house",
       "kanban",
       "lightning",
       "people",
       "rocket-takeoff",
       "shield-lock",
       "shop",
       "star",
       "tools",
       "truck",
       "box-seam",
       "mortarboard",
       "camera"
      ],
      "default": "folder"
     },
     "service_ids": {
      "type": "array",
      "maxItems": 500,
      "items": {
       "type": "integer"
      },
      "description": "Optional: move these services into the new project at once"
     }
    }
   },
   "ProjectUpdate": {
    "type": "object",
    "properties": {
     "name": {
      "type": "string",
      "minLength": 1,
      "maxLength": 40,
      "description": "Letter or digit first; then letters, digits, space and . _ - / + # & ( ). Unique per account (case-insensitive). Reserved: Genel, General, Default."
     },
     "description": {
      "type": [
       "string",
       "null"
      ],
      "maxLength": 255
     },
     "color": {
      "type": "string",
      "enum": [
       "gray",
       "blue",
       "green",
       "red",
       "orange",
       "yellow",
       "purple",
       "pink",
       "teal",
       "indigo"
      ],
      "default": "blue"
     },
     "icon": {
      "type": "string",
      "enum": [
       "folder",
       "briefcase",
       "building",
       "cart3",
       "cloud",
       "code-slash",
       "controller",
       "globe2",
       "heart",
       "house",
       "kanban",
       "lightning",
       "people",
       "rocket-takeoff",
       "shield-lock",
       "shop",
       "star",
       "tools",
       "truck",
       "box-seam",
       "mortarboard",
       "camera"
      ],
      "default": "folder"
     }
    }
   },
   "ProjectRef": {
    "type": [
     "object",
     "null"
    ],
    "properties": {
     "id": {
      "type": "integer"
     },
     "name": {
      "type": "string"
     }
    },
    "description": "Project of the service (id 0 = default project); null when projects are not available"
   },
   "ServerDisks": {
    "type": "object",
    "properties": {
     "server_id": {
      "type": "integer"
     },
     "disks": {
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "id": {
         "type": "integer",
         "description": "disk id (stable while the disk exists)"
        },
        "name": {
         "type": "string"
        },
        "class": {
         "type": "string",
         "enum": [
          "ssd",
          "hdd"
         ],
         "description": "ssd = fast SSD, hdd = large storage (backups, archives, media)"
        },
        "size_gb": {
         "type": "integer"
        },
        "monthly_eur": {
         "type": "number"
        }
       }
      }
     },
     "count": {
      "type": "integer"
     },
     "max_disks": {
      "type": "integer",
      "description": "at most 4 additional disks per server"
     },
     "used_gb": {
      "type": "integer"
     },
     "max_gb": {
      "type": "integer",
      "description": "per-server allowance (GB)"
     },
     "available_gb": {
      "type": "integer"
     },
     "step_gb": {
      "type": "integer",
      "description": "sizes are multiples of this (default 10)"
     },
     "on_sale": {
      "type": "boolean",
      "description": "SSD class on sale"
     },
     "classes": {
      "type": "object",
      "description": "per class allowance and price",
      "additionalProperties": {
       "type": "object",
       "properties": {
        "used_gb": {
         "type": "integer"
        },
        "max_gb": {
         "type": "integer"
        },
        "available_gb": {
         "type": "integer"
        },
        "on_sale": {
         "type": "boolean"
        },
        "per_gb_monthly_eur": {
         "type": "number"
        },
        "per_gb_hourly_eur": {
         "type": "number"
        }
       }
      }
     },
     "pricing": {
      "type": "object",
      "properties": {
       "billing": {
        "type": "string"
       },
       "per_gb_monthly_eur": {
        "type": "number"
       },
       "per_gb_hourly_eur": {
        "type": "number"
       },
       "hdd_per_gb_monthly_eur": {
        "type": "number"
       },
       "minimum_hours": {
        "type": "integer"
       }
      }
     },
     "removed": {
      "type": "integer"
     }
    }
   },
   "ContainerPlan": {
    "type": "object",
    "properties": {
     "id": {
      "type": "integer",
      "description": "product id"
     },
     "plan": {
      "type": "string",
      "example": "mini-1-1",
      "description": "plan name for POST /cloud/containers (serverless = per-container usage)"
     },
     "name": {
      "type": "string"
     },
     "serverless": {
      "type": "boolean"
     },
     "region": {
      "type": "string",
      "example": "tr-ist-1"
     },
     "nodes": {
      "type": [
       "integer",
       "null"
      ],
      "description": "nodes in the environment's dedicated pool"
     },
     "node_cores": {
      "type": [
       "integer",
       "null"
      ]
     },
     "node_memory_gb": {
      "type": [
       "number",
       "null"
      ]
     },
     "node_disk_gb": {
      "type": [
       "integer",
       "null"
      ]
     },
     "max_services": {
      "type": [
       "integer",
       "null"
      ],
      "description": "most services (apps) you can define; all services and replicas share the pool"
     },
     "max_replicas": {
      "type": [
       "integer",
       "null"
      ],
      "description": "most replicas per service (autoscaling)"
     },
     "max_domains": {
      "type": [
       "integer",
       "null"
      ]
     },
     "billing": {
      "type": "string",
      "const": "prepaid"
     },
     "currency": {
      "type": "string"
     },
     "monthly_cap_eur": {
      "type": [
       "number",
       "null"
      ]
     },
     "hourly_eur": {
      "type": [
       "number",
       "null"
      ]
     },
     "usage": {
      "type": [
       "object",
       "null"
      ],
      "properties": {
       "vcpu_hour_eur": {
        "type": "number"
       },
       "gb_hour_eur": {
        "type": "number"
       }
      }
     }
    }
   },
   "ContainerImageImport": {
    "type": "object",
    "properties": {
     "id": {
      "type": "string",
      "example": "imp-1a2b3c4d5e6f"
     },
     "source": {
      "type": "string",
      "example": "docker.io/library/nginx:1.27",
      "description": "normalised source (never contains credentials)"
     },
     "target": {
      "type": "string",
      "example": "registry.ist.gyrohosting.com/ab12cd/nginx:1.27",
      "description": "image reference to use in a service"
     },
     "repo": {
      "type": "string"
     },
     "tag": {
      "type": "string"
     },
     "state": {
      "type": "string",
      "enum": [
       "running",
       "done",
       "failed"
      ]
     },
     "phase": {
      "type": "string",
      "enum": [
       "queued",
       "auth",
       "manifest",
       "layers",
       "finalize",
       "done"
      ]
     },
     "bytes_total": {
      "type": "integer"
     },
     "bytes_done": {
      "type": "integer"
     },
     "layers": {
      "type": "integer"
     },
     "layers_done": {
      "type": "integer"
     },
     "digest": {
      "type": "string"
     },
     "platform": {
      "type": "string",
      "example": "linux/amd64"
     },
     "private": {
      "type": "boolean",
      "description": "credentials were used (not stored)"
     },
     "error": {
      "type": "string",
      "description": "source_blocked, insecure_source, source_unauthorized, source_not_found, source_unreachable, source_tls, source_rate_limited, source_error, source_corrupt, platform_unsupported, not_an_image, unsupported_image, too_many_layers, manifest_too_large, registry_full, import_timeout, interrupted, import_failed"
     },
     "message": {
      "type": "string"
     },
     "started": {
      "type": "string",
      "format": "date-time"
     },
     "updated": {
      "type": "string",
      "format": "date-time"
     },
     "finished": {
      "type": "string",
      "format": "date-time"
     }
    }
   },
   "ContainerPipeline": {
    "type": "object",
    "properties": {
     "id": {
      "type": "string",
      "example": "p1a2b3c4d"
     },
     "name": {
      "type": "string",
      "example": "web"
     },
     "provider": {
      "type": "string",
      "enum": [
       "github",
       "gitlab",
       "gitea",
       "git",
       "archive"
      ],
      "description": "`archive`: no repository, builds only from uploaded archives"
     },
     "repo": {
      "type": "string",
      "example": "https://github.com/gyro-ornek/uygulama",
      "description": "https clone URL (no credentials) or SSH address (git@host:org/repo.git, ssh://user@host[:port]/path)"
     },
     "git_user": {
      "type": "string"
     },
     "branch": {
      "type": "string",
      "example": "main, release/*"
     },
     "tags": {
      "type": "string",
      "example": "v*"
     },
     "auto": {
      "type": "boolean"
     },
     "repo_file": {
      "type": "boolean"
     },
     "dockerfile": {
      "type": "string"
     },
     "context": {
      "type": "string"
     },
     "image": {
      "type": "string",
      "example": "web"
     },
     "targets": {
      "type": "array",
      "items": {
       "type": "string"
      }
     },
     "approval": {
      "type": "boolean"
     },
     "auto_rollback": {
      "type": "boolean"
     },
     "build_image": {
      "type": "string"
     },
     "commands": {
      "type": "array",
      "items": {
       "type": "string"
      }
     },
     "build_env": {
      "type": "object",
      "additionalProperties": {
       "type": "string"
      }
     },
     "build_args": {
      "type": "object",
      "additionalProperties": {
       "type": "string"
      }
     },
     "cpu_m": {
      "type": "integer"
     },
     "memory_mi": {
      "type": "integer"
     },
     "timeout_min": {
      "type": "integer"
     },
     "verify_min": {
      "type": "integer"
     },
     "notify": {
      "type": "object",
      "additionalProperties": {
       "type": "boolean"
      }
     },
     "webhook_url": {
      "type": "string",
      "example": "https://ecs-api.ist.gyrohosting.com/hook/ab12cd/p1a2b3c4d"
     },
     "has_token": {
      "type": "boolean"
     },
     "secret_names": {
      "type": "array",
      "items": {
       "type": "string"
      }
     },
     "registry_image": {
      "type": "string",
      "example": "registry.ist.gyrohosting.com/ab12cd/web"
     },
     "last_run": {
      "$ref": "#/components/schemas/ContainerPipelineRun"
     },
     "created": {
      "type": "string",
      "format": "date-time"
     },
     "updated": {
      "type": "string",
      "format": "date-time"
     },
     "auth": {
      "type": "string",
      "enum": [
       "none",
       "token",
       "ssh",
       "archive"
      ],
      "description": "How the source is reached"
     },
     "ssh": {
      "type": "object",
      "description": "SSH repositories only",
      "properties": {
       "host": {
        "type": "string"
       },
       "port": {
        "type": "integer"
       },
       "user": {
        "type": "string"
       },
       "pinned": {
        "type": "boolean",
        "description": "GitHub / GitLab / Bitbucket: published host keys are pinned"
       },
       "host_key_trusted": {
        "type": "boolean"
       },
       "host_keys": {
        "type": "array",
        "items": {
         "type": "object",
         "properties": {
          "type": {
           "type": "string"
          },
          "fingerprint": {
           "type": "string",
           "example": "SHA256:+DiY3wvvV6TuJJhbpZisF/zLDA0zPMSvHdkr4UvCOqU"
          }
         }
        }
       },
       "deploy_key": {
        "type": "object",
        "nullable": true,
        "properties": {
         "public_key": {
          "type": "string",
          "example": "ssh-ed25519 AAAAC3Nza... gyro-pipeline"
         },
         "fingerprint": {
          "type": "string"
         },
         "type": {
          "type": "string",
          "example": "ed25519"
         }
        }
       }
      }
     },
     "archive": {
      "type": "object",
      "properties": {
       "enabled": {
        "type": "boolean"
       },
       "max_bytes": {
        "type": "integer",
        "example": 209715200
       },
       "retention_hours": {
        "type": "integer",
        "example": 24
       }
      }
     },
     "build_target": {
      "type": "string",
      "description": "Dockerfile stage that is built (empty = last stage)",
      "x-description-tr": "Derlenen Dockerfile aşaması (boş = son aşama)"
     }
    }
   },
   "ContainerPipelineRun": {
    "type": "object",
    "properties": {
     "id": {
      "type": "string",
      "example": "rt0gbqcbw5r1"
     },
     "pipeline": {
      "type": "string"
     },
     "n": {
      "type": "integer",
      "description": "run number of the pipeline"
     },
     "trigger": {
      "type": "string",
      "enum": [
       "push",
       "tag",
       "manual",
       "api",
       "redeploy",
       "archive"
      ]
     },
     "ref": {
      "type": "string",
      "example": "refs/heads/main"
     },
     "sha": {
      "type": "string"
     },
     "short_sha": {
      "type": "string"
     },
     "message": {
      "type": "string"
     },
     "author": {
      "type": "string"
     },
     "state": {
      "type": "string",
      "enum": [
       "queued",
       "preparing",
       "building",
       "awaiting_approval",
       "deploying",
       "verifying",
       "succeeded",
       "failed",
       "cancelled",
       "rolled_back",
       "skipped",
       "expired"
      ]
     },
     "step": {
      "type": "string",
      "enum": [
       "prepare",
       "queued_node",
       "starting",
       "clone",
       "steps",
       "build",
       "approval",
       "deploy",
       "verify"
      ]
     },
     "error": {
      "type": "string",
      "description": "repo_auth, repo_not_found, repo_unreachable, repo_blocked, ref_not_found, target_missing, clone_failed, commands_failed, build_failed, build_target_not_found (detail = the stage name), invalid_build_target, push_failed, timeout, out_of_memory, no_capacity, build_image_pull, deploy_unhealthy, deploy_timeout, deploy_failed, minutes_exhausted, pipeline_file_invalid, cancelled, rejected, approval_expired, internal, archive_invalid (detail says why: links, ../ paths, device files, > 20 000 files, > 2 GB unpacked, damaged), archive_download, upload_not_found, archive_format, archive_too_large, host_key_unconfirmed, host_key_mismatch, deploy_key_missing"
     },
     "image": {
      "type": "string",
      "example": "registry.ist.gyrohosting.com/ab12cd/web:1a2b3c4"
     },
     "digest": {
      "type": "string"
     },
     "deployed": {
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "service": {
         "type": "string"
        },
        "from_revision": {
         "type": "integer"
        },
        "to_revision": {
         "type": "integer"
        },
        "state": {
         "type": "string",
         "enum": [
          "pending",
          "running",
          "failing",
          "rolled_back",
          "missing"
         ]
        },
        "problem": {
         "type": "string"
        }
       }
      }
     },
     "build_seconds": {
      "type": "integer"
     },
     "billed_minutes": {
      "type": "integer"
     },
     "duration_seconds": {
      "type": "integer"
     },
     "created": {
      "type": "string",
      "format": "date-time"
     },
     "started": {
      "type": "string",
      "format": "date-time"
     },
     "finished": {
      "type": "string",
      "format": "date-time"
     },
     "deadline": {
      "type": "string",
      "format": "date-time",
      "description": "approval / health wait deadline"
     },
     "from_run": {
      "type": "string",
      "description": "redeploy: source run"
     },
     "archive": {
      "type": "string",
      "description": "upload id (archive runs)"
     },
     "archive_name": {
      "type": "string"
     },
     "archive_size": {
      "type": "integer"
     },
     "archive_format": {
      "type": "string",
      "enum": [
       "tar.gz",
       "zip"
      ]
     },
     "image_tag": {
      "type": "string",
      "description": "<sha7> for commits, arc-<upload> for archives"
     }
    }
   },
   "StoragePlan": {
    "type": "object",
    "properties": {
     "id": {
      "type": "integer",
      "description": "product id"
     },
     "plan": {
      "type": "string",
      "example": "standard-1tb",
      "description": "plan name for POST /cloud/storage: standard-250gb | standard-1tb | standard-5tb | standard-10tb | protected-250gb | protected-1tb | protected-5tb | protected-10tb"
     },
     "name": {
      "type": "string"
     },
     "kind": {
      "type": "string",
      "enum": [
       "standard",
       "protected"
      ],
      "description": "standard = Object Storage; protected = Protected Storage (versioning always on, object lock with the add-on)"
     },
     "region": {
      "type": "string",
      "example": "tr-ist-1"
     },
     "size_gb": {
      "type": "integer",
      "description": "storage quota"
     },
     "max_buckets": {
      "type": "integer"
     },
     "max_access_keys": {
      "type": "integer"
     },
     "max_objects": {
      "type": "integer"
     },
     "included_traffic_gb_month": {
      "type": "integer",
      "description": "outbound traffic included every calendar month"
     },
     "versioning": {
      "type": "boolean"
     },
     "object_lock": {
      "description": "false, or how to get it (add-on)"
     },
     "available": {
      "type": "boolean",
      "description": "false = not orderable right now (capacity)"
     },
     "prices": {
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "cycle": {
         "type": "string",
         "enum": [
          "monthly",
          "quarterly",
          "semiannually",
          "annually"
         ]
        },
        "amount": {
         "type": "number"
        },
        "list_amount": {
         "type": [
          "number",
          "null"
         ],
         "description": "list price before the discount"
        },
        "currency": {
         "type": "string",
         "example": "EUR"
        }
       }
      }
     },
     "tax_included": {
      "type": "boolean",
      "const": false
     },
     "addons": {
      "type": "object",
      "properties": {
       "extra_traffic": {
        "type": "array",
        "items": {
         "type": "object",
         "properties": {
          "size": {
           "type": "string",
           "enum": [
            "1tb",
            "5tb"
           ]
          },
          "extra_traffic_gb": {
           "type": "integer"
          },
          "price": {
           "type": "object"
          },
          "billing": {
           "type": "string"
          }
         }
        },
        "description": "one-time traffic packs, valid until the end of the calendar month of purchase"
       },
       "object_lock_buckets": {
        "type": [
         "object",
         "null"
        ],
        "description": "protected plans: price per locked bucket per cycle (min 1, max 50)"
       }
      }
     }
    }
   },
   "LimitHint": {
    "type": "object",
    "description": "Present in `error.details` of every refusal caused by a limit (and in dry-run quotes as `quote.limit_exceeded`). Only refusals caused by a real account or plan limit carry it (known error code such as `limit_exceeded`, `server_limit`, `quota_exceeded`, or a known module limit refusal tied to its `limit_key`). Input validation (length, format, characters, \"at most N characters\") never carries it: fix the input instead.",
    "x-description-tr": "Sınır kaynaklı her retin `error.details` alanında (ve dry-run teklifinde `quote.limit_exceeded`) bulunur. Yalnız gerçek hesap ya da paket sınırından doğan retlerde bulunur (`limit_exceeded`, `server_limit`, `quota_exceeded` gibi bilinen hata kodu ya da `limit_key`'e bağlı bilinen bir modül sınır reti). Girdi doğrulama hataları (uzunluk, biçim, karakter, \"en fazla N karakter\") bunu taşımaz: girdiyi düzeltin.",
    "properties": {
     "limit_exceeded": {
      "type": "boolean",
      "const": true
     },
     "limit_key": {
      "type": [
       "string",
       "null"
      ],
      "example": "new_account.servers",
      "description": "limit name as listed by GET /cloud/account/limits (null = module limit without a registry name)"
     },
     "limit": {
      "type": [
       "integer",
       "null"
      ],
      "description": "current limit"
     },
     "current": {
      "type": [
       "integer",
       "null"
      ],
      "description": "current usage"
     },
     "how_to_increase": {
      "type": "string",
      "enum": [
       "open_support_ticket",
       "upgrade_plan",
       "wait"
      ],
      "description": "open_support_ticket = raised on request; upgrade_plan = a bigger plan or an add-on; wait = short rate limit, retry later"
     },
     "support_ticket": {
      "type": "object",
      "description": "ready-to-send ticket request (fill in <N> and the reason)",
      "properties": {
       "endpoint": {
        "type": "string",
        "example": "POST /api/v1/client/tickets"
       },
       "body": {
        "type": "object",
        "properties": {
         "department_id": {
          "type": "integer"
         },
         "subject": {
          "type": "string"
         },
         "message": {
          "type": "string"
         }
        }
       },
       "cli": {
        "type": "string",
        "example": "gyro ticket create --department-id 3 --subject \"Limit increase: new_account.servers\" --message \"...\""
       },
       "departments": {
        "type": "string"
       },
       "scope": {
        "type": "string",
        "example": "Tickets/CreateTicket"
       }
      }
     },
     "limits_endpoint": {
      "type": "string",
      "example": "GET /api/v1/client/cloud/account/limits"
     },
     "hint": {
      "type": "string",
      "example": "This limit can be raised with a support ticket."
     },
     "hint_tr": {
      "type": "string",
      "example": "Bu sınır destek talebiyle artırılabilir."
     },
     "reason": {
      "type": "string",
      "description": "original error code when the code was changed (checkout_blocked -> limit_exceeded)"
     }
    }
   },
   "AccountLimit": {
    "type": "object",
    "properties": {
     "key": {
      "type": "string",
      "example": "compute.max_vms"
     },
     "group": {
      "type": "string",
      "example": "compute"
     },
     "scope": {
      "type": "string",
      "enum": [
       "account",
       "service"
      ],
      "description": "account = one number for the account; service = applies to each service (see `services`)"
     },
     "limit": {
      "type": [
       "integer",
       "null"
      ],
      "description": "effective limit (null = depends on the plan of each service, see `services`, or no limit)"
     },
     "used": {
      "type": [
       "integer",
       "null"
      ]
     },
     "unit": {
      "type": "string"
     },
     "custom": {
      "type": "boolean",
      "description": "raised (or lowered) for your account"
     },
     "increasable": {
      "type": "boolean"
     },
     "how_to_increase": {
      "type": "string",
      "enum": [
       "open_support_ticket",
       "upgrade_plan_or_open_support_ticket",
       "upgrade_plan",
       "wait",
       "fixed"
      ]
     },
     "description": {
      "type": "string"
     },
     "description_tr": {
      "type": "string"
     },
     "max_size": {
      "type": "object",
      "description": "compute.max_server_size only",
      "properties": {
       "vcpu": {
        "type": "integer"
       },
       "memory_gb": {
        "type": "integer"
       },
       "disk_gb": {
        "type": "integer"
       }
      }
     },
     "services": {
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "service_id": {
         "type": "integer"
        },
        "name": {
         "type": "string"
        },
        "limit": {
         "type": [
          "integer",
          "null"
         ]
        },
        "used": {
         "type": [
          "integer",
          "null"
         ]
        }
       }
      }
     }
    }
   },
   "ContainerEgress": {
    "type": "object",
    "description": "Public IPv4 addresses the containers of the environment reach the internet from (no NAT gateway: traffic leaves from the node the container runs on).",
    "x-description-tr": "Ortamdaki kapsayıcıların internete çıktığı IPv4 adresleri (NAT kapısı yok: trafik kapsayıcının çalıştığı düğümden çıkar).",
    "properties": {
     "mode": {
      "type": "string",
      "enum": [
       "dedicated",
       "serverless"
      ]
     },
     "ips": {
      "type": "array",
      "items": {
       "type": "string",
       "format": "ipv4"
      },
      "description": "Put ALL of them on the IP allow list of an external service.",
      "example": [
       "31.58.248.114",
       "45.87.174.168"
      ]
     },
     "items": {
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "ip": {
         "type": "string"
        },
        "source": {
         "type": "string",
         "enum": [
          "node",
          "rollout",
          "shared_pool"
         ],
         "description": "node = a node of the dedicated pool (always used); rollout = shared pool where the new copy starts during an update (about a minute) before it moves back; shared_pool = serverless pool node"
        },
        "node": {
         "type": "string",
         "example": "node-1"
        }
       }
      }
     },
     "build_ips": {
      "type": "array",
      "items": {
       "type": "string"
      },
      "description": "Gyro Pipeline build machines (git clone / archive download only)"
     },
     "hash": {
      "type": "string",
      "description": "changes whenever `ips` change (compare to detect a change)"
     },
     "ipv6": {
      "type": "boolean",
      "const": false,
      "description": "no IPv6 egress"
     },
     "note": {
      "type": "string"
     },
     "egress_change": {
      "$ref": "#/components/schemas/ContainerEgressChange"
     },
     "pending_egress_ips": {
      "type": "array",
      "items": {
       "type": "string"
      },
      "description": "new egress IPs announced but not in use for sure yet; add them to your allow lists now"
     },
     "egress_hold_hours": {
      "type": "integer",
      "description": "approval window (0 = off)"
     }
    }
   },
   "ContainerEnvironment": {
    "type": "object",
    "properties": {
     "code": {
      "type": "string",
      "example": "ab12cd"
     },
     "namespace": {
      "type": "string",
      "example": "t-canli-12345",
      "description": "Kubernetes namespace of the environment"
     },
     "mode": {
      "type": "string",
      "enum": [
       "dedicated",
       "serverless"
      ]
     },
     "cluster_dns": {
      "type": "object",
      "description": "in-cluster addressing: from the same environment a service is reached at `<service>.<namespace>.svc.cluster.local:80` or `<service>:80` (port 80 is forwarded to the container port; only services with a port)",
      "properties": {
       "namespace": {
        "type": "string"
       },
       "service_domain": {
        "type": "string",
        "example": "t-canli-12345.svc.cluster.local"
       },
       "service_port": {
        "type": "integer",
        "const": 80
       },
       "pattern": {
        "type": "string",
        "example": "<service>.t-canli-12345.svc.cluster.local:80"
       },
       "short_pattern": {
        "type": "string",
        "example": "<service>:80"
       }
      }
     },
     "host_suffix": {
      "type": "string",
      "example": "-ab12cd.gyroapp.net"
     },
     "suspended": {
      "type": "boolean"
     },
     "services": {
      "type": "integer"
     },
     "ready_replicas": {
      "type": "integer"
     },
     "limits": {
      "type": "object"
     },
     "nodes": {
      "type": "array",
      "items": {
       "type": "object"
      }
     },
     "quota": {
      "type": "object"
     },
     "ingress_ips": {
      "type": "array",
      "items": {
       "type": "string"
      },
      "description": "inbound address (apex A record of a custom domain)"
     },
     "egress_ips": {
      "type": "array",
      "items": {
       "type": "string"
      },
      "description": "same as egress.ips"
     },
     "egress_note": {
      "type": "string"
     },
     "egress": {
      "$ref": "#/components/schemas/ContainerEgress"
     },
     "base_nodes": {
      "type": "integer",
      "description": "nodes of the plan"
     },
     "extra_nodes": {
      "type": "integer"
     },
     "node_count": {
      "type": "integer"
     },
     "max_extra_nodes": {
      "type": "integer"
     },
     "max_nodes": {
      "type": "integer",
      "const": 20
     },
     "node_monthly_eur": {
      "type": "number",
      "description": "price of one node per month (an extra node costs the same)"
     },
     "egress_hold_hours": {
      "type": "integer",
      "description": "approval window (0 = off)"
     },
     "egress_change": {
      "$ref": "#/components/schemas/ContainerEgressChange"
     },
     "pending_egress_ips": {
      "type": "array",
      "items": {
       "type": "string"
      },
      "description": "new egress IPs announced but not in use for sure yet; add them to your allow lists now"
     }
    }
   },
   "VpcPortForward": {
    "type": "object",
    "properties": {
     "id": {
      "type": "string"
     },
     "protocol": {
      "type": "string",
      "enum": [
       "tcp",
       "udp"
      ]
     },
     "public_port": {
      "type": "integer"
     },
     "target_ip": {
      "type": "string"
     },
     "target_port": {
      "type": "integer"
     },
     "created_at": {
      "type": "string",
      "format": "date-time"
     }
    }
   },
   "VpcGateway": {
    "type": "object",
    "properties": {
     "enabled": {
      "type": "boolean"
     },
     "nat": {
      "type": "boolean",
      "description": "internet access for the VPC's servers"
     },
     "inter_subnet": {
      "type": "string",
      "enum": [
       "allow",
       "deny"
      ],
      "description": "traffic between the VPC's subnets"
     },
     "public_ip": {
      "type": "string",
      "description": "gateway IPv4 (empty while off)"
     },
     "status": {
      "type": "string",
      "enum": [
       "off",
       "active",
       "syncing"
      ]
     },
     "port_forwards": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/VpcPortForward"
      }
     },
     "monthly_eur": {
      "type": "number",
      "description": "price while on, per month (cap)"
     },
     "hourly_eur": {
      "type": "number"
     }
    }
   },
   "VpcSubnet": {
    "type": "object",
    "properties": {
     "id": {
      "type": "string"
     },
     "vpc_id": {
      "type": "string"
     },
     "name": {
      "type": "string"
     },
     "cidr": {
      "type": "string"
     },
     "gateway_ip": {
      "type": "string",
      "description": "the .1 address of the subnet"
     },
     "used": {
      "type": "integer"
     },
     "capacity": {
      "type": "integer"
     },
     "state": {
      "type": "string"
     },
     "created_at": {
      "type": "string",
      "format": "date-time"
     }
    }
   },
   "Vpc": {
    "type": "object",
    "properties": {
     "id": {
      "type": "string"
     },
     "name": {
      "type": "string"
     },
     "cidr": {
      "type": "string"
     },
     "region": {
      "type": "string",
      "example": "tr-ist-1"
     },
     "project_id": {
      "type": "integer"
     },
     "state": {
      "type": "string"
     },
     "subnets": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/VpcSubnet"
      }
     },
     "servers": {
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "server_id": {
         "type": "integer"
        },
        "name": {
         "type": "string"
        },
        "nic_id": {
         "type": "string"
        },
        "subnet_id": {
         "type": "string"
        },
        "ip": {
         "type": "string"
        },
        "state": {
         "type": "string"
        }
       }
      }
     },
     "attachments": {
      "type": "integer"
     },
     "gateway": {
      "$ref": "#/components/schemas/VpcGateway"
     },
     "created_at": {
      "type": "string",
      "format": "date-time"
     }
    }
   },
   "ServerNic": {
    "type": "object",
    "properties": {
     "id": {
      "type": "string"
     },
     "vpc_id": {
      "type": "string"
     },
     "subnet_id": {
      "type": "string"
     },
     "subnet_name": {
      "type": "string"
     },
     "subnet_cidr": {
      "type": "string"
     },
     "ip": {
      "type": "string"
     },
     "gateway_ip": {
      "type": "string"
     },
     "mac": {
      "type": "string"
     },
     "state": {
      "type": "string",
      "enum": [
       "attaching",
       "ready",
       "detaching",
       "error"
      ]
     },
     "error": {
      "type": "string"
     }
    }
   },
   "ContainerEgressChange": {
    "type": [
     "object",
     "null"
    ],
    "description": "Announced change of the egress IPs (plan change, node added / removed). Null when none.",
    "x-description-tr": "Duyurulan çıkış IP değişikliği (paket değişikliği, düğüm ekleme / çıkarma). Yoksa null.",
    "properties": {
     "id": {
      "type": "string",
      "example": "cm3k9x2a1"
     },
     "kind": {
      "type": "string",
      "enum": [
       "plan",
       "add",
       "remove",
       "mixed"
      ]
     },
     "state": {
      "type": "string",
      "enum": [
       "preparing",
       "pending",
       "approved",
       "applied"
      ],
      "description": "preparing = new addresses not known yet; pending = announced (waits for approval when approval_required); approved = old nodes are being drained; applied = done (kept 24 h)"
     },
     "new_ips": {
      "type": "array",
      "items": {
       "type": "string"
      }
     },
     "remove_ips": {
      "type": "array",
      "items": {
       "type": "string"
      }
     },
     "keep_ips": {
      "type": "array",
      "items": {
       "type": "string"
      }
     },
     "approval_required": {
      "type": "boolean"
     },
     "awaiting_approval": {
      "type": "boolean"
     },
     "hold_hours": {
      "type": "integer"
     },
     "pending_since": {
      "type": "string",
      "format": "date-time"
     },
     "deadline": {
      "type": "string",
      "format": "date-time",
      "description": "the change continues by itself at this time without approval"
     },
     "approved_at": {
      "type": "string"
     },
     "approved_by": {
      "type": "string",
      "enum": [
       "",
       "owner",
       "deadline",
       "automatic"
      ]
     },
     "applied_at": {
      "type": "string"
     }
    }
   }
  }
 }
}