---
title: "Private networks — API başvurusu"
description: "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"
url: https://www.gyrohosting.com/developers/tr/api/private-networks.html
language: tr
openapi: https://www.gyrohosting.com/developers/openapi.json
api_version: 2.30.0
---

# Private networks

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 €).

Base URL: `https://www.gyrohosting.com/api/v1/client` · OpenAPI: https://www.gyrohosting.com/developers/openapi.json


## GET /cloud/vpcs

**Özel ağları listele** · operationId `listVpcs` · scope `cloud_read` · OpenAPI fragment: https://www.gyrohosting.com/developers/spec/ops/listVpcs.json

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.


### Yanıtlar

- **200**: OK
- **403**: not_available (private networks are not enabled for this account yet) / forbidden (key limited to some servers)
- **404**: Not found — also returned for objects owned by someone else
- **409**: 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
- **422**: Validation or business rule failure (`confirm_required`, `invalid_image`, `tool_action_failed` ...)
- **503**: capacity / pool_exhausted (try again later)

### Örnekler

```bash
curl -s 'https://www.gyrohosting.com/api/v1/client/cloud/vpcs' \
  -H "Authorization: Bearer $GYRO_TOKEN"
```
```python
import os, uuid, requests

h = {"Authorization": "Bearer " + os.environ["GYRO_TOKEN"]}
r = requests.get("https://www.gyrohosting.com/api/v1/client/cloud/vpcs", headers=h, timeout=60)
r.raise_for_status()
print(r.json()["data"])
```
```js
const res = await fetch("https://www.gyrohosting.com/api/v1/client/cloud/vpcs", {
  method: "GET",
  headers: {
    "Authorization": `Bearer ${process.env.GYRO_TOKEN}`,
  },
});
const { data, error } = await res.json();
if (!res.ok) throw new Error(`${error.code}: ${error.message}`);
```


## POST /cloud/vpcs

**Özel ağ oluştur** · operationId `createVpc` · scope `cloud_write` · OpenAPI fragment: https://www.gyrohosting.com/developers/spec/ops/createVpc.json

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.


### İstek gövdesi

| Alan | Tür | Açıklama |
|---|---|---|
| `name` (zorunlu) | string |  |
| `cidr` (zorunlu) | string |  |
| `project_id` | integer |  |
| `subnet` | object |  |
| `subnet.name` | string |  |
| `subnet.cidr` | string |  |

### Yanıtlar

- **201**: OK
- **403**: not_available (private networks are not enabled for this account yet) / forbidden (key limited to some servers)
- **404**: Not found — also returned for objects owned by someone else
- **409**: 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
- **422**: Validation or business rule failure (`confirm_required`, `invalid_image`, `tool_action_failed` ...)
- **503**: capacity / pool_exhausted (try again later)

### Örnekler

```bash
curl -s -X POST 'https://www.gyrohosting.com/api/v1/client/cloud/vpcs' \
  -H "Authorization: Bearer $GYRO_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"name": "string", "cidr": "10.10.0.0/16", "project_id": 1, "subnet": {"name": "string", "cidr": "10.10.1.0/24"}}'
```
```python
import os, uuid, requests

h = {"Authorization": "Bearer " + os.environ["GYRO_TOKEN"]}
r = requests.post("https://www.gyrohosting.com/api/v1/client/cloud/vpcs", headers=h, json={"name": "string", "cidr": "10.10.0.0/16", "project_id": 1, "subnet": {"name": "string", "cidr": "10.10.1.0/24"}}, timeout=60)
r.raise_for_status()
print(r.json()["data"])
```
```js
const res = await fetch("https://www.gyrohosting.com/api/v1/client/cloud/vpcs", {
  method: "POST",
  headers: {
    "Authorization": `Bearer ${process.env.GYRO_TOKEN}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({"name": "string", "cidr": "10.10.0.0/16", "project_id": 1, "subnet": {"name": "string", "cidr": "10.10.1.0/24"}}),
});
const { data, error } = await res.json();
if (!res.ok) throw new Error(`${error.code}: ${error.message}`);
```


## GET /cloud/vpcs/{vpc_id}

**Özel ağı getir** · operationId `getVpc` · scope `cloud_read` · OpenAPI fragment: https://www.gyrohosting.com/developers/spec/ops/getVpc.json

Subnetler, bağlı sunucular ve kapı.


### Parametreler

| Alan | in | Tür | Açıklama |
|---|---|---|---|
| `vpc_id` (zorunlu) | path | string | VPC id (from GET /cloud/vpcs) |

### Yanıtlar

- **200**: OK
- **403**: not_available (private networks are not enabled for this account yet) / forbidden (key limited to some servers)
- **404**: Not found — also returned for objects owned by someone else
- **409**: 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
- **422**: Validation or business rule failure (`confirm_required`, `invalid_image`, `tool_action_failed` ...)
- **503**: capacity / pool_exhausted (try again later)

### Örnekler

```bash
curl -s 'https://www.gyrohosting.com/api/v1/client/cloud/vpcs/1' \
  -H "Authorization: Bearer $GYRO_TOKEN"
