Partner API
API for mobile proxy integration: port orders and renewals, access management and billing.
Example values are illustrative. Current prices, IDs and connection details are returned by the API.
Authentication
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.
The token must be sent in the HTTP request header Authorization using the Bearer scheme.
Authorization: Bearer gbp_PARTNER_TOKENRequest and response format
Request bodies use JSON. Request and response examples are provided for each endpoint.
| Item | Format and meaning |
|---|---|
| Request body | JSON object and Content-Type: application/json. The body may be omitted when there are no parameters. |
| HTTP 202 | Operation accepted. The server returns id and status_url for checking progress. |
| GET /operations/{id} | queued: waiting; processing: in progress; ready: completed; failed: error. result contains the outcome and error contains the failure code. |
| Dates | ISO 8601 with a timezone, e.g. 2026-12-09T22:59:59+00:00. |
| Amounts | _cents fields: integer euro cents. 4500 = EUR 45.00. |
| Limits | Body up to 16 KiB; 600 requests per hour per account. For HTTP 429, Retry-After specifies the delay. |
Successful response
{
"success": true,
"data": {
"currency": "EUR",
"balance_cents": 10000
}
}Error response
{
"success": false,
"error": "unauthenticated"
}Balance and payments
API orders and renewals cover one port for 30 days. The price after the individual discount is debited from the net balance. available_cents includes the credit limit and reservations.
VAT is determined by the billing profile and added to Stripe top-ups. It is not charged again when purchasing ports.
Errors
| HTTP | error | Description |
|---|---|---|
| 400 | invalid_rotation_token_request | Token reset does not accept additional parameters. |
| 400 | invalid_json | Invalid JSON in the request body. |
| 400 | invalid_payment_request | Unsupported or invalid request parameters. |
| 400 | invalid_payment_orders | Invalid port number or ID. |
| 400 | invalid_partner_amount | The amount is outside the allowed constraints. |
| 400 | invalid_pagination | Invalid pagination parameters. |
| 400 | invalid_partner_prefix | The login prefix is outside the allowed constraints. |
| 400 | invalid_rotation_interval | Invalid rotation or rotation_seconds fields. |
| 401 | unauthenticated | Token is missing, invalid or revoked. |
| 403 | partner_required | An active partner account is required. |
| 403 | payment_method_unavailable | The payment method is unavailable for this account. |
| 403 | origin_not_allowed | The request origin is not allowed. |
| 404 | not_found | Object not found or unavailable to this account. |
| 409 | insufficient_partner_balance | Insufficient funds after accounting for the credit limit and reservations. |
| 409 | insufficient_withdrawable_balance | Insufficient funds available for refund. |
| 409 | inventory_changed | Port availability changed since the catalogue was read. |
| 409 | partner_prefix_taken | The prefix is already taken. |
| 409 | record_changed_or_in_use | The record has changed or is in use by another operation. |
| 409 | payment_busy | A related operation is still in progress. |
| 409 | rotation_busy | IP rotation is still in progress. |
| 409 | billing_required | Required billing details are missing from the profile. |
| 409 | rotation_interval_too_short | The interval is below 20 seconds or the port server's limit. |
| 403 / 409 | order_expired | The rental is inactive. Credential changes and IP rotation are available after renewal. |
| 429 | too_many_requests | Request limit exceeded. Retry-After specifies the delay. |
| 502 | proxy_server_unavailable | The proxy server is temporarily unavailable. |
| 502 | rotation_sync_pending | Application of the IP rotation setting is not yet confirmed. |
| 503 | database_unavailable | The database is temporarily unavailable. |
| 503 | stripe_unavailable | The payment service is temporarily unavailable. |
Operation status
Returns the account operation’s status and result. A quick check without repeating the action.
Parameters
| Field | Type | Description |
|---|---|---|
idPath · Required | string | Operation ID returned in the HTTP 202 response. |
Example request
curl --request GET \
--url 'https://api.gigabit.ltd/api/partner/v1/operations/op_0123456789abcdef0123456789abcdef' \
--header "Authorization: Bearer $GIGABIT_API_TOKEN"const response = await fetch(
"https://api.gigabit.ltd/api/partner/v1/operations/op_0123456789abcdef0123456789abcdef",
{
method: "GET",
headers: {
Authorization: `Bearer ${process.env.GIGABIT_API_TOKEN}`
}
}
);
const result = await response.json();
if (!response.ok) throw new Error(result.error);
console.log(result);# python -m pip install requests
import os
import requests
response = requests.get(
"https://api.gigabit.ltd/api/partner/v1/operations/op_0123456789abcdef0123456789abcdef",
headers={"Authorization": f"Bearer {os.environ['GIGABIT_API_TOKEN']}"},
timeout=30,
)
result = response.json()
if not response.ok:
raise RuntimeError(result.get("error", f"HTTP {response.status_code}"))
print(result)Example response
{
"success": true,
"data": {
"id": "op_0123456789abcdef0123456789abcdef",
"state": "queued",
"error": null,
"result": null,
"created_at": "2026-11-10T12:00:00+00:00",
"status_url": "/api/partner/v1/operations/op_0123456789abcdef0123456789abcdef"
}
}Example request
curl --request GET \
--url 'https://api.gigabit.ltd/api/partner/v1/operations/op_0123456789abcdef0123456789abcdef' \
--header "Authorization: Bearer $GIGABIT_API_TOKEN"const response = await fetch(
"https://api.gigabit.ltd/api/partner/v1/operations/op_0123456789abcdef0123456789abcdef",
{
method: "GET",
headers: {
Authorization: `Bearer ${process.env.GIGABIT_API_TOKEN}`
}
}
);
const result = await response.json();
if (!response.ok) throw new Error(result.error);
console.log(result);# python -m pip install requests
import os
import requests
response = requests.get(
"https://api.gigabit.ltd/api/partner/v1/operations/op_0123456789abcdef0123456789abcdef",
headers={"Authorization": f"Bearer {os.environ['GIGABIT_API_TOKEN']}"},
timeout=30,
)
result = response.json()
if not response.ok:
raise RuntimeError(result.get("error", f"HTTP {response.status_code}"))
print(result)Example response
{
"success": true,
"data": {
"id": "op_0123456789abcdef0123456789abcdef",
"state": "ready",
"error": null,
"result": {
"id": "partner_0123456789abcdef0123456789abcdef",
"state": "ready",
"error": null,
"order_ids": [
"a1b2c3d4e5f60123456789abcdef0123"
],
"amount_cents": 4050,
"currency": "EUR",
"price": {
"currency": "EUR",
"base_net_cents": 4500,
"net_cents": 4050,
"vat_cents": 0,
"total_cents": 4050,
"tax_at_topup": true,
"discount_percent": 10,
"months": 1,
"days": 30,
"pricing_version": 1,
"tax": {
"mode": "vat",
"rate_percent": 23,
"vat_code": "23",
"reverse_charge": false
}
}
},
"created_at": "2026-11-10T12:00:00+00:00",
"status_url": "/api/partner/v1/operations/op_0123456789abcdef0123456789abcdef"
}
}Example request
curl --request GET \
--url 'https://api.gigabit.ltd/api/partner/v1/operations/op_0123456789abcdef0123456789abcdef' \
--header "Authorization: Bearer $GIGABIT_API_TOKEN"const response = await fetch(
"https://api.gigabit.ltd/api/partner/v1/operations/op_0123456789abcdef0123456789abcdef",
{
method: "GET",
headers: {
Authorization: `Bearer ${process.env.GIGABIT_API_TOKEN}`
}
}
);
const result = await response.json();
if (!response.ok) throw new Error(result.error);
console.log(result);# python -m pip install requests
import os
import requests
response = requests.get(
"https://api.gigabit.ltd/api/partner/v1/operations/op_0123456789abcdef0123456789abcdef",
headers={"Authorization": f"Bearer {os.environ['GIGABIT_API_TOKEN']}"},
timeout=30,
)
result = response.json()
if not response.ok:
raise RuntimeError(result.get("error", f"HTTP {response.status_code}"))
print(result)Example response
{
"success": true,
"data": {
"id": "op_0123456789abcdef0123456789abcdef",
"state": "failed",
"error": "insufficient_partner_balance",
"result": null,
"created_at": "2026-11-10T12:00:00+00:00",
"status_url": "/api/partner/v1/operations/op_0123456789abcdef0123456789abcdef"
}
}Balance
Current balance, credit limit, available funds, discount and partner prices.
No request body.
Example request
curl --request GET \
--url 'https://api.gigabit.ltd/api/partner/v1/balance' \
--header "Authorization: Bearer $GIGABIT_API_TOKEN"const response = await fetch(
"https://api.gigabit.ltd/api/partner/v1/balance",
{
method: "GET",
headers: {
Authorization: `Bearer ${process.env.GIGABIT_API_TOKEN}`
}
}
);
const result = await response.json();
if (!response.ok) throw new Error(result.error);
console.log(result);# python -m pip install requests
import os
import requests
response = requests.get(
"https://api.gigabit.ltd/api/partner/v1/balance",
headers={"Authorization": f"Bearer {os.environ['GIGABIT_API_TOKEN']}"},
timeout=30,
)
result = response.json()
if not response.ok:
raise RuntimeError(result.get("error", f"HTTP {response.status_code}"))
print(result)Example response
{
"success": true,
"data": {
"currency": "EUR",
"balance_cents": 10000,
"reserved_cents": 0,
"credit_limit_cents": 10000,
"debt_cents": 0,
"available_cents": 20000,
"withdrawable_cents": 10000,
"discount_percent": 10,
"prefix": "astra",
"api_token_hint": "demo12",
"monthly_net_cents": 4500,
"payment_method": "card",
"connection_domains": {
"host": "",
"api": ""
},
"paid_in_cents": 10000,
"prices": [
{
"currency": "EUR",
"base_net_cents": 4500,
"net_cents": 4050,
"vat_cents": 0,
"total_cents": 4050,
"tax_at_topup": true,
"discount_percent": 10,
"months": 1,
"days": 30,
"pricing_version": 1,
"tax": {
"mode": "vat",
"rate_percent": 23,
"vat_code": "23",
"reverse_charge": false
}
}
],
"topup_tax": {
"mode": "vat",
"rate_percent": 23,
"vat_code": "23",
"reverse_charge": false
},
"can_order_new_ports": true
}
}Balance top-up
Creates a Stripe payment link. amount_cents is the balance credit in euro cents; total_cents is the payment total including applicable VAT.
Parameters
| Field | Type | Description |
|---|---|---|
amount_centsJSON body · Required | integer100-10000000 | EUR 1-100,000, in integer euro cents. |
Example request
curl --request POST \
--url 'https://api.gigabit.ltd/api/partner/v1/topups' \
--header "Authorization: Bearer $GIGABIT_API_TOKEN" \
--header 'Content-Type: application/json' \
--data '{
"amount_cents": 10000
}'const response = await fetch(
"https://api.gigabit.ltd/api/partner/v1/topups",
{
method: "POST",
headers: {
Authorization: `Bearer ${process.env.GIGABIT_API_TOKEN}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"amount_cents": 10000
})
}
);
const result = await response.json();
if (!response.ok) throw new Error(result.error);
console.log(result);# python -m pip install requests
import os
import requests
response = requests.post(
"https://api.gigabit.ltd/api/partner/v1/topups",
headers={"Authorization": f"Bearer {os.environ['GIGABIT_API_TOKEN']}"},
json={'amount_cents': 10000},
timeout=30,
)
result = response.json()
if not response.ok:
raise RuntimeError(result.get("error", f"HTTP {response.status_code}"))
print(result)Example response
{
"success": true,
"data": {
"id": "op_0123456789abcdef0123456789abcdef",
"state": "queued",
"error": null,
"result": null,
"created_at": "2026-11-10T12:00:00+00:00",
"status_url": "/api/partner/v1/operations/op_0123456789abcdef0123456789abcdef"
}
}Result after completion
{
"success": true,
"data": {
"id": "op_0123456789abcdef0123456789abcdef",
"state": "ready",
"error": null,
"result": {
"id": "ptop_0123456789abcdef0123456789abcdef",
"state": "pending",
"url": "https://checkout.stripe.com/c/pay/EXAMPLE_SESSION",
"amount_cents": 10000,
"vat_cents": 2300,
"total_cents": 12300,
"currency": "EUR"
},
"created_at": "2026-11-10T12:00:00+00:00",
"status_url": "/api/partner/v1/operations/op_0123456789abcdef0123456789abcdef"
}
}Top-up status
Returns the account’s top-up status. paid confirms the balance has been credited. Returning from Stripe alone does not confirm payment.
States: creating, pending, paid, expired, failed.
Parameters
| Field | Type | Description |
|---|---|---|
idPath · Required | string | Top-up ID returned by POST /topups. |
Example request
curl --request GET \
--url 'https://api.gigabit.ltd/api/partner/v1/topups/ptop_0123456789abcdef0123456789abcdef' \
--header "Authorization: Bearer $GIGABIT_API_TOKEN"const response = await fetch(
"https://api.gigabit.ltd/api/partner/v1/topups/ptop_0123456789abcdef0123456789abcdef",
{
method: "GET",
headers: {
Authorization: `Bearer ${process.env.GIGABIT_API_TOKEN}`
}
}
);
const result = await response.json();
if (!response.ok) throw new Error(result.error);
console.log(result);# python -m pip install requests
import os
import requests
response = requests.get(
"https://api.gigabit.ltd/api/partner/v1/topups/ptop_0123456789abcdef0123456789abcdef",
headers={"Authorization": f"Bearer {os.environ['GIGABIT_API_TOKEN']}"},
timeout=30,
)
result = response.json()
if not response.ok:
raise RuntimeError(result.get("error", f"HTTP {response.status_code}"))
print(result)Example response
{
"success": true,
"data": {
"id": "ptop_0123456789abcdef0123456789abcdef",
"state": "pending",
"url": "https://checkout.stripe.com/c/pay/EXAMPLE_SESSION",
"amount_cents": 10000,
"vat_cents": 2300,
"total_cents": 12300,
"currency": "EUR"
}
}Transaction history
Operations newest first, with sources, comments, amounts and balances after each entry. Technical purchase reservations are hidden by default.
Parameters
| Field | Type | Description |
|---|---|---|
offsetQuery · Optional | integer0-∞ | Number of entries to skip. |
limitQuery · Optional | integer1-100 | Page size: 1-100. |
include_reservationsQuery · Optional | string1 | 1 includes purchase_reserve and purchase_release. |
Example request
curl --request GET \
--url 'https://api.gigabit.ltd/api/partner/v1/transactions?offset=0&limit=30' \
--header "Authorization: Bearer $GIGABIT_API_TOKEN"const response = await fetch(
"https://api.gigabit.ltd/api/partner/v1/transactions?offset=0&limit=30",
{
method: "GET",
headers: {
Authorization: `Bearer ${process.env.GIGABIT_API_TOKEN}`
}
}
);
const result = await response.json();
if (!response.ok) throw new Error(result.error);
console.log(result);# python -m pip install requests
import os
import requests
response = requests.get(
"https://api.gigabit.ltd/api/partner/v1/transactions?offset=0&limit=30",
headers={"Authorization": f"Bearer {os.environ['GIGABIT_API_TOKEN']}"},
timeout=30,
)
result = response.json()
if not response.ok:
raise RuntimeError(result.get("error", f"HTTP {response.status_code}"))
print(result)Example response
{
"success": true,
"data": {
"items": [
{
"id": "ptop_0123456789abcdef0123456789abcdef:credit",
"created_at": "2026-11-09T12:05:00+00:00",
"currency": "EUR",
"operation": "topup",
"amount_cents": 10000,
"reserved_delta_cents": 0,
"source": "stripe",
"comment": "",
"reference": "ptop_0123456789abcdef0123456789abcdef",
"balance_after_cents": 10000,
"reserved_after_cents": 0,
"sequence": 1
}
],
"total": 1,
"offset": 0,
"limit": 30
}
}Withdrawal request
Creates a request and reserves the amount pending review. withdrawable_cents specifies the refundable amount; it excludes the credit limit and nonrefundable compensation.
After 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.
Parameters
| Field | Type | Description |
|---|---|---|
amount_centsJSON body · Required | integer100-100000000 | EUR amount in cents, no more than the withdrawable funds. |
commentJSON body · Required | string1-2000 | Payment details or explanation. Must be nonempty after trimming. |
Example request
curl --request POST \
--url 'https://api.gigabit.ltd/api/partner/v1/withdrawals' \
--header "Authorization: Bearer $GIGABIT_API_TOKEN" \
--header 'Content-Type: application/json' \
--data '{
"amount_cents": 5000,
"comment": "Please contact me to confirm payment details."
}'const response = await fetch(
"https://api.gigabit.ltd/api/partner/v1/withdrawals",
{
method: "POST",
headers: {
Authorization: `Bearer ${process.env.GIGABIT_API_TOKEN}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"amount_cents": 5000,
"comment": "Please contact me to confirm payment details."
})
}
);
const result = await response.json();
if (!response.ok) throw new Error(result.error);
console.log(result);# python -m pip install requests
import os
import requests
response = requests.post(
"https://api.gigabit.ltd/api/partner/v1/withdrawals",
headers={"Authorization": f"Bearer {os.environ['GIGABIT_API_TOKEN']}"},
json={'amount_cents': 5000,
'comment': 'Please contact me to confirm payment details.'},
timeout=30,
)
result = response.json()
if not response.ok:
raise RuntimeError(result.get("error", f"HTTP {response.status_code}"))
print(result)Example response
{
"success": true,
"data": {
"id": "op_0123456789abcdef0123456789abcdef",
"state": "queued",
"error": null,
"result": null,
"created_at": "2026-11-10T12:00:00+00:00",
"status_url": "/api/partner/v1/operations/op_0123456789abcdef0123456789abcdef"
}
}Result after completion
{
"success": true,
"data": {
"id": "op_0123456789abcdef0123456789abcdef",
"state": "ready",
"error": null,
"result": {
"id": "pout_0123456789abcdef0123456789abcdef",
"state": "paid"
},
"created_at": "2026-11-10T12:00:00+00:00",
"status_url": "/api/partner/v1/operations/op_0123456789abcdef0123456789abcdef"
}
}Available ports
Available port numbers grouped by operator and location.
Availability is checked when placing an order. Viewing the catalogue does not reserve ports.
No request body.
Example request
curl --request GET \
--url 'https://api.gigabit.ltd/api/partner/v1/catalog' \
--header "Authorization: Bearer $GIGABIT_API_TOKEN"const response = await fetch(
"https://api.gigabit.ltd/api/partner/v1/catalog",
{
method: "GET",
headers: {
Authorization: `Bearer ${process.env.GIGABIT_API_TOKEN}`
}
}
);
const result = await response.json();
if (!response.ok) throw new Error(result.error);
console.log(result);# python -m pip install requests
import os
import requests
response = requests.get(
"https://api.gigabit.ltd/api/partner/v1/catalog",
headers={"Authorization": f"Bearer {os.environ['GIGABIT_API_TOKEN']}"},
timeout=30,
)
result = response.json()
if not response.ok:
raise RuntimeError(result.get("error", f"HTTP {response.status_code}"))
print(result)Example response
{
"success": true,
"data": {
"items": [
{
"operator": {
"id": "operator-orange",
"name": "Orange"
},
"location": {
"id": "location-warsaw",
"name": "Warsaw"
},
"ports": [
{
"id": "b1c2d3e4f5a60123456789abcdef0123",
"number": 10001
},
{
"id": "b2c3d4e5f6a70123456789abcdef0123",
"number": 10002
}
],
"available": 2
}
],
"prices": [
{
"currency": "EUR",
"base_net_cents": 4500,
"net_cents": 4050,
"vat_cents": 0,
"total_cents": 4050,
"tax_at_topup": true,
"discount_percent": 10,
"months": 1,
"days": 30,
"pricing_version": 1,
"tax": {
"mode": "vat",
"rate_percent": 23,
"vat_code": "23",
"reverse_charge": false
}
}
]
}
}Port order
Orders one available port for 30 days using its catalogue number or ID. The cost is debited from the balance.
Long-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.
Parameters
| Field | Type | Description |
|---|---|---|
port_numberJSON body · Optional | integer1-65535 | Port number from the catalogue. Exactly one of port_number or port_id is required. |
port_idJSON body · Optional | string1-120 | Port ID from the catalogue, instead of port_number. |
Example request
curl --request POST \
--url 'https://api.gigabit.ltd/api/partner/v1/orders' \
--header "Authorization: Bearer $GIGABIT_API_TOKEN" \
--header 'Content-Type: application/json' \
--data '{
"port_number": 10001
}'const response = await fetch(
"https://api.gigabit.ltd/api/partner/v1/orders",
{
method: "POST",
headers: {
Authorization: `Bearer ${process.env.GIGABIT_API_TOKEN}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"port_number": 10001
})
}
);
const result = await response.json();
if (!response.ok) throw new Error(result.error);
console.log(result);# python -m pip install requests
import os
import requests
response = requests.post(
"https://api.gigabit.ltd/api/partner/v1/orders",
headers={"Authorization": f"Bearer {os.environ['GIGABIT_API_TOKEN']}"},
json={'port_number': 10001},
timeout=30,
)
result = response.json()
if not response.ok:
raise RuntimeError(result.get("error", f"HTTP {response.status_code}"))
print(result)Example response
{
"success": true,
"data": {
"id": "op_0123456789abcdef0123456789abcdef",
"state": "queued",
"error": null,
"result": null,
"created_at": "2026-11-10T12:00:00+00:00",
"status_url": "/api/partner/v1/operations/op_0123456789abcdef0123456789abcdef"
}
}Result after completion
{
"success": true,
"data": {
"id": "op_0123456789abcdef0123456789abcdef",
"state": "ready",
"error": null,
"result": {
"id": "partner_0123456789abcdef0123456789abcdef",
"state": "ready",
"error": null,
"order_ids": [
"a1b2c3d4e5f60123456789abcdef0123"
],
"amount_cents": 4050,
"currency": "EUR",
"price": {
"currency": "EUR",
"base_net_cents": 4500,
"net_cents": 4050,
"vat_cents": 0,
"total_cents": 4050,
"tax_at_topup": true,
"discount_percent": 10,
"months": 1,
"days": 30,
"pricing_version": 1,
"tax": {
"mode": "vat",
"rate_percent": 23,
"vat_code": "23",
"reverse_charge": false
}
}
},
"created_at": "2026-11-10T12:00:00+00:00",
"status_url": "/api/partner/v1/operations/op_0123456789abcdef0123456789abcdef"
}
}Example request
curl --request POST \
--url 'https://api.gigabit.ltd/api/partner/v1/orders' \
--header "Authorization: Bearer $GIGABIT_API_TOKEN" \
--header 'Content-Type: application/json' \
--data '{
"port_id": "b1c2d3e4f5a60123456789abcdef0123"
}'const response = await fetch(
"https://api.gigabit.ltd/api/partner/v1/orders",
{
method: "POST",
headers: {
Authorization: `Bearer ${process.env.GIGABIT_API_TOKEN}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"port_id": "b1c2d3e4f5a60123456789abcdef0123"
})
}
);
const result = await response.json();
if (!response.ok) throw new Error(result.error);
console.log(result);# python -m pip install requests
import os
import requests
response = requests.post(
"https://api.gigabit.ltd/api/partner/v1/orders",
headers={"Authorization": f"Bearer {os.environ['GIGABIT_API_TOKEN']}"},
json={'port_id': 'b1c2d3e4f5a60123456789abcdef0123'},
timeout=30,
)
result = response.json()
if not response.ok:
raise RuntimeError(result.get("error", f"HTTP {response.status_code}"))
print(result)Example response
{
"success": true,
"data": {
"id": "op_0123456789abcdef0123456789abcdef",
"state": "queued",
"error": null,
"result": null,
"created_at": "2026-11-10T12:00:00+00:00",
"status_url": "/api/partner/v1/operations/op_0123456789abcdef0123456789abcdef"
}
}Result after completion
{
"success": true,
"data": {
"id": "op_0123456789abcdef0123456789abcdef",
"state": "ready",
"error": null,
"result": {
"id": "partner_0123456789abcdef0123456789abcdef",
"state": "ready",
"error": null,
"order_ids": [
"a1b2c3d4e5f60123456789abcdef0123"
],
"amount_cents": 4050,
"currency": "EUR",
"price": {
"currency": "EUR",
"base_net_cents": 4500,
"net_cents": 4050,
"vat_cents": 0,
"total_cents": 4050,
"tax_at_topup": true,
"discount_percent": 10,
"months": 1,
"days": 30,
"pricing_version": 1,
"tax": {
"mode": "vat",
"rate_percent": 23,
"vat_code": "23",
"reverse_charge": false
}
}
},
"created_at": "2026-11-10T12:00:00+00:00",
"status_url": "/api/partner/v1/operations/op_0123456789abcdef0123456789abcdef"
}
}Port list
Current account ports: rental expiry, connection details, IP and automatic IP rotation.
To 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.
No request body.
Example request
curl --request GET \
--url 'https://api.gigabit.ltd/api/partner/v1/orders' \
--header "Authorization: Bearer $GIGABIT_API_TOKEN"const response = await fetch(
"https://api.gigabit.ltd/api/partner/v1/orders",
{
method: "GET",
headers: {
Authorization: `Bearer ${process.env.GIGABIT_API_TOKEN}`
}
}
);
const result = await response.json();
if (!response.ok) throw new Error(result.error);
console.log(result);# python -m pip install requests
import os
import requests
response = requests.get(
"https://api.gigabit.ltd/api/partner/v1/orders",
headers={"Authorization": f"Bearer {os.environ['GIGABIT_API_TOKEN']}"},
timeout=30,
)
result = response.json()
if not response.ok:
raise RuntimeError(result.get("error", f"HTTP {response.status_code}"))
print(result)Example response
{
"success": true,
"data": {
"items": [
{
"id": "a1b2c3d4e5f60123456789abcdef0123",
"port_id": "b1c2d3e4f5a60123456789abcdef0123",
"number": 10001,
"host": "l1.gigabit.ltd",
"username": "astra_a1b2c3d4e5f",
"proxy_password": "EXAMPLE_ONLY_22_CHARS_x",
"status": "active",
"expires": "2026-12-09T22:59:59+00:00",
"operator": "Orange",
"cityName": "Warsaw",
"ip": "198.51.100.42",
"rotation_url": "https://api.gigabit.ltd/change_ip?token=EXAMPLE_ROTATION_TOKEN_REPLACE_ME",
"rotation": true,
"rotation_seconds": 120,
"connection_options": {
"custom": {
"host": "proxy.example.com",
"rotation_url": "https://api.example.com/change_ip?token=EXAMPLE_ROTATION_TOKEN_REPLACE_ME"
}
}
}
]
}
}Port details
Details of an order belonging to the account. Unavailable or missing orders return 404.
To 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.
Parameters
| Field | Type | Description |
|---|---|---|
idPath · Required | string | Order ID (id) or port ID (port_id) from the port list. |
Example request
curl --request GET \
--url 'https://api.gigabit.ltd/api/partner/v1/orders/a1b2c3d4e5f60123456789abcdef0123' \
--header "Authorization: Bearer $GIGABIT_API_TOKEN"const response = await fetch(
"https://api.gigabit.ltd/api/partner/v1/orders/a1b2c3d4e5f60123456789abcdef0123",
{
method: "GET",
headers: {
Authorization: `Bearer ${process.env.GIGABIT_API_TOKEN}`
}
}
);
const result = await response.json();
if (!response.ok) throw new Error(result.error);
console.log(result);# python -m pip install requests
import os
import requests
response = requests.get(
"https://api.gigabit.ltd/api/partner/v1/orders/a1b2c3d4e5f60123456789abcdef0123",
headers={"Authorization": f"Bearer {os.environ['GIGABIT_API_TOKEN']}"},
timeout=30,
)
result = response.json()
if not response.ok:
raise RuntimeError(result.get("error", f"HTTP {response.status_code}"))
print(result)Example response
{
"success": true,
"data": {
"id": "a1b2c3d4e5f60123456789abcdef0123",
"port_id": "b1c2d3e4f5a60123456789abcdef0123",
"number": 10001,
"host": "l1.gigabit.ltd",
"username": "astra_a1b2c3d4e5f",
"proxy_password": "EXAMPLE_ONLY_22_CHARS_x",
"status": "active",
"expires": "2026-12-09T22:59:59+00:00",
"operator": "Orange",
"cityName": "Warsaw",
"ip": "198.51.100.42",
"rotation_url": "https://api.gigabit.ltd/change_ip?token=EXAMPLE_ROTATION_TOKEN_REPLACE_ME",
"rotation": true,
"rotation_seconds": 120,
"connection_options": {
"custom": {
"host": "proxy.example.com",
"rotation_url": "https://api.example.com/change_ip?token=EXAMPLE_ROTATION_TOKEN_REPLACE_ME"
}
}
}
}Port renewal
Extends one port rental by 30 days, paid from the balance. Only the port number or ID in the URL is required.
Long-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.
Parameters
| Field | Type | Description |
|---|---|---|
idPath · Required | string | Port number or port ID. The order id from GET /orders is also accepted. |
Example request
curl --request POST \
--url 'https://api.gigabit.ltd/api/partner/v1/orders/10001/renew' \
--header "Authorization: Bearer $GIGABIT_API_TOKEN" \
--header 'Content-Type: application/json' \
--data '{}'const response = await fetch(
"https://api.gigabit.ltd/api/partner/v1/orders/10001/renew",
{
method: "POST",
headers: {
Authorization: `Bearer ${process.env.GIGABIT_API_TOKEN}`,
"Content-Type": "application/json"
},
body: JSON.stringify({})
}
);
const result = await response.json();
if (!response.ok) throw new Error(result.error);
console.log(result);# python -m pip install requests
import os
import requests
response = requests.post(
"https://api.gigabit.ltd/api/partner/v1/orders/10001/renew",
headers={"Authorization": f"Bearer {os.environ['GIGABIT_API_TOKEN']}"},
json={},
timeout=30,
)
result = response.json()
if not response.ok:
raise RuntimeError(result.get("error", f"HTTP {response.status_code}"))
print(result)Example response
{
"success": true,
"data": {
"id": "op_0123456789abcdef0123456789abcdef",
"state": "queued",
"error": null,
"result": null,
"created_at": "2026-11-10T12:00:00+00:00",
"status_url": "/api/partner/v1/operations/op_0123456789abcdef0123456789abcdef"
}
}Result after completion
{
"success": true,
"data": {
"id": "op_0123456789abcdef0123456789abcdef",
"state": "ready",
"error": null,
"result": {
"id": "partner_0123456789abcdef0123456789abcdef",
"state": "ready",
"error": null,
"order_ids": [
"a1b2c3d4e5f60123456789abcdef0123"
],
"amount_cents": 4050,
"currency": "EUR",
"price": {
"currency": "EUR",
"base_net_cents": 4500,
"net_cents": 4050,
"vat_cents": 0,
"total_cents": 4050,
"tax_at_topup": true,
"discount_percent": 10,
"months": 1,
"days": 30,
"pricing_version": 1,
"tax": {
"mode": "vat",
"rate_percent": 23,
"vat_code": "23",
"reverse_charge": false
}
}
},
"created_at": "2026-11-10T12:00:00+00:00",
"status_url": "/api/partner/v1/operations/op_0123456789abcdef0123456789abcdef"
}
}Example request
curl --request POST \
--url 'https://api.gigabit.ltd/api/partner/v1/orders/b1c2d3e4f5a60123456789abcdef0123/renew' \
--header "Authorization: Bearer $GIGABIT_API_TOKEN" \
--header 'Content-Type: application/json' \
--data '{}'const response = await fetch(
"https://api.gigabit.ltd/api/partner/v1/orders/b1c2d3e4f5a60123456789abcdef0123/renew",
{
method: "POST",
headers: {
Authorization: `Bearer ${process.env.GIGABIT_API_TOKEN}`,
"Content-Type": "application/json"
},
body: JSON.stringify({})
}
);
const result = await response.json();
if (!response.ok) throw new Error(result.error);
console.log(result);# python -m pip install requests
import os
import requests
response = requests.post(
"https://api.gigabit.ltd/api/partner/v1/orders/b1c2d3e4f5a60123456789abcdef0123/renew",
headers={"Authorization": f"Bearer {os.environ['GIGABIT_API_TOKEN']}"},
json={},
timeout=30,
)
result = response.json()
if not response.ok:
raise RuntimeError(result.get("error", f"HTTP {response.status_code}"))
print(result)Example response
{
"success": true,
"data": {
"id": "op_0123456789abcdef0123456789abcdef",
"state": "queued",
"error": null,
"result": null,
"created_at": "2026-11-10T12:00:00+00:00",
"status_url": "/api/partner/v1/operations/op_0123456789abcdef0123456789abcdef"
}
}Result after completion
{
"success": true,
"data": {
"id": "op_0123456789abcdef0123456789abcdef",
"state": "ready",
"error": null,
"result": {
"id": "partner_0123456789abcdef0123456789abcdef",
"state": "ready",
"error": null,
"order_ids": [
"a1b2c3d4e5f60123456789abcdef0123"
],
"amount_cents": 4050,
"currency": "EUR",
"price": {
"currency": "EUR",
"base_net_cents": 4500,
"net_cents": 4050,
"vat_cents": 0,
"total_cents": 4050,
"tax_at_topup": true,
"discount_percent": 10,
"months": 1,
"days": 30,
"pricing_version": 1,
"tax": {
"mode": "vat",
"rate_percent": 23,
"vat_code": "23",
"reverse_charge": false
}
}
},
"created_at": "2026-11-10T12:00:00+00:00",
"status_url": "/api/partner/v1/operations/op_0123456789abcdef0123456789abcdef"
}
}Reset IP rotation token
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.
The response is returned immediately, without a background operation. The new URL is also available in the port’s rotation_url field.
Parameters
| Field | Type | Description |
|---|---|---|
idPath · Required | string | Order ID from the id field in the port list. |
Example request
curl --request POST \
--url 'https://api.gigabit.ltd/api/partner/v1/orders/a1b2c3d4e5f60123456789abcdef0123/rotation-token' \
--header "Authorization: Bearer $GIGABIT_API_TOKEN" \
--header 'Content-Type: application/json' \
--data '{}'const response = await fetch(
"https://api.gigabit.ltd/api/partner/v1/orders/a1b2c3d4e5f60123456789abcdef0123/rotation-token",
{
method: "POST",
headers: {
Authorization: `Bearer ${process.env.GIGABIT_API_TOKEN}`,
"Content-Type": "application/json"
},
body: JSON.stringify({})
}
);
const result = await response.json();
if (!response.ok) throw new Error(result.error);
console.log(result);# python -m pip install requests
import os
import requests
response = requests.post(
"https://api.gigabit.ltd/api/partner/v1/orders/a1b2c3d4e5f60123456789abcdef0123/rotation-token",
headers={"Authorization": f"Bearer {os.environ['GIGABIT_API_TOKEN']}"},
json={},
timeout=30,
)
result = response.json()
if not response.ok:
raise RuntimeError(result.get("error", f"HTTP {response.status_code}"))
print(result)Example response
{
"success": true,
"data": {
"rotation_token": "0123456789abcdef0123456789abcdef",
"rotation_url": "https://api.gigabit.ltd/change_ip?token=0123456789abcdef0123456789abcdef"
}
}Credential change by ID
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.
New credentials are available in result after application. operation_superseded means a newer command changed the credentials.
Parameters
| Field | Type | Description |
|---|---|---|
idPath · Required | string | Order ID (id) or port ID (port_id) from the port list. |
change_loginJSON body · Optional | boolean | true generates a new login with the current prefix and a new password. false changes the password only. Legacy shared credentials become a separate pair even without this flag. |
Example request
curl --request POST \
--url 'https://api.gigabit.ltd/api/partner/v1/orders/a1b2c3d4e5f60123456789abcdef0123/password' \
--header "Authorization: Bearer $GIGABIT_API_TOKEN" \
--header 'Content-Type: application/json' \
--data '{
"change_login": true
}'const response = await fetch(
"https://api.gigabit.ltd/api/partner/v1/orders/a1b2c3d4e5f60123456789abcdef0123/password",
{
method: "POST",
headers: {
Authorization: `Bearer ${process.env.GIGABIT_API_TOKEN}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"change_login": true
})
}
);
const result = await response.json();
if (!response.ok) throw new Error(result.error);
console.log(result);# python -m pip install requests
import os
import requests
response = requests.post(
"https://api.gigabit.ltd/api/partner/v1/orders/a1b2c3d4e5f60123456789abcdef0123/password",
headers={"Authorization": f"Bearer {os.environ['GIGABIT_API_TOKEN']}"},
json={'change_login': True},
timeout=30,
)
result = response.json()
if not response.ok:
raise RuntimeError(result.get("error", f"HTTP {response.status_code}"))
print(result)Example response
{
"success": true,
"data": {
"id": "op_0123456789abcdef0123456789abcdef",
"state": "queued",
"error": null,
"result": null,
"created_at": "2026-11-10T12:00:00+00:00",
"status_url": "/api/partner/v1/operations/op_0123456789abcdef0123456789abcdef"
}
}Result after completion
{
"success": true,
"data": {
"id": "op_0123456789abcdef0123456789abcdef",
"state": "ready",
"error": null,
"result": {
"state": "synced",
"username": "astra_b2c3d4e5f6a",
"password": "EXAMPLE_NEW_PASSWORD_xx"
},
"created_at": "2026-11-10T12:00:00+00:00",
"status_url": "/api/partner/v1/operations/op_0123456789abcdef0123456789abcdef"
}
}Example request
curl --request POST \
--url 'https://api.gigabit.ltd/api/partner/v1/orders/a1b2c3d4e5f60123456789abcdef0123/password' \
--header "Authorization: Bearer $GIGABIT_API_TOKEN" \
--header 'Content-Type: application/json' \
--data '{
"change_login": false
}'const response = await fetch(
"https://api.gigabit.ltd/api/partner/v1/orders/a1b2c3d4e5f60123456789abcdef0123/password",
{
method: "POST",
headers: {
Authorization: `Bearer ${process.env.GIGABIT_API_TOKEN}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"change_login": false
})
}
);
const result = await response.json();
if (!response.ok) throw new Error(result.error);
console.log(result);# python -m pip install requests
import os
import requests
response = requests.post(
"https://api.gigabit.ltd/api/partner/v1/orders/a1b2c3d4e5f60123456789abcdef0123/password",
headers={"Authorization": f"Bearer {os.environ['GIGABIT_API_TOKEN']}"},
json={'change_login': False},
timeout=30,
)
result = response.json()
if not response.ok:
raise RuntimeError(result.get("error", f"HTTP {response.status_code}"))
print(result)Example response
{
"success": true,
"data": {
"id": "op_0123456789abcdef0123456789abcdef",
"state": "queued",
"error": null,
"result": null,
"created_at": "2026-11-10T12:00:00+00:00",
"status_url": "/api/partner/v1/operations/op_0123456789abcdef0123456789abcdef"
}
}Result after completion
{
"success": true,
"data": {
"id": "op_0123456789abcdef0123456789abcdef",
"state": "ready",
"error": null,
"result": {
"state": "synced",
"username": "astra_a1b2c3d4e5f",
"password": "EXAMPLE_NEW_PASSWORD_xx"
},
"created_at": "2026-11-10T12:00:00+00:00",
"status_url": "/api/partner/v1/operations/op_0123456789abcdef0123456789abcdef"
}
}IP rotation timer
Current timer state. When rotation=true, rotation_seconds is included. When disabled, only rotation=false is returned.
Parameters
| Field | Type | Description |
|---|---|---|
idPath · Required | string | Order ID (id) or port ID (port_id) from the port list. |
Example request
curl --request GET \
--url 'https://api.gigabit.ltd/api/partner/v1/orders/a1b2c3d4e5f60123456789abcdef0123/rotation' \
--header "Authorization: Bearer $GIGABIT_API_TOKEN"const response = await fetch(
"https://api.gigabit.ltd/api/partner/v1/orders/a1b2c3d4e5f60123456789abcdef0123/rotation",
{
method: "GET",
headers: {
Authorization: `Bearer ${process.env.GIGABIT_API_TOKEN}`
}
}
);
const result = await response.json();
if (!response.ok) throw new Error(result.error);
console.log(result);# python -m pip install requests
import os
import requests
response = requests.get(
"https://api.gigabit.ltd/api/partner/v1/orders/a1b2c3d4e5f60123456789abcdef0123/rotation",
headers={"Authorization": f"Bearer {os.environ['GIGABIT_API_TOKEN']}"},
timeout=30,
)
result = response.json()
if not response.ok:
raise RuntimeError(result.get("error", f"HTTP {response.status_code}"))
print(result)Example response
{
"success": true,
"data": {
"rotation": true,
"rotation_seconds": 120
}
}Example request
curl --request GET \
--url 'https://api.gigabit.ltd/api/partner/v1/orders/a1b2c3d4e5f60123456789abcdef0123/rotation' \
--header "Authorization: Bearer $GIGABIT_API_TOKEN"const response = await fetch(
"https://api.gigabit.ltd/api/partner/v1/orders/a1b2c3d4e5f60123456789abcdef0123/rotation",
{
method: "GET",
headers: {
Authorization: `Bearer ${process.env.GIGABIT_API_TOKEN}`
}
}
);
const result = await response.json();
if (!response.ok) throw new Error(result.error);
console.log(result);# python -m pip install requests
import os
import requests
response = requests.get(
"https://api.gigabit.ltd/api/partner/v1/orders/a1b2c3d4e5f60123456789abcdef0123/rotation",
headers={"Authorization": f"Bearer {os.environ['GIGABIT_API_TOKEN']}"},
timeout=30,
)
result = response.json()
if not response.ok:
raise RuntimeError(result.get("error", f"HTTP {response.status_code}"))
print(result)Example response
{
"success": true,
"data": {
"rotation": false
}
}Timer settings
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.
The operation remains processing until the timer setting is confirmed.
Parameters
| Field | Type | Description |
|---|---|---|
idPath · Required | string | Order ID (id) or port ID (port_id) from the port list. |
rotationJSON body · Required | boolean | true enables the timer; false disables it. |
rotation_secondsJSON body · Optional | integer20-86400 | Required when rotation=true. Omit this field when rotation=false. |
Example request
curl --request PUT \
--url 'https://api.gigabit.ltd/api/partner/v1/orders/a1b2c3d4e5f60123456789abcdef0123/rotation' \
--header "Authorization: Bearer $GIGABIT_API_TOKEN" \
--header 'Content-Type: application/json' \
--data '{
"rotation": true,
"rotation_seconds": 120
}'const response = await fetch(
"https://api.gigabit.ltd/api/partner/v1/orders/a1b2c3d4e5f60123456789abcdef0123/rotation",
{
method: "PUT",
headers: {
Authorization: `Bearer ${process.env.GIGABIT_API_TOKEN}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"rotation": true,
"rotation_seconds": 120
})
}
);
const result = await response.json();
if (!response.ok) throw new Error(result.error);
console.log(result);# python -m pip install requests
import os
import requests
response = requests.put(
"https://api.gigabit.ltd/api/partner/v1/orders/a1b2c3d4e5f60123456789abcdef0123/rotation",
headers={"Authorization": f"Bearer {os.environ['GIGABIT_API_TOKEN']}"},
json={'rotation': True, 'rotation_seconds': 120},
timeout=30,
)
result = response.json()
if not response.ok:
raise RuntimeError(result.get("error", f"HTTP {response.status_code}"))
print(result)Example response
{
"success": true,
"data": {
"id": "op_0123456789abcdef0123456789abcdef",
"state": "queued",
"error": null,
"result": null,
"created_at": "2026-11-10T12:00:00+00:00",
"status_url": "/api/partner/v1/operations/op_0123456789abcdef0123456789abcdef"
}
}Result after completion
{
"success": true,
"data": {
"id": "op_0123456789abcdef0123456789abcdef",
"state": "ready",
"error": null,
"result": {
"rotation": true,
"rotation_seconds": 120
},
"created_at": "2026-11-10T12:00:00+00:00",
"status_url": "/api/partner/v1/operations/op_0123456789abcdef0123456789abcdef"
}
}Example request
curl --request PUT \
--url 'https://api.gigabit.ltd/api/partner/v1/orders/a1b2c3d4e5f60123456789abcdef0123/rotation' \
--header "Authorization: Bearer $GIGABIT_API_TOKEN" \
--header 'Content-Type: application/json' \
--data '{
"rotation": false
}'const response = await fetch(
"https://api.gigabit.ltd/api/partner/v1/orders/a1b2c3d4e5f60123456789abcdef0123/rotation",
{
method: "PUT",
headers: {
Authorization: `Bearer ${process.env.GIGABIT_API_TOKEN}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"rotation": false
})
}
);
const result = await response.json();
if (!response.ok) throw new Error(result.error);
console.log(result);# python -m pip install requests
import os
import requests
response = requests.put(
"https://api.gigabit.ltd/api/partner/v1/orders/a1b2c3d4e5f60123456789abcdef0123/rotation",
headers={"Authorization": f"Bearer {os.environ['GIGABIT_API_TOKEN']}"},
json={'rotation': False},
timeout=30,
)
result = response.json()
if not response.ok:
raise RuntimeError(result.get("error", f"HTTP {response.status_code}"))
print(result)Example response
{
"success": true,
"data": {
"id": "op_0123456789abcdef0123456789abcdef",
"state": "queued",
"error": null,
"result": null,
"created_at": "2026-11-10T12:00:00+00:00",
"status_url": "/api/partner/v1/operations/op_0123456789abcdef0123456789abcdef"
}
}Result after completion
{
"success": true,
"data": {
"id": "op_0123456789abcdef0123456789abcdef",
"state": "ready",
"error": null,
"result": {
"rotation": false
},
"created_at": "2026-11-10T12:00:00+00:00",
"status_url": "/api/partner/v1/operations/op_0123456789abcdef0123456789abcdef"
}
}Login prefix
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.
Changing 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.
Parameters
| Field | Type | Description |
|---|---|---|
prefixJSON body · Required | string2-24 | 2-24 characters: Latin letters, digits and hyphens, starting with a letter. Normalized to lowercase. proxy and gigabit are reserved. |
Example request
curl --request PUT \
--url 'https://api.gigabit.ltd/api/partner/v1/profile' \
--header "Authorization: Bearer $GIGABIT_API_TOKEN" \
--header 'Content-Type: application/json' \
--data '{
"prefix": "astra"
}'const response = await fetch(
"https://api.gigabit.ltd/api/partner/v1/profile",
{
method: "PUT",
headers: {
Authorization: `Bearer ${process.env.GIGABIT_API_TOKEN}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"prefix": "astra"
})
}
);
const result = await response.json();
if (!response.ok) throw new Error(result.error);
console.log(result);# python -m pip install requests
import os
import requests
response = requests.put(
"https://api.gigabit.ltd/api/partner/v1/profile",
headers={"Authorization": f"Bearer {os.environ['GIGABIT_API_TOKEN']}"},
json={'prefix': 'astra'},
timeout=30,
)
result = response.json()
if not response.ok:
raise RuntimeError(result.get("error", f"HTTP {response.status_code}"))
print(result)Example response
{
"success": true,
"data": {
"prefix": "astra"
}
}Money & states
Fields of the data object. New fields may be added without changing the API version.
| Field | Type | Description |
|---|---|---|
balance_cents | integer | Current net balance; may be negative. |
credit_limit_cents | integer | Agreed maximum overdraft amount. |
reserved_cents | integer | Funds reserved for unfinished operations, still included in the balance. |
available_cents | integer | Available for orders: balance + credit − reservations, minimum 0. |
withdrawable_cents | integer | Account funds available for refund after reservations. |
debt_cents / paid_in_cents | integer | Debt and total confirmed deposits respectively. |
currency / monthly_net_cents / discount_percent | string / integer | EUR; base 30-day price before discount; partner discount percentage. |
prices[] / topup_tax | array / object | 30-day price and top-up tax profile. Incomplete billing yields empty prices and pricing_error=billing_required. |
can_order_new_ports | boolean | Whether available funds cover one 30-day port. Does not guarantee availability. |
payment_method | string | Top-up method: card (Stripe). |
prefix / api_token_hint / connection_domains | string / object | New login prefix, token suffix (not the token) and configured host/api domains. An empty string means the domain is unconfigured. |
Port price
Fields of the data object. New fields may be added without changing the API version.
| Field | Type | Description |
|---|---|---|
currency / base_net_cents | string / integer | EUR and the period’s base net price before discount. |
net_cents / total_cents | integer | Net cost per port for the period after discount; the balance debit. |
vat_cents / tax_at_topup | integer / boolean | Purchases have vat_cents=0 and tax_at_topup=true: VAT is handled at top-up. |
months / days / discount_percent / pricing_version | integer | Period of 1 month (30 days), individual discount and price version. |
tax | object | mode, rate_percent, vat_code, reverse_charge. Top-up tax profile, not an additional port charge. |
Purchase / renewal operation
Fields of the data object. New fields may be added without changing the API version.
| Field | Type | Description |
|---|---|---|
id / state / error | string / null | Operation ID, state and error code (null when none). |
order_ids[] | string[] | Created or renewed order IDs for GET /orders/{id}. |
amount_cents / currency / price | integer / string / object | Net debit amount, EUR currency and the port price saved for the operation. |
Port and credentials
Fields of the data object. New fields may be added without changing the API version.
| Field | Type | Description |
|---|---|---|
id / port_id / number | string / integer | Order ID, catalogue port ID and port number. |
host / username / proxy_password | string | Proxy connection host, username and password. |
status / expires | string | active or due; rental expiry in ISO 8601. |
operator / cityName / ip | string | Operator, city and current exit IP. ip may be empty when unavailable. |
rotation_url | string | To 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. |
rotation / rotation_seconds | boolean / integer | Whether the timer is enabled; the interval in seconds is included only when rotation=true. |
connection_options | object | Additional connection addresses when configured: ip and custom, each containing host and rotation_url. |
IP rotation timer
Fields of the data object. New fields may be added without changing the API version.
| Field | Type | Description |
|---|---|---|
rotation | boolean | true means the timer is enabled; false means disabled. |
rotation_seconds | integer | Interval in seconds, from 20 to 86400. Included only when rotation=true. |
Balance top-up
Fields of the data object. New fields may be added without changing the API version.
| Field | Type | Description |
|---|---|---|
id / state / url | string / null | Stripe: ID, state, Checkout link. url can be null while the payment is being created. |
amount_cents / vat_cents / total_cents / currency | integer / string | Stripe: balance credit, VAT, total payable and EUR. |
Transaction
Fields of the data object. New fields may be added without changing the API version.
| Field | Type | Description |
|---|---|---|
items[] / total / offset / limit | array / integer | Entries, total after the reservation filter, offset and page size. |
id / created_at / sequence / currency | string / integer | Entry ID, date, sequence number and EUR. |
operation / source | string | Operation: topup, purchase, renewal, correction, compensation, credit_limit, withdrawal_reserve, withdrawal_paid, withdrawal_rejected; technical purchase_reserve/purchase_release on request. Sources: stripe, admin, api, customer, system. |
amount_cents / reserved_delta_cents | integer | Changes to balance and reservations. Debits are negative. A reservation can have amount_cents=0; it is not a deposit. |
balance_after_cents / reserved_after_cents | integer | Balance and reservations after this entry. |
comment / reference | string / null | Plain-text comment and related payment or operation. The comment may be empty. |
Background operation
Fields of the data object. New fields may be added without changing the API version.
| Field | Type | Description |
|---|---|---|
id / status_url | string | Server-generated operation ID and status URL. |
state | string | queued, processing, ready or failed. |
result | object / null | Operation result: credentials, order details or a payment link depending on the method. |
error / created_at | string / null | Failure code when applicable and operation creation time. |