Update a line
Patch operator-level fields on an existing line. This endpoint is a partial update: only the fields you send are written, everything else stays as it was.
The endpoint is admin only. Reseller keys receive 403 admin_only_endpoint. This is the only endpoint that can flip admin_enabled, set allowed_ips / allowed_ua, or move exp_date freely (including making a line perpetual by sending exp_date: null).
Endpoint
POST https://<your-panel-domain>/panel-api/v1/lines/{id}/update
Authentication
Bearer token in the Authorization header. The token must belong to an admin key. See Panel API authentication.
Required scope
lines:write. The endpoint additionally rejects reseller keys, regardless of scope.
Idempotency
Required. Every write must send an Idempotency-Key header. Retrying the same key with the same body returns the original response; a different body returns 409 idempotency_conflict; a missing header returns 400 missing_idempotency_key.
Path parameters
| Name | Type | Description |
|---|---|---|
id |
int | The line id to update. |
Request body
Every field is optional; only the fields present in the body are written.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
password |
string | no | Set a new password. To generate a random one instead, use reset-password. | |
exp_date |
int or null |
no | UTC epoch. Sending null explicitly makes the line perpetual. Omitting the field leaves the current expiry alone. Not range-validated here (unlike create). |
|
max_connections |
int | no | Clamped to [1, 100]. |
|
is_restreamer |
bool | no | Flip the restreamer flag. | |
enabled |
bool | no | Reseller-visible toggle. | |
admin_enabled |
bool | no | Hard admin override. If false, the line is blocked no matter what enabled says. |
|
allowed_ips |
string[] | no | IPv4 allow-list, up to 50 entries. Invalid entries drop silently. | |
allowed_ua |
string[] | no | User-Agent allow-list, up to 50 entries, each capped at 500 chars. |
{
"max_connections": 4,
"is_restreamer": true,
"allowed_ips": ["203.0.113.7", "198.51.100.42"],
"allowed_ua": ["ExampleTV/1.0"]
}
Response
200 OK with the full line object reflecting the new field values.
{
"id": 172504291,
"username": "u_a1b2c3d4",
"password": "8ebc79cf",
"member_id": 100,
"exp_date": 1788885052,
"max_connections": 4,
"is_trial": false,
"is_restreamer": true,
"enabled": true,
"admin_enabled": true,
"bouquets": [],
"created_at": 1786206652
}
Examples
cURL
curl -X POST https://<your-panel-domain>/panel-api/v1/lines/172504291/update \
-H "Authorization: Bearer <your-api-key>" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: line-172504291-bump-caps-2026-08-08" \
-d '{
"max_connections": 4,
"is_restreamer": true,
"allowed_ips": ["203.0.113.7", "198.51.100.42"],
"allowed_ua": ["ExampleTV/1.0"]
}'
PHP SDK
require __DIR__ . '/api-panel-php-sdk-1.0.0/autoload.php';
use XtreamAI\PanelApi\PanelApiClient;
$client = new PanelApiClient(baseUrl: 'https://<your-panel-domain>', token: '<your-api-key>');
$line = $client->lines->update(
id: 172504291,
maxConnections: 4,
isRestreamer: true,
allowedIps: ['203.0.113.7', '198.51.100.42'],
allowedUa: ['ExampleTV/1.0'],
idempotencyKey: 'line-172504291-bump-caps-2026-08-08',
);
echo $line->maxConnections, PHP_EOL;
Python SDK
from xtream_ai_panel_api import PanelApiClient
client = PanelApiClient(base_url="https://<your-panel-domain>", token="<your-api-key>")
line = client.lines.update(
id=172504291,
max_connections=4,
is_restreamer=True,
allowed_ips=["203.0.113.7", "198.51.100.42"],
allowed_ua=["ExampleTV/1.0"],
idempotency_key="line-172504291-bump-caps-2026-08-08",
)
print(line.max_connections)
exp_dateis three-state: omit the argument to leave the current expiry untouched, pass a UTC epoch to set a new one, or passnull/Noneto make the line perpetual ($client->lines->update(id: 172504291, expDate: null)/client.lines.update(id=172504291, exp_date=None)).
Errors
| HTTP | Error slug | When it happens | How to fix |
|---|---|---|---|
| 400 | missing_idempotency_key |
The Idempotency-Key header was not sent. |
Send a per-intent key on every write. |
| 401 | invalid_key |
Token is unknown, expired, disabled, or deleted. | Check the token or issue a new one. |
| 403 | admin_only_endpoint |
A reseller key called this endpoint. | Call from an admin key. |
| 403 | insufficient_scope |
Token lacks lines:write. |
Issue a key with the scope. |
| 404 | not_found |
The line id does not exist. | Verify the id (GET /lines/{id}). |
| 409 | idempotency_conflict |
Same key was reused with a different body. | Use a fresh key. |
| 409 | idempotency_in_flight |
Same key is still processing. | Retry after a moment. |
| 429 | rate_limited |
The key hit its per-minute cap. | Back off and retry after Retry-After seconds. |