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.

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

FieldTypeRequiredDescription
fromstringYesISO start of window (inclusive).
tostringYesISO end of window (exclusive).
limitintegerNo1–200. Default 50.
cursorstringNoContinuation token from a previous response's nextCursor.
typestringNoFilter: deposit, withdraw, payout, transfer. Repeat to combine.

Response

200 OK
{
  "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"   }
    ],
    "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...",
        "reference": null,
        "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...",
        "createdAt": "2026-04-26T14:11:02.000Z",
        "completedAt": "2026-04-26T14:13:55.000Z"
      }
    ],
    "nextCursor": "c2Vla180MjkyMjEz",
    "total": 137
  }
}
FieldTypeDescription
data.balancesarraySame shape as POST /api/wallet/get.
data.operationsarrayOne row per operation, sorted by createdAt desc.
data.nextCursorstring?If present, pass back as cursor to fetch the next page.
data.totalintegerTotal count for the window — useful for pagination UIs.

Operation types

TypeSource endpointDirection
deposit/api/deposit/assetIn
withdraw/api/withdraw/pixOut
payout/api/wallet/payoutOut
transfer/api/wallet/transferOut
lightning/api/lightning/invoice (paid)In

Errors

400 — window too wide
{ "success": false, "error": "Window must be at most 90 days" }
400 — invalid cursor
{ "success": false, "error": "Invalid or expired cursor" }