Events
Preview adding selected donors to an event invite list
Resolves explicit rows or all donor-worksheet matches with current donor visibility. Default maximum is 5,000 donors; empty/inaccessible explicit selections fail. Returns up to five masked samples and a single-use actor/event-bound preview (default expiry 15 minutes). Optional reviewed plan requires saved current definition, event start, future dates and assignees able to see every selected donor. Performs no invitations, task creation or communication. Requires event setup management; archived event invitation history is read-only (409).
POST
/
admin
/
events
/
{eventId}
/
invitees
/
selection
/
preview
Preview adding selected donors to an event invite list
curl --request POST \
--url https://api.gratona.com/v1/admin/events/{eventId}/invitees/selection/preview \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"selection": {
"donor_ids": [
42
],
"selection_mode": "selected_rows",
"hysform_id": 42,
"selected_count": 10,
"query": "Jane",
"filterGroups": [
{}
],
"savedFilterId": 42,
"fields": [
"<string>"
],
"sortKey": "display_name",
"sortOrder": "asc",
"column_order": [
"<string>"
],
"keysArray": [
"<string>"
],
"filter": "false",
"type": "donor",
"endpoint": "donor",
"Donor_Group": "all",
"selectedTab": "all"
},
"owner_user_id": 42,
"plan": {
"id": 42,
"revision": 1,
"definition_hash": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"steps": [
{
"step_key": "personal_call",
"enabled": true,
"due_date": "2026-11-01",
"assignee_strategy": "invitee_owner",
"assignee_user_id": 42
}
]
}
}
'import requests
url = "https://api.gratona.com/v1/admin/events/{eventId}/invitees/selection/preview"
payload = {
"selection": {
"donor_ids": [42],
"selection_mode": "selected_rows",
"hysform_id": 42,
"selected_count": 10,
"query": "Jane",
"filterGroups": [{}],
"savedFilterId": 42,
"fields": ["<string>"],
"sortKey": "display_name",
"sortOrder": "asc",
"column_order": ["<string>"],
"keysArray": ["<string>"],
"filter": "false",
"type": "donor",
"endpoint": "donor",
"Donor_Group": "all",
"selectedTab": "all"
},
"owner_user_id": 42,
"plan": {
"id": 42,
"revision": 1,
"definition_hash": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"steps": [
{
"step_key": "personal_call",
"enabled": True,
"due_date": "2026-11-01",
"assignee_strategy": "invitee_owner",
"assignee_user_id": 42
}
]
}
}
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({
selection: {
donor_ids: [42],
selection_mode: 'selected_rows',
hysform_id: 42,
selected_count: 10,
query: 'Jane',
filterGroups: [{}],
savedFilterId: 42,
fields: ['<string>'],
sortKey: 'display_name',
sortOrder: 'asc',
column_order: ['<string>'],
keysArray: ['<string>'],
filter: 'false',
type: 'donor',
endpoint: 'donor',
Donor_Group: 'all',
selectedTab: 'all'
},
owner_user_id: 42,
plan: {
id: 42,
revision: 1,
definition_hash: 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',
steps: [
{
step_key: 'personal_call',
enabled: true,
due_date: '2026-11-01',
assignee_strategy: 'invitee_owner',
assignee_user_id: 42
}
]
}
})
};
fetch('https://api.gratona.com/v1/admin/events/{eventId}/invitees/selection/preview', 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/events/{eventId}/invitees/selection/preview",
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([
'selection' => [
'donor_ids' => [
42
],
'selection_mode' => 'selected_rows',
'hysform_id' => 42,
'selected_count' => 10,
'query' => 'Jane',
'filterGroups' => [
[
]
],
'savedFilterId' => 42,
'fields' => [
'<string>'
],
'sortKey' => 'display_name',
'sortOrder' => 'asc',
'column_order' => [
'<string>'
],
'keysArray' => [
'<string>'
],
'filter' => 'false',
'type' => 'donor',
'endpoint' => 'donor',
'Donor_Group' => 'all',
'selectedTab' => 'all'
],
'owner_user_id' => 42,
'plan' => [
'id' => 42,
'revision' => 1,
'definition_hash' => 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',
'steps' => [
[
'step_key' => 'personal_call',
'enabled' => true,
'due_date' => '2026-11-01',
'assignee_strategy' => 'invitee_owner',
'assignee_user_id' => 42
]
]
]
]),
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/events/{eventId}/invitees/selection/preview"
payload := strings.NewReader("{\n \"selection\": {\n \"donor_ids\": [\n 42\n ],\n \"selection_mode\": \"selected_rows\",\n \"hysform_id\": 42,\n \"selected_count\": 10,\n \"query\": \"Jane\",\n \"filterGroups\": [\n {}\n ],\n \"savedFilterId\": 42,\n \"fields\": [\n \"<string>\"\n ],\n \"sortKey\": \"display_name\",\n \"sortOrder\": \"asc\",\n \"column_order\": [\n \"<string>\"\n ],\n \"keysArray\": [\n \"<string>\"\n ],\n \"filter\": \"false\",\n \"type\": \"donor\",\n \"endpoint\": \"donor\",\n \"Donor_Group\": \"all\",\n \"selectedTab\": \"all\"\n },\n \"owner_user_id\": 42,\n \"plan\": {\n \"id\": 42,\n \"revision\": 1,\n \"definition_hash\": \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n \"steps\": [\n {\n \"step_key\": \"personal_call\",\n \"enabled\": true,\n \"due_date\": \"2026-11-01\",\n \"assignee_strategy\": \"invitee_owner\",\n \"assignee_user_id\": 42\n }\n ]\n }\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://api.gratona.com/v1/admin/events/{eventId}/invitees/selection/preview")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"selection\": {\n \"donor_ids\": [\n 42\n ],\n \"selection_mode\": \"selected_rows\",\n \"hysform_id\": 42,\n \"selected_count\": 10,\n \"query\": \"Jane\",\n \"filterGroups\": [\n {}\n ],\n \"savedFilterId\": 42,\n \"fields\": [\n \"<string>\"\n ],\n \"sortKey\": \"display_name\",\n \"sortOrder\": \"asc\",\n \"column_order\": [\n \"<string>\"\n ],\n \"keysArray\": [\n \"<string>\"\n ],\n \"filter\": \"false\",\n \"type\": \"donor\",\n \"endpoint\": \"donor\",\n \"Donor_Group\": \"all\",\n \"selectedTab\": \"all\"\n },\n \"owner_user_id\": 42,\n \"plan\": {\n \"id\": 42,\n \"revision\": 1,\n \"definition_hash\": \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n \"steps\": [\n {\n \"step_key\": \"personal_call\",\n \"enabled\": true,\n \"due_date\": \"2026-11-01\",\n \"assignee_strategy\": \"invitee_owner\",\n \"assignee_user_id\": 42\n }\n ]\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.gratona.com/v1/admin/events/{eventId}/invitees/selection/preview")
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 \"selection\": {\n \"donor_ids\": [\n 42\n ],\n \"selection_mode\": \"selected_rows\",\n \"hysform_id\": 42,\n \"selected_count\": 10,\n \"query\": \"Jane\",\n \"filterGroups\": [\n {}\n ],\n \"savedFilterId\": 42,\n \"fields\": [\n \"<string>\"\n ],\n \"sortKey\": \"display_name\",\n \"sortOrder\": \"asc\",\n \"column_order\": [\n \"<string>\"\n ],\n \"keysArray\": [\n \"<string>\"\n ],\n \"filter\": \"false\",\n \"type\": \"donor\",\n \"endpoint\": \"donor\",\n \"Donor_Group\": \"all\",\n \"selectedTab\": \"all\"\n },\n \"owner_user_id\": 42,\n \"plan\": {\n \"id\": 42,\n \"revision\": 1,\n \"definition_hash\": \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n \"steps\": [\n {\n \"step_key\": \"personal_call\",\n \"enabled\": true,\n \"due_date\": \"2026-11-01\",\n \"assignee_strategy\": \"invitee_owner\",\n \"assignee_user_id\": 42\n }\n ]\n }\n}"
response = http.request(request)
puts response.read_body{
"data": {
"preview_token": "issued-preview-token",
"preview_expires_at": "2026-10-20T12:00:00Z",
"event": {
"id": 42,
"name": "Annual Gala"
},
"owner": {
"id": 42,
"name": "Alex Smith"
},
"selection_mode": "selected_rows",
"counts": {
"selected": 42,
"new": 42,
"already_active": 42,
"reactivate": 42,
"skipped": 42,
"staff_tasks": 42
},
"samples": [
{
"id": 42,
"display_name": "Jane Doe",
"email": "j***@example.org"
}
],
"plan": {
"id": 42,
"name": "Personal invitation",
"revision": 1,
"definition_hash": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"steps": [
{
"step_key": "personal_call",
"label": "Personal call",
"task_title_template": "Call {donor_name} about {event_name}",
"invitation_method": "phone_call",
"days_before_event": 28,
"due_date": "2026-11-01",
"assignee_strategy": "invitee_owner",
"resolved_assignee_user_id": 42,
"assignee_user_id": 42,
"enabled": false
}
],
"enabled_step_count": 42,
"new_task_count": 42
},
"communications_sent": false,
"notice": "No messages will be sent."
}
}{
"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"
}{
"message": "Version, idempotency, preview or archived-event conflict.",
"error_code": "event_invitee_conflict",
"details": {
"current_version": 42,
"current_lock_version": 42,
"current_revision": 42,
"current_definition_hash": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
}
}{
"errors": {},
"status": "error",
"message": "The given data was invalid."
}Authorizations
bearerAuthapiKeyAuth
Passport bearer token authentication for legacy admin sessions.
Path Parameters
Record ID in the authenticated organization.
Example:
42
Body
application/json
Response
Preview adding selected donors to an event invite list completed.
Show child attributes
Show child attributes
⌘I
Preview adding selected donors to an event invite list
curl --request POST \
--url https://api.gratona.com/v1/admin/events/{eventId}/invitees/selection/preview \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"selection": {
"donor_ids": [
42
],
"selection_mode": "selected_rows",
"hysform_id": 42,
"selected_count": 10,
"query": "Jane",
"filterGroups": [
{}
],
"savedFilterId": 42,
"fields": [
"<string>"
],
"sortKey": "display_name",
"sortOrder": "asc",
"column_order": [
"<string>"
],
"keysArray": [
"<string>"
],
"filter": "false",
"type": "donor",
"endpoint": "donor",
"Donor_Group": "all",
"selectedTab": "all"
},
"owner_user_id": 42,
"plan": {
"id": 42,
"revision": 1,
"definition_hash": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"steps": [
{
"step_key": "personal_call",
"enabled": true,
"due_date": "2026-11-01",
"assignee_strategy": "invitee_owner",
"assignee_user_id": 42
}
]
}
}
'import requests
url = "https://api.gratona.com/v1/admin/events/{eventId}/invitees/selection/preview"
payload = {
"selection": {
"donor_ids": [42],
"selection_mode": "selected_rows",
"hysform_id": 42,
"selected_count": 10,
"query": "Jane",
"filterGroups": [{}],
"savedFilterId": 42,
"fields": ["<string>"],
"sortKey": "display_name",
"sortOrder": "asc",
"column_order": ["<string>"],
"keysArray": ["<string>"],
"filter": "false",
"type": "donor",
"endpoint": "donor",
"Donor_Group": "all",
"selectedTab": "all"
},
"owner_user_id": 42,
"plan": {
"id": 42,
"revision": 1,
"definition_hash": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"steps": [
{
"step_key": "personal_call",
"enabled": True,
"due_date": "2026-11-01",
"assignee_strategy": "invitee_owner",
"assignee_user_id": 42
}
]
}
}
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({
selection: {
donor_ids: [42],
selection_mode: 'selected_rows',
hysform_id: 42,
selected_count: 10,
query: 'Jane',
filterGroups: [{}],
savedFilterId: 42,
fields: ['<string>'],
sortKey: 'display_name',
sortOrder: 'asc',
column_order: ['<string>'],
keysArray: ['<string>'],
filter: 'false',
type: 'donor',
endpoint: 'donor',
Donor_Group: 'all',
selectedTab: 'all'
},
owner_user_id: 42,
plan: {
id: 42,
revision: 1,
definition_hash: 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',
steps: [
{
step_key: 'personal_call',
enabled: true,
due_date: '2026-11-01',
assignee_strategy: 'invitee_owner',
assignee_user_id: 42
}
]
}
})
};
fetch('https://api.gratona.com/v1/admin/events/{eventId}/invitees/selection/preview', 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/events/{eventId}/invitees/selection/preview",
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([
'selection' => [
'donor_ids' => [
42
],
'selection_mode' => 'selected_rows',
'hysform_id' => 42,
'selected_count' => 10,
'query' => 'Jane',
'filterGroups' => [
[
]
],
'savedFilterId' => 42,
'fields' => [
'<string>'
],
'sortKey' => 'display_name',
'sortOrder' => 'asc',
'column_order' => [
'<string>'
],
'keysArray' => [
'<string>'
],
'filter' => 'false',
'type' => 'donor',
'endpoint' => 'donor',
'Donor_Group' => 'all',
'selectedTab' => 'all'
],
'owner_user_id' => 42,
'plan' => [
'id' => 42,
'revision' => 1,
'definition_hash' => 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',
'steps' => [
[
'step_key' => 'personal_call',
'enabled' => true,
'due_date' => '2026-11-01',
'assignee_strategy' => 'invitee_owner',
'assignee_user_id' => 42
]
]
]
]),
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/events/{eventId}/invitees/selection/preview"
payload := strings.NewReader("{\n \"selection\": {\n \"donor_ids\": [\n 42\n ],\n \"selection_mode\": \"selected_rows\",\n \"hysform_id\": 42,\n \"selected_count\": 10,\n \"query\": \"Jane\",\n \"filterGroups\": [\n {}\n ],\n \"savedFilterId\": 42,\n \"fields\": [\n \"<string>\"\n ],\n \"sortKey\": \"display_name\",\n \"sortOrder\": \"asc\",\n \"column_order\": [\n \"<string>\"\n ],\n \"keysArray\": [\n \"<string>\"\n ],\n \"filter\": \"false\",\n \"type\": \"donor\",\n \"endpoint\": \"donor\",\n \"Donor_Group\": \"all\",\n \"selectedTab\": \"all\"\n },\n \"owner_user_id\": 42,\n \"plan\": {\n \"id\": 42,\n \"revision\": 1,\n \"definition_hash\": \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n \"steps\": [\n {\n \"step_key\": \"personal_call\",\n \"enabled\": true,\n \"due_date\": \"2026-11-01\",\n \"assignee_strategy\": \"invitee_owner\",\n \"assignee_user_id\": 42\n }\n ]\n }\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://api.gratona.com/v1/admin/events/{eventId}/invitees/selection/preview")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"selection\": {\n \"donor_ids\": [\n 42\n ],\n \"selection_mode\": \"selected_rows\",\n \"hysform_id\": 42,\n \"selected_count\": 10,\n \"query\": \"Jane\",\n \"filterGroups\": [\n {}\n ],\n \"savedFilterId\": 42,\n \"fields\": [\n \"<string>\"\n ],\n \"sortKey\": \"display_name\",\n \"sortOrder\": \"asc\",\n \"column_order\": [\n \"<string>\"\n ],\n \"keysArray\": [\n \"<string>\"\n ],\n \"filter\": \"false\",\n \"type\": \"donor\",\n \"endpoint\": \"donor\",\n \"Donor_Group\": \"all\",\n \"selectedTab\": \"all\"\n },\n \"owner_user_id\": 42,\n \"plan\": {\n \"id\": 42,\n \"revision\": 1,\n \"definition_hash\": \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n \"steps\": [\n {\n \"step_key\": \"personal_call\",\n \"enabled\": true,\n \"due_date\": \"2026-11-01\",\n \"assignee_strategy\": \"invitee_owner\",\n \"assignee_user_id\": 42\n }\n ]\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.gratona.com/v1/admin/events/{eventId}/invitees/selection/preview")
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 \"selection\": {\n \"donor_ids\": [\n 42\n ],\n \"selection_mode\": \"selected_rows\",\n \"hysform_id\": 42,\n \"selected_count\": 10,\n \"query\": \"Jane\",\n \"filterGroups\": [\n {}\n ],\n \"savedFilterId\": 42,\n \"fields\": [\n \"<string>\"\n ],\n \"sortKey\": \"display_name\",\n \"sortOrder\": \"asc\",\n \"column_order\": [\n \"<string>\"\n ],\n \"keysArray\": [\n \"<string>\"\n ],\n \"filter\": \"false\",\n \"type\": \"donor\",\n \"endpoint\": \"donor\",\n \"Donor_Group\": \"all\",\n \"selectedTab\": \"all\"\n },\n \"owner_user_id\": 42,\n \"plan\": {\n \"id\": 42,\n \"revision\": 1,\n \"definition_hash\": \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n \"steps\": [\n {\n \"step_key\": \"personal_call\",\n \"enabled\": true,\n \"due_date\": \"2026-11-01\",\n \"assignee_strategy\": \"invitee_owner\",\n \"assignee_user_id\": 42\n }\n ]\n }\n}"
response = http.request(request)
puts response.read_body{
"data": {
"preview_token": "issued-preview-token",
"preview_expires_at": "2026-10-20T12:00:00Z",
"event": {
"id": 42,
"name": "Annual Gala"
},
"owner": {
"id": 42,
"name": "Alex Smith"
},
"selection_mode": "selected_rows",
"counts": {
"selected": 42,
"new": 42,
"already_active": 42,
"reactivate": 42,
"skipped": 42,
"staff_tasks": 42
},
"samples": [
{
"id": 42,
"display_name": "Jane Doe",
"email": "j***@example.org"
}
],
"plan": {
"id": 42,
"name": "Personal invitation",
"revision": 1,
"definition_hash": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"steps": [
{
"step_key": "personal_call",
"label": "Personal call",
"task_title_template": "Call {donor_name} about {event_name}",
"invitation_method": "phone_call",
"days_before_event": 28,
"due_date": "2026-11-01",
"assignee_strategy": "invitee_owner",
"resolved_assignee_user_id": 42,
"assignee_user_id": 42,
"enabled": false
}
],
"enabled_step_count": 42,
"new_task_count": 42
},
"communications_sent": false,
"notice": "No messages will be sent."
}
}{
"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"
}{
"message": "Version, idempotency, preview or archived-event conflict.",
"error_code": "event_invitee_conflict",
"details": {
"current_version": 42,
"current_lock_version": 42,
"current_revision": 42,
"current_definition_hash": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
}
}{
"errors": {},
"status": "error",
"message": "The given data was invalid."
}