---
title: "Create an ACH offramp"
method: POST
path: "/money/ach/offramp"
tags: ["money", "movements", "create"]
---

# Create an ACH offramp

`POST /money/ach/offramp`

Initiates an ACH-push offramp movement to the supplied US bank account. An amount above the group's approval threshold is queued for a second member to approve instead of executing (outcome=approval_pending).

## Headers

- `Idempotency-Key` string, required — Required client idempotency key; a duplicate submission with the same key is rejected with 409.

## Request body

- MoneyMovementsCreateBankMoneyMovementInput
  - `account_id` string, required
  - `amount_usd` string, required

## Response `200`

OK

- MoneyMovementsCreateMoneyMovementOutput
  - `money_movement_id` string
  - `outcome` 'created' | 'approval_pending'
  - `transaction` MoneyMovementsMoneyMovementView
    - `automation_id` string, nullable
    - `complete` boolean, required
    - `completed_ts` string, date-time
    - `created_by` string, required
    - `created_ts` string, date-time, required
    - `failed_ts` string, date-time
    - `fee` MoneyfmtMoneyAmountView
      - `float` number, double, required
      - `formatted` MoneyfmtFormattedMoneyAmountView, required
        - `compact` string, required
        - `currency_sign` string, required
        - `currency_sign_position` string, required
        - `full` string, required
      - `precise` string, required
      - `symbol` string, required
      - `zero` boolean, required
    - `fund_symbol` string
    - `group_id` string, required
    - `id` string, required
    - `input` MoneyMovementsTransactionSideView, required
      - `amount` MoneyfmtMoneyAmountView, required
        - `float` number, double, required
        - `formatted` MoneyfmtFormattedMoneyAmountView, required
          - `compact` string, required
          - `currency_sign` string, required
          - `currency_sign_position` string, required
          - `full` string, required
        - `precise` string, required
        - `symbol` string, required
        - `zero` boolean, required
      - `amount_estimated` boolean, required — Whether amount is still an estimate — the leg's quoted subtotal, carried because the leg's figure is not final. True means the figure can still move and must be presented as an estimate rather than as a settled one. False means it can no longer change, either because the leg reached a terminal state or because it carries the figure the customer named at order entry (a fund buy's dollars, a fund sell's shares); it does not promise the figure was observed.
      - `money_account_id` string, required
      - `money_symbol` string, required
      - `payment_rail` string
      - `quoted_amount` MoneyfmtMoneyAmountView
        - `float` number, double, required
        - `formatted` MoneyfmtFormattedMoneyAmountView, required
          - `compact` string, required
          - `currency_sign` string, required
          - `currency_sign_position` string, required
          - `full` string, required
        - `precise` string, required
        - `symbol` string, required
        - `zero` boolean, required
    - `metadata` MoneyMovementsMovementMetadataView, required
      - `created_by` string, required
      - `created_ts` string, date-time, required
      - `updated_ts` string, date-time, required
    - `net_amount_estimated` boolean — Whether net_amount_view can still move. True while the cash leg it is computed from is neither final nor the figure the customer named at order entry, in which case the settled net is for now the quoted one. Always false on a fund buy, whose cash figure the customer fixed when placing the order; a BTC trade order gets no such exemption in either direction. False when there is no net amount at all, so read it only alongside net_amount_view.
    - `net_amount_view` MoneyfmtMoneyAmountView
      - `float` number, double, required
      - `formatted` MoneyfmtFormattedMoneyAmountView, required
        - `compact` string, required
        - `currency_sign` string, required
        - `currency_sign_position` string, required
        - `full` string, required
      - `precise` string, required
      - `symbol` string, required
      - `zero` boolean, required
    - `occurred_ts` string, date-time, required
    - `onchain_transactions` MoneyMovementsOnchainTransactionView[]
      - `chain` string
      - `explorer_url` string
      - `tx_hash` string, required
    - `output` MoneyMovementsTransactionSideView, required
      - `amount` MoneyfmtMoneyAmountView, required
        - `float` number, double, required
        - `formatted` MoneyfmtFormattedMoneyAmountView, required
          - `compact` string, required
          - `currency_sign` string, required
          - `currency_sign_position` string, required
          - `full` string, required
        - `precise` string, required
        - `symbol` string, required
        - `zero` boolean, required
      - `amount_estimated` boolean, required — Whether amount is still an estimate — the leg's quoted subtotal, carried because the leg's figure is not final. True means the figure can still move and must be presented as an estimate rather than as a settled one. False means it can no longer change, either because the leg reached a terminal state or because it carries the figure the customer named at order entry (a fund buy's dollars, a fund sell's shares); it does not promise the figure was observed.
      - `money_account_id` string, required
      - `money_symbol` string, required
      - `payment_rail` string
      - `quoted_amount` MoneyfmtMoneyAmountView
        - `float` number, double, required
        - `formatted` MoneyfmtFormattedMoneyAmountView, required
          - `compact` string, required
          - `currency_sign` string, required
          - `currency_sign_position` string, required
          - `full` string, required
        - `precise` string, required
        - `symbol` string, required
        - `zero` boolean, required
    - `price_per_unit_estimated` boolean — Whether price_per_unit_view was derived from a leg whose figure is not final, so the price can still move. True until both the cash leg and the share leg are final, because a fund trade prices at the net asset value struck at settlement; either leg alone is enough. False when there is no price at all, so read it only alongside price_per_unit_view.
    - `price_per_unit_view` MoneyfmtMoneyAmountView
      - `float` number, double, required
      - `formatted` MoneyfmtFormattedMoneyAmountView, required
        - `compact` string, required
        - `currency_sign` string, required
        - `currency_sign_position` string, required
        - `full` string, required
      - `precise` string, required
      - `symbol` string, required
      - `zero` boolean, required
    - `quoted_net_amount_view` MoneyfmtMoneyAmountView
      - `float` number, double, required
      - `formatted` MoneyfmtFormattedMoneyAmountView, required
        - `compact` string, required
        - `currency_sign` string, required
        - `currency_sign_position` string, required
        - `full` string, required
      - `precise` string, required
      - `symbol` string, required
      - `zero` boolean, required
    - `quoted_price_per_unit_view` MoneyfmtMoneyAmountView
      - `float` number, double, required
      - `formatted` MoneyfmtFormattedMoneyAmountView, required
        - `compact` string, required
        - `currency_sign` string, required
        - `currency_sign_position` string, required
        - `full` string, required
      - `precise` string, required
      - `symbol` string, required
      - `zero` boolean, required
    - `settlement_commission_view` MoneyfmtMoneyAmountView
      - `float` number, double, required
      - `formatted` MoneyfmtFormattedMoneyAmountView, required
        - `compact` string, required
        - `currency_sign` string, required
        - `currency_sign_position` string, required
        - `full` string, required
      - `precise` string, required
      - `symbol` string, required
      - `zero` boolean, required
    - `settlement_pathway` string
    - `settlement_ts` string, date-time
    - `status` 'pending' | 'completed' | 'failed', required
    - `transaction_count` integer, required
    - `type` string, required
  - `transfer_approval` MoneyMovementsTransferApprovalView
    - `amount_usd` MoneyfmtMoneyAmountView
      - `float` number, double, required
      - `formatted` MoneyfmtFormattedMoneyAmountView, required
        - `compact` string, required
        - `currency_sign` string, required
        - `currency_sign_position` string, required
        - `full` string, required
      - `precise` string, required
      - `symbol` string, required
      - `zero` boolean, required
    - `decided_by` string, nullable
    - `decided_ts` string, date-time, nullable
    - `decision_note` string
    - `expires_ts` string, date-time
    - `group_id` string
    - `id` string
    - `money_movement_id` string, nullable
    - `rail` string
    - `requested_by` string
    - `requested_ts` string, date-time
    - `status` 'pending' | 'approved' | 'denied' | 'cancelled' | 'expired'

