curl --request POST \
--url https://app.goosybear.ai/api/v1/tools/pages.capabilities.configure \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"configuration": {
"kind": "policy",
"policy": {
"scope_kind": "account",
"workspace_id": null,
"project_board_id": null,
"policy_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"operation_keys": [],
"allowed_tiers": [
"<string>"
],
"default_tier": "<string>",
"limits": {
"max_input_bytes": 123,
"max_output_tokens": 123,
"max_search_queries": 1,
"max_search_results": 1,
"max_tool_calls": 1,
"max_concurrent_requests": 123
},
"enabled": true,
"activate": true
}
},
"confirmation_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"workspace": "<string>"
}
'import requests
url = "https://app.goosybear.ai/api/v1/tools/pages.capabilities.configure"
payload = {
"configuration": {
"kind": "policy",
"policy": {
"scope_kind": "account",
"workspace_id": None,
"project_board_id": None,
"policy_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"operation_keys": [],
"allowed_tiers": ["<string>"],
"default_tier": "<string>",
"limits": {
"max_input_bytes": 123,
"max_output_tokens": 123,
"max_search_queries": 1,
"max_search_results": 1,
"max_tool_calls": 1,
"max_concurrent_requests": 123
},
"enabled": True,
"activate": True
}
},
"confirmation_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"workspace": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
configuration: {
kind: 'policy',
policy: {
scope_kind: 'account',
workspace_id: null,
project_board_id: null,
policy_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
operation_keys: [],
allowed_tiers: ['<string>'],
default_tier: '<string>',
limits: {
max_input_bytes: 123,
max_output_tokens: 123,
max_search_queries: 1,
max_search_results: 1,
max_tool_calls: 1,
max_concurrent_requests: 123
},
enabled: true,
activate: true
}
},
confirmation_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
workspace: '<string>'
})
};
fetch('https://app.goosybear.ai/api/v1/tools/pages.capabilities.configure', 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://app.goosybear.ai/api/v1/tools/pages.capabilities.configure",
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([
'configuration' => [
'kind' => 'policy',
'policy' => [
'scope_kind' => 'account',
'workspace_id' => null,
'project_board_id' => null,
'policy_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'operation_keys' => [
],
'allowed_tiers' => [
'<string>'
],
'default_tier' => '<string>',
'limits' => [
'max_input_bytes' => 123,
'max_output_tokens' => 123,
'max_search_queries' => 1,
'max_search_results' => 1,
'max_tool_calls' => 1,
'max_concurrent_requests' => 123
],
'enabled' => true,
'activate' => true
]
],
'confirmation_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'workspace' => '<string>'
]),
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://app.goosybear.ai/api/v1/tools/pages.capabilities.configure"
payload := strings.NewReader("{\n \"configuration\": {\n \"kind\": \"policy\",\n \"policy\": {\n \"scope_kind\": \"account\",\n \"workspace_id\": null,\n \"project_board_id\": null,\n \"policy_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"operation_keys\": [],\n \"allowed_tiers\": [\n \"<string>\"\n ],\n \"default_tier\": \"<string>\",\n \"limits\": {\n \"max_input_bytes\": 123,\n \"max_output_tokens\": 123,\n \"max_search_queries\": 1,\n \"max_search_results\": 1,\n \"max_tool_calls\": 1,\n \"max_concurrent_requests\": 123\n },\n \"enabled\": true,\n \"activate\": true\n }\n },\n \"confirmation_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"workspace\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", 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.post("https://app.goosybear.ai/api/v1/tools/pages.capabilities.configure")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"configuration\": {\n \"kind\": \"policy\",\n \"policy\": {\n \"scope_kind\": \"account\",\n \"workspace_id\": null,\n \"project_board_id\": null,\n \"policy_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"operation_keys\": [],\n \"allowed_tiers\": [\n \"<string>\"\n ],\n \"default_tier\": \"<string>\",\n \"limits\": {\n \"max_input_bytes\": 123,\n \"max_output_tokens\": 123,\n \"max_search_queries\": 1,\n \"max_search_results\": 1,\n \"max_tool_calls\": 1,\n \"max_concurrent_requests\": 123\n },\n \"enabled\": true,\n \"activate\": true\n }\n },\n \"confirmation_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"workspace\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.goosybear.ai/api/v1/tools/pages.capabilities.configure")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"configuration\": {\n \"kind\": \"policy\",\n \"policy\": {\n \"scope_kind\": \"account\",\n \"workspace_id\": null,\n \"project_board_id\": null,\n \"policy_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"operation_keys\": [],\n \"allowed_tiers\": [\n \"<string>\"\n ],\n \"default_tier\": \"<string>\",\n \"limits\": {\n \"max_input_bytes\": 123,\n \"max_output_tokens\": 123,\n \"max_search_queries\": 1,\n \"max_search_results\": 1,\n \"max_tool_calls\": 1,\n \"max_concurrent_requests\": 123\n },\n \"enabled\": true,\n \"activate\": true\n }\n },\n \"confirmation_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"workspace\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"ok": true,
"state": "confirmation_required",
"kind": "policy",
"workspace": "<string>",
"working_in": {
"label": "<string>",
"note": "<string>",
"workspace": "<string>",
"source": "call-override"
},
"confirmation_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"expires_in_seconds": 123,
"disclosure_summary": "<string>",
"policy_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"version_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"version": 123,
"activated": true,
"grant_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"grant_saved": true,
"runtime_credential": "ready",
"enrollment_error_code": "<string>",
"standing_approval_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"enrollment_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"workflow_definition_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"workflow_definition_version_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"service_actor_user_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"service_actor_role": "<string>",
"changed": true,
"standing_approvals_revoked": 1,
"managed_keys_revoked": 1,
"request_replayed": true
}{
"error": {
"code": "<string>",
"message": "<string>",
"retry_after_seconds": 123
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"retry_after_seconds": 123
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"retry_after_seconds": 123
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"retry_after_seconds": 123
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"retry_after_seconds": 123
}
}Call pages.capabilities.configure
Propose or confirm one exact managed policy, grant, standing approval, workflow enrollment, or revocation.
Every result names the workspace it ran in. Say which workspace the answer is about. When the account has more than one workspace and none is selected, this tool refuses with workspace_ambiguous and lists the choices — offer them, never pick one.
curl --request POST \
--url https://app.goosybear.ai/api/v1/tools/pages.capabilities.configure \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"configuration": {
"kind": "policy",
"policy": {
"scope_kind": "account",
"workspace_id": null,
"project_board_id": null,
"policy_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"operation_keys": [],
"allowed_tiers": [
"<string>"
],
"default_tier": "<string>",
"limits": {
"max_input_bytes": 123,
"max_output_tokens": 123,
"max_search_queries": 1,
"max_search_results": 1,
"max_tool_calls": 1,
"max_concurrent_requests": 123
},
"enabled": true,
"activate": true
}
},
"confirmation_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"workspace": "<string>"
}
'import requests
url = "https://app.goosybear.ai/api/v1/tools/pages.capabilities.configure"
payload = {
"configuration": {
"kind": "policy",
"policy": {
"scope_kind": "account",
"workspace_id": None,
"project_board_id": None,
"policy_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"operation_keys": [],
"allowed_tiers": ["<string>"],
"default_tier": "<string>",
"limits": {
"max_input_bytes": 123,
"max_output_tokens": 123,
"max_search_queries": 1,
"max_search_results": 1,
"max_tool_calls": 1,
"max_concurrent_requests": 123
},
"enabled": True,
"activate": True
}
},
"confirmation_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"workspace": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
configuration: {
kind: 'policy',
policy: {
scope_kind: 'account',
workspace_id: null,
project_board_id: null,
policy_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
operation_keys: [],
allowed_tiers: ['<string>'],
default_tier: '<string>',
limits: {
max_input_bytes: 123,
max_output_tokens: 123,
max_search_queries: 1,
max_search_results: 1,
max_tool_calls: 1,
max_concurrent_requests: 123
},
enabled: true,
activate: true
}
},
confirmation_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
workspace: '<string>'
})
};
fetch('https://app.goosybear.ai/api/v1/tools/pages.capabilities.configure', 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://app.goosybear.ai/api/v1/tools/pages.capabilities.configure",
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([
'configuration' => [
'kind' => 'policy',
'policy' => [
'scope_kind' => 'account',
'workspace_id' => null,
'project_board_id' => null,
'policy_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'operation_keys' => [
],
'allowed_tiers' => [
'<string>'
],
'default_tier' => '<string>',
'limits' => [
'max_input_bytes' => 123,
'max_output_tokens' => 123,
'max_search_queries' => 1,
'max_search_results' => 1,
'max_tool_calls' => 1,
'max_concurrent_requests' => 123
],
'enabled' => true,
'activate' => true
]
],
'confirmation_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'workspace' => '<string>'
]),
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://app.goosybear.ai/api/v1/tools/pages.capabilities.configure"
payload := strings.NewReader("{\n \"configuration\": {\n \"kind\": \"policy\",\n \"policy\": {\n \"scope_kind\": \"account\",\n \"workspace_id\": null,\n \"project_board_id\": null,\n \"policy_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"operation_keys\": [],\n \"allowed_tiers\": [\n \"<string>\"\n ],\n \"default_tier\": \"<string>\",\n \"limits\": {\n \"max_input_bytes\": 123,\n \"max_output_tokens\": 123,\n \"max_search_queries\": 1,\n \"max_search_results\": 1,\n \"max_tool_calls\": 1,\n \"max_concurrent_requests\": 123\n },\n \"enabled\": true,\n \"activate\": true\n }\n },\n \"confirmation_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"workspace\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", 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.post("https://app.goosybear.ai/api/v1/tools/pages.capabilities.configure")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"configuration\": {\n \"kind\": \"policy\",\n \"policy\": {\n \"scope_kind\": \"account\",\n \"workspace_id\": null,\n \"project_board_id\": null,\n \"policy_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"operation_keys\": [],\n \"allowed_tiers\": [\n \"<string>\"\n ],\n \"default_tier\": \"<string>\",\n \"limits\": {\n \"max_input_bytes\": 123,\n \"max_output_tokens\": 123,\n \"max_search_queries\": 1,\n \"max_search_results\": 1,\n \"max_tool_calls\": 1,\n \"max_concurrent_requests\": 123\n },\n \"enabled\": true,\n \"activate\": true\n }\n },\n \"confirmation_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"workspace\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.goosybear.ai/api/v1/tools/pages.capabilities.configure")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"configuration\": {\n \"kind\": \"policy\",\n \"policy\": {\n \"scope_kind\": \"account\",\n \"workspace_id\": null,\n \"project_board_id\": null,\n \"policy_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"operation_keys\": [],\n \"allowed_tiers\": [\n \"<string>\"\n ],\n \"default_tier\": \"<string>\",\n \"limits\": {\n \"max_input_bytes\": 123,\n \"max_output_tokens\": 123,\n \"max_search_queries\": 1,\n \"max_search_results\": 1,\n \"max_tool_calls\": 1,\n \"max_concurrent_requests\": 123\n },\n \"enabled\": true,\n \"activate\": true\n }\n },\n \"confirmation_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"workspace\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"ok": true,
"state": "confirmation_required",
"kind": "policy",
"workspace": "<string>",
"working_in": {
"label": "<string>",
"note": "<string>",
"workspace": "<string>",
"source": "call-override"
},
"confirmation_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"expires_in_seconds": 123,
"disclosure_summary": "<string>",
"policy_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"version_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"version": 123,
"activated": true,
"grant_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"grant_saved": true,
"runtime_credential": "ready",
"enrollment_error_code": "<string>",
"standing_approval_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"enrollment_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"workflow_definition_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"workflow_definition_version_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"service_actor_user_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"service_actor_role": "<string>",
"changed": true,
"standing_approvals_revoked": 1,
"managed_keys_revoked": 1,
"request_replayed": true
}{
"error": {
"code": "<string>",
"message": "<string>",
"retry_after_seconds": 123
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"retry_after_seconds": 123
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"retry_after_seconds": 123
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"retry_after_seconds": 123
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"retry_after_seconds": 123
}
}Authorizations
An API key minted at Settings › API & MCP. Send it as Authorization: Bearer <key>. A key carries its holder's own permissions, resolved on every call — revoking a membership closes the key's reach immediately. Keep it in an environment variable (GOOSY_API_KEY), never in a committed file.
Body
- Option 1
- Option 2
- Option 3
- Option 4
- Option 5
- Option 6
Show child attributes
Show child attributes
Which workspace to run in — its slug. Omit to use your default. With more than one reachable workspace and no default, the call is refused and the choices are listed.
1Response
The call was admitted and dispatched. ok says whether the tool succeeded — a refusal the tool itself produced is still a 200, exactly as it is a successful JSON-RPC result over MCP.
- Option 1
- Option 2
The tool ran and answered.
confirmation_required, configured, enrollment_pending policy, grant, standing_approval, grant_revoke, standing_approval_revoke, workflow_enrollment The slug of the workspace this call ran in.
Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.
Show child attributes
Show child attributes
ready, not_required, enrollment_pending x >= 0x >= 0