> ## Documentation Index
> Fetch the complete documentation index at: https://docs.stablemint.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Reports

> Download an account or transaction statement as CSV.

Two endpoints return a statement as a CSV file: a point-in-time view of your balances, and a
transaction listing over a period you choose.

| Report                | Operation                               | Covers                                 |
| --------------------- | --------------------------------------- | -------------------------------------- |
| Account statement     | `GET /v1/reports/account-statement`     | Balances now, one row per currency     |
| Transaction statement | `GET /v1/reports/transaction-statement` | Settled transactions between two dates |

Both respond with `text/csv` as a file download, not JSON. Both require the same permission as
reading transactions.

<Note>
  Every example on this page is a signed request. `$SIGNATURE` is computed per request over a
  canonical string — see [Authentication](/guides/authentication). Bearer tokens are not accepted.
</Note>

<Warning>
  **The query string is signed.** Both reports take every parameter in the query, including
  repeated `currencies`. Sort and percent-encode it exactly as
  [the canonical string](/guides/authentication#the-canonical-string) requires, or you get `401`
  `signature_invalid` before any of this is evaluated.
</Warning>

## Parameters

<ParamField query="format" type="string" required>
  The only accepted value is `Csv`, matched case-insensitively. The API reference marks this
  optional — **it is not**. Omitting it fails the request, and any other value returns `422` with
  `code: ReportFormatNotAllowed`.
</ParamField>

<ParamField query="currencies" type="string[]" required>
  Repeat the parameter once per currency: `?currencies=EUR&currencies=USD`. The reference does not
  mark it required, but an empty list returns `422` with `code: ReportCurrencyNotAllowed`, as does
  any currency you do not hold an account in.
</ParamField>

<ParamField query="from" type="string">
  Transaction statement only. UTC date, inclusive.
</ParamField>

<ParamField query="to" type="string">
  Transaction statement only. UTC date, inclusive.
</ParamField>

<Warning>
  **Always send `from` and `to` on a transaction statement.** They are not rejected when absent —
  they default to the zero date, and you get a CSV headed `Period from,0001-01-01` containing
  nothing. The period must not run backwards and cannot exceed 365 days; either returns `422` with
  `code: ReportPeriodNotAllowed`.
</Warning>

## Account statement

Balances as at the moment you call it. There is no period — `from` and `to` are not read.

```bash theme={null}
curl "https://api.stablemint.net/v1/reports/account-statement?currencies=EUR&currencies=USD&format=Csv" \
  -H "ApiKey: $STABLEMINT_API_KEY" \
  -H "Timestamp: $TIMESTAMP" \
  -H "Nonce: $NONCE" \
  -H "Signature: $SIGNATURE" \
  -o account-statement.csv
```

One row per currency, carrying the total balance alongside the business and customer split.

<Note>
  Total balance is the full account balance, including both business and customer funds. Total
  deposits and withdrawals cover business fiat and conversions only, so they do not net to the
  total balance — the CSV repeats this in a note line.
</Note>

## Transaction statement

Settled transactions over a period, for the currencies you name.

```bash theme={null}
curl "https://api.stablemint.net/v1/reports/transaction-statement?currencies=EUR&format=Csv&from=2026-08-01&to=2026-08-31" \
  -H "ApiKey: $STABLEMINT_API_KEY" \
  -H "Timestamp: $TIMESTAMP" \
  -H "Nonce: $NONCE" \
  -H "Signature: $SIGNATURE" \
  -o transaction-statement.csv
```

Columns: Transaction ID, Date (UTC), Value Date (UTC), Type, Direction, Status, Description,
Counterparty, Counterparty Account, Amount. Dates are inclusive UTC days — `to=2026-08-31` includes
everything up to `23:59:59.999` on the 31st. A currency with nothing in the period is still
sectioned, marked `No transactions in this period`.

<Note>
  Only settled transactions appear. Something still in flight is in
  [Transactions](/guides/transactions) before it is in a statement, so use that endpoint to track a
  payout and a statement to reconcile a closed period.
</Note>

## Errors

| Status | `code`                     | Meaning                                                                           |
| ------ | -------------------------- | --------------------------------------------------------------------------------- |
| `422`  | `ReportFormatNotAllowed`   | `format` was missing or was not `Csv`.                                            |
| `422`  | `ReportCurrencyNotAllowed` | `currencies` was empty, or named a currency you hold no account in.               |
| `422`  | `ReportPeriodNotAllowed`   | The period runs backwards or is longer than 365 days.                             |
| `401`  | `signature_invalid`        | The signature did not verify — most often the query string was not canonicalised. |
| `403`  | `permission_denied`        | The service account lacks the transaction-read permission.                        |