```
```python
import os, uuid, requests

h = {"Authorization": "Bearer " + os.environ["GYRO_TOKEN"]}
r = requests.get("https://www.gyrohosting.com/api/v1/client/cloud/vpcs/1", headers=h, timeout=60)
r.raise_for_status()
print(r.json()["data"])
```
```js
const res = await fetch("https://www.gyrohosting.com/api/v1/client/cloud/vpcs/1", {
  method: "GET",
  headers: {
    "Authorization": `Bearer ${process.env.GYRO_TOKEN}`,
  },
});
const { data, error } = await res.json();
if (!res.ok) throw new Error(`${error.code}: ${error.message}`);
```


## PATCH /cloud/vpcs/{vpc_id}

**Özel ağın adını değiştir** · operationId `updateVpc` · scope `cloud_write` · OpenAPI fragment: https://www.gyrohosting.com/developers/spec/ops/updateVpc.json

Yalnız ad değişir (aralık değişmez).


### Parametreler

| Alan | in | Tür | Açıklama |
|---|---|---|---|
| `vpc_id` (zorunlu) | path | string | VPC id (from GET /cloud/vpcs) |

### İstek gövdesi

| Alan | Tür | Açıklama |
|---|---|---|
| `name` (zorunlu) | string |  |

### Yanıtlar

- **200**: OK
- **403**: not_available (private networks are not enabled for this account yet) / forbidden (key limited to some servers)
- **404**: Not found — also returned for objects owned by someone else
- **409**: 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
- **422**: Validation or business rule failure (`confirm_required`, `invalid_image`, `tool_action_failed` ...)
- **503**: capacity / pool_exhausted (try again later)

### Örnekler

```bash
curl -s -X PATCH 'https://www.gyrohosting.com/api/v1/client/cloud/vpcs/1' \
  -H "Authorization: Bearer $GYRO_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"name": "string"}'
```
```python
import os, uuid, requests

h = {"Authorization": "Bearer " + os.environ["GYRO_TOKEN"]}
r = requests.patch("https://www.gyrohosting.com/api/v1/client/cloud/vpcs/1", headers=h, json={"name": "string"}, timeout=60)
r.raise_for_status()
print(r.json()["data"])
```
```js
const res = await fetch("https://www.gyrohosting.com/api/v1/client/cloud/vpcs/1", {
  method: "PATCH",
  headers: {
    "Authorization": `Bearer ${process.env.GYRO_TOKEN}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({"name": "string"}),
});
const { data, error } = await res.json();
if (!res.ok) throw new Error(`${error.code}: ${error.message}`);
```


## DELETE /cloud/vpcs/{vpc_id}

**Özel ağı sil** · operationId `deleteVpc` · scope `cloud_write` · OpenAPI fragment: https://www.gyrohosting.com/developers/spec/ops/deleteVpc.json

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).


### Parametreler

| Alan | in | Tür | Açıklama |
|---|---|---|---|
| `vpc_id` (zorunlu) | path | string | VPC id (from GET /cloud/vpcs) |
| `confirm` | query | boolean |  |

### İstek gövdesi

| Alan | Tür | Açıklama |
|---|---|---|
| `confirm` | boolean |  |

### Yanıtlar

- **200**: OK
- **403**: not_available (private networks are not enabled for this account yet) / forbidden (key limited to some servers)
- **404**: Not found — also returned for objects owned by someone else
- **409**: 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
- **422**: Validation or business rule failure (`confirm_required`, `invalid_image`, `tool_action_failed` ...)
- **503**: capacity / pool_exhausted (try again later)

### Örnekler

```bash
curl -s -X DELETE 'https://www.gyrohosting.com/api/v1/client/cloud/vpcs/1' \
  -H "Authorization: Bearer $GYRO_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"confirm": true}'
```
```python
import os, uuid, requests

h = {"Authorization": "Bearer " + os.environ["GYRO_TOKEN"]}
r = requests.delete("https://www.gyrohosting.com/api/v1/client/cloud/vpcs/1", headers=h, json={"confirm": True}, timeout=60)
r.raise_for_status()
print(r.json()["data"])
```
```js
const res = await fetch("https://www.gyrohosting.com/api/v1/client/cloud/vpcs/1", {
  method: "DELETE",
  headers: {
    "Authorization": `Bearer ${process.env.GYRO_TOKEN}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({"confirm": true}),
});
const { data, error } = await res.json();
if (!res.ok) throw new Error(`${error.code}: ${error.message}`);
```


## GET /cloud/vpcs/{vpc_id}/subnets

**Subnetleri listele** · operationId `listVpcSubnets` · scope `cloud_read` · OpenAPI fragment: https://www.gyrohosting.com/developers/spec/ops/listVpcSubnets.json




### Parametreler

| Alan | in | Tür | Açıklama |
|---|---|---|---|
| `vpc_id` (zorunlu) | path | string | VPC id (from GET /cloud/vpcs) |

### Yanıtlar

- **200**: OK
- **403**: not_available (private networks are not enabled for this account yet) / forbidden (key limited to some servers)
- **404**: Not found — also returned for objects owned by someone else
- **409**: 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
- **422**: Validation or business rule failure (`confirm_required`, `invalid_image`, `tool_action_failed` ...)
- **503**: capacity / pool_exhausted (try again later)

### Örnekler

```bash
curl -s 'https://www.gyrohosting.com/api/v1/client/cloud/vpcs/1/subnets' \
  -H "Authorization: Bearer $GYRO_TOKEN"
