---
title: "Create transfer intent"
method: POST
path: "/v1/intents/wallets/{wallet_id}/transfer"
tags: ["Intents"]
---

# Create transfer intent

`POST /v1/intents/wallets/{wallet_id}/transfer`

Create an intent to execute a token transfer via a wallet. The intent must be authorized by either the wallet owner or signers before it can be executed.

## Path parameters

- `wallet_id` string, required — ID of the wallet.

## Headers

- `privy-app-id` string, required — ID of your Privy app.
- `privy-request-expiry` string — Request expiry. Value is a Unix timestamp in milliseconds representing the deadline by which the request must be processed.

## Request body

- TransferRequestBody — Request body for initiating a sponsored token transfer from an embedded wallet.
  - `amount` string — Amount as a decimal string in the token's standard unit (e.g. "1.5" for 1.5 USDC). For exact_input, the amount to send. For exact_output, the exact amount to receive. Takes precedence over source.amount when both are provided.
  - `amount_type` 'exact_input' | 'exact_output' — Whether the amount refers to the input token or output token.
  - `destination` TokenTransferDestination, required — The destination address for a token transfer. Optionally specify a different asset or chain for cross-asset or cross-chain transfers.
    - `address` union, required — Recipient address (hex for EVM, base58 for Solana, base58check for Tron)
      - string
      - string
      - string — Tron address: base58check-encoded, starting with T, 34 characters.
    - `asset` string — The destination asset. Required for cross-asset transfers (e.g., source 'usdt' to destination 'usdc').
    - `chain` string — The destination blockchain network. Required for cross-chain transfers (e.g., source 'base' to destination 'arbitrum').
  - `fee_configuration` object — Optional fee configuration for the transfer. If omitted, cross-chain transfers will not charge additional fees.
    - `type` 'total_fee_bps', required — Discriminator: total fee specified in BPS.
    - `value` integer, required — Total fee in basis points (1 bps = 0.01%).
  - `slippage_bps` integer — Maximum allowed slippage in basis points (1 bps = 0.01%). Only applicable for cross-chain or cross-asset transfers; omit to use the provider default.
  - `source` union, required — The source asset, amount, and chain for a token transfer. Specify either `asset` (named) or `asset_address` (custom), not both.
    - object — Source for a transfer identified by a named asset (e.g. "usdc", "eth"). Use this variant for first-class assets maintained by Privy.
      - `amount` string — Amount as a decimal string in the token's standard unit (e.g. "1.5" for 1.5 USDC, "0.01" for 0.01 ETH). For exact_input, specifies the amount to send. Not in the smallest on-chain unit (wei, lamports, etc.). Maximum 100 characters. Deprecated: use the top-level `amount` field instead.
      - `asset` string, required — The asset to transfer. Supported: 'usdc', 'usdb', 'usdt' (stablecoins), 'eth' (native Ethereum), 'sol' (native Solana).
      - `chain` string, required — The blockchain network on which to perform the transfer. Supported chains include: 'ethereum', 'base', 'arbitrum', 'polygon', 'solana', and their respective testnets.
    - object — Source for a transfer identified by a token contract address (EVM) or mint address (Solana). Use this variant for tokens that are not first-class assets.
      - `amount` string — Amount as a decimal string in the token's standard unit (e.g. "1.5" for 1.5 USDC, "0.01" for 0.01 ETH). For exact_input, specifies the amount to send. Not in the smallest on-chain unit (wei, lamports, etc.). Maximum 100 characters. Deprecated: use the top-level `amount` field instead.
      - `asset_address` union, required — The token contract address (EVM) or mint address (Solana) of the asset to transfer.
        - string
        - string
        - string — Tron address: base58check-encoded, starting with T, 34 characters.
      - `chain` string, required — The blockchain network on which to perform the transfer. Supported chains include: 'ethereum', 'base', 'arbitrum', 'polygon', 'solana', and their respective testnets.

## Response `200`

Created transfer intent.

