# Datacenter & ISP Proxies

Операции для датацентровых и ISP прокси

## Получить активные прокси по заказу

`GET /user/api/proxies/active`

```json
{
  "tags": [
    "Datacenter & ISP Proxies"
  ],
  "summary": "Получить активные прокси по заказу",
  "parameters": [
    {
      "in": "query",
      "name": "order_id",
      "required": true,
      "schema": {
        "type": "integer"
      }
    }
  ],
  "responses": {
    "200": {
      "description": "Список прокси",
      "content": {
        "application/json": {
          "schema": {
            "type": "object",
            "properties": {
              "success": {
                "type": "boolean"
              },
              "data": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/ActiveProxyItem"
                }
              },
              "order_tag": {
                "type": "string",
                "nullable": true
              }
            },
            "required": [
              "success",
              "data"
            ]
          }
        }
      }
    },
    "403": {
      "description": "Метод недоступен для этого заказа",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/ApiError"
          }
        }
      }
    }
  }
}
```

## Установить удаление для каждого IP-адреса (del-np)

`POST /user/api/orders/{order_id}/del-np/set`

```json
{
  "tags": [
    "Datacenter & ISP Proxies"
  ],
  "summary": "Установить удаление для каждого IP-адреса (del-np)",
  "description": "Только для прокси дата-центров и ISP. После обновления заказа поля `quantity` и `price_paid` пересчитываются.",
  "parameters": [
    {
      "in": "path",
      "name": "order_id",
      "required": true,
      "schema": {
        "type": "integer"
      }
    }
  ],
  "requestBody": {
    "required": true,
    "content": {
      "application/json": {
        "schema": {
          "type": "object",
          "properties": {
            "items": {
              "type": "array",
              "items": {
                "type": "object",
                "properties": {
                  "ip": {
                    "type": "string"
                  },
                  "value": {
                    "type": "boolean"
                  }
                },
                "required": [
                  "ip",
                  "value"
                ]
              }
            }
          },
          "required": [
            "items"
          ]
        }
      }
    }
  },
  "responses": {
    "200": {
      "description": "Успех",
      "content": {
        "application/json": {
          "schema": {
            "type": "object",
            "properties": {
              "success": {
                "type": "boolean"
              },
              "message": {
                "type": "string"
              }
            }
          }
        }
      }
    },
    "400": {
      "description": "Ошибка проверки, не DC-ISP или `keep=0`",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/ApiError"
          }
        }
      }
    }
  }
}
```

## Установить отпечаток ОС для IP

`POST /user/api/orders/{order_id}/signature/set`

```json
{
  "tags": [
    "Datacenter & ISP Proxies"
  ],
  "summary": "Установить отпечаток ОС для IP",
  "description": "Устанавливает подпись отпечатка ОС для одного или нескольких IP-адресов прокси.  \nТребуется, чтобы дополнение `p0f_slots` было активным для заказа.\n\nКаждый IP, получивший подпись, постоянно занимает один слот. Изменение значения ОС на IP-адресе, который уже имеет подпись, не требует дополнительного слота.\n\n**Доступные значения подписи:**\n\n| Значение | ОС |\n|-------|----|\n| `ios` | iOS |\n| `macos` | macOS |\n| `android` | Android |\n| `linux` | Linux |\n| `win10` | Windows 10 |\n| `win11` | Windows 11 |",
  "parameters": [
    {
      "in": "path",
      "name": "order_id",
      "required": true,
      "schema": {
        "type": "integer"
      }
    }
  ],
  "requestBody": {
    "required": true,
    "content": {
      "application/json": {
        "schema": {
          "type": "object",
          "required": [
            "items"
          ],
          "properties": {
            "items": {
              "type": "array",
              "items": {
                "type": "object",
                "required": [
                  "ip",
                  "signature"
                ],
                "properties": {
                  "ip": {
                    "type": "string"
                  },
                  "signature": {
                    "type": "string",
                    "description": "Идентификатор ОС для подделки.",
                    "enum": [
                      "ios",
                      "macos",
                      "android",
                      "linux",
                      "win10",
                      "win11"
                    ]
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "responses": {
    "200": {
      "description": "Успех",
      "content": {
        "application/json": {
          "schema": {
            "type": "object",
            "properties": {
              "success": {
                "type": "boolean"
              },
              "message": {
                "type": "string"
              },
              "updated": {
                "type": "integer",
                "description": "Количество обновленных IP-адресов"
              }
            }
          }
        }
      }
    },
    "400": {
      "description": "Ошибка валидации или недостаточно слотов",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/ApiError"
          }
        }
      }
    }
  }
}
```

## Рассчитать дополнительную стоимость

`GET /user/api/orders/{order_id}/addons/calculate`

```json
{
  "tags": [
    "Datacenter & ISP Proxies"
  ],
  "summary": "Рассчитать дополнительную стоимость",
  "description": "Возвращает предварительный просмотр цены на приобретение дополнительных единиц данного дополнения для активного заказа центра обработки данных или интернет-провайдера. В настоящее время поддерживается только дополнительный ключ `p0f_slots`; Слоты для подписи отпечатков пальцев ОС.",
  "parameters": [
    {
      "in": "path",
      "name": "order_id",
      "required": true,
      "description": "Идентификатор заказа",
      "schema": {
        "type": "integer"
      }
    },
    {
      "in": "query",
      "name": "addon_key",
      "required": true,
      "description": "Идентификатор дополнения (например, `p0f_slots`)",
      "schema": {
        "type": "string"
      }
    },
    {
      "in": "query",
      "name": "add_qty",
      "required": true,
      "description": "Количество единиц для добавления",
      "schema": {
        "type": "integer",
        "minimum": 1
      }
    }
  ],
  "responses": {
    "200": {
      "description": "Предварительный просмотр цены",
      "content": {
        "application/json": {
          "schema": {
            "type": "object",
            "properties": {
              "success": {
                "type": "boolean"
              },
              "addon_key": {
                "type": "string"
              },
              "catalog_id": {
                "type": "integer"
              },
              "price_per_unit": {
                "type": "integer",
                "description": "Цена за единицу в центах"
              },
              "current_qty": {
                "type": "integer"
              },
              "add_qty": {
                "type": "integer"
              },
              "new_qty": {
                "type": "integer"
              },
              "add_total": {
                "type": "integer",
                "description": "Общая сумма за эту покупку в центах"
              }
            }
          }
        }
      }
    }
  }
}
```

## Купить дополнение

`POST /user/api/orders/{order_id}/addons/purchase`

```json
{
  "tags": [
    "Datacenter & ISP Proxies"
  ],
  "summary": "Купить дополнение",
  "description": "Списывает средства с кошелька и добавляет к заказу указанное количество единиц дополнения. Заказ должен иметь статус **active**. Сейчас доступен только ключ `p0f_slots`.",
  "parameters": [
    {
      "in": "path",
      "name": "order_id",
      "required": true,
      "description": "Идентификатор заказа",
      "schema": {
        "type": "integer"
      }
    }
  ],
  "requestBody": {
    "required": true,
    "content": {
      "application/json": {
        "schema": {
          "type": "object",
          "required": [
            "addon_key",
            "add_qty"
          ],
          "properties": {
            "addon_key": {
              "type": "string"
            },
            "add_qty": {
              "type": "integer",
              "minimum": 1
            }
          }
        }
      }
    }
  },
  "responses": {
    "200": {
      "description": "Дополнение куплено",
      "content": {
        "application/json": {
          "schema": {
            "type": "object",
            "properties": {
              "success": {
                "type": "boolean"
              },
              "message": {
                "type": "string"
              },
              "addons_price_paid": {
                "type": "integer",
                "description": "Совокупная дополнительная стоимость для этого заказа (центы)"
              },
              "addons": {
                "type": "array",
                "description": "Обновленный список дополнений, хранящийся в заказе.",
                "items": {
                  "$ref": "#/components/schemas/AddonLine"
                }
              }
            }
          }
        }
      }
    }
  }
}
```

## Запланировать понижение версии дополнения

`POST /user/api/orders/{order_id}/addons/schedule`

```json
{
  "tags": [
    "Datacenter & ISP Proxies"
  ],
  "summary": "Запланировать понижение версии дополнения",
  "description": "Планирует **понижение** дополнения на следующий цикл продления. Новое количество должно быть меньше текущего. Изменение сохраняется как маркер `pending` и применяется автоматически при продлении заказа.",
  "parameters": [
    {
      "in": "path",
      "name": "order_id",
      "required": true,
      "description": "Идентификатор заказа",
      "schema": {
        "type": "integer"
      }
    }
  ],
  "requestBody": {
    "required": true,
    "content": {
      "application/json": {
        "schema": {
          "type": "object",
          "required": [
            "addon_key",
            "action",
            "next_qty"
          ],
          "properties": {
            "addon_key": {
              "type": "string"
            },
            "action": {
              "type": "string",
              "enum": [
                "downgrade"
              ]
            },
            "next_qty": {
              "type": "integer",
              "description": "Целевое количество после продления. Должно быть меньше текущего количества.",
              "minimum": 1
            }
          }
        }
      }
    }
  },
  "responses": {
    "200": {
      "description": "Понижение запланировано",
      "content": {
        "application/json": {
          "schema": {
            "type": "object",
            "properties": {
              "success": {
                "type": "boolean"
              },
              "message": {
                "type": "string"
              },
              "addons": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/AddonLine"
                }
              }
            }
          }
        }
      }
    }
  }
}
```

## Отменить запланированный переход на более раннюю версию

`POST /user/api/orders/{order_id}/addons/schedule/cancel`

```json
{
  "tags": [
    "Datacenter & ISP Proxies"
  ],
  "summary": "Отменить запланированный переход на более раннюю версию",
  "description": "Удаляет ожидающее понижение версии, установленное через конечную точку расписания.",
  "parameters": [
    {
      "in": "path",
      "name": "order_id",
      "required": true,
      "description": "Идентификатор заказа",
      "schema": {
        "type": "integer"
      }
    }
  ],
  "requestBody": {
    "required": true,
    "content": {
      "application/json": {
        "schema": {
          "type": "object",
          "required": [
            "addon_key"
          ],
          "properties": {
            "addon_key": {
              "type": "string"
            }
          }
        }
      }
    }
  },
  "responses": {
    "200": {
      "description": "Запланированное понижение отменено",
      "content": {
        "application/json": {
          "schema": {
            "type": "object",
            "properties": {
              "success": {
                "type": "boolean"
              },
              "message": {
                "type": "string"
              },
              "addons": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/AddonLine"
                }
              }
            }
          }
        }
      }
    }
  }
}
```
