curl --request GET \
--url https://api.grainledger.com/api/v1/transactions \
--header 'Authorization: Bearer <token>'const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.grainledger.com/api/v1/transactions', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.grainledger.com/api/v1/transactions"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text){
"transactions": [
{
"id": "cm111aaa222bbb",
"externalId": null,
"description": "Office Depot",
"amount": 184.32,
"direction": "OUTFLOW",
"transactionType": "WITHDRAWAL",
"date": "2026-07-01T00:00:00.000Z",
"referenceNumber": null,
"source": "PLAID",
"reviewStatus": "AUTO_CATEGORIZED",
"isReconciled": false,
"is1099Excluded": false,
"bankAccount": {
"id": "cm333ccc444ddd",
"name": "Operating Checking",
"mask": "4821",
"accountType": "depository"
},
"sourceAccount": {
"id": "cm555eee666fff",
"accountNumber": "1010",
"name": "Operating Checking",
"accountType": "ASSET"
},
"fund": {
"id": "cm789ghi012jkl",
"name": "General Fund",
"fundType": "UNRESTRICTED"
},
"vendor": {
"id": "cm777ggg888hhh",
"name": "Office Depot"
},
"dimensions": [
{
"dimensionId": "cm999iii000jjj",
"dimensionName": "Department",
"dimensionValueId": "cm121kkk232lll",
"dimensionValueName": "Administration"
}
],
"coding": {
"status": "CATEGORIZED",
"journalEntryId": "cm343mmm454nnn",
"entryNumber": "JE-1042",
"isSplit": false,
"lines": [
{
"id": "cm565ooo676ppp",
"account": {
"id": "cm787qqq898rrr",
"accountNumber": "6100",
"name": "Office Supplies",
"accountType": "EXPENSE"
},
"fund": {
"id": "cm789ghi012jkl",
"name": "General Fund",
"fundType": "UNRESTRICTED"
},
"amount": 184.32,
"memo": null,
"dimensions": [
{
"dimensionId": "cm999iii000jjj",
"dimensionName": "Department",
"dimensionValueId": "cm121kkk232lll",
"dimensionValueName": "Administration"
}
]
}
],
"missingRequiredDimensions": []
},
"suggestion": null,
"attachmentCount": 1,
"canManage": true,
"createdAt": "2026-07-02T14:03:11.000Z",
"updatedAt": "2026-07-02T14:05:40.000Z"
}
],
"pagination": {
"page": 1,
"limit": 20,
"total": 58,
"totalPages": 3
}
}{
"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"
}
]
}
}List transactions
Returns bank, card, and manual transactions with their coding. Comma-separated ID filters match any listed ID.
curl --request GET \
--url https://api.grainledger.com/api/v1/transactions \
--header 'Authorization: Bearer <token>'const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.grainledger.com/api/v1/transactions', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.grainledger.com/api/v1/transactions"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text){
"transactions": [
{
"id": "cm111aaa222bbb",
"externalId": null,
"description": "Office Depot",
"amount": 184.32,
"direction": "OUTFLOW",
"transactionType": "WITHDRAWAL",
"date": "2026-07-01T00:00:00.000Z",
"referenceNumber": null,
"source": "PLAID",
"reviewStatus": "AUTO_CATEGORIZED",
"isReconciled": false,
"is1099Excluded": false,
"bankAccount": {
"id": "cm333ccc444ddd",
"name": "Operating Checking",
"mask": "4821",
"accountType": "depository"
},
"sourceAccount": {
"id": "cm555eee666fff",
"accountNumber": "1010",
"name": "Operating Checking",
"accountType": "ASSET"
},
"fund": {
"id": "cm789ghi012jkl",
"name": "General Fund",
"fundType": "UNRESTRICTED"
},
"vendor": {
"id": "cm777ggg888hhh",
"name": "Office Depot"
},
"dimensions": [
{
"dimensionId": "cm999iii000jjj",
"dimensionName": "Department",
"dimensionValueId": "cm121kkk232lll",
"dimensionValueName": "Administration"
}
],
"coding": {
"status": "CATEGORIZED",
"journalEntryId": "cm343mmm454nnn",
"entryNumber": "JE-1042",
"isSplit": false,
"lines": [
{
"id": "cm565ooo676ppp",
"account": {
"id": "cm787qqq898rrr",
"accountNumber": "6100",
"name": "Office Supplies",
"accountType": "EXPENSE"
},
"fund": {
"id": "cm789ghi012jkl",
"name": "General Fund",
"fundType": "UNRESTRICTED"
},
"amount": 184.32,
"memo": null,
"dimensions": [
{
"dimensionId": "cm999iii000jjj",
"dimensionName": "Department",
"dimensionValueId": "cm121kkk232lll",
"dimensionValueName": "Administration"
}
]
}
],
"missingRequiredDimensions": []
},
"suggestion": null,
"attachmentCount": 1,
"canManage": true,
"createdAt": "2026-07-02T14:03:11.000Z",
"updatedAt": "2026-07-02T14:05:40.000Z"
}
],
"pagination": {
"page": 1,
"limit": 20,
"total": 58,
"totalPages": 3
}
}{
"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
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.
Query Parameters
Page number (1-based)
x >= 1Transactions per page
1 <= x <= 100Matches description, reference number, or amount.
DEPOSIT, WITHDRAWAL, TRANSFER, ADJUSTMENT true, false true returns transactions with a journal entry; false returns uncategorized transactions.
true, false true, false DRAFT, PENDING_REVIEW, AUTO_CATEGORIZED, APPROVED, POSTED, REJECTED PLAID, RAMP, MANUAL, IMPORT Find the transaction created with this externalId.
Comma-separated fund IDs.
Comma-separated vendor IDs.
Comma-separated category account IDs.
Comma-separated bank or card feed account IDs.
date, amount, description, createdAt asc, desc Response
Paginated transactions
Hide child attributes
Hide child attributes
Integrator-supplied ID, unique within the organization.
Always positive. Use direction for the sign.
x >= 0INFLOW, OUTFLOW DEPOSIT, WITHDRAWAL, TRANSFER, ADJUSTMENT Calendar day represented as a UTC-midnight ISO timestamp.
MANUAL, PLAID, IMPORT, PLANNING_CENTER, PUSHPAY, TITHELY, SUBSPLASH, ROCK_RMS, RAMP, DIVVY, OVERFLOW DRAFT, PENDING_REVIEW, PENDING_TRANSFER_MATCH, PENDING_TRANSFER_CONFIRM, AUTO_CATEGORIZED, APPROVED, POSTED, REJECTED Hide child attributes
Hide child attributes
UNCATEGORIZED has no journal entry. CATEGORIZED has a draft entry. APPROVED has a posted entry.
UNCATEGORIZED, CATEGORIZED, APPROVED Category-side journal lines. The bank or card line is omitted.
Hide child attributes
Hide child attributes
Journal entry line ID.
Allocated amount. Positive values allocate the transaction; negative values offset another line.
Hide child attributes
Hide child attributes
Rule or AI coding suggestion awaiting review.
Hide child attributes
Hide child attributes
0 <= x <= 100x >= 0Whether this credential can edit the transaction.