---
title: "Create Transfer"
method: POST
path: "/transfers"
tags: ["Transfers"]
---

# Create Transfer

`POST /transfers`

Moves money between accounts, or into a claim link anyone with the URL can redeem.

## Headers

- `Idempotency-Key` string

## Request body

- object
  - `amount` number, required — The amount to move, in the transfer currency. For example 25.00.
  - `currency` string — Currency, such as `usd`. Required for ledger transfers.
  - `destination_id` string — The recipient. Required for ledger and wallet_send (a user_/biz_/ldgr_ ID, or — for sends — an email). Omit for claim_link.
  - `expires_at` string, date-time, nullable — claim_link only. Link expiry as an ISO 8601 timestamp. Defaults to 24 hours from creation.
  - `idempotence_key` string, nullable — Ledger transfers and wallet sends. A unique key that makes retries safe. Retrying with the same key returns the original transfer, or attaches to the original wallet send, instead of moving money twice.
  - `metadata` object, nullable — Ledger transfers only. Custom key-value pairs attached to the transfer. Max 50 keys, 100 chars per key, 500 chars per string value.
  - `notes` string, nullable — Ledger transfers only. A short note describing the transfer.
  - `origin_id` string, required — The account sending the funds. A user ID (user_xxx), account ID (biz_xxx), or ledger account ID (ldgr_xxx).
  - `redeemable_count` integer — claim_link only. How many different users can claim the link. Defaults to 1.
  - `type` 'ledger' | 'wallet_send' | 'claim_link' — The kind of money movement, which decides what comes back. Defaults to ledger. `ledger` moves credit between two Whop balances and returns a `transfer`; `wallet_send` sends USDT from the origin account's Ethereum wallet and returns a `send`; `claim_link` funds a shareable link anyone with the URL can redeem and returns a `claim_link`. A `ledger` transfer from a stablecoin-rails account settles on-chain when covered, and still returns a `transfer`.

## Response `201`

money movement created

- union
  - object — A transfer of credit between two ledger accounts.
    - `amount` number, required — Transfer amount.
    - `created_at` string, date-time, required — When the transfer was created.
    - `created_by_user` object, nullable, required — The user who initiated the transfer, such as the team member who sent a manual payout. Null if the creator is unavailable.
      - `id` string, required — User ID.
      - `name` string, nullable — User display name.
      - `username` string, required — User's username.
    - `currency` string, required — Transfer currency.
    - `destination` union, required — Account or user receiving funds.
      - object
        - `id` string, required — Account ID.
        - `route` string, nullable — Account route.
        - `title` string, nullable — Account display name.
        - `typename` 'Company', required
      - object
        - `id` string, required — User ID.
        - `name` string, nullable — User display name.
        - `typename` 'User', required
        - `username` string — User's username.
    - `destination_ledger_account_id` string, required — Destination ledger account ID.
    - `fee_amount` number, nullable — Fee charged for the transfer.
    - `id` string, required — Transfer ID.
    - `metadata` object, nullable — Custom metadata attached to the transfer.
    - `notes` string, nullable — Transfer note.
    - `object` 'transfer', required — The object type. Discriminates the create response from a send or a claim link.
    - `origin` union, required — Account or user sending funds.
      - object
        - `id` string, required — Account ID.
        - `route` string, nullable — Account route.
        - `title` string, nullable — Account display name.
        - `typename` 'Company', required
      - object
        - `id` string, required — User ID.
        - `name` string, nullable — User display name.
        - `typename` 'User', required
        - `username` string — User's username.
    - `origin_ledger_account_id` string, required — Source ledger account ID.
    - `status` 'processing' | 'succeeded' | 'failed', required — Transfer status. `processing` means the on-chain leg is still executing — poll the transfer until it resolves to `succeeded` or `failed`.
  - object — Returned for a wallet_send: an onchain USDT send to a recipient.
    - `amount` string, required
    - `currency` string, required
    - `destination` object, required
      - `account_id` string, required
      - `address` string, required
    - `object` 'send', required
    - `source` object, required
      - `account_id` string, required
      - `address` string, required
    - `tx_hash` string, required
  - object — Returned for a claim_link: a shareable URL anyone can open to claim the funds.
    - `amount` string, required
    - `claim_url` string, required
    - `currency` string, required
    - `expires_at` string, date-time, nullable, required
    - `id` string, required
    - `object` 'claim_link', required
    - `redeemable_count` integer, required
    - `source` object, required
      - `account_id` string, required
    - `status` 'pending', required — A newly funded claim link is always `pending` — it stays claimable until it is fully claimed, canceled, or expires.

## Other responses

- `400` — Invalid Parameters
- `401` — Unauthorized
- `403` — Forbidden

---

[API](https://skmtc.net/whop/apis/whop-api.md) · [All operations](https://skmtc.net/whop/apis/whop-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/whop/whop-api/versions/db0883548bc5/schema)
