Communications
Read donor mailing activity
Returns recent manual/generated mailing logs for an active tenant-owned donor. per_page is clamped to 1..100, default 25; reads up to four times that many newest activities then selects the most recent by logged_at when present. This is a bounded recent list, without page cursors or totals. Artifact flags probe current storage. Requires permission: one of mailings_view, mailings_generate, mailings_manage, manage_email, reports_view, reports_manage.
GET
/
admin
/
donors
/
{donor_id}
/
mailings
Read donor mailing activity
curl --request GET \
--url https://api.gratona.com/v1/admin/donors/{donor_id}/mailings \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.gratona.com/v1/admin/donors/{donor_id}/mailings"
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/donors/{donor_id}/mailings', 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/donors/{donor_id}/mailings",
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/donors/{donor_id}/mailings"
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/donors/{donor_id}/mailings")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.gratona.com/v1/admin/donors/{donor_id}/mailings")
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{
"data": [
{
"id": 42,
"donor_id": 42,
"action": "donor_mailing_logged",
"source": "manual",
"mailing_name": "October impact letter",
"preset_key": "Example",
"label_layout_preset": "single_label",
"notes": "Example",
"logged_at": "2026-10-20T12:00:00Z",
"description": "Example",
"created_at": "2026-10-20T12:00:00Z",
"generated_mailing_id": 42,
"mailing_run_id": 42,
"mailing_template_id": 42,
"recipient_name": "Example",
"has_letter_artifact": true,
"has_label_artifact": true,
"has_label_sheet_artifact": true,
"has_run_zip_artifact": true,
"letter_url": "/admin/mailings/42/artifact/letter",
"label_url": "/admin/mailings/42/artifact/letter",
"label_sheet_url": "/admin/mailings/42/artifact/letter",
"run_zip_url": "/admin/mailings/42/artifact/letter",
"open_url": "/admin/mailings/42/artifact/letter"
}
]
}{
"message": "Unauthorized",
"status": "error"
}{
"message": "Not Found",
"status": "error"
}Authorizations
bearerAuthapiKeyAuth
Passport bearer token authentication for legacy admin sessions.
Path Parameters
Donor id in the current organization.
Query Parameters
Query field.
Response
Operation result.
Show child attributes
Show child attributes
⌘I
Read donor mailing activity
curl --request GET \
--url https://api.gratona.com/v1/admin/donors/{donor_id}/mailings \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.gratona.com/v1/admin/donors/{donor_id}/mailings"
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/donors/{donor_id}/mailings', 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/donors/{donor_id}/mailings",
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/donors/{donor_id}/mailings"
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/donors/{donor_id}/mailings")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.gratona.com/v1/admin/donors/{donor_id}/mailings")
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{
"data": [
{
"id": 42,
"donor_id": 42,
"action": "donor_mailing_logged",
"source": "manual",
"mailing_name": "October impact letter",
"preset_key": "Example",
"label_layout_preset": "single_label",
"notes": "Example",
"logged_at": "2026-10-20T12:00:00Z",
"description": "Example",
"created_at": "2026-10-20T12:00:00Z",
"generated_mailing_id": 42,
"mailing_run_id": 42,
"mailing_template_id": 42,
"recipient_name": "Example",
"has_letter_artifact": true,
"has_label_artifact": true,
"has_label_sheet_artifact": true,
"has_run_zip_artifact": true,
"letter_url": "/admin/mailings/42/artifact/letter",
"label_url": "/admin/mailings/42/artifact/letter",
"label_sheet_url": "/admin/mailings/42/artifact/letter",
"run_zip_url": "/admin/mailings/42/artifact/letter",
"open_url": "/admin/mailings/42/artifact/letter"
}
]
}{
"message": "Unauthorized",
"status": "error"
}{
"message": "Not Found",
"status": "error"
}