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

# List payment session voids

> Returns a paginated list of voids for a payment session. Each void includes its status, amount, associated onchain transactions, and timestamps. Only voids accessible by the current API key are returned.



## OpenAPI

````yaml get /v2/payment-sessions/{paymentSessionId}/voids
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: 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.
paths:
  /v2/payment-sessions/{paymentSessionId}/voids:
    get:
      tags:
        - Payment Acceptance (Under Development)
      summary: List payment session voids
      description: >-
        Returns a paginated list of voids for a payment session. Each void
        includes its status, amount, associated onchain transactions, and
        timestamps. Only voids accessible by the current API key are returned.
      operationId: listPaymentSessionVoids
      parameters:
        - name: paymentSessionId
          in: path
          required: true
          description: The unique identifier of the payment session.
          schema:
            $ref: '#/components/schemas/PaymentSessionId'
        - $ref: '#/components/parameters/PageSize'
        - $ref: '#/components/parameters/PageToken'
      responses:
        '200':
          description: Successfully listed voids.
          content:
            application/json:
              schema:
                allOf:
                  - type: object
                    required:
                      - voids
                    properties:
                      voids:
                        type: array
                        description: The list of voids.
                        items:
                          $ref: '#/components/schemas/Void'
                  - $ref: '#/components/schemas/ListResponse'
                example:
                  voids:
                    - voidId: void_82c879c1-84e1-44ed-a8c2-1ac239cf09ad
                      paymentSessionId: paymentSession_82c879c1-84e1-44ed-a8c2-1ac239cf09ad
                      status: succeeded
                      amount: '1.00'
                      metadata:
                        customer_id: cust_12345
                        reason: customer_request
                      onchainTransactions:
                        - transactionHash: >-
                            0x789012345678901234567890abcdef1234567890abcdef1234567890abcdef12
                          network: base
                      createdAt: '2025-06-15T12:30:00.000Z'
                      updatedAt: '2025-06-15T12:31:00.000Z'
                  nextPageToken: >-
                    eyJsYXN0X2lkIjogImFiYzEyMyIsICJ0aW1lc3RhbXAiOiAxNzA3ODIzNzAxfQ==
        '400':
          description: Invalid request.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                invalid_request:
                  value:
                    errorType: invalid_request
                    errorMessage: Invalid query parameters.
        '404':
          description: Payment session not found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                not_found:
                  value:
                    errorType: not_found
                    errorMessage: Payment session with the given ID does not exist.
        '500':
          $ref: '#/components/responses/InternalServerError'
        '502':
          $ref: '#/components/responses/BadGatewayError'
        '503':
          $ref: '#/components/responses/ServiceUnavailableError'
      security:
        - apiKeyAuth: []
