# Report

> `Report` provides method to retrieve historical transactions and current balances/positions.

Method reference: [Methods](/sdk/docs/report/methods). Per-venue specifics: [Implementations](/sdk/docs/report/implementations).

## Accounts & providers

`ReportSDK` has no built-in default accounts (unlike `MarketSDK`/`WalletSDK`/`EarnSDK`) — every account must be listed explicitly. Both record types carry a `Provenance` (api/tabular/manual/derived) tracing where they came from. `providers` (BigQuery/Alchemy/Etherscan/Moralis credentials) are only needed by chain-based venues that use them.

## Example

```python
from tribulnation.sdk import ReportSDK, accounts
from dotenv import load_dotenv

load_dotenv()

report = ReportSDK(
  {
    'ethereum': accounts.Evm('ethereum'),
    'polygon': accounts.Evm('polygon'),
    'hyperevm': accounts.Evm('hyperevm'),
  }
)

for account, sdk in report.all.items():
  async with sdk:
    result = await sdk.snapshot()
  snapshot = result.snapshot
  print(
    f'[{account}] ({snapshot.time:%Y-%m-%d %H:%M:%S}) from {result.provenance["source"]}'
  )
  for subaccount in snapshot.subaccounts:
    print(f'> account: {subaccount.subaccount}')
    for asset, balance in subaccount.balances.items():
      print(f'> {asset}: {balance}')
    for instrument, position in subaccount.positions.items():
      print(f'> {instrument}: {position.size} @ {position.avg_price}')
  print()
```

`report.all` is eager: it resolves every configured account at once, so a single
venue without reporting wired raises and you get nothing. Reach for
`report.venue(id)` when the workspace may contain one — see the
[support matrix](https://tribulnation.com/sdk/docs/support) for which venues are wired.

Reports own network clients, so use them as async context managers. Entering one
enters everything it owns and releases it on exit; see [Async Usage](/sdk/docs/reference/async-usage).
