Read fundraising donor cohorts
Compares qualified financial-ledger donor/household totals across current and comparison windows using configured upgrade/downgrade thresholds. Returns summaries/explanation and up to50 rows per bucket. Requires permission: one of donors_view.
curl --request GET \
--url https://api.gratona.com/v1/admin/fundraising/cohorts \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.gratona.com/v1/admin/fundraising/cohorts"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.gratona.com/v1/admin/fundraising/cohorts', 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/fundraising/cohorts",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.gratona.com/v1/admin/fundraising/cohorts"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.gratona.com/v1/admin/fundraising/cohorts")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.gratona.com/v1/admin/fundraising/cohorts")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"status": "success",
"data": {
"periods": {
"mode": "ytd_vs_last_year_ytd",
"current_start": "2026-10-20",
"current_end": "2026-10-20",
"comparison_start": "2026-10-20",
"comparison_end": "2026-10-20",
"current": {
"start": "2026-10-20",
"end": "2026-10-20",
"label": "Example"
},
"comparison": {
"start": "2026-10-20",
"end": "2026-10-20",
"label": "Example"
}
},
"summary": {
"current_donors": {
"count": 2,
"amount": 25,
"donor_ids": [
42
]
},
"new_donors": {
"count": 2,
"amount": 25,
"donor_ids": [
42
]
},
"lost_donors": {
"count": 2,
"amount": 25,
"donor_ids": [
42
]
},
"upgraded_donors": {
"count": 2,
"amount": 25,
"donor_ids": [
42
]
},
"downgraded_donors": {
"count": 2,
"amount": 25,
"donor_ids": [
42
]
},
"maintained_donors": {
"count": 2,
"amount": 25,
"donor_ids": [
42
]
},
"retained_donors": {
"count": 2,
"amount": 25,
"donor_ids": [
42
]
}
},
"explanation": {
"current_revenue": 25,
"comparison_revenue": 25,
"revenue_change": 25,
"new_revenue": 25,
"lost_revenue": 25,
"upgrade_change": 25,
"downgrade_change": 25,
"maintained_change": 25,
"reconciled_revenue_change": 25,
"current_donors": 2,
"comparison_donors": 2,
"donor_change": 2,
"new_donors": 2,
"lost_donors": 2
},
"buckets": {
"current_donors": [
{
"key": "Example",
"donor_id": 2,
"donor_email": "Example",
"donor_name": "Example",
"household_id": 2,
"state": "Example",
"amount": 25,
"gift_count": 2,
"last_gift_date": "2026-10-20",
"assigned_fundraiser_user_id": 2,
"assigned_fundraiser_name": "Example",
"relationship_manager_user_id": 2,
"relationship_manager_name": "Example",
"current_amount": 25,
"previous_amount": 25,
"change_pct": 25,
"transaction_evidence": {
"current": {
"items": [
{
"id": 2,
"donor_id": 2,
"donor_name": "Example",
"donor_email": "Example",
"amount": 25,
"gross_amount": 25,
"currency": "Example",
"date": "2026-10-20",
"method": "Example",
"method_id": 3,
"method_detail": {
"provider": "Example",
"provider_label": "Example",
"source_method": "Example",
"source_processor": "Example"
},
"type": "Example",
"result": "Example",
"transaction_status": "Example",
"acknowledged": "Example",
"acknowledgement_excluded": "Example",
"acknowledged_at": "2026-10-20T12:00:00Z",
"acknowledged_by_user_id": 2,
"acknowledgement_source": "Example",
"assigned_fundraiser_name": "Example",
"city": "Example",
"state": "Example",
"relationship_manager_name": "Example"
}
],
"summary": {
"total_count": 2,
"total_amount": 25,
"unacknowledged_count": 2
}
},
"comparison": {
"items": [
{
"id": 2,
"donor_id": 2,
"donor_name": "Example",
"donor_email": "Example",
"amount": 25,
"gross_amount": 25,
"currency": "Example",
"date": "2026-10-20",
"method": "Example",
"method_id": 3,
"method_detail": {
"provider": "Example",
"provider_label": "Example",
"source_method": "Example",
"source_processor": "Example"
},
"type": "Example",
"result": "Example",
"transaction_status": "Example",
"acknowledged": "Example",
"acknowledgement_excluded": "Example",
"acknowledged_at": "2026-10-20T12:00:00Z",
"acknowledged_by_user_id": 2,
"acknowledgement_source": "Example",
"assigned_fundraiser_name": "Example",
"city": "Example",
"state": "Example",
"relationship_manager_name": "Example"
}
],
"summary": {
"total_count": 2,
"total_amount": 25,
"unacknowledged_count": 2
}
}
}
}
],
"new_donors": [
{
"key": "Example",
"donor_id": 2,
"donor_email": "Example",
"donor_name": "Example",
"household_id": 2,
"state": "Example",
"amount": 25,
"gift_count": 2,
"last_gift_date": "2026-10-20",
"assigned_fundraiser_user_id": 2,
"assigned_fundraiser_name": "Example",
"relationship_manager_user_id": 2,
"relationship_manager_name": "Example",
"current_amount": 25,
"previous_amount": 25,
"change_pct": 25,
"transaction_evidence": {
"current": {
"items": [
{
"id": 2,
"donor_id": 2,
"donor_name": "Example",
"donor_email": "Example",
"amount": 25,
"gross_amount": 25,
"currency": "Example",
"date": "2026-10-20",
"method": "Example",
"method_id": 3,
"method_detail": {
"provider": "Example",
"provider_label": "Example",
"source_method": "Example",
"source_processor": "Example"
},
"type": "Example",
"result": "Example",
"transaction_status": "Example",
"acknowledged": "Example",
"acknowledgement_excluded": "Example",
"acknowledged_at": "2026-10-20T12:00:00Z",
"acknowledged_by_user_id": 2,
"acknowledgement_source": "Example",
"assigned_fundraiser_name": "Example",
"city": "Example",
"state": "Example",
"relationship_manager_name": "Example"
}
],
"summary": {
"total_count": 2,
"total_amount": 25,
"unacknowledged_count": 2
}
},
"comparison": {
"items": [
{
"id": 2,
"donor_id": 2,
"donor_name": "Example",
"donor_email": "Example",
"amount": 25,
"gross_amount": 25,
"currency": "Example",
"date": "2026-10-20",
"method": "Example",
"method_id": 3,
"method_detail": {
"provider": "Example",
"provider_label": "Example",
"source_method": "Example",
"source_processor": "Example"
},
"type": "Example",
"result": "Example",
"transaction_status": "Example",
"acknowledged": "Example",
"acknowledgement_excluded": "Example",
"acknowledged_at": "2026-10-20T12:00:00Z",
"acknowledged_by_user_id": 2,
"acknowledgement_source": "Example",
"assigned_fundraiser_name": "Example",
"city": "Example",
"state": "Example",
"relationship_manager_name": "Example"
}
],
"summary": {
"total_count": 2,
"total_amount": 25,
"unacknowledged_count": 2
}
}
}
}
],
"lost_donors": [
{
"key": "Example",
"donor_id": 2,
"donor_email": "Example",
"donor_name": "Example",
"household_id": 2,
"state": "Example",
"amount": 25,
"gift_count": 2,
"last_gift_date": "2026-10-20",
"assigned_fundraiser_user_id": 2,
"assigned_fundraiser_name": "Example",
"relationship_manager_user_id": 2,
"relationship_manager_name": "Example",
"current_amount": 25,
"previous_amount": 25,
"change_pct": 25,
"transaction_evidence": {
"current": {
"items": [
{
"id": 2,
"donor_id": 2,
"donor_name": "Example",
"donor_email": "Example",
"amount": 25,
"gross_amount": 25,
"currency": "Example",
"date": "2026-10-20",
"method": "Example",
"method_id": 3,
"method_detail": {
"provider": "Example",
"provider_label": "Example",
"source_method": "Example",
"source_processor": "Example"
},
"type": "Example",
"result": "Example",
"transaction_status": "Example",
"acknowledged": "Example",
"acknowledgement_excluded": "Example",
"acknowledged_at": "2026-10-20T12:00:00Z",
"acknowledged_by_user_id": 2,
"acknowledgement_source": "Example",
"assigned_fundraiser_name": "Example",
"city": "Example",
"state": "Example",
"relationship_manager_name": "Example"
}
],
"summary": {
"total_count": 2,
"total_amount": 25,
"unacknowledged_count": 2
}
},
"comparison": {
"items": [
{
"id": 2,
"donor_id": 2,
"donor_name": "Example",
"donor_email": "Example",
"amount": 25,
"gross_amount": 25,
"currency": "Example",
"date": "2026-10-20",
"method": "Example",
"method_id": 3,
"method_detail": {
"provider": "Example",
"provider_label": "Example",
"source_method": "Example",
"source_processor": "Example"
},
"type": "Example",
"result": "Example",
"transaction_status": "Example",
"acknowledged": "Example",
"acknowledgement_excluded": "Example",
"acknowledged_at": "2026-10-20T12:00:00Z",
"acknowledged_by_user_id": 2,
"acknowledgement_source": "Example",
"assigned_fundraiser_name": "Example",
"city": "Example",
"state": "Example",
"relationship_manager_name": "Example"
}
],
"summary": {
"total_count": 2,
"total_amount": 25,
"unacknowledged_count": 2
}
}
}
}
],
"upgraded_donors": [
{
"key": "Example",
"donor_id": 2,
"donor_email": "Example",
"donor_name": "Example",
"household_id": 2,
"state": "Example",
"amount": 25,
"gift_count": 2,
"last_gift_date": "2026-10-20",
"assigned_fundraiser_user_id": 2,
"assigned_fundraiser_name": "Example",
"relationship_manager_user_id": 2,
"relationship_manager_name": "Example",
"current_amount": 25,
"previous_amount": 25,
"change_pct": 25,
"transaction_evidence": {
"current": {
"items": [
{
"id": 2,
"donor_id": 2,
"donor_name": "Example",
"donor_email": "Example",
"amount": 25,
"gross_amount": 25,
"currency": "Example",
"date": "2026-10-20",
"method": "Example",
"method_id": 3,
"method_detail": {
"provider": "Example",
"provider_label": "Example",
"source_method": "Example",
"source_processor": "Example"
},
"type": "Example",
"result": "Example",
"transaction_status": "Example",
"acknowledged": "Example",
"acknowledgement_excluded": "Example",
"acknowledged_at": "2026-10-20T12:00:00Z",
"acknowledged_by_user_id": 2,
"acknowledgement_source": "Example",
"assigned_fundraiser_name": "Example",
"city": "Example",
"state": "Example",
"relationship_manager_name": "Example"
}
],
"summary": {
"total_count": 2,
"total_amount": 25,
"unacknowledged_count": 2
}
},
"comparison": {
"items": [
{
"id": 2,
"donor_id": 2,
"donor_name": "Example",
"donor_email": "Example",
"amount": 25,
"gross_amount": 25,
"currency": "Example",
"date": "2026-10-20",
"method": "Example",
"method_id": 3,
"method_detail": {
"provider": "Example",
"provider_label": "Example",
"source_method": "Example",
"source_processor": "Example"
},
"type": "Example",
"result": "Example",
"transaction_status": "Example",
"acknowledged": "Example",
"acknowledgement_excluded": "Example",
"acknowledged_at": "2026-10-20T12:00:00Z",
"acknowledged_by_user_id": 2,
"acknowledgement_source": "Example",
"assigned_fundraiser_name": "Example",
"city": "Example",
"state": "Example",
"relationship_manager_name": "Example"
}
],
"summary": {
"total_count": 2,
"total_amount": 25,
"unacknowledged_count": 2
}
}
}
}
],
"downgraded_donors": [
{
"key": "Example",
"donor_id": 2,
"donor_email": "Example",
"donor_name": "Example",
"household_id": 2,
"state": "Example",
"amount": 25,
"gift_count": 2,
"last_gift_date": "2026-10-20",
"assigned_fundraiser_user_id": 2,
"assigned_fundraiser_name": "Example",
"relationship_manager_user_id": 2,
"relationship_manager_name": "Example",
"current_amount": 25,
"previous_amount": 25,
"change_pct": 25,
"transaction_evidence": {
"current": {
"items": [
{
"id": 2,
"donor_id": 2,
"donor_name": "Example",
"donor_email": "Example",
"amount": 25,
"gross_amount": 25,
"currency": "Example",
"date": "2026-10-20",
"method": "Example",
"method_id": 3,
"method_detail": {
"provider": "Example",
"provider_label": "Example",
"source_method": "Example",
"source_processor": "Example"
},
"type": "Example",
"result": "Example",
"transaction_status": "Example",
"acknowledged": "Example",
"acknowledgement_excluded": "Example",
"acknowledged_at": "2026-10-20T12:00:00Z",
"acknowledged_by_user_id": 2,
"acknowledgement_source": "Example",
"assigned_fundraiser_name": "Example",
"city": "Example",
"state": "Example",
"relationship_manager_name": "Example"
}
],
"summary": {
"total_count": 2,
"total_amount": 25,
"unacknowledged_count": 2
}
},
"comparison": {
"items": [
{
"id": 2,
"donor_id": 2,
"donor_name": "Example",
"donor_email": "Example",
"amount": 25,
"gross_amount": 25,
"currency": "Example",
"date": "2026-10-20",
"method": "Example",
"method_id": 3,
"method_detail": {
"provider": "Example",
"provider_label": "Example",
"source_method": "Example",
"source_processor": "Example"
},
"type": "Example",
"result": "Example",
"transaction_status": "Example",
"acknowledged": "Example",
"acknowledgement_excluded": "Example",
"acknowledged_at": "2026-10-20T12:00:00Z",
"acknowledged_by_user_id": 2,
"acknowledgement_source": "Example",
"assigned_fundraiser_name": "Example",
"city": "Example",
"state": "Example",
"relationship_manager_name": "Example"
}
],
"summary": {
"total_count": 2,
"total_amount": 25,
"unacknowledged_count": 2
}
}
}
}
],
"maintained_donors": [
{
"key": "Example",
"donor_id": 2,
"donor_email": "Example",
"donor_name": "Example",
"household_id": 2,
"state": "Example",
"amount": 25,
"gift_count": 2,
"last_gift_date": "2026-10-20",
"assigned_fundraiser_user_id": 2,
"assigned_fundraiser_name": "Example",
"relationship_manager_user_id": 2,
"relationship_manager_name": "Example",
"current_amount": 25,
"previous_amount": 25,
"change_pct": 25,
"transaction_evidence": {
"current": {
"items": [
{
"id": 2,
"donor_id": 2,
"donor_name": "Example",
"donor_email": "Example",
"amount": 25,
"gross_amount": 25,
"currency": "Example",
"date": "2026-10-20",
"method": "Example",
"method_id": 3,
"method_detail": {
"provider": "Example",
"provider_label": "Example",
"source_method": "Example",
"source_processor": "Example"
},
"type": "Example",
"result": "Example",
"transaction_status": "Example",
"acknowledged": "Example",
"acknowledgement_excluded": "Example",
"acknowledged_at": "2026-10-20T12:00:00Z",
"acknowledged_by_user_id": 2,
"acknowledgement_source": "Example",
"assigned_fundraiser_name": "Example",
"city": "Example",
"state": "Example",
"relationship_manager_name": "Example"
}
],
"summary": {
"total_count": 2,
"total_amount": 25,
"unacknowledged_count": 2
}
},
"comparison": {
"items": [
{
"id": 2,
"donor_id": 2,
"donor_name": "Example",
"donor_email": "Example",
"amount": 25,
"gross_amount": 25,
"currency": "Example",
"date": "2026-10-20",
"method": "Example",
"method_id": 3,
"method_detail": {
"provider": "Example",
"provider_label": "Example",
"source_method": "Example",
"source_processor": "Example"
},
"type": "Example",
"result": "Example",
"transaction_status": "Example",
"acknowledged": "Example",
"acknowledgement_excluded": "Example",
"acknowledged_at": "2026-10-20T12:00:00Z",
"acknowledged_by_user_id": 2,
"acknowledgement_source": "Example",
"assigned_fundraiser_name": "Example",
"city": "Example",
"state": "Example",
"relationship_manager_name": "Example"
}
],
"summary": {
"total_count": 2,
"total_amount": 25,
"unacknowledged_count": 2
}
}
}
}
],
"retained_donors": [
{
"key": "Example",
"donor_id": 2,
"donor_email": "Example",
"donor_name": "Example",
"household_id": 2,
"state": "Example",
"amount": 25,
"gift_count": 2,
"last_gift_date": "2026-10-20",
"assigned_fundraiser_user_id": 2,
"assigned_fundraiser_name": "Example",
"relationship_manager_user_id": 2,
"relationship_manager_name": "Example",
"current_amount": 25,
"previous_amount": 25,
"change_pct": 25,
"transaction_evidence": {
"current": {
"items": [
{
"id": 2,
"donor_id": 2,
"donor_name": "Example",
"donor_email": "Example",
"amount": 25,
"gross_amount": 25,
"currency": "Example",
"date": "2026-10-20",
"method": "Example",
"method_id": 3,
"method_detail": {
"provider": "Example",
"provider_label": "Example",
"source_method": "Example",
"source_processor": "Example"
},
"type": "Example",
"result": "Example",
"transaction_status": "Example",
"acknowledged": "Example",
"acknowledgement_excluded": "Example",
"acknowledged_at": "2026-10-20T12:00:00Z",
"acknowledged_by_user_id": 2,
"acknowledgement_source": "Example",
"assigned_fundraiser_name": "Example",
"city": "Example",
"state": "Example",
"relationship_manager_name": "Example"
}
],
"summary": {
"total_count": 2,
"total_amount": 25,
"unacknowledged_count": 2
}
},
"comparison": {
"items": [
{
"id": 2,
"donor_id": 2,
"donor_name": "Example",
"donor_email": "Example",
"amount": 25,
"gross_amount": 25,
"currency": "Example",
"date": "2026-10-20",
"method": "Example",
"method_id": 3,
"method_detail": {
"provider": "Example",
"provider_label": "Example",
"source_method": "Example",
"source_processor": "Example"
},
"type": "Example",
"result": "Example",
"transaction_status": "Example",
"acknowledged": "Example",
"acknowledgement_excluded": "Example",
"acknowledged_at": "2026-10-20T12:00:00Z",
"acknowledged_by_user_id": 2,
"acknowledgement_source": "Example",
"assigned_fundraiser_name": "Example",
"city": "Example",
"state": "Example",
"relationship_manager_name": "Example"
}
],
"summary": {
"total_count": 2,
"total_amount": 25,
"unacknowledged_count": 2
}
}
}
}
]
}
}
}{
"message": "Unauthorized",
"status": "error"
}{
"errors": {},
"status": "error",
"message": "The given data was invalid."
}Authorizations
Passport bearer token authentication for legacy admin sessions.
Query Parameters
Acknowledgement work scope. Validation: nullable; allowed values: active, historical, all.
active, historical, all, null Relationship-manager id, all or unassigned; scoped by donor visibility.
64Boolean-like query input; true/false and numeric forms are normalized by this workflow.
Search. Validation: nullable, string, max:255.
255Date from. Validation: nullable, date.
Date to. Validation: nullable, date.
State. Validation: nullable, string, max:64.
64Comparison mode. Validation: nullable, string, max:64.
64Current start. Validation: nullable, date.
Current end. Validation: nullable, date.
Comparison start. Validation: nullable, date.
Comparison end. Validation: nullable, date.
Boolean-like query input; true/false and numeric forms are normalized by this workflow.
Page. Validation: nullable, integer, min:1.
x >= 1Per page. Validation: nullable, integer, min:10, max:100.
10 <= x <= 100curl --request GET \
--url https://api.gratona.com/v1/admin/fundraising/cohorts \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.gratona.com/v1/admin/fundraising/cohorts"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.gratona.com/v1/admin/fundraising/cohorts', 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/fundraising/cohorts",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.gratona.com/v1/admin/fundraising/cohorts"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.gratona.com/v1/admin/fundraising/cohorts")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.gratona.com/v1/admin/fundraising/cohorts")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"status": "success",
"data": {
"periods": {
"mode": "ytd_vs_last_year_ytd",
"current_start": "2026-10-20",
"current_end": "2026-10-20",
"comparison_start": "2026-10-20",
"comparison_end": "2026-10-20",
"current": {
"start": "2026-10-20",
"end": "2026-10-20",
"label": "Example"
},
"comparison": {
"start": "2026-10-20",
"end": "2026-10-20",
"label": "Example"
}
},
"summary": {
"current_donors": {
"count": 2,
"amount": 25,
"donor_ids": [
42
]
},
"new_donors": {
"count": 2,
"amount": 25,
"donor_ids": [
42
]
},
"lost_donors": {
"count": 2,
"amount": 25,
"donor_ids": [
42
]
},
"upgraded_donors": {
"count": 2,
"amount": 25,
"donor_ids": [
42
]
},
"downgraded_donors": {
"count": 2,
"amount": 25,
"donor_ids": [
42
]
},
"maintained_donors": {
"count": 2,
"amount": 25,
"donor_ids": [
42
]
},
"retained_donors": {
"count": 2,
"amount": 25,
"donor_ids": [
42
]
}
},
"explanation": {
"current_revenue": 25,
"comparison_revenue": 25,
"revenue_change": 25,
"new_revenue": 25,
"lost_revenue": 25,
"upgrade_change": 25,
"downgrade_change": 25,
"maintained_change": 25,
"reconciled_revenue_change": 25,
"current_donors": 2,
"comparison_donors": 2,
"donor_change": 2,
"new_donors": 2,
"lost_donors": 2
},
"buckets": {
"current_donors": [
{
"key": "Example",
"donor_id": 2,
"donor_email": "Example",
"donor_name": "Example",
"household_id": 2,
"state": "Example",
"amount": 25,
"gift_count": 2,
"last_gift_date": "2026-10-20",
"assigned_fundraiser_user_id": 2,
"assigned_fundraiser_name": "Example",
"relationship_manager_user_id": 2,
"relationship_manager_name": "Example",
"current_amount": 25,
"previous_amount": 25,
"change_pct": 25,
"transaction_evidence": {
"current": {
"items": [
{
"id": 2,
"donor_id": 2,
"donor_name": "Example",
"donor_email": "Example",
"amount": 25,
"gross_amount": 25,
"currency": "Example",
"date": "2026-10-20",
"method": "Example",
"method_id": 3,
"method_detail": {
"provider": "Example",
"provider_label": "Example",
"source_method": "Example",
"source_processor": "Example"
},
"type": "Example",
"result": "Example",
"transaction_status": "Example",
"acknowledged": "Example",
"acknowledgement_excluded": "Example",
"acknowledged_at": "2026-10-20T12:00:00Z",
"acknowledged_by_user_id": 2,
"acknowledgement_source": "Example",
"assigned_fundraiser_name": "Example",
"city": "Example",
"state": "Example",
"relationship_manager_name": "Example"
}
],
"summary": {
"total_count": 2,
"total_amount": 25,
"unacknowledged_count": 2
}
},
"comparison": {
"items": [
{
"id": 2,
"donor_id": 2,
"donor_name": "Example",
"donor_email": "Example",
"amount": 25,
"gross_amount": 25,
"currency": "Example",
"date": "2026-10-20",
"method": "Example",
"method_id": 3,
"method_detail": {
"provider": "Example",
"provider_label": "Example",
"source_method": "Example",
"source_processor": "Example"
},
"type": "Example",
"result": "Example",
"transaction_status": "Example",
"acknowledged": "Example",
"acknowledgement_excluded": "Example",
"acknowledged_at": "2026-10-20T12:00:00Z",
"acknowledged_by_user_id": 2,
"acknowledgement_source": "Example",
"assigned_fundraiser_name": "Example",
"city": "Example",
"state": "Example",
"relationship_manager_name": "Example"
}
],
"summary": {
"total_count": 2,
"total_amount": 25,
"unacknowledged_count": 2
}
}
}
}
],
"new_donors": [
{
"key": "Example",
"donor_id": 2,
"donor_email": "Example",
"donor_name": "Example",
"household_id": 2,
"state": "Example",
"amount": 25,
"gift_count": 2,
"last_gift_date": "2026-10-20",
"assigned_fundraiser_user_id": 2,
"assigned_fundraiser_name": "Example",
"relationship_manager_user_id": 2,
"relationship_manager_name": "Example",
"current_amount": 25,
"previous_amount": 25,
"change_pct": 25,
"transaction_evidence": {
"current": {
"items": [
{
"id": 2,
"donor_id": 2,
"donor_name": "Example",
"donor_email": "Example",
"amount": 25,
"gross_amount": 25,
"currency": "Example",
"date": "2026-10-20",
"method": "Example",
"method_id": 3,
"method_detail": {
"provider": "Example",
"provider_label": "Example",
"source_method": "Example",
"source_processor": "Example"
},
"type": "Example",
"result": "Example",
"transaction_status": "Example",
"acknowledged": "Example",
"acknowledgement_excluded": "Example",
"acknowledged_at": "2026-10-20T12:00:00Z",
"acknowledged_by_user_id": 2,
"acknowledgement_source": "Example",
"assigned_fundraiser_name": "Example",
"city": "Example",
"state": "Example",
"relationship_manager_name": "Example"
}
],
"summary": {
"total_count": 2,
"total_amount": 25,
"unacknowledged_count": 2
}
},
"comparison": {
"items": [
{
"id": 2,
"donor_id": 2,
"donor_name": "Example",
"donor_email": "Example",
"amount": 25,
"gross_amount": 25,
"currency": "Example",
"date": "2026-10-20",
"method": "Example",
"method_id": 3,
"method_detail": {
"provider": "Example",
"provider_label": "Example",
"source_method": "Example",
"source_processor": "Example"
},
"type": "Example",
"result": "Example",
"transaction_status": "Example",
"acknowledged": "Example",
"acknowledgement_excluded": "Example",
"acknowledged_at": "2026-10-20T12:00:00Z",
"acknowledged_by_user_id": 2,
"acknowledgement_source": "Example",
"assigned_fundraiser_name": "Example",
"city": "Example",
"state": "Example",
"relationship_manager_name": "Example"
}
],
"summary": {
"total_count": 2,
"total_amount": 25,
"unacknowledged_count": 2
}
}
}
}
],
"lost_donors": [
{
"key": "Example",
"donor_id": 2,
"donor_email": "Example",
"donor_name": "Example",
"household_id": 2,
"state": "Example",
"amount": 25,
"gift_count": 2,
"last_gift_date": "2026-10-20",
"assigned_fundraiser_user_id": 2,
"assigned_fundraiser_name": "Example",
"relationship_manager_user_id": 2,
"relationship_manager_name": "Example",
"current_amount": 25,
"previous_amount": 25,
"change_pct": 25,
"transaction_evidence": {
"current": {
"items": [
{
"id": 2,
"donor_id": 2,
"donor_name": "Example",
"donor_email": "Example",
"amount": 25,
"gross_amount": 25,
"currency": "Example",
"date": "2026-10-20",
"method": "Example",
"method_id": 3,
"method_detail": {
"provider": "Example",
"provider_label": "Example",
"source_method": "Example",
"source_processor": "Example"
},
"type": "Example",
"result": "Example",
"transaction_status": "Example",
"acknowledged": "Example",
"acknowledgement_excluded": "Example",
"acknowledged_at": "2026-10-20T12:00:00Z",
"acknowledged_by_user_id": 2,
"acknowledgement_source": "Example",
"assigned_fundraiser_name": "Example",
"city": "Example",
"state": "Example",
"relationship_manager_name": "Example"
}
],
"summary": {
"total_count": 2,
"total_amount": 25,
"unacknowledged_count": 2
}
},
"comparison": {
"items": [
{
"id": 2,
"donor_id": 2,
"donor_name": "Example",
"donor_email": "Example",
"amount": 25,
"gross_amount": 25,
"currency": "Example",
"date": "2026-10-20",
"method": "Example",
"method_id": 3,
"method_detail": {
"provider": "Example",
"provider_label": "Example",
"source_method": "Example",
"source_processor": "Example"
},
"type": "Example",
"result": "Example",
"transaction_status": "Example",
"acknowledged": "Example",
"acknowledgement_excluded": "Example",
"acknowledged_at": "2026-10-20T12:00:00Z",
"acknowledged_by_user_id": 2,
"acknowledgement_source": "Example",
"assigned_fundraiser_name": "Example",
"city": "Example",
"state": "Example",
"relationship_manager_name": "Example"
}
],
"summary": {
"total_count": 2,
"total_amount": 25,
"unacknowledged_count": 2
}
}
}
}
],
"upgraded_donors": [
{
"key": "Example",
"donor_id": 2,
"donor_email": "Example",
"donor_name": "Example",
"household_id": 2,
"state": "Example",
"amount": 25,
"gift_count": 2,
"last_gift_date": "2026-10-20",
"assigned_fundraiser_user_id": 2,
"assigned_fundraiser_name": "Example",
"relationship_manager_user_id": 2,
"relationship_manager_name": "Example",
"current_amount": 25,
"previous_amount": 25,
"change_pct": 25,
"transaction_evidence": {
"current": {
"items": [
{
"id": 2,
"donor_id": 2,
"donor_name": "Example",
"donor_email": "Example",
"amount": 25,
"gross_amount": 25,
"currency": "Example",
"date": "2026-10-20",
"method": "Example",
"method_id": 3,
"method_detail": {
"provider": "Example",
"provider_label": "Example",
"source_method": "Example",
"source_processor": "Example"
},
"type": "Example",
"result": "Example",
"transaction_status": "Example",
"acknowledged": "Example",
"acknowledgement_excluded": "Example",
"acknowledged_at": "2026-10-20T12:00:00Z",
"acknowledged_by_user_id": 2,
"acknowledgement_source": "Example",
"assigned_fundraiser_name": "Example",
"city": "Example",
"state": "Example",
"relationship_manager_name": "Example"
}
],
"summary": {
"total_count": 2,
"total_amount": 25,
"unacknowledged_count": 2
}
},
"comparison": {
"items": [
{
"id": 2,
"donor_id": 2,
"donor_name": "Example",
"donor_email": "Example",
"amount": 25,
"gross_amount": 25,
"currency": "Example",
"date": "2026-10-20",
"method": "Example",
"method_id": 3,
"method_detail": {
"provider": "Example",
"provider_label": "Example",
"source_method": "Example",
"source_processor": "Example"
},
"type": "Example",
"result": "Example",
"transaction_status": "Example",
"acknowledged": "Example",
"acknowledgement_excluded": "Example",
"acknowledged_at": "2026-10-20T12:00:00Z",
"acknowledged_by_user_id": 2,
"acknowledgement_source": "Example",
"assigned_fundraiser_name": "Example",
"city": "Example",
"state": "Example",
"relationship_manager_name": "Example"
}
],
"summary": {
"total_count": 2,
"total_amount": 25,
"unacknowledged_count": 2
}
}
}
}
],
"downgraded_donors": [
{
"key": "Example",
"donor_id": 2,
"donor_email": "Example",
"donor_name": "Example",
"household_id": 2,
"state": "Example",
"amount": 25,
"gift_count": 2,
"last_gift_date": "2026-10-20",
"assigned_fundraiser_user_id": 2,
"assigned_fundraiser_name": "Example",
"relationship_manager_user_id": 2,
"relationship_manager_name": "Example",
"current_amount": 25,
"previous_amount": 25,
"change_pct": 25,
"transaction_evidence": {
"current": {
"items": [
{
"id": 2,
"donor_id": 2,
"donor_name": "Example",
"donor_email": "Example",
"amount": 25,
"gross_amount": 25,
"currency": "Example",
"date": "2026-10-20",
"method": "Example",
"method_id": 3,
"method_detail": {
"provider": "Example",
"provider_label": "Example",
"source_method": "Example",
"source_processor": "Example"
},
"type": "Example",
"result": "Example",
"transaction_status": "Example",
"acknowledged": "Example",
"acknowledgement_excluded": "Example",
"acknowledged_at": "2026-10-20T12:00:00Z",
"acknowledged_by_user_id": 2,
"acknowledgement_source": "Example",
"assigned_fundraiser_name": "Example",
"city": "Example",
"state": "Example",
"relationship_manager_name": "Example"
}
],
"summary": {
"total_count": 2,
"total_amount": 25,
"unacknowledged_count": 2
}
},
"comparison": {
"items": [
{
"id": 2,
"donor_id": 2,
"donor_name": "Example",
"donor_email": "Example",
"amount": 25,
"gross_amount": 25,
"currency": "Example",
"date": "2026-10-20",
"method": "Example",
"method_id": 3,
"method_detail": {
"provider": "Example",
"provider_label": "Example",
"source_method": "Example",
"source_processor": "Example"
},
"type": "Example",
"result": "Example",
"transaction_status": "Example",
"acknowledged": "Example",
"acknowledgement_excluded": "Example",
"acknowledged_at": "2026-10-20T12:00:00Z",
"acknowledged_by_user_id": 2,
"acknowledgement_source": "Example",
"assigned_fundraiser_name": "Example",
"city": "Example",
"state": "Example",
"relationship_manager_name": "Example"
}
],
"summary": {
"total_count": 2,
"total_amount": 25,
"unacknowledged_count": 2
}
}
}
}
],
"maintained_donors": [
{
"key": "Example",
"donor_id": 2,
"donor_email": "Example",
"donor_name": "Example",
"household_id": 2,
"state": "Example",
"amount": 25,
"gift_count": 2,
"last_gift_date": "2026-10-20",
"assigned_fundraiser_user_id": 2,
"assigned_fundraiser_name": "Example",
"relationship_manager_user_id": 2,
"relationship_manager_name": "Example",
"current_amount": 25,
"previous_amount": 25,
"change_pct": 25,
"transaction_evidence": {
"current": {
"items": [
{
"id": 2,
"donor_id": 2,
"donor_name": "Example",
"donor_email": "Example",
"amount": 25,
"gross_amount": 25,
"currency": "Example",
"date": "2026-10-20",
"method": "Example",
"method_id": 3,
"method_detail": {
"provider": "Example",
"provider_label": "Example",
"source_method": "Example",
"source_processor": "Example"
},
"type": "Example",
"result": "Example",
"transaction_status": "Example",
"acknowledged": "Example",
"acknowledgement_excluded": "Example",
"acknowledged_at": "2026-10-20T12:00:00Z",
"acknowledged_by_user_id": 2,
"acknowledgement_source": "Example",
"assigned_fundraiser_name": "Example",
"city": "Example",
"state": "Example",
"relationship_manager_name": "Example"
}
],
"summary": {
"total_count": 2,
"total_amount": 25,
"unacknowledged_count": 2
}
},
"comparison": {
"items": [
{
"id": 2,
"donor_id": 2,
"donor_name": "Example",
"donor_email": "Example",
"amount": 25,
"gross_amount": 25,
"currency": "Example",
"date": "2026-10-20",
"method": "Example",
"method_id": 3,
"method_detail": {
"provider": "Example",
"provider_label": "Example",
"source_method": "Example",
"source_processor": "Example"
},
"type": "Example",
"result": "Example",
"transaction_status": "Example",
"acknowledged": "Example",
"acknowledgement_excluded": "Example",
"acknowledged_at": "2026-10-20T12:00:00Z",
"acknowledged_by_user_id": 2,
"acknowledgement_source": "Example",
"assigned_fundraiser_name": "Example",
"city": "Example",
"state": "Example",
"relationship_manager_name": "Example"
}
],
"summary": {
"total_count": 2,
"total_amount": 25,
"unacknowledged_count": 2
}
}
}
}
],
"retained_donors": [
{
"key": "Example",
"donor_id": 2,
"donor_email": "Example",
"donor_name": "Example",
"household_id": 2,
"state": "Example",
"amount": 25,
"gift_count": 2,
"last_gift_date": "2026-10-20",
"assigned_fundraiser_user_id": 2,
"assigned_fundraiser_name": "Example",
"relationship_manager_user_id": 2,
"relationship_manager_name": "Example",
"current_amount": 25,
"previous_amount": 25,
"change_pct": 25,
"transaction_evidence": {
"current": {
"items": [
{
"id": 2,
"donor_id": 2,
"donor_name": "Example",
"donor_email": "Example",
"amount": 25,
"gross_amount": 25,
"currency": "Example",
"date": "2026-10-20",
"method": "Example",
"method_id": 3,
"method_detail": {
"provider": "Example",
"provider_label": "Example",
"source_method": "Example",
"source_processor": "Example"
},
"type": "Example",
"result": "Example",
"transaction_status": "Example",
"acknowledged": "Example",
"acknowledgement_excluded": "Example",
"acknowledged_at": "2026-10-20T12:00:00Z",
"acknowledged_by_user_id": 2,
"acknowledgement_source": "Example",
"assigned_fundraiser_name": "Example",
"city": "Example",
"state": "Example",
"relationship_manager_name": "Example"
}
],
"summary": {
"total_count": 2,
"total_amount": 25,
"unacknowledged_count": 2
}
},
"comparison": {
"items": [
{
"id": 2,
"donor_id": 2,
"donor_name": "Example",
"donor_email": "Example",
"amount": 25,
"gross_amount": 25,
"currency": "Example",
"date": "2026-10-20",
"method": "Example",
"method_id": 3,
"method_detail": {
"provider": "Example",
"provider_label": "Example",
"source_method": "Example",
"source_processor": "Example"
},
"type": "Example",
"result": "Example",
"transaction_status": "Example",
"acknowledged": "Example",
"acknowledgement_excluded": "Example",
"acknowledged_at": "2026-10-20T12:00:00Z",
"acknowledged_by_user_id": 2,
"acknowledgement_source": "Example",
"assigned_fundraiser_name": "Example",
"city": "Example",
"state": "Example",
"relationship_manager_name": "Example"
}
],
"summary": {
"total_count": 2,
"total_amount": 25,
"unacknowledged_count": 2
}
}
}
}
]
}
}
}{
"message": "Unauthorized",
"status": "error"
}{
"errors": {},
"status": "error",
"message": "The given data was invalid."
}