components:
  schemas:
    PaymentSessionId:
      type: string
      pattern: ^paymentSession_[a-f0-9\-]{36}$
      description: The ID of the payment session, a UUID prefixed by `paymentSession_`.
      example: paymentSession_82c879c1-84e1-44ed-a8c2-1ac239cf09ad
    Void:
      type: object
      description: >-
        A release of uncaptured authorized funds back to the payer. Voids
        release all remaining capturable funds in a single operation, including
        after partial refunds as long as a capturableAmount remains.
      properties:
        voidId:
          allOf:
            - $ref: '#/components/schemas/VoidId'
          description: The unique identifier of the void.
          example: void_82c879c1-84e1-44ed-a8c2-1ac239cf09ad
        paymentSessionId:
          allOf:
            - $ref: '#/components/schemas/PaymentSessionId'
          description: The ID of the payment session this void belongs to.
          example: paymentSession_82c879c1-84e1-44ed-a8c2-1ac239cf09ad
        status:
          allOf:
            - $ref: '#/components/schemas/PaymentActionStatus'
          description: The current status of the void.
          example: pending
        amount:
          type: string
          description: >-
            A decimal representation of the voided amount, denominated in the
            session's `asset`.
          example: '1.00'
        error:
          $ref: '#/components/schemas/PaymentError'
        metadata:
          $ref: '#/components/schemas/Metadata'
        onchainTransactions:
          type: array
          description: The onchain transactions associated with this void.
          items:
            $ref: '#/components/schemas/OnchainTransaction'
          example:
            - transactionHash: >-
                0x789012345678901234567890abcdef1234567890abcdef1234567890abcdef12
              network: base
        createdAt:
          type: string
          format: date-time
          description: The UTC ISO 8601 timestamp at which the void was created.
          example: '2025-06-15T12:30:00.000Z'
        updatedAt:
          type: string
          format: date-time
          description: The UTC ISO 8601 timestamp at which the void was last updated.
          example: '2025-06-15T12:31:00.000Z'
      example:
        voidId: void_82c879c1-84e1-44ed-a8c2-1ac239cf09ad
        paymentSessionId: paymentSession_82c879c1-84e1-44ed-a8c2-1ac239cf09ad
        status: succeeded
        amount: '1.00'
        onchainTransactions:
          - transactionHash: '0x789012345678901234567890abcdef1234567890abcdef1234567890abcdef12'
            network: base
        metadata:
          customer_id: cust_12345
        createdAt: '2025-06-15T12:30:00.000Z'
        updatedAt: '2025-06-15T12:31:00.000Z'
    ListResponse:
      type: object
      properties:
        nextPageToken:
          type: string
          description: The token for the next page of items, if any.
          example: eyJsYXN0X2lkIjogImFiYzEyMyIsICJ0aW1lc3RhbXAiOiAxNzA3ODIzNzAxfQ==
    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
    VoidId:
      type: string
      pattern: ^void_[a-f0-9\-]{36}$
      description: The ID of the void, a UUID prefixed by `void_`.
      example: void_82c879c1-84e1-44ed-a8c2-1ac239cf09ad
    PaymentActionStatus:
      type: string
      description: >-
        The current status of a payment action (authorization, capture, void, or
        refund).
      enum:
        - pending
        - succeeded
        - failed
      example: pending
    PaymentError:
      type: object
      description: An error that occurred during a payment operation.
      properties:
        code:
          type: string
          description: A machine-readable error code.
          example: insufficient_funds
        message:
          type: string
          description: A human-readable description of the error.
          example: The payer does not have sufficient funds.
        occurredAt:
          type: string
          format: date-time
          description: The UTC ISO 8601 timestamp at which the error occurred.
          example: '2025-06-15T12:00:00.000Z'
      example:
        code: insufficient_funds
        message: The payer does not have sufficient funds.
        occurredAt: '2025-06-15T12:00:00.000Z'
    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
    OnchainTransaction:
      type: object
      description: An onchain transaction associated with a payment action.
      properties:
        transactionHash:
          type: string
          description: The blockchain transaction hash.
          example: '0xabc123def456789012345678901234567890abcdef1234567890abcdef123456'
        network:
          allOf:
            - $ref: '#/components/schemas/PaymentSourceNetwork'
          description: The blockchain network the transaction occurred on.
          example: base
      required:
        - transactionHash
        - network
    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
        - otp_verification_code_invalid
        - otp_verification_destination_mismatch
        - otp_verification_expired
        - otp_verification_invalid
        - otp_verification_not_found
        - otp_verification_required
        - 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
        - payment_session_already_canceled
        - payment_session_already_authorized
        - payment_session_action_pending
        - no_capturable_balance
        - no_voidable_balance
        - no_refundable_balance
        - entity_not_configured_for_payment_acceptance
        - daily_transaction_limit_exceeded
        - daily_amount_limit_exceeded
        - stale_attestation
        - moderation_rejected
      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 `PUT /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.
        otp_verification_destination_mismatch: >-
          The `phoneNumber` or `email` on the order does not match the
          `destination` that was verified.


          **Steps to resolve:**

          1. Ensure the `phoneNumber` or `email` field on the order matches the
          `destination` used during verification.

          2. If the value changed, complete a new verification for the updated
          phone number or email.
        otp_verification_expired: >-
          The `smsVerificationId` or `emailVerificationId` provided has expired.

          Verification IDs are valid for 60 days after successful OTP
          submission.


          **Steps to resolve:**

          1. Complete a new verification flow for the user.

          2. Use the new verification ID when creating orders.
        otp_verification_code_invalid: >-
          This error occurs when the OTP code submitted to complete a
          verification is incorrect or has expired

          (the 10-minute OTP window has elapsed).


          **Steps to resolve:**

          1. Ask the user to re-enter the code.

          2. If the OTP window has expired, start a new verification flow.
        otp_verification_invalid: >-
          This error occurs when the verification record exists but is not in a
          usable state for the requested operation.


          **Common causes:**

          - The verification is still pending (OTP not yet submitted
          successfully).

          - The verification has been revoked.

          - The verification channel does not match the expected field
          (`smsVerificationId` or `emailVerificationId`).


          **Steps to resolve:**

          1. Complete a new verification flow and retry.
        otp_verification_not_found: >-
          The provided SMS or email verification ID does not correspond to any
          verification record.


          **Steps to resolve:**

          1. Ensure you are passing the correct verification ID as
          `smsVerificationId` or `emailVerificationId`.

          2. If the issue persists, complete a new verification flow.
        otp_verification_required: >-
          An SMS or email verification ID is required on order creation but none
          was provided.


          **Steps to resolve:**

          1. Verify the user's phone number and email before creating an order.

          2. Pass the returned verification IDs as `smsVerificationId` and
          `emailVerificationId` when creating orders.
        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
        payment_session_already_canceled: >-
          This error occurs when an action is attempted on a payment session
          that has already been canceled.


          **Steps to resolve:**

          1. Create a new payment session to proceed with the payment flow
        payment_session_already_authorized: >-
          This error occurs when attempting to authorize a payment session that
          has already been authorized.


          **Steps to resolve:**

          1. Check the payment session status — it is already authorized

          2. Proceed to capture, void, or other post-authorization actions as
          needed
        payment_session_action_pending: >-
          This error occurs when another action is already in progress for the
          payment session.


          **Steps to resolve:**

          1. Wait for the current action to complete before retrying

          2. Check the payment session status to confirm the current action
          result
        no_capturable_balance: >-
          This error occurs when there is no remaining balance available to
          capture on the payment session.


          **Steps to resolve:**

          1. Verify the payment session status and previously captured amounts

          2. Ensure the session was authorized and has uncaptured funds
          remaining
        no_voidable_balance: >-
          This error occurs when there is no held balance remaining to void on
          the payment session.


          **Steps to resolve:**

          1. Verify the payment session has an authorized but uncaptured balance

          2. Check whether the session has already been fully captured or voided
        no_refundable_balance: >-
          This error occurs when the payment session has no captured amount
          available to refund.


          **Steps to resolve:**

          1. Verify the payment session has been previously captured

          2. Check that the session has not already been fully refunded
        entity_not_configured_for_payment_acceptance: >-
          This error occurs when the entity is not configured to accept
          payments.


          **Steps to resolve:**

          1. Contact support to enable payment acceptance for the entity
        daily_transaction_limit_exceeded: |-
          This error occurs when the daily transaction limit has been exceeded.

          **Steps to resolve:**
          1. Wait until the next day when the daily limit resets
          2. Contact support for questions about your limit
        daily_amount_limit_exceeded: >-
          This error occurs when the daily authorization amount limit has been
          exceeded.


          **Steps to resolve:**

          1. Wait until the next day when the daily limit resets

          2. Contact support for questions about your limit
        stale_attestation: >-
          The platform attestation (iOS App Attest assertion or Android Play
          Integrity token) was

          generated against a challenge that has since expired. The request was
          well-formed, but

          the challenge is no longer valid.


          **Steps to resolve:**

          1. Call [Create Onramp Mobile
          Challenge](#operation/createOnrampMobileChallenge) to obtain
             a fresh challenge.
          2. Re-run the platform attestation flow against the new challenge.

          3. Submit the new attestation to
             [Create Onramp Mobile Session](#operation/createOnrampMobileSession) promptly —
             challenges are short-lived.

          **Common causes:**

          - Too much time elapsed between obtaining the challenge and submitting
          the attestation.
        moderation_rejected: |-
          The uploaded image failed content moderation and will not be served.

          **Steps to resolve:**
          1. Upload a different image that complies with content policies.
    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
    PaymentSourceNetwork:
      type: string
      description: >-
        The blockchain network supported for payment session sources. Testnet
        networks are only available in sandbox environments.
      enum:
        - arbitrum
        - arbitrum-sepolia
        - base
        - base-sepolia
        - ethereum
        - ethereum-sepolia
        - optimism
        - optimism-sepolia
        - polygon
        - polygon-amoy
      example: base
  parameters:
    PageSize:
      name: pageSize
      description: The number of resources to return per page.
      in: query
      required: false
      schema:
        type: integer
        default: 20
      example: 10
    PageToken:
      name: pageToken
      description: The token for the next page of resources, if any.
      in: query
      required: false
      schema:
        type: string
      example: eyJsYXN0X2lkIjogImFiYzEyMyIsICJ0aW1lc3RhbXAiOiAxNzA3ODIzNzAxfQ==
  responses:
    InternalServerError:
      description: Internal server error.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          examples:
            internal_server_error:
              value:
                errorType: internal_server_error
                errorMessage: An internal server error occurred. Please try again later.
    BadGatewayError:
      description: Bad gateway.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          examples:
            bad_gateway:
              value:
                errorType: bad_gateway
                errorMessage: Bad gateway. Please try again later.
    ServiceUnavailableError:
      description: Service unavailable.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          examples:
            service_unavailable:
              value:
                errorType: service_unavailable
                errorMessage: Service unavailable. Please try again later.
  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.

````