```
```python
import os, uuid, requests

h = {"Authorization": "Bearer " + os.environ["GYRO_TOKEN"]}
r = requests.get("https://www.gyrohosting.com/api/v1/client/cloud/vpcs/1/subnets", headers=h, timeout=60)
r.raise_for_status()
print(r.json()["data"])
```
```js
const res = await fetch("https://www.gyrohosting.com/api/v1/client/cloud/vpcs/1/subnets", {
  method: "GET",
  headers: {
    "Authorization": `Bearer ${process.env.GYRO_TOKEN}`,
  },
});
const { data, error } = await res.json();
if (!res.ok) throw new Error(`${error.code}: ${error.message}`);
```


## POST /cloud/vpcs/{vpc_id}/subnets

**Subnet ekle** · operationId `createVpcSubnet` · scope `cloud_write` · OpenAPI fragment: https://www.gyrohosting.com/developers/spec/ops/createVpcSubnet.json

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.


### Parametreler

| Alan | in | Tür | Açıklama |
|---|---|---|---|
| `vpc_id` (zorunlu) | path | string | VPC id (from GET /cloud/vpcs) |

### İstek gövdesi

| Alan | Tür | Açıklama |
|---|---|---|
| `name` (zorunlu) | string |  |
| `cidr` | string |  |
| `prefix` | integer |  |

### Yanıtlar

- **201**: OK
- **403**: not_available (private networks are not enabled for this account yet) / forbidden (key limited to some servers)
- **404**: Not found — also returned for objects owned by someone else
- **409**: 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
- **422**: Validation or business rule failure (`confirm_required`, `invalid_image`, `tool_action_failed` ...)
- **503**: capacity / pool_exhausted (try again later)

### Örnekler

```bash
curl -s -X POST 'https://www.gyrohosting.com/api/v1/client/cloud/vpcs/1/subnets' \
  -H "Authorization: Bearer $GYRO_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"name": "string", "cidr": "string", "prefix": 1}'
```
```python
import os, uuid, requests

