curl --request PATCH \
--url https://api.portalhq.io/api/v3/resellers/custodians/{custodianId}/capabilities \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"capability": "SIGN",
"disabled": true
}
'import requests
url = "https://api.portalhq.io/api/v3/resellers/custodians/{custodianId}/capabilities"
payload = {
"capability": "SIGN",
"disabled": True
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({capability: 'SIGN', disabled: true})
};
fetch('https://api.portalhq.io/api/v3/resellers/custodians/{custodianId}/capabilities', 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.portalhq.io/api/v3/resellers/custodians/{custodianId}/capabilities",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'capability' => 'SIGN',
'disabled' => true
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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.portalhq.io/api/v3/resellers/custodians/{custodianId}/capabilities"
payload := strings.NewReader("{\n \"capability\": \"SIGN\",\n \"disabled\": true\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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.patch("https://api.portalhq.io/api/v3/resellers/custodians/{custodianId}/capabilities")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"capability\": \"SIGN\",\n \"disabled\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.portalhq.io/api/v3/resellers/custodians/{custodianId}/capabilities")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"capability\": \"SIGN\",\n \"disabled\": true\n}"
response = http.request(request)
puts response.read_body{
"id": "custodian_123",
"name": "Acme Payments",
"slug": "acme-payments",
"billingStatus": "ACTIVE",
"disabledCapabilities": [
"SIGN"
],
"isReseller": false,
"resellerParentId": "reseller_custodian_123",
"sessionTokensEnabled": true,
"createdAt": "2026-07-08T18:00:00.000Z",
"updatedAt": "2026-09-01T18:15:00.000Z"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}Disable or enable signing for a sub-custodian
Disables or re-enables a single capability for every client of a sub-custodian owned by the authenticated reseller, across all of its environments.
Disabling the SIGN capability blocks every signing request from the
sub-custodian’s clients, even when the request carries a valid client API key
or client session token. Unlike suspending the sub-custodian, this leaves its
dashboard, Portal API keys and client authentication working, so clients can
still back up, recover and eject their wallets. Use it when a sub-custodian
should stop transacting but keep access to its wallets, for example while a
payment is outstanding.
Re-enable signing by sending the same request with disabled: false. The
custodian-level setting is independent of per-client capabilities set by the
sub-custodian itself: clearing it does not re-enable a client the
sub-custodian froze individually. Only the reseller can change this setting.
The current state is returned in disabledCapabilities on every
sub-custodian object, including the List sub-custodians response.
curl --request PATCH \
--url https://api.portalhq.io/api/v3/resellers/custodians/{custodianId}/capabilities \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"capability": "SIGN",
"disabled": true
}
'import requests
url = "https://api.portalhq.io/api/v3/resellers/custodians/{custodianId}/capabilities"
payload = {
"capability": "SIGN",
"disabled": True
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({capability: 'SIGN', disabled: true})
};
fetch('https://api.portalhq.io/api/v3/resellers/custodians/{custodianId}/capabilities', 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.portalhq.io/api/v3/resellers/custodians/{custodianId}/capabilities",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'capability' => 'SIGN',
'disabled' => true
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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.portalhq.io/api/v3/resellers/custodians/{custodianId}/capabilities"
payload := strings.NewReader("{\n \"capability\": \"SIGN\",\n \"disabled\": true\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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.patch("https://api.portalhq.io/api/v3/resellers/custodians/{custodianId}/capabilities")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"capability\": \"SIGN\",\n \"disabled\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.portalhq.io/api/v3/resellers/custodians/{custodianId}/capabilities")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"capability\": \"SIGN\",\n \"disabled\": true\n}"
response = http.request(request)
puts response.read_body{
"id": "custodian_123",
"name": "Acme Payments",
"slug": "acme-payments",
"billingStatus": "ACTIVE",
"disabledCapabilities": [
"SIGN"
],
"isReseller": false,
"resellerParentId": "reseller_custodian_123",
"sessionTokensEnabled": true,
"createdAt": "2026-07-08T18:00:00.000Z",
"updatedAt": "2026-09-01T18:15:00.000Z"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}Authorizations
Reseller API key created in the Portal dashboard.
Path Parameters
The ID of a sub-custodian owned by the authenticated reseller.
Body
Response
Capability updated successfully
ACTIVE, HACKATHON, INACTIVE, INTERNAL, SUSPENDED, TRIAL Capabilities the reseller has disabled for every client of this sub-custodian. Set with Disable or enable signing for a sub-custodian.
A client capability that can be disabled. SIGN covers every signing request.
SIGN Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Was this page helpful?