curl --request POST \
--url https://api.example.com/v1/panel/customers/{customerID}/subscriptions/{subscriptionID}/pause \
--header 'X-CSRF-Token: <x-csrf-token>' \
--header 'X-Operator-Reason: <x-operator-reason>'import requests
url = "https://api.example.com/v1/panel/customers/{customerID}/subscriptions/{subscriptionID}/pause"
headers = {
"X-CSRF-Token": "<x-csrf-token>",
"X-Operator-Reason": "<x-operator-reason>"
}
response = requests.post(url, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-CSRF-Token': '<x-csrf-token>', 'X-Operator-Reason': '<x-operator-reason>'}
};
fetch('https://api.example.com/v1/panel/customers/{customerID}/subscriptions/{subscriptionID}/pause', 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.example.com/v1/panel/customers/{customerID}/subscriptions/{subscriptionID}/pause",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"X-CSRF-Token: <x-csrf-token>",
"X-Operator-Reason: <x-operator-reason>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.example.com/v1/panel/customers/{customerID}/subscriptions/{subscriptionID}/pause"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("X-CSRF-Token", "<x-csrf-token>")
req.Header.Add("X-Operator-Reason", "<x-operator-reason>")
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.example.com/v1/panel/customers/{customerID}/subscriptions/{subscriptionID}/pause")
.header("X-CSRF-Token", "<x-csrf-token>")
.header("X-Operator-Reason", "<x-operator-reason>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/v1/panel/customers/{customerID}/subscriptions/{subscriptionID}/pause")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-CSRF-Token"] = '<x-csrf-token>'
request["X-Operator-Reason"] = '<x-operator-reason>'
response = http.request(request)
puts response.read_body{
"operationId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"operation": "<string>",
"status": "<string>"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"request_id": "<string>"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"request_id": "<string>"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"request_id": "<string>"
}Post v1panelcustomers subscriptions pause
Requires subscriptions.write and an operator reason. Suspends access without spending the subscription’s remaining days: the Remnawave user is disabled and the entitlement’s clock stops, in one transaction.
This is what disable is not. A disabled subscription keeps running out while the customer cannot use it; a paused one does not. The remaining days are measured from the pause instant on both customer surfaces, so the figure a customer reads stops moving.
There is no customer-facing equivalent, deliberately: a pause turns a dated entitlement into an indefinite one, and letting the holder decide when the clock runs would make “thirty days” mean “thirty days of my choosing, forever”.
409 when the subscription is not active or limited — including when it is already paused, which is what makes a double-submitted button harmless.
curl --request POST \
--url https://api.example.com/v1/panel/customers/{customerID}/subscriptions/{subscriptionID}/pause \
--header 'X-CSRF-Token: <x-csrf-token>' \
--header 'X-Operator-Reason: <x-operator-reason>'import requests
url = "https://api.example.com/v1/panel/customers/{customerID}/subscriptions/{subscriptionID}/pause"
headers = {
"X-CSRF-Token": "<x-csrf-token>",
"X-Operator-Reason": "<x-operator-reason>"
}
response = requests.post(url, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-CSRF-Token': '<x-csrf-token>', 'X-Operator-Reason': '<x-operator-reason>'}
};
fetch('https://api.example.com/v1/panel/customers/{customerID}/subscriptions/{subscriptionID}/pause', 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.example.com/v1/panel/customers/{customerID}/subscriptions/{subscriptionID}/pause",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"X-CSRF-Token: <x-csrf-token>",
"X-Operator-Reason: <x-operator-reason>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.example.com/v1/panel/customers/{customerID}/subscriptions/{subscriptionID}/pause"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("X-CSRF-Token", "<x-csrf-token>")
req.Header.Add("X-Operator-Reason", "<x-operator-reason>")
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.example.com/v1/panel/customers/{customerID}/subscriptions/{subscriptionID}/pause")
.header("X-CSRF-Token", "<x-csrf-token>")
.header("X-Operator-Reason", "<x-operator-reason>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/v1/panel/customers/{customerID}/subscriptions/{subscriptionID}/pause")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-CSRF-Token"] = '<x-csrf-token>'
request["X-Operator-Reason"] = '<x-operator-reason>'
response = http.request(request)
puts response.read_body{
"operationId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"operation": "<string>",
"status": "<string>"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"request_id": "<string>"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"request_id": "<string>"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"request_id": "<string>"
}Headers
Echoes the token from the current session. Required on every unsafe method.
Why the change is being made. Carried as a header because almost every operations mutation needs one; the API refuses a change that requires a reason and did not get one.
1 - 400