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

# Transfers

A Transfer moves money between Whop balances: from one account or user to another, from an account's wallet to a person or address, or into a claim link anyone with the URL can redeem.

Use the Transfers API to send money, find recipients you can pay, list and retrieve transfers when reconciling money movement, and preview or redeem claim links.

Subscribe to `transfer.completed` and `transfer.failed` for outcomes instead of polling. Each participating account can subscribe to these events. `transfer.created` is also emitted on success, not when processing starts. A failed transfer can be retried under the same ID and later succeed; retrieve the transfer to reconcile its current status.

A successful balance transfer credits the recipient's available balance unless a release date applies. Transfers funded from pending balance retain a release date and credit pending balance; applicable recipient reserves or fraud holds can keep funds unavailable. `succeeded` confirms the transfer completed, not that all funds are withdrawable.

## Endpoints

| Endpoint | Request |
| - | - |
| [Retrieve Claim Link](/api-reference/beta/transfers/retrieve-claim-link) | <Badge color="blue" size="sm" stroke>GET</Badge> `/claim_links/{id}` |
| [List Transfers](/api-reference/beta/transfers/list-transfers) | <Badge color="blue" size="sm" stroke>GET</Badge> `/transfers` |
| [Retrieve Transfer](/api-reference/beta/transfers/retrieve-transfer) | <Badge color="blue" size="sm" stroke>GET</Badge> `/transfers/{id}` |
| [List Transfer Recipients](/api-reference/beta/transfers/list-transfer-recipients) | <Badge color="blue" size="sm" stroke>GET</Badge> `/transfers/recipients` |
| [Claim](/api-reference/beta/transfers/claim) | <Badge color="green" size="sm" stroke>POST</Badge> `/claim_links/{id}/claim` |
| [Create Transfer](/api-reference/beta/transfers/create-transfer) | <Badge color="green" size="sm" stroke>POST</Badge> `/transfers` |

## Attributes

