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

# ACH transfers

> Send and receive funds between a Tesouro-held account and an external bank account via the ACH network.

ACH (Automated Clearing House) is the standard rail for moving funds between a Tesouro-held account and an external bank account. Settlement runs through the bank's ACH operator and typically lands within one to three business days. ACH is not real-time and is not available on weekends or bank holidays.

`POST /embedded-banking/v1/money-movements/ach`

The request adds two fields beyond the common shape:

| Field     | Description                                                                                                                                        |
| :-------- | :------------------------------------------------------------------------------------------------------------------------------------------------- |
| `type`    | `INTERNAL_TO_EXTERNAL` for ACH push, or `EXTERNAL_TO_INTERNAL` for ACH pull. `INTERNAL_TO_INTERNAL` is rejected — use the book endpoint.           |
| `secCode` | SEC code identifying the transaction class: `PPD` (consumer), `CCD` (corporate), `WEB` (internet), `CTX` (corporate trade), `IAT` (international). |

The external account is referenced by its Tesouro-issued account ID, not raw routing and account numbers. It must already be linked through the linked-accounts flow.

Like every money-movement request, ACH accepts an `idempotencyKey`. Always send one so a retried submission returns the original transfer instead of creating a duplicate. See [Lifecycle & idempotency](/embedded-banking/guides/money-movement/lifecycle#idempotency).

ACH transfers start as `PENDING` and transition to `COMPLETED` once the upstream banking core confirms settlement. The terminal-state update happens lazily during reads — see [Lifecycle & idempotency](/embedded-banking/guides/money-movement/lifecycle#reading-transfer-state).

<Info>Required scope: `embedded:transfer:write` and `payment_rail:ach`.</Info>
