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

# Get transfer

> Get a transfer by its ID.



## OpenAPI

````yaml get /v2/transfers/{transferId}
openapi: 3.1.0
info:
  title: Coinbase Developer Platform APIs
  description: >-
    The Coinbase Developer Platform APIs - leading the world's transition
    onchain.
  license:
    name: MIT
    url: https://opensource.org/licenses/MIT
  version: 2.0.0
  contact:
    name: Coinbase Developer Platform
    email: cdp@coinbase.com
    url: https://cdp.coinbase.com
servers:
  - url: https://api.cdp.coinbase.com/platform
    description: The production server of the CDP APIs.
security:
  - apiKeyAuth: []
tags:
  - name: Accounts
    x-audience: public
    x-slo-tier:
      tier: beta
    description: >-
      The Accounts APIs enable developers to create and manage accounts for
      their Entity. An Account is a container that holds assets and can be used
      for transacting. Accounts can be of different types including entity
      accounts, prime accounts, and business accounts. Support for
      Customer-owned accounts is in development.
  - name: Deposit Destinations
    x-audience: public
    x-slo-tier:
      tier: beta
    description: >-
      Deposit Destinations allow you to manage where funds can be deposited into
      your accounts.


      ## Crypto Deposit Destinations


      Crypto deposit destinations are cryptocurrency addresses that you can
      generate and fetch via the API. Once created, these addresses can receive
      cryptocurrency payments on their specified network and will settle in your
      account balance.


      **Metadata:**

      You can attach metadata to any deposit destination you create to track the
      purpose or source of deposits.



      **Example:**

      ```json

      {
        "depositDestinationId": "depositDestination_123",
        "accountId": "account_456",
        "type": "crypto",
        "crypto": {
          "network": "base",
          "address": "0x742d35Cc6634C0532925a3b844Bc454e4438f44e"
        },
        "target": {
          "accountId": "account_789",
          "asset": "usd"
        },
        "status": "active",
        "metadata": {
          "customer_id": "cust_789",
          "reference": "order-12345"
        }
      }

      ```

      Use the list endpoint to retrieve all deposit destinations.
  - name: Payment Acceptance (Under Development)
    x-audience: development
    description: >-
      Payment Acceptance enables merchants to accept commercial payments
      on-chain. It handles the full lifecycle of a payment — authorization,
      capture, void, and refund — driven by a central payment session that
      tracks state and balances at every step.
  - name: Payment Methods
    x-audience: public
    x-slo-tier:
      tier: beta
    description: >-
      The Payment Methods APIs enable you to create and manage payment methods
      for accounts. Payment methods represent ways to send and receive payments,
      such as ACH transfers and Fedwire transfers. These APIs allow you to
      create, list, and retrieve payment method details for use in payment
      transfers and transactions.
  - name: Transfers
    x-audience: public
    x-slo-tier:
      tier: beta
    description: >-
      **Transfers** represent both the request and execution of fund transfers
      from a source to a target. They provide upfront fee quotes and track the
      complete lifecycle from initiation through completion, failure, or
      reversal.

      ## Fee Quotes

      Every transfer provides a comprehensive fee quote in the `fees` array.
      This allows you to show users exactly what they'll pay before any money
      moves.


      To review fees before execution:

      1. Create a transfer with `execute: false`

      2. Review the `fees` array in the response

      3. Call `POST /transfers/{transferId}/execute` when ready to proceed



      For automatic execution without fee review, create a transfer with
      `execute: true`.


      **Fee Expiration**: Fee quotes are valid for a limited time (typically
      10-15 minutes from creation). The `expiresAt` field shows exactly when the
      fee quote will expire. If you don't execute before this time, you'll need
      to create a new transfer to get updated fees.

      ## Fees

      Transfer fees vary by source, target, amount and transfer type:

      * **Bank fees** - Traditional banking fees for depositing funds (e.g.,
      $15.00 wire transfer fee)

      * **Conversion fees** - Fees for exchanging between different assets

      * **Network fees** - Onchain transaction costs to complete the transfer
      (e.g., ETH gas fees)


      All fees are disclosed upfront in the `fees` array when you create a
      transfer.

      ## Transfer Lifecycle

      When you create a transfer, it will be in one of these statuses that
      determine what action you need to take:

      * **`quoted`** - Transfer is ready but requires manual execution via the
      `/execute` endpoint

      * **`processing`** - Transfer is being executed (no action needed - poll
      for completion)

      * **`completed`** - Transfer completed successfully

      * **`failed`** - Transfer failed (see `failureReason` for details)

      ## Execution Control

      * **`execute: true`**: Transfer will automatically attempt to execute

      * **`execute: false`**: Transfer will be created in `quoted` status and
      you must call the `/execute` endpoint. Use this to obtain a fee quote or
      validate a transfer destination before deciding whether to execute the
      Transfer.

      ## Sources and Targets

      * A **source** can be an Account or a Payment Method

      * A **target** can be an Account, Payment Method, Onchain Address, or
      Email Address

      ## Transfer Execution

      When a transfer reaches `completed` status, it contains the final
      execution details that delivered funds to the target and completion
      timestamps.

      ## Failure Reasons

      When a transfer fails, the `failureReason` field provides a human-readable
      description of what went wrong.

      Common failure reasons include:

      * "Insufficient balance to complete this transfer."

      * "The recipient address is invalid for the selected network."

      * "The recipient address failed security validation checks."

      * "Unable to send to this recipient."


      Failure reason is only present when the transfer's status is `failed`.
  - name: Webhooks
    x-audience: public
    x-slo-tier:
      tier: ga
    description: >-
      Subscribe to real-time events across CDP products. Monitor onchain
      activity on Base mainnet, track onramp/offramp transactions, and receive
      instant notifications for wallet events.
paths:
  /v2/transfers/{transferId}:
    get:
      tags:
        - Transfers
      summary: Get transfer
      description: Get a transfer by its ID.
      operationId: getTransferById
      parameters:
        - name: transferId
          in: path
          required: true
          description: The unique identifier of the transfer.
          schema:
            type: string
            pattern: ^transfer_[a-f0-9\-]{36}$
            example: transfer_af2937b0-9846-4fe7-bfe9-ccc22d935114
      responses:
        '200':
          description: Successfully got transfer.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Transfer'
              examples:
                regular:
                  $ref: '#/components/examples/RegularTransferQuoted'
                fx_quoted:
                  $ref: '#/components/examples/FxTransferQuoted'
                fx_completed:
                  $ref: '#/components/examples/FxTransferCompleted'
        '404':
          description: Transfer not found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                not_found:
                  summary: Transfer not found
                  value:
                    errorType: not_found
                    errorMessage: Transfer not found.
      security:
        - apiKeyAuth: []
        - sessionAuth: []
