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

# Transfer Funds

> Send native coins or token assets from a subwallet address using a unified endpoint

<Note>
  **Auth method: Signed (HMAC)** — this endpoint requires the full set of signed
  headers: `x-access-id`, `x-request-id`, `x-timestamp`, and an HMAC-SHA256
  `authorization` signature. See [Authentication](/api-reference/authentication#signed-hmac-authentication).
</Note>

This endpoint handles both native coin transfers (ETH, TRX, BTC) and token transfers (USDT, USDC)
in a single call. Pass `chain` and `currency`.
The transfer is submitted on-chain asynchronously. When the transaction confirms, Tender fires a
`SUB_USER_WALLET_TRANSFER_CONFIRMED` webhook to your server.

**Supported chains:** `ethereum`, `tron`, `bitcoin`

## Example

<CodeGroup>
  ```javascript Node.js theme={null}
  // Native coin transfer (e.g. ETH on Ethereum)
  const res = await fetch(`${BASE}/wallet/transfer`, {
    method: 'POST',
    headers: makeHeaders(),
    body: JSON.stringify({
      chain:              'ethereum',
      currency:           'ethereum',
      sender:             '0xabc123...',
      receiver:           '0x999fff...',
      amount:             0.01,
      merchant_reference: 'payout-9921',
      address_reference:  'slot-2',
    }),
  });
  const { data } = await res.json();
  // data.tx_id → "0xabc123def456..."

  // Token transfer (e.g. USDT on Tron)
  const res2 = await fetch(`${BASE}/wallet/transfer`, {
    method: 'POST',
    headers: makeHeaders(),
    body: JSON.stringify({
      chain:              'tron',
      currency:           'usdt',
      sender:             'TXYZop...',
      receiver:           'TABCef...',
      amount:             50,
      merchant_reference: 'payout-9922',
      address_reference:  'slot-2',
    }),
  });
  const { data: data2 } = await res2.json();
  // data2.tx_id → "abc123def456..."
  ```

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

  # Native coin transfer (e.g. ETH on Ethereum)
  res = requests.post(
      f"{BASE}/wallet/transfer",
      headers=make_headers(),
      json={
          "chain":              "ethereum",
          "currency":           "ethereum",
          "sender":             "0xabc123...",
          "receiver":           "0x999fff...",
          "amount":             0.01,
          "merchant_reference": "payout-9921",
          "address_reference":  "slot-2",
      },
  )
  tx_id = res.json()["data"]["tx_id"]

  # Token transfer (e.g. USDT on Tron)
  res2 = requests.post(
      f"{BASE}/wallet/transfer",
      headers=make_headers(),
      json={
          "chain":              "tron",
          "currency":           "usdt",
          "sender":             "TXYZop...",
          "receiver":           "TABCef...",
          "amount":             50,
          "merchant_reference": "payout-9922",
          "address_reference":  "slot-2",
      },
  )
  tx_id2 = res2.json()["data"]["tx_id"]
  ```
</CodeGroup>

## Headers

<ParamField header="authorization" type="string" required>
  Base64-encoded HMAC-SHA256 signature of the request payload using the API secret

  **Example:** `"5e73d044c44d733fcf819ad3409aaad..."`
</ParamField>

<ParamField header="x-timestamp" type="string" required>
  Current timestamp in ISO 8601 format

  **Example:** `"2025-03-15T09:45:53.000Z"`
</ParamField>

<ParamField header="x-request-id" type="string" required>
  Unique identifier for the request (UUID v4)

  **Example:** `"550e8400-e29b-41d4-a716-446655440000"`
</ParamField>

<ParamField header="x-access-id" type="string" required>
  Your API access ID provided by Tender

  **Example:** `"your-access-id-here"`
</ParamField>

<ParamField header="Content-Type" type="string" required>
  **Example:** `"application/json"`
</ParamField>

## Body

<ParamField body="chain" type="string" required>
  The chain to use for the transfer. Supported values: `ethereum`, `tron`, `bitcoin`.

  **Example:** `"ethereum"`
</ParamField>

<ParamField body="currency" type="string" required>
  The currency to transfer (e.g. `ethereum`, `usdt`, `usdc`, `bitcoin`). Must be supported on the
  specified chain.

  **Example:** `"usdt"`
</ParamField>

<ParamField body="sender" type="string" required>
  The subwallet address to send from.

  **Example:** `"0xabc123..."`
</ParamField>

<ParamField body="receiver" type="string" required>
  The destination address.

  **Example:** `"0x999fff..."`
</ParamField>

<ParamField body="amount" type="number | string" required>
  Amount to transfer in human-readable units (e.g. `0.01` ETH, `50` USDT).

  **Example:** `10.5`
</ParamField>

<ParamField body="merchant_reference" type="string" required>
  Your own reference for this transfer, for idempotency and reconciliation.

  **Example:** `"payout-9921"`
</ParamField>

<ParamField body="address_reference" type="string" required>
  The address reference label of the sender address.

  **Example:** `"slot-2"`
</ParamField>

## Response

<ResponseField name="status" type="string" required>
  **Example:** `"success"`
</ResponseField>

<ResponseField name="message" type="string" required>
  **Example:** `"success"`
</ResponseField>

<ResponseField name="data" type="object" required>
  <Expandable title="data properties">
    <ResponseField name="tx_id" type="string">
      The on-chain transaction hash.

      **Example:** `"0xabc123def456..."`
    </ResponseField>
  </Expandable>
</ResponseField>

## Error Responses

| Condition                              | Status | Message                                         |
| -------------------------------------- | ------ | ----------------------------------------------- |
| Invalid chain                          | 400    | `invalid chain: <chain>`                        |
| Invalid currency                       | 400    | `invalid currency: <currency>`                  |
| Chain not supported for subwallets     | 400    | `Unsupported chain for subwallets`              |
| Currency not valid on that chain       | 400    | `Unsupported currency for chain <chain>`        |
| No contract address for token on chain | 400    | `no contract address for <currency> on <chain>` |


## OpenAPI

````yaml POST /v1/api/wallet/transfer
openapi: 3.1.0
info:
  title: Tender API
  description: Tender Developer API for cryptocurrency payments and agent management
  version: 1.0.0
  contact:
    name: Tender Support
    url: https://tender.cash
servers:
  - url: https://secureapi.tender.cash
    description: Production Server
  - url: https://sandbox-api.tender.cash
    description: Sandbox Server
security:
  - SignedAuth: []
tags:
  - name: Agents
    description: Manage agents and sub-businesses
  - name: Transactions
    description: Payment and transaction operations
  - name: System
    description: System information and configuration
  - name: Webhooks
    description: Webhook management and logs
  - name: On-ramp
    description: Fiat-to-crypto on-ramp operations
  - name: Payouts
    description: Send crypto from merchant balance to a wallet address or payout account
  - name: Subwallets
    description: Provision and manage crypto wallet infrastructure for your end-users
paths:
  /v1/api/wallet/transfer:
    post:
      tags:
        - Subwallets
      summary: Transfer Funds
      description: >-
        Send native coins or token assets from a subwallet address. Pass chain
        and currency — Tender resolves the correct transfer type internally.
        Settles asynchronously; fires SUB_USER_WALLET_TRANSFER_CONFIRMED webhook
        on confirmation.
      operationId: transferSubWalletFunds
      parameters:
        - name: authorization
          in: header
          required: true
          schema:
            type: string
        - name: x-timestamp
          in: header
          required: true
          schema:
            type: string
            format: date-time
          example: '2025-03-15T09:45:53.000Z'
        - name: x-request-id
          in: header
          required: true
          schema:
            type: string
            format: uuid
          example: 550e8400-e29b-41d4-a716-446655440000
        - name: x-access-id
          in: header
          required: true
          schema:
            type: string
          example: your-access-id-here
        - name: Content-Type
          in: header
          required: true
          schema:
            type: string
          example: application/json
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - chain
                - currency
                - sender
                - receiver
                - amount
                - merchant_reference
                - address_reference
              properties:
                chain:
                  type: string
                  enum:
                    - ethereum
                    - tron
                    - bitcoin
                  description: Chain to use for the transfer.
                currency:
                  type: string
                  description: >-
                    Currency to transfer (e.g. ethereum, usdt, usdc, bitcoin).
                    Must be supported on the specified chain.
                sender:
                  type: string
                receiver:
                  type: string
                amount:
                  oneOf:
                    - type: number
                    - type: string
                merchant_reference:
                  type: string
                address_reference:
                  type: string
            example:
              chain: ethereum
              currency: usdt
              sender: 0xabc123...
              receiver: 0x999fff...
              amount: 10.5
              merchant_reference: payout-9921
              address_reference: slot-2
      responses:
        '200':
          description: Transfer submitted
          content:
            application/json:
              example:
                status: success
                message: success
                data:
                  tx_id: 0xabc123def456...
        '400':
          description: Bad request
          content:
            application/json:
              example:
                status: error
                message: Unsupported chain for subwallets
      security:
        - SignedAuth: []
components:
  securitySchemes:
    SignedAuth:
      type: apiKey
      in: header
      name: authorization
      description: >-
        Signed (HMAC) authentication. Required headers: x-access-id,
        x-request-id (UUID v4), x-timestamp (ISO 8601), and authorization
        (Base64 HMAC-SHA256 signature of {timeStamp, requestId, accessId} using
        your access secret).

````