Extend proxy
curl --request POST \
--url https://api.proxyjam.com/public/v1/orders/{order_id}/extend \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"months": 123,
"tarification_index": 123
}
'import requests
url = "https://api.proxyjam.com/public/v1/orders/{order_id}/extend"
payload = {
"months": 123,
"tarification_index": 123
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({months: 123, tarification_index: 123})
};
fetch('https://api.proxyjam.com/public/v1/orders/{order_id}/extend', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.proxyjam.com/public/v1/orders/{order_id}/extend",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'months' => 123,
'tarification_index' => 123
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.proxyjam.com/public/v1/orders/{order_id}/extend"
payload := strings.NewReader("{\n \"months\": 123,\n \"tarification_index\": 123\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.proxyjam.com/public/v1/orders/{order_id}/extend")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"months\": 123,\n \"tarification_index\": 123\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.proxyjam.com/public/v1/orders/{order_id}/extend")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"months\": 123,\n \"tarification_index\": 123\n}"
response = http.request(request)
puts response.read_body{
"previous_expires_at": {}
}Proxy management
Extend proxy
Extend the rental period of a static proxy by months, or re-bill a mobile rotating proxy for another tarification cycle.
POST
/
orders
/
{order_id}
/
extend
Extend proxy
curl --request POST \
--url https://api.proxyjam.com/public/v1/orders/{order_id}/extend \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"months": 123,
"tarification_index": 123
}
'import requests
url = "https://api.proxyjam.com/public/v1/orders/{order_id}/extend"
payload = {
"months": 123,
"tarification_index": 123
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({months: 123, tarification_index: 123})
};
fetch('https://api.proxyjam.com/public/v1/orders/{order_id}/extend', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.proxyjam.com/public/v1/orders/{order_id}/extend",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'months' => 123,
'tarification_index' => 123
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.proxyjam.com/public/v1/orders/{order_id}/extend"
payload := strings.NewReader("{\n \"months\": 123,\n \"tarification_index\": 123\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.proxyjam.com/public/v1/orders/{order_id}/extend")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"months\": 123,\n \"tarification_index\": 123\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.proxyjam.com/public/v1/orders/{order_id}/extend")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"months\": 123,\n \"tarification_index\": 123\n}"
response = http.request(request)
puts response.read_body{
"previous_expires_at": {}
}Charges your wallet and extends the proxy subscription at the provider level. The endpoint routes by the order’s proxy type: static proxies (residential, datacenter, ISP) are extended by whole months; mobile rotating proxies are re-billed for one cycle of the chosen tarification.
This action is billed immediately from your wallet balance. Ensure you have sufficient funds before calling this endpoint.
Mobile rotating proxies: extending re-applies the selected tarification at the provider, which resets any remaining time and traffic on the current cycle. It does not append. If the current cycle still has substantial time or traffic left, you may forfeit it. Extend close to expiry.
Path parameters
string
required
UUID of the order.
Headers
string
Replay-safe key. Required for mobile rotating extends. Optional for static-proxy extends. The same key returns the cached response without re-billing; a different body with the same key returns
409 ConflictError.Request body
integer
Number of months to extend. Min
1, max 24. Required for static proxies (residential, datacenter, ISP).integer
Zero-based index into the offer’s
pricing_options. Required for mobile rotating proxies.Provide exactly one of
months or tarification_index. Sending both, or neither, returns 422 ValidationError. Sending the wrong field for the order’s proxy type returns 400 — the message identifies which field the proxy type expects.Response
For static proxies the response is the updated proxy object with the newexpires_at — same shape as the managed_proxy object in Get order. For mobile rotating proxies the response matches the mobile shape in Get order (the type: "mobile" variant) — see the example below for the full superset.
Both shapes include an extend-specific field:
string | null
The
expires_at value before this extend call. Only populated on extend responses; null everywhere else. Lets clients render a before/after diff.Example — static proxy
curl -X POST "https://api.proxyjam.com/public/v1/orders/997b4450-e7ae-4ad9-8a25-996e582049c9/extend" \
-H "X-API-Key: pj_AbCdEf..." \
-H "Content-Type: application/json" \
-d '{"months": 1}'
from proxyjam import ProxyJamClient
with ProxyJamClient(api_key="pj_live_...") as proxyjam:
proxy = proxyjam.orders.extend(
"997b4450-e7ae-4ad9-8a25-996e582049c9",
months=1,
)
print("new expiry:", proxy.expires_at)
{
"order_id": "997b4450-e7ae-4ad9-8a25-996e582049c9",
"provider_proxy_id": "1836367",
"status": "active",
"expires_at": "2026-04-21T14:22:39Z",
"auto_renew": true,
"whitelisted_ips": [],
"bandwidth_total_gb": 1.0,
"bandwidth_used_gb": null,
"previous_expires_at": "2026-03-21T14:22:39Z"
}
Example — mobile rotating proxy
curl -X POST "https://api.proxyjam.com/public/v1/orders/f603a37e-ea14-41e8-9131-a0bb56223b6d/extend" \
-H "X-API-Key: pj_AbCdEf..." \
-H "Idempotency-Key: <unique-uuid>" \
-H "Content-Type: application/json" \
-d '{"tarification_index": 0}'
import uuid
from proxyjam import ProxyJamClient
with ProxyJamClient(api_key="pj_live_...") as proxyjam:
proxy = proxyjam.orders.extend(
"f603a37e-ea14-41e8-9131-a0bb56223b6d",
tarification_index=0,
idempotency_key=str(uuid.uuid4()),
)
print("new expiry:", proxy.expires_at)
print("previous: ", proxy.previous_expires_at)
{
"type": "mobile",
"id": "f603a37e-ea14-41e8-9131-a0bb56223b6d",
"status": "active",
"auto_renew": false,
"expires_at": "2026-06-07T12:34:05.761517Z",
"host": "gw.proxyjam.com",
"port": 29156,
"username": "pj_f603a37eea14",
"password": "<proxy-password>",
"current_ip": "24.114.39.153",
"signature": "No change",
"tags": [],
"whitelisted_ips": [],
"order_status": "provisioned",
"proxy_type": "mobile",
"ip_version": "IPv4",
"protocol": "HTTP",
"country": "CA",
"city": null,
"isp": "Rogers",
"period_days": 1,
"bandwidth_gb": null,
"quantity": 1,
"total_usd": 1.5,
"total_amount": "1.50",
"currency": "USD",
"promo_code_id": null,
"discount_usd": null,
"created_at": "2026-06-07T06:33:01.184801Z",
"updated_at": "2026-06-07T11:34:47.671495Z",
"payment_intent_id": null,
"previous_expires_at": "2026-06-07T11:34:05.761517Z"
}
Operators can enable the
orders.mobile.extend.too_early_guard feature flag to block mobile extends when more than 30 % of the current cycle is still remaining. The flag is off by default; when on, the API returns a 400 with a message asking the caller to extend closer to expiry.