<Columns cols={2}>
  <Column>
    <ResponseField name="id" type="string" required>
      Transfer ID.
    </ResponseField>

    <ResponseField name="amount" type="object | null" required>
      Amount credited to the recipient. Null while the transfer has not succeeded.

      <Accordion title="Properties" defaultOpen={true}>
        <ResponseField name="amount" type="string" required>
          The amount in major units, as an exact decimal string — `"10.00"` is ten
          dollars. A string so no float rounds it in transit.
        </ResponseField>

        <ResponseField name="currency" type="string" required>
          Three-letter ISO 4217 currency code, lowercase.
        </ResponseField>

        <ResponseField name="decimals" type="integer" required>
          How many decimal places the amount CARRIES — the precision the charge itself
          runs at.
        </ResponseField>

        <ResponseField name="display_decimals" type="integer" required>
          How many decimal places to SHOW. Usually equal to `decimals`, and deliberately not always: COP is charged in centavos but written in whole pesos, so it is `2` and `0`. Format the number in your own locale using this.
        </ResponseField>
      </Accordion>
    </ResponseField>

    <ResponseField name="created_at" type="string" required>
      When the transfer was created.
    </ResponseField>

    <ResponseField name="destination" type="object | null" required>
      Business account or user receiving the transfer.

      <Accordion title="Properties" defaultOpen={true}>
        <ResponseField name="id" type="string" required>
          Account or user ID.
        </ResponseField>

        <ResponseField name="logo_url" type="string | null" required>
          Business logo or user avatar URL. Null when no image is available.
        </ResponseField>

        <ResponseField name="name" type="string | null" required>
          Business or user display name.
        </ResponseField>

        <ResponseField name="object" type="string" required>
          Whether the profile is a business account or a user.

          Available options: `account`, `user`
        </ResponseField>
      </Accordion>
    </ResponseField>

    <ResponseField name="failed_at" type="string | null" required>
      Recorded failure time. Null unless the transfer has failed.
    </ResponseField>

    <ResponseField name="failure_code" type="string | null" required>
      Machine-readable failure code. Null unless the transfer has failed.
    </ResponseField>

    <ResponseField name="failure_reason" type="string | null" required>
      Failure explanation. Null unless the transfer has failed.
    </ResponseField>

    <ResponseField name="fee" type="object | null" required>
      All applicable transfer fees, including platform markup. Null when the authoritative total is unavailable.

      <Accordion title="Properties" defaultOpen={true}>
        <ResponseField name="amount" type="string" required>
          The amount in major units, as an exact decimal string — `"10.00"` is ten
          dollars. A string so no float rounds it in transit.
        </ResponseField>

        <ResponseField name="currency" type="string" required>
          Three-letter ISO 4217 currency code, lowercase.
        </ResponseField>

        <ResponseField name="decimals" type="integer" required>
          How many decimal places the amount CARRIES — the precision the charge itself
          runs at.
        </ResponseField>

        <ResponseField name="display_decimals" type="integer" required>
          How many decimal places to SHOW. Usually equal to `decimals`, and deliberately not always: COP is charged in centavos but written in whole pesos, so it is `2` and `0`. Format the number in your own locale using this.
        </ResponseField>
      </Accordion>
    </ResponseField>

    <ResponseField name="metadata" type="object" required>
      Custom metadata attached to the transfer.
    </ResponseField>

    <ResponseField name="notes" type="string | null" required>
      Transfer note.
    </ResponseField>

    <ResponseField name="object" type="string" required>
      The object type.
    </ResponseField>

    <ResponseField name="origin" type="object | null" required>
      Business account or user sending the transfer.

      <Accordion title="Properties" defaultOpen={true}>
        <ResponseField name="id" type="string" required>
          Account or user ID.
        </ResponseField>

        <ResponseField name="logo_url" type="string | null" required>
          Business logo or user avatar URL. Null when no image is available.
        </ResponseField>

        <ResponseField name="name" type="string | null" required>
          Business or user display name.
        </ResponseField>

        <ResponseField name="object" type="string" required>
          Whether the profile is a business account or a user.

          Available options: `account`, `user`
        </ResponseField>
      </Accordion>
    </ResponseField>

    <ResponseField name="status" type="string" required>
      Current transfer status. A transfer can be created `processing` and settle a few seconds later; poll Retrieve Transfer or listen for the `transfer.completed` and `transfer.failed` webhooks instead of treating the create response as final. `succeeded` and `failed` are final.

      Available options: `processing`, `succeeded`, `failed`
    </ResponseField>

    <ResponseField name="status_changed_at" type="string | null" required>
      Recorded time of the current transition. Null when the historical transition
      time is unknown.
    </ResponseField>

    <ResponseField name="succeeded_at" type="string | null" required>
      Recorded success time. Null when unknown.
    </ResponseField>

    <ResponseField name="tracking_url" type="string" required>
      Tracking page for the transfer. Viewing it requires sign-in and access to the
      transfer.
    </ResponseField>
  </Column>

  <Column>
    <div className="api-resource-sticky-example">
      ```json Transfer theme={null}
      {
      	"id": "ctt_xxxxxxxxxxxxxx",
      	"object": "transfer",
      	"status": "succeeded",
      	"origin": {
      		"id": "biz_xxxxxxxxxxxxxx",
      		"object": "account",
      		"name": "Pickaxe",
      		"logo_url": null
      	},
      	"destination": {
      		"id": "user_xxxxxxxxxxxxx",
      		"object": "user",
      		"name": "Alex Rivera",
      		"logo_url": null
      	},
      	"amount": {
      		"amount": "50.00",
      		"currency": "usd",
      		"decimals": 2,
      		"display_decimals": 2
      	},
      	"fee": {
      		"amount": "1.00",
      		"currency": "usd",
      		"decimals": 2,
      		"display_decimals": 2
      	},
      	"created_at": "2026-06-01T12:00:00.000Z",
      	"status_changed_at": null,
      	"succeeded_at": null,
      	"failed_at": null,
      	"failure_code": null,
      	"failure_reason": null,
      	"notes": "Creator bonus",
      	"metadata": {
      		"external_transfer_id": "transfer_123"
      	},
      	"tracking_url": "https://whop.com/ctt_xxxxxxxxxxxxxx/"
      }
      ```
    </div>
  </Column>
</Columns>


## Related topics

- [Transfers](/api-reference/transfers/transfer.md)
- [Transfer completed](/api-reference/beta/transfers/transfer-completed.md)
- [Transfer created](/api-reference/beta/transfers/transfer-created.md)


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