curl --request GET \
--url https://api.grainledger.com/api/v1/contributions \
--header 'Authorization: Bearer <token>'const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.grainledger.com/api/v1/contributions', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.grainledger.com/api/v1/contributions"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text){
"contributions": [
{
"id": "cm333ccc444ddd",
"donorId": "cm456def789ghi",
"amount": 250,
"date": "2026-07-06T00:00:00.000Z",
"fundId": "cm789ghi012jkl",
"method": "CHECK",
"isTaxDeductible": true,
"externalSource": "MANUAL"
}
],
"pagination": {
"page": 1,
"limit": 20,
"total": 890,
"totalPages": 45
}
}{
"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."
}List contributions
curl --request GET \
--url https://api.grainledger.com/api/v1/contributions \
--header 'Authorization: Bearer <token>'const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.grainledger.com/api/v1/contributions', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.grainledger.com/api/v1/contributions"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text){
"contributions": [
{
"id": "cm333ccc444ddd",
"donorId": "cm456def789ghi",
"amount": 250,
"date": "2026-07-06T00:00:00.000Z",
"fundId": "cm789ghi012jkl",
"method": "CHECK",
"isTaxDeductible": true,
"externalSource": "MANUAL"
}
],
"pagination": {
"page": 1,
"limit": 20,
"total": 890,
"totalPages": 45
}
}{
"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
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.
Query Parameters
Page number (1-based)
x >= 1Records per page
1 <= x <= 1000CASH, CHECK, CREDIT_CARD, ACH, ONLINE, STOCK, OTHER PENDING, SUCCEEDED, FAILED true, false DIRECT, DAF, QCD_IRA, MATCHING, FOUNDATION, ESTATE true, false true, false true, false PUSHPAY, PLANNING_CENTER, CCB, TITHELY, SUBSPLASH, ROCK_RMS, MANUAL, OTHER date, amount, donor, createdAt asc, desc Response
Paginated contributions
Hide child attributes
Hide child attributes
Calendar day represented as a UTC-midnight ISO timestamp.
CASH, CHECK, CREDIT_CARD, ACH, ONLINE, STOCK, OTHER Hide child attributes
Hide child attributes
PENDING, SUCCEEDED, FAILED Hide child attributes
Hide child attributes
DIRECT, DAF, QCD_IRA, MATCHING, FOUNDATION, ESTATE Present only with donor identity access.
Present only with donor identity access.
Hide child attributes
Hide child attributes
Hide child attributes
Hide child attributes
Hide child attributes
Hide child attributes
Calendar day represented as a UTC-midnight ISO timestamp.
Provider donor identifier. Null when the caller lacks donor identity access.
1 - 500