Update donor
curl --request PATCH \
--url https://api.grainledger.com/api/v1/donors/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"firstName": "<string>",
"lastName": "<string>",
"email": "jsmith@example.com",
"phone": "<string>",
"address": "<string>",
"city": "<string>",
"state": "<string>",
"zip": "<string>",
"notes": "<string>",
"middleName": "<string>",
"nickname": "<string>",
"title": "<string>",
"suffix": "<string>",
"birthdate": "2023-12-25",
"anniversary": "2023-12-25",
"isChild": true,
"grade": 6,
"graduationYear": 2050,
"memberSince": "2023-12-25",
"primaryCampusId": "<string>",
"inactivatedAt": "2023-11-07T05:31:56Z",
"photoUrl": "<string>",
"employer": "<string>",
"occupation": "<string>",
"secondaryEmail": "jsmith@example.com",
"secondaryPhone": "<string>",
"workPhone": "<string>",
"emailOptOut": true,
"mailOptOut": true,
"smsOptOut": true,
"householdRef": "<string>",
"householdId": "<string>",
"householdName": "<string>",
"envelopeNumber": "<string>",
"organizationName": "<string>",
"defaultCurrency": "<string>",
"externalIds": {
"PUSHPAY": "<string>",
"PLANNING_CENTER": "<string>",
"CCB": "<string>",
"TITHELY": "<string>",
"SUBSPLASH": "<string>",
"ROCK_RMS": "<string>",
"MANUAL": "<string>",
"OTHER": "<string>"
}
}
'const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
firstName: '<string>',
lastName: '<string>',
email: 'jsmith@example.com',
phone: '<string>',
address: '<string>',
city: '<string>',
state: '<string>',
zip: '<string>',
notes: '<string>',
middleName: '<string>',
nickname: '<string>',
title: '<string>',
suffix: '<string>',
birthdate: '2023-12-25',
anniversary: '2023-12-25',
isChild: true,
grade: 6,
graduationYear: 2050,
memberSince: '2023-12-25',
primaryCampusId: '<string>',
inactivatedAt: '2023-11-07T05:31:56Z',
photoUrl: '<string>',
employer: '<string>',
occupation: '<string>',
secondaryEmail: 'jsmith@example.com',
secondaryPhone: '<string>',
workPhone: '<string>',
emailOptOut: true,
mailOptOut: true,
smsOptOut: true,
householdRef: '<string>',
householdId: '<string>',
householdName: '<string>',
envelopeNumber: '<string>',
organizationName: '<string>',
defaultCurrency: '<string>',
externalIds: {
PUSHPAY: '<string>',
PLANNING_CENTER: '<string>',
CCB: '<string>',
TITHELY: '<string>',
SUBSPLASH: '<string>',
ROCK_RMS: '<string>',
MANUAL: '<string>',
OTHER: '<string>'
}
})
};
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}"
payload = {
"firstName": "<string>",
"lastName": "<string>",
"email": "jsmith@example.com",
"phone": "<string>",
"address": "<string>",
"city": "<string>",
"state": "<string>",
"zip": "<string>",
"notes": "<string>",
"middleName": "<string>",
"nickname": "<string>",
"title": "<string>",
"suffix": "<string>",
"birthdate": "2023-12-25",
"anniversary": "2023-12-25",
"isChild": True,
"grade": 6,
"graduationYear": 2050,
"memberSince": "2023-12-25",
"primaryCampusId": "<string>",
"inactivatedAt": "2023-11-07T05:31:56Z",
"photoUrl": "<string>",
"employer": "<string>",
"occupation": "<string>",
"secondaryEmail": "jsmith@example.com",
"secondaryPhone": "<string>",
"workPhone": "<string>",
"emailOptOut": True,
"mailOptOut": True,
"smsOptOut": True,
"householdRef": "<string>",
"householdId": "<string>",
"householdName": "<string>",
"envelopeNumber": "<string>",
"organizationName": "<string>",
"defaultCurrency": "<string>",
"externalIds": {
"PUSHPAY": "<string>",
"PLANNING_CENTER": "<string>",
"CCB": "<string>",
"TITHELY": "<string>",
"SUBSPLASH": "<string>",
"ROCK_RMS": "<string>",
"MANUAL": "<string>",
"OTHER": "<string>"
}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, 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.",
"details": {
"fields": [
{
"field": "amount",
"code": "invalid_type"
}
]
}
}{
"code": "forbidden",
"message": "You do not have access to this organization.",
"error": "You do not have access to this organization.",
"details": {
"fields": [
{
"field": "amount",
"code": "invalid_type"
}
]
}
}{
"code": "forbidden",
"message": "You do not have access to this organization.",
"error": "You do not have access to this organization.",
"details": {
"fields": [
{
"field": "amount",
"code": "invalid_type"
}
]
}
}{
"code": "forbidden",
"message": "You do not have access to this organization.",
"error": "You do not have access to this organization.",
"details": {
"fields": [
{
"field": "amount",
"code": "invalid_type"
}
]
}
}{
"code": "forbidden",
"message": "You do not have access to this organization.",
"error": "You do not have access to this organization.",
"details": {
"fields": [
{
"field": "amount",
"code": "invalid_type"
}
]
}
}{
"code": "forbidden",
"message": "You do not have access to this organization.",
"error": "You do not have access to this organization.",
"details": {
"fields": [
{
"field": "amount",
"code": "invalid_type"
}
]
}
}{
"code": "forbidden",
"message": "You do not have access to this organization.",
"error": "You do not have access to this organization.",
"details": {
"fields": [
{
"field": "amount",
"code": "invalid_type"
}
]
}
}{
"code": "forbidden",
"message": "You do not have access to this organization.",
"error": "You do not have access to this organization.",
"details": {
"fields": [
{
"field": "amount",
"code": "invalid_type"
}
]
}
}Donors
Update donor
PATCH
https://api.grainledger.com
/
api
/
v1
/
donors
/
{id}
Update donor
curl --request PATCH \
--url https://api.grainledger.com/api/v1/donors/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"firstName": "<string>",
"lastName": "<string>",
"email": "jsmith@example.com",
"phone": "<string>",
"address": "<string>",
"city": "<string>",
"state": "<string>",
"zip": "<string>",
"notes": "<string>",
"middleName": "<string>",
"nickname": "<string>",
"title": "<string>",
"suffix": "<string>",
"birthdate": "2023-12-25",
"anniversary": "2023-12-25",
"isChild": true,
"grade": 6,
"graduationYear": 2050,
"memberSince": "2023-12-25",
"primaryCampusId": "<string>",
"inactivatedAt": "2023-11-07T05:31:56Z",
"photoUrl": "<string>",
"employer": "<string>",
"occupation": "<string>",
"secondaryEmail": "jsmith@example.com",
"secondaryPhone": "<string>",
"workPhone": "<string>",
"emailOptOut": true,
"mailOptOut": true,
"smsOptOut": true,
"householdRef": "<string>",
"householdId": "<string>",
"householdName": "<string>",
"envelopeNumber": "<string>",
"organizationName": "<string>",
"defaultCurrency": "<string>",
"externalIds": {
"PUSHPAY": "<string>",
"PLANNING_CENTER": "<string>",
"CCB": "<string>",
"TITHELY": "<string>",
"SUBSPLASH": "<string>",
"ROCK_RMS": "<string>",
"MANUAL": "<string>",
"OTHER": "<string>"
}
}
'const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
firstName: '<string>',
lastName: '<string>',
email: 'jsmith@example.com',
phone: '<string>',
address: '<string>',
city: '<string>',
state: '<string>',
zip: '<string>',
notes: '<string>',
middleName: '<string>',
nickname: '<string>',
title: '<string>',
suffix: '<string>',
birthdate: '2023-12-25',
anniversary: '2023-12-25',
isChild: true,
grade: 6,
graduationYear: 2050,
memberSince: '2023-12-25',
primaryCampusId: '<string>',
inactivatedAt: '2023-11-07T05:31:56Z',
photoUrl: '<string>',
employer: '<string>',
occupation: '<string>',
secondaryEmail: 'jsmith@example.com',
secondaryPhone: '<string>',
workPhone: '<string>',
emailOptOut: true,
mailOptOut: true,
smsOptOut: true,
householdRef: '<string>',
householdId: '<string>',
householdName: '<string>',
envelopeNumber: '<string>',
organizationName: '<string>',
defaultCurrency: '<string>',
externalIds: {
PUSHPAY: '<string>',
PLANNING_CENTER: '<string>',
CCB: '<string>',
TITHELY: '<string>',
SUBSPLASH: '<string>',
ROCK_RMS: '<string>',
MANUAL: '<string>',
OTHER: '<string>'
}
})
};
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}"
payload = {
"firstName": "<string>",
"lastName": "<string>",
"email": "jsmith@example.com",
"phone": "<string>",
"address": "<string>",
"city": "<string>",
"state": "<string>",
"zip": "<string>",
"notes": "<string>",
"middleName": "<string>",
"nickname": "<string>",
"title": "<string>",
"suffix": "<string>",
"birthdate": "2023-12-25",
"anniversary": "2023-12-25",
"isChild": True,
"grade": 6,
"graduationYear": 2050,
"memberSince": "2023-12-25",
"primaryCampusId": "<string>",
"inactivatedAt": "2023-11-07T05:31:56Z",
"photoUrl": "<string>",
"employer": "<string>",
"occupation": "<string>",
"secondaryEmail": "jsmith@example.com",
"secondaryPhone": "<string>",
"workPhone": "<string>",
"emailOptOut": True,
"mailOptOut": True,
"smsOptOut": True,
"householdRef": "<string>",
"householdId": "<string>",
"householdName": "<string>",
"envelopeNumber": "<string>",
"organizationName": "<string>",
"defaultCurrency": "<string>",
"externalIds": {
"PUSHPAY": "<string>",
"PLANNING_CENTER": "<string>",
"CCB": "<string>",
"TITHELY": "<string>",
"SUBSPLASH": "<string>",
"ROCK_RMS": "<string>",
"MANUAL": "<string>",
"OTHER": "<string>"
}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, 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.",
"details": {
"fields": [
{
"field": "amount",
"code": "invalid_type"
}
]
}
}{
"code": "forbidden",
"message": "You do not have access to this organization.",
"error": "You do not have access to this organization.",
"details": {
"fields": [
{
"field": "amount",
"code": "invalid_type"
}
]
}
}{
"code": "forbidden",
"message": "You do not have access to this organization.",
"error": "You do not have access to this organization.",
"details": {
"fields": [
{
"field": "amount",
"code": "invalid_type"
}
]
}
}{
"code": "forbidden",
"message": "You do not have access to this organization.",
"error": "You do not have access to this organization.",
"details": {
"fields": [
{
"field": "amount",
"code": "invalid_type"
}
]
}
}{
"code": "forbidden",
"message": "You do not have access to this organization.",
"error": "You do not have access to this organization.",
"details": {
"fields": [
{
"field": "amount",
"code": "invalid_type"
}
]
}
}{
"code": "forbidden",
"message": "You do not have access to this organization.",
"error": "You do not have access to this organization.",
"details": {
"fields": [
{
"field": "amount",
"code": "invalid_type"
}
]
}
}{
"code": "forbidden",
"message": "You do not have access to this organization.",
"error": "You do not have access to this organization.",
"details": {
"fields": [
{
"field": "amount",
"code": "invalid_type"
}
]
}
}{
"code": "forbidden",
"message": "You do not have access to this organization.",
"error": "You do not have access to this organization.",
"details": {
"fields": [
{
"field": "amount",
"code": "invalid_type"
}
]
}
}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 for resource requests. Omit only for GET /api/v1/organizations. Optional with organization API keys; if supplied with an API key, it must match the key's organization.
Path Parameters
Resource ID
Body
application/json
All fields are optional. Send null to clear a nullable field.
Minimum string length:
1Minimum string length:
1Available options:
MALE, FEMALE, UNSPECIFIED Required range:
1 <= x <= 12Required range:
1900 <= x <= 2200Available options:
PUBLIC, PRIVATE, HOMESCHOOL, COLLEGE, OTHER Available options:
VISITOR, REGULAR_ATTENDER, MEMBER, INACTIVE, FORMER Available options:
PRIMARY, SPOUSE, CHILD, OTHER Available options:
EMAIL, PHONE, MAIL Available options:
INDIVIDUAL, HOUSEHOLD, ORGANIZATION, DAF_CUSTODIAN, FOUNDATION, ESTATE Required string length:
3Hide child attributes
Hide child attributes
Minimum string length:
1Minimum string length:
1Minimum string length:
1Minimum string length:
1Minimum string length:
1Minimum string length:
1Minimum string length:
1Minimum string length:
1Response
Updated 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 September 15, 2026