h = {"Authorization": "Bearer " + os.environ["GYRO_TOKEN"]}
r = requests.post("https://www.gyrohosting.com/api/v1/client/cloud/vpcs/1/subnets", headers=h, json={"name": "string", "cidr": "string", "prefix": 1}, timeout=60)
r.raise_for_status()
print(r.json()["data"])
```
```js
const res = await fetch("https://www.gyrohosting.com/api/v1/client/cloud/vpcs/1/subnets", {
  method: "POST",
  headers: {
    "Authorization": `Bearer ${process.env.GYRO_TOKEN}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({"name": "string", "cidr": "string", "prefix": 1}),
});
const { data, error } = await res.json();
if (!res.ok) throw new Error(`${error.code}: ${error.message}`);
```


## DELETE /cloud/vpcs/{vpc_id}/subnets/{subnet_id}

**Subneti sil** · operationId `deleteVpcSubnet` · scope `cloud_write` · OpenAPI fragment: https://www.gyrohosting.com/developers/spec/ops/deleteVpcSubnet.json

Bağlı kart ya da ona yönlenen port yönlendirme varken reddedilir (409 `subnet_in_use`); son subnet silinmez (VPC'yi silin).


### Parametreler

| Alan | in | Tür | Açıklama |
|---|---|---|---|
| `vpc_id` (zorunlu) | path | string | VPC id (from GET /cloud/vpcs) |
| `subnet_id` (zorunlu) | path | string | Subnet id |

### Yanıtlar

- **200**: OK
- **403**: not_available (private networks are not enabled for this account yet) / forbidden (key limited to some servers)
- **404**: Not found — also returned for objects owned by someone else
- **409**: 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
- **422**: Validation or business rule failure (`confirm_required`, `invalid_image`, `tool_action_failed` ...)
- **503**: capacity / pool_exhausted (try again later)

### Örnekler

```bash
curl -s -X DELETE 'https://www.gyrohosting.com/api/v1/client/cloud/vpcs/1/subnets/1' \
  -H "Authorization: Bearer $GYRO_TOKEN"
```
```python
import os, uuid, requests

h = {"Authorization": "Bearer " + os.environ["GYRO_TOKEN"]}
r = requests.delete("https://www.gyrohosting.com/api/v1/client/cloud/vpcs/1/subnets/1", headers=h, timeout=60)
r.raise_for_status()
print(r.json()["data"])
```
```js
const res = await fetch("https://www.gyrohosting.com/api/v1/client/cloud/vpcs/1/subnets/1", {
  method: "DELETE",
  headers: {
    "Authorization": `Bearer ${process.env.GYRO_TOKEN}`,
  },
});
const { data, error } = await res.json();
if (!res.ok) throw new Error(`${error.code}: ${error.message}`);
```


## GET /cloud/vpcs/{vpc_id}/gateway

**VPC kapısını getir** · operationId `getVpcGateway` · scope `cloud_read` · OpenAPI fragment: https://www.gyrohosting.com/developers/spec/ops/getVpcGateway.json

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). 


### Parametreler

| Alan | in | Tür | Açıklama |
|---|---|---|---|
| `vpc_id` (zorunlu) | path | string | VPC id (from GET /cloud/vpcs) |

### Yanıtlar

- **200**: OK
- **403**: not_available (private networks are not enabled for this account yet) / forbidden (key limited to some servers)
- **404**: Not found — also returned for objects owned by someone else
- **409**: 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
- **422**: Validation or business rule failure (`confirm_required`, `invalid_image`, `tool_action_failed` ...)
- **503**: capacity / pool_exhausted (try again later)

### Örnekler

```bash
curl -s 'https://www.gyrohosting.com/api/v1/client/cloud/vpcs/1/gateway' \
  -H "Authorization: Bearer $GYRO_TOKEN"
```
```python
import os, uuid, requests

h = {"Authorization": "Bearer " + os.environ["GYRO_TOKEN"]}
r = requests.get("https://www.gyrohosting.com/api/v1/client/cloud/vpcs/1/gateway", headers=h, timeout=60)
r.raise_for_status()
print(r.json()["data"])
```
```js
const res = await fetch("https://www.gyrohosting.com/api/v1/client/cloud/vpcs/1/gateway", {
  method: "GET",
  headers: {
    "Authorization": `Bearer ${process.env.GYRO_TOKEN}`,
  },
});
const { data, error } = await res.json();
if (!res.ok) throw new Error(`${error.code}: ${error.message}`);
```


## PUT /cloud/vpcs/{vpc_id}/gateway

**VPC kapısını aç/kapat, ayarla** · operationId `setVpcGateway` · scope `cloud_write` · OpenAPI fragment: https://www.gyrohosting.com/developers/spec/ops/setVpcGateway.json

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.


### Parametreler

| Alan | in | Tür | Açıklama |
|---|---|---|---|
| `vpc_id` (zorunlu) | path | string | VPC id (from GET /cloud/vpcs) |

### İstek gövdesi

| Alan | Tür | Açıklama |
|---|---|---|
| `enabled` | boolean |  |
| `nat` | boolean |  |
| `inter_subnet` | string (allow, deny) |  |
| `allow_no_egress` | boolean |  |

### Yanıtlar

- **200**: OK
- **403**: not_available (private networks are not enabled for this account yet) / forbidden (key limited to some servers)
- **404**: Not found — also returned for objects owned by someone else
- **409**: 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
- **422**: Validation or business rule failure (`confirm_required`, `invalid_image`, `tool_action_failed` ...)
- **503**: capacity / pool_exhausted (try again later)

### Örnekler

```bash
curl -s -X PUT 'https://www.gyrohosting.com/api/v1/client/cloud/vpcs/1/gateway' \
  -H "Authorization: Bearer $GYRO_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"enabled": true, "nat": true, "inter_subnet": "allow", "allow_no_egress": true}'
```
```python
import os, uuid, requests

h = {"Authorization": "Bearer " + os.environ["GYRO_TOKEN"]}
r = requests.put("https://www.gyrohosting.com/api/v1/client/cloud/vpcs/1/gateway", headers=h, json={"enabled": True, "nat": True, "inter_subnet": "allow", "allow_no_egress": True}, timeout=60)
r.raise_for_status()
print(r.json()["data"])
```
```js
const res = await fetch("https://www.gyrohosting.com/api/v1/client/cloud/vpcs/1/gateway", {
  method: "PUT",
  headers: {
    "Authorization": `Bearer ${process.env.GYRO_TOKEN}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({"enabled": true, "nat": true, "inter_subnet": "allow", "allow_no_egress": true}),
});
const { data, error } = await res.json();
if (!res.ok) throw new Error(`${error.code}: ${error.message}`);
```


## GET /cloud/vpcs/{vpc_id}/port-forwards

**Port yönlendirmeleri listele** · operationId `listVpcPortForwards` · scope `cloud_read` · OpenAPI fragment: https://www.gyrohosting.com/developers/spec/ops/listVpcPortForwards.json




### Parametreler

| Alan | in | Tür | Açıklama |
|---|---|---|---|
| `vpc_id` (zorunlu) | path | string | VPC id (from GET /cloud/vpcs) |

### Yanıtlar

- **200**: OK
- **403**: not_available (private networks are not enabled for this account yet) / forbidden (key limited to some servers)
- **404**: Not found — also returned for objects owned by someone else
- **409**: 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
- **422**: Validation or business rule failure (`confirm_required`, `invalid_image`, `tool_action_failed` ...)
- **503**: capacity / pool_exhausted (try again later)

### Örnekler

```bash
curl -s 'https://www.gyrohosting.com/api/v1/client/cloud/vpcs/1/port-forwards' \
  -H "Authorization: Bearer $GYRO_TOKEN"
```
```python
import os, uuid, requests

h = {"Authorization": "Bearer " + os.environ["GYRO_TOKEN"]}
r = requests.get("https://www.gyrohosting.com/api/v1/client/cloud/vpcs/1/port-forwards", headers=h, timeout=60)
r.raise_for_status()
print(r.json()["data"])
```
```js
const res = await fetch("https://www.gyrohosting.com/api/v1/client/cloud/vpcs/1/port-forwards", {
  method: "GET",
  headers: {
    "Authorization": `Bearer ${process.env.GYRO_TOKEN}`,
  },
});
const { data, error } = await res.json();
if (!res.ok) throw new Error(`${error.code}: ${error.message}`);
```


## POST /cloud/vpcs/{vpc_id}/port-forwards

**Kapının dış portunu yönlendir** · operationId `createVpcPortForward` · scope `cloud_write` · OpenAPI fragment: https://www.gyrohosting.com/developers/spec/ops/createVpcPortForward.json

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.


### Parametreler

| Alan | in | Tür | Açıklama |
|---|---|---|---|
| `vpc_id` (zorunlu) | path | string | VPC id (from GET /cloud/vpcs) |

### İstek gövdesi

| Alan | Tür | Açıklama |
|---|---|---|
| `protocol` (zorunlu) | string (tcp, udp) |  |
| `public_port` (zorunlu) | integer |  |
| `target_ip` (zorunlu) | string |  |
| `target_port` (zorunlu) | integer |  |

### Yanıtlar

- **201**: OK
- **403**: not_available (private networks are not enabled for this account yet) / forbidden (key limited to some servers)
- **404**: Not found — also returned for objects owned by someone else
- **409**: 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
- **422**: Validation or business rule failure (`confirm_required`, `invalid_image`, `tool_action_failed` ...)
- **503**: capacity / pool_exhausted (try again later)

### Örnekler

```bash
curl -s -X POST 'https://www.gyrohosting.com/api/v1/client/cloud/vpcs/1/port-forwards' \
  -H "Authorization: Bearer $GYRO_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"protocol": "tcp", "public_port": 1, "target_ip": "string", "target_port": 1}'
```
```python
import os, uuid, requests

h = {"Authorization": "Bearer " + os.environ["GYRO_TOKEN"]}
r = requests.post("https://www.gyrohosting.com/api/v1/client/cloud/vpcs/1/port-forwards", headers=h, json={"protocol": "tcp", "public_port": 1, "target_ip": "string", "target_port": 1}, timeout=60)
r.raise_for_status()
print(r.json()["data"])
```
```js
const res = await fetch("https://www.gyrohosting.com/api/v1/client/cloud/vpcs/1/port-forwards", {
  method: "POST",
  headers: {
    "Authorization": `Bearer ${process.env.GYRO_TOKEN}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({"protocol": "tcp", "public_port": 1, "target_ip": "string", "target_port": 1}),
});
const { data, error } = await res.json();
if (!res.ok) throw new Error(`${error.code}: ${error.message}`);
```


## DELETE /cloud/vpcs/{vpc_id}/port-forwards/{pf_id}

**Port yönlendirmeyi sil** · operationId `deleteVpcPortForward` · scope `cloud_write` · OpenAPI fragment: https://www.gyrohosting.com/developers/spec/ops/deleteVpcPortForward.json




### Parametreler

| Alan | in | Tür | Açıklama |
|---|---|---|---|
| `vpc_id` (zorunlu) | path | string | VPC id (from GET /cloud/vpcs) |
| `pf_id` (zorunlu) | path | string | Port forward id |

### Yanıtlar

- **200**: OK
- **403**: not_available (private networks are not enabled for this account yet) / forbidden (key limited to some servers)
- **404**: Not found — also returned for objects owned by someone else
- **409**: 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
- **422**: Validation or business rule failure (`confirm_required`, `invalid_image`, `tool_action_failed` ...)
- **503**: capacity / pool_exhausted (try again later)

### Örnekler

```bash
curl -s -X DELETE 'https://www.gyrohosting.com/api/v1/client/cloud/vpcs/1/port-forwards/1' \
  -H "Authorization: Bearer $GYRO_TOKEN"
```
```python
import os, uuid, requests

h = {"Authorization": "Bearer " + os.environ["GYRO_TOKEN"]}
r = requests.delete("https://www.gyrohosting.com/api/v1/client/cloud/vpcs/1/port-forwards/1", headers=h, timeout=60)
r.raise_for_status()
print(r.json()["data"])
```
```js
const res = await fetch("https://www.gyrohosting.com/api/v1/client/cloud/vpcs/1/port-forwards/1", {
  method: "DELETE",
  headers: {
    "Authorization": `Bearer ${process.env.GYRO_TOKEN}`,
  },
});
const { data, error } = await res.json();
if (!res.ok) throw new Error(`${error.code}: ${error.message}`);
```


## GET /cloud/servers/{id}/nics

**Sunucunun özel ağ kartları** · operationId `listServerNics` · scope `cloud_read` · OpenAPI fragment: https://www.gyrohosting.com/developers/spec/ops/listServerNics.json

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. 


### Parametreler

| Alan | in | Tür | Açıklama |
|---|---|---|---|
| `id` (zorunlu) | path | integer | Server id (tr-ist-1) |

### Yanıtlar

- **200**: OK
- **403**: not_available (private networks are not enabled for this account yet) / forbidden (key limited to some servers)
- **404**: Not found — also returned for objects owned by someone else
- **409**: 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
- **422**: Validation or business rule failure (`confirm_required`, `invalid_image`, `tool_action_failed` ...)
- **503**: capacity / pool_exhausted (try again later)

### Örnekler

```bash
curl -s 'https://www.gyrohosting.com/api/v1/client/cloud/servers/12345/nics' \
  -H "Authorization: Bearer $GYRO_TOKEN"
```
```python
import os, uuid, requests

h = {"Authorization": "Bearer " + os.environ["GYRO_TOKEN"]}
r = requests.get("https://www.gyrohosting.com/api/v1/client/cloud/servers/12345/nics", headers=h, timeout=60)
r.raise_for_status()
print(r.json()["data"])
```
```js
const res = await fetch("https://www.gyrohosting.com/api/v1/client/cloud/servers/12345/nics", {
  method: "GET",
  headers: {
    "Authorization": `Bearer ${process.env.GYRO_TOKEN}`,
  },
});
const { data, error } = await res.json();
if (!res.ok) throw new Error(`${error.code}: ${error.message}`);
```


## POST /cloud/servers/{id}/nics

**Sunucuyu subnete bağla** · operationId `attachServerNic` · scope `cloud_write` · OpenAPI fragment: https://www.gyrohosting.com/developers/spec/ops/attachServerNic.json

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. 


### Parametreler

| Alan | in | Tür | Açıklama |
|---|---|---|---|
| `id` (zorunlu) | path | integer | Server id (tr-ist-1) |

### İstek gövdesi

| Alan | Tür | Açıklama |
|---|---|---|
| `subnet_id` (zorunlu) | string |  |
| `ip` | string |  |

### Yanıtlar

- **202**: OK
- **403**: not_available (private networks are not enabled for this account yet) / forbidden (key limited to some servers)
- **404**: Not found — also returned for objects owned by someone else
- **409**: 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
- **422**: Validation or business rule failure (`confirm_required`, `invalid_image`, `tool_action_failed` ...)
- **503**: capacity / pool_exhausted (try again later)

### Örnekler

```bash
curl -s -X POST 'https://www.gyrohosting.com/api/v1/client/cloud/servers/12345/nics' \
  -H "Authorization: Bearer $GYRO_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"subnet_id": "string", "ip": "string"}'
```
```python
import os, uuid, requests

h = {"Authorization": "Bearer " + os.environ["GYRO_TOKEN"]}
r = requests.post("https://www.gyrohosting.com/api/v1/client/cloud/servers/12345/nics", headers=h, json={"subnet_id": "string", "ip": "string"}, timeout=60)
r.raise_for_status()
print(r.json()["data"])
```
```js
const res = await fetch("https://www.gyrohosting.com/api/v1/client/cloud/servers/12345/nics", {
  method: "POST",
  headers: {
    "Authorization": `Bearer ${process.env.GYRO_TOKEN}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({"subnet_id": "string", "ip": "string"}),
});
const { data, error } = await res.json();
if (!res.ok) throw new Error(`${error.code}: ${error.message}`);
```


## DELETE /cloud/servers/{id}/nics/{nic_id}

**Özel ağ kartını çıkar** · operationId `detachServerNic` · scope `cloud_write` · OpenAPI fragment: https://www.gyrohosting.com/developers/spec/ops/detachServerNic.json

Adres 10 dakika başka sunucuya verilmez. Public IP kapalıyken son kart çıkarılamaz (409 `last_network`).


### Parametreler

| Alan | in | Tür | Açıklama |
|---|---|---|---|
| `id` (zorunlu) | path | integer | Server id (tr-ist-1) |
| `nic_id` (zorunlu) | path | string | Network card id (from GET /cloud/servers/{id}/nics) |

### Yanıtlar

- **202**: OK
- **403**: not_available (private networks are not enabled for this account yet) / forbidden (key limited to some servers)
- **404**: Not found — also returned for objects owned by someone else
- **409**: 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
- **422**: Validation or business rule failure (`confirm_required`, `invalid_image`, `tool_action_failed` ...)
- **503**: capacity / pool_exhausted (try again later)

### Örnekler

```bash
curl -s -X DELETE 'https://www.gyrohosting.com/api/v1/client/cloud/servers/12345/nics/1' \
  -H "Authorization: Bearer $GYRO_TOKEN"
```
```python
import os, uuid, requests

h = {"Authorization": "Bearer " + os.environ["GYRO_TOKEN"]}
r = requests.delete("https://www.gyrohosting.com/api/v1/client/cloud/servers/12345/nics/1", headers=h, timeout=60)
r.raise_for_status()
print(r.json()["data"])
```
```js
const res = await fetch("https://www.gyrohosting.com/api/v1/client/cloud/servers/12345/nics/1", {
  method: "DELETE",
  headers: {
    "Authorization": `Bearer ${process.env.GYRO_TOKEN}`,
  },
});
const { data, error } = await res.json();
if (!res.ok) throw new Error(`${error.code}: ${error.message}`);
```


## GET /cloud/servers/{id}/public-ip

**Public IPv4 durumu** · operationId `getServerPublicIp` · scope `cloud_read` · OpenAPI fragment: https://www.gyrohosting.com/developers/spec/ops/getServerPublicIp.json

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. 


### Parametreler

| Alan | in | Tür | Açıklama |
|---|---|---|---|
| `id` (zorunlu) | path | integer | Server id (tr-ist-1) |

### Yanıtlar

- **200**: OK
- **403**: not_available (private networks are not enabled for this account yet) / forbidden (key limited to some servers)
- **404**: Not found — also returned for objects owned by someone else
- **409**: 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
- **422**: Validation or business rule failure (`confirm_required`, `invalid_image`, `tool_action_failed` ...)
- **503**: capacity / pool_exhausted (try again later)

### Örnekler

```bash
curl -s 'https://www.gyrohosting.com/api/v1/client/cloud/servers/12345/public-ip' \
  -H "Authorization: Bearer $GYRO_TOKEN"
```
```python
import os, uuid, requests

h = {"Authorization": "Bearer " + os.environ["GYRO_TOKEN"]}
r = requests.get("https://www.gyrohosting.com/api/v1/client/cloud/servers/12345/public-ip", headers=h, timeout=60)
r.raise_for_status()
print(r.json()["data"])
```
```js
const res = await fetch("https://www.gyrohosting.com/api/v1/client/cloud/servers/12345/public-ip", {
  method: "GET",
  headers: {
    "Authorization": `Bearer ${process.env.GYRO_TOKEN}`,
  },
});
const { data, error } = await res.json();
if (!res.ok) throw new Error(`${error.code}: ${error.message}`);
```


## POST /cloud/servers/{id}/public-ip

**Public IPv4'ü aç** · operationId `enableServerPublicIp` · scope `cloud_write` · OpenAPI fragment: https://www.gyrohosting.com/developers/spec/ops/enableServerPublicIp.json

Aynı adres geri gelir.


### Parametreler

| Alan | in | Tür | Açıklama |
|---|---|---|---|
| `id` (zorunlu) | path | integer | Server id (tr-ist-1) |

### Yanıtlar

- **202**: OK
- **403**: not_available (private networks are not enabled for this account yet) / forbidden (key limited to some servers)
- **404**: Not found — also returned for objects owned by someone else
- **409**: 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
- **422**: Validation or business rule failure (`confirm_required`, `invalid_image`, `tool_action_failed` ...)
- **503**: capacity / pool_exhausted (try again later)

### Örnekler

```bash
curl -s -X POST 'https://www.gyrohosting.com/api/v1/client/cloud/servers/12345/public-ip' \
  -H "Authorization: Bearer $GYRO_TOKEN"
```
```python
import os, uuid, requests

h = {"Authorization": "Bearer " + os.environ["GYRO_TOKEN"]}
r = requests.post("https://www.gyrohosting.com/api/v1/client/cloud/servers/12345/public-ip", headers=h, timeout=60)
r.raise_for_status()
print(r.json()["data"])
```
```js
const res = await fetch("https://www.gyrohosting.com/api/v1/client/cloud/servers/12345/public-ip", {
  method: "POST",
  headers: {
    "Authorization": `Bearer ${process.env.GYRO_TOKEN}`,
  },
});
const { data, error } = await res.json();
if (!res.ok) throw new Error(`${error.code}: ${error.message}`);
```


## DELETE /cloud/servers/{id}/public-ip

**Public IPv4'ü kapat** · operationId `disableServerPublicIp` · scope `cloud_write` · OpenAPI fragment: https://www.gyrohosting.com/developers/spec/ops/disableServerPublicIp.json

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. 


### Parametreler

| Alan | in | Tür | Açıklama |
|---|---|---|---|
| `id` (zorunlu) | path | integer | Server id (tr-ist-1) |

### İstek gövdesi

| Alan | Tür | Açıklama |
|---|---|---|
| `confirm_ip` (zorunlu) | string |  |
| `allow_no_egress` | boolean |  |

### Yanıtlar

- **202**: OK
- **403**: not_available (private networks are not enabled for this account yet) / forbidden (key limited to some servers)
- **404**: Not found — also returned for objects owned by someone else
- **409**: 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
- **422**: Validation or business rule failure (`confirm_required`, `invalid_image`, `tool_action_failed` ...)
- **503**: capacity / pool_exhausted (try again later)

### Örnekler

```bash
curl -s -X DELETE 'https://www.gyrohosting.com/api/v1/client/cloud/servers/12345/public-ip' \
  -H "Authorization: Bearer $GYRO_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"confirm_ip": "string", "allow_no_egress": true}'
```
```python
import os, uuid, requests

h = {"Authorization": "Bearer " + os.environ["GYRO_TOKEN"]}
r = requests.delete("https://www.gyrohosting.com/api/v1/client/cloud/servers/12345/public-ip", headers=h, json={"confirm_ip": "string", "allow_no_egress": True}, timeout=60)
r.raise_for_status()
print(r.json()["data"])
```
```js
const res = await fetch("https://www.gyrohosting.com/api/v1/client/cloud/servers/12345/public-ip", {
  method: "DELETE",
  headers: {
    "Authorization": `Bearer ${process.env.GYRO_TOKEN}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({"confirm_ip": "string", "allow_no_egress": true}),
});
const { data, error } = await res.json();
if (!res.ok) throw new Error(`${error.code}: ${error.message}`);
```
