---
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`

## Request

- Base URL: `https://api.privy.io`
- URL: `https://api.privy.io/v1/intents/wallets/{wallet_id}/transfer`
- Auth: HTTP basic

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.
  - `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.
      - `chain` string, required: The blockchain network on which to perform the transfer. Supported chains include: 'tempo', 'ethereum', 'base', 'arbitrum', 'polygon', 'solana', and their respective testnets.
      - `asset` string, required: The asset to transfer. Supported: 'usdc', 'usdb', 'usdt', 'eurc', 'ousd', 'pathusd' (stablecoins), 'eth' (native Ethereum), 'sol' (native Solana).
    - 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.
      - `chain` string, required: The blockchain network on which to perform the transfer. Supported chains include: 'tempo', 'ethereum', 'base', 'arbitrum', 'polygon', 'solana', and their respective testnets.
      - `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.
  - `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 'tempo' to destination 'base').
  - `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.
  - `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%).
  - `custody_options` TransferCustodyOptions: Options for a transfer from a custodial wallet.
    - `initiation` TransferInitiation, required: Payment initiation context for transfers sourced from wallets that require initiation data. Captures how the payment was initiated (channel and subchannel) and whether Strong Customer Authentication was applied or which SCA exemption was used.
      - `channel` union, required: How the payment was initiated. Use `p2p_mobile_payment` for peer-to-peer transfers initiated on a mobile device; `other_mobile_payment` for non-P2P mobile-initiated payments (e.g. a merchant payment via a mobile app); `other` for payments not relying on a mobile device.
        - 'p2p_mobile_payment' | 'other_mobile_payment' | 'other'
        - string
      - `subchannel` union, required: Whether the payment was made remotely or in person. Use `remote` for payments initiated from a distance (mobile app, online banking, or e-commerce checkout); `non_remote` for payments made in person (physical card, payment terminal, or contactless tap).
        - 'remote' | 'non_remote'
        - string
      - `attestations` TransferInitiationAttestations, required: Payment initiation attestations for a transfer.
        - `sca` TransferScaAttestation, required: Strong Customer Authentication attestation for a transfer.
          - `outcome` union, required: Whether Strong Customer Authentication (SCA) was applied or which regulatory exemption or non-applicability reason covers this payment. Use `sca_used` when the user authenticated with SCA. Otherwise, choose the value that applies: `payment_to_self` — payer and payee are the same person (remote only); `trusted_beneficiaries` — payee is on the user's pre-approved list; `recurring_transaction` — amount and payee match a previously SCA-authorized recurring series; `contactless_low_value` — contactless card payment below the low-value threshold (non-remote only); `unattended_terminal_for_transport` — automated terminal for transport fares or parking (non-remote only); `low_value` — remote payment below the low-value threshold (remote only); `secure_corporate_payment` — dedicated corporate payment process with controls equivalent to SCA (remote only); `transaction_risk_analysis` — PSP has performed real-time risk analysis and the transaction falls within permitted thresholds (remote only); `merchant_initiated_transaction` — payment triggered by the merchant without the payer present, on a pre-authorized mandate (remote only); `not_applicable` — this flow requires initiation context but SCA and SCA exemptions do not apply; `other` — another recognized exemption not listed above.
            - 'sca_used' | 'payment_to_self' | 'trusted_beneficiaries' | 'recurring_transaction' | 'contactless_low_value' | 'unattended_terminal_for_transport' | 'low_value' | 'secure_corporate_payment' | 'transaction_risk_analysis' | 'merchant_initiated_transaction' | 'not_applicable' | 'other'
            - string
          - `auth_factors` TransferScaAuthFactor[]: Authentication factor metadata. Optional when `outcome` is `sca_used`; if provided, it must contain at least two entries from different `category` values (e.g. one `possession` factor and one `knowledge` factor). Omit this field for any other outcome.
            - `category` union, required: The type of authentication factor used. Known values are: `knowledge` (something only the user knows, e.g. a PIN or password), `possession` (something only the user has, e.g. a phone receiving an OTP or a hardware token), and `inherence` (something the user is, e.g. a fingerprint or face scan). When `outcome` is `sca_used`, the two factors in `auth_factors` must belong to two different categories.
              - …
            - `authenticated_at` string, date-time, required: The ISO 8601 timestamp when this factor was authenticated.
            - `reference` string, required: Your internal identifier for this authentication event (e.g. a session ID, transaction ID, or audit log reference). Used for reconciliation.
  - `nonce` string: Unique caller-generated nonce used to prevent replaying a signed wallet action request. Must be at least 24 characters (e.g. a cuid2 or UUID).
  - `reference_id` string: Developer-provided identifier for this request. Must be unique per app.

## Response `200`

Created transfer intent.

- TransferIntentResponse: Response for a transfer intent
  - `intent_id` string, required: Unique ID for the intent
  - `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
  - `created_at` number, required: Unix timestamp when the intent was created
  - `resource_id` string, required: ID of the resource being modified (wallet_id, policy_id, etc)
  - `authorization_details` IntentAuthorization[], required: Detailed authorization information including key quorum members, thresholds, and signature status
    - `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.
          - `type` 'user', required
          - `user_id` string, required: User ID of the key quorum member
          - `signed_at` number, nullable, required: Unix timestamp when this member signed, or null if not yet signed.
        - object: A key member of an intent authorization quorum.
          - `type` 'key', required
          - `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.
        - object: A nested key quorum member of an intent authorization quorum.
          - `type` 'key_quorum', required
          - `key_quorum_id` string, required: ID of the child key quorum member
          - `display_name` string: Display name for the child key quorum (if any)
          - `threshold_met` boolean, required: Whether this child key quorum has met its signature threshold
          - `threshold` number, required: Number of signatures required from this child quorum
          - `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 to satisfy this quorum
    - `display_name` string: Display name of the key quorum
  - `status` 'pending' | 'processing' | 'executed' | 'failed' | 'expired' | 'rejected' | 'dismissed', required: Current status of an intent.
  - `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.
  - `expires_at` number, required: Unix timestamp when the intent expires
  - `rejected_at` number: Unix timestamp when the intent was rejected, present when status is 'rejected'
  - `dismissed_at` number: Unix timestamp when the intent was dismissed, present when status is 'dismissed'
  - `dismissal_reason` string: Human-readable reason for dismissal, present when status is 'dismissed'
  - `intent_type` 'TRANSFER', required
  - `request_details` object, required: The original transfer request that would be sent to the wallet transfer endpoint
    - `method` 'POST', required
    - `url` string, required
    - `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.
      - `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.
          - `chain` string, required: The blockchain network on which to perform the transfer. Supported chains include: 'tempo', 'ethereum', 'base', 'arbitrum', 'polygon', 'solana', and their respective testnets.
          - `asset` string, required: The asset to transfer. Supported: 'usdc', 'usdb', 'usdt', 'eurc', 'ousd', 'pathusd' (stablecoins), 'eth' (native Ethereum), 'sol' (native Solana).
        - 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.
          - `chain` string, required: The blockchain network on which to perform the transfer. Supported chains include: 'tempo', 'ethereum', 'base', 'arbitrum', 'polygon', 'solana', and their respective testnets.
          - `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.
      - `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 'tempo' to destination 'base').
      - `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.
      - `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%).
      - `custody_options` TransferCustodyOptions: Options for a transfer from a custodial wallet.
        - `initiation` TransferInitiation, required: Payment initiation context for transfers sourced from wallets that require initiation data. Captures how the payment was initiated (channel and subchannel) and whether Strong Customer Authentication was applied or which SCA exemption was used.
          - `channel` union, required: How the payment was initiated. Use `p2p_mobile_payment` for peer-to-peer transfers initiated on a mobile device; `other_mobile_payment` for non-P2P mobile-initiated payments (e.g. a merchant payment via a mobile app); `other` for payments not relying on a mobile device.
            - 'p2p_mobile_payment' | 'other_mobile_payment' | 'other'
            - string
          - `subchannel` union, required: Whether the payment was made remotely or in person. Use `remote` for payments initiated from a distance (mobile app, online banking, or e-commerce checkout); `non_remote` for payments made in person (physical card, payment terminal, or contactless tap).
            - 'remote' | 'non_remote'
            - string
          - `attestations` TransferInitiationAttestations, required: Payment initiation attestations for a transfer.
            - `sca` TransferScaAttestation, required: Strong Customer Authentication attestation for a transfer.
              - …
      - `nonce` string: Unique caller-generated nonce used to prevent replaying a signed wallet action request. Must be at least 24 characters (e.g. a cuid2 or UUID).
      - `reference_id` string: Developer-provided identifier for this request. Must be unique per app.
  - `current_resource_data` object: Current state of the wallet before any changes. If undefined, the resource was deleted and no longer exists
    - `id` string, required: Unique ID of the wallet. This will be the primary identifier when using the wallet in the future.
    - `address` string, required: Address of the wallet.
    - `display_name` string: A human-readable label for the wallet.
    - `external_id` string: A customer-provided identifier for mapping to external systems. URL-safe characters only ([a-zA-Z0-9_-]), max 64 chars. Write-once: cannot be changed once set.
    - `public_key` string: The compressed, raw public key for the wallet along the chain cryptographic curve.
    - `created_at` number, required: Unix timestamp of when the wallet was created in milliseconds.
    - `chain_type` 'ethereum' | 'solana' | 'cosmos' | 'stellar' | 'sui' | 'aptos' | 'movement' | 'tron' | 'bitcoin-segwit' | 'bitcoin-taproot' | 'pearl' | 'near' | 'ton' | 'starknet' | 'xrpl' | 'spark', required: The wallet chain types.
    - `policy_ids` string[], required: List of policy IDs for policies that are enforced on the wallet.
    - `owner_id` string, cuid2, nullable, required: The key quorum ID of the owner of the wallet.
    - `parent_wallet_id` string, nullable: ID of the HD root wallet this wallet was derived from, or null if it was not derived from another wallet.
    - `entity` WalletEntity: The entity a wallet is attributed to.
      - `id` string, required: A Privy entity ID.
      - `type` 'user' | 'organization', required: The type of entity a wallet is attributed to.
    - `additional_signers` WalletAdditionalSignerItem[], required: Additional signers for the wallet.
      - `signer_id` string, cuid2, required: A unique identifier for a key quorum.
      - `override_policy_ids` string[]: An optional list of up to one policy ID to enforce on the wallet.
    - `exported_at` number, nullable, required: Unix timestamp of when the wallet was exported in milliseconds, if the wallet was exported.
    - `imported_at` number, nullable, required: Unix timestamp of when the wallet was imported in milliseconds, if the wallet was imported.
    - `authorization_threshold` number: The number of keys that must sign for an action to be valid.
    - `automations` AttachedWalletAutomation[]: Automations attached to the wallet, including disabled ones.
      - `id` string, required: ID of the automation.
      - `enabled` boolean, required: Whether this attachment is currently active — true only if both the attachment and the underlying automation are enabled.
    - `archived_at` number, nullable: Unix timestamp of when the wallet was archived in milliseconds, or null if the wallet is active.
    - `chain` 'base' | 'solana' | 'tempo': The chain of this wallet, only present for custodial wallets.
    - `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.
  - `action_result` object: Result of transfer execution (only present if intent status is 'executed' or 'failed')
    - `status_code` number, required: HTTP status code from the action execution
    - `executed_at` number, required: Unix timestamp when the action was executed
    - `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
    - `response_body` TransferActionResponse, required: Response for a transfer action.
      - `id` string, required: The ID of the wallet action.
      - `status` 'pending' | 'succeeded' | 'rejected' | 'failed', required: The current status of the wallet action.
      - `wallet_id` string, required: The ID of the wallet involved in the action.
      - `created_at` string, date-time, required: ISO 8601 timestamp of when the wallet action was created.
      - `reference_id` string, nullable: Developer-provided reference ID, if one was included in the request.
      - `failure_reason` object: Top-level failure context for the wallet action. Present on rejected or failed actions when available.
        - `message` string, required: Human-readable failure message.
        - `details` unknown
      - `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.
            - `type` 'evm_transaction', required
            - `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` CurrencyAmount: A monetary value with its currency denomination.
              - …
            - `gas_credits_charged_usd` string, nullable: Deprecated, use `gas_credits_charged` instead; gas credits charged in USD for this step, if sponsored, as a decimal string.
            - `status` 'preparing' | 'queued' | 'pending' | 'retrying' | 'confirmed' | 'rejected' | 'reverted' | 'replaced' | 'abandoned', required: EVM transaction status.
            - `caip2` string, required: CAIP-2 chain identifier of the transaction, containing the chain ID.
            - `transaction_hash` string, nullable, required: The transaction hash for this step. May change while the step status is non-terminal.
          - object: A wallet action step consisting of an EVM user operation.
            - `type` 'evm_user_operation', required
            - `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` CurrencyAmount: A monetary value with its currency denomination.
              - …
            - `gas_credits_charged_usd` string, nullable: Deprecated, use `gas_credits_charged` instead; gas credits charged in USD for this step, if sponsored, as a decimal string.
            - `status` 'preparing' | 'queued' | 'pending' | 'retrying' | 'confirmed' | 'rejected' | 'reverted' | 'replaced' | 'abandoned', required: User operation status.
            - `user_operation_hash` string, nullable, required: The user operation hash for this step. May change while the step status is non-terminal.
            - `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.
          - object: A wallet action step consisting of an SVM (Solana) transaction.
            - `type` 'svm_transaction', required
            - `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` CurrencyAmount: A monetary value with its currency denomination.
              - …
            - `gas_credits_charged_usd` string, nullable: Deprecated, use `gas_credits_charged` instead; gas credits charged in USD for this step, if sponsored, as a decimal string.
            - `status` 'preparing' | 'queued' | 'pending' | 'confirmed' | 'rejected' | 'reverted' | 'failed', required: SVM transaction status.
            - `caip2` string, required: CAIP-2 chain identifier for the Solana network.
            - `transaction_signature` string, nullable, required: The Solana transaction signature (base58-encoded). Null until broadcast.
          - object: A wallet action step consisting of a TVM (Tron) transaction.
            - `type` 'tvm_transaction', required
            - `failure_reason` FailureReason: A description of why a wallet action (or a step within a wallet action) failed.
              - …
            - `gas_credits_charged` CurrencyAmount: A monetary value with its currency denomination.
              - …
            - `gas_credits_charged_usd` string, nullable: Deprecated, use `gas_credits_charged` instead; gas credits charged in USD for this step, if sponsored, as a decimal string.
            - `status` 'preparing' | 'queued' | 'pending' | 'confirmed' | 'rejected' | 'reverted' | 'failed', required: TVM transaction status.
            - `caip2` string, required: CAIP-2 chain identifier for the Tron network.
            - `transaction_id` string, nullable, required: The Tron transaction ID. Null until broadcast.
          - object: A wallet action step representing a cross-chain/cross-asset fill by an external provider.
            - `type` 'external_transaction', required
            - `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.
          - object: A wallet action step representing a transaction executed by a custodian (e.g. Bridge).
            - `type` 'custodian_transaction', required
            - `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.
            - `custodian` string, required: Identifier of the custodian executing this transaction (e.g. "bridge").
            - `transaction_hash` string, nullable, required: Identifier of the transaction the custodian last reported on the destination chain. Set on a settled transfer, and also on a failed one when the custodian had already broadcast a payout that was later returned. Null until the custodian reports one.
          - object: A wallet action step representing a Tempo Zone settlement on its parent chain.
            - `type` 'tempo_zone_settlement', required
            - `failure_reason` FailureReason: A description of why a wallet action (or a step within a wallet action) failed.
              - …
            - `caip2` string, nullable, required: CAIP-2 identifier of the Tempo parent chain, or null when unavailable.
            - `transaction_hash` string, required: A hex-encoded string prefixed with '0x', capped at 300002 characters (150,000 bytes).
            - `status` 'preparing' | 'queued' | 'pending' | 'confirmed' | 'rejected' | 'failed', required: Tempo Zone settlement step status.
      - `type` 'transfer', required
      - `amount_type` 'exact_input' | 'exact_output': Whether the amount refers to the input token or output token.
      - `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_amount` string: Decimal amount sent on the source chain (e.g. "1.5"). For exact_output cross-chain transfers, null until fill confirmation.
      - `source_chain` string, required: Chain name (e.g. "tempo", "base").
      - `destination_address` string, required: Recipient address.
      - `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.
      - `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.
      - `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.
            - `type` 'relayer', required
            - `recipient` union
              - …
            - `amount` string, required: Amount in USD (in decimals).
          - object: Estimated fee paid to Privy.
            - `type` 'privy', required
            - `recipient` union
              - …
            - `amount` string, required: Amount in USD (in decimals).
          - object: Estimated fee paid to the developer.
            - `type` 'developer', required
            - `recipient` union
              - …
            - `amount` string, required: Amount in USD (in decimals).
      - `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.
        - `base_amount` string, required: Gas cost in the gas token's base units (e.g. wei).
        - `amount` string, required: Gas cost in the gas token as a human-readable decimal string (e.g. "0.0001").
        - `gas_asset` string, required: Gas token symbol (e.g. "ETH", "USDC").
      - `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.
            - `type` 'relayer', required
            - `recipient` union
              - …
            - `amount` string, required: Amount in USD (in decimals).
          - object: Estimated fee paid to Privy.
            - `type` 'privy', required
            - `recipient` union
              - …
            - `amount` string, required: Amount in USD (in decimals).
          - object: Estimated fee paid to the developer.
            - `type` 'developer', required
            - `recipient` union
              - …
            - `amount` string, required: Amount in USD (in decimals).
      - `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.
        - `base_amount` string, required: Gas cost in the gas token's base units (e.g. wei).
        - `amount` string, required: Gas cost in the gas token as a human-readable decimal string (e.g. "0.0001").
        - `gas_asset` string, required: Gas token symbol (e.g. "ETH", "USDC").

