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

# download_bank_statement — Get a temporary statement download link

> Reference for the download_bank_statement MCP tool. Request a short-lived signed URL to download an existing bank statement PDF.

The `download_bank_statement` tool returns a temporary, signed download URL for an existing bank statement PDF. It never generates a new document; it only returns an existing one. The `accountId` and `statementMonth` must come from the same row returned by `list_bank_statements`. There is no separate statement ID. Every call must include `intent`, and the token must carry the `statements.read` scope.

## Scope

Required OAuth scope: `statements.read`

## Input

**organizationId** `string` *required*

The organization that owns the statement. Must be one of the organizations the token can access.

**accountId** `string` *required*

The account the statement belongs to. Must match the `accountId` from the same `list_bank_statements` row as `statementMonth`.

**statementMonth** `string` *required*

The statement month in strict `YYYY-MM` format. Must match the `month` from the same `list_bank_statements` row as `accountId`.

**intent** `string` *required*

What the user asked for and why this call serves it, in 1 to 500 characters. Required on every tool call. See [Common tool arguments](https://mcp.docs.relayfi.com/concepts/transport.md#common-tool-arguments).

## Output

**data** `StatementDownload` *required*

Statement download metadata and signed URL.

**StatementDownload**

**object** `string` *required*

Always `"statement_download"`.

**organizationId** `string` *required*

Organization the statement belongs to.

**accountId** `string` *required*

Account the statement belongs to.

**month** `string` *required*

Statement month in `YYYY-MM` format.

**fileName** `string` *required*

Suggested filename for the downloaded PDF.

**mimeType** `string` *required*

Always `"application/pdf"`.

**downloadUrl** `string` *required*

Short-lived signed HTTPS URL for the PDF. Valid for hours. Must not be cached or shared.

**expiresAt** `string` *required*

Timestamp when the `downloadUrl` expires, in RFC 3339 format.

## Three-part content array

Unlike other tools, `download_bank_statement` returns a three-part `content` array in addition to `structuredContent`:

1. **Text summary** naming the month and when the link expires.
2. **JSON payload** containing the full `StatementDownload` object.
3. **`resource_link`** with the temporary HTTPS download URL, labelled from the validated `month` rather than the returned `fileName`.

Your agent should present the `resource_link` to the user and avoid caching or sharing the URL.

## Example

```json Request theme={null}
{
  "jsonrpc": "2.0",
  "id": 9,
  "method": "tools/call",
  "params": {
    "name": "download_bank_statement",
    "arguments": {
      "intent": "User asked for a copy of their August 2026 statement for the Operating account.",
      "organizationId": "org_1",
      "accountId": "acc_1",
      "statementMonth": "2026-08"
    }
  }
}
```

```json Response theme={null}
{
  "jsonrpc": "2.0",
  "id": 9,
  "result": {
    "structuredContent": {
      "data": {
        "object": "statement_download",
        "organizationId": "org_1",
        "accountId": "acc_1",
        "month": "2026-08",
        "fileName": "statement-2026-08.pdf",
        "mimeType": "application/pdf",
        "downloadUrl": "https://cdn.example.com/signed-url",
        "expiresAt": "2026-08-21T00:00:00.000Z"
      }
    }
  }
}
```

## Notes

* The `accountId` and `statementMonth` must come from the same `list_bank_statements` row. Combining values from different rows is invalid.
* There is no statement ID. The tool is addressed by `accountId` plus `statementMonth`.
* The tool returns an existing document. It never generates one.
* `downloadUrl` is short-lived (hours, see `expiresAt`), single-purpose, and must not be cached or shared.
* If the statement does not exist or is not accessible with the provided token, the tool returns an MCP error: `Statement not found or not accessible.`

> [card] [list\_bank\_statements](https://mcp.docs.relayfi.com/tools/list-bank-statements.md)
>
> Discover available statement months before downloading.

> [card] [Result conventions](https://mcp.docs.relayfi.com/concepts/results.md)
>
> Learn how dual-channel output works across all tools.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.