- TransferIntentResponse — Response for a transfer intent
  - `authorization_details` IntentAuthorization[], required — Detailed authorization information including key quorum members, thresholds, and signature status
    - `display_name` string — Display name of the key quorum
    - `members` IntentAuthorizationMember[], required — Members in this authorization quorum
      - union — A member of an intent authorization quorum. Can be a user, key, or nested key quorum.
        - object — A user member of an intent authorization quorum.
          - `signed_at` number, nullable, required — Unix timestamp when this member signed, or null if not yet signed.
          - `type` 'user', required
          - `user_id` string, required — User ID of the key quorum member
        - object — A key member of an intent authorization quorum.
          - `public_key` string, required — Public key of the key quorum member
          - `signed_at` number, nullable, required — Unix timestamp when this member signed, or null if not yet signed.
          - `type` 'key', required
        - object — A nested key quorum member of an intent authorization quorum.
          - `display_name` string — Display name for the child key quorum (if any)
          - `key_quorum_id` string, required — ID of the child key quorum member
          - `members` IntentAuthorizationKeyQuorumMember[], required — Members of this child quorum
            - union — A leaf member (user or key) of a nested key quorum in an intent authorization.
              - …
          - `threshold` number, required — Number of signatures required from this child quorum
          - `threshold_met` boolean, required — Whether this child key quorum has met its signature threshold
          - `type` 'key_quorum', required
    - `threshold` number, required — Number of signatures required to satisfy this quorum
  - `created_at` number, required — Unix timestamp when the intent was created
  - `created_by_display_name` string, required — Display name of the user who created the intent
  - `created_by_id` string — ID of the user who created the intent. If undefined, the intent was created using the app secret
  - `custom_expiry` boolean, required — Whether this intent has a custom expiry time set by the client. If false, the intent expires after a default duration.
  - `dismissal_reason` string — Human-readable reason for dismissal, present when status is 'dismissed'
  - `dismissed_at` number — Unix timestamp when the intent was dismissed, present when status is 'dismissed'
  - `expires_at` number, required — Unix timestamp when the intent expires
  - `intent_id` string, required — Unique ID for the intent
  - `rejected_at` number — Unix timestamp when the intent was rejected, present when status is 'rejected'
  - `resource_id` string, required — ID of the resource being modified (wallet_id, policy_id, etc)
  - `status` 'pending' | 'processing' | 'executed' | 'failed' | 'expired' | 'rejected' | 'dismissed', required — Current status of an intent.
  - `action_result` object — Result of transfer execution (only present if intent status is 'executed' or 'failed')
    - `authorized_by_display_name` string — Display name of the key quorum that authorized execution
    - `authorized_by_id` string — ID of the key quorum that authorized execution
    - `executed_at` number, required — Unix timestamp when the action was executed
    - `status_code` number, required — HTTP status code from the action execution
    - `response_body` TransferActionResponse, required — Response for a transfer action.
      - `amount_type` 'exact_input' | 'exact_output' — Whether the amount refers to the input token or output token.
      - `created_at` string, date-time, required — ISO 8601 timestamp of when the wallet action was created.
      - `destination_address` string, required — Recipient address.
      - `destination_amount` string, nullable, required — Amount received on the destination chain. For exact_output cross-chain transfers, set at creation (the guaranteed exact amount). For exact_input cross-chain transfers, null until fill confirmation.
      - `destination_asset` string — Destination asset for cross-asset transfers. Omitted for same-asset transfers.
      - `destination_chain` string — Destination chain for cross-chain transfers. Omitted for same-chain transfers.
      - `estimated_fees` FeeLineItem[], nullable — Estimated fee breakdown from the provider quote. Only present for cross-chain or cross-asset transfers. Populated after on-chain confirmation.
        - union — An individual fee assessed on a transfer.
          - object — Estimated fee paid to the relayer.
            - `amount` string, required — Amount in USD (in decimals).
            - `recipient` union
              - …
            - `type` 'relayer', required
          - object — Estimated fee paid to Privy.
            - `amount` string, required — Amount in USD (in decimals).
            - `recipient` union
              - …
            - `type` 'privy', required
          - object — Estimated fee paid to the developer.
            - `amount` string, required — Amount in USD (in decimals).
            - `recipient` union
              - …
            - `type` 'developer', required
      - `estimated_gas` Gas — Gas cost for a blockchain action. Includes both raw base-unit amount and a human-readable decimal string, plus the gas token symbol.
        - `amount` string, required — Gas cost in the gas token as a human-readable decimal string (e.g. "0.0001").
        - `base_amount` string, required — Gas cost in the gas token's base units (e.g. wei).
        - `gas_asset` string, required — Gas token symbol (e.g. "ETH", "USDC").
      - `failure_reason` object — Top-level failure context for the wallet action. Present on rejected or failed actions when available.
        - `details` unknown
        - `message` string, required — Human-readable failure message.
      - `fees` FeeLineItem[], nullable — Actual fees paid for the transfer. Populated after on-chain confirmation. Only present for cross-chain transfers.
        - union — An individual fee assessed on a transfer.
          - object — Estimated fee paid to the relayer.
            - `amount` string, required — Amount in USD (in decimals).
            - `recipient` union
              - …
            - `type` 'relayer', required
          - object — Estimated fee paid to Privy.
            - `amount` string, required — Amount in USD (in decimals).
            - `recipient` union
              - …
            - `type` 'privy', required
          - object — Estimated fee paid to the developer.
            - `amount` string, required — Amount in USD (in decimals).
            - `recipient` union
              - …
            - `type` 'developer', required
      - `gas` Gas — Gas cost for a blockchain action. Includes both raw base-unit amount and a human-readable decimal string, plus the gas token symbol.
        - `amount` string, required — Gas cost in the gas token as a human-readable decimal string (e.g. "0.0001").
        - `base_amount` string, required — Gas cost in the gas token's base units (e.g. wei).
        - `gas_asset` string, required — Gas token symbol (e.g. "ETH", "USDC").
      - `id` string, required — The ID of the wallet action.
      - `source_amount` string — Decimal amount sent on the source chain (e.g. "1.5"). For exact_output cross-chain transfers, null until fill confirmation.
      - `source_asset` string — Asset identifier (e.g. "usdc", "eth"). Present when the transfer was initiated with a named asset; omitted for custom-token transfers.
      - `source_asset_address` string — Token contract address (EVM) or mint address (Solana). Present when the transfer was initiated with `asset_address`.
      - `source_asset_decimals` integer — Number of decimals for the transferred token. Present when the transfer was initiated with `asset_address` and the decimals were resolved on-chain.
      - `source_chain` string, required — Chain name (e.g. "base", "ethereum").
      - `status` 'pending' | 'succeeded' | 'rejected' | 'failed', required — The current status of the wallet action.
      - `steps` WalletActionStep[] — The steps of the wallet action. Only returned if `?include=steps` is provided.
        - union — A step within a wallet action, representing a single onchain action.
          - object — A wallet action step consisting of an EVM transaction.
            - `caip2` string, required — CAIP-2 chain identifier of the transaction, containing the chain ID.
            - `failure_reason` FailureReason — A description of why a wallet action (or a step within a wallet action) failed.
              - …
            - `finalized` boolean — Whether this step has reached on-chain finality. Absent until finality is confirmed.
            - `status` 'preparing' | 'queued' | 'pending' | 'retrying' | 'confirmed' | 'rejected' | 'reverted' | 'replaced' | 'abandoned', required — EVM transaction status.
            - `transaction_hash` string, nullable, required — The transaction hash for this step. May change while the step status is non-terminal.
            - `type` 'evm_transaction', required
          - object — A wallet action step consisting of an EVM user operation.
            - `bundle_transaction_hash` string, nullable, required — Transaction hash of the bundle in which this user operation was included. Null until included by a bundler.
            - `caip2` string, required — CAIP-2 network identifier, containing the chain ID of the user operation.
            - `entrypoint_version` '0.6' | '0.7' | '0.8' | '0.9', required — The entrypoint version of the user operation.
            - `failure_reason` FailureReason — A description of why a wallet action (or a step within a wallet action) failed.
              - …
            - `finalized` boolean — Whether this step has reached on-chain finality. Absent until finality is confirmed.
            - `gas_credits_charged_usd` string — Amount charged in USD for gas sponsorship on this step.
            - `status` 'preparing' | 'queued' | 'pending' | 'retrying' | 'confirmed' | 'rejected' | 'reverted' | 'replaced' | 'abandoned', required — User operation status.
            - `type` 'evm_user_operation', required
            - `user_operation_hash` string, nullable, required — The user operation hash for this step. May change while the step status is non-terminal.
          - object — A wallet action step consisting of an SVM (Solana) transaction.
            - `caip2` string, required — CAIP-2 chain identifier for the Solana network.
            - `failure_reason` FailureReason — A description of why a wallet action (or a step within a wallet action) failed.
              - …
            - `finalized` boolean — Whether this step has reached on-chain finality. Absent until finality is confirmed.
            - `gas_credits_charged_usd` string — Amount charged in USD for gas sponsorship on this step.
            - `status` 'preparing' | 'queued' | 'pending' | 'confirmed' | 'rejected' | 'reverted' | 'failed', required — SVM transaction status.
            - `transaction_signature` string, nullable, required — The Solana transaction signature (base58-encoded). Null until broadcast.
            - `type` 'svm_transaction', required
          - object — A wallet action step consisting of a TVM (Tron) transaction.
            - `caip2` string, required — CAIP-2 chain identifier for the Tron network.
            - `failure_reason` FailureReason — A description of why a wallet action (or a step within a wallet action) failed.
              - …
            - `status` 'preparing' | 'queued' | 'pending' | 'confirmed' | 'rejected' | 'reverted' | 'failed', required — TVM transaction status.
            - `transaction_id` string, nullable, required — The Tron transaction ID. Null until broadcast.
            - `type` 'tvm_transaction', required
          - object — A wallet action step representing a cross-chain/cross-asset fill by an external provider.
            - `failure_reason` FailureReason — A description of why a wallet action (or a step within a wallet action) failed.
              - …
            - `status` 'preparing' | 'queued' | 'pending' | 'confirmed' | 'rejected' | 'failed', required — External transaction step status.
            - `type` 'external_transaction', required
          - object — A wallet action step representing a transaction executed by a custodian (e.g. Bridge).
            - `custodian` string, required — Identifier of the custodian executing this transaction (e.g. "bridge").
            - `failure_reason` FailureReason — A description of why a wallet action (or a step within a wallet action) failed.
              - …
            - `status` 'preparing' | 'queued' | 'custodian_reviewing' | 'pending' | 'confirmed' | 'rejected' | 'failed', required — Custodian transaction step status.
            - `type` 'custodian_transaction', required
      - `type` 'transfer', required
      - `wallet_id` string, required — The ID of the wallet involved in the action.
  - `current_resource_data` object — Current state of the wallet before any changes. If undefined, the resource was deleted and no longer exists
    - `additional_signers` WalletAdditionalSignerItem[], required — Additional signers for the wallet.
      - `override_policy_ids` string[] — An optional list of up to one policy ID to enforce on the wallet.
      - `signer_id` string, cuid2, required — A unique identifier for a key quorum.
    - `address` string, required — Address of the wallet.
    - `archived_at` number, nullable — Unix timestamp of when the wallet was archived in milliseconds, or null if the wallet is active.
    - `authorization_threshold` number — The number of keys that must sign for an action to be valid.
    - `chain_type` 'ethereum' | 'solana' | 'cosmos' | 'stellar' | 'sui' | 'aptos' | 'movement' | 'tron' | 'bitcoin-segwit' | 'bitcoin-taproot' | 'pearl' | 'near' | 'ton' | 'starknet' | 'spark', required — The wallet chain types.
    - `created_at` number, required — Unix timestamp of when the wallet was created in milliseconds.
    - `custody` WalletCustodian — Information about the custodian managing this wallet.
      - `provider` string, required — The custodian responsible for the wallet.
      - `provider_user_id` string, required — The resource ID of the beneficiary of the custodial wallet.
    - `display_name` string — A human-readable label for the wallet.
    - `exported_at` number, nullable, required — Unix timestamp of when the wallet was exported in milliseconds, if the wallet was exported.
    - `external_id` string — A customer-provided identifier for mapping to external systems. Write-once, set only at creation.
    - `id` string, required — Unique ID of the wallet. This will be the primary identifier when using the wallet in the future.
    - `imported_at` number, nullable, required — Unix timestamp of when the wallet was imported in milliseconds, if the wallet was imported.
    - `owner_id` string, cuid2, nullable, required — The key quorum ID of the owner of the wallet.
    - `policy_ids` string[], required — List of policy IDs for policies that are enforced on the wallet.
    - `public_key` string — The compressed, raw public key for the wallet along the chain cryptographic curve.
  - `intent_type` 'TRANSFER', required
  - `request_details` object, required — The original transfer request that would be sent to the wallet transfer endpoint
    - `body` TransferRequestBody, required — Request body for initiating a sponsored token transfer from an embedded wallet.
      - `amount` string — Amount as a decimal string in the token's standard unit (e.g. "1.5" for 1.5 USDC). For exact_input, the amount to send. For exact_output, the exact amount to receive. Takes precedence over source.amount when both are provided.
      - `amount_type` 'exact_input' | 'exact_output' — Whether the amount refers to the input token or output token.
      - `destination` TokenTransferDestination, required — The destination address for a token transfer. Optionally specify a different asset or chain for cross-asset or cross-chain transfers.
        - `address` union, required — Recipient address (hex for EVM, base58 for Solana, base58check for Tron)
          - string
          - string
          - string — Tron address: base58check-encoded, starting with T, 34 characters.
        - `asset` string — The destination asset. Required for cross-asset transfers (e.g., source 'usdt' to destination 'usdc').
        - `chain` string — The destination blockchain network. Required for cross-chain transfers (e.g., source 'base' to destination 'arbitrum').
      - `fee_configuration` object — Optional fee configuration for the transfer. If omitted, cross-chain transfers will not charge additional fees.
        - `type` 'total_fee_bps', required — Discriminator: total fee specified in BPS.
        - `value` integer, required — Total fee in basis points (1 bps = 0.01%).
      - `slippage_bps` integer — Maximum allowed slippage in basis points (1 bps = 0.01%). Only applicable for cross-chain or cross-asset transfers; omit to use the provider default.
      - `source` union, required — The source asset, amount, and chain for a token transfer. Specify either `asset` (named) or `asset_address` (custom), not both.
        - object — Source for a transfer identified by a named asset (e.g. "usdc", "eth"). Use this variant for first-class assets maintained by Privy.
          - `amount` string — Amount as a decimal string in the token's standard unit (e.g. "1.5" for 1.5 USDC, "0.01" for 0.01 ETH). For exact_input, specifies the amount to send. Not in the smallest on-chain unit (wei, lamports, etc.). Maximum 100 characters. Deprecated: use the top-level `amount` field instead.
          - `asset` string, required — The asset to transfer. Supported: 'usdc', 'usdb', 'usdt' (stablecoins), 'eth' (native Ethereum), 'sol' (native Solana).
          - `chain` string, required — The blockchain network on which to perform the transfer. Supported chains include: 'ethereum', 'base', 'arbitrum', 'polygon', 'solana', and their respective testnets.
        - object — Source for a transfer identified by a token contract address (EVM) or mint address (Solana). Use this variant for tokens that are not first-class assets.
          - `amount` string — Amount as a decimal string in the token's standard unit (e.g. "1.5" for 1.5 USDC, "0.01" for 0.01 ETH). For exact_input, specifies the amount to send. Not in the smallest on-chain unit (wei, lamports, etc.). Maximum 100 characters. Deprecated: use the top-level `amount` field instead.
          - `asset_address` union, required — The token contract address (EVM) or mint address (Solana) of the asset to transfer.
            - string
            - string
            - string — Tron address: base58check-encoded, starting with T, 34 characters.
          - `chain` string, required — The blockchain network on which to perform the transfer. Supported chains include: 'ethereum', 'base', 'arbitrum', 'polygon', 'solana', and their respective testnets.
    - `method` 'POST', required
    - `url` string, required

---

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