Statements
Use the statements and statement queries to retrieve an Individual's monthly account statements. The list query returns lightweight summaries. The detail query returns the full statement: period, balances, interest, and every transaction in the period.
These queries return structured data, not documents. You render the statement experience in your own application, using your own formatting and branding.
Today, only HSA Benefits produce statements. The API is forward-compatible: filters that select other Benefit types return an empty list, not an error.
What you need
individualId— the Individual whose statements to retrieve. This is theidreturned by createIndividual or the individuals query.
List an Individual's statements
Statements are ordered by period start date, most recent first.
query Statements($where: StatementsFilterInput!, $after: String, $first: Int) {
statements(where: $where, after: $after, first: $first) {
... on StatementsResults {
nodes {
id
periodStartDate
periodEndDate
}
pageInfo {
hasNextPage
endCursor
}
}
... on BadRequestError {
message
code
retryable
}
... on InternalServerError {
message
code
retryable
}
}
}
Variables:
{
"where": { "individualId": "<individualId>" },
"first": 25
}
A successful response:
{
"data": {
"statements": {
"nodes": [
{
"id": "<statementId>",
"periodStartDate": "2026-05-01",
"periodEndDate": "2026-05-31"
},
{
"id": "<statementId>",
"periodStartDate": "2026-04-01",
"periodEndDate": "2026-04-30"
}
],
"pageInfo": {
"hasNextPage": false,
"endCursor": "<cursor>"
}
}
}
}
An enrolled Individual with no statements yet returns an empty nodes list.
Pagination
The list is cursor-paginated. To fetch the next page, pass the previous page's endCursor as after and check hasNextPage. Cursors are opaque; do not parse or construct them.
Filters
All filters are optional. Omitted filters do not restrict the result.
| Filter | Behavior |
|---|---|
benefitTypes | Only statements for accounts of these Benefit types. Today only HSA produces statements. |
benefitIds | Only statements for accounts associated with these Benefits. |
periodStartsOnOrAfter | Only statements whose period starts on or after this date (inclusive). |
periodEndsOnOrBefore | Only statements whose period ends on or before this date (inclusive). |
Filters that match no statement-bearing account — for example, benefitTypes: [FSA] — return an empty list, not an error.
For example, to list statements for periods within 2026:
{
"where": {
"individualId": "<individualId>",
"benefitTypes": ["HSA"],
"periodStartsOnOrAfter": "2026-01-01",
"periodEndsOnOrBefore": "2026-12-31"
}
}
Get a statement
Fetch the full statement with the statement query, using an id returned by the list query.
query Statement($where: StatementFilterInput!) {
statement(where: $where) {
... on Statement {
id
periodStartDate
periodEndDate
benefitType
accountNumberForDisplay
startingBalance {
currency
lowestDenominationAmount
amount
}
endingBalance {
currency
lowestDenominationAmount
amount
}
interestEarnedForPeriod {
currency
lowestDenominationAmount
amount
}
interestPaidForPeriod {
currency
lowestDenominationAmount
amount
}
transactions {
id
date
description
type
category
amount {
currency
lowestDenominationAmount
amount
}
balance {
currency
lowestDenominationAmount
amount
}
}
}
... on BadRequestError {
message
code
retryable
}
... on InternalServerError {
message
code
retryable
}
}
}
Variables:
{
"where": {
"individualId": "<individualId>",
"id": "<statementId>"
}
}
A successful response:
{
"data": {
"statement": {
"id": "<statementId>",
"periodStartDate": "2026-05-01",
"periodEndDate": "2026-05-31",
"benefitType": "HSA",
"accountNumberForDisplay": "****1234",
"startingBalance": {
"currency": "USD",
"lowestDenominationAmount": 125000,
"amount": 1250
},
"endingBalance": {
"currency": "USD",
"lowestDenominationAmount": 130000,
"amount": 1300
},
"interestEarnedForPeriod": {
"currency": "USD",
"lowestDenominationAmount": 52,
"amount": 0.52
},
"interestPaidForPeriod": {
"currency": "USD",
"lowestDenominationAmount": 48,
"amount": 0.48
},
"transactions": [
{
"id": "<transactionId>",
"date": "2026-05-15",
"description": "Payroll contribution",
"type": "DEPOSIT",
"category": "Employee contribution",
"amount": {
"currency": "USD",
"lowestDenominationAmount": 5000,
"amount": 50
},
"balance": {
"currency": "USD",
"lowestDenominationAmount": 130000,
"amount": 1300
}
}
]
}
}
}
Notes:
- Transaction
amountvalues are signed: positive amounts are credits, negative amounts are debits. - Each transaction's
balanceis the account balance immediately after that transaction. interestEarnedForPeriodandinterestPaidForPeriodare null when not available for the period.- See StatementTransactionType for the full set of transaction types.
Errors
Returns BadRequestError when:
- The Individual cannot be found. The
individualIdis unknown or does not belong to your organizations. - The statement cannot be found. The
idis unknown or does not belong to the suppliedindividualId.
Unexpected failures return InternalServerError; these are safe to retry.
See also
- Tax Forms — 1099-SA and 5498-SA data for an Individual, plus secure PDF downloads.