components:
  schemas:
    Transfer:
      type: object
      description: >-
        A Transfer represents all the information needed to execute a transfer
        and tracks the lifecycle of a transfer from initiation through
        completion or failure.
      properties:
        transferId:
          type: string
          description: The ID of the transfer. Required when validateOnly is false.
          example: transfer_af2937b0-9846-4fe7-bfe9-ccc22d935114
        status:
          $ref: '#/components/schemas/TransferStatus'
        source:
          $ref: '#/components/schemas/TransferSource'
        target:
          $ref: '#/components/schemas/TransferTarget'
        sourceAmount:
          type: string
          description: >-
            The amount of the source asset that will be transferred out, as a
            decimal string in standard unit denomination.
          example: '103.50'
        sourceAsset:
          allOf:
            - $ref: '#/components/schemas/Asset'
          description: The asset symbol of the source amount.
          example: usd
        targetAmount:
          type: string
          description: >-
            The amount of the target asset that will be received, as a decimal
            string in standard unit denomination.
          example: '100.00'
        targetAsset:
          allOf:
            - $ref: '#/components/schemas/Asset'
          description: The asset symbol of the target amount.
          example: usdc
        exchangeRate:
          $ref: '#/components/schemas/TransferExchangeRate'
        fees:
          $ref: '#/components/schemas/TransferFees'
        estimate:
          $ref: '#/components/schemas/TransferEstimate'
        completedAt:
          type: string
          format: date-time
          description: The date and time the transfer was completed.
          example: '2025-01-01T00:05:00Z'
        failureReason:
          type: string
          description: >-
            The reason for failure, if the transfer failed. Only present when
            status is `failed`.
          example: Insufficient balance to complete this transfer.
        expiresAt:
          type: string
          format: date-time
          description: >-
            The date and time when this transfer will expire if not executed.
            Only present for `quoted` status. A new transfer must be created to
            obtain an updated quote after expiration. Required when validateOnly
            is false.
          example: '2025-01-01T00:15:00Z'
        executedAt:
          type: string
          format: date-time
          description: >-
            The date and time the transfer was executed and moved to processing.
            Only present when status has progressed beyond `quoted`.
          example: '2025-01-01T00:01:30Z'
        createdAt:
          type: string
          format: date-time
          description: >-
            The date and time the transfer was created. Required when
            validateOnly is false.
          example: '2025-01-01T00:00:00Z'
        updatedAt:
          type: string
          format: date-time
          description: >-
            The date and time the transfer was last updated. Required when
            validateOnly is false.
          example: '2025-01-01T00:00:00Z'
        metadata:
          $ref: '#/components/schemas/Metadata'
        details:
          $ref: '#/components/schemas/TransferDetails'
      required:
        - source
        - target
      example:
        transferId: transfer_af2937b0-9846-4fe7-bfe9-ccc22d935114
        status: completed
        source:
          accountId: account_af2937b0-9846-4fe7-bfe9-ccc22d935114
          asset: usd
        target:
          address: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913'
          network: base
          asset: usdc
        sourceAmount: '103.50'
        sourceAsset: usd
        targetAmount: '100.00'
        targetAsset: usdc
        completedAt: '2025-01-01T00:05:00Z'
        createdAt: '2025-01-01T00:00:00Z'
        updatedAt: '2025-01-01T00:05:00Z'
    Error:
      description: >-
        An error response including the code for the type of error and a
        human-readable message describing the error.
      type: object
      properties:
        errorType:
          $ref: '#/components/schemas/ErrorType'
        errorMessage:
          description: The error message.
          type: string
          example: Unable to create EVM account
        correlationId:
          description: >-
            A unique identifier for the request that generated the error. This
            can be used to help debug issues with the API.
          type: string
          example: 41deb8d59a9dc9a7-IAD
        errorLink:
          allOf:
            - $ref: '#/components/schemas/Url'
          description: A link to the corresponding error documentation.
          example: >-
            https://docs.cdp.coinbase.com/api-reference/v2/errors#invalid-request
        unauthorizedCapabilities:
          description: >
            The capability code(s) that were not authorized for the customer on

            this request. Present only when `errorType` is

            `customer_not_authorized`; absent for every other error type.


            Use this list to render onboarding UX for the listed capabilities,
            or

            fetch `GET /v2/customers/{customerId}` and inspect each entry's

            `status` / `requirements` to discover what (if anything) can be

            submitted to resolve the block.
          type: array
          items:
            $ref: '#/components/schemas/CapabilityName'
      required:
        - errorType
        - errorMessage
      example:
        errorType: invalid_request
        errorMessage: Invalid request.
        correlationId: 41deb8d59a9dc9a7-IAD
        errorLink: https://docs.cdp.coinbase.com/api-reference/v2/errors#invalid-request
    TransferStatus:
      type: string
      description: >-
        The current status of the transfer, indicating what action you need to
        take next. Required when validateOnly is false.
      enum:
        - quoted
        - processing
        - completed
        - failed
      example: quoted
      x-enum-descriptions:
        - >-
          Transfer was created with `execute: true`, but is momentarily being
          quoted before executing _or_ the transfer was created with `execute:
          false`. It can be executed by calling
          `/v2/transfers/{transferId}/execute` with `execute: true`.
        - >-
          Transfer is executing after being quoted. No action needed - monitor
          progress via the transfers webhook.
        - Transfer completed successfully.
        - Transfer failed. See `failureReason` for details.
    TransferSource:
      description: The source of the transfer.
      oneOf:
        - $ref: '#/components/schemas/transfers_Account'
        - $ref: '#/components/schemas/PaymentMethod'
        - $ref: '#/components/schemas/OnchainAddress'
        - $ref: '#/components/schemas/OriginatingBankAccountUS'
      example: {}
    TransferTarget:
      description: The target of the transfer.
      oneOf:
        - $ref: '#/components/schemas/transfers_Account'
        - $ref: '#/components/schemas/PaymentMethod'
        - $ref: '#/components/schemas/OnchainAddress'
        - $ref: '#/components/schemas/EmailInstrument'
      example: {}
    Asset:
      type: string
      minLength: 1
      maxLength: 42
      description: The symbol of the asset (e.g., eth, usd, usdc, usdt).
      example: usd
    TransferExchangeRate:
      type: object
      description: >-
        Exchange rate information for currency conversion. The rate indicates
        how much of the target asset is equivalent to one unit of the source
        asset.
      properties:
        sourceAsset:
          allOf:
            - $ref: '#/components/schemas/Asset'
          description: The asset being converted from.
          example: usd
        targetAsset:
          allOf:
            - $ref: '#/components/schemas/Asset'
          description: The asset being converted to.
          example: usdc
        rate:
          type: string
          description: >-
            The exchange rate value as a decimal string. Indicates how many
            units of the target asset equal one unit of the source asset.
          example: '1'
      required:
        - sourceAsset
        - targetAsset
        - rate
      example:
        sourceAsset: usd
        targetAsset: usdc
        rate: '1'
    TransferFees:
      type: array
      description: >-
        The fees associated with this transfer. Different transfer types have
        different fee structures.


        **NOTE:** These examples are not exhaustive.


        Common examples:

        * **Crypto transfers**: Network fees (gas) paid in the native token

        * **Fiat conversions**: Processing fees + exchange fees in USD

        * **Wire transfers**: Wire fees ($15) + processing fees ($5) in USD

        * **Crypto conversions**: Spread fees paid in the source asset.
      example:
        - type: bank
          amount: '20'
          asset: usd
        - type: conversion
          amount: '1.00'
          asset: usdc
        - type: network
          amount: '0.01'
          asset: usdc
      items:
        $ref: '#/components/schemas/TransferFee'
    TransferEstimate:
      type: object
      description: >-
        A point-in-time snapshot of estimated values for a transfer where exact
        amounts cannot be locked in at quote time (e.g., when the executed rate
        is determined at execution time and moves with the market).


        Present in both pre-execution and post-execution states:

        * **Quoted state:** top-level fields whose values cannot be guaranteed
        are absent;
          `estimate` holds their estimated values.

        * **Completed state:** top-level fields contain the actual executed
        values;
          `estimate` is retained as an immutable audit snapshot of the pre-execution estimate.
      properties:
        exchangeRate:
          $ref: '#/components/schemas/TransferExchangeRate'
        targetAmount:
          type: string
          description: >-
            Estimated amount of the target asset that will be received, as a
            decimal string in standard unit denomination.
          example: '85.00'
        targetAsset:
          allOf:
            - $ref: '#/components/schemas/Asset'
          description: The asset symbol of the estimated target amount.
          example: eur
        fees:
          $ref: '#/components/schemas/TransferFees'
        estimatedAt:
          type: string
          format: date-time
          description: The date and time when this estimate was captured.
          example: '2023-10-08T14:30:00Z'
      required:
        - estimatedAt
      example:
        exchangeRate:
          sourceAsset: usdc
          targetAsset: eur
          rate: '0.85'
        targetAmount: '85.00'
        targetAsset: eur
        fees:
          - type: conversion
            amount: '0.01'
            asset: usdc
        estimatedAt: '2023-10-08T14:30:00Z'
    Metadata:
      type: object
      description: >-
        Optional metadata as key-value pairs. Use this to store additional
        structured information on a resource, such as customer IDs, order
        references, or any application-specific data. Up to 10 key/value pairs
        may be provided. Keys and values are both strings. Keys must be ≤ 40
        characters; values must be ≤ 500 characters.
      additionalProperties:
        type: string
        minLength: 0
        maxLength: 500
      maxProperties: 10
      example:
        customer_id: cust_12345
        order_reference: order-67890
    TransferDetails:
      type: object
      description: >-
        Additional details about the transfer. For example, if the transfer was
        sent to a deposit destination, the information about that destination
        will be included in this field.
      properties:
        depositDestination:
          $ref: '#/components/schemas/DepositDestinationReference'
        onchainTransactions:
          type: array
          description: The onchain transactions associated with the transfer.
          items:
            type: object
            description: An onchain transaction associated with the transfer.
            properties:
              transactionHash:
                type: string
                description: The transaction hash.
                example: >-
                  0x363cd3b3d4f49497cf5076150cd709307b90e9fc897fdd623546ea7b9313cecb
              network:
                $ref: '#/components/schemas/Network'
            required:
              - transactionHash
              - network
          example:
            - transactionHash: >-
                0x363cd3b3d4f49497cf5076150cd709307b90e9fc897fdd623546ea7b9313cecb
              network: base
        travelRule:
          type: object
          description: >-
            Travel rule compliance status for deposit transfers. Present when
            the transfer requires travel rule information.
          properties:
            status:
              $ref: '#/components/schemas/TravelRuleStatus'
            statusMessage:
              type: string
              description: >-
                Additional details about the current travel rule status. For
                example, when status is `incomplete`, this may indicate the
                specific missing information required to proceed.
              example: Originator date of birth is required.
          example:
            status: incomplete
            statusMessage: Originator date of birth is required.
      example:
        depositDestination:
          id: depositDestination_af2937b0-9846-4fe7-bfe9-ccc22d935114
        onchainTransactions:
          - transactionHash: '0x363cd3b3d4f49497cf5076150cd709307b90e9fc897fdd623546ea7b9313cecb'
            network: base
    ErrorType:
      description: >-
        The code that indicates the type of error that occurred. These error
        codes can be used to determine how to handle the error.
      type: string
      example: invalid_request
      enum:
        - already_exists
        - authorization_expired
        - bad_gateway
        - capture_expired
        - client_closed_request
        - customer_not_authorized
        - endpoint_unavailable
        - faucet_limit_exceeded
        - forbidden
        - idempotency_error
        - internal_server_error
        - invalid_request
        - invalid_sql_query
        - invalid_signature
        - malformed_transaction
        - not_found
        - payment_method_required
        - payment_required
        - settlement_failed
        - rate_limit_exceeded
        - request_canceled
        - service_unavailable
        - timed_out
        - unauthorized
        - unsupported_tos_language
        - policy_violation
        - policy_in_use
        - account_limit_exceeded
        - network_not_tradable
        - guest_permission_denied
        - guest_region_forbidden
        - guest_transaction_limit
        - guest_transaction_count
        - phone_number_verification_expired
        - document_verification_failed
        - recipient_allowlist_violation
        - recipient_allowlist_pending
        - refund_expired
        - travel_rules_recipient_violation
        - source_account_invalid
        - target_account_invalid
        - source_account_not_found
        - target_account_not_found
        - source_asset_not_supported
        - target_asset_not_supported
        - target_email_invalid
        - target_onchain_address_invalid
        - transfer_amount_invalid
        - transfer_asset_not_supported
        - transfer_quote_expired
        - insufficient_balance
        - metadata_too_many_entries
        - metadata_key_too_long
        - metadata_value_too_long
        - travel_rules_field_missing
        - asset_mismatch
        - mfa_already_enrolled
        - mfa_invalid_code
        - mfa_flow_expired
        - mfa_required
        - mfa_not_enrolled
        - order_quote_expired
        - order_already_filled
        - order_already_canceled
        - account_not_ready
        - insufficient_liquidity
        - insufficient_allowance
        - transaction_simulation_failed
        - delegation_not_found
        - delegation_expired
        - delegation_revoked
        - delegation_not_authorized
        - delegation_not_enabled
        - network_mismatch
        - already_enabled
      x-error-instructions:
        already_exists: >-
          This error occurs when trying to create a resource that already
          exists.


          **Steps to resolve:**

          1. Check if the resource exists before creation

          2. Use GET endpoints to verify resource state

          3. Use unique identifiers/names for resources
        authorization_expired: >-
          Returned when an authorization attempt is made after the payment
          session's authorization deadline has passed. Create a new payment
          session with a later authorization deadline.
        bad_gateway: >-
          This error occurs when the CDP API is unable to connect to the backend
          service.


          **Steps to resolve:**

          1. Retry your request after a short delay

          2. If persistent, contact CDP support with:
             - The timestamp of the error
             - Request details
          3. Consider implementing retry logic with an exponential backoff


          **Note:** These errors are automatically logged and monitored by CDP.
        capture_expired: >-
          Returned when a capture attempt is made after the payment session's
          capture deadline has passed. The payment session can no longer be
          captured.
        client_closed_request: >-
          This error occurs when the client closes the connection before the
          server can send a response.


          **Common causes:**

          - The client timed out waiting for the server response

          - The client application was terminated during a pending request

          - Network interruption caused the client connection to drop


          **Steps to resolve:**

          1. Increase client-side timeout settings if applicable

          2. Implement retry logic with exponential backoff for long-running
          queries

          3. Consider optimizing the request to reduce server processing time
        endpoint_unavailable: >-
          This error occurs when a specific endpoint has been temporarily
          disabled by an operator (e.g. a kill switch). The CDP API as a whole
          is still healthy; only this endpoint is unavailable. Distinct from
          `service_unavailable`, which indicates the API itself is down.


          Re-enabling is a manual operator action, so the endpoint may remain
          unavailable for an extended period.


          **Steps to resolve:**

          1. Check the [CDP status page](https://cdpstatus.coinbase.com/) for an
          active incident.

          2. If persistent, contact CDP support with:
             - The timestamp of the error
             - Request details
        faucet_limit_exceeded: >-
          This error occurs when you've exceeded the faucet request limits.


          **Steps to resolve:**

          1. Wait for the time window to reset

          2. Use funds more efficiently in your testing


          For more information on faucet limits, please visit the [EVM Faucet
          endpoint](https://docs.cdp.coinbase.com/api-reference/v2/rest-api/faucets/request-funds-on-evm-test-networks)
          or the [Solana Faucet
          endpoint](https://docs.cdp.coinbase.com/api-reference/v2/rest-api/faucets/request-funds-on-solana-devnet).
        customer_not_authorized: >-
          This error occurs when the customer is not currently authorized for
          one

          or more capabilities required to perform the requested action. This
          can

          happen at any point in the customer's lifecycle and may or may not be

          resolvable by the developer.


          The response includes an `unauthorizedCapabilities` field listing the

          capability code(s) that were not authorized on this request.


          **Steps to resolve:**

          1. Fetch the customer with `GET /v2/customers/{customerId}` and
          inspect
             the `requirements` field. If `requirements.due` is non-empty, submit
             the listed fields via `POST /v2/customers/{customerId}` and retry.
          2. If `requirements.due` is empty, no further action is available —
          the
             customer is not currently eligible for this action.
        forbidden: >-
          This error occurs when you don't have permission to access the
          resource.


          **Steps to resolve:**

          1. Verify your permissions to access the resource

          2. Ensure that you are the owner of the requested resource
        idempotency_error: >-
          This error occurs when an idempotency key is reused with different
          parameters.


          **Steps to resolve:**

          1. Generate a new UUID v4 for each unique request

          2. Only reuse idempotency keys for exact request duplicates

          3. Track used keys within your application


          **Example idempotency key implementation:**

          ```typescript lines wrap

          import { v4 as uuidv4 } from 'uuid';


          function createIdempotencyKey() {
            return uuidv4();
          }

          ```
        internal_server_error: >-
          This indicates an unexpected error that occurred on the CDP servers.


          **Important**: If you encounter this error, please note that your
          operation's status should be treated as unknown by your application,
          as it could have been a success within the CDP back-end.


          **Steps to resolve:**

          1. Retry your request after a short delay

          2. If persistent, contact CDP support with:
             - Your correlation ID
             - Timestamp of the error
             - Request details
          3. Consider implementing retry logic with an exponential backoff


          **Note:** These errors are automatically logged and monitored by CDP.
        invalid_request: >-
          This error occurs when the request is malformed or contains invalid
          data, including issues with the request body, query parameters, path
          parameters, or headers.


          **Steps to resolve:**

          1. Check all required fields and parameters are present

          2. Ensure request body (if applicable) follows the correct schema

          3. Verify all parameter formats match the API specification:
             - Query parameters
             - Path parameters
             - Request headers
          4. Validate any addresses, IDs, or other formatted strings meet
          requirements


          **Common validation issues:**

          - Missing required parameters

          - Invalid parameter types or formats

          - Malformed JSON in request body

          - Invalid enum values


          #### Transfer-specific validation errors


          The following transfer validation scenarios return `errorType:
          "invalid_request"`. Use the `errorMessage` field to identify the
          specific case.


          | Scenario | Example `errorMessage` |

          |----------|----------------------|

          | Source account ID is malformed | `"source is invalid."` |

          | Target account ID is malformed | `"target is invalid."` |

          | Source account does not exist | `"source not found."` |

          | Target account does not exist | `"target not found."` |

          | Asset not supported at source | `"source is not supported."` |

          | Asset not supported at target | `"target is not supported."` |

          | Target email address is malformed | `"target has an invalid email
          format."` |

          | Target onchain address is invalid for network | `"The recipient
          address is invalid for the selected network."` |

          | Asset not supported for this transfer route | `"Transfer asset pair
          is not supported."` |

          | Insufficient balance | `"Insufficient funds to complete this
          transfer."` |

          | Asset mismatch between request fields | `"Currency mismatch in
          request."` |

          | Metadata has too many keys | `"Metadata has too many keys. Up to 10
          key/value pairs are permitted."` |

          | Metadata key exceeds length limit | `"Metadata key is too long. Each
          key must be less than or equal to 40 characters."` |

          | Metadata value exceeds length limit | `"Metadata value is too long.
          Each value must be less than or equal to 500 characters."` |

          | Travel rule fields missing | `"Travel rule information is
          incomplete. Missing fields: ..."` |

          | Recipient address not in account allowlist | `"Your coinbase account
          allowlist does not include this address. Please update your allowlist
          at https://www.coinbase.com/settings/allowlist"` |
        invalid_sql_query: |-
          This error occurs when the SQL query is invalid or not allowed.

          **Common causes:**
          - Using non-SELECT SQL statements (INSERT, UPDATE, DELETE, etc.)
          - Invalid table or column names
          - Syntax errors in SQL query
          - Query exceeds character limit
          - Too many JOIN operations
        invalid_signature: >-
          This error occurs when the signature provided for the given user
          operation is invalid.


          **Steps to resolve:**

          1. Verify the signature was generated by the correct owner account

          2. Ensure the signature corresponds to the exact user operation hash

          3. Check that the signature format matches the expected format

          4. Confirm you're using the correct network for the Smart Account


          **Common causes:**

          - Using wrong owner account to sign

          - Signing modified/incorrect user operation data

          - Malformed signature encoding

          - Network mismatch between signature and broadcast
        malformed_transaction: >-
          This error occurs when the transaction data provided is not properly
          formatted or is invalid.


          **Steps to resolve:**

          1. Verify transaction encoding:
             - **EVM networks**: Check RLP encoding is correct
             - **Solana**: Validate base64 encoding
          2. Ensure all required transaction fields are present

          3. Validate transaction parameters are within acceptable ranges

          4. Check that the transaction type is supported on the target network
          (see our [Supported
          Networks](https://docs.cdp.coinbase.com/get-started/supported-networks)
          page for more details)


          **Common causes:**

          - Invalid hex encoding for EVM transactions

          - Missing required transaction fields

          - Incorrect parameter formats

          - Unsupported transaction types

          - Network-specific transaction format mismatches
        not_found: >-
          This error occurs when the resource specified in your request doesn't
          exist or you don't have access to it.


          **Steps to resolve:**

          1. Verify the resource ID/address/account exists

          2. Check your permissions to access the resource

          3. Ensure you're using the correct network/environment

          4. Confirm the resource hasn't been deleted


          **Common causes:**

          - Mistyped addresses

          - Accessing resources from the wrong CDP project

          - Resource was deleted or hasn't been created yet
        payment_method_required: >-
          This error occurs when a payment method is required to complete the
          requested operation but none is configured or available.


          **Steps to resolve:**

          1. Add a valid payment method to your account using the [CDP
          Portal](https://portal.cdp.coinbase.com)

          2. Ensure your payment method is valid and not expired


          **Common causes:**

          - No payment method configured on the account

          - Payment method is expired
        payment_required: >-
          This error occurs when an x402 payment is required to access the
          requested resource.


          **Steps to resolve:**

          1. Include a valid x402 payment header in your request

          2. Ensure the payment meets the resource's pricing requirements
        settlement_failed: >-
          This error occurs when an x402 payment was verified but settlement
          on-chain failed.


          **Steps to resolve:**

          1. Retry the request with a new payment

          2. Ensure the payment asset has sufficient balance for settlement
        rate_limit_exceeded: |-
          This error occurs when you've exceeded the API rate limits.

          **Steps to resolve:**
          1. Implement exponential backoff
          2. Cache responses where possible
          3. Wait for rate limit window to reset

          **Best practices:**
          ```typescript lines wrap
          async function withRetry(fn: () => Promise<any>) {
            let delay = 1000;
            while (true) {
              try {
                return await fn();
              } catch (e) {
                if (e.errorType === "rate_limit_exceeded") {
                  await sleep(delay);
                  delay *= 2;
                  continue;
                }
                throw e;
              }
            }
          }
          ```
        request_canceled: >-
          This error occurs when the client cancels an in-progress request
          before it completes.


          **Steps to resolve:**

          1. Check client-side timeout configurations

          2. Review request cancellation logic in your code

          3. Consider increasing timeout thresholds for long-running operations

          4. Implement request tracking to identify premature cancellations


          **Best practices:**

          ```typescript lines wrap

          async function withTimeout<T>(promise: Promise<T>, timeoutMs: number):
          Promise<T> {
            const timeout = new Promise((_, reject) => {
              setTimeout(() => {
                reject(new Error("Operation timed out"));
              }, timeoutMs);
            });

            try {
              return await Promise.race([promise, timeout]);
            } catch (error) {
              // Handle timeout or cancellation
              throw error;
            }
          }

          ```
        service_unavailable: >-
          This error occurs when the CDP API is temporarily unable to handle
          requests due to maintenance or high load.


          **Steps to resolve:**

          1. Retry your request after a short delay

          2. If persistent, contact CDP support with:
             - The timestamp of the error
             - Request details
          3. Consider implementing retry logic with an exponential backoff


          **Note:** These errors are automatically logged and monitored by CDP.
        timed_out: >-
          This error occurs when a request exceeds the maximum allowed
          processing time.


          **Steps to resolve:**

          1. Break down large requests into smaller chunks (if applicable)

          2. Implement retry logic with exponential backoff

          3. Use streaming endpoints for large data sets


          **Example retry implementation:**

          ```typescript lines wrap

          async function withRetryAndTimeout<T>(
            operation: () => Promise<T>,
            maxRetries = 3,
            timeout = 30000,
          ): Promise<T> {
            let attempts = 0;
            while (attempts < maxRetries) {
              try {
                return await Promise.race([
                  operation(),
                  new Promise((_, reject) =>
                    setTimeout(() => reject(new Error("Timeout")), timeout)
                  ),
                ]);
              } catch (error) {
                attempts++;
                if (attempts === maxRetries) throw error;
                // Exponential backoff
                await new Promise(resolve =>
                  setTimeout(resolve, Math.pow(2, attempts) * 1000)
                );
              }
            }
            throw new Error("Max retries exceeded");
          }

          ```
        unauthorized: |-
          This error occurs when authentication fails.

          **Steps to resolve:**
          1. Verify your CDP API credentials:
             - Check that your API key is valid
             - Check that your Wallet Secret is properly configured
          2. Validate JWT token:
             - Not expired
             - Properly signed
             - Contains required claims
          3. Check request headers:
             - Authorization header present
             - X-Wallet-Auth header included when required

          **Security note:** Never share your Wallet Secret or API keys.
        unsupported_tos_language: >-
          A submitted Terms of Service acceptance used a `language` that is not
          published for the referenced `versionId`.


          **Steps to resolve:**

          1. Read `Customer.requirements.tos.tosVersions[]` and find the entry
          whose `versionId` matches your acceptance.

          2. Choose a `language` from that entry's `languages` list (BCP 47
          tags).

          3. Retry with `tosAcceptances[].language` set to a supported tag.
        policy_in_use: >-
          This error occurs when trying to delete a Policy that is currently in
          use by at least one project or account.


          **Steps to resolve:**

          1. Update project or accounts to remove references to the Policy in
          question.

          2. Retry your delete request.
        network_not_tradable: >-
          This error occurs when the selected asset cannot be purchased on the
          selected network in the user's location.


          **Steps to resolve:**

          1. Verify the asset is tradable on the selected network

          2. Check the user's location to ensure it is allowed to purchase the
          asset on the selected network


          **Common causes:**

          - Users in NY are not allowed to purchase USDC on any network other
          than Ethereum
        guest_permission_denied: >-
          This error occurs when the user is not allowed to complete onramp
          transactions as a guest.


          **Steps to resolve:**

          1. Redirect the user to create a Coinbase account to buy and send
          crypto.
        guest_region_forbidden: >-
          This error occurs when guest onramp transactions are not allowed in
          the user's region.


          **Steps to resolve:**

          1. Redirect the user to create a Coinbase account to buy and send
          crypto.
        guest_transaction_limit: >-
          This error occurs when the user has reached the weekly guest onramp
          transaction limit.


          **Steps to resolve:**

          1. Inform the user they have reached their weekly limit and will have
          to wait until next week.
        guest_transaction_count: >-
          This error occurs when the user has reached the lifetime guest onramp
          transaction count limit.


          **Steps to resolve:**

          1. Redirect the user to create a Coinbase account to buy and send
          crypto.
        phone_number_verification_expired: >-
          This error occurs when the user's phone number verification has
          expired. Use of guest Onramp requires the user's

          phone number to be verified every 60 days.


          **Steps to resolve:**

          1. Re-verify the user's phone number via OTP.

          2. Retry the request with the phoneNumberVerifiedAt field set to new
          verification timestamp.
        document_verification_failed: >-
          This error occurs when the user has not verified their identity for
          their coinbase.com account.

          **Steps to resolve:**

          1. Verify your coinbase account identity with valid documents at
          https://www.coinbase.com/settings/account-levels.
        recipient_allowlist_violation: >-
          This error occurs when the user is not allowed to receive funds at
          this address, according to their coinbase account allowlist.

          **Steps to resolve:**

          1. Either disable the allowlist or add the wallet address at
          https://www.coinbase.com/settings/allowlist

          2. Wait approximately 2 days for updates to take effect.
        recipient_allowlist_pending: >-
          This error occurs when the user is not allowed to receive funds at
          this address, because changes to their coinbase account allowlist are
          pending.

          **Steps to resolve:**

          1. Wait approximately 2 days for updates to take effect.
        refund_expired: >-
          Returned when a refund attempt is made after the payment session's
          refund deadline has passed. The payment session can no longer be
          refunded.
        travel_rules_recipient_violation: >-
          This error occurs when the user is not allowed to receive funds at
          this address, because it violates travel rules.

          **Steps to resolve:**

          1. Ensure your desired transfer is not blocked by local travel
          regulations.
        mfa_already_enrolled: >-
          This error occurs when attempting to enroll in an MFA method that the
          user has already enrolled in.


          **Steps to resolve:**

          1. Check if the user is already enrolled in the MFA method before
          initiating enrollment

          2. To update or reset MFA, remove the existing enrollment first (if
          supported)

          3. Use a different MFA method if multiple options are available
        mfa_invalid_code: >-
          This error occurs when the MFA code provided is incorrect or has
          already been used.


          **Steps to resolve:**

          1. Verify the user entered the correct code from their authenticator
          app

          2. Ensure the code is current (TOTP codes expire after 30 seconds)

          3. Check that the device time is synchronized correctly

          4. Ask the user to generate a new code and try again


          **Common causes:**

          - Typing errors in the 6-digit code

          - Using an expired TOTP code

          - Device clock drift on user's authenticator app

          - Attempting to reuse a previously submitted code
        mfa_flow_expired: >-
          This error occurs when the MFA enrollment or verification session has
          expired.


          **Steps to resolve:**

          1. Restart the MFA enrollment or verification flow

          2. Complete the flow within the allowed time window (typically 5
          minutes)

          3. Ensure the user doesn't leave the flow idle for extended periods


          **Note:** MFA sessions expire automatically for security purposes.
        mfa_required: >-
          This error occurs when attempting to perform a sensitive operation
          that requires MFA verification, but the user has not completed MFA
          verification.


          **Steps to resolve:**

          1. Initiate the MFA verification flow using the
          `/mfa/verify/{mfaMethod}/init` endpoint

          2. Prompt the user to enter their MFA code

          3. Submit the verification using the `/mfa/verify/{mfaMethod}/submit`
          endpoint

          4. Use the returned access token with MFA claim for the sensitive
          operation

          5. Retry the original request with the new MFA-verified token


          **Operations requiring MFA:**

          - Transactions Sign/Send

          - Key export

          - Account management actions (when configured)
        mfa_not_enrolled: >-
          This error occurs when attempting to verify MFA for a user who has not
          enrolled in any MFA method.


          **Steps to resolve:**

          1. Check if the user has enrolled in MFA before attempting
          verification

          2. Guide the user through MFA enrollment first using the
          `/mfa/enroll/{mfaMethod}/init` endpoint

          3. Complete enrollment before requiring MFA verification
        source_account_invalid: >-
          This error occurs when the source account specified in the transfer
          request is invalid or malformed.


          **Steps to resolve:**

          1. Verify the account ID format is correct (e.g.,
          `account_xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx`)

          2. Ensure the account ID belongs to your CDP entity

          3. Verify the account ID exists by calling `GET
          /v2/accounts/{accountId}` or `GET /v2/accounts`


          **Common causes:**

          - Malformed account ID

          - Typo in the account ID
        target_account_invalid: >-
          This error occurs when the target account specified in the transfer
          request is invalid or malformed.


          **Steps to resolve:**

          1. Verify the account ID format is correct (e.g.,
          `account_xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx`)

          2. Ensure the account exists and can receive funds

          3. Verify the account ID exists by calling `GET
          /v2/accounts/{accountId}` or `GET /v2/accounts`


          **Common causes:**

          - Malformed account ID

          - Typo in the account ID
        source_account_not_found: >-
          This error occurs when the source account specified in the transfer
          does not exist.


          **Steps to resolve:**

          1. Verify the account ID exists by calling `GET
          /v2/accounts/{accountId}` or `GET /v2/accounts`
        target_account_not_found: >-
          This error occurs when the target account specified in the transfer
          does not exist.


          **Steps to resolve:**

          1. Verify the account ID exists by calling `GET
          /v2/accounts/{accountId}` or `GET /v2/accounts`
        source_asset_not_supported: >-
          This error occurs when the asset specified in the transfer source is
          not supported for this transfer type.


          **Steps to resolve:**

          1. Check the list of supported assets for the source account type

          2. Verify the asset symbol is correctly specified (e.g., `usdc`,
          `usdt`)


          **Common causes:**

          - Unsupported asset for the transfer route

          - Incorrect asset symbol
        target_asset_not_supported: >-
          This error occurs when the asset specified in the transfer target is
          not supported for this transfer type.


          **Steps to resolve:**

          1. Check the list of supported assets for the target

          2. Verify the asset symbol is correctly specified (e.g., `usdc`,
          `usdt`)

          3. Ensure the target can receive this asset type


          **Common causes:**

          - Asset not supported by the target

          - Unsupported conversion between source and target assets
        target_email_invalid: >-
          This error occurs when the email address specified as the transfer
          target is invalid.


          **Steps to resolve:**

          1. Verify the email address format is valid (e.g., `user@example.com`)

          2. Check for typos in the email address

          3. Ensure the email domain is valid


          **Common causes:**

          - Invalid email format

          - Missing @ symbol or domain

          - Typo in the email address
        target_onchain_address_invalid: >-
          This error occurs when the onchain address specified as the transfer
          target is invalid for the specified network.


          **Steps to resolve:**

          1. Ensure the network is supported for the transfer type

          2. Verify the address format matches the target network

          3. Ensure you haven't mixed up addresses from different networks


          **Common causes:**

          - Network not supported for the transfer type

          - Address format doesn't match network

          - Address from a different blockchain network
        transfer_amount_invalid: >-
          This error occurs when the transfer amount is invalid.


          **Steps to resolve:**

          1. Ensure the amount is a positive number and greater than $1 USD
          equivalent amount

          2. Verify the amount format is a valid decimal string (e.g.,
          `"100.50"`)

          3. Check the number of decimal places for the asset


          **Common causes:**

          - Zero or negative amount

          - Too many decimal places for the asset

          - Amount below minimum threshold ($1 USD equivalent amount)
        transfer_asset_not_supported: >-
          This error occurs when the asset specified for the transfer is not
          supported.


          **Steps to resolve:**

          1. Check the list of supported assets for transfers

          2. Verify the asset symbol is correctly specified

          3. Ensure the asset is supported for the transfer route (source →
          target)


          **Common causes:**

          - Asset not supported for transfers

          - Incorrect asset symbol
        transfer_quote_expired: >-
          This error occurs when the transfer quote has expired. Quotes are
          valid for a limited time.


          **Steps to resolve:**

          1. Create a new transfer to obtain a fresh quote

          2. Execute the transfer promptly after creation


          **Common causes:**

          - Too much time elapsed between creating and executing the transfer
        insufficient_balance: >-
          This error occurs when the source account does not have enough funds
          to complete the transfer including fees.


          **Steps to resolve:**

          1. Check the source account balance

          2. Ensure the balance covers both the transfer amount and any fees

          3. Consider using `amountType: "source"` to transfer the maximum
          available amount minus fees

          4. Add funds to the source account if needed


          **Common causes:**

          - Transfer amount exceeds available balance

          - Not accounting for transfer fees

          - Pending transactions reducing available balance
        metadata_too_many_entries: >-
          This error occurs when the transfer metadata contains more entries
          than allowed.


          **Steps to resolve:**

          1. Reduce the number of metadata entries (maximum 10 allowed)

          2. Consolidate related data into fewer keys

          3. Store additional data externally and reference it with a single
          metadata entry


          **Limits:**

          - Maximum entries: 10
        metadata_key_too_long: >-
          This error occurs when a metadata key exceeds the maximum allowed
          length.


          **Steps to resolve:**

          1. Shorten the metadata key to 40 characters or less

          2. Use abbreviations or shorter naming conventions

          3. Consider using a key-value structure where the value contains the
          longer identifier


          **Limits:**

          - Maximum key length: 40 characters
        metadata_value_too_long: >-
          This error occurs when a metadata value exceeds the maximum allowed
          length.


          **Steps to resolve:**

          1. Shorten the metadata value to 500 characters or less

          2. Store longer data externally and reference it with a shorter
          identifier

          3. Consider compressing or encoding the data if appropriate


          **Limits:**

          - Maximum value length: 500 characters
        travel_rules_field_missing: >-
          This error occurs when required travel rule fields are missing from
          the transfer request.


          **Steps to resolve:**

          1. Include the `travelRule` object in your transfer request

          2. Supply the required missing fields prompted by the error message

          3. Review the travel rule requirements for your jurisdiction


          Note: Required fields may vary by region.
        asset_mismatch: >-
          This error occurs when the assets specified in the transfer are
          incompatible or don't match expected values.


          **Steps to resolve:**

          1. Ensure the `asset` field matches either the source or target asset

          2. Verify that the source and target assets are compatible for
          conversion (if different)

          3. Check that the asset symbols are correctly specified


          **Common causes:**

          - Transfer asset doesn't match source or target

          - Attempting an unsupported asset conversion

          - Typo in asset symbols
        order_quote_expired: >-
          This error occurs when attempting to execute an order whose quote has
          expired.


          **Steps to resolve:**

          1. Create a new order with `execute: false` to get an updated quote.

          2. Execute the new order before the quote expires (check the
          `expiresAt` field).

          3. Alternatively, create a new order with `execute: true` to skip the
          quote step and execute immediately.
        order_already_filled: >-
          This error occurs when attempting to cancel or modify an order that
          has already been filled.


          **Steps to resolve:**

          1. Check the current status of the order using `GET
          /v2/orders/{orderId}`.

          2. A filled order cannot be canceled or re-executed.
        order_already_canceled: >-
          This error occurs when attempting to cancel or execute an order that
          has already been canceled.


          **Steps to resolve:**

          1. Check the current status of the order using `GET
          /v2/orders/{orderId}`.

          2. Create a new order if you still want to trade.
        account_not_ready: >-
          This error occurs when an operation is attempted on an account that is
          still being provisioned.


          **Steps to resolve:**

          1. Wait a few moments and retry the request

          2. If the error persists, the account may still be completing setup —
          retry with exponential backoff
        insufficient_liquidity: >-
          This error occurs when no swap route is available for the requested
          token pair or amount.


          **Steps to resolve:**

          1. Try a smaller `fromAmount` — large orders may exceed available
          liquidity

          2. Try a different token pair

          3. Retry after a short delay; liquidity conditions change with market
          activity
        insufficient_allowance: >-
          This error occurs when the taker has not approved the Permit2 contract
          to spend the `fromToken`

          on their behalf. ERC-20 swaps require a Permit2 allowance. Native ETH
          swaps do not.


          **Steps to resolve:**

          1. Submit an ERC-20 `approve` transaction on the `fromToken` contract,
          granting the Permit2
             contract (`0x000000000022D473030F116dDEE9F6B43aC78BA3`) an allowance of at least `fromAmount`
          2. Wait for the approval transaction to be confirmed on-chain

          3. Retry the swap


          **Example:**

          ```typescript lines wrap

          // Approve Permit2 to spend fromToken

          await walletClient.writeContract({
            address: fromToken,
            abi: erc20Abi,
            functionName: "approve",
            args: ["0x000000000022D473030F116dDEE9F6B43aC78BA3", fromAmount],
          });

          ```
        transaction_simulation_failed: >-
          This error occurs when the pre-broadcast simulation of the swap
          transaction predicted a revert.

          No transaction was submitted and no gas was spent.


          **Common causes:**

          - The on-chain price moved past the `slippageBps` tolerance between
          the price estimate and execution

          - Taker balance changed between the price estimate and execution


          **Steps to resolve:**

          1. Retry immediately — prices change quickly and a new quote may
          succeed

          2. Increase `slippageBps` if retries continue to fail (e.g. from 100
          to 200)

          3. For large swaps, consider splitting into smaller amounts to reduce
          price impact
        delegation_not_found: >-
          This error occurs when a delegated signing operation is attempted but
          no active

          delegation grant exists for the end user (or account).


          **Steps to resolve:**

          1. Create a delegation grant using `createDelegationForEndUser`
          (user-scoped)
             or `createDelegationForEndUserAccount` (account-scoped) before calling
             the signing or sending operation
          2. If you previously created a grant, it may have expired or been
          revoked —
             in those cases you would receive a `delegation_expired` or
             `delegation_revoked` error instead
          3. For account-scoped grants, verify the address in the request
          matches the
             granted address (EVM addresses are compared case-insensitively;
             Solana addresses must match exactly)
        delegation_expired: >-
          This error occurs when the delegation grant used for signing has
          expired.

          Delegation grants have a limited lifetime set at creation.


          **Steps to resolve:**

          1. Create a new delegation grant using `createDelegationForEndUser` or
             `createDelegationForEndUserAccount`
          2. Retry the signing operation with the new grant active

          3. Consider creating grants with a longer TTL if expiry is frequent
        delegation_revoked: >-
          This error occurs when the delegation grant has been explicitly
          revoked.


          **Steps to resolve:**

          1. Create a new delegation grant using `createDelegationForEndUser` or
             `createDelegationForEndUserAccount`
          2. Confirm with the end user before recreating, since revocation is
             typically intentional
        delegation_not_authorized: >-
          This error occurs when a delegation grant exists but does not
          authorize the

          requested operation.


          **Steps to resolve:**

          1. For account-scoped grants, verify the signing address matches the
          address
             the grant was created for
          2. Check that the operation is permitted for delegated signing on your
          project

          3. Create a grant with the correct scope if needed
        delegation_not_enabled: >-
          This error occurs when delegated signing is attempted on a project
          that has

          not enabled the feature.


          **Steps to resolve:**

          1. Enable delegated signing in your project configuration via the CDP
          Portal

          2. Contact support if you believe delegated signing should already be
          enabled
             for your project
        network_mismatch: >-
          This error occurs when the requested operation specifies a network on
          which the

          target resource is not deployed or not available.


          **Steps to resolve:**

          1. Use the network the resource was originally created or deployed on

          2. Check the resource metadata to confirm the correct network


          **Common causes:**

          - Specifying `base` for a resource that only exists on `base-sepolia`
          (or vice versa)

          - Cross-network operation attempted on a resource scoped to a single
          network
        already_enabled: >-
          This error occurs when the requested operation cannot be performed
          because

          the capability is already in the desired state.


          **Steps to resolve:**

          1. Check the current state of the resource before attempting the
          operation

          2. No action is needed if the resource is already in the desired state


          **Common causes:**

          - Calling an enable endpoint on a resource that already has the
          feature enabled
    Url:
      type: string
      format: uri
      minLength: 11
      maxLength: 2048
      pattern: ^https?://.*$
      description: A valid HTTP or HTTPS URL.
      example: https://example.com
    CapabilityName:
      type: string
      description: >
        The name of a capability. Capabilities represent granular functional
        permissions

        that determine what actions a customer can perform. Each capability must
        be

        explicitly requested before use.
      enum:
        - custodyCrypto
        - custodyFiat
        - custodyStablecoin
        - tradeCrypto
        - tradeStablecoin
        - transferCrypto
        - transferFiat
        - transferStablecoin
      example: custodyCrypto
    transfers_Account:
      type: object
      title: Account
      description: The Account specific details for the transfer.
      properties:
        accountId:
          type: string
          description: The ID of the Account.
        asset:
          $ref: '#/components/schemas/Asset'
      required:
        - accountId
        - asset
      example:
        accountId: account_af2937b0-9846-4fe7-bfe9-ccc22d935114
        asset: usd
    PaymentMethod:
      type: object
      title: Payment Method
      description: The Payment Method specific details for the transfer.
      properties:
        paymentMethodId:
          type: string
          description: The ID of the Payment Method.
        asset:
          $ref: '#/components/schemas/Asset'
      required:
        - paymentMethodId
        - asset
      example:
        paymentMethodId: pm_af2937b0-9846-4fe7-bfe9-ccc22d935114
        asset: usd
    OnchainAddress:
      type: object
      title: Onchain Address
      description: The target of the payment is an onchain address.
      properties:
        address:
          allOf:
            - $ref: '#/components/schemas/BlockchainAddress'
          description: |
            The onchain crypto address of the recipient.

            Examples:
            - EVM address: 0xabc1234567890abcdef1234567890abcdef123456
            - Solana address: HpabPRRCFbBKSuJr5PdkVvQc85FyxyTWkFM2obBRSvHT
            - XRP address: rhccc5p23aKiCGFcEqqnjEfLRZ6xEvfy3s
        network:
          $ref: '#/components/schemas/Network'
        destinationTag:
          type: string
          description: >
            The destination tag of the onchain address. Destination tags are
            used by certain networks

            (primarily XRP/Ripple) to identify specific recipients when multiple
            users share a single address.

            The tag ensures funds are credited to the correct account within the
            shared address.


            Examples by network:

            - XRP/Ripple: Numeric values like "1234567890" or "123456"

            - Stellar (XLM): Memos which can be text, ID, or hash format


            Note: Most networks (Ethereum, Bitcoin, Solana) do not use
            destination tags.
        asset:
          allOf:
            - $ref: '#/components/schemas/Asset'
          description: Asset symbol of the payment received by the recipient.
          example: btc
      required:
        - address
        - network
        - asset
      example:
        address: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913'
        network: base
        asset: usdc
    OriginatingBankAccountUS:
      type: object
      title: Originating Bank Account (US)
      description: >-
        The originating US bank account details for the transfer source. Present
        when funds were deposited from an external bank account into a deposit
        destination. Only the last 4 digits of the account number are exposed.
      properties:
        bankName:
          type: string
          description: The name of the bank that originated the deposit.
          example: Citibank, N.A.
        accountLast4:
          type: string
          description: The last 4 digits of the originating bank account number.
          pattern: ^[0-9]{4}$
          example: '6789'
        currency:
          type: string
          description: The fiat currency of the deposit (e.g., `usd`).
          example: usd
      required:
        - bankName
        - accountLast4
        - currency
      example:
        bankName: Citibank, N.A.
        accountLast4: '6789'
        currency: usd
    EmailInstrument:
      title: Email Instrument
      description: The target of the payment is an email address.
      allOf:
        - $ref: '#/components/schemas/EmailAddress'
        - type: object
          properties:
            asset:
              allOf:
                - $ref: '#/components/schemas/Asset'
              description: Asset symbol of the payment received by the recipient.
          required:
            - asset
      example:
        email: recipient@example.com
        asset: usd
    TransferFee:
      type: object
      description: A single fee for a transfer.
      properties:
        type:
          type: string
          description: The type of the fee, indicating its purpose.
          enum:
            - bank
            - conversion
            - network
            - other
          x-enum-varnames:
            - BankFee
            - ConversionFee
            - NetworkFee
            - OtherFee
          example: network
        amount:
          type: string
          description: The amount of the fee in units of the asset specified by `asset`.
          example: '1500000'
        asset:
          allOf:
            - $ref: '#/components/schemas/Asset'
          description: The asset symbol.
          example: usd
      required:
        - type
        - amount
        - asset
    DepositDestinationReference:
      type: object
      description: A reference to the deposit destination associated with the transfer.
      properties:
        id:
          $ref: '#/components/schemas/DepositDestinationId'
      required:
        - id
      example:
        id: depositDestination_af2937b0-9846-4fe7-bfe9-ccc22d935114
    Network:
      type: string
      description: >-
        The blockchain network for the payment. Supported networks depend on the
        account type. See [API and Network
        Support](https://docs.cdp.coinbase.com/api-reference/payment-apis/supported-networks-assets#by-asset-and-network)
        for more details.
      enum:
        - base
        - ethereum
        - solana
        - aptos
        - arbitrum
        - arbitrum-sepolia
        - optimism
        - polygon
        - world
        - world-sepolia
      example: base
    TravelRuleStatus:
      type: string
      description: The status of a travel rule submission.
      enum:
        - incomplete
        - completed
      x-enum-varnames:
        - TravelRuleStatusIncomplete
        - TravelRuleStatusCompleted
      x-enum-descriptions:
        - Additional fields are required before the transfer can proceed.
        - All requirements are satisfied and the transfer will proceed.
      example: incomplete
    BlockchainAddress:
      type: string
      minLength: 1
      maxLength: 128
      description: >-
        A blockchain address. Format varies by network (e.g., 0x-prefixed for
        EVM, base58 for Solana).
      example: '0x742d35Cc6634C0532925a3b844Bc454e4438f44e'
    EmailAddress:
      type: object
      title: Email Address
      description: The target of the payment is an email address.
      properties:
        email:
          allOf:
            - $ref: '#/components/schemas/Email'
          description: >-
            The email address of the recipient. The recipient will need to have
            an account with Coinbase or onboard to Coinbase to receive the
            payment.
          example: recipient@example.com
      required:
        - email
      example:
        email: recipient@example.com
    DepositDestinationId:
      type: string
      pattern: ^depositDestination_[a-f0-9\-]{36}$
      description: >-
        The ID of the Deposit Destination, which is a UUID prefixed by the
        string `depositDestination_`.
      example: depositDestination_af2937b0-9846-4fe7-bfe9-ccc22d935114
    Email:
      type: string
      format: email
      maxLength: 254
      description: >-
        An email address. Maximum length 254 characters per [RFC
        5321](https://www.rfc-editor.org/rfc/rfc5321).
      example: user@example.com
  examples:
    RegularTransferQuoted:
      summary: Regular transfer in quoted state (USD → USDC at 1:1)
      value:
        transferId: transfer_af2937b0-9846-4fe7-bfe9-ccc22d935114
        status: quoted
        source:
          accountId: account_af2937b0-9846-4fe7-bfe9-ccc22d935114
          asset: usd
        target:
          address: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913'
          network: base
          asset: usdc
        amount: '100.00'
        asset: usd
        sourceAmount: '103.50'
        sourceAsset: usd
        targetAmount: '100.00'
        targetAsset: usdc
        exchangeRate:
          sourceAsset: usd
          targetAsset: usdc
          rate: '1'
        fees:
          - type: bank
            amount: '2.50'
            asset: usd
          - type: conversion
            amount: '1.00'
            asset: usd
        expiresAt: '2023-10-08T14:45:00Z'
        createdAt: '2023-10-08T14:30:00Z'
        updatedAt: '2023-10-08T14:30:00Z'
        metadata:
          invoiceId: '12345'
          reference: 'Payment for invoice #12345'
    FxTransferQuoted:
      summary: Trade-backed FX transfer in quoted state (USDC → EUR)
      value:
        transferId: transfer_bf3948c1-ab57-5gf8-cde3-ddd33e046225
        status: quoted
        source:
          accountId: account_af2937b0-9846-4fe7-bfe9-ccc22d935114
          asset: usdc
        target:
          accountId: account_bf3948c1-ab57-5gf8-cde3-ddd33e046225
          asset: eur
        amount: '100.00'
        asset: usdc
        sourceAmount: '100.00'
        sourceAsset: usdc
        estimate:
          exchangeRate:
            sourceAsset: usdc
            targetAsset: eur
            rate: '0.85'
          targetAmount: '85.00'
          targetAsset: eur
          fees:
            - type: conversion
              amount: '0.01'
              asset: usdc
          estimatedAt: '2023-10-08T14:30:00Z'
        expiresAt: '2023-10-08T14:30:10Z'
        createdAt: '2023-10-08T14:30:00Z'
        updatedAt: '2023-10-08T14:30:00Z'
    FxTransferCompleted:
      summary: >-
        Trade-backed FX transfer in completed state (top-level actuals +
        immutable estimate snapshot)
      value:
        transferId: transfer_bf3948c1-ab57-5gf8-cde3-ddd33e046225
        status: completed
        source:
          accountId: account_af2937b0-9846-4fe7-bfe9-ccc22d935114
          asset: usdc
        target:
          accountId: account_bf3948c1-ab57-5gf8-cde3-ddd33e046225
          asset: eur
        amount: '100.00'
        asset: usdc
        sourceAmount: '100.00'
        sourceAsset: usdc
        targetAmount: '85.02'
        targetAsset: eur
        exchangeRate:
          sourceAsset: usdc
          targetAsset: eur
          rate: '0.8502'
        fees:
          - type: conversion
            amount: '0.01'
            asset: usdc
        estimate:
          exchangeRate:
            sourceAsset: usdc
            targetAsset: eur
            rate: '0.85'
          targetAmount: '85.00'
          targetAsset: eur
          fees:
            - type: conversion
              amount: '0.01'
              asset: usdc
          estimatedAt: '2023-10-08T14:30:00Z'
        completedAt: '2023-10-08T14:31:05Z'
        createdAt: '2023-10-08T14:30:00Z'
        updatedAt: '2023-10-08T14:31:05Z'
  securitySchemes:
    apiKeyAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: >-
        A JWT signed using your CDP API Key Secret, encoded in base64. Refer to
        the [Generate Bearer
        Token](https://docs.cdp.coinbase.com/api-reference/v2/authentication#2-generate-bearer-token)
        section of our Authentication docs for information on how to generate
        your Bearer Token.

````