Update Access Profile
Update an existing access profile.
curl --request PUT \
--url https://public.api.serval.com/v2/access-profiles/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"description": "<string>",
"matchingCriteria": {
"groups": {
"includedGroupIds": [
"<string>"
],
"excludedGroupIds": [
"<string>"
]
},
"currentTeam": {
"teamRoles": [],
"customRoles": {
"customRoleIds": [
"<string>"
]
}
}
},
"grants": {
"appResourceRoles": [
{
"appResourceRoleId": "<string>"
}
],
"workflows": [
{
"workflowId": "<string>"
}
],
"forms": [
{
"formId": "<string>"
}
],
"skills": {
"skills": [
{
"skillId": "<string>"
}
]
}
},
"scopedId": "<string>"
}
'import requests
url = "https://public.api.serval.com/v2/access-profiles/{id}"
payload = {
"name": "<string>",
"description": "<string>",
"matchingCriteria": {
"groups": {
"includedGroupIds": ["<string>"],
"excludedGroupIds": ["<string>"]
},
"currentTeam": {
"teamRoles": [],
"customRoles": { "customRoleIds": ["<string>"] }
}
},
"grants": {
"appResourceRoles": [{ "appResourceRoleId": "<string>" }],
"workflows": [{ "workflowId": "<string>" }],
"forms": [{ "formId": "<string>" }],
"skills": { "skills": [{ "skillId": "<string>" }] }
},
"scopedId": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
description: '<string>',
matchingCriteria: {
groups: {includedGroupIds: ['<string>'], excludedGroupIds: ['<string>']},
currentTeam: {teamRoles: [], customRoles: {customRoleIds: ['<string>']}}
},
grants: {
appResourceRoles: [{appResourceRoleId: '<string>'}],
workflows: [{workflowId: '<string>'}],
forms: [{formId: '<string>'}],
skills: {skills: [{skillId: '<string>'}]}
},
scopedId: '<string>'
})
};
fetch('https://public.api.serval.com/v2/access-profiles/{id}', 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://public.api.serval.com/v2/access-profiles/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'name' => '<string>',
'description' => '<string>',
'matchingCriteria' => [
'groups' => [
'includedGroupIds' => [
'<string>'
],
'excludedGroupIds' => [
'<string>'
]
],
'currentTeam' => [
'teamRoles' => [
],
'customRoles' => [
'customRoleIds' => [
'<string>'
]
]
]
],
'grants' => [
'appResourceRoles' => [
[
'appResourceRoleId' => '<string>'
]
],
'workflows' => [
[
'workflowId' => '<string>'
]
],
'forms' => [
[
'formId' => '<string>'
]
],
'skills' => [
'skills' => [
[
'skillId' => '<string>'
]
]
]
],
'scopedId' => '<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://public.api.serval.com/v2/access-profiles/{id}"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"matchingCriteria\": {\n \"groups\": {\n \"includedGroupIds\": [\n \"<string>\"\n ],\n \"excludedGroupIds\": [\n \"<string>\"\n ]\n },\n \"currentTeam\": {\n \"teamRoles\": [],\n \"customRoles\": {\n \"customRoleIds\": [\n \"<string>\"\n ]\n }\n }\n },\n \"grants\": {\n \"appResourceRoles\": [\n {\n \"appResourceRoleId\": \"<string>\"\n }\n ],\n \"workflows\": [\n {\n \"workflowId\": \"<string>\"\n }\n ],\n \"forms\": [\n {\n \"formId\": \"<string>\"\n }\n ],\n \"skills\": {\n \"skills\": [\n {\n \"skillId\": \"<string>\"\n }\n ]\n }\n },\n \"scopedId\": \"<string>\"\n}")
req, _ := http.NewRequest("PUT", 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.put("https://public.api.serval.com/v2/access-profiles/{id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"matchingCriteria\": {\n \"groups\": {\n \"includedGroupIds\": [\n \"<string>\"\n ],\n \"excludedGroupIds\": [\n \"<string>\"\n ]\n },\n \"currentTeam\": {\n \"teamRoles\": [],\n \"customRoles\": {\n \"customRoleIds\": [\n \"<string>\"\n ]\n }\n }\n },\n \"grants\": {\n \"appResourceRoles\": [\n {\n \"appResourceRoleId\": \"<string>\"\n }\n ],\n \"workflows\": [\n {\n \"workflowId\": \"<string>\"\n }\n ],\n \"forms\": [\n {\n \"formId\": \"<string>\"\n }\n ],\n \"skills\": {\n \"skills\": [\n {\n \"skillId\": \"<string>\"\n }\n ]\n }\n },\n \"scopedId\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://public.api.serval.com/v2/access-profiles/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"matchingCriteria\": {\n \"groups\": {\n \"includedGroupIds\": [\n \"<string>\"\n ],\n \"excludedGroupIds\": [\n \"<string>\"\n ]\n },\n \"currentTeam\": {\n \"teamRoles\": [],\n \"customRoles\": {\n \"customRoleIds\": [\n \"<string>\"\n ]\n }\n }\n },\n \"grants\": {\n \"appResourceRoles\": [\n {\n \"appResourceRoleId\": \"<string>\"\n }\n ],\n \"workflows\": [\n {\n \"workflowId\": \"<string>\"\n }\n ],\n \"forms\": [\n {\n \"formId\": \"<string>\"\n }\n ],\n \"skills\": {\n \"skills\": [\n {\n \"skillId\": \"<string>\"\n }\n ]\n }\n },\n \"scopedId\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": "<string>",
"teamId": "<string>",
"name": "<string>",
"description": "<string>",
"isTeamDefault": true,
"createdAt": "2025-01-15T01:30:15.000Z",
"matchingCriteria": {
"groups": {
"matchType": "ACCESS_PROFILE_GROUP_MATCH_TYPE_UNSPECIFIED",
"includedGroupIds": [
"<string>"
],
"excludedGroupIds": [
"<string>"
]
},
"currentTeam": {
"teamRoles": [
"TEAM_ROLE_UNSPECIFIED"
],
"customRoles": {
"customRoleIds": [
"<string>"
]
}
}
},
"grants": {
"appResourceRoles": [
{
"appResourceRoleId": "<string>",
"useTeamDefaultAccessProfile": true
}
],
"workflows": [
{
"workflowId": "<string>"
}
],
"forms": [
{
"formId": "<string>"
}
],
"skills": {
"skills": [
{
"skillId": "<string>"
}
]
}
},
"builtinProfileType": "<string>",
"scopedId": "<string>"
}
}Authentication and permissions
Token requirements: User-based token (OAuth) or Organization-scoped API key or Team-scoped API key. Send a bearer access token for one of these identities. The permissions and resource restrictions below also apply.
| Credential | Access requirements |
|---|---|
| Organization-scoped API key | settings:write |
| Team-scoped API key | settings:write |
| User-based token (OAuth) | Supported, subject to permissions |
Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Path Parameters
The ID of the access profile to update.
Body
Updated name. Omit or set to "" to leave unchanged.
Updated description. Omit to leave unchanged; set to "" to clear.
Which users this profile applies to. Each child present replaces that criterion wholesale; a child omitted is left unchanged. Sending the message with neither child, or an update that would leave the profile with no criterion at all (which would match every user), is rejected.
Show child attributes
Show child attributes
Deprecated: manage grants through the access-profile-grant endpoints (/v2/access-profile-grants), which edit one edge at a time instead of replacing the full set. Still honored (replace-all semantics) for compatibility until writes are rejected.
Show child attributes
Show child attributes
Rekeys the profile's stable identity (apr_ + 22 base62 chars). Omit to leave unchanged. Must be unique within the team. Built-in profiles cannot be rekeyed, and reserved sentinel values are rejected.
Response
Success
An access profile defines which entitlements are available to which groups of users, and which workflows apply.
Show child attributes
Show child attributes
Was this page helpful?
curl --request PUT \
--url https://public.api.serval.com/v2/access-profiles/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"description": "<string>",
"matchingCriteria": {
"groups": {
"includedGroupIds": [
"<string>"
],
"excludedGroupIds": [
"<string>"
]
},
"currentTeam": {
"teamRoles": [],
"customRoles": {
"customRoleIds": [
"<string>"
]
}
}
},
"grants": {
"appResourceRoles": [
{
"appResourceRoleId": "<string>"
}
],
"workflows": [
{
"workflowId": "<string>"
}
],
"forms": [
{
"formId": "<string>"
}
],
"skills": {
"skills": [
{
"skillId": "<string>"
}
]
}
},
"scopedId": "<string>"
}
'import requests
url = "https://public.api.serval.com/v2/access-profiles/{id}"
payload = {
"name": "<string>",
"description": "<string>",
"matchingCriteria": {
"groups": {
"includedGroupIds": ["<string>"],
"excludedGroupIds": ["<string>"]
},
"currentTeam": {
"teamRoles": [],
"customRoles": { "customRoleIds": ["<string>"] }
}
},
"grants": {
"appResourceRoles": [{ "appResourceRoleId": "<string>" }],
"workflows": [{ "workflowId": "<string>" }],
"forms": [{ "formId": "<string>" }],
"skills": { "skills": [{ "skillId": "<string>" }] }
},
"scopedId": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
description: '<string>',
matchingCriteria: {
groups: {includedGroupIds: ['<string>'], excludedGroupIds: ['<string>']},
currentTeam: {teamRoles: [], customRoles: {customRoleIds: ['<string>']}}
},
grants: {
appResourceRoles: [{appResourceRoleId: '<string>'}],
workflows: [{workflowId: '<string>'}],
forms: [{formId: '<string>'}],
skills: {skills: [{skillId: '<string>'}]}
},
scopedId: '<string>'
})
};
fetch('https://public.api.serval.com/v2/access-profiles/{id}', 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://public.api.serval.com/v2/access-profiles/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'name' => '<string>',
'description' => '<string>',
'matchingCriteria' => [
'groups' => [
'includedGroupIds' => [
'<string>'
],
'excludedGroupIds' => [
'<string>'
]
],
'currentTeam' => [
'teamRoles' => [
],
'customRoles' => [
'customRoleIds' => [
'<string>'
]
]
]
],
'grants' => [
'appResourceRoles' => [
[
'appResourceRoleId' => '<string>'
]
],
'workflows' => [
[
'workflowId' => '<string>'
]
],
'forms' => [
[
'formId' => '<string>'
]
],
'skills' => [
'skills' => [
[
'skillId' => '<string>'
]
]
]
],
'scopedId' => '<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://public.api.serval.com/v2/access-profiles/{id}"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"matchingCriteria\": {\n \"groups\": {\n \"includedGroupIds\": [\n \"<string>\"\n ],\n \"excludedGroupIds\": [\n \"<string>\"\n ]\n },\n \"currentTeam\": {\n \"teamRoles\": [],\n \"customRoles\": {\n \"customRoleIds\": [\n \"<string>\"\n ]\n }\n }\n },\n \"grants\": {\n \"appResourceRoles\": [\n {\n \"appResourceRoleId\": \"<string>\"\n }\n ],\n \"workflows\": [\n {\n \"workflowId\": \"<string>\"\n }\n ],\n \"forms\": [\n {\n \"formId\": \"<string>\"\n }\n ],\n \"skills\": {\n \"skills\": [\n {\n \"skillId\": \"<string>\"\n }\n ]\n }\n },\n \"scopedId\": \"<string>\"\n}")
req, _ := http.NewRequest("PUT", 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.put("https://public.api.serval.com/v2/access-profiles/{id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"matchingCriteria\": {\n \"groups\": {\n \"includedGroupIds\": [\n \"<string>\"\n ],\n \"excludedGroupIds\": [\n \"<string>\"\n ]\n },\n \"currentTeam\": {\n \"teamRoles\": [],\n \"customRoles\": {\n \"customRoleIds\": [\n \"<string>\"\n ]\n }\n }\n },\n \"grants\": {\n \"appResourceRoles\": [\n {\n \"appResourceRoleId\": \"<string>\"\n }\n ],\n \"workflows\": [\n {\n \"workflowId\": \"<string>\"\n }\n ],\n \"forms\": [\n {\n \"formId\": \"<string>\"\n }\n ],\n \"skills\": {\n \"skills\": [\n {\n \"skillId\": \"<string>\"\n }\n ]\n }\n },\n \"scopedId\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://public.api.serval.com/v2/access-profiles/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"matchingCriteria\": {\n \"groups\": {\n \"includedGroupIds\": [\n \"<string>\"\n ],\n \"excludedGroupIds\": [\n \"<string>\"\n ]\n },\n \"currentTeam\": {\n \"teamRoles\": [],\n \"customRoles\": {\n \"customRoleIds\": [\n \"<string>\"\n ]\n }\n }\n },\n \"grants\": {\n \"appResourceRoles\": [\n {\n \"appResourceRoleId\": \"<string>\"\n }\n ],\n \"workflows\": [\n {\n \"workflowId\": \"<string>\"\n }\n ],\n \"forms\": [\n {\n \"formId\": \"<string>\"\n }\n ],\n \"skills\": {\n \"skills\": [\n {\n \"skillId\": \"<string>\"\n }\n ]\n }\n },\n \"scopedId\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": "<string>",
"teamId": "<string>",
"name": "<string>",
"description": "<string>",
"isTeamDefault": true,
"createdAt": "2025-01-15T01:30:15.000Z",
"matchingCriteria": {
"groups": {
"matchType": "ACCESS_PROFILE_GROUP_MATCH_TYPE_UNSPECIFIED",
"includedGroupIds": [
"<string>"
],
"excludedGroupIds": [
"<string>"
]
},
"currentTeam": {
"teamRoles": [
"TEAM_ROLE_UNSPECIFIED"
],
"customRoles": {
"customRoleIds": [
"<string>"
]
}
}
},
"grants": {
"appResourceRoles": [
{
"appResourceRoleId": "<string>",
"useTeamDefaultAccessProfile": true
}
],
"workflows": [
{
"workflowId": "<string>"
}
],
"forms": [
{
"formId": "<string>"
}
],
"skills": {
"skills": [
{
"skillId": "<string>"
}
]
}
},
"builtinProfileType": "<string>",
"scopedId": "<string>"
}
}
