Get donor
curl --request GET \
--url https://api.grainledger.com/api/v1/donors/{id} \
--header 'Authorization: Bearer <token>'const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.grainledger.com/api/v1/donors/{id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.grainledger.com/api/v1/donors/{id}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text){
"id": "<string>",
"firstName": "<string>",
"lastName": "<string>",
"organizationName": "<string>",
"email": "<string>",
"phone": "<string>",
"donorType": "INDIVIDUAL",
"householdRef": "<string>",
"householdName": "<string>",
"householdPosition": "PRIMARY",
"isPrimaryContact": true,
"membershipStatus": "VISITOR",
"isActive": true,
"totalGiving": 123,
"contact": {
"email": "<string>",
"phone": "<string>",
"secondaryEmail": "<string>",
"secondaryPhone": "<string>",
"workPhone": "<string>",
"preferredMethod": "EMAIL"
},
"address": {
"line1": "<string>",
"city": "<string>",
"state": "<string>",
"postalCode": "<string>"
},
"profile": {
"middleName": "<string>",
"nickname": "<string>",
"title": "<string>",
"suffix": "<string>",
"birthdate": "2023-11-07T05:31:56Z",
"anniversary": "2023-11-07T05:31:56Z",
"gender": "<string>",
"isChild": true,
"grade": 123,
"graduationYear": 123,
"schoolType": "<string>",
"employer": "<string>",
"occupation": "<string>",
"photoUrl": "<string>"
},
"membership": {
"status": "<string>",
"memberSince": "2023-11-07T05:31:56Z",
"primaryCampusId": "<string>",
"inactivatedAt": "2023-11-07T05:31:56Z"
},
"communicationPreferences": {
"emailOptOut": true,
"mailOptOut": true,
"smsOptOut": true
},
"household": {
"id": "<string>",
"name": "<string>",
"primaryContactId": "<string>",
"memberCount": 123
},
"envelopeNumber": "<string>",
"defaultCurrency": "<string>",
"notes": "<string>",
"externalIds": [
{
"platform": "<string>",
"externalId": "<string>"
}
],
"giving": {
"lifetimeGiving": 123,
"giftCount": 123,
"averageGift": 123,
"firstGiftDate": "2023-11-07T05:31:56Z",
"lastGiftDate": "2023-11-07T05:31:56Z",
"segment": "<string>"
},
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z"
}{
"code": "forbidden",
"message": "You do not have access to this organization.",
"error": "You do not have access to this organization."
}{
"code": "forbidden",
"message": "You do not have access to this organization.",
"error": "You do not have access to this organization."
}{
"code": "forbidden",
"message": "You do not have access to this organization.",
"error": "You do not have access to this organization."
}{
"code": "forbidden",
"message": "You do not have access to this organization.",
"error": "You do not have access to this organization."
}{
"code": "forbidden",
"message": "You do not have access to this organization.",
"error": "You do not have access to this organization."
}{
"code": "forbidden",
"message": "You do not have access to this organization.",
"error": "You do not have access to this organization."
}{
"code": "forbidden",
"message": "You do not have access to this organization.",
"error": "You do not have access to this organization."
}{
"code": "forbidden",
"message": "You do not have access to this organization.",
"error": "You do not have access to this organization."
}Donors
Get donor
GET
https://api.grainledger.com
/
api
/
v1
/
donors
/
{id}
Get donor
curl --request GET \
--url https://api.grainledger.com/api/v1/donors/{id} \
--header 'Authorization: Bearer <token>'const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.grainledger.com/api/v1/donors/{id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.grainledger.com/api/v1/donors/{id}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text){
"id": "<string>",
"firstName": "<string>",
"lastName": "<string>",
"organizationName": "<string>",
"email": "<string>",
"phone": "<string>",
"donorType": "INDIVIDUAL",
"householdRef": "<string>",
"householdName": "<string>",
"householdPosition": "PRIMARY",
"isPrimaryContact": true,
"membershipStatus": "VISITOR",
"isActive": true,
"totalGiving": 123,
"contact": {
"email": "<string>",
"phone": "<string>",
"secondaryEmail": "<string>",
"secondaryPhone": "<string>",
"workPhone": "<string>",
"preferredMethod": "EMAIL"
},
"address": {
"line1": "<string>",
"city": "<string>",
"state": "<string>",
"postalCode": "<string>"
},
"profile": {
"middleName": "<string>",
"nickname": "<string>",
"title": "<string>",
"suffix": "<string>",
"birthdate": "2023-11-07T05:31:56Z",
"anniversary": "2023-11-07T05:31:56Z",
"gender": "<string>",
"isChild": true,
"grade": 123,
"graduationYear": 123,
"schoolType": "<string>",
"employer": "<string>",
"occupation": "<string>",
"photoUrl": "<string>"
},
"membership": {
"status": "<string>",
"memberSince": "2023-11-07T05:31:56Z",
"primaryCampusId": "<string>",
"inactivatedAt": "2023-11-07T05:31:56Z"
},
"communicationPreferences": {
"emailOptOut": true,
"mailOptOut": true,
"smsOptOut": true
},
"household": {
"id": "<string>",
"name": "<string>",
"primaryContactId": "<string>",
"memberCount": 123
},
"envelopeNumber": "<string>",
"defaultCurrency": "<string>",
"notes": "<string>",
"externalIds": [
{
"platform": "<string>",
"externalId": "<string>"
}
],
"giving": {
"lifetimeGiving": 123,
"giftCount": 123,
"averageGift": 123,
"firstGiftDate": "2023-11-07T05:31:56Z",
"lastGiftDate": "2023-11-07T05:31:56Z",
"segment": "<string>"
},
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z"
}{
"code": "forbidden",
"message": "You do not have access to this organization.",
"error": "You do not have access to this organization."
}{
"code": "forbidden",
"message": "You do not have access to this organization.",
"error": "You do not have access to this organization."
}{
"code": "forbidden",
"message": "You do not have access to this organization.",
"error": "You do not have access to this organization."
}{
"code": "forbidden",
"message": "You do not have access to this organization.",
"error": "You do not have access to this organization."
}{
"code": "forbidden",
"message": "You do not have access to this organization.",
"error": "You do not have access to this organization."
}{
"code": "forbidden",
"message": "You do not have access to this organization.",
"error": "You do not have access to this organization."
}{
"code": "forbidden",
"message": "You do not have access to this organization.",
"error": "You do not have access to this organization."
}{
"code": "forbidden",
"message": "You do not have access to this organization.",
"error": "You do not have access to this organization."
}Authorizations
ApiKeyAuthGrainOAuth2BearerAuth
Organization API key created in Grain Settings → API. The key determines the organization and is limited to its assigned resource scopes. Write scopes imply the corresponding read scope.
Headers
Required with OAuth access tokens. Optional with organization API keys; if supplied, it must match the key's organization.
Path Parameters
Resource ID
Response
Donor
Stable donor profile. Identity fields are null or masked unless the caller has donor identity access.
Available options:
INDIVIDUAL, HOUSEHOLD, ORGANIZATION, DAF_CUSTODIAN, FOUNDATION, ESTATE Available options:
PRIMARY, SPOUSE, CHILD, OTHER Available options:
VISITOR, REGULAR_ATTENDER, MEMBER, INACTIVE, FORMER Hide child attributes
Hide child attributes
Last modified on August 23, 2026
⌘I