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

# Send Payment (Legacy)

> Send an outbound fiat payment to an external bank account via ACH.

<Warning>
  This endpoint is deprecated. Use [POST /v1/pay](/api-reference/agent/unified-pay) with a bank details recipient object instead.
</Warning>

Initiates an outbound fiat payment from the project's wallet to an external US bank account via Bridge.xyz off-ramp. The project balance is debited atomically before the transfer is initiated. If the transfer fails, the balance is automatically restored.

<Note>
  Requires a bearer token with the `pay` permission.
</Note>

## Request Body

<ParamField body="amount" type="integer" required>
  Payment amount in cents. Must be between 1 and 100,000,000 (\$1,000,000.00).
</ParamField>

<ParamField body="recipient" type="object" required>
  Recipient bank account details.

  <Expandable title="Recipient fields">
    <ParamField body="recipient.name" type="string" required>
      Recipient name. 1-200 characters.
    </ParamField>

    <ParamField body="recipient.account_number" type="string" required>
      Bank account number. 4-34 characters.
    </ParamField>

    <ParamField body="recipient.routing_number" type="string" required>
      ABA routing number. Exactly 9 digits.
    </ParamField>

    <ParamField body="recipient.email" type="string">
      Recipient email address. Up to 254 characters.
    </ParamField>
  </Expandable>
</ParamField>

<ParamField body="description" type="string">
  Payment description for record-keeping. Max 500 characters.
</ParamField>

<ParamField body="idempotency_key" type="string">
  Unique key to prevent duplicate payments. Alphanumeric plus `_`, `-`, `:`, `.`. Max 255 characters.
</ParamField>

## Response

<ResponseField name="id" type="string" required>
  Unique transaction identifier.
</ResponseField>

<ResponseField name="status" type="string" required>
  Transaction status: `pending`, `processing`, `completed`, or `failed`.
</ResponseField>

<ResponseField name="amount" type="integer" required>
  Payment amount in cents.
</ResponseField>

<ResponseField name="recipient_name" type="string" required>
  Name of the payment recipient.
</ResponseField>

<ResponseField name="created_at" type="string" required>
  ISO 8601 timestamp of when the payment was created.
</ResponseField>

<ResponseField name="estimated_arrival" type="string | null" required>
  Estimated delivery time (e.g., "2-3 business days"). `null` if no ACH transfer was initiated.
</ResponseField>

## Examples

<CodeGroup>
  ```bash curl theme={null}
  curl -X POST https://api.unwall.xyz/v1/payments \
    -H "Authorization: Bearer aw_live_xxxxxxxxxxxx" \
    -H "Content-Type: application/json" \
    -d '{
      "amount": 250000,
      "recipient": {
        "name": "Acme Supplies Inc",
        "account_number": "9876543210",
        "routing_number": "021000021",
        "email": "billing@acme.com"
      },
      "description": "Monthly supply order #47",
      "idempotency_key": "order-47-2026-03"
    }'
  ```

  ```python Python theme={null}
  import requests

  resp = requests.post(
      "https://api.unwall.xyz/v1/payments",
      headers={"Authorization": "Bearer aw_live_xxxxxxxxxxxx"},
      json={
          "amount": 250000,
          "recipient": {
              "name": "Acme Supplies Inc",
              "account_number": "9876543210",
              "routing_number": "021000021",
              "email": "billing@acme.com",
          },
          "description": "Monthly supply order #47",
          "idempotency_key": "order-47-2026-03",
      },
  )
  result = resp.json()
  print(f"Payment {result['id']} — {result['status']}")
  print(f"Arrives: {result['estimated_arrival']}")
  ```

  ```typescript TypeScript theme={null}
  const resp = await fetch("https://api.unwall.xyz/v1/payments", {
    method: "POST",
    headers: {
      Authorization: "Bearer aw_live_xxxxxxxxxxxx",
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      amount: 250000,
      recipient: {
        name: "Acme Supplies Inc",
        account_number: "9876543210",
        routing_number: "021000021",
        email: "billing@acme.com",
      },
      description: "Monthly supply order #47",
      idempotency_key: "order-47-2026-03",
    }),
  });
  const result = await resp.json();
  console.log(`Payment ${result.id} — ${result.status}`);
  console.log(`Arrives: ${result.estimated_arrival}`);
  ```
</CodeGroup>

```json Response (201 Created) theme={null}
{
  "id": "tx_fiat_abc123",
  "status": "processing",
  "amount": 250000,
  "recipient_name": "Acme Supplies Inc",
  "created_at": "2026-03-11T14:30:00Z",
  "estimated_arrival": "2-3 business days"
}
```

## Idempotency

If you provide an `idempotency_key` and a transaction with that key already exists for this project, the API returns the original transaction with a `200 OK` status (not `201 Created`). The request body is not re-evaluated.

<Tip>
  Always include an idempotency key when sending payments from automated agents. Use a deterministic key tied to your business logic (e.g., invoice number, order ID) to guarantee at-most-once delivery.
</Tip>
