Account Statement
Read all balances and a paginated list of operations for a user over a window.
POST /api/account/statement
Returns the API key user's current balances on every supported network plus a paginated feed of operations (deposits, withdrawals, payouts, transfers) within a date range.
GET /api/account/statement is also accepted, with the same parameters sent as query string (?from=...&to=...&limit=50&type=payout&type=transfer).
All amounts are in the asset's native units (e.g.
USDC, not cents). BRL is the only currency expressed as integer cents on receipt and decimal string here.
Request
curl --request POST \
--url https://api.hodle.com.br/api/account/statement \
--header "Authorization: Bearer $API_KEY" \
--header "Content-Type: application/json" \
--data '{
"from": "2026-04-01T00:00:00Z",
"to": "2026-05-01T00:00:00Z",
"limit": 50
}'const res = await fetch('https://api.hodle.com.br/api/account/statement', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.HODLE_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
from: '2026-04-01T00:00:00Z',
to: '2026-05-01T00:00:00Z',
limit: 50,
}),
})
const data = await res.json()import os, requests
res = requests.post(
"https://api.hodle.com.br/api/account/statement",
headers={
"Authorization": f"Bearer {os.environ['HODLE_API_KEY']}",
"Content-Type": "application/json",
},
json={
"from": "2026-04-01T00:00:00Z",
"to": "2026-05-01T00:00:00Z",
"limit": 50,
},
)
data = res.json()Parameters
| Field | Type | Required | Description |
|---|---|---|---|
from | string | No | ISO start of window (inclusive). Defaults to 30 days ago. Max window 90 days. |
to | string | No | ISO end of window (exclusive). Defaults to now. |
limit | integer | No | 1–200. Default 50. |
cursor | string | No | Continuation token from a previous response's nextCursor. |
type | string | No | Filter: deposit, withdraw, payout, transfer. Repeat to combine. |
subAccountId | string | No | Read the statement of one of your sub-accounts: its wallets and its operations. 404 if the sub-account is not yours. |
Response
{
"success": true,
"data": {
"balances": [
{ "network": "polygon", "asset": "USDT", "amount": "182.45" },
{ "network": "base", "asset": "USDC", "amount": "0.00" },
{ "network": "tron", "asset": "USDT", "amount": "0.00" },
{ "network": "solana", "asset": "USDC", "amount": "12.34" }
],
"subAccountId": null,
"operations": [
{
"id": "op_8f3a...",
"type": "payout",
"status": "COMPLETED",
"amount": "5.00",
"asset": "USDT",
"network": "polygon",
"valueInBrl": "27.40",
"fee": "1.55",
"txHash": "0xeafe9c...",
"endToEndId": "E12345...",
"externalId": "your-payout-id",
"reference": null,
"direction": "out",
"createdAt": "2026-04-28T23:32:10.000Z",
"completedAt": "2026-04-28T23:33:42.000Z"
},
{
"id": "op_b21f...",
"type": "deposit",
"status": "COMPLETED",
"amount": "100.00",
"asset": "USDC",
"network": "base",
"valueInBrl": "545.00",
"fee": "0.00",
"txHash": "0xa1b2...",
"endToEndId": "E31872495...",
"direction": "in",
"createdAt": "2026-04-26T14:11:02.000Z",
"completedAt": "2026-04-26T14:13:55.000Z"
}
],
"nextCursor": "c2Vla180MjkyMjEz",
"total": 137
}
}| Field | Type | Description |
|---|---|---|
data.balances | array | On-chain balance per network and asset, added up across every wallet of the account (or of the sub-account when subAccountId is sent), so a deposit to any of them shows here. |
data.subAccountId | string? | The sub-account the statement was read for, or null for your own account. |
data.operations | array | One row per operation, sorted by createdAt desc. |
data.nextCursor | string? | If present, pass back as cursor to fetch the next page. |
data.total | integer | Total count for the window — useful for pagination UIs. |
Operation fields
| Field | Type | Description |
|---|---|---|
operation.direction | string | in for money entering the account, out for money leaving it. |
operation.txHash | string? | On-chain hash of the delivery: for a deposit, the transfer to your wallet. |
operation.endToEndId | string? | PIX endToEndId: the payer's for a deposit, the receiver's for a payout. |
operation.externalId | string? | The externalId you sent when creating the operation, to match it to your own record. |
Operation types
| Type | Source endpoint | Direction |
|---|---|---|
deposit | /api/deposit/asset | In |
withdraw | Legacy off-ramp (no longer offered) | Out |
payout | /api/wallet/payout | Out |
transfer | /api/wallet/transfer | Out |
lightning | /api/lightning/invoice (paid) | In |
Errors
{ "success": false, "error": "Window must be at most 90 days" }{ "success": false, "error": "Invalid or expired cursor" }