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

# Move money externally

> Send money to a saved external account.

Creates a transfer from a Lemma account to a [saved recipient](/docs/api-reference/saved-recipients) — an external bank account registered in Lemma. External transfers are sent via ACH and typically settle within 1-2 business days.

<Info>
  Transfers over \$100,000 are held for manual review by the Lemma team as a
  security measure to protect your accounts in the event of a compromised API
  key. Need higher limits? [Contact us](mailto:contact@getlemma.com).
</Info>

## Headers

<ParamField header="Idempotency-Key" type="string" required>
  A key that lets you safely retry the request without sending the same ACH
  transfer more than once. See [Idempotency](/docs/api-reference/idempotency).
</ParamField>

## Request body

<ParamField body="source_account_id" type="string" required>
  The ID of the Lemma account to send money from.
</ParamField>

<ParamField body="destination_account_id" type="string" required>
  The ID of a [saved recipient](/docs/api-reference/saved-recipients). You cannot
  send money to an arbitrary bank account — it must be a pre-registered
  recipient belonging to your entity.
</ParamField>

<ParamField body="amount" type="integer" required>
  The amount to transfer in cents. Must be greater than zero.
</ParamField>

<ParamField body="description" type="string">
  A description for the transfer. Appears on the sender's transaction history.
</ParamField>

## Response

Returns the created ACH transfer object.

<ResponseField name="id" type="string">
  Unique identifier for the ACH transfer.
</ResponseField>

<ResponseField name="account_id" type="string">
  The Lemma account the transfer moves money from or to.
</ResponseField>

<ResponseField name="external_account_id" type="string | null">
  The [external account](/docs/api-reference/saved-recipients) on the other side of
  the transfer.
</ResponseField>

<ResponseField name="amount" type="integer">
  The transfer amount in cents. A positive amount indicates a credit transfer
  pushing funds to the receiving account. A negative amount indicates a debit
  transfer pulling funds from the receiving account (an ACH pull).
</ResponseField>

<ResponseField name="status" type="string">
  Current status of the ACH transfer.

  <Expandable title="possible values">
    * `pending` — in flight.

    * `submitted` — sent to the ACH network. When the Federal Reserve settles the transfer, the status stays `submitted` and `settled_at` is populated.

    * `canceled` — we canceled the transfer after holding it for manual review.

    * `rejected` — the ACH network rejected the transfer.

    * `returned` — the transfer was returned.
  </Expandable>
</ResponseField>

<ResponseField name="statement_descriptor" type="string">
  The statement descriptor shown to the counterparty.
</ResponseField>

<ResponseField name="transaction_id" type="string | null">
  The settled transaction, once the transfer posts.
</ResponseField>

<ResponseField name="settled_at" type="string | null">
  [ISO 8601](/docs/api-reference/timestamps) timestamp of when the transfer settled.
</ResponseField>

<ResponseField name="submission" type="object | null">
  Submission details, once the transfer reaches the ACH network.

  <Expandable title="Submission object">
    <ResponseField name="submitted_at" type="string">
      [ISO 8601](/docs/api-reference/timestamps) timestamp of when the transfer was
      submitted to the ACH network.
    </ResponseField>

    <ResponseField name="expected_funds_settlement_at" type="string | null">
      [ISO 8601](/docs/api-reference/timestamps) timestamp of when the funds are
      expected to settle.
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="return" type="object | null">
  Return details, if the transfer was returned.

  <Expandable title="Return object">
    <ResponseField name="raw_return_reason_code" type="string">
      The three-character ACH return reason code.

      <Expandable title="ACH return reason codes">
        | Code | Description |
        | - | - |
        | `R01` | Insufficient Funds |
        | `R02` | Account Closed |
        | `R03` | No Account on File |
        | `R04` | Invalid Account Number Structure |
        | `R05` | Unauthorized Debit to Consumer Account Using Corporate SEC Code |
        | `R06` | Returned per ODFI's Request |
        | `R07` | Authorization Revoked by Customer |
        | `R08` | Payment Stopped |
        | `R09` | Uncollected Funds |
        | `R10` | Customer Advises Unauthorized, Improper, Ineligible, or Incomplete |
        | `R11` | Customer Advises Entry Not in Accordance with Terms of Authorization |
        | `R12` | Account Sold to Another DFI |
        | `R13` | Invalid ACH Routing Number |
        | `R14` | Representative Payee Deceased or Unable to Continue in That Capacity |
        | `R15` | Beneficiary or Account Holder Deceased |
        | `R16` | Account Frozen or Entry Returned per OFAC Instruction |
        | `R17` | File Record Edit Criteria |
        | `R18` | Improper Effective Entry Date |
        | `R19` | Amount Field Error |
        | `R20` | Non-Transaction Account |
        | `R21` | Invalid Company Identification |
        | `R22` | Invalid Individual Identification Number |
        | `R23` | Credit Entry Refused by Receiver |
        | `R24` | Duplicate Entry |
        | `R25` | Addenda Error |
        | `R26` | Mandatory Field Error |
        | `R27` | Trace Number Error |
        | `R28` | Routing Number Check Digit Error |
        | `R29` | Corporate Customer Advises Not Authorized |
        | `R30` | RDFI Not Participant in Check Truncation Program |
        | `R31` | Permissible Return Entry |
        | `R32` | RDFI Non-Settlement |
        | `R33` | Return of XCK Entry |
        | `R34` | Limited Participation DFI |
        | `R35` | Return of Improper Debit Entry |
        | `R36` | Return of Improper Credit Entry |
        | `R37` | Source Document Presented for Payment |
        | `R38` | Stop Payment on Source Document |
        | `R39` | Improper Source Document or Source Document Presented |
        | `R40` | Return of ENR Entry |
        | `R41` | Invalid Transaction Code |
        | `R42` | Routing Number / Account Number Mismatch |
        | `R43` | Invalid DFI Account Number |
        | `R44` | Invalid Individual Identifier |
        | `R45` | Invalid Individual Name |
        | `R46` | Invalid Representative Payee Indicator |
        | `R47` | Duplicate Enrollment |
        | `R50` | State Law Affecting RCK Acceptance |
        | `R51` | Item is Ineligible, Notice Not Provided |
        | `R52` | Stop Payment on Item |
        | `R53` | Item and ACH Entry Presented for Payment |
        | `R61` | Misrouted Return |
        | `R62` | Incorrect Trace Number |
        | `R63` | Incorrect Dollar Amount |
        | `R64` | Incorrect Individual Identification |
        | `R65` | Incorrect Transaction Code |
        | `R66` | Incorrect Company Identification |
        | `R67` | Duplicate Return |
        | `R68` | Untimely Return |
        | `R69` | Multiple Errors |
        | `R70` | Permissible Return Entry Not Accepted / Notice Not Provided |
        | `R71` | Misrouted Dishonored Return |
        | `R72` | Untimely Dishonored Return |
        | `R73` | Timely Original Return |
        | `R74` | Corrected Return |
        | `R75` | Return Not a Duplicate |
        | `R76` | No Errors Found |
        | `R77` | Non-Acceptance of R62 Dishonored Return |
        | `R78` | Non-Acceptance of R68 Dishonored Return |
        | `R79` | Incorrect Data in Return Entry |
        | `R80` | IAT Entry |
        | `R81` | Non-Participant in IAT Program |
        | `R82` | Invalid Foreign Receiving DFI Identification |
        | `R83` | Foreign Receiving DFI Unable to Settle |
        | `R84` | Entry Not Processed by Gateway |
        | `R85` | Incorrectly Coded Outbound International Payment |
      </Expandable>
    </ResponseField>

    <ResponseField name="return_transaction_id" type="string | null">
      The transaction created when the transfer was returned.
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseExample>
  ```json 200 theme={null}
  {
    "id": "ach_transfer_Lk7nQx4mVp9bRt3d",
    "account_id": "account_Rv4nBt8xKw2pMh6s",
    "external_account_id": "external_account_Bx5nTm8hKw3pVd7c",
    "amount": 150000,
    "status": "submitted",
    "statement_descriptor": "Acme payroll",
    "transaction_id": null,
    "settled_at": null,
    "submission": {
      "submitted_at": "2026-03-15T14:30:00Z",
      "expected_funds_settlement_at": "2026-03-17T14:30:00Z"
    },
    "return": null
  }
  ```
</ResponseExample>


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