Update a lifecycle reason
Changes only supplied properties and preserves the stable code and historical event snapshots. The last active reason cannot be deactivated while selection is required. Actual changes advance the set version; no-op edits retain it. Requires the workspace lifecycle feature. Mutation permission is lifecycle_reasons_manage or manage_settings.
curl --request PATCH \
--url https://api.gratona.com/v1/admin/lifecycle-reasons/{reason_id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"expected_version": 1,
"label": "Donor cancelled",
"description": "Donor requested cancellation.",
"event_transition_type": "cancelled",
"requires_notes": false,
"is_active": false
}
'import requests
url = "https://api.gratona.com/v1/admin/lifecycle-reasons/{reason_id}"
payload = {
"expected_version": 1,
"label": "Donor cancelled",
"description": "Donor requested cancellation.",
"event_transition_type": "cancelled",
"requires_notes": False,
"is_active": False
}
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({
expected_version: 1,
label: 'Donor cancelled',
description: 'Donor requested cancellation.',
event_transition_type: 'cancelled',
requires_notes: false,
is_active: false
})
};
fetch('https://api.gratona.com/v1/admin/lifecycle-reasons/{reason_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://api.gratona.com/v1/admin/lifecycle-reasons/{reason_id}",
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([
'expected_version' => 1,
'label' => 'Donor cancelled',
'description' => 'Donor requested cancellation.',
'event_transition_type' => 'cancelled',
'requires_notes' => false,
'is_active' => false
]),
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.gratona.com/v1/admin/lifecycle-reasons/{reason_id}"
payload := strings.NewReader("{\n \"expected_version\": 1,\n \"label\": \"Donor cancelled\",\n \"description\": \"Donor requested cancellation.\",\n \"event_transition_type\": \"cancelled\",\n \"requires_notes\": false,\n \"is_active\": false\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.gratona.com/v1/admin/lifecycle-reasons/{reason_id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"expected_version\": 1,\n \"label\": \"Donor cancelled\",\n \"description\": \"Donor requested cancellation.\",\n \"event_transition_type\": \"cancelled\",\n \"requires_notes\": false,\n \"is_active\": false\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.gratona.com/v1/admin/lifecycle-reasons/{reason_id}")
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 \"expected_version\": 1,\n \"label\": \"Donor cancelled\",\n \"description\": \"Donor requested cancellation.\",\n \"event_transition_type\": \"cancelled\",\n \"requires_notes\": false,\n \"is_active\": false\n}"
response = http.request(request)
puts response.read_body{
"data": {
"reason": {
"id": 42,
"code": "donor_cancelled",
"label": "Donor cancelled",
"description": "Example",
"event_transition_type": "recipient_exited",
"is_active": false,
"requires_notes": false,
"source": "starter",
"sort_order": 0
},
"catalog_version": 42
}
}{
"message": "Something went wrong. Please try again.",
"status": "error",
"error": "invalid_request",
"code": "DONOR_NOT_FOUND"
}{
"message": "Something went wrong. Please try again.",
"status": "error",
"error": "invalid_request",
"code": "DONOR_NOT_FOUND"
}{
"message": "Not Found",
"status": "error"
}{
"error": "Conflict",
"error_code": "LIFECYCLE_REASON_CATALOG_VERSION_CONFLICT",
"message": "The lifecycle reason catalog changed. Reload and try again.",
"expected_version": 42,
"current_version": 42
}{
"errors": {},
"status": "error",
"message": "The given data was invalid."
}Authorizations
Passport bearer token authentication for legacy admin sessions.
Path Parameters
Record ID in the authenticated organization.
42
Body
Current reason set catalog_version; required for optimistic concurrency.
x >= 11
Nonblank reason label; trimmed before saving.
255"Donor cancelled"
Optional explanation; whitespace normalizes to null.
500"Donor requested cancellation."
Applies to sponsorship.end; other contexts force their transition.
cancelled, ended "cancelled"
Require a note for future selection.
false
Active for future lifecycle changes.
false
Response
Update a lifecycle reason completed.
Show child attributes
Show child attributes
curl --request PATCH \
--url https://api.gratona.com/v1/admin/lifecycle-reasons/{reason_id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"expected_version": 1,
"label": "Donor cancelled",
"description": "Donor requested cancellation.",
"event_transition_type": "cancelled",
"requires_notes": false,
"is_active": false
}
'import requests
url = "https://api.gratona.com/v1/admin/lifecycle-reasons/{reason_id}"
payload = {
"expected_version": 1,
"label": "Donor cancelled",
"description": "Donor requested cancellation.",
"event_transition_type": "cancelled",
"requires_notes": False,
"is_active": False
}
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({
expected_version: 1,
label: 'Donor cancelled',
description: 'Donor requested cancellation.',
event_transition_type: 'cancelled',
requires_notes: false,
is_active: false
})
};
fetch('https://api.gratona.com/v1/admin/lifecycle-reasons/{reason_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://api.gratona.com/v1/admin/lifecycle-reasons/{reason_id}",
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([
'expected_version' => 1,
'label' => 'Donor cancelled',
'description' => 'Donor requested cancellation.',
'event_transition_type' => 'cancelled',
'requires_notes' => false,
'is_active' => false
]),
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.gratona.com/v1/admin/lifecycle-reasons/{reason_id}"
payload := strings.NewReader("{\n \"expected_version\": 1,\n \"label\": \"Donor cancelled\",\n \"description\": \"Donor requested cancellation.\",\n \"event_transition_type\": \"cancelled\",\n \"requires_notes\": false,\n \"is_active\": false\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.gratona.com/v1/admin/lifecycle-reasons/{reason_id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"expected_version\": 1,\n \"label\": \"Donor cancelled\",\n \"description\": \"Donor requested cancellation.\",\n \"event_transition_type\": \"cancelled\",\n \"requires_notes\": false,\n \"is_active\": false\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.gratona.com/v1/admin/lifecycle-reasons/{reason_id}")
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 \"expected_version\": 1,\n \"label\": \"Donor cancelled\",\n \"description\": \"Donor requested cancellation.\",\n \"event_transition_type\": \"cancelled\",\n \"requires_notes\": false,\n \"is_active\": false\n}"
response = http.request(request)
puts response.read_body{
"data": {
"reason": {
"id": 42,
"code": "donor_cancelled",
"label": "Donor cancelled",
"description": "Example",
"event_transition_type": "recipient_exited",
"is_active": false,
"requires_notes": false,
"source": "starter",
"sort_order": 0
},
"catalog_version": 42
}
}{
"message": "Something went wrong. Please try again.",
"status": "error",
"error": "invalid_request",
"code": "DONOR_NOT_FOUND"
}{
"message": "Something went wrong. Please try again.",
"status": "error",
"error": "invalid_request",
"code": "DONOR_NOT_FOUND"
}{
"message": "Not Found",
"status": "error"
}{
"error": "Conflict",
"error_code": "LIFECYCLE_REASON_CATALOG_VERSION_CONFLICT",
"message": "The lifecycle reason catalog changed. Reload and try again.",
"expected_version": 42,
"current_version": 42
}{
"errors": {},
"status": "error",
"message": "The given data was invalid."
}