{
  "info": {
    "name": "GIGABIT Partner API · EN",
    "description": "The API is available after partner account activation. Tokens can be created and revoked exclusively in the GIGABIT dashboard. A new token replaces the previous one and is displayed once.\n\nLong-running operations return HTTP 202 and a server-generated id. Status and results are available through GET /operations/{id}. Checking status does not create another operation.",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "auth": {
    "type": "bearer",
    "bearer": [
      {
        "key": "token",
        "value": "{{partner_token}}",
        "type": "string"
      }
    ]
  },
  "variable": [
    {
      "key": "base_url",
      "value": "https://api.gigabit.ltd/api/partner/v1"
    },
    {
      "key": "partner_token",
      "value": ""
    },
    {
      "key": "order_id",
      "value": "a1b2c3d4e5f60123456789abcdef0123"
    },
    {
      "key": "operation_id",
      "value": "REPLACE_WITH_RESPONSE_ID"
    },
    {
      "key": "topup_id",
      "value": "ptop_REPLACE_WITH_RESPONSE_ID"
    }
  ],
  "item": [
    {
      "name": "Operations",
      "item": [
        {
          "name": "Operation status · Queued",
          "request": {
            "method": "GET",
            "header": [],
            "url": "{{base_url}}/operations/{{operation_id}}",
            "description": "Returns the account operation’s status and result. A quick check without repeating the action.\n\n"
          },
          "response": [
            {
              "name": "Queued",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": "{{base_url}}/operations/{{operation_id}}",
                "description": "Returns the account operation’s status and result. A quick check without repeating the action.\n\n"
              },
              "status": "OK",
              "code": 200,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"success\": true,\n  \"data\": {\n    \"id\": \"op_0123456789abcdef0123456789abcdef\",\n    \"state\": \"queued\",\n    \"error\": null,\n    \"result\": null,\n    \"created_at\": \"2026-11-10T12:00:00+00:00\",\n    \"status_url\": \"/api/partner/v1/operations/op_0123456789abcdef0123456789abcdef\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Operation status · Completed",
          "request": {
            "method": "GET",
            "header": [],
            "url": "{{base_url}}/operations/{{operation_id}}",
            "description": "Returns the account operation’s status and result. A quick check without repeating the action.\n\n"
          },
          "response": [
            {
              "name": "Completed",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": "{{base_url}}/operations/{{operation_id}}",
                "description": "Returns the account operation’s status and result. A quick check without repeating the action.\n\n"
              },
              "status": "OK",
              "code": 200,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"success\": true,\n  \"data\": {\n    \"id\": \"op_0123456789abcdef0123456789abcdef\",\n    \"state\": \"ready\",\n    \"error\": null,\n    \"result\": {\n      \"id\": \"partner_0123456789abcdef0123456789abcdef\",\n      \"state\": \"ready\",\n      \"error\": null,\n      \"order_ids\": [\n        \"a1b2c3d4e5f60123456789abcdef0123\"\n      ],\n      \"amount_cents\": 4050,\n      \"currency\": \"EUR\",\n      \"price\": {\n        \"currency\": \"EUR\",\n        \"base_net_cents\": 4500,\n        \"net_cents\": 4050,\n        \"vat_cents\": 0,\n        \"total_cents\": 4050,\n        \"tax_at_topup\": true,\n        \"discount_percent\": 10,\n        \"months\": 1,\n        \"days\": 30,\n        \"pricing_version\": 1,\n        \"tax\": {\n          \"mode\": \"vat\",\n          \"rate_percent\": 23,\n          \"vat_code\": \"23\",\n          \"reverse_charge\": false\n        }\n      }\n    },\n    \"created_at\": \"2026-11-10T12:00:00+00:00\",\n    \"status_url\": \"/api/partner/v1/operations/op_0123456789abcdef0123456789abcdef\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Operation status · Failed",
          "request": {
            "method": "GET",
            "header": [],
            "url": "{{base_url}}/operations/{{operation_id}}",
            "description": "Returns the account operation’s status and result. A quick check without repeating the action.\n\n"
          },
          "response": [
            {
              "name": "Failed",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": "{{base_url}}/operations/{{operation_id}}",
                "description": "Returns the account operation’s status and result. A quick check without repeating the action.\n\n"
              },
              "status": "OK",
              "code": 200,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"success\": true,\n  \"data\": {\n    \"id\": \"op_0123456789abcdef0123456789abcdef\",\n    \"state\": \"failed\",\n    \"error\": \"insufficient_partner_balance\",\n    \"result\": null,\n    \"created_at\": \"2026-11-10T12:00:00+00:00\",\n    \"status_url\": \"/api/partner/v1/operations/op_0123456789abcdef0123456789abcdef\"\n  }\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "Balance & billing",
      "item": [
        {
          "name": "Balance · Balance",
          "request": {
            "method": "GET",
            "header": [],
            "url": "{{base_url}}/balance",
            "description": "Current balance, credit limit, available funds, discount and partner prices.\n\n"
          },
          "response": [
            {
              "name": "Balance",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": "{{base_url}}/balance",
                "description": "Current balance, credit limit, available funds, discount and partner prices.\n\n"
              },
              "status": "OK",
              "code": 200,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"success\": true,\n  \"data\": {\n    \"currency\": \"EUR\",\n    \"balance_cents\": 10000,\n    \"reserved_cents\": 0,\n    \"credit_limit_cents\": 10000,\n    \"debt_cents\": 0,\n    \"available_cents\": 20000,\n    \"withdrawable_cents\": 10000,\n    \"discount_percent\": 10,\n    \"prefix\": \"astra\",\n    \"api_token_hint\": \"demo12\",\n    \"monthly_net_cents\": 4500,\n    \"payment_method\": \"card\",\n    \"connection_domains\": {\n      \"host\": \"\",\n      \"api\": \"\"\n    },\n    \"paid_in_cents\": 10000,\n    \"prices\": [\n      {\n        \"currency\": \"EUR\",\n        \"base_net_cents\": 4500,\n        \"net_cents\": 4050,\n        \"vat_cents\": 0,\n        \"total_cents\": 4050,\n        \"tax_at_topup\": true,\n        \"discount_percent\": 10,\n        \"months\": 1,\n        \"days\": 30,\n        \"pricing_version\": 1,\n        \"tax\": {\n          \"mode\": \"vat\",\n          \"rate_percent\": 23,\n          \"vat_code\": \"23\",\n          \"reverse_charge\": false\n        }\n      }\n    ],\n    \"topup_tax\": {\n      \"mode\": \"vat\",\n      \"rate_percent\": 23,\n      \"vat_code\": \"23\",\n      \"reverse_charge\": false\n    },\n    \"can_order_new_ports\": true\n  }\n}"
            }
          ]
        },
        {
          "name": "Balance top-up · Card / Stripe",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": "{{base_url}}/topups",
            "description": "Creates a Stripe payment link. amount_cents is the balance credit in euro cents; total_cents is the payment total including applicable VAT.\n\n",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"amount_cents\": 10000\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "name": "Card / Stripe",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": "{{base_url}}/topups",
                "description": "Creates a Stripe payment link. amount_cents is the balance credit in euro cents; total_cents is the payment total including applicable VAT.\n\n",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"amount_cents\": 10000\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "OK",
              "code": 202,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"success\": true,\n  \"data\": {\n    \"id\": \"op_0123456789abcdef0123456789abcdef\",\n    \"state\": \"queued\",\n    \"error\": null,\n    \"result\": null,\n    \"created_at\": \"2026-11-10T12:00:00+00:00\",\n    \"status_url\": \"/api/partner/v1/operations/op_0123456789abcdef0123456789abcdef\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Top-up status · Stripe",
          "request": {
            "method": "GET",
            "header": [],
            "url": "{{base_url}}/topups/{{topup_id}}",
            "description": "Returns the account’s top-up status. paid confirms the balance has been credited. Returning from Stripe alone does not confirm payment.\n\nStates: creating, pending, paid, expired, failed."
          },
          "response": [
            {
              "name": "Stripe",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": "{{base_url}}/topups/{{topup_id}}",
                "description": "Returns the account’s top-up status. paid confirms the balance has been credited. Returning from Stripe alone does not confirm payment.\n\nStates: creating, pending, paid, expired, failed."
              },
              "status": "OK",
              "code": 200,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"success\": true,\n  \"data\": {\n    \"id\": \"ptop_0123456789abcdef0123456789abcdef\",\n    \"state\": \"pending\",\n    \"url\": \"https://checkout.stripe.com/c/pay/EXAMPLE_SESSION\",\n    \"amount_cents\": 10000,\n    \"vat_cents\": 2300,\n    \"total_cents\": 12300,\n    \"currency\": \"EUR\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Transaction history · First page",
          "request": {
            "method": "GET",
            "header": [],
            "url": "{{base_url}}/transactions?offset=0&limit=30",
            "description": "Operations newest first, with sources, comments, amounts and balances after each entry. Technical purchase reservations are hidden by default.\n\n"
          },
          "response": [
            {
              "name": "First page",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": "{{base_url}}/transactions?offset=0&limit=30",
                "description": "Operations newest first, with sources, comments, amounts and balances after each entry. Technical purchase reservations are hidden by default.\n\n"
              },
              "status": "OK",
              "code": 200,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"success\": true,\n  \"data\": {\n    \"items\": [\n      {\n        \"id\": \"ptop_0123456789abcdef0123456789abcdef:credit\",\n        \"created_at\": \"2026-11-09T12:05:00+00:00\",\n        \"currency\": \"EUR\",\n        \"operation\": \"topup\",\n        \"amount_cents\": 10000,\n        \"reserved_delta_cents\": 0,\n        \"source\": \"stripe\",\n        \"comment\": \"\",\n        \"reference\": \"ptop_0123456789abcdef0123456789abcdef\",\n        \"balance_after_cents\": 10000,\n        \"reserved_after_cents\": 0,\n        \"sequence\": 1\n      }\n    ],\n    \"total\": 1,\n    \"offset\": 0,\n    \"limit\": 30\n  }\n}"
            }
          ]
        },
        {
          "name": "Withdrawal request · Request",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": "{{base_url}}/withdrawals",
            "description": "Creates a request and reserves the amount pending review. withdrawable_cents specifies the refundable amount; it excludes the credit limit and nonrefundable compensation.\n\nAfter the request is processed, result.state=requested means a decision is pending. The operation remains processing until payment is confirmed or the request is rejected.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"amount_cents\": 5000,\n  \"comment\": \"Please contact me to confirm payment details.\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "name": "Request",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": "{{base_url}}/withdrawals",
                "description": "Creates a request and reserves the amount pending review. withdrawable_cents specifies the refundable amount; it excludes the credit limit and nonrefundable compensation.\n\nAfter the request is processed, result.state=requested means a decision is pending. The operation remains processing until payment is confirmed or the request is rejected.",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"amount_cents\": 5000,\n  \"comment\": \"Please contact me to confirm payment details.\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "OK",
              "code": 202,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"success\": true,\n  \"data\": {\n    \"id\": \"op_0123456789abcdef0123456789abcdef\",\n    \"state\": \"queued\",\n    \"error\": null,\n    \"result\": null,\n    \"created_at\": \"2026-11-10T12:00:00+00:00\",\n    \"status_url\": \"/api/partner/v1/operations/op_0123456789abcdef0123456789abcdef\"\n  }\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "Catalogue & orders",
      "item": [
        {
          "name": "Available ports · Availability",
          "request": {
            "method": "GET",
            "header": [],
            "url": "{{base_url}}/catalog",
            "description": "Available port numbers grouped by operator and location.\n\nAvailability is checked when placing an order. Viewing the catalogue does not reserve ports."
          },
          "response": [
            {
              "name": "Availability",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": "{{base_url}}/catalog",
                "description": "Available port numbers grouped by operator and location.\n\nAvailability is checked when placing an order. Viewing the catalogue does not reserve ports."
              },
              "status": "OK",
              "code": 200,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"success\": true,\n  \"data\": {\n    \"items\": [\n      {\n        \"operator\": {\n          \"id\": \"operator-orange\",\n          \"name\": \"Orange\"\n        },\n        \"location\": {\n          \"id\": \"location-warsaw\",\n          \"name\": \"Warsaw\"\n        },\n        \"ports\": [\n          {\n            \"id\": \"b1c2d3e4f5a60123456789abcdef0123\",\n            \"number\": 10001\n          },\n          {\n            \"id\": \"b2c3d4e5f6a70123456789abcdef0123\",\n            \"number\": 10002\n          }\n        ],\n        \"available\": 2\n      }\n    ],\n    \"prices\": [\n      {\n        \"currency\": \"EUR\",\n        \"base_net_cents\": 4500,\n        \"net_cents\": 4050,\n        \"vat_cents\": 0,\n        \"total_cents\": 4050,\n        \"tax_at_topup\": true,\n        \"discount_percent\": 10,\n        \"months\": 1,\n        \"days\": 30,\n        \"pricing_version\": 1,\n        \"tax\": {\n          \"mode\": \"vat\",\n          \"rate_percent\": 23,\n          \"vat_code\": \"23\",\n          \"reverse_charge\": false\n        }\n      }\n    ]\n  }\n}"
            }
          ]
        },
        {
          "name": "Port order · By number",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": "{{base_url}}/orders",
            "description": "Orders one available port for 30 days using its catalogue number or ID. The cost is debited from the balance.\n\nLong-running operations return HTTP 202 and a server-generated id. Status and results are available through GET /operations/{id}. Checking status does not create another operation.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"port_number\": 10001\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "name": "By number",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": "{{base_url}}/orders",
                "description": "Orders one available port for 30 days using its catalogue number or ID. The cost is debited from the balance.\n\nLong-running operations return HTTP 202 and a server-generated id. Status and results are available through GET /operations/{id}. Checking status does not create another operation.",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"port_number\": 10001\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "OK",
              "code": 202,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"success\": true,\n  \"data\": {\n    \"id\": \"op_0123456789abcdef0123456789abcdef\",\n    \"state\": \"queued\",\n    \"error\": null,\n    \"result\": null,\n    \"created_at\": \"2026-11-10T12:00:00+00:00\",\n    \"status_url\": \"/api/partner/v1/operations/op_0123456789abcdef0123456789abcdef\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Port order · By ID",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": "{{base_url}}/orders",
            "description": "Orders one available port for 30 days using its catalogue number or ID. The cost is debited from the balance.\n\nLong-running operations return HTTP 202 and a server-generated id. Status and results are available through GET /operations/{id}. Checking status does not create another operation.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"port_id\": \"b1c2d3e4f5a60123456789abcdef0123\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "name": "By ID",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": "{{base_url}}/orders",
                "description": "Orders one available port for 30 days using its catalogue number or ID. The cost is debited from the balance.\n\nLong-running operations return HTTP 202 and a server-generated id. Status and results are available through GET /operations/{id}. Checking status does not create another operation.",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"port_id\": \"b1c2d3e4f5a60123456789abcdef0123\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "OK",
              "code": 202,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"success\": true,\n  \"data\": {\n    \"id\": \"op_0123456789abcdef0123456789abcdef\",\n    \"state\": \"queued\",\n    \"error\": null,\n    \"result\": null,\n    \"created_at\": \"2026-11-10T12:00:00+00:00\",\n    \"status_url\": \"/api/partner/v1/operations/op_0123456789abcdef0123456789abcdef\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Port list · Ports",
          "request": {
            "method": "GET",
            "header": [],
            "url": "{{base_url}}/orders",
            "description": "Current account ports: rental expiry, connection details, IP and automatic IP rotation.\n\nTo change the IP, send a GET request to the full rotation_url returned in the port details. No Authorization header is required. The URL already contains the port token."
          },
          "response": [
            {
              "name": "Ports",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": "{{base_url}}/orders",
                "description": "Current account ports: rental expiry, connection details, IP and automatic IP rotation.\n\nTo change the IP, send a GET request to the full rotation_url returned in the port details. No Authorization header is required. The URL already contains the port token."
              },
              "status": "OK",
              "code": 200,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"success\": true,\n  \"data\": {\n    \"items\": [\n      {\n        \"id\": \"a1b2c3d4e5f60123456789abcdef0123\",\n        \"port_id\": \"b1c2d3e4f5a60123456789abcdef0123\",\n        \"number\": 10001,\n        \"host\": \"l1.gigabit.ltd\",\n        \"username\": \"astra_a1b2c3d4e5f\",\n        \"proxy_password\": \"EXAMPLE_ONLY_22_CHARS_x\",\n        \"status\": \"active\",\n        \"expires\": \"2026-12-09T22:59:59+00:00\",\n        \"operator\": \"Orange\",\n        \"cityName\": \"Warsaw\",\n        \"ip\": \"198.51.100.42\",\n        \"rotation_url\": \"https://api.gigabit.ltd/change_ip?token=EXAMPLE_ROTATION_TOKEN_REPLACE_ME\",\n        \"rotation\": true,\n        \"rotation_seconds\": 120,\n        \"connection_options\": {\n          \"custom\": {\n            \"host\": \"proxy.example.com\",\n            \"rotation_url\": \"https://api.example.com/change_ip?token=EXAMPLE_ROTATION_TOKEN_REPLACE_ME\"\n          }\n        }\n      }\n    ]\n  }\n}"
            }
          ]
        },
        {
          "name": "Port details · Port",
          "request": {
            "method": "GET",
            "header": [],
            "url": "{{base_url}}/orders/{{order_id}}",
            "description": "Details of an order belonging to the account. Unavailable or missing orders return 404.\n\nTo change the IP, send a GET request to the full rotation_url returned in the port details. No Authorization header is required. The URL already contains the port token."
          },
          "response": [
            {
              "name": "Port",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": "{{base_url}}/orders/{{order_id}}",
                "description": "Details of an order belonging to the account. Unavailable or missing orders return 404.\n\nTo change the IP, send a GET request to the full rotation_url returned in the port details. No Authorization header is required. The URL already contains the port token."
              },
              "status": "OK",
              "code": 200,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"success\": true,\n  \"data\": {\n    \"id\": \"a1b2c3d4e5f60123456789abcdef0123\",\n    \"port_id\": \"b1c2d3e4f5a60123456789abcdef0123\",\n    \"number\": 10001,\n    \"host\": \"l1.gigabit.ltd\",\n    \"username\": \"astra_a1b2c3d4e5f\",\n    \"proxy_password\": \"EXAMPLE_ONLY_22_CHARS_x\",\n    \"status\": \"active\",\n    \"expires\": \"2026-12-09T22:59:59+00:00\",\n    \"operator\": \"Orange\",\n    \"cityName\": \"Warsaw\",\n    \"ip\": \"198.51.100.42\",\n    \"rotation_url\": \"https://api.gigabit.ltd/change_ip?token=EXAMPLE_ROTATION_TOKEN_REPLACE_ME\",\n    \"rotation\": true,\n    \"rotation_seconds\": 120,\n    \"connection_options\": {\n      \"custom\": {\n        \"host\": \"proxy.example.com\",\n        \"rotation_url\": \"https://api.example.com/change_ip?token=EXAMPLE_ROTATION_TOKEN_REPLACE_ME\"\n      }\n    }\n  }\n}"
            }
          ]
        },
        {
          "name": "Port renewal · By number",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": "{{base_url}}/orders/10001/renew",
            "description": "Extends one port rental by 30 days, paid from the balance. Only the port number or ID in the URL is required.\n\nLong-running operations return HTTP 202 and a server-generated id. Status and results are available through GET /operations/{id}. Checking status does not create another operation.",
            "body": {
              "mode": "raw",
              "raw": "{}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "name": "By number",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": "{{base_url}}/orders/10001/renew",
                "description": "Extends one port rental by 30 days, paid from the balance. Only the port number or ID in the URL is required.\n\nLong-running operations return HTTP 202 and a server-generated id. Status and results are available through GET /operations/{id}. Checking status does not create another operation.",
                "body": {
                  "mode": "raw",
                  "raw": "{}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "OK",
              "code": 202,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"success\": true,\n  \"data\": {\n    \"id\": \"op_0123456789abcdef0123456789abcdef\",\n    \"state\": \"queued\",\n    \"error\": null,\n    \"result\": null,\n    \"created_at\": \"2026-11-10T12:00:00+00:00\",\n    \"status_url\": \"/api/partner/v1/operations/op_0123456789abcdef0123456789abcdef\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Port renewal · By ID",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": "{{base_url}}/orders/b1c2d3e4f5a60123456789abcdef0123/renew",
            "description": "Extends one port rental by 30 days, paid from the balance. Only the port number or ID in the URL is required.\n\nLong-running operations return HTTP 202 and a server-generated id. Status and results are available through GET /operations/{id}. Checking status does not create another operation.",
            "body": {
              "mode": "raw",
              "raw": "{}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "name": "By ID",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": "{{base_url}}/orders/b1c2d3e4f5a60123456789abcdef0123/renew",
                "description": "Extends one port rental by 30 days, paid from the balance. Only the port number or ID in the URL is required.\n\nLong-running operations return HTTP 202 and a server-generated id. Status and results are available through GET /operations/{id}. Checking status does not create another operation.",
                "body": {
                  "mode": "raw",
                  "raw": "{}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "OK",
              "code": 202,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"success\": true,\n  \"data\": {\n    \"id\": \"op_0123456789abcdef0123456789abcdef\",\n    \"state\": \"queued\",\n    \"error\": null,\n    \"result\": null,\n    \"created_at\": \"2026-11-10T12:00:00+00:00\",\n    \"status_url\": \"/api/partner/v1/operations/op_0123456789abcdef0123456789abcdef\"\n  }\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "Credentials & IP rotation",
      "item": [
        {
          "name": "Reset IP rotation token · New link",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": "{{base_url}}/orders/{{order_id}}/rotation-token",
            "description": "Creates a new IP rotation token and returns a ready-to-use URL. The previous token and all URLs containing it stop working immediately. The proxy password and timer remain unchanged.\n\nThe response is returned immediately, without a background operation. The new URL is also available in the port’s rotation_url field.",
            "body": {
              "mode": "raw",
              "raw": "{}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "name": "New link",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": "{{base_url}}/orders/{{order_id}}/rotation-token",
                "description": "Creates a new IP rotation token and returns a ready-to-use URL. The previous token and all URLs containing it stop working immediately. The proxy password and timer remain unchanged.\n\nThe response is returned immediately, without a background operation. The new URL is also available in the port’s rotation_url field.",
                "body": {
                  "mode": "raw",
                  "raw": "{}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "OK",
              "code": 200,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"success\": true,\n  \"data\": {\n    \"rotation_token\": \"0123456789abcdef0123456789abcdef\",\n    \"rotation_url\": \"https://api.gigabit.ltd/change_ip?token=0123456789abcdef0123456789abcdef\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Credential change by ID · Login and password",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": "{{base_url}}/orders/{{order_id}}/password",
            "description": "The server generates a new password. With change_login=true it also generates a login using the current partner prefix. Available only for active rentals.\n\nNew credentials are available in result after application. operation_superseded means a newer command changed the credentials.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"change_login\": true\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "name": "Login and password",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": "{{base_url}}/orders/{{order_id}}/password",
                "description": "The server generates a new password. With change_login=true it also generates a login using the current partner prefix. Available only for active rentals.\n\nNew credentials are available in result after application. operation_superseded means a newer command changed the credentials.",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"change_login\": true\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "OK",
              "code": 202,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"success\": true,\n  \"data\": {\n    \"id\": \"op_0123456789abcdef0123456789abcdef\",\n    \"state\": \"queued\",\n    \"error\": null,\n    \"result\": null,\n    \"created_at\": \"2026-11-10T12:00:00+00:00\",\n    \"status_url\": \"/api/partner/v1/operations/op_0123456789abcdef0123456789abcdef\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Credential change by ID · Password only",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": "{{base_url}}/orders/{{order_id}}/password",
            "description": "The server generates a new password. With change_login=true it also generates a login using the current partner prefix. Available only for active rentals.\n\nNew credentials are available in result after application. operation_superseded means a newer command changed the credentials.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"change_login\": false\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "name": "Password only",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": "{{base_url}}/orders/{{order_id}}/password",
                "description": "The server generates a new password. With change_login=true it also generates a login using the current partner prefix. Available only for active rentals.\n\nNew credentials are available in result after application. operation_superseded means a newer command changed the credentials.",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"change_login\": false\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "OK",
              "code": 202,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"success\": true,\n  \"data\": {\n    \"id\": \"op_0123456789abcdef0123456789abcdef\",\n    \"state\": \"queued\",\n    \"error\": null,\n    \"result\": null,\n    \"created_at\": \"2026-11-10T12:00:00+00:00\",\n    \"status_url\": \"/api/partner/v1/operations/op_0123456789abcdef0123456789abcdef\"\n  }\n}"
            }
          ]
        },
        {
          "name": "IP rotation timer · Enabled",
          "request": {
            "method": "GET",
            "header": [],
            "url": "{{base_url}}/orders/{{order_id}}/rotation",
            "description": "Current timer state. When rotation=true, rotation_seconds is included. When disabled, only rotation=false is returned.\n\n"
          },
          "response": [
            {
              "name": "Enabled",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": "{{base_url}}/orders/{{order_id}}/rotation",
                "description": "Current timer state. When rotation=true, rotation_seconds is included. When disabled, only rotation=false is returned.\n\n"
              },
              "status": "OK",
              "code": 200,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"success\": true,\n  \"data\": {\n    \"rotation\": true,\n    \"rotation_seconds\": 120\n  }\n}"
            }
          ]
        },
        {
          "name": "IP rotation timer · Disabled",
          "request": {
            "method": "GET",
            "header": [],
            "url": "{{base_url}}/orders/{{order_id}}/rotation",
            "description": "Current timer state. When rotation=true, rotation_seconds is included. When disabled, only rotation=false is returned.\n\n"
          },
          "response": [
            {
              "name": "Disabled",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": "{{base_url}}/orders/{{order_id}}/rotation",
                "description": "Current timer state. When rotation=true, rotation_seconds is included. When disabled, only rotation=false is returned.\n\n"
              },
              "status": "OK",
              "code": 200,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"success\": true,\n  \"data\": {\n    \"rotation\": false\n  }\n}"
            }
          ]
        },
        {
          "name": "Timer settings · Every 120 seconds",
          "request": {
            "method": "PUT",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": "{{base_url}}/orders/{{order_id}}/rotation",
            "description": "Enable the timer with rotation=true and rotation_seconds, an integer from 20 to 86400 seconds. Values below 20 return rotation_interval_too_short. To disable it, send only rotation=false.\n\nThe operation remains processing until the timer setting is confirmed.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"rotation\": true,\n  \"rotation_seconds\": 120\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "name": "Every 120 seconds",
              "originalRequest": {
                "method": "PUT",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": "{{base_url}}/orders/{{order_id}}/rotation",
                "description": "Enable the timer with rotation=true and rotation_seconds, an integer from 20 to 86400 seconds. Values below 20 return rotation_interval_too_short. To disable it, send only rotation=false.\n\nThe operation remains processing until the timer setting is confirmed.",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"rotation\": true,\n  \"rotation_seconds\": 120\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "OK",
              "code": 202,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"success\": true,\n  \"data\": {\n    \"id\": \"op_0123456789abcdef0123456789abcdef\",\n    \"state\": \"queued\",\n    \"error\": null,\n    \"result\": null,\n    \"created_at\": \"2026-11-10T12:00:00+00:00\",\n    \"status_url\": \"/api/partner/v1/operations/op_0123456789abcdef0123456789abcdef\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Timer settings · Disable",
          "request": {
            "method": "PUT",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": "{{base_url}}/orders/{{order_id}}/rotation",
            "description": "Enable the timer with rotation=true and rotation_seconds, an integer from 20 to 86400 seconds. Values below 20 return rotation_interval_too_short. To disable it, send only rotation=false.\n\nThe operation remains processing until the timer setting is confirmed.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"rotation\": false\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "name": "Disable",
              "originalRequest": {
                "method": "PUT",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": "{{base_url}}/orders/{{order_id}}/rotation",
                "description": "Enable the timer with rotation=true and rotation_seconds, an integer from 20 to 86400 seconds. Values below 20 return rotation_interval_too_short. To disable it, send only rotation=false.\n\nThe operation remains processing until the timer setting is confirmed.",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"rotation\": false\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "OK",
              "code": 202,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"success\": true,\n  \"data\": {\n    \"id\": \"op_0123456789abcdef0123456789abcdef\",\n    \"state\": \"queued\",\n    \"error\": null,\n    \"result\": null,\n    \"created_at\": \"2026-11-10T12:00:00+00:00\",\n    \"status_url\": \"/api/partner/v1/operations/op_0123456789abcdef0123456789abcdef\"\n  }\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "Partner profile",
      "item": [
        {
          "name": "Login prefix · Prefix",
          "request": {
            "method": "PUT",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": "{{base_url}}/profile",
            "description": "The prefix is the beginning of port logins, such as a brand name. Logins use the format prefix_random: with prefix=astra, a new port receives a login such as astra_a1b2c3d4e5f. The random suffix is generated separately for each port.\n\nChanging the prefix does not change existing logins. New ports and login changes using change_login=true use the current prefix. The prefix must be unique; a taken prefix returns 409 partner_prefix_taken.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"prefix\": \"astra\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "name": "Prefix",
              "originalRequest": {
                "method": "PUT",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": "{{base_url}}/profile",
                "description": "The prefix is the beginning of port logins, such as a brand name. Logins use the format prefix_random: with prefix=astra, a new port receives a login such as astra_a1b2c3d4e5f. The random suffix is generated separately for each port.\n\nChanging the prefix does not change existing logins. New ports and login changes using change_login=true use the current prefix. The prefix must be unique; a taken prefix returns 409 partner_prefix_taken.",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"prefix\": \"astra\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "OK",
              "code": 200,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"success\": true,\n  \"data\": {\n    \"prefix\": \"astra\"\n  }\n}"
            }
          ]
        }
      ]
    }
  ],
  "event": [
    {
      "listen": "test",
      "script": {
        "type": "text/javascript",
        "exec": [
          "if (pm.response.code >= 200 && pm.response.code < 300) {",
          "  const data = pm.response.json().data;",
          "  if (data && data.status_url) pm.collectionVariables.set(\"operation_id\", data.id);",
          "  const result = data && data.result;",
          "  if (result && result.order_ids && result.order_ids.length) pm.collectionVariables.set(\"order_id\", result.order_ids[0]);",
          "  if (result && result.id && result.id.startsWith(\"ptop_\")) pm.collectionVariables.set(\"topup_id\", result.id);",
          "}"
        ]
      }
    }
  ]
}
