Queue bulk fundraising gift acknowledgement
Returns202 with a durable operation receipt. Supply donation_ids, or select_all_matching=true with validated transaction filters. Selection is restricted to readable unacknowledged gifts and excludes Do Not Acknowledge. Poll status_url for completion; queue acceptance does not imply gifts are already updated. Requires permission: one of donations.
curl --request POST \
--url https://api.gratona.com/v1/admin/donations/acknowledge \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"donation_ids": [
1
],
"select_all_matching": true,
"filters": {
"acknowledgement_work_scope": "active",
"fundraiser_user_id": "all",
"group_by_household": "Group By Household",
"search": "education",
"date_from": "2026-10-20T12:00:00Z",
"date_to": "2026-10-20T12:00:00Z",
"state": "State",
"comparison_mode": "Comparison Mode",
"current_start": "2026-10-20T12:00:00Z",
"current_end": "2026-10-20T12:00:00Z",
"comparison_start": "2026-10-20T12:00:00Z",
"comparison_end": "2026-10-20T12:00:00Z",
"refresh": true,
"page": 1,
"per_page": 10,
"donor_id": 1,
"method": "Method",
"acknowledgement_status": "all",
"acknowledgement_scope": "period",
"status_scope": "qualified",
"sort_field": "date",
"sort_direction": "asc"
},
"source": "Source",
"note": "Discuss the next update with the program team."
}
'import requests
url = "https://api.gratona.com/v1/admin/donations/acknowledge"
payload = {
"donation_ids": [1],
"select_all_matching": True,
"filters": {
"acknowledgement_work_scope": "active",
"fundraiser_user_id": "all",
"group_by_household": "Group By Household",
"search": "education",
"date_from": "2026-10-20T12:00:00Z",
"date_to": "2026-10-20T12:00:00Z",
"state": "State",
"comparison_mode": "Comparison Mode",
"current_start": "2026-10-20T12:00:00Z",
"current_end": "2026-10-20T12:00:00Z",
"comparison_start": "2026-10-20T12:00:00Z",
"comparison_end": "2026-10-20T12:00:00Z",
"refresh": True,
"page": 1,
"per_page": 10,
"donor_id": 1,
"method": "Method",
"acknowledgement_status": "all",
"acknowledgement_scope": "period",
"status_scope": "qualified",
"sort_field": "date",
"sort_direction": "asc"
},
"source": "Source",
"note": "Discuss the next update with the program team."
}
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({
donation_ids: [1],
select_all_matching: true,
filters: {
acknowledgement_work_scope: 'active',
fundraiser_user_id: 'all',
group_by_household: 'Group By Household',
search: 'education',
date_from: '2026-10-20T12:00:00Z',
date_to: '2026-10-20T12:00:00Z',
state: 'State',
comparison_mode: 'Comparison Mode',
current_start: '2026-10-20T12:00:00Z',
current_end: '2026-10-20T12:00:00Z',
comparison_start: '2026-10-20T12:00:00Z',
comparison_end: '2026-10-20T12:00:00Z',
refresh: true,
page: 1,
per_page: 10,
donor_id: 1,
method: 'Method',
acknowledgement_status: 'all',
acknowledgement_scope: 'period',
status_scope: 'qualified',
sort_field: 'date',
sort_direction: 'asc'
},
source: 'Source',
note: 'Discuss the next update with the program team.'
})
};
fetch('https://api.gratona.com/v1/admin/donations/acknowledge', 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/donations/acknowledge",
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([
'donation_ids' => [
1
],
'select_all_matching' => true,
'filters' => [
'acknowledgement_work_scope' => 'active',
'fundraiser_user_id' => 'all',
'group_by_household' => 'Group By Household',
'search' => 'education',
'date_from' => '2026-10-20T12:00:00Z',
'date_to' => '2026-10-20T12:00:00Z',
'state' => 'State',
'comparison_mode' => 'Comparison Mode',
'current_start' => '2026-10-20T12:00:00Z',
'current_end' => '2026-10-20T12:00:00Z',
'comparison_start' => '2026-10-20T12:00:00Z',
'comparison_end' => '2026-10-20T12:00:00Z',
'refresh' => true,
'page' => 1,
'per_page' => 10,
'donor_id' => 1,
'method' => 'Method',
'acknowledgement_status' => 'all',
'acknowledgement_scope' => 'period',
'status_scope' => 'qualified',
'sort_field' => 'date',
'sort_direction' => 'asc'
],
'source' => 'Source',
'note' => 'Discuss the next update with the program team.'
]),
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/donations/acknowledge"
payload := strings.NewReader("{\n \"donation_ids\": [\n 1\n ],\n \"select_all_matching\": true,\n \"filters\": {\n \"acknowledgement_work_scope\": \"active\",\n \"fundraiser_user_id\": \"all\",\n \"group_by_household\": \"Group By Household\",\n \"search\": \"education\",\n \"date_from\": \"2026-10-20T12:00:00Z\",\n \"date_to\": \"2026-10-20T12:00:00Z\",\n \"state\": \"State\",\n \"comparison_mode\": \"Comparison Mode\",\n \"current_start\": \"2026-10-20T12:00:00Z\",\n \"current_end\": \"2026-10-20T12:00:00Z\",\n \"comparison_start\": \"2026-10-20T12:00:00Z\",\n \"comparison_end\": \"2026-10-20T12:00:00Z\",\n \"refresh\": true,\n \"page\": 1,\n \"per_page\": 10,\n \"donor_id\": 1,\n \"method\": \"Method\",\n \"acknowledgement_status\": \"all\",\n \"acknowledgement_scope\": \"period\",\n \"status_scope\": \"qualified\",\n \"sort_field\": \"date\",\n \"sort_direction\": \"asc\"\n },\n \"source\": \"Source\",\n \"note\": \"Discuss the next update with the program team.\"\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/donations/acknowledge")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"donation_ids\": [\n 1\n ],\n \"select_all_matching\": true,\n \"filters\": {\n \"acknowledgement_work_scope\": \"active\",\n \"fundraiser_user_id\": \"all\",\n \"group_by_household\": \"Group By Household\",\n \"search\": \"education\",\n \"date_from\": \"2026-10-20T12:00:00Z\",\n \"date_to\": \"2026-10-20T12:00:00Z\",\n \"state\": \"State\",\n \"comparison_mode\": \"Comparison Mode\",\n \"current_start\": \"2026-10-20T12:00:00Z\",\n \"current_end\": \"2026-10-20T12:00:00Z\",\n \"comparison_start\": \"2026-10-20T12:00:00Z\",\n \"comparison_end\": \"2026-10-20T12:00:00Z\",\n \"refresh\": true,\n \"page\": 1,\n \"per_page\": 10,\n \"donor_id\": 1,\n \"method\": \"Method\",\n \"acknowledgement_status\": \"all\",\n \"acknowledgement_scope\": \"period\",\n \"status_scope\": \"qualified\",\n \"sort_field\": \"date\",\n \"sort_direction\": \"asc\"\n },\n \"source\": \"Source\",\n \"note\": \"Discuss the next update with the program team.\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.gratona.com/v1/admin/donations/acknowledge")
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 \"donation_ids\": [\n 1\n ],\n \"select_all_matching\": true,\n \"filters\": {\n \"acknowledgement_work_scope\": \"active\",\n \"fundraiser_user_id\": \"all\",\n \"group_by_household\": \"Group By Household\",\n \"search\": \"education\",\n \"date_from\": \"2026-10-20T12:00:00Z\",\n \"date_to\": \"2026-10-20T12:00:00Z\",\n \"state\": \"State\",\n \"comparison_mode\": \"Comparison Mode\",\n \"current_start\": \"2026-10-20T12:00:00Z\",\n \"current_end\": \"2026-10-20T12:00:00Z\",\n \"comparison_start\": \"2026-10-20T12:00:00Z\",\n \"comparison_end\": \"2026-10-20T12:00:00Z\",\n \"refresh\": true,\n \"page\": 1,\n \"per_page\": 10,\n \"donor_id\": 1,\n \"method\": \"Method\",\n \"acknowledgement_status\": \"all\",\n \"acknowledgement_scope\": \"period\",\n \"status_scope\": \"qualified\",\n \"sort_field\": \"date\",\n \"sort_direction\": \"asc\"\n },\n \"source\": \"Source\",\n \"note\": \"Discuss the next update with the program team.\"\n}"
response = http.request(request)
puts response.read_body{
"status": "success",
"data": {
"bulk_operation": {
"operation_id": "550e8400-e29b-41d4-a716-446655440000",
"type": "Example",
"status": "Example",
"total_items": 2,
"processed_items": 2,
"failed_items": 2,
"skipped_items": 2,
"updated_items": 2,
"progress_percent": 25,
"message": "Example",
"created_at": "2026-10-20T12:00:00Z",
"updated_at": "2026-10-20T12:00:00Z",
"completed_at": "2026-10-20T12:00:00Z",
"stalled": true,
"failed_record_ids": [
42
],
"has_failed_records": true,
"skipped_reasons": {},
"context": "<unknown>"
},
"status_url": "/api/v1/admin/bulk-edit-operations/550e8400-e29b-41d4-a716-446655440000"
}
}{
"message": "Unauthorized",
"status": "error"
}{
"errors": {},
"status": "error",
"message": "The given data was invalid."
}Authorizations
Passport bearer token authentication for legacy admin sessions.
Body
Validated request fields for this operation.
Required when select_all_matching is false or omitted; readable gift ids.
1Donation ids item. Validation: integer.
Select all matching. Validation: nullable, boolean.
true
Required when select_all_matching is true; uses the transaction filter contract. Pagination is ignored.
Show child attributes
Show child attributes
Source. Validation: nullable, string, max:64.
64"Source"
Note. Validation: nullable, string, max:1000.
1000"Discuss the next update with the program team."
curl --request POST \
--url https://api.gratona.com/v1/admin/donations/acknowledge \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"donation_ids": [
1
],
"select_all_matching": true,
"filters": {
"acknowledgement_work_scope": "active",
"fundraiser_user_id": "all",
"group_by_household": "Group By Household",
"search": "education",
"date_from": "2026-10-20T12:00:00Z",
"date_to": "2026-10-20T12:00:00Z",
"state": "State",
"comparison_mode": "Comparison Mode",
"current_start": "2026-10-20T12:00:00Z",
"current_end": "2026-10-20T12:00:00Z",
"comparison_start": "2026-10-20T12:00:00Z",
"comparison_end": "2026-10-20T12:00:00Z",
"refresh": true,
"page": 1,
"per_page": 10,
"donor_id": 1,
"method": "Method",
"acknowledgement_status": "all",
"acknowledgement_scope": "period",
"status_scope": "qualified",
"sort_field": "date",
"sort_direction": "asc"
},
"source": "Source",
"note": "Discuss the next update with the program team."
}
'import requests
url = "https://api.gratona.com/v1/admin/donations/acknowledge"
payload = {
"donation_ids": [1],
"select_all_matching": True,
"filters": {
"acknowledgement_work_scope": "active",
"fundraiser_user_id": "all",
"group_by_household": "Group By Household",
"search": "education",
"date_from": "2026-10-20T12:00:00Z",
"date_to": "2026-10-20T12:00:00Z",
"state": "State",
"comparison_mode": "Comparison Mode",
"current_start": "2026-10-20T12:00:00Z",
"current_end": "2026-10-20T12:00:00Z",
"comparison_start": "2026-10-20T12:00:00Z",
"comparison_end": "2026-10-20T12:00:00Z",
"refresh": True,
"page": 1,
"per_page": 10,
"donor_id": 1,
"method": "Method",
"acknowledgement_status": "all",
"acknowledgement_scope": "period",
"status_scope": "qualified",
"sort_field": "date",
"sort_direction": "asc"
},
"source": "Source",
"note": "Discuss the next update with the program team."
}
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({
donation_ids: [1],
select_all_matching: true,
filters: {
acknowledgement_work_scope: 'active',
fundraiser_user_id: 'all',
group_by_household: 'Group By Household',
search: 'education',
date_from: '2026-10-20T12:00:00Z',
date_to: '2026-10-20T12:00:00Z',
state: 'State',
comparison_mode: 'Comparison Mode',
current_start: '2026-10-20T12:00:00Z',
current_end: '2026-10-20T12:00:00Z',
comparison_start: '2026-10-20T12:00:00Z',
comparison_end: '2026-10-20T12:00:00Z',
refresh: true,
page: 1,
per_page: 10,
donor_id: 1,
method: 'Method',
acknowledgement_status: 'all',
acknowledgement_scope: 'period',
status_scope: 'qualified',
sort_field: 'date',
sort_direction: 'asc'
},
source: 'Source',
note: 'Discuss the next update with the program team.'
})
};
fetch('https://api.gratona.com/v1/admin/donations/acknowledge', 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/donations/acknowledge",
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([
'donation_ids' => [
1
],
'select_all_matching' => true,
'filters' => [
'acknowledgement_work_scope' => 'active',
'fundraiser_user_id' => 'all',
'group_by_household' => 'Group By Household',
'search' => 'education',
'date_from' => '2026-10-20T12:00:00Z',
'date_to' => '2026-10-20T12:00:00Z',
'state' => 'State',
'comparison_mode' => 'Comparison Mode',
'current_start' => '2026-10-20T12:00:00Z',
'current_end' => '2026-10-20T12:00:00Z',
'comparison_start' => '2026-10-20T12:00:00Z',
'comparison_end' => '2026-10-20T12:00:00Z',
'refresh' => true,
'page' => 1,
'per_page' => 10,
'donor_id' => 1,
'method' => 'Method',
'acknowledgement_status' => 'all',
'acknowledgement_scope' => 'period',
'status_scope' => 'qualified',
'sort_field' => 'date',
'sort_direction' => 'asc'
],
'source' => 'Source',
'note' => 'Discuss the next update with the program team.'
]),
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/donations/acknowledge"
payload := strings.NewReader("{\n \"donation_ids\": [\n 1\n ],\n \"select_all_matching\": true,\n \"filters\": {\n \"acknowledgement_work_scope\": \"active\",\n \"fundraiser_user_id\": \"all\",\n \"group_by_household\": \"Group By Household\",\n \"search\": \"education\",\n \"date_from\": \"2026-10-20T12:00:00Z\",\n \"date_to\": \"2026-10-20T12:00:00Z\",\n \"state\": \"State\",\n \"comparison_mode\": \"Comparison Mode\",\n \"current_start\": \"2026-10-20T12:00:00Z\",\n \"current_end\": \"2026-10-20T12:00:00Z\",\n \"comparison_start\": \"2026-10-20T12:00:00Z\",\n \"comparison_end\": \"2026-10-20T12:00:00Z\",\n \"refresh\": true,\n \"page\": 1,\n \"per_page\": 10,\n \"donor_id\": 1,\n \"method\": \"Method\",\n \"acknowledgement_status\": \"all\",\n \"acknowledgement_scope\": \"period\",\n \"status_scope\": \"qualified\",\n \"sort_field\": \"date\",\n \"sort_direction\": \"asc\"\n },\n \"source\": \"Source\",\n \"note\": \"Discuss the next update with the program team.\"\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/donations/acknowledge")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"donation_ids\": [\n 1\n ],\n \"select_all_matching\": true,\n \"filters\": {\n \"acknowledgement_work_scope\": \"active\",\n \"fundraiser_user_id\": \"all\",\n \"group_by_household\": \"Group By Household\",\n \"search\": \"education\",\n \"date_from\": \"2026-10-20T12:00:00Z\",\n \"date_to\": \"2026-10-20T12:00:00Z\",\n \"state\": \"State\",\n \"comparison_mode\": \"Comparison Mode\",\n \"current_start\": \"2026-10-20T12:00:00Z\",\n \"current_end\": \"2026-10-20T12:00:00Z\",\n \"comparison_start\": \"2026-10-20T12:00:00Z\",\n \"comparison_end\": \"2026-10-20T12:00:00Z\",\n \"refresh\": true,\n \"page\": 1,\n \"per_page\": 10,\n \"donor_id\": 1,\n \"method\": \"Method\",\n \"acknowledgement_status\": \"all\",\n \"acknowledgement_scope\": \"period\",\n \"status_scope\": \"qualified\",\n \"sort_field\": \"date\",\n \"sort_direction\": \"asc\"\n },\n \"source\": \"Source\",\n \"note\": \"Discuss the next update with the program team.\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.gratona.com/v1/admin/donations/acknowledge")
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 \"donation_ids\": [\n 1\n ],\n \"select_all_matching\": true,\n \"filters\": {\n \"acknowledgement_work_scope\": \"active\",\n \"fundraiser_user_id\": \"all\",\n \"group_by_household\": \"Group By Household\",\n \"search\": \"education\",\n \"date_from\": \"2026-10-20T12:00:00Z\",\n \"date_to\": \"2026-10-20T12:00:00Z\",\n \"state\": \"State\",\n \"comparison_mode\": \"Comparison Mode\",\n \"current_start\": \"2026-10-20T12:00:00Z\",\n \"current_end\": \"2026-10-20T12:00:00Z\",\n \"comparison_start\": \"2026-10-20T12:00:00Z\",\n \"comparison_end\": \"2026-10-20T12:00:00Z\",\n \"refresh\": true,\n \"page\": 1,\n \"per_page\": 10,\n \"donor_id\": 1,\n \"method\": \"Method\",\n \"acknowledgement_status\": \"all\",\n \"acknowledgement_scope\": \"period\",\n \"status_scope\": \"qualified\",\n \"sort_field\": \"date\",\n \"sort_direction\": \"asc\"\n },\n \"source\": \"Source\",\n \"note\": \"Discuss the next update with the program team.\"\n}"
response = http.request(request)
puts response.read_body{
"status": "success",
"data": {
"bulk_operation": {
"operation_id": "550e8400-e29b-41d4-a716-446655440000",
"type": "Example",
"status": "Example",
"total_items": 2,
"processed_items": 2,
"failed_items": 2,
"skipped_items": 2,
"updated_items": 2,
"progress_percent": 25,
"message": "Example",
"created_at": "2026-10-20T12:00:00Z",
"updated_at": "2026-10-20T12:00:00Z",
"completed_at": "2026-10-20T12:00:00Z",
"stalled": true,
"failed_record_ids": [
42
],
"has_failed_records": true,
"skipped_reasons": {},
"context": "<unknown>"
},
"status_url": "/api/v1/admin/bulk-edit-operations/550e8400-e29b-41d4-a716-446655440000"
}
}{
"message": "Unauthorized",
"status": "error"
}{
"errors": {},
"status": "error",
"message": "The given data was invalid."
}