Read fundraising overview metrics
Computes current/comparison financial-ledger and contact metrics, stewardship alerts and cohort summaries. Uses a short user/filter/settings cache; refresh bypasses it. Relationship donor visibility and plan feature permissions apply. Requires permission: one of donors_view.
curl --request GET \
--url https://api.gratona.com/v1/admin/fundraising/overview \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.gratona.com/v1/admin/fundraising/overview"
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/overview', 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/overview",
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/overview"
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/overview")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.gratona.com/v1/admin/fundraising/overview")
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"
}
},
"settings": {
"comparison": {
"default_mode": "Comparison.Default Mode",
"effective_default_mode": "Example"
},
"user_preferences": {
"comparison": {
"default_mode": "User Preferences.Comparison.Default Mode"
}
},
"caseload": {
"major_gift_threshold": 25,
"mid_level_threshold": 25,
"at_risk_months": 1,
"lapsed_months": 1,
"needs_contact_days": 1,
"new_donor_window_days": 1,
"upgrade_potential_threshold_pct": 25,
"giving_trend_threshold_pct": 25,
"minimum_gifts_for_trend": 1
},
"portfolio": {
"major_gift_threshold": 25,
"mid_level_threshold": 25,
"at_risk_months": 1,
"lapsed_months": 1,
"needs_contact_days": 1,
"new_donor_window_days": 1,
"upgrade_potential_threshold_pct": 25,
"giving_trend_threshold_pct": 25,
"minimum_gifts_for_trend": 1
},
"cohorts": {
"upgrade_threshold_pct": 25,
"downgrade_threshold_pct": 25,
"maintained_tolerance_pct": 25
},
"acknowledgements": {
"enabled": true,
"stewardship_start_date": "2026-10-20",
"initial_backfill_days": 0,
"pending_after_days": 1,
"auto_email_can_acknowledge_default": true,
"allowed_sources": [
"<unknown>"
],
"stewardship_configured": true,
"source": "donations_acknowledged_at"
},
"filters": {
"default_group_by_household": true
},
"planning": {
"strategy_review_days": 1,
"qualification_stall_days": 1,
"severely_overdue_days": 1,
"annual_review_reminder_days": 1,
"qualification_template_version": 1,
"default_period": "calendar_year"
},
"relationship_provisioning": {
"policy_version": 1,
"enabled": true,
"default_giving_scope": "attributed_only",
"relationship_type_mappings": [
{
"key": "donor_advised_fund",
"core_relationship_type": "Relationship Provisioning.Relationship Type Mappings.*.Core Relationship Type",
"vehicle_relationship_type": "Relationship Provisioning.Relationship Type Mappings.*.Vehicle Relationship Type",
"kind": "family_fund",
"decision": "auto_create"
}
]
},
"attribution": {
"policy_version": 1,
"soft_credit_types": {},
"relationship_follow_up": {
"enabled": true,
"due_days_after": 1,
"lookback_days": 1
},
"soft_credit_type_options": [
{
"key": "Example",
"name": "Example"
}
]
},
"reactivation": {
"allowed_actions": [
"<unknown>"
]
},
"interactions": {
"classification_version": 2,
"meaningful_channels": [
"Interactions.Meaningful Channels.*"
],
"meaningful_purposes": [
"Interactions.Meaningful Purposes.*"
],
"meaningful_outcomes": [
"completed"
],
"meaningful_directions": [
"inbound"
],
"meaningful_provider_purposes": [
"Interactions.Meaningful Provider Purposes.*"
],
"meaningful_keywords": [
"Interactions.Meaningful Keywords.*"
],
"meaningful_subject_markers": [
"meaningful"
],
"excluded_contact_purposes": [
"Interactions.Excluded Contact Purposes.*"
]
},
"suggestions": {
"enabled": true,
"playbook": "balanced",
"moments": {
"first_gift": "call",
"major_gift": "call",
"giving_anniversary": "call",
"reactivation": "call",
"sustainer_milestone": "call"
},
"scope": {
"dashboard": true,
"donor_record": true,
"work_queue": true,
"after_gift_entry": true
},
"guardrails": {
"touch_fatigue_cap_per_30_days": 1,
"respect_channel_consent": true,
"budget_aware_downgrade": true,
"channel_cooldown_days": 1
}
},
"digest": {
"enabled": true,
"frequency": "daily",
"weekday": "monday",
"recipients": [
"jane@example.org"
],
"include_anniversaries": true,
"include_unacknowledged_gifts": true,
"include_reactivation": true
},
"stewardship_setup": {
"required": true,
"today": "2026-10-20",
"timezone": "Example"
}
},
"metrics": {
"total_revenue": 25,
"total_revenue_delta": 25,
"active_donors_delta": 25,
"total_interactions_delta": 25,
"engagement_rate": 25,
"unacknowledged_gift_amount": 25,
"active_donors": 2,
"total_interactions": 2,
"contact_count": 2,
"meaningful_connections": 2,
"meaningful_contact_count": 2,
"open_work_items": 2,
"unacknowledged_gifts": 2
},
"metric_basis": {},
"comparison": {
"revenue": [
{
"label": "Example",
"value": 25
}
],
"donors": [
{
"label": "Example",
"value": 25
}
],
"interactions": [
{
"label": "Example",
"value": 25
}
]
},
"metric_explanations": {
"revenue": {
"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,
"current_label": "Example",
"comparison_label": "Example"
},
"active_donors": {
"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,
"current_label": "Example",
"comparison_label": "Example"
}
},
"stewardship": {
"unacknowledged_gifts": {
"count": 2,
"amount": 25,
"oldest_date": "2026-10-20",
"oldest_age_days": 2
},
"work_items": {
"total": 2,
"by_type": {}
}
},
"alerts": [
{
"key": "Example",
"label": "Example",
"value": 2,
"detail": "Example",
"path": "Example"
}
],
"cohorts": {
"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
]
}
},
"projection_freshness": {
"status": "fresh",
"is_stale": true,
"last_success_at": "2026-10-20T12:00:00Z",
"stale_after_minutes": 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/overview \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.gratona.com/v1/admin/fundraising/overview"
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/overview', 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/overview",
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/overview"
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/overview")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.gratona.com/v1/admin/fundraising/overview")
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"
}
},
"settings": {
"comparison": {
"default_mode": "Comparison.Default Mode",
"effective_default_mode": "Example"
},
"user_preferences": {
"comparison": {
"default_mode": "User Preferences.Comparison.Default Mode"
}
},
"caseload": {
"major_gift_threshold": 25,
"mid_level_threshold": 25,
"at_risk_months": 1,
"lapsed_months": 1,
"needs_contact_days": 1,
"new_donor_window_days": 1,
"upgrade_potential_threshold_pct": 25,
"giving_trend_threshold_pct": 25,
"minimum_gifts_for_trend": 1
},
"portfolio": {
"major_gift_threshold": 25,
"mid_level_threshold": 25,
"at_risk_months": 1,
"lapsed_months": 1,
"needs_contact_days": 1,
"new_donor_window_days": 1,
"upgrade_potential_threshold_pct": 25,
"giving_trend_threshold_pct": 25,
"minimum_gifts_for_trend": 1
},
"cohorts": {
"upgrade_threshold_pct": 25,
"downgrade_threshold_pct": 25,
"maintained_tolerance_pct": 25
},
"acknowledgements": {
"enabled": true,
"stewardship_start_date": "2026-10-20",
"initial_backfill_days": 0,
"pending_after_days": 1,
"auto_email_can_acknowledge_default": true,
"allowed_sources": [
"<unknown>"
],
"stewardship_configured": true,
"source": "donations_acknowledged_at"
},
"filters": {
"default_group_by_household": true
},
"planning": {
"strategy_review_days": 1,
"qualification_stall_days": 1,
"severely_overdue_days": 1,
"annual_review_reminder_days": 1,
"qualification_template_version": 1,
"default_period": "calendar_year"
},
"relationship_provisioning": {
"policy_version": 1,
"enabled": true,
"default_giving_scope": "attributed_only",
"relationship_type_mappings": [
{
"key": "donor_advised_fund",
"core_relationship_type": "Relationship Provisioning.Relationship Type Mappings.*.Core Relationship Type",
"vehicle_relationship_type": "Relationship Provisioning.Relationship Type Mappings.*.Vehicle Relationship Type",
"kind": "family_fund",
"decision": "auto_create"
}
]
},
"attribution": {
"policy_version": 1,
"soft_credit_types": {},
"relationship_follow_up": {
"enabled": true,
"due_days_after": 1,
"lookback_days": 1
},
"soft_credit_type_options": [
{
"key": "Example",
"name": "Example"
}
]
},
"reactivation": {
"allowed_actions": [
"<unknown>"
]
},
"interactions": {
"classification_version": 2,
"meaningful_channels": [
"Interactions.Meaningful Channels.*"
],
"meaningful_purposes": [
"Interactions.Meaningful Purposes.*"
],
"meaningful_outcomes": [
"completed"
],
"meaningful_directions": [
"inbound"
],
"meaningful_provider_purposes": [
"Interactions.Meaningful Provider Purposes.*"
],
"meaningful_keywords": [
"Interactions.Meaningful Keywords.*"
],
"meaningful_subject_markers": [
"meaningful"
],
"excluded_contact_purposes": [
"Interactions.Excluded Contact Purposes.*"
]
},
"suggestions": {
"enabled": true,
"playbook": "balanced",
"moments": {
"first_gift": "call",
"major_gift": "call",
"giving_anniversary": "call",
"reactivation": "call",
"sustainer_milestone": "call"
},
"scope": {
"dashboard": true,
"donor_record": true,
"work_queue": true,
"after_gift_entry": true
},
"guardrails": {
"touch_fatigue_cap_per_30_days": 1,
"respect_channel_consent": true,
"budget_aware_downgrade": true,
"channel_cooldown_days": 1
}
},
"digest": {
"enabled": true,
"frequency": "daily",
"weekday": "monday",
"recipients": [
"jane@example.org"
],
"include_anniversaries": true,
"include_unacknowledged_gifts": true,
"include_reactivation": true
},
"stewardship_setup": {
"required": true,
"today": "2026-10-20",
"timezone": "Example"
}
},
"metrics": {
"total_revenue": 25,
"total_revenue_delta": 25,
"active_donors_delta": 25,
"total_interactions_delta": 25,
"engagement_rate": 25,
"unacknowledged_gift_amount": 25,
"active_donors": 2,
"total_interactions": 2,
"contact_count": 2,
"meaningful_connections": 2,
"meaningful_contact_count": 2,
"open_work_items": 2,
"unacknowledged_gifts": 2
},
"metric_basis": {},
"comparison": {
"revenue": [
{
"label": "Example",
"value": 25
}
],
"donors": [
{
"label": "Example",
"value": 25
}
],
"interactions": [
{
"label": "Example",
"value": 25
}
]
},
"metric_explanations": {
"revenue": {
"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,
"current_label": "Example",
"comparison_label": "Example"
},
"active_donors": {
"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,
"current_label": "Example",
"comparison_label": "Example"
}
},
"stewardship": {
"unacknowledged_gifts": {
"count": 2,
"amount": 25,
"oldest_date": "2026-10-20",
"oldest_age_days": 2
},
"work_items": {
"total": 2,
"by_type": {}
}
},
"alerts": [
{
"key": "Example",
"label": "Example",
"value": 2,
"detail": "Example",
"path": "Example"
}
],
"cohorts": {
"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
]
}
},
"projection_freshness": {
"status": "fresh",
"is_stale": true,
"last_success_at": "2026-10-20T12:00:00Z",
"stale_after_minutes": 2
}
}
}{
"message": "Unauthorized",
"status": "error"
}{
"errors": {},
"status": "error",
"message": "The given data was invalid."
}