curl --request PATCH \
--url https://api.generalvalidation.com/api/v1/organization-members/{memberUuid} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'If-Match: <if-match>' \
--data '{}'import requests
url = "https://api.generalvalidation.com/api/v1/organization-members/{memberUuid}"
payload = {}
headers = {
"If-Match": "<if-match>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {
'If-Match': '<if-match>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({})
};
fetch('https://api.generalvalidation.com/api/v1/organization-members/{memberUuid}', 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.generalvalidation.com/api/v1/organization-members/{memberUuid}",
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([
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"If-Match: <if-match>"
],
]);
$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.generalvalidation.com/api/v1/organization-members/{memberUuid}"
payload := strings.NewReader("{}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("If-Match", "<if-match>")
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.generalvalidation.com/api/v1/organization-members/{memberUuid}")
.header("If-Match", "<if-match>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.generalvalidation.com/api/v1/organization-members/{memberUuid}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["If-Match"] = '<if-match>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{}"
response = http.request(request)
puts response.read_body{
"createdAt": "<string>",
"displayName": "<string>",
"email": "<string>",
"entraRole": "reader",
"externalSubject": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"memberUuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"revision": 2,
"role": "reader",
"roleSource": "invited",
"status": "active",
"updatedAt": "<string>",
"userPrincipalName": "<string>"
}{
"code": "<string>",
"detail": "<string>",
"instance": "<string>",
"requestId": "<string>",
"status": 123,
"title": "<string>",
"type": "<string>",
"diagnostics": {}
}{
"code": "<string>",
"detail": "<string>",
"instance": "<string>",
"requestId": "<string>",
"status": 123,
"title": "<string>",
"type": "<string>",
"diagnostics": {}
}{
"code": "<string>",
"detail": "<string>",
"instance": "<string>",
"requestId": "<string>",
"status": 123,
"title": "<string>",
"type": "<string>",
"diagnostics": {}
}{
"code": "<string>",
"detail": "<string>",
"instance": "<string>",
"requestId": "<string>",
"status": 123,
"title": "<string>",
"type": "<string>",
"diagnostics": {}
}{
"code": "<string>",
"detail": "<string>",
"instance": "<string>",
"requestId": "<string>",
"status": 123,
"title": "<string>",
"type": "<string>",
"diagnostics": {}
}{
"code": "<string>",
"detail": "<string>",
"instance": "<string>",
"requestId": "<string>",
"status": 123,
"title": "<string>",
"type": "<string>",
"diagnostics": {}
}{
"code": "<string>",
"detail": "<string>",
"instance": "<string>",
"requestId": "<string>",
"status": 123,
"title": "<string>",
"type": "<string>",
"diagnostics": {}
}{
"code": "<string>",
"detail": "<string>",
"instance": "<string>",
"requestId": "<string>",
"status": 123,
"title": "<string>",
"type": "<string>",
"diagnostics": {}
}{
"code": "<string>",
"detail": "<string>",
"instance": "<string>",
"requestId": "<string>",
"status": 123,
"title": "<string>",
"type": "<string>",
"diagnostics": {}
}Change an Organization member's role
Sets the role the Organization grants the member; a higher Microsoft Entra application role still applies. Send the ETag from GET /api/v1/organization-members/{memberUuid} in If-Match: 428 when missing, 412 when stale. Demoting the last active Owner returns 409.
Requires the GV.APIOwner application role, or a higher role (Owner > Contributor > Reader).
curl --request PATCH \
--url https://api.generalvalidation.com/api/v1/organization-members/{memberUuid} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'If-Match: <if-match>' \
--data '{}'import requests
url = "https://api.generalvalidation.com/api/v1/organization-members/{memberUuid}"
payload = {}
headers = {
"If-Match": "<if-match>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {
'If-Match': '<if-match>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({})
};
fetch('https://api.generalvalidation.com/api/v1/organization-members/{memberUuid}', 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.generalvalidation.com/api/v1/organization-members/{memberUuid}",
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([
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"If-Match: <if-match>"
],
]);
$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.generalvalidation.com/api/v1/organization-members/{memberUuid}"
payload := strings.NewReader("{}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("If-Match", "<if-match>")
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.generalvalidation.com/api/v1/organization-members/{memberUuid}")
.header("If-Match", "<if-match>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.generalvalidation.com/api/v1/organization-members/{memberUuid}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["If-Match"] = '<if-match>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{}"
response = http.request(request)
puts response.read_body{
"createdAt": "<string>",
"displayName": "<string>",
"email": "<string>",
"entraRole": "reader",
"externalSubject": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"memberUuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"revision": 2,
"role": "reader",
"roleSource": "invited",
"status": "active",
"updatedAt": "<string>",
"userPrincipalName": "<string>"
}{
"code": "<string>",
"detail": "<string>",
"instance": "<string>",
"requestId": "<string>",
"status": 123,
"title": "<string>",
"type": "<string>",
"diagnostics": {}
}{
"code": "<string>",
"detail": "<string>",
"instance": "<string>",
"requestId": "<string>",
"status": 123,
"title": "<string>",
"type": "<string>",
"diagnostics": {}
}{
"code": "<string>",
"detail": "<string>",
"instance": "<string>",
"requestId": "<string>",
"status": 123,
"title": "<string>",
"type": "<string>",
"diagnostics": {}
}{
"code": "<string>",
"detail": "<string>",
"instance": "<string>",
"requestId": "<string>",
"status": 123,
"title": "<string>",
"type": "<string>",
"diagnostics": {}
}{
"code": "<string>",
"detail": "<string>",
"instance": "<string>",
"requestId": "<string>",
"status": 123,
"title": "<string>",
"type": "<string>",
"diagnostics": {}
}{
"code": "<string>",
"detail": "<string>",
"instance": "<string>",
"requestId": "<string>",
"status": 123,
"title": "<string>",
"type": "<string>",
"diagnostics": {}
}{
"code": "<string>",
"detail": "<string>",
"instance": "<string>",
"requestId": "<string>",
"status": 123,
"title": "<string>",
"type": "<string>",
"diagnostics": {}
}{
"code": "<string>",
"detail": "<string>",
"instance": "<string>",
"requestId": "<string>",
"status": 123,
"title": "<string>",
"type": "<string>",
"diagnostics": {}
}{
"code": "<string>",
"detail": "<string>",
"instance": "<string>",
"requestId": "<string>",
"status": 123,
"title": "<string>",
"type": "<string>",
"diagnostics": {}
}Authorizations
Microsoft Entra application token issued by the caller's Organization tenant for this multitenant API. Request the .default scope and assign the application the required GV.APIReader, GV.APIContributor, or GV.APIOwner role.
Headers
Exact strong ETag from the current resource. Weak validators, wildcards, and tag lists are rejected.
1024Path Parameters
The member's memberUuid.
Body
Role to grant. A changed role sets roleSource to invited, so the Organization governs it.
reader, contributor, owner Response
Member role updated.
Email from the person's Microsoft Entra account, or null when it has none.
Role from the member's Entra application role assignment at their latest sign-in, if any.
reader, contributor, owner The person's Microsoft Entra object ID in the Organization's directory.
Version of the membership; each role or status change increases it. The ETag header of GET /api/v1/organization-members/{memberUuid} is built from it.
x >= 1Role the member holds. While roleSource is entra, it follows the Entra assignment. An active member acts with the higher of this role and the Entra application role on their token.
reader, contributor, owner Whether an invitation or Owner edit governs the role, or an Entra application role assignment alone.
invited, entra disabled means an Owner removed the member, or the member joined through a Microsoft Entra assignment that is gone. A disabled member cannot call the API.
active, disabled The person's Microsoft Entra sign-in name.