## Changes

- **2026-10-20** `527110c2c2f4`: 4 breaking, 8 info
  - the response property `allOf[subschema #2]/action_result/allOf[subschema #2]/response_body/steps/items/oneOf[subschema #1: EVMTransactionWalletActionStep]/gas_credits_charged_usd` became nullable for the status `200`
  - the response property `allOf[subschema #2]/action_result/allOf[subschema #2]/response_body/steps/items/oneOf[subschema #2: EVMUserOperationWalletActionStep]/gas_credits_charged_usd` became nullable for the status `200`
  - the response property `allOf[subschema #2]/action_result/allOf[subschema #2]/response_body/steps/items/oneOf[subschema #3: SVMTransactionWalletActionStep]/gas_credits_charged_usd` became nullable for the status `200`
  - the response property `allOf[subschema #2]/action_result/allOf[subschema #2]/response_body/steps/items/oneOf[subschema #4: TVMTransactionWalletActionStep]/gas_credits_charged_usd` became nullable for the status `200`
  - …8 more
- **2026-10-19** `a77e516e7c57`: 1 info
  - added the optional property `allOf[subschema #2]/action_result/allOf[subschema #2]/response_body/steps/items/oneOf[subschema #4: TVMTransactionWalletActionStep]/gas_credits_charged_usd` to the response with the `200` status
- …earlier changes not shown

[Operation history](https://skmtc.dev/privy-io/apis/privy-api/changes/v1/intents/wallets/:wallet_id/transfer/post.md)

---

[API](https://skmtc.dev/privy-io/apis/privy-api.md) - [All operations](https://skmtc.dev/privy-io/apis/privy-api/llms.txt) - [OpenAPI document](https://skmtc.dev/privy-io/apis/privy-api/revisions/3a2288470053?raw)