## Other responses

- `400` — Bad Request
- `401` — Unauthorized
- `403` — Forbidden
- `503` — Service Unavailable
- `default` — Error response.

## Changes

- **2026-09-03** `0a6aeb726c1f` — 8 info
  - added the optional property `transaction/input/quoted_amount` to the response with the `200` status
  - added the optional property `transaction/net_amount_estimated` to the response with the `200` status
  - added the optional property `transaction/output/quoted_amount` to the response with the `200` status
  - added the optional property `transaction/price_per_unit_estimated` to the response with the `200` status
  - …4 more
- **2026-09-01** `f2d9f80610d9` — 5 info
  - added the optional property `error/api_client_id` to the response with the `400` status
  - added the optional property `error/api_client_id` to the response with the `401` status
  - added the optional property `error/api_client_id` to the response with the `403` status
  - added the optional property `error/api_client_id` to the response with the `503` status
  - …1 more
- **2026-08-29** `78f4fe30ef9c` — 1 info
  - added the optional property `transaction/onchain_transactions` to the response with the `200` status
- **2026-08-28** `2b4ae09e65a2` — 1 info
  - added the optional property `transaction/settlement_commission_view` to the response with the `200` status
- **2026-08-27** `775f0380ec89` — 1 info
  - added the optional property `transaction/net_amount_view` to the response with the `200` status

[Full history](https://skmtc.dev/stablesea/apis/stable-sea-backend/changes/money/ach/offramp/post.md)

---

[API](https://skmtc.dev/stablesea/apis/stable-sea-backend.md) · [All operations](https://skmtc.dev/stablesea/apis/stable-sea-backend/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/stablesea/stable-sea-backend/revisions/0a6aeb726c